1 /* modest-conf-gconf.c */
2 /* GConf implementation of ModestConf */
4 /* insert (c)/licensing information) */
6 #include "modest-conf.h"
7 #include <gconf/gconf-client.h>
10 /* 'private'/'protected' functions */
11 static void modest_conf_class_init (ModestConfClass *klass);
12 static void modest_conf_init (ModestConf *obj);
13 static void modest_conf_finalize (GObject *obj);
15 static void modest_conf_on_change (GConfClient *client, guint conn_id,
16 GConfEntry *entry, gpointer data);
23 typedef struct _ModestConfPrivate ModestConfPrivate;
24 struct _ModestConfPrivate {
25 GConfClient *gconf_client;
27 #define MODEST_CONF_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
31 static GObjectClass *parent_class = NULL;
33 static guint signals[LAST_SIGNAL] = {0};
35 typedef void (*MarshalFunc_VOID__POINTER_POINTER) (gpointer data1,
36 gpointer arg_1, gpointer arg_2, gpointer data2);
40 modest_marshal_VOID__POINTER_POINTER (GClosure *closure,
43 const GValue *param_values,
44 gpointer invocation_hint,
45 gpointer marshal_data)
47 MarshalFunc_VOID__POINTER_POINTER callback;
48 GCClosure *cc = (GCClosure*) closure;
49 gpointer data1, data2;
51 g_return_if_fail (n_param_values == 3);
53 if (G_CCLOSURE_SWAP_DATA (closure)) {
54 data1 = closure->data;
55 data2 = g_value_peek_pointer (param_values + 0);
57 data1 = g_value_peek_pointer (param_values + 0);
58 data2 = closure->data;
61 callback = (MarshalFunc_VOID__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback);
63 callback (data1, g_value_get_pointer (param_values + 1),
64 g_value_get_pointer (param_values + 2), data2);
68 modest_conf_key_changed (ModestConf* self, const gchar *key, const gchar *new_value)
75 modest_conf_get_type (void)
77 static GType my_type = 0;
79 static const GTypeInfo my_info = {
80 sizeof(ModestConfClass),
82 NULL, /* base finalize */
83 (GClassInitFunc) modest_conf_class_init,
84 NULL, /* class finalize */
85 NULL, /* class data */
88 (GInstanceInitFunc) modest_conf_init,
90 my_type = g_type_register_static (G_TYPE_OBJECT,
98 modest_conf_class_init (ModestConfClass *klass)
100 GObjectClass *gobject_class;
101 gobject_class = (GObjectClass*) klass;
103 parent_class = g_type_class_peek_parent (klass);
104 gobject_class->finalize = modest_conf_finalize;
106 g_type_class_add_private (gobject_class, sizeof(ModestConfPrivate));
108 klass->key_changed = modest_conf_key_changed;
110 signals[KEY_CHANGED_SIGNAL] =
111 g_signal_new ("key-changed",
112 G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST,
113 G_STRUCT_OFFSET(ModestConfClass, key_changed),
115 modest_marshal_VOID__POINTER_POINTER,
116 G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER);
120 modest_conf_init (ModestConf *obj)
122 GConfClient *conf = NULL;
123 ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(obj);
126 priv->gconf_client = NULL;
128 conf = gconf_client_get_default ();
130 g_warning ("could not get gconf client");
134 /* FIXME: is PRELOAD_NONE the most efficient? */
135 gconf_client_add_dir (conf, MODEST_CONF_NAMESPACE,
136 GCONF_CLIENT_PRELOAD_NONE, &err);
138 g_warning ("error with gconf_client_add_dir: %d:%s",
139 err->code, err->message);
140 g_object_unref (conf);
145 gconf_client_notify_add (conf, MODEST_CONF_NAMESPACE,
146 modest_conf_on_change,
149 g_warning ("error with gconf_client_notify_add: %d:%s",
150 err->code, err->message);
151 g_object_unref (conf);
157 priv->gconf_client = conf;
162 modest_conf_finalize (GObject *obj)
164 ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(obj);
165 if (priv->gconf_client) {
166 gconf_client_suggest_sync (priv->gconf_client, NULL);
167 g_object_unref (priv->gconf_client);
172 modest_conf_new (void)
174 ModestConf *conf = MODEST_CONF(g_object_new(MODEST_TYPE_CONF, NULL));
176 g_warning ("failed to init ModestConf (GConf)");
180 ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(conf);
181 if (!priv->gconf_client) {
182 g_warning ("failed to init gconf");
183 g_object_unref (conf);
187 return G_OBJECT(conf);
192 modest_conf_get_string (ModestConf* self, const gchar* key, GError **err)
194 ModestConfPrivate *priv;
196 g_return_val_if_fail (self, NULL);
197 g_return_val_if_fail (key, NULL);
199 priv = MODEST_CONF_GET_PRIVATE(self);
200 return gconf_client_get_string (priv->gconf_client, key, err);
205 modest_conf_get_int (ModestConf* self, const gchar* key, GError **err)
207 ModestConfPrivate *priv;
209 g_return_val_if_fail (self, -1);
210 g_return_val_if_fail (key, -1);
212 priv = MODEST_CONF_GET_PRIVATE(self);
214 return gconf_client_get_int (priv->gconf_client, key, err);
219 modest_conf_get_bool (ModestConf* self, const gchar* key, GError **err)
221 ModestConfPrivate *priv;
223 g_return_val_if_fail (self, FALSE);
224 g_return_val_if_fail (key, FALSE);
226 priv = MODEST_CONF_GET_PRIVATE(self);
228 return gconf_client_get_bool (priv->gconf_client, key, err);
233 modest_conf_set_string (ModestConf* self, const gchar* key, const gchar* val,
236 ModestConfPrivate *priv;
238 g_return_val_if_fail (self,FALSE);
239 g_return_val_if_fail (key, FALSE);
241 priv = MODEST_CONF_GET_PRIVATE(self);
243 if (!gconf_client_key_is_writable(priv->gconf_client,key,err)) {
244 g_warning ("'%s' is not writable", key);
248 return gconf_client_set_string (priv->gconf_client, key, val, err);
253 modest_conf_set_int (ModestConf* self, const gchar* key, gint val,
256 ModestConfPrivate *priv;
258 g_return_val_if_fail (self,FALSE);
259 g_return_val_if_fail (key, FALSE);
261 priv = MODEST_CONF_GET_PRIVATE(self);
263 if (!gconf_client_key_is_writable(priv->gconf_client,key,err)) {
264 g_warning ("'%s' is not writable", key);
268 return gconf_client_set_int (priv->gconf_client, key, val, err);
273 modest_conf_set_bool (ModestConf* self, const gchar* key, gboolean val,
276 ModestConfPrivate *priv;
278 g_return_val_if_fail (self,FALSE);
279 g_return_val_if_fail (key, FALSE);
281 priv = MODEST_CONF_GET_PRIVATE(self);
283 if (!gconf_client_key_is_writable(priv->gconf_client,key, err)) {
284 g_warning ("'%s' is not writable", key);
288 return gconf_client_set_bool (priv->gconf_client,key,val, err);
295 modest_conf_list_subkeys (ModestConf* self, const gchar* key, GError **err)
297 ModestConfPrivate *priv;
299 g_return_val_if_fail (self,FALSE);
300 g_return_val_if_fail (key, FALSE);
302 priv = MODEST_CONF_GET_PRIVATE(self);
304 return gconf_client_all_dirs (priv->gconf_client,key,err);
309 modest_conf_remove_key (ModestConf* self, const gchar* key, GError **err)
311 ModestConfPrivate *priv;
313 g_return_val_if_fail (self,FALSE);
314 g_return_val_if_fail (key, FALSE);
316 priv = MODEST_CONF_GET_PRIVATE(self);
318 return gconf_client_recursive_unset (priv->gconf_client,key,0,err);
325 modest_conf_key_exists (ModestConf* self, const gchar* key, GError **err)
327 ModestConfPrivate *priv;
329 g_return_val_if_fail (self,FALSE);
330 g_return_val_if_fail (key, FALSE);
332 priv = MODEST_CONF_GET_PRIVATE(self);
334 return gconf_client_dir_exists (priv->gconf_client,key,err);
342 modest_conf_on_change (GConfClient *client, guint conn_id, GConfEntry *entry,
345 ModestConf *modest_conf = data;
348 g_print ("modest: key '%s' unset\n",
349 gconf_entry_get_key (entry));
350 g_signal_emit (modest_conf, signals[KEY_CHANGED_SIGNAL], 0,
351 gconf_entry_get_key (entry), NULL);
353 gchar *val = gconf_value_to_string (gconf_entry_get_value(entry));
354 g_print ("modest: key '%s' set to '%s'\n",
355 gconf_entry_get_key (entry), val);
356 g_signal_emit (modest_conf, signals[KEY_CHANGED_SIGNAL], 0,
357 gconf_entry_get_key (entry), val);