From: Dirk-Jan C. Binnema Date: Tue, 11 Jul 2006 07:22:38 +0000 (+0000) Subject: * modest-conf-gconf.c => modest-conf.c X-Git-Tag: git_migration_finished~4520 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=ce20de84bc90c7a0f8f57b511d0a743efbbe4c9b * modest-conf-gconf.c => modest-conf.c * fixed signal handling, so: - also non-strings values will work - differentiate between NULL and having value unset * small code cleanups (cosmetic) * the new event stuff still needs to be added elsewhere in modest pmo-trunk-r356 --- diff --git a/src/Makefile.am b/src/Makefile.am index 4411eaf..4349dd9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,25 +1,20 @@ # # Makefile.am -# Time-stamp: <2006-06-02 16:29:55 (djcb)> -SUBDIRS=$(MODEST_UI_DIR) +# Time-stamp: <2006-07-05 13:04:47 (djcb)> +SUBDIRS=$(MODEST_BACKEND_DIR) +DIST_SUBDIRS = gtk hildon INCLUDES=\ $(MODEST_GSTUFF_CFLAGS)\ $(MODEST_LIBTINYMAIL_GNOME_DESKTOP_CFLAGS) \ $(MODEST_LIBTINYMAIL_MAEMO_CFLAGS) \ - -I$(MODEST_UI_DIR) -Wall\ - -DPREFIX=\"@prefix@\" \ - -Wall + -I$(MODEST_BACKEND_DIR) -DPREFIX=\"@prefix@\" -if HILDON -INCLUDES += -DIS_HILDON -endif - BUILT_SOURCES = modest-marshal.c modest-marshal.h modest-marshal.c: marshall.list glib-genmarshal --body --prefix=modest_marshal < marshall.list > modest-marshal.c - + modest-marshal.h: marshall.list glib-genmarshal --header --prefix=modest_marshal < marshall.list > modest-marshal.h @@ -31,7 +26,7 @@ modest_SOURCES=\ modest-main.c\ modest-conf-keys.h\ modest-conf.h \ - modest-conf-gconf.c\ + modest-conf.c\ modest-identity-keys.h\ modest-identity-mgr.h\ modest-identity-mgr.c\ @@ -77,4 +72,4 @@ modest_LDADD = \ $(MODEST_GSTUFF_LIBS) \ $(MODEST_LIBTINYMAIL_GNOME_DESKTOP_LIBS) \ $(MODEST_LIBTINYMAIL_MAEMO_LIBS) \ - $(MODEST_UI_DIR)/libmodest-ui.la + $(MODEST_BACKEND_DIR)/libmodest-ui.la diff --git a/src/modest-conf.c b/src/modest-conf.c new file mode 100644 index 0000000..d878028 --- /dev/null +++ b/src/modest-conf.c @@ -0,0 +1,337 @@ +/* Copyright (c) 2006, Nokia Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Nokia Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include "modest-conf.h" +#include "modest-marshal.h" + +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); +/* list my signals */ +enum { + KEY_CHANGED_SIGNAL, + LAST_SIGNAL +}; +static guint signals[LAST_SIGNAL] = {0}; + + +typedef struct _ModestConfPrivate ModestConfPrivate; +struct _ModestConfPrivate { + GConfClient *gconf_client; +}; +#define MODEST_CONF_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ + MODEST_TYPE_CONF, \ + ModestConfPrivate)) +/* globals */ +static GObjectClass *parent_class = NULL; + +GType +modest_conf_get_type (void) +{ + static GType my_type = 0; + if (!my_type) { + static const GTypeInfo my_info = { + sizeof(ModestConfClass), + NULL, /* base init */ + NULL, /* base finalize */ + (GClassInitFunc) modest_conf_class_init, + NULL, /* class finalize */ + NULL, /* class data */ + sizeof(ModestConf), + 1, /* n_preallocs */ + (GInstanceInitFunc) modest_conf_init, + }; + my_type = g_type_register_static (G_TYPE_OBJECT, + "ModestConf", + &my_info, 0); + } + return my_type; +} + +static void +modest_conf_class_init (ModestConfClass *klass) +{ + GObjectClass *gobject_class; + gobject_class = (GObjectClass*) klass; + + parent_class = g_type_class_peek_parent (klass); + gobject_class->finalize = modest_conf_finalize; + + g_type_class_add_private (gobject_class, sizeof(ModestConfPrivate)); + + signals[KEY_CHANGED_SIGNAL] = + g_signal_new ("key_changed", + G_TYPE_FROM_CLASS (gobject_class), + 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); +} + +static void +modest_conf_init (ModestConf *obj) +{ + GConfClient *conf = NULL; + ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(obj); + GError *err = NULL; + + priv->gconf_client = NULL; + + conf = gconf_client_get_default (); + if (!conf) { + g_printerr ("modest: could not get gconf client\n"); + return; + } + + gconf_client_add_dir (conf,MODEST_CONF_NAMESPACE, + 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; + } + + priv->gconf_client = conf; /* all went well! */ +} + +static void +modest_conf_finalize (GObject *obj) +{ + ModestConfPrivate *priv = MODEST_CONF_GET_PRIVATE(obj); + if (priv->gconf_client) { + + gconf_client_suggest_sync (priv->gconf_client, NULL); + + g_object_unref (priv->gconf_client); + priv->gconf_client = NULL; + } +} + +GObject* +modest_conf_new (void) +{ + ModestConf *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); + if (!priv->gconf_client) { + g_printerr ("modest: failed to init gconf\n"); + g_object_unref (conf); + return NULL; + } + + return G_OBJECT(conf); +} + + +gchar* +modest_conf_get_string (ModestConf* self, const gchar* key, GError **err) +{ + ModestConfPrivate *priv; + + g_return_val_if_fail (self, NULL); + g_return_val_if_fail (key, NULL); + + priv = MODEST_CONF_GET_PRIVATE(self); + return gconf_client_get_string (priv->gconf_client, key, err); +} + + +gint +modest_conf_get_int (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_int (priv->gconf_client, key, err); +} + + +gboolean +modest_conf_get_bool (ModestConf* self, const gchar* key, GError **err) +{ + ModestConfPrivate *priv; + + g_return_val_if_fail (self, FALSE); + g_return_val_if_fail (key, FALSE); + + priv = MODEST_CONF_GET_PRIVATE(self); + + return gconf_client_get_bool (priv->gconf_client, key, err); +} + + +gboolean +modest_conf_set_string (ModestConf* self, const gchar* key, const gchar* 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_string (priv->gconf_client, key, val, err); +} + + +gboolean +modest_conf_set_int (ModestConf* self, const gchar* key, gint 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_int (priv->gconf_client, key, val, err); +} + + +gboolean +modest_conf_set_bool (ModestConf* self, const gchar* key, gboolean 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_warning ("modest: '%s' is not writable\n", key); + return FALSE; + } + + return gconf_client_set_bool (priv->gconf_client,key,val, err); +} + + + + +GSList* +modest_conf_list_subkeys (ModestConf* self, const gchar* key, GError **err) +{ + ModestConfPrivate *priv; + + g_return_val_if_fail (self,FALSE); + g_return_val_if_fail (key, FALSE); + + priv = MODEST_CONF_GET_PRIVATE(self); + + return gconf_client_all_dirs (priv->gconf_client,key,err); +} + + +gboolean +modest_conf_remove_key (ModestConf* self, const gchar* key, GError **err) +{ + ModestConfPrivate *priv; + + 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); +} + + + + +gboolean +modest_conf_key_exists (ModestConf* self, const gchar* key, GError **err) +{ + ModestConfPrivate *priv; + + 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); +} + + + + + +static void +modest_conf_on_change (GConfClient *client, guint conn_id, GConfEntry *entry, + gpointer data) +{ + ModestConfEvent event; + const gchar* key; + + event = (entry->value) ? MODEST_CONF_EVENT_KEY_CHANGED : MODEST_CONF_EVENT_KEY_UNSET; + key = gconf_entry_get_key (entry); + + g_signal_emit (G_OBJECT(data), + signals[KEY_CHANGED_SIGNAL], 0, + key, event); +} diff --git a/src/modest-conf.h b/src/modest-conf.h index af1fa2c..895ee2b 100644 --- a/src/modest-conf.h +++ b/src/modest-conf.h @@ -27,9 +27,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -/* modest-conf.h */ - #ifndef __MODEST_CONF_H__ #define __MODEST_CONF_H__ @@ -46,19 +43,23 @@ G_BEGIN_DECLS #define MODEST_IS_CONF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_CONF)) #define MODEST_CONF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_CONF,ModestConfClass)) -typedef struct _ModestConf ModestConf; -typedef struct _ModestConfClass ModestConfClass; +typedef struct _ModestConf ModestConf; +typedef struct _ModestConfClass ModestConfClass; +typedef enum _ModestConfEvent ModestConfEvent; struct _ModestConf { GObject parent; }; struct _ModestConfClass { - GObjectClass parent_class; - - void (* key_changed) (ModestConf* self, const gchar *key, const gchar *new_value); + GObjectClass parent_class; + void (* key_changed) (ModestConf* self, const gchar *key, ModestConfEvent event); }; +enum _ModestConfEvent { + MODEST_CONF_EVENT_KEY_CHANGED, + MODEST_CONF_EVENT_KEY_UNSET +}; /** * modest_conf_get_type: