* modest-conf-gconf.c => modest-conf.c
authorDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Tue, 11 Jul 2006 07:22:38 +0000 (07:22 +0000)
committerDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Tue, 11 Jul 2006 07:22:38 +0000 (07:22 +0000)
* 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

src/Makefile.am
src/modest-conf.c [new file with mode: 0644]
src/modest-conf.h

index 4411eaf..4349dd9 100644 (file)
@@ -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 (file)
index 0000000..d878028
--- /dev/null
@@ -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 <gconf/gconf-client.h>
+#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);
+}
index af1fa2c..895ee2b 100644 (file)
@@ -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: