Make gconf and paths be configurable in runtime with env vars
authorJose Dapena Paz <jdapena@igalia.com>
Tue, 3 Feb 2009 11:48:56 +0000 (11:48 +0000)
committerJose Dapena Paz <jdapena@igalia.com>
Tue, 3 Feb 2009 11:48:56 +0000 (11:48 +0000)
pmo-trunk-r7368

src/Makefile.am
src/modest-account-mgr.c
src/modest-defs.c [new file with mode: 0644]
src/modest-defs.h
tests/check_modest-conf.c

index 8592a26..a9977a2 100644 (file)
@@ -83,6 +83,7 @@ libmodest_la_SOURCES=\
        modest-datetime-formatter.h \
        modest-debug.h \
        modest-defs.h \
+       modest-defs.c \
        modest-dimming-rule.c \
        modest-dimming-rule.h \
        modest-dimming-rules-group.c \
index c3e12dc..368b9c2 100644 (file)
@@ -746,7 +746,8 @@ modest_account_mgr_account_names (ModestAccountMgr * self, gboolean only_enabled
        ModestAccountMgrPrivate *priv;
        GError *err = NULL;
        
-       const size_t prefix_len = strlen (MODEST_ACCOUNT_NAMESPACE "/");
+       /* we add 1 for the trailing "/" */
+       const size_t prefix_len = strlen (MODEST_ACCOUNT_NAMESPACE) + 1;
 
        g_return_val_if_fail (self, NULL);
 
@@ -1277,8 +1278,8 @@ _modest_account_mgr_account_from_key (const gchar *key, gboolean *is_account_key
        if (is_server_account)
                *is_server_account = FALSE;
 
-       const gchar* account_ns        = MODEST_ACCOUNT_NAMESPACE "/";
-       const gchar* server_account_ns = MODEST_SERVER_ACCOUNT_NAMESPACE "/";
+       const gchar* account_ns        = modest_defs_namespace (MODEST_ACCOUNT_SUBNAMESPACE "/");
+       const gchar* server_account_ns = modest_defs_namespace (MODEST_SERVER_ACCOUNT_SUBNAMESPACE "/");
        gchar *cursor;
        gchar *account = NULL;
 
@@ -1349,7 +1350,7 @@ _modest_account_mgr_get_account_keyname (const gchar *account_name, const gchar*
                                         gboolean server_account)
 {
        gchar *retval = NULL;   
-       gchar *namespace = server_account ? MODEST_SERVER_ACCOUNT_NAMESPACE : MODEST_ACCOUNT_NAMESPACE;
+       gchar *namespace = server_account ? (gchar *) MODEST_SERVER_ACCOUNT_NAMESPACE : (gchar *) MODEST_ACCOUNT_NAMESPACE;
        gchar *escaped_account_name, *escaped_name;
        
        if (!account_name)
diff --git a/src/modest-defs.c b/src/modest-defs.c
new file mode 100644 (file)
index 0000000..6b73933
--- /dev/null
@@ -0,0 +1,113 @@
+/* Copyright (c) 2009, 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 <modest-defs.h>
+#include <glib.h>
+
+static GHashTable *hash_dir = NULL;
+static GHashTable *hash_namespace = NULL;
+
+static gchar *modest_dir = NULL;
+static gchar *modest_namespace = NULL;
+
+static void init_hash_dir (void);
+static void init_hash_namespace (void);
+
+const gchar *
+modest_defs_dir (const gchar *string)
+{
+       const gchar *ret_value;
+
+       if (hash_dir == NULL) init_hash_dir ();
+
+       if (string == NULL)
+               return (const gchar *) modest_dir;
+
+       ret_value = (const gchar *) g_hash_table_lookup (hash_dir, string);
+       if (ret_value == NULL) {
+               ret_value = (const gchar *) g_strconcat (modest_dir, string, NULL);
+               g_hash_table_insert (hash_dir, (gpointer) string, (gpointer) ret_value);
+       }
+       return ret_value;
+}
+
+const gchar *
+modest_defs_namespace (const gchar *string)
+{
+       const gchar *ret_value;
+
+       if (hash_namespace == NULL) init_hash_namespace ();
+
+       if (string == NULL)
+               return (const gchar *) modest_namespace;
+
+       ret_value = (const gchar *) g_hash_table_lookup (hash_namespace, string);
+       if (ret_value == NULL) {
+               ret_value = (const gchar *) g_strconcat (modest_namespace, string, NULL);
+               g_hash_table_insert (hash_namespace, (gpointer) string, (gpointer) ret_value);
+       }
+       return ret_value;
+}
+
+static void 
+init_hash_dir (void)
+{
+       const gchar *env_value;
+
+       if (hash_dir != NULL)
+               return;
+
+       hash_dir = g_hash_table_new (g_str_hash, g_str_equal);
+
+       env_value = g_getenv (MODEST_DIR_ENV);
+
+       if (env_value == NULL || env_value[0] == '\0') {
+               env_value = MODEST_DEFAULT_DIR;
+       }
+       modest_dir = g_strdup (env_value);
+}
+
+static void 
+init_hash_namespace (void)
+{
+       const gchar *env_value;
+
+       if (hash_namespace != NULL)
+               return;
+
+       hash_namespace = g_hash_table_new (g_str_hash, g_str_equal);
+
+       env_value = g_getenv (MODEST_NAMESPACE_ENV);
+
+       if (env_value == NULL || env_value[0] == '\0') {
+               env_value = MODEST_DEFAULT_NAMESPACE;
+       }
+       modest_namespace = g_strdup (env_value);
+}
+
index 602d351..b36e856 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006, Nokia Corporation
+/* Copyright (c) 2006-2009, Nokia Corporation
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include <config.h>
 #include <glib/gi18n.h>
 
+const gchar *modest_defs_dir (const gchar *string);
+const gchar *modest_defs_namespace (const gchar *string);
+
+
+/* Default paths. We set them this way so that we can define on runtime
+ * different values */
+#define MODEST_DEFAULT_DIR ".modest"
+#define MODEST_DEFAULT_NAMESPACE "/apps/modest"
+#define MODEST_DIR_ENV "MODEST_DIR"
+#define MODEST_NAMESPACE_ENV "MODEST_GCONF_NAMESPACE"
+
 /* Some interesting directories. NOTE, they should be prefixed
  * with $HOME; Also, except for MODEST_DIR itself, they
  * need to be prefixed with MODEST_DIR;
@@ -41,7 +52,7 @@
  * building of dirs from their components.
  * g_build_dir is your friend
  */
-#define MODEST_DIR                       ".modest"
+#define MODEST_DIR                       modest_defs_dir (NULL)
 #define MODEST_CACHE_DIR                  "cache"
 #define MODEST_IMAGES_CACHE_DIR           "images"
 #define MODEST_IMAGES_CACHE_SIZE          (1024*1024)
@@ -69,7 +80,7 @@
 #define MODEST_MMC1_VOLUMEPATH_URI_PREFIX "file://"
 
 /* configuration key definitions for modest */
-#define MODEST_CONF_NAMESPACE          "/apps/modest"
+#define MODEST_CONF_NAMESPACE          (modest_defs_namespace (NULL))
 
 /* the mapping files, there are two possibilities; used in modest_maemo_open_mcc_mapping_file */
 #define MODEST_MCC_MAPPING                 PREFIX "/share/modest/provider-data/mcc_mapping"
 #endif
 
 /* configuration key definitions for modest */
-#define MODEST_ACCOUNT_NAMESPACE         MODEST_CONF_NAMESPACE "/accounts"
-#define MODEST_CONF_DEFAULT_ACCOUNT      MODEST_CONF_NAMESPACE "/default_account"
+#define MODEST_ACCOUNT_SUBNAMESPACE      "/accounts"
+#define MODEST_ACCOUNT_NAMESPACE         (modest_defs_namespace (MODEST_ACCOUNT_SUBNAMESPACE))
+#define MODEST_CONF_DEFAULT_ACCOUNT      (modest_defs_namespace ("/default_account"))
 
 /* Not used: #define MODEST_CONF_CONNECT_AT_STARTUP   MODEST_CONF_NAMESPACE "/connect_at_startup" */      
 
-#define MODEST_CONF_SHOW_CC              MODEST_CONF_NAMESPACE "/show_cc"           
-#define MODEST_CONF_SHOW_BCC             MODEST_CONF_NAMESPACE "/show_bcc"           
+#define MODEST_CONF_SHOW_CC              (modest_defs_namespace ("/show_cc"))
+#define MODEST_CONF_SHOW_BCC             (modest_defs_namespace ("/show_bcc"))
 
 /* This is the alarmd cookie, obtained from alarm_event_add(), 
  * which apparently remains valid between application instances.
  * We store it so that we can remove it later.
  */
-#define MODEST_CONF_ALARM_ID MODEST_CONF_NAMESPACE "/alarm_id"
+#define MODEST_CONF_ALARM_ID (modest_defs_namespace ("/alarm_id"))
 
 /*
  * in the maemo case, we try to replace this
 /* the name of the device; in case of maemo this is set and updated
  * using dbus; see modest-maemo-utils.[ch]
  */
-#define MODEST_CONF_DEVICE_NAME       MODEST_CONF_NAMESPACE "/device_name"
+#define MODEST_CONF_DEVICE_NAME       (modest_defs_namespace ("/device_name"))
 
 
 /* place for widget settings */
-#define MODEST_CONF_WIDGET_NAMESPACE     MODEST_CONF_NAMESPACE "/widgets"
+#define MODEST_CONF_WIDGET_SUBNAMESPACE  "/widgets"
+#define MODEST_CONF_WIDGET_NAMESPACE     (modest_defs_namespace (MODEST_CONF_WIDGET_SUBNAMESPACE))
 #define MODEST_CONF_FOLDER_VIEW_KEY      "folder-view"
 #define MODEST_CONF_HEADER_VIEW_KEY      "header-view"
 #define MODEST_CONF_MAIN_PANED_KEY       "modest-main-paned"
 #define MODEST_CONF_EDIT_WINDOW_KEY      "modest-edit-msg-window"
 #define MODEST_CONF_MSG_VIEW_WINDOW_KEY  "modest-msg-view-window"
 
-#define MODEST_SERVER_ACCOUNT_NAMESPACE  MODEST_CONF_NAMESPACE "/" "server_accounts"
+#define MODEST_SERVER_ACCOUNT_SUBNAMESPACE "/server_accounts"
+#define MODEST_SERVER_ACCOUNT_NAMESPACE  (modest_defs_namespace (MODEST_SERVER_ACCOUNT_SUBNAMESPACE))
 
 /* show toolbar settings */
-#define MODEST_CONF_MAIN_WINDOW_SHOW_TOOLBAR MODEST_CONF_WIDGET_NAMESPACE "/" MODEST_CONF_MAIN_WINDOW_KEY "/show_toolbar"
-#define MODEST_CONF_EDIT_WINDOW_SHOW_TOOLBAR MODEST_CONF_WIDGET_NAMESPACE "/" MODEST_CONF_EDIT_WINDOW_KEY "/show_toolbar"
-#define MODEST_CONF_MSG_VIEW_WINDOW_SHOW_TOOLBAR MODEST_CONF_WIDGET_NAMESPACE "/" MODEST_CONF_MSG_VIEW_WINDOW_KEY "/show_toolbar"
-#define MODEST_CONF_MAIN_WINDOW_SHOW_TOOLBAR_FULLSCREEN MODEST_CONF_WIDGET_NAMESPACE "/" MODEST_CONF_MAIN_WINDOW_KEY "/show_toolbar_fullscreen"
-#define MODEST_CONF_EDIT_WINDOW_SHOW_TOOLBAR_FULLSCREEN MODEST_CONF_WIDGET_NAMESPACE "/" MODEST_CONF_EDIT_WINDOW_KEY "/show_toolbar_fullscreen"
-#define MODEST_CONF_MSG_VIEW_WINDOW_SHOW_TOOLBAR_FULLSCREEN MODEST_CONF_WIDGET_NAMESPACE "/" MODEST_CONF_MSG_VIEW_WINDOW_KEY "/show_toolbar_fullscreen"
+#define MODEST_CONF_MAIN_WINDOW_SHOW_TOOLBAR \
+       (modest_defs_namespace (MODEST_CONF_WIDGET_SUBNAMESPACE "/"     \
+                               MODEST_CONF_MAIN_WINDOW_KEY "/show_toolbar"))
+#define MODEST_CONF_EDIT_WINDOW_SHOW_TOOLBAR \
+       (modest_defs_namespace (MODEST_CONF_WIDGET_SUBNAMESPACE "/"     \
+                               MODEST_CONF_EDIT_WINDOW_KEY "/show_toolbar"))
+#define MODEST_CONF_MSG_VIEW_WINDOW_SHOW_TOOLBAR \
+       (modest_defs_namespace (MODEST_CONF_WIDGET_SUBNAMESPACE "/"     \
+                               MODEST_CONF_MSG_VIEW_WINDOW_KEY "/show_toolbar"))
+#define MODEST_CONF_MAIN_WINDOW_SHOW_TOOLBAR_FULLSCREEN \
+       (modest_defs_namespace (MODEST_CONF_WIDGET_SUBNAMESPACE "/"     \
+                               MODEST_CONF_MAIN_WINDOW_KEY "/show_toolbar_fullscreen"))
+#define MODEST_CONF_EDIT_WINDOW_SHOW_TOOLBAR_FULLSCREEN                        \
+       (modest_defs_namespace (MODEST_CONF_WIDGET_SUBNAMESPACE "/"     \
+                               MODEST_CONF_EDIT_WINDOW_KEY "/show_toolbar_fullscreen"))
+#define MODEST_CONF_MSG_VIEW_WINDOW_SHOW_TOOLBAR_FULLSCREEN            \
+       (modest_defs_namespace (MODEST_CONF_WIDGET_SUBNAMESPACE "/"     \
+                               MODEST_CONF_MSG_VIEW_WINDOW_KEY "/show_toolbar_fullscreen"))
 
 /* per-account data */
 #define MODEST_ACCOUNT_DISPLAY_NAME      "display_name"      /* string */
  * alernating between a connection name, followed by a corresponding server account name.
  * That's not pretty, but it's nicer than dealing with escaping of a = separator if 
  * putting them both in one string. */
-#define MODEST_CONF_CONNECTION_SPECIFIC_SMTP_LIST MODEST_CONF_NAMESPACE "/specific_smtp" /* one list used for all accounts. */
+#define MODEST_CONF_CONNECTION_SPECIFIC_SMTP_LIST \
+       (modest_defs_namespace ("/specific_smtp")) /* one list used for all accounts. */
 #define MODEST_ACCOUNT_USE_CONNECTION_SPECIFIC_SMTP  "use_specific_smtp" /* boolean */
 
 /* server account keys */
 #define MODEST_FILE_FORMAT_FORMATTED_TEXT 1
 
 /* Global settings */
-#define MODEST_CONF_AUTO_UPDATE MODEST_CONF_NAMESPACE "/auto_update" /* bool */
-#define MODEST_CONF_UPDATE_WHEN_CONNECTED_BY MODEST_CONF_NAMESPACE "/update_when_connected_by" /* int */
-#define MODEST_CONF_UPDATE_INTERVAL MODEST_CONF_NAMESPACE "/update_interval" /* int */
-#define MODEST_CONF_MSG_SIZE_LIMIT MODEST_CONF_NAMESPACE "/msg_size_limit" /* int */
-#define MODEST_CONF_PLAY_SOUND_MSG_ARRIVE MODEST_CONF_NAMESPACE "/play_sound_msg_arrive" /* bool */
-#define MODEST_CONF_PREFER_FORMATTED_TEXT MODEST_CONF_NAMESPACE "/prefer_formatted_text" /* bool */
-#define MODEST_CONF_REPLY_TYPE           MODEST_CONF_NAMESPACE "/reply_type"        /*  int  */
-#define MODEST_CONF_FORWARD_TYPE         MODEST_CONF_NAMESPACE "/forward_type"      /*  int  */
+#define MODEST_CONF_AUTO_UPDATE (modest_defs_namespace ("/auto_update")) /* bool */
+#define MODEST_CONF_UPDATE_WHEN_CONNECTED_BY (modest_defs_namespace ("/update_when_connected_by")) /* int */
+#define MODEST_CONF_UPDATE_INTERVAL (modest_defs_namespace ("/update_interval")) /* int */
+#define MODEST_CONF_MSG_SIZE_LIMIT (modest_defs_namespace ("/msg_size_limit")) /* int */
+#define MODEST_CONF_PLAY_SOUND_MSG_ARRIVE (modest_defs_namespace ("/play_sound_msg_arrive")) /* bool */
+#define MODEST_CONF_PREFER_FORMATTED_TEXT (modest_defs_namespace ("/prefer_formatted_text")) /* bool */
+#define MODEST_CONF_REPLY_TYPE           (modest_defs_namespace ("/reply_type"))        /*  int  */
+#define MODEST_CONF_FORWARD_TYPE         (modest_defs_namespace  ("/forward_type"))      /*  int  */
 
 /* hidden global settings */
-#define MODEST_CONF_FETCH_HTML_EXTERNAL_IMAGES MODEST_CONF_NAMESPACE "/fetch_external_images" /* bool */
+#define MODEST_CONF_FETCH_HTML_EXTERNAL_IMAGES (modest_defs_namespace ("/fetch_external_images")) /* bool */
 
 /* Notification ids */
-#define MODEST_CONF_NOTIFICATION_IDS MODEST_CONF_NAMESPACE "/notification_ids"      /* list of ints */
+#define MODEST_CONF_NOTIFICATION_IDS (modest_defs_namespace ("/notification_ids"))      /* list of ints */
 
 
 #define MODEST_EXAMPLE_EMAIL_ADDRESS "first.last@example.com"
index 2a08c90..45786a3 100644 (file)
@@ -46,8 +46,8 @@ END_TEST
 START_TEST (test_modest_conf_store_retrieve_string)
 {
        ModestConf *conf  = modest_conf_new ();
-       const gchar *key  =  MODEST_CONF_NAMESPACE "/teststring";
-       const gchar *key2 =  MODEST_CONF_NAMESPACE "/teststring2";
+       const gchar *key  =  modest_defs_namespace ("/teststring");
+       const gchar *key2 =  modest_defs_namespace ("/teststring2");
 
        const gchar *data = "hello in Korean:  안녕하세요";
        gchar *data2;
@@ -86,8 +86,8 @@ END_TEST
 START_TEST (test_modest_conf_store_retrieve_bool)
 {
        ModestConf *conf  = modest_conf_new ();
-       const gchar *key  =  MODEST_CONF_NAMESPACE "/teststring";
-       const gchar *key2 =  MODEST_CONF_NAMESPACE "/teststring2";
+       const gchar *key  =  modest_defs_namespace ("/teststring");
+       const gchar *key2 =  modest_defs_namespace ("/teststring2");
 
        gboolean data = TRUE, data2;
        
@@ -121,8 +121,8 @@ END_TEST
 START_TEST (test_modest_conf_store_retrieve_int)
 {
        ModestConf *conf  = modest_conf_new ();
-       const gchar *key  =  MODEST_CONF_NAMESPACE "/teststring";
-       const gchar *key2 =  MODEST_CONF_NAMESPACE "/teststring2";
+       const gchar *key  =  modest_defs_namespace ("/teststring");
+       const gchar *key2 =  modest_defs_namespace ("/teststring2");
 
        gint data = 99, data2;