1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the Nokia Corporation nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #include <gconf/gconf-client.h>
33 #include <glib/gi18n.h>
34 #include "modest-defs.h"
35 #include "modest-conf.h"
36 #include "modest-error.h"
37 #include "modest-marshal.h"
40 static void modest_conf_class_init (ModestConfClass *klass);
42 static void modest_conf_init (ModestConf *obj);
44 static void modest_conf_finalize (GObject *obj);
46 static void modest_conf_on_change (GConfClient *client, guint conn_id,
47 GConfEntry *entry, gpointer data);
49 static GConfValueType modest_conf_type_to_gconf_type (ModestConfValueType value_type,
57 static guint signals[LAST_SIGNAL] = {0};
60 typedef struct _ModestConfPrivate ModestConfPrivate;
61 struct _ModestConfPrivate {
62 GConfClient *gconf_client;
64 #define MODEST_CONF_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
68 static GObjectClass *parent_class = NULL;
71 modest_conf_get_type (void)
73 static GType my_type = 0;
75 static const GTypeInfo my_info = {
76 sizeof(ModestConfClass),
78 NULL, /* base finalize */
79 (GClassInitFunc) modest_conf_class_init,
80 NULL, /* class finalize */
81 NULL, /* class data */
84 (GInstanceInitFunc) modest_conf_init,
87 my_type = g_type_register_static (G_TYPE_OBJECT,
95 modest_conf_class_init (ModestConfClass *klass)
97 GObjectClass *gobject_class;
98 gobject_class = (GObjectClass*) klass;
100 parent_class = g_type_class_peek_parent (klass);
101 gobject_class->finalize = modest_conf_finalize;
103 g_type_class_add_private (gobject_class, sizeof(ModestConfPrivate));
105 signals[KEY_CHANGED_SIGNAL] =
106 g_signal_new ("key_changed",
107 G_TYPE_FROM_CLASS (gobject_class),
109 G_STRUCT_OFFSET (ModestConfClass,key_changed),
111 modest_marshal_VOID__STRING_INT_INT,
112 G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
116 modest_conf_init (ModestConf *obj)
118 GConfClient *conf = NULL;
119 GError *error = NULL;
120 ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(obj);
122 priv->gconf_client = NULL;
124 conf = gconf_client_get_default ();
126 g_printerr ("modest: could not get gconf client\n");
130 priv->gconf_client = conf;
132 /* All the tree will be listened */
133 gconf_client_add_dir (priv->gconf_client,
135 GCONF_CLIENT_PRELOAD_NONE,
138 /* Notify every change under namespace */
140 gconf_client_notify_add (priv->gconf_client,
142 modest_conf_on_change,
147 g_error_free (error);
152 modest_conf_finalize (GObject *obj)
154 ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(obj);
155 if (priv->gconf_client) {
157 gconf_client_suggest_sync (priv->gconf_client, NULL);
159 g_object_unref (priv->gconf_client);
160 priv->gconf_client = NULL;
163 G_OBJECT_CLASS(parent_class)->finalize (obj);
167 modest_conf_new (void)
170 ModestConfPrivate *priv;
172 conf = MODEST_CONF(g_object_new(MODEST_TYPE_CONF, NULL));
174 g_printerr ("modest: failed to init ModestConf (GConf)\n");
178 priv = MODEST_CONF_GET_PRIVATE(conf);
179 if (!priv->gconf_client) {
180 g_printerr ("modest: failed to init gconf\n");
181 g_object_unref (conf);
190 modest_conf_get_string (ModestConf* self, const gchar* key, GError **err)
192 ModestConfPrivate *priv;
194 g_return_val_if_fail (self, NULL);
195 g_return_val_if_fail (key, NULL);
197 priv = MODEST_CONF_GET_PRIVATE(self);
198 return gconf_client_get_string (priv->gconf_client, key, err);
203 modest_conf_get_int (ModestConf* self, const gchar* key, GError **err)
205 ModestConfPrivate *priv;
207 g_return_val_if_fail (self, -1);
208 g_return_val_if_fail (key, -1);
210 priv = MODEST_CONF_GET_PRIVATE(self);
212 return gconf_client_get_int (priv->gconf_client, key, err);
216 modest_conf_get_float (ModestConf* self, const gchar* key, GError **err)
218 ModestConfPrivate *priv;
220 g_return_val_if_fail (self, -1);
221 g_return_val_if_fail (key, -1);
223 priv = MODEST_CONF_GET_PRIVATE(self);
225 return gconf_client_get_float (priv->gconf_client, key, err);
229 modest_conf_get_bool (ModestConf* self, const gchar* key, GError **err)
231 ModestConfPrivate *priv;
233 g_return_val_if_fail (self, FALSE);
234 g_return_val_if_fail (key, FALSE);
236 priv = MODEST_CONF_GET_PRIVATE(self);
238 return gconf_client_get_bool (priv->gconf_client, key, err);
243 modest_conf_get_list (ModestConf* self, const gchar* key, ModestConfValueType list_type,
246 ModestConfPrivate *priv;
247 GConfValueType gconf_type;
249 g_return_val_if_fail (self, NULL);
250 g_return_val_if_fail (key, NULL);
252 priv = MODEST_CONF_GET_PRIVATE(self);
254 gconf_type = modest_conf_type_to_gconf_type (list_type, err);
256 return gconf_client_get_list (priv->gconf_client, key, gconf_type, err);
263 modest_conf_set_string (ModestConf* self, const gchar* key, const gchar* val,
266 ModestConfPrivate *priv;
268 g_return_val_if_fail (self,FALSE);
269 g_return_val_if_fail (key, FALSE);
270 g_return_val_if_fail (val, FALSE);
272 priv = MODEST_CONF_GET_PRIVATE(self);
274 if (!gconf_client_key_is_writable(priv->gconf_client,key,err)) {
275 g_printerr ("modest: '%s' is not writable\n", key);
279 return gconf_client_set_string (priv->gconf_client, key, val, err);
283 modest_conf_set_int (ModestConf* self, const gchar* key, gint val,
286 ModestConfPrivate *priv;
288 g_return_val_if_fail (self,FALSE);
289 g_return_val_if_fail (key, FALSE);
291 priv = MODEST_CONF_GET_PRIVATE(self);
293 if (!gconf_client_key_is_writable(priv->gconf_client,key,err)) {
294 g_printerr ("modest: '%s' is not writable\n", key);
298 return gconf_client_set_int (priv->gconf_client, key, val, err);
302 modest_conf_set_float (ModestConf* self,
307 ModestConfPrivate *priv;
309 g_return_val_if_fail (self,FALSE);
310 g_return_val_if_fail (key, FALSE);
312 priv = MODEST_CONF_GET_PRIVATE(self);
314 if (!gconf_client_key_is_writable(priv->gconf_client,key,err)) {
315 g_printerr ("modest: '%s' is not writable\n", key);
319 return gconf_client_set_float (priv->gconf_client, key, val, err);
324 modest_conf_set_bool (ModestConf* self, const gchar* key, gboolean val,
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 if (!gconf_client_key_is_writable(priv->gconf_client,key, err)) {
335 g_warning ("modest: '%s' is not writable\n", key);
339 return gconf_client_set_bool (priv->gconf_client, key, val, err);
344 modest_conf_set_list (ModestConf* self, const gchar* key,
345 GSList *val, ModestConfValueType list_type,
348 ModestConfPrivate *priv;
349 GConfValueType gconf_type;
351 g_return_val_if_fail (self, FALSE);
352 g_return_val_if_fail (key, FALSE);
354 priv = MODEST_CONF_GET_PRIVATE(self);
356 gconf_type = modest_conf_type_to_gconf_type (list_type, err);
358 return gconf_client_set_list (priv->gconf_client, key, gconf_type, val, err);
363 modest_conf_list_subkeys (ModestConf* self, const gchar* key, GError **err)
365 ModestConfPrivate *priv;
367 g_return_val_if_fail (self,FALSE);
368 g_return_val_if_fail (key, FALSE);
370 priv = MODEST_CONF_GET_PRIVATE(self);
372 return gconf_client_all_dirs (priv->gconf_client,key,err);
377 modest_conf_remove_key (ModestConf* self, const gchar* key, GError **err)
379 ModestConfPrivate *priv;
382 g_return_val_if_fail (self,FALSE);
383 g_return_val_if_fail (key, FALSE);
385 priv = MODEST_CONF_GET_PRIVATE(self);
387 retval = gconf_client_recursive_unset (priv->gconf_client,key,0,err);
388 gconf_client_suggest_sync (priv->gconf_client, NULL);
395 modest_conf_key_exists (ModestConf* self, const gchar* key, GError **err)
397 ModestConfPrivate *priv;
400 g_return_val_if_fail (self,FALSE);
401 g_return_val_if_fail (key, FALSE);
403 priv = MODEST_CONF_GET_PRIVATE(self);
405 /* the fast way... */
406 if (gconf_client_dir_exists (priv->gconf_client,key,err))
409 val = gconf_client_get (priv->gconf_client, key, NULL);
413 gconf_value_free (val);
420 modest_conf_key_escape (const gchar* key)
422 g_return_val_if_fail (key, NULL);
423 g_return_val_if_fail (strlen (key) > 0, g_strdup (key));
425 return gconf_escape_key (key, strlen(key));
430 modest_conf_key_unescape (const gchar* key)
432 g_return_val_if_fail (key, NULL);
434 return gconf_unescape_key (key, strlen(key));
438 modest_conf_key_is_valid (const gchar* key)
440 return gconf_valid_key (key, NULL);
444 modest_conf_on_change (GConfClient *client,
449 ModestConfEvent event;
452 event = (entry->value) ? MODEST_CONF_EVENT_KEY_CHANGED : MODEST_CONF_EVENT_KEY_UNSET;
453 key = gconf_entry_get_key (entry);
455 g_signal_emit (G_OBJECT(data),
456 signals[KEY_CHANGED_SIGNAL], 0,
457 key, event, conn_id);
460 static GConfValueType
461 modest_conf_type_to_gconf_type (ModestConfValueType value_type, GError **err)
463 GConfValueType gconf_type;
465 switch (value_type) {
466 case MODEST_CONF_VALUE_INT:
467 gconf_type = GCONF_VALUE_INT;
469 case MODEST_CONF_VALUE_BOOL:
470 gconf_type = GCONF_VALUE_BOOL;
472 case MODEST_CONF_VALUE_FLOAT:
473 gconf_type = GCONF_VALUE_FLOAT;
475 case MODEST_CONF_VALUE_STRING:
476 gconf_type = GCONF_VALUE_STRING;
479 gconf_type = GCONF_VALUE_INVALID;
480 g_printerr ("modest: invalid list value type %d\n", value_type);
481 *err = g_error_new_literal (MODEST_CONF_ERROR,
482 MODEST_CONF_ERROR_INVALID_VALUE,
483 "invalid list value type");
489 modest_conf_listen_to_namespace (ModestConf *self,
490 const gchar *namespace)
492 ModestConfPrivate *priv;
493 GError *error = NULL;
495 g_return_if_fail (MODEST_IS_CONF (self));
496 g_return_if_fail (namespace);
498 priv = MODEST_CONF_GET_PRIVATE(self);
500 /* Add the namespace to the list of the namespaces that will
502 gconf_client_add_dir (priv->gconf_client,
504 GCONF_CLIENT_PRELOAD_NONE,
509 modest_conf_forget_namespace (ModestConf *self,
510 const gchar *namespace)
512 ModestConfPrivate *priv;
514 g_return_if_fail (MODEST_IS_CONF (self));
515 g_return_if_fail (namespace);
517 priv = MODEST_CONF_GET_PRIVATE(self);
519 /* Remove the namespace to the list of the namespaces that will
521 gconf_client_remove_dir (priv->gconf_client, namespace, NULL);