X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-conf.c;h=835d2873abd8ba803274fa1acadfa14034e92dd8;hp=d9c2c68088b0d28edd660e51d32fc8fc11d805dd;hb=0e371a5a4b290fc2da052003267a87ea7fcb8a01;hpb=a61d692fcc93b406476c8ee5548470900d8bf42f diff --git a/src/modest-conf.c b/src/modest-conf.c index d9c2c68..835d287 100644 --- a/src/modest-conf.c +++ b/src/modest-conf.c @@ -28,15 +28,27 @@ */ #include +#include #include +#include +#include "modest-defs.h" #include "modest-conf.h" +#include "modest-error.h" #include "modest-marshal.h" +#include static void modest_conf_class_init (ModestConfClass *klass); + static void modest_conf_init (ModestConf *obj); + static void modest_conf_finalize (GObject *obj); + static void modest_conf_on_change (GConfClient *client, guint conn_id, GConfEntry *entry, gpointer data); + +static GConfValueType modest_conf_type_to_gconf_type (ModestConfValueType value_type, + GError **err); + /* list my signals */ enum { KEY_CHANGED_SIGNAL, @@ -50,8 +62,8 @@ struct _ModestConfPrivate { GConfClient *gconf_client; }; #define MODEST_CONF_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ - MODEST_TYPE_CONF, \ - ModestConfPrivate)) + MODEST_TYPE_CONF, \ + ModestConfPrivate)) /* globals */ static GObjectClass *parent_class = NULL; @@ -70,6 +82,7 @@ modest_conf_get_type (void) sizeof(ModestConf), 1, /* n_preallocs */ (GInstanceInitFunc) modest_conf_init, + NULL }; my_type = g_type_register_static (G_TYPE_OBJECT, "ModestConf", @@ -95,17 +108,17 @@ modest_conf_class_init (ModestConfClass *klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (ModestConfClass,key_changed), NULL, NULL, - modest_marshal_VOID__STRING_INT, - G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT); + modest_marshal_VOID__STRING_INT_INT, + G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); } static void modest_conf_init (ModestConf *obj) { GConfClient *conf = NULL; + GError *error = NULL; ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(obj); - GError *err = NULL; - + priv->gconf_client = NULL; conf = gconf_client_get_default (); @@ -114,29 +127,25 @@ modest_conf_init (ModestConf *obj) return; } - gconf_client_add_dir (conf,MODEST_CONF_NAMESPACE, + priv->gconf_client = conf; + + /* All the tree will be listened */ + gconf_client_add_dir (priv->gconf_client, + "/apps/modest", GCONF_CLIENT_PRELOAD_NONE, - &err); - if (err) { - g_printerr ("modest: error %d with gconf_client_add_dir: '%s'\n", - err->code, err->message); - g_object_unref (conf); - g_error_free (err); - return; - } - - gconf_client_notify_add (conf, MODEST_CONF_NAMESPACE, - modest_conf_on_change, - obj, NULL, &err); - if (err) { - g_printerr ("modest: gconf_client_notify_add error %d: '%s'\n", - err->code, err->message); - g_object_unref (conf); - g_error_free (err); - return; + &error); + + /* Notify every change under namespace */ + if (!error) { + gconf_client_notify_add (priv->gconf_client, + "/apps/modest", + modest_conf_on_change, + obj, + NULL, + &error); + } else { + g_error_free (error); } - - priv->gconf_client = conf; /* all went well! */ } static void @@ -150,18 +159,23 @@ modest_conf_finalize (GObject *obj) g_object_unref (priv->gconf_client); priv->gconf_client = NULL; } + + G_OBJECT_CLASS(parent_class)->finalize (obj); } ModestConf* modest_conf_new (void) { - ModestConf *conf = MODEST_CONF(g_object_new(MODEST_TYPE_CONF, NULL)); + ModestConf *conf; + ModestConfPrivate *priv; + + conf = MODEST_CONF(g_object_new(MODEST_TYPE_CONF, NULL)); if (!conf) { g_printerr ("modest: failed to init ModestConf (GConf)\n"); return NULL; } - ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(conf); + priv = MODEST_CONF_GET_PRIVATE(conf); if (!priv->gconf_client) { g_printerr ("modest: failed to init gconf\n"); g_object_unref (conf); @@ -198,6 +212,18 @@ modest_conf_get_int (ModestConf* self, const gchar* key, GError **err) return gconf_client_get_int (priv->gconf_client, key, err); } +gdouble +modest_conf_get_float (ModestConf* self, const gchar* key, GError **err) +{ + ModestConfPrivate *priv; + + g_return_val_if_fail (self, -1); + g_return_val_if_fail (key, -1); + + priv = MODEST_CONF_GET_PRIVATE(self); + + return gconf_client_get_float (priv->gconf_client, key, err); +} gboolean modest_conf_get_bool (ModestConf* self, const gchar* key, GError **err) @@ -213,6 +239,26 @@ modest_conf_get_bool (ModestConf* self, const gchar* key, GError **err) } +GSList * +modest_conf_get_list (ModestConf* self, const gchar* key, ModestConfValueType list_type, + GError **err) +{ + ModestConfPrivate *priv; + GConfValueType gconf_type; + + g_return_val_if_fail (self, NULL); + g_return_val_if_fail (key, NULL); + + priv = MODEST_CONF_GET_PRIVATE(self); + + gconf_type = modest_conf_type_to_gconf_type (list_type, err); + + return gconf_client_get_list (priv->gconf_client, key, gconf_type, err); +} + + + + gboolean modest_conf_set_string (ModestConf* self, const gchar* key, const gchar* val, GError **err) @@ -221,6 +267,7 @@ modest_conf_set_string (ModestConf* self, const gchar* key, const gchar* val, g_return_val_if_fail (self,FALSE); g_return_val_if_fail (key, FALSE); + g_return_val_if_fail (val, FALSE); priv = MODEST_CONF_GET_PRIVATE(self); @@ -229,10 +276,9 @@ modest_conf_set_string (ModestConf* self, const gchar* key, const gchar* val, return FALSE; } - return gconf_client_set_string (priv->gconf_client, key, val, err); + return gconf_client_set_string (priv->gconf_client, key, val, err); } - gboolean modest_conf_set_int (ModestConf* self, const gchar* key, gint val, GError **err) @@ -249,7 +295,28 @@ modest_conf_set_int (ModestConf* self, const gchar* key, gint val, return FALSE; } - return gconf_client_set_int (priv->gconf_client, key, val, err); + return gconf_client_set_int (priv->gconf_client, key, val, err); +} + +gboolean +modest_conf_set_float (ModestConf* self, + const gchar* key, + gdouble val, + GError **err) +{ + ModestConfPrivate *priv; + + g_return_val_if_fail (self,FALSE); + g_return_val_if_fail (key, FALSE); + + priv = MODEST_CONF_GET_PRIVATE(self); + + if (!gconf_client_key_is_writable(priv->gconf_client,key,err)) { + g_printerr ("modest: '%s' is not writable\n", key); + return FALSE; + } + + return gconf_client_set_float (priv->gconf_client, key, val, err); } @@ -268,11 +335,28 @@ modest_conf_set_bool (ModestConf* self, const gchar* key, gboolean val, g_warning ("modest: '%s' is not writable\n", key); return FALSE; } - - return gconf_client_set_bool (priv->gconf_client,key,val, err); + + return gconf_client_set_bool (priv->gconf_client, key, val, err); } +gboolean +modest_conf_set_list (ModestConf* self, const gchar* key, + GSList *val, ModestConfValueType list_type, + GError **err) +{ + ModestConfPrivate *priv; + GConfValueType gconf_type; + + g_return_val_if_fail (self, FALSE); + g_return_val_if_fail (key, FALSE); + + priv = MODEST_CONF_GET_PRIVATE(self); + + gconf_type = modest_conf_type_to_gconf_type (list_type, err); + + return gconf_client_set_list (priv->gconf_client, key, gconf_type, val, err); +} GSList* @@ -293,53 +377,73 @@ gboolean modest_conf_remove_key (ModestConf* self, const gchar* key, GError **err) { ModestConfPrivate *priv; - + gboolean retval; + g_return_val_if_fail (self,FALSE); g_return_val_if_fail (key, FALSE); priv = MODEST_CONF_GET_PRIVATE(self); - return gconf_client_recursive_unset (priv->gconf_client,key,0,err); -} - + retval = gconf_client_recursive_unset (priv->gconf_client,key,0,err); + gconf_client_suggest_sync (priv->gconf_client, NULL); + return retval; +} gboolean modest_conf_key_exists (ModestConf* self, const gchar* key, GError **err) { ModestConfPrivate *priv; - + GConfValue *val; + g_return_val_if_fail (self,FALSE); g_return_val_if_fail (key, FALSE); priv = MODEST_CONF_GET_PRIVATE(self); - - return gconf_client_dir_exists (priv->gconf_client,key,err); + + /* the fast way... */ + if (gconf_client_dir_exists (priv->gconf_client,key,err)) + return TRUE; + + val = gconf_client_get (priv->gconf_client, key, NULL); + if (!val) + return FALSE; + else { + gconf_value_free (val); + return TRUE; + } } gchar* -modest_conf_key_escape (ModestConf *self, const gchar* key) +modest_conf_key_escape (const gchar* key) { g_return_val_if_fail (key, NULL); - + g_return_val_if_fail (strlen (key) > 0, g_strdup (key)); + return gconf_escape_key (key, strlen(key)); } gchar* -modest_conf_key_unescape (ModestConf *self, const gchar* key) +modest_conf_key_unescape (const gchar* key) { g_return_val_if_fail (key, NULL); return gconf_unescape_key (key, strlen(key)); } - +gboolean +modest_conf_key_is_valid (const gchar* key) +{ + return gconf_valid_key (key, NULL); +} static void -modest_conf_on_change (GConfClient *client, guint conn_id, GConfEntry *entry, +modest_conf_on_change (GConfClient *client, + guint conn_id, + GConfEntry *entry, gpointer data) { ModestConfEvent event; @@ -350,5 +454,69 @@ modest_conf_on_change (GConfClient *client, guint conn_id, GConfEntry *entry, g_signal_emit (G_OBJECT(data), signals[KEY_CHANGED_SIGNAL], 0, - key, event); + key, event, conn_id); +} + +static GConfValueType +modest_conf_type_to_gconf_type (ModestConfValueType value_type, GError **err) +{ + GConfValueType gconf_type; + + switch (value_type) { + case MODEST_CONF_VALUE_INT: + gconf_type = GCONF_VALUE_INT; + break; + case MODEST_CONF_VALUE_BOOL: + gconf_type = GCONF_VALUE_BOOL; + break; + case MODEST_CONF_VALUE_FLOAT: + gconf_type = GCONF_VALUE_FLOAT; + break; + case MODEST_CONF_VALUE_STRING: + gconf_type = GCONF_VALUE_STRING; + break; + default: + gconf_type = GCONF_VALUE_INVALID; + g_printerr ("modest: invalid list value type %d\n", value_type); + *err = g_error_new_literal (MODEST_CONF_ERROR, + MODEST_CONF_ERROR_INVALID_VALUE, + "invalid list value type"); + } + return gconf_type; +} + +void +modest_conf_listen_to_namespace (ModestConf *self, + const gchar *namespace) +{ + ModestConfPrivate *priv; + GError *error = NULL; + + g_return_if_fail (MODEST_IS_CONF (self)); + g_return_if_fail (namespace); + + priv = MODEST_CONF_GET_PRIVATE(self); + + /* Add the namespace to the list of the namespaces that will + be observed */ + gconf_client_add_dir (priv->gconf_client, + namespace, + GCONF_CLIENT_PRELOAD_NONE, + &error); +} + +void +modest_conf_forget_namespace (ModestConf *self, + const gchar *namespace) +{ + ModestConfPrivate *priv; + + g_return_if_fail (MODEST_IS_CONF (self)); + g_return_if_fail (namespace); + + priv = MODEST_CONF_GET_PRIVATE(self); + + /* Remove the namespace to the list of the namespaces that will + be observed */ + gconf_client_remove_dir (priv->gconf_client, namespace, NULL); }