X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-conf.c;h=019b16826535a124102363604889f490146d4296;hb=7e7be75d6f353df4d1c605d5df3011457f51a926;hp=afeeb21b7b221a8ac06d8d5a47aa4fabe1c8daa1;hpb=e945917cdf9665580268ead123cd0df719990eda;p=modest diff --git a/src/modest-conf.c b/src/modest-conf.c index afeeb21..019b168 100644 --- a/src/modest-conf.c +++ b/src/modest-conf.c @@ -29,14 +29,18 @@ #include #include +#include #include "modest-conf.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, @@ -70,6 +74,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", @@ -150,6 +155,8 @@ modest_conf_finalize (GObject *obj) g_object_unref (priv->gconf_client); priv->gconf_client = NULL; } + + G_OBJECT_CLASS(parent_class)->finalize (obj); } ModestConf* @@ -216,54 +223,21 @@ modest_conf_get_bool (ModestConf* self, const gchar* key, GError **err) } - -gchar* -modest_conf_get_string_or_default (ModestConf* self, const gchar* key, - const gchar *defaultval) -{ - ModestConfPrivate *priv; - GConfValue *val; - const gchar *str; - - g_return_val_if_fail (self, g_strdup(defaultval)); - g_return_val_if_fail (key, g_strdup(defaultval)); - - priv = MODEST_CONF_GET_PRIVATE(self); - val = gconf_client_get (priv->gconf_client, key, NULL); - - if (!val) - str = defaultval; - else { - str = gconf_value_get_string (val); - gconf_value_free (val); - } - - return g_strdup (str); -} - - -gint -modest_conf_get_int_or_default (ModestConf* self, const gchar* key, - gint defaultval) +GSList * +modest_conf_get_list (ModestConf* self, const gchar* key, ModestConfValueType list_type, + GError **err) { - ModestConfPrivate *priv; - GConfValue *val; - gint retval; - - g_return_val_if_fail (self, defaultval); - g_return_val_if_fail (key, defaultval); + 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); - val = gconf_client_get (priv->gconf_client, key, NULL); + priv = MODEST_CONF_GET_PRIVATE(self); - if (!val) - retval = defaultval; - else { - retval = gconf_value_get_int (val); - gconf_value_free (val); - } + gconf_type = modest_conf_type_to_gconf_type (list_type, err); - return retval; + return gconf_client_get_list (priv->gconf_client, key, gconf_type, err); } @@ -329,6 +303,45 @@ modest_conf_set_bool (ModestConf* self, const gchar* key, gboolean val, } +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); + if (*err) + return FALSE; + + + gboolean result = gconf_client_set_list (priv->gconf_client, key, gconf_type, val, err); + if(*err) { + g_warning("gconf_client_set_list() failed with key=%s. error=%s", key, (*err)->message); + result = FALSE; + } + + /* TODO: Remove this, when we fix the problem: */ + /* This shows that sometimes set_list fails, while saying that it succeeded: */ + if (result) { + const gint debug_list_length_start = g_slist_length(val); + GSList* debug_list = gconf_client_get_list(priv->gconf_client, key, gconf_type, err); + const gint debug_list_length_after = g_slist_length(debug_list); + + if(debug_list_length_start != debug_list_length_after) + g_warning("modest_conf_set_list(): The list length after setting is not the same as the specified list. key=%s", key); + + g_slist_free(debug_list); + } + + return result; +} GSList* @@ -349,13 +362,17 @@ 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; } @@ -385,24 +402,31 @@ modest_conf_key_exists (ModestConf* self, const gchar* key, GError **err) 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); +} +/* hmmm... might need to make specific callback for specific keys */ static void modest_conf_on_change (GConfClient *client, guint conn_id, GConfEntry *entry, gpointer data) @@ -417,3 +441,28 @@ modest_conf_on_change (GConfClient *client, guint conn_id, GConfEntry *entry, signals[KEY_CHANGED_SIGNAL], 0, key, event); } + +static GConfValueType +modest_conf_type_to_gconf_type (ModestConfValueType value_type, GError **err) +{ + GConfValueType gconf_type = 0; + + 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: + /* FIXME: use MODEST_ERROR, and error code */ + *err = g_error_new_literal (0, 0, _("Invalid list value type")); + } + return gconf_type; +}