* Add basic message flags support, still looks ugly.
[modest] / src / modest-account-mgr.c
index d77633c..a6b82a4 100644 (file)
@@ -11,6 +11,7 @@ static void    modest_account_mgr_init          (ModestAccountMgr *obj);
 static void    modest_account_mgr_finalize      (GObject *obj);
 
 static gchar*   get_account_keyname (const gchar *accname, const gchar *name);
+static gchar*   get_server_account_keyname (const gchar *accname, const gchar *name);
 
 /* list my signals */
 enum {
@@ -80,7 +81,7 @@ static void
 modest_account_mgr_init (ModestAccountMgr *obj)
 {
        ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(obj);
-       priv->modest_conf = NULL;       
+       priv->modest_conf = NULL;
 }
 
 static void
@@ -98,7 +99,7 @@ modest_account_mgr_new (ModestConf *conf)
 {
        GObject *obj;
        ModestAccountMgrPrivate *priv;
-       
+
        g_return_val_if_fail (conf, NULL);
 
        obj  = G_OBJECT(g_object_new(MODEST_TYPE_ACCOUNT_MGR, NULL));
@@ -123,21 +124,21 @@ modest_account_mgr_add_account (ModestAccountMgr *self, const gchar* name,
        ModestAccountMgrPrivate *priv;
        gchar *key;
        gboolean retval;
-       
+
        g_return_val_if_fail (self, FALSE);
        g_return_val_if_fail (name, FALSE);
 
        if (modest_account_mgr_account_exists (self, name, err)) {
                g_warning ("account already exists");
                //return FALSE;
-       }       
+       }
        /*
         * we create the account by adding an account 'dir', with the name <name>,
         * and in that the 'display_name' string key
         */
        priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
 
-       key = get_account_keyname (name, MODEST_ACCOUNT_DISPLAY_NAME);  
+       key = get_account_keyname (name, MODEST_ACCOUNT_DISPLAY_NAME);
        modest_conf_set_string (priv->modest_conf, key, name, err);
        g_free (key);
 
@@ -152,11 +153,11 @@ modest_account_mgr_add_account (ModestAccountMgr *self, const gchar* name,
                modest_conf_set_string (priv->modest_conf, key, transport_account, err);
                g_free (key);
        }
-       
+
        return TRUE; /* TODO: error handling */
 }
 
-       
+
 gboolean
 modest_account_mgr_remove_account (ModestAccountMgr *self, const gchar* name,
                           GError **err)
@@ -164,7 +165,7 @@ modest_account_mgr_remove_account (ModestAccountMgr *self, const gchar* name,
        ModestAccountMgrPrivate *priv;
        gchar *key;
        gboolean retval;
-       
+
        g_return_val_if_fail (self, FALSE);
        g_return_val_if_fail (name, FALSE);
 
@@ -172,11 +173,11 @@ modest_account_mgr_remove_account (ModestAccountMgr *self, const gchar* name,
                g_warning ("account doest not exist");
                return FALSE;
        }
-       
-       priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);    
+
+       priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
        key = get_account_keyname (name, NULL);
-       
-       retval = modest_conf_remove_key (priv->modest_conf, key, NULL); 
+
+       retval = modest_conf_remove_key (priv->modest_conf, key, NULL);
 
        g_free (key);
        return retval;
@@ -200,16 +201,16 @@ modest_account_mgr_add_server_account    (ModestAccountMgr *self,
 {
        ModestAccountMgrPrivate *priv;
        gchar *acckey, *key;
-       
+
        g_return_val_if_fail (self, FALSE);
        g_return_val_if_fail (name, FALSE);
 
        /* TODO: check already exists */
-       
-       priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);    
+
+       priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
        acckey = g_strconcat (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
                              name, NULL);
-       
+
        if (modest_conf_key_exists(priv->modest_conf, acckey, NULL)) {
                g_warning ("server account %s already exists", name);
                g_free (acckey);
@@ -221,7 +222,7 @@ modest_account_mgr_add_server_account    (ModestAccountMgr *self,
        modest_conf_set_string (priv->modest_conf, key,
                                null_means_empty(hostname), NULL);
        g_free (key);
-       
+
        /* username */
        key = g_strconcat (acckey, "/", MODEST_ACCOUNT_USERNAME, NULL);
        modest_conf_set_string (priv->modest_conf, key,
@@ -229,11 +230,14 @@ modest_account_mgr_add_server_account    (ModestAccountMgr *self,
        g_free (key);
 
        /* password */
-       key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PASSWORD, NULL);
-       modest_conf_set_string (priv->modest_conf, key,
-                               null_means_empty(password), NULL);
-       g_free (key);
-       
+        if (password)
+        {
+                key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PASSWORD, NULL);
+                modest_conf_set_string (priv->modest_conf, key,
+                                        null_means_empty(password), NULL);
+                g_free (key);
+        }
+
        /* proto */
        key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PROTO, NULL);
        modest_conf_set_string (priv->modest_conf, key,
@@ -252,28 +256,45 @@ modest_account_mgr_remove_server_account    (ModestAccountMgr *self,
        ModestAccountMgrPrivate *priv;
        gchar *acckey, *key;
        gboolean retval;
-       
+
        g_return_val_if_fail (self, FALSE);
        g_return_val_if_fail (name, FALSE);
 
        priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
-       
+
        acckey = g_strconcat (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
                              name, NULL);
-       
+
        if (!modest_conf_key_exists(priv->modest_conf, acckey, NULL)) {
                g_warning ("server account %s does not exist exist", name);
                g_free (acckey);
                return FALSE;
        }
-       
+
        retval = modest_conf_remove_key (priv->modest_conf, acckey, NULL);
        g_free (acckey);
-       
+
        return retval;
 }
 
 
+/* strip the first /n/ character from each element */
+/* caller must make sure all elements are strings with
+ * length >= n, and also that data can be freed.
+ */
+static GSList*
+strip_prefix_from_elements (GSList *lst, guint n)
+{
+       GSList *cursor = lst;
+       while (cursor) {
+               gchar *str = (gchar*)cursor->data;
+               cursor->data = g_strdup (str + n);
+               g_free (str);
+               cursor = cursor->next;
+       }
+       return lst;
+}
+
 
 
 GSList*
@@ -286,9 +307,11 @@ modest_account_mgr_server_account_names   (ModestAccountMgr *self,
        GSList *accounts;
        GSList *cursor;
        ModestAccountMgrPrivate *priv;
-       
+       const size_t prefix_len =
+               strlen (MODEST_SERVER_ACCOUNT_NAMESPACE "/");
+
        g_return_val_if_fail (self, NULL);
-       
+
        priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
        accounts = modest_conf_list_subkeys (priv->modest_conf,
                                             MODEST_SERVER_ACCOUNT_NAMESPACE,
@@ -296,19 +319,19 @@ modest_account_mgr_server_account_names   (ModestAccountMgr *self,
 
        /* no restrictions, return everything */
        if (type == MODEST_PROTO_TYPE_ANY && !proto)
-               return accounts;
+               return strip_prefix_from_elements (accounts,prefix_len);
 
        /* otherwise, filter out the none-matching ones */
        cursor = accounts;
        while (cursor) {
                gchar *keyspace, *proto_key, *acc_proto;
-       
+
                keyspace  = (gchar*) cursor->data;
                proto_key = g_strconcat (keyspace, "/", MODEST_ACCOUNT_PROTO, NULL);
                acc_proto = modest_conf_get_string (priv->modest_conf, proto_key,
                                                    NULL);
                g_free (proto_key);
-               
+
                if ((!acc_proto) ||                              /* proto not defined? */
                    (type != MODEST_PROTO_TYPE_ANY &&            /* proto type ...     */
                     modest_proto_type (acc_proto) != type) ||   /* ... matches?       */
@@ -318,11 +341,11 @@ modest_account_mgr_server_account_names   (ModestAccountMgr *self,
                        g_free (acc_proto);
                        accounts = g_slist_delete_link (accounts, cursor);
                        cursor = nxt;
-               } else 
-                       cursor = cursor->next;  
+               } else
+                       cursor = cursor->next;
        }
-       
-       return accounts;
+
+       return strip_prefix_from_elements (accounts, prefix_len);
 }
 
 
@@ -332,49 +355,70 @@ modest_account_mgr_account_names  (ModestAccountMgr *self, GError **err)
 {
        GSList *accounts, *cursor;
        ModestAccountMgrPrivate *priv;
-       
+       const size_t prefix_len =
+               strlen (MODEST_ACCOUNT_NAMESPACE "/");
+
+
        g_return_val_if_fail (self, NULL);
-       
+
        priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
 
-       return  modest_conf_list_subkeys (priv->modest_conf,
-                                         MODEST_ACCOUNT_NAMESPACE,
-                                         err);
+       accounts = modest_conf_list_subkeys (priv->modest_conf,
+                                            MODEST_ACCOUNT_NAMESPACE,
+                                            err);
+       return strip_prefix_from_elements (accounts, prefix_len);
 }
 
 
-gchar*
-modest_account_mgr_get_account_string (ModestAccountMgr *self, const gchar *name,
-                                      const gchar *key, GError **err)
+
+static gchar*
+get_account_string (ModestAccountMgr *self, const gchar *name,
+                   const gchar *key, gboolean server_account,
+                   GError **err)
 {
        ModestAccountMgrPrivate *priv;
 
        gchar *keyname;
-       gchar *retval;
+       gchar * retval;
 
        g_return_val_if_fail (self, NULL);
        g_return_val_if_fail (name, NULL);
        g_return_val_if_fail (key, NULL);
 
-       keyname = get_account_keyname (name, key);
+       if (server_account)
+               keyname = get_server_account_keyname (name, key);
+       else
+               keyname = get_account_keyname (name, key);
 
-       g_warning ("===> %s", keyname);
-       
        priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
-       
-       retval = modest_conf_get_string (priv->modest_conf,
-                                        keyname, err);
-       
+       retval = modest_conf_get_string (priv->modest_conf,keyname,err);
        g_free (keyname);
+
        return retval;
 }
 
 
+gchar*
+modest_account_mgr_get_server_account_string (ModestAccountMgr *self, const gchar *name,
+                                          const gchar *key, GError **err)
+{
+       return get_account_string (self, name, key, TRUE, err);
+}
 
-gint
-modest_account_mgr_get_account_int (ModestAccountMgr *self, const gchar *name,
+gchar*
+modest_account_mgr_get_account_string (ModestAccountMgr *self, const gchar *name,
                                    const gchar *key, GError **err)
 {
+       return get_account_string (self, name, key, FALSE, err);
+}
+
+
+
+static gint
+get_account_int (ModestAccountMgr *self, const gchar *name,
+                const gchar *key, gboolean server_account,
+                GError **err)
+{
        ModestAccountMgrPrivate *priv;
 
        gchar *keyname;
@@ -384,41 +428,85 @@ modest_account_mgr_get_account_int (ModestAccountMgr *self, const gchar *name,
        g_return_val_if_fail (name, -1);
        g_return_val_if_fail (key, -1);
 
-       keyname = get_account_keyname (name, key);
+       if (server_account)
+               keyname = get_server_account_keyname (name, key);
+       else
+               keyname = get_account_keyname (name, key);
+
        priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
        retval = modest_conf_get_int (priv->modest_conf,keyname,err);
-
        g_free (keyname);
+
        return retval;
 }
 
-       
-gboolean modest_account_mgr_get_account_bool (ModestAccountMgr *self, const gchar *name,
-                                             const gchar *key, GError **err)
+
+gint
+modest_account_mgr_get_server_account_int (ModestAccountMgr *self, const gchar *name,
+                                          const gchar *key, GError **err)
+{
+       return get_account_int (self, name, key, TRUE, err);
+}
+
+gint
+modest_account_mgr_get_account_int (ModestAccountMgr *self, const gchar *name,
+                                   const gchar *key, GError **err)
+{
+       return get_account_int (self, name, key, FALSE, err);
+}
+
+
+
+static gboolean
+get_account_bool (ModestAccountMgr *self, const gchar *name,
+                 const gchar *key, gboolean server_account,
+                 GError **err)
 {
        ModestAccountMgrPrivate *priv;
 
        gchar *keyname;
        gboolean retval;
 
-       g_return_val_if_fail (self, FALSE);
-       g_return_val_if_fail (name, FALSE);
-       g_return_val_if_fail (key, FALSE);
+       g_return_val_if_fail (self, -1);
+       g_return_val_if_fail (name, -1);
+       g_return_val_if_fail (key, -1);
 
-       keyname = get_account_keyname (name, key);
-       priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
-       retval = modest_conf_get_bool (priv->modest_conf,keyname,err);
+       if (server_account)
+               keyname = get_server_account_keyname (name, key);
+       else
+               keyname = get_account_keyname (name, key);
 
+       priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
+       retval = modest_conf_get_int (priv->modest_conf,keyname,err);
        g_free (keyname);
+
        return retval;
 }
-       
 
 
-gboolean
-modest_account_mgr_set_account_string  (ModestAccountMgr *self, const gchar *name,
-                                       const gchar *key, const gchar* val,
-                                       GError **err)
+
+gint
+modest_account_mgr_get_server_account_bool (ModestAccountMgr *self, const gchar *name,
+                                          const gchar *key, GError **err)
+{
+       return get_account_bool (self, name, key, TRUE, err);
+}
+
+gint
+modest_account_mgr_get_account_bool (ModestAccountMgr *self, const gchar *name,
+                                   const gchar *key, GError **err)
+{
+       return get_account_bool (self, name, key, FALSE, err);
+}
+
+
+
+
+
+static gboolean
+set_account_string  (ModestAccountMgr *self, const gchar *name,
+                    const gchar *key, const gchar* val, gboolean server_account,
+                    GError **err)
 {
        ModestAccountMgrPrivate *priv;
 
@@ -429,8 +517,13 @@ modest_account_mgr_set_account_string  (ModestAccountMgr *self, const gchar *nam
        g_return_val_if_fail (name, FALSE);
        g_return_val_if_fail (key, FALSE);
 
-       keyname = get_account_keyname (name, key);
+       if (server_account)
+               keyname = get_server_account_keyname (name, key);
+       else
+               keyname = get_account_keyname (name, key);
+
        priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
+
        retval = modest_conf_set_string (priv->modest_conf,keyname,val,err);
 
        g_free (keyname);
@@ -439,21 +532,48 @@ modest_account_mgr_set_account_string  (ModestAccountMgr *self, const gchar *nam
 
 
 
+
+
 gboolean
-modest_account_mgr_set_account_int  (ModestAccountMgr *self, const gchar *name,
-                                    const gchar *key, gint val, GError **err)
+modest_account_mgr_set_server_account_string  (ModestAccountMgr *self, const gchar *name,
+                                              const gchar *key, const gchar* val,
+                                              GError **err)
+{
+       return set_account_string (self, name, key, val, TRUE, err);
+}
+
+
+
+gboolean
+modest_account_mgr_set_account_string  (ModestAccountMgr *self, const gchar *name,
+                                       const gchar *key, const gchar* val,
+                                       GError **err)
+{
+       return set_account_string (self, name, key, val, FALSE, err);
+}
+
+
+static gboolean
+set_account_int  (ModestAccountMgr *self, const gchar *name,
+                 const gchar *key, gboolean server_account, int val,
+                 GError **err)
 {
        ModestAccountMgrPrivate *priv;
-       
+
        gchar *keyname;
        gboolean retval;
 
-       g_return_val_if_fail (self, -1);
-       g_return_val_if_fail (name, -1);
-       g_return_val_if_fail (key, -1);
+       g_return_val_if_fail (self, FALSE);
+       g_return_val_if_fail (name, FALSE);
+       g_return_val_if_fail (key, FALSE);
+
+       if (server_account)
+               keyname = get_server_account_keyname (name, key);
+       else
+               keyname = get_account_keyname (name, key);
 
-       keyname = get_account_keyname (name, key);
        priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
+
        retval = modest_conf_set_int (priv->modest_conf,keyname,val,err);
 
        g_free (keyname);
@@ -462,13 +582,33 @@ modest_account_mgr_set_account_int  (ModestAccountMgr *self, const gchar *name,
 
 
 
+gboolean
+modest_account_mgr_set_server_account_int (ModestAccountMgr *self, const gchar *name,
+                                          const gchar *key, int val,
+                                          GError **err)
+{
+       return set_account_int (self, name, key, val, TRUE, err);
+}
+
 
 gboolean
-modest_account_mgr_set_account_bool  (ModestAccountMgr *self, const gchar *name,
-                                     const gchar *key, gboolean val, GError **err)
+modest_account_mgr_set_account_int  (ModestAccountMgr *self, const gchar *name,
+                                    const gchar *key, int val,
+                                    GError **err)
+{
+       return set_account_int (self, name, key, val, FALSE, err);
+}
+
+
+
+
+static gboolean
+set_account_bool  (ModestAccountMgr *self, const gchar *name,
+                  const gchar *key, gboolean server_account, gboolean val,
+                  GError **err)
 {
        ModestAccountMgrPrivate *priv;
-       
+
        gchar *keyname;
        gboolean retval;
 
@@ -476,8 +616,13 @@ modest_account_mgr_set_account_bool  (ModestAccountMgr *self, const gchar *name,
        g_return_val_if_fail (name, FALSE);
        g_return_val_if_fail (key, FALSE);
 
-       keyname = get_account_keyname (name, key);
+       if (server_account)
+               keyname = get_server_account_keyname (name, key);
+       else
+               keyname = get_account_keyname (name, key);
+
        priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
+
        retval = modest_conf_set_bool (priv->modest_conf,keyname,val,err);
 
        g_free (keyname);
@@ -486,19 +631,44 @@ modest_account_mgr_set_account_bool  (ModestAccountMgr *self, const gchar *name,
 
 
 gboolean
-modest_account_mgr_account_exists (ModestAccountMgr *self, const gchar *name,
-                                  GError **err)
+modest_account_mgr_set_server_account_bool  (ModestAccountMgr *self, const gchar *name,
+                                            const gchar *key, gboolean val,
+                                            GError **err)
+{
+       return set_account_bool (self, name, key, val, TRUE, err);
+}
+
+
+
+gboolean
+modest_account_mgr_set_account_bool  (ModestAccountMgr *self, const gchar *name,
+                                       const gchar *key, gboolean val,
+                                       GError **err)
+{
+       return set_account_bool (self, name, key, val, FALSE, err);
+}
+
+
+
+
+
+gboolean
+account_exists (ModestAccountMgr *self, const gchar *name, gboolean server_account,
+               GError **err)
 {
        ModestAccountMgrPrivate *priv;
-       
+
        gchar *keyname;
        gboolean retval;
 
        g_return_val_if_fail (self, FALSE);
        g_return_val_if_fail (name, FALSE);
-       
-       keyname = get_account_keyname (name, NULL);
-       
+
+       if (server_account)
+               keyname = get_account_keyname (name, NULL);
+       else
+               keyname = get_server_account_keyname (name, NULL);
+
        priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
        retval = modest_conf_key_exists (priv->modest_conf,keyname,err);
 
@@ -507,6 +677,23 @@ modest_account_mgr_account_exists (ModestAccountMgr *self, const gchar *name,
 }
 
 
+gboolean
+modest_account_mgr_server_account_exists (ModestAccountMgr *self, const gchar *name,
+                                  GError **err)
+{
+       return account_exists (self, name, TRUE, err);
+}
+
+
+
+gboolean
+modest_account_mgr_account_exists (ModestAccountMgr *self, const gchar *name,
+                                  GError **err)
+{
+       return account_exists (self, name, FALSE, err);
+}
+
+
 
 /* must be freed by caller */
 static gchar*
@@ -514,9 +701,25 @@ get_account_keyname (const gchar *accname, const gchar *name)
 {
        if (name)
                return g_strconcat
-                       (accname, "/", name, NULL);
+                        (MODEST_ACCOUNT_NAMESPACE, "/",
+                         accname, "/", name, NULL);
        else
-               return g_strconcat
-                       (accname, NULL);
+                return g_strconcat
+                        (MODEST_ACCOUNT_NAMESPACE, "/",
+                         accname, NULL);
 }
 
+
+/* must be freed by caller */
+static gchar*
+get_server_account_keyname (const gchar *accname, const gchar *name)
+{
+       if (name)
+               return g_strconcat
+                       (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
+                        accname, "/", name, NULL);
+       else
+               return g_strconcat
+                       (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
+                        accname, NULL);
+}