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-marshal.h"
39 static void modest_conf_class_init (ModestConfClass *klass);
41 static void modest_conf_init (ModestConf *obj);
43 static void modest_conf_finalize (GObject *obj);
45 static void modest_conf_on_change (GConfClient *client, guint conn_id,
46 GConfEntry *entry, gpointer data);
48 static GConfValueType modest_conf_type_to_gconf_type (ModestConfValueType value_type,
56 static guint signals[LAST_SIGNAL] = {0};
59 typedef struct _ModestConfPrivate ModestConfPrivate;
60 struct _ModestConfPrivate {
61 GConfClient *gconf_client;
63 #define MODEST_CONF_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
67 static GObjectClass *parent_class = NULL;
70 modest_conf_get_type (void)
72 static GType my_type = 0;
74 static const GTypeInfo my_info = {
75 sizeof(ModestConfClass),
77 NULL, /* base finalize */
78 (GClassInitFunc) modest_conf_class_init,
79 NULL, /* class finalize */
80 NULL, /* class data */
83 (GInstanceInitFunc) modest_conf_init,
86 my_type = g_type_register_static (G_TYPE_OBJECT,
94 modest_conf_class_init (ModestConfClass *klass)
96 GObjectClass *gobject_class;
97 gobject_class = (GObjectClass*) klass;
99 parent_class = g_type_class_peek_parent (klass);
100 gobject_class->finalize = modest_conf_finalize;
102 g_type_class_add_private (gobject_class, sizeof(ModestConfPrivate));
104 signals[KEY_CHANGED_SIGNAL] =
105 g_signal_new ("key_changed",
106 G_TYPE_FROM_CLASS (gobject_class),
108 G_STRUCT_OFFSET (ModestConfClass,key_changed),
110 modest_marshal_VOID__STRING_INT_INT,
111 G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
115 modest_conf_init (ModestConf *obj)
117 GConfClient *conf = NULL;
118 GError *error = NULL;
119 ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(obj);
121 priv->gconf_client = NULL;
123 conf = gconf_client_get_default ();
125 g_printerr ("modest: could not get gconf client\n");
129 priv->gconf_client = conf;
131 /* All the tree will be listened */
132 gconf_client_add_dir (priv->gconf_client,
134 GCONF_CLIENT_PRELOAD_NONE,
137 /* Notify every change under namespace */
139 gconf_client_notify_add (priv->gconf_client,
141 modest_conf_on_change,
148 modest_conf_finalize (GObject *obj)
150 ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(obj);
151 if (priv->gconf_client) {
153 gconf_client_suggest_sync (priv->gconf_client, NULL);
155 g_object_unref (priv->gconf_client);
156 priv->gconf_client = NULL;
159 G_OBJECT_CLASS(parent_class)->finalize (obj);
163 modest_conf_new (void)
166 ModestConfPrivate *priv;
168 conf = MODEST_CONF(g_object_new(MODEST_TYPE_CONF, NULL));
170 g_printerr ("modest: failed to init ModestConf (GConf)\n");
174 priv = MODEST_CONF_GET_PRIVATE(conf);
175 if (!priv->gconf_client) {
176 g_printerr ("modest: failed to init gconf\n");
177 g_object_unref (conf);
186 modest_conf_get_string (ModestConf* self, const gchar* key, GError **err)
188 ModestConfPrivate *priv;
190 g_return_val_if_fail (self, NULL);
191 g_return_val_if_fail (key, NULL);
193 priv = MODEST_CONF_GET_PRIVATE(self);
194 return gconf_client_get_string (priv->gconf_client, key, err);
199 modest_conf_get_int (ModestConf* self, const gchar* key, GError **err)
201 ModestConfPrivate *priv;
203 g_return_val_if_fail (self, -1);
204 g_return_val_if_fail (key, -1);
206 priv = MODEST_CONF_GET_PRIVATE(self);
208 return gconf_client_get_int (priv->gconf_client, key, err);
212 modest_conf_get_float (ModestConf* self, const gchar* key, GError **err)
214 ModestConfPrivate *priv;
216 g_return_val_if_fail (self, -1);
217 g_return_val_if_fail (key, -1);
219 priv = MODEST_CONF_GET_PRIVATE(self);
221 return gconf_client_get_float (priv->gconf_client, key, err);
225 modest_conf_get_bool (ModestConf* self, const gchar* key, GError **err)
227 ModestConfPrivate *priv;
229 g_return_val_if_fail (self, FALSE);
230 g_return_val_if_fail (key, FALSE);
232 priv = MODEST_CONF_GET_PRIVATE(self);
234 return gconf_client_get_bool (priv->gconf_client, key, err);
239 modest_conf_get_list (ModestConf* self, const gchar* key, ModestConfValueType list_type,
242 ModestConfPrivate *priv;
243 GConfValueType gconf_type;
245 g_return_val_if_fail (self, NULL);
246 g_return_val_if_fail (key, NULL);
248 priv = MODEST_CONF_GET_PRIVATE(self);
250 gconf_type = modest_conf_type_to_gconf_type (list_type, err);
252 return gconf_client_get_list (priv->gconf_client, key, gconf_type, err);
259 modest_conf_set_string (ModestConf* self, const gchar* key, const gchar* val,
262 ModestConfPrivate *priv;
264 g_return_val_if_fail (self,FALSE);
265 g_return_val_if_fail (key, FALSE);
266 g_return_val_if_fail (val, FALSE);
268 priv = MODEST_CONF_GET_PRIVATE(self);
270 if (!gconf_client_key_is_writable(priv->gconf_client,key,err)) {
271 g_printerr ("modest: '%s' is not writable\n", key);
275 return gconf_client_set_string (priv->gconf_client, key, val, err);
279 modest_conf_set_int (ModestConf* self, const gchar* key, gint val,
282 ModestConfPrivate *priv;
284 g_return_val_if_fail (self,FALSE);
285 g_return_val_if_fail (key, FALSE);
287 priv = MODEST_CONF_GET_PRIVATE(self);
289 if (!gconf_client_key_is_writable(priv->gconf_client,key,err)) {
290 g_printerr ("modest: '%s' is not writable\n", key);
294 return gconf_client_set_int (priv->gconf_client, key, val, err);
298 modest_conf_set_float (ModestConf* self,
303 ModestConfPrivate *priv;
305 g_return_val_if_fail (self,FALSE);
306 g_return_val_if_fail (key, FALSE);
308 priv = MODEST_CONF_GET_PRIVATE(self);
310 if (!gconf_client_key_is_writable(priv->gconf_client,key,err)) {
311 g_printerr ("modest: '%s' is not writable\n", key);
315 return gconf_client_set_float (priv->gconf_client, key, val, err);
320 modest_conf_set_bool (ModestConf* self, const gchar* key, gboolean val,
323 ModestConfPrivate *priv;
325 g_return_val_if_fail (self,FALSE);
326 g_return_val_if_fail (key, FALSE);
328 priv = MODEST_CONF_GET_PRIVATE(self);
330 if (!gconf_client_key_is_writable(priv->gconf_client,key, err)) {
331 g_warning ("modest: '%s' is not writable\n", key);
335 return gconf_client_set_bool (priv->gconf_client, key, val, err);
340 modest_conf_set_list (ModestConf* self, const gchar* key,
341 GSList *val, ModestConfValueType list_type,
344 ModestConfPrivate *priv;
345 GConfValueType gconf_type;
347 g_return_val_if_fail (self, FALSE);
348 g_return_val_if_fail (key, FALSE);
350 priv = MODEST_CONF_GET_PRIVATE(self);
352 gconf_type = modest_conf_type_to_gconf_type (list_type, err);
354 return gconf_client_set_list (priv->gconf_client, key, gconf_type, val, err);
359 modest_conf_list_subkeys (ModestConf* self, const gchar* key, GError **err)
361 ModestConfPrivate *priv;
363 g_return_val_if_fail (self,FALSE);
364 g_return_val_if_fail (key, FALSE);
366 priv = MODEST_CONF_GET_PRIVATE(self);
368 return gconf_client_all_dirs (priv->gconf_client,key,err);
373 modest_conf_remove_key (ModestConf* self, const gchar* key, GError **err)
375 ModestConfPrivate *priv;
378 g_return_val_if_fail (self,FALSE);
379 g_return_val_if_fail (key, FALSE);
381 priv = MODEST_CONF_GET_PRIVATE(self);
383 retval = gconf_client_recursive_unset (priv->gconf_client,key,0,err);
384 gconf_client_suggest_sync (priv->gconf_client, NULL);
391 modest_conf_key_exists (ModestConf* self, const gchar* key, GError **err)
393 ModestConfPrivate *priv;
396 g_return_val_if_fail (self,FALSE);
397 g_return_val_if_fail (key, FALSE);
399 priv = MODEST_CONF_GET_PRIVATE(self);
401 /* the fast way... */
402 if (gconf_client_dir_exists (priv->gconf_client,key,err))
405 val = gconf_client_get (priv->gconf_client, key, NULL);
409 gconf_value_free (val);
416 modest_conf_key_escape (const gchar* key)
418 g_return_val_if_fail (key, NULL);
419 g_return_val_if_fail (strlen (key) > 0, g_strdup (key));
421 return gconf_escape_key (key, strlen(key));
426 modest_conf_key_unescape (const gchar* key)
428 g_return_val_if_fail (key, NULL);
430 return gconf_unescape_key (key, strlen(key));
434 modest_conf_key_is_valid (const gchar* key)
436 return gconf_valid_key (key, NULL);
440 modest_conf_on_change (GConfClient *client,
445 ModestConfEvent event;
448 event = (entry->value) ? MODEST_CONF_EVENT_KEY_CHANGED : MODEST_CONF_EVENT_KEY_UNSET;
449 key = gconf_entry_get_key (entry);
451 g_signal_emit (G_OBJECT(data),
452 signals[KEY_CHANGED_SIGNAL], 0,
453 key, event, conn_id);
456 static GConfValueType
457 modest_conf_type_to_gconf_type (ModestConfValueType value_type, GError **err)
459 GConfValueType gconf_type;
461 switch (value_type) {
462 case MODEST_CONF_VALUE_INT:
463 gconf_type = GCONF_VALUE_INT;
465 case MODEST_CONF_VALUE_BOOL:
466 gconf_type = GCONF_VALUE_BOOL;
468 case MODEST_CONF_VALUE_FLOAT:
469 gconf_type = GCONF_VALUE_FLOAT;
471 case MODEST_CONF_VALUE_STRING:
472 gconf_type = GCONF_VALUE_STRING;
475 /* FIXME: use MODEST_ERROR, and error code */
476 gconf_type = GCONF_VALUE_INVALID;
477 g_printerr ("modest: invalid list value type %d\n", value_type);
478 *err = g_error_new_literal (0, 0, "invalid list value type");
484 modest_conf_listen_to_namespace (ModestConf *self,
485 const gchar *namespace)
487 ModestConfPrivate *priv;
488 GError *error = NULL;
490 g_return_if_fail (MODEST_IS_CONF (self));
491 g_return_if_fail (namespace);
493 priv = MODEST_CONF_GET_PRIVATE(self);
495 /* Add the namespace to the list of the namespaces that will
497 gconf_client_add_dir (priv->gconf_client,
499 GCONF_CLIENT_PRELOAD_NONE,
504 modest_conf_forget_namespace (ModestConf *self,
505 const gchar *namespace)
507 ModestConfPrivate *priv;
509 g_return_if_fail (MODEST_IS_CONF (self));
510 g_return_if_fail (namespace);
512 priv = MODEST_CONF_GET_PRIVATE(self);
514 /* Remove the namespace to the list of the namespaces that will
516 gconf_client_remove_dir (priv->gconf_client, namespace, NULL);