1 /* GIO - GLib Input, Output and Streaming Library
2 *
3 * Copyright (C) 2006-2007 Red Hat, Inc.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 * Boston, MA 02111-1307, USA.
19 *
20 * Author: Alexander Larsson <alexl@redhat.com>
21 */
22
23 #include "config.h"
24
25 #include "glocalfilemonitor.h"
26 #include "giomodule-priv.h"
27 #include "gioerror.h"
28 #include "glibintl.h"
29
30 #include <string.h>
31
32 #include "gioalias.h"
33
34 enum
35 {
36 PROP_0,
37 PROP_FILENAME
38 };
39
G_DEFINE_ABSTRACT_TYPE(GLocalFileMonitor,g_local_file_monitor,G_TYPE_FILE_MONITOR)40 G_DEFINE_ABSTRACT_TYPE (GLocalFileMonitor, g_local_file_monitor, G_TYPE_FILE_MONITOR)
41
42 static void
43 g_local_file_monitor_init (GLocalFileMonitor* local_monitor)
44 {
45 }
46
47 static void
g_local_file_monitor_set_property(GObject * object,guint property_id,const GValue * value,GParamSpec * pspec)48 g_local_file_monitor_set_property (GObject *object,
49 guint property_id,
50 const GValue *value,
51 GParamSpec *pspec)
52 {
53 switch (property_id)
54 {
55 case PROP_FILENAME:
56 /* Do nothing */
57 break;
58 default:
59 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
60 break;
61 }
62 }
63
64 static GObject *
g_local_file_monitor_constructor(GType type,guint n_construct_properties,GObjectConstructParam * construct_properties)65 g_local_file_monitor_constructor (GType type,
66 guint n_construct_properties,
67 GObjectConstructParam *construct_properties)
68 {
69 GObject *obj;
70 GLocalFileMonitorClass *klass;
71 GObjectClass *parent_class;
72 GLocalFileMonitor *local_monitor;
73 const gchar *filename = NULL;
74 gint i;
75
76 klass = G_LOCAL_FILE_MONITOR_CLASS (g_type_class_peek (G_TYPE_LOCAL_FILE_MONITOR));
77 parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
78 obj = parent_class->constructor (type,
79 n_construct_properties,
80 construct_properties);
81
82 local_monitor = G_LOCAL_FILE_MONITOR (obj);
83
84 for (i = 0; i < n_construct_properties; i++)
85 {
86 if (strcmp ("filename", g_param_spec_get_name (construct_properties[i].pspec)) == 0)
87 {
88 g_warn_if_fail (G_VALUE_HOLDS_STRING (construct_properties[i].value));
89 filename = g_value_get_string (construct_properties[i].value);
90 break;
91 }
92 }
93
94 g_warn_if_fail (filename != NULL);
95
96 local_monitor->filename = g_strdup (filename);
97 return obj;
98 }
99
100 static void
g_local_file_monitor_finalize(GObject * object)101 g_local_file_monitor_finalize (GObject *object)
102 {
103 GLocalFileMonitor *local_monitor = G_LOCAL_FILE_MONITOR (object);
104 if (local_monitor->filename)
105 {
106 g_free (local_monitor->filename);
107 local_monitor->filename = NULL;
108 }
109
110 G_OBJECT_CLASS (g_local_file_monitor_parent_class)->finalize (object);
111 }
112
g_local_file_monitor_class_init(GLocalFileMonitorClass * klass)113 static void g_local_file_monitor_class_init (GLocalFileMonitorClass *klass)
114 {
115 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
116
117 gobject_class->set_property = g_local_file_monitor_set_property;
118 gobject_class->finalize = g_local_file_monitor_finalize;
119 gobject_class->constructor = g_local_file_monitor_constructor;
120
121 g_object_class_install_property (gobject_class,
122 PROP_FILENAME,
123 g_param_spec_string ("filename",
124 P_("File name"),
125 P_("File name to monitor"),
126 NULL,
127 G_PARAM_CONSTRUCT_ONLY|
128 G_PARAM_WRITABLE|
129 G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
130 }
131
132 static gpointer
get_default_local_file_monitor(gpointer data)133 get_default_local_file_monitor (gpointer data)
134 {
135 GLocalFileMonitorClass *chosen_class;
136 GLocalFileMonitorClass **ret = data;
137 GIOExtensionPoint *ep;
138 GList *extensions, *l;
139
140 _g_io_modules_ensure_loaded ();
141
142 ep = g_io_extension_point_lookup (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME);
143
144 extensions = g_io_extension_point_get_extensions (ep);
145
146 chosen_class = NULL;
147 for (l = extensions; l != NULL; l = l->next)
148 {
149 GIOExtension *extension = l->data;
150 GLocalFileMonitorClass *klass;
151
152 klass = G_LOCAL_FILE_MONITOR_CLASS (g_io_extension_ref_class (extension));
153
154 if (klass->is_supported ())
155 {
156 chosen_class = klass;
157 break;
158 }
159 else
160 g_type_class_unref (klass);
161 }
162
163 if (chosen_class)
164 {
165 *ret = chosen_class;
166 return (gpointer)G_TYPE_FROM_CLASS (chosen_class);
167 }
168 else
169 return (gpointer)G_TYPE_INVALID;
170 }
171
172 /**
173 * g_local_file_monitor_new:
174 * @pathname: path name to monitor.
175 * @flags: #GFileMonitorFlags.
176 *
177 * Returns: a new #GFileMonitor for the given @pathname.
178 **/
179 GFileMonitor*
_g_local_file_monitor_new(const char * pathname,GFileMonitorFlags flags,GError ** error)180 _g_local_file_monitor_new (const char *pathname,
181 GFileMonitorFlags flags,
182 GError **error)
183 {
184 static GOnce once_init = G_ONCE_INIT;
185 GTypeClass *type_class;
186 GFileMonitor *monitor;
187 GType type;
188
189 type_class = NULL;
190 g_once (&once_init, get_default_local_file_monitor, &type_class);
191 type = (GType)once_init.retval;
192
193 monitor = NULL;
194 if (type != G_TYPE_INVALID)
195 monitor = G_FILE_MONITOR (g_object_new (type, "filename", pathname, NULL));
196 else
197 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
198 _("Unable to find default local file monitor type"));
199
200 /* This is non-null on first pass here. Unref the class now.
201 * This is to avoid unloading the module and then loading it
202 * again which would happen if we unrefed the class
203 * before creating the monitor.
204 */
205
206 if (type_class)
207 g_type_class_unref (type_class);
208
209 return monitor;
210 }
211
212 #define __G_LOCAL_FILE_MONITOR_C__
213 #include "gioaliasdef.c"
214