1 /* modest-conf-gconf.c */
2 /* GConf implementation of ModestConf */
4 /* insert (c)/licensing information) */
6 #include "modest-conf.h"
7 #include "modest-marshal.h"
8 #include <gconf/gconf-client.h>
11 /* 'private'/'protected' functions */
12 static void modest_conf_class_init (ModestConfClass *klass);
13 static void modest_conf_init (ModestConf *obj);
14 static void modest_conf_finalize (GObject *obj);
16 static void modest_conf_on_change (GConfClient *client, guint conn_id,
17 GConfEntry *entry, gpointer data);
24 typedef struct _ModestConfPrivate ModestConfPrivate;
25 struct _ModestConfPrivate {
26 GConfClient *gconf_client;
28 #define MODEST_CONF_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
32 static GObjectClass *parent_class = NULL;
34 static guint signals[LAST_SIGNAL] = {0};
37 modest_conf_key_changed (ModestConf* self, const gchar *key, const gchar *new_value)
39 g_signal_emit (self, signals[KEY_CHANGED_SIGNAL], 0, key, new_value);
44 modest_conf_get_type (void)
46 static GType my_type = 0;
48 static const GTypeInfo my_info = {
49 sizeof(ModestConfClass),
51 NULL, /* base finalize */
52 (GClassInitFunc) modest_conf_class_init,
53 NULL, /* class finalize */
54 NULL, /* class data */
57 (GInstanceInitFunc) modest_conf_init,
59 my_type = g_type_register_static (G_TYPE_OBJECT,
67 modest_conf_class_init (ModestConfClass *klass)
69 GObjectClass *gobject_class;
70 gobject_class = (GObjectClass*) klass;
71 GType paramtypes[2] = {G_TYPE_POINTER, G_TYPE_POINTER};
73 parent_class = g_type_class_peek_parent (klass);
74 gobject_class->finalize = modest_conf_finalize;
76 g_type_class_add_private (gobject_class, sizeof(ModestConfPrivate));
78 klass->key_changed = modest_conf_key_changed;
80 signals[KEY_CHANGED_SIGNAL] =
81 g_signal_newv ("key-changed",
82 G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST,
84 modest_marshal_VOID__POINTER_POINTER,
85 G_TYPE_NONE, 2, paramtypes);
89 modest_conf_init (ModestConf *obj)
91 GConfClient *conf = NULL;
92 ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(obj);
95 priv->gconf_client = NULL;
97 conf = gconf_client_get_default ();
99 g_warning ("could not get gconf client");
103 /* FIXME: is PRELOAD_NONE the most efficient? */
104 gconf_client_add_dir (conf, MODEST_CONF_NAMESPACE,
105 GCONF_CLIENT_PRELOAD_NONE, &err);
107 g_warning ("error with gconf_client_add_dir: %d:%s",
108 err->code, err->message);
109 g_object_unref (conf);
114 gconf_client_notify_add (conf, MODEST_CONF_NAMESPACE,
115 modest_conf_on_change,
118 g_warning ("error with gconf_client_notify_add: %d:%s",
119 err->code, err->message);
120 g_object_unref (conf);
126 priv->gconf_client = conf;
131 modest_conf_finalize (GObject *obj)
133 ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(obj);
134 if (priv->gconf_client) {
135 gconf_client_suggest_sync (priv->gconf_client, NULL);
136 g_object_unref (priv->gconf_client);
141 modest_conf_new (void)
143 ModestConf *conf = MODEST_CONF(g_object_new(MODEST_TYPE_CONF, NULL));
145 g_warning ("failed to init ModestConf (GConf)");
149 ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(conf);
150 if (!priv->gconf_client) {
151 g_warning ("failed to init gconf");
152 g_object_unref (conf);
156 return G_OBJECT(conf);
161 modest_conf_get_string (ModestConf* self, const gchar* key, GError **err)
163 ModestConfPrivate *priv;
165 g_return_val_if_fail (self, NULL);
166 g_return_val_if_fail (key, NULL);
168 priv = MODEST_CONF_GET_PRIVATE(self);
169 return gconf_client_get_string (priv->gconf_client, key, err);
174 modest_conf_get_int (ModestConf* self, const gchar* key, GError **err)
176 ModestConfPrivate *priv;
178 g_return_val_if_fail (self, -1);
179 g_return_val_if_fail (key, -1);
181 priv = MODEST_CONF_GET_PRIVATE(self);
183 return gconf_client_get_int (priv->gconf_client, key, err);
188 modest_conf_get_bool (ModestConf* self, const gchar* key, GError **err)
190 ModestConfPrivate *priv;
192 g_return_val_if_fail (self, FALSE);
193 g_return_val_if_fail (key, FALSE);
195 priv = MODEST_CONF_GET_PRIVATE(self);
197 return gconf_client_get_bool (priv->gconf_client, key, err);
202 modest_conf_set_string (ModestConf* self, const gchar* key, const gchar* val,
205 ModestConfPrivate *priv;
207 g_return_val_if_fail (self,FALSE);
208 g_return_val_if_fail (key, FALSE);
210 priv = MODEST_CONF_GET_PRIVATE(self);
212 if (!gconf_client_key_is_writable(priv->gconf_client,key,err)) {
213 g_warning ("'%s' is not writable", key);
217 return gconf_client_set_string (priv->gconf_client, key, val, err);
222 modest_conf_set_int (ModestConf* self, const gchar* key, gint val,
225 ModestConfPrivate *priv;
227 g_return_val_if_fail (self,FALSE);
228 g_return_val_if_fail (key, FALSE);
230 priv = MODEST_CONF_GET_PRIVATE(self);
232 if (!gconf_client_key_is_writable(priv->gconf_client,key,err)) {
233 g_warning ("'%s' is not writable", key);
237 return gconf_client_set_int (priv->gconf_client, key, val, err);
242 modest_conf_set_bool (ModestConf* self, const gchar* key, gboolean val,
245 ModestConfPrivate *priv;
247 g_return_val_if_fail (self,FALSE);
248 g_return_val_if_fail (key, FALSE);
250 priv = MODEST_CONF_GET_PRIVATE(self);
252 if (!gconf_client_key_is_writable(priv->gconf_client,key, err)) {
253 g_warning ("'%s' is not writable", key);
257 return gconf_client_set_bool (priv->gconf_client,key,val, err);
264 modest_conf_list_subkeys (ModestConf* self, const gchar* key, GError **err)
266 ModestConfPrivate *priv;
268 g_return_val_if_fail (self,FALSE);
269 g_return_val_if_fail (key, FALSE);
271 priv = MODEST_CONF_GET_PRIVATE(self);
273 return gconf_client_all_dirs (priv->gconf_client,key,err);
278 modest_conf_remove_key (ModestConf* self, const gchar* key, GError **err)
280 ModestConfPrivate *priv;
282 g_return_val_if_fail (self,FALSE);
283 g_return_val_if_fail (key, FALSE);
285 priv = MODEST_CONF_GET_PRIVATE(self);
287 return gconf_client_recursive_unset (priv->gconf_client,key,0,err);
294 modest_conf_key_exists (ModestConf* self, const gchar* key, GError **err)
296 ModestConfPrivate *priv;
298 g_return_val_if_fail (self,FALSE);
299 g_return_val_if_fail (key, FALSE);
301 priv = MODEST_CONF_GET_PRIVATE(self);
303 return gconf_client_dir_exists (priv->gconf_client,key,err);
311 modest_conf_on_change (GConfClient *client, guint conn_id, GConfEntry *entry,
314 ModestConf *modest_conf = data;
317 g_print ("modest: key '%s' unset\n",
318 gconf_entry_get_key (entry));
319 g_signal_emit (modest_conf, signals[KEY_CHANGED_SIGNAL], 0,
320 gconf_entry_get_key (entry), NULL);
322 gchar *val = gconf_value_to_string (gconf_entry_get_value(entry));
323 g_print ("modest: key '%s' set to '%s'\n",
324 gconf_entry_get_key (entry), val);
325 g_signal_emit (modest_conf, signals[KEY_CHANGED_SIGNAL], 0,
326 gconf_entry_get_key (entry), val);