2007-04-18 Murray Cumming <murrayc@murrayc.com>
[modest] / src / modest-account-mgr-helpers.c
index e719c72..49b02be 100644 (file)
@@ -37,20 +37,201 @@ gboolean
 modest_account_mgr_set_enabled (ModestAccountMgr *self, const gchar* name,
                                        gboolean enabled)
 {
-       return modest_account_mgr_set_bool (self, name,
-                                           MODEST_ACCOUNT_ENABLED, enabled,
-                                           FALSE, NULL);
+       return modest_account_mgr_set_bool (self, name, MODEST_ACCOUNT_ENABLED, enabled,FALSE);
 }
 
 
 gboolean
 modest_account_mgr_get_enabled (ModestAccountMgr *self, const gchar* name)
 {
-       return modest_account_mgr_get_bool (self, name,
-                                           MODEST_ACCOUNT_ENABLED, FALSE,
-                                           NULL);
+       return modest_account_mgr_get_bool (self, name, MODEST_ACCOUNT_ENABLED, FALSE);
 }
 
+static gint
+compare_option_strings_for_name (const gchar* a, const gchar* b)
+{
+       /* printf("  debug: compare_option_strings_for_name():a=%s, b=%s\n", a, b); */
+       const gchar* sep = strchr(a, '=');
+       if (!sep)
+               return -1;
+               
+       gint len = sep - a;
+       if(len <= 0)
+               return -1;
+               
+       /* Get the part of the string before the =.
+        * Note that this allocation is inefficient just so we can do a strcmp. */
+       gchar* name = g_malloc (len+1);
+       memcpy(name, a, len);
+       name[len] = 0; /* Null-termination. */
+       
+       /* printf("    debug: name=%s\n", name); */
+
+       gint result = strcmp (name, b);
+       
+       g_free (name);
+       
+       return result;
+}
+           
+gchar*
+modest_server_account_data_get_option_value (GSList* options_list, const gchar* option_name)
+{
+       if (!options_list)
+               return NULL;
+       
+       gchar *result = NULL;
+       GSList* option = g_slist_find_custom(options_list, option_name, (GCompareFunc)compare_option_strings_for_name);
+       if(option) {
+               /* Get the value part of the key=value pair: */
+               const gchar* pair = (const gchar*)option->data;
+               
+               const gchar* sep = strchr(pair, '=');
+               if (sep) {
+                       gint len = sep - pair;
+                       if(len > 0) {
+                               result = g_strdup(sep+1);
+                               
+                               /* Avoid returning an empty string instead of NULL. */
+                               if(result && strlen(result) == 0) {
+                                       g_free(result);
+                                       result = NULL;
+                               }
+                       }
+               }
+       }
+               
+       return result;
+}
+
+gboolean
+modest_server_account_data_get_option_bool (GSList* options_list, const gchar* option_name)
+{
+       if (!options_list)
+               return FALSE;
+       
+       gboolean result = FALSE;
+       GSList* option = g_slist_find_custom(options_list, option_name, (GCompareFunc)strcmp);
+       if(option) {
+               return TRUE;
+       }
+               
+       return result;
+}
+
+ModestProtocol
+modest_server_account_get_option_secure_auth (ModestAccountMgr *self, 
+       const gchar* account_name)
+{
+       ModestProtocol result = MODEST_PROTOCOL_AUTH_NONE;
+       gchar* value =modest_account_mgr_get_string (self, account_name, MODEST_ACCOUNT_AUTH_MECH, 
+               TRUE /* server account */);
+       if (value) {
+               if (strcmp(value, MODEST_ACCOUNT_AUTH_MECH_VALUE_NONE) == 0)
+                       result = MODEST_PROTOCOL_AUTH_NONE;
+               else if (strcmp(value, MODEST_ACCOUNT_AUTH_MECH_VALUE_PASSWORD) == 0)
+                       result = MODEST_PROTOCOL_AUTH_PASSWORD;
+               else if (strcmp(value, MODEST_ACCOUNT_AUTH_MECH_VALUE_CRAMMD5) == 0)
+                       result = MODEST_PROTOCOL_AUTH_CRAMMD5;
+                       
+               g_free (value);
+       }
+       
+       return result;
+}
+
+void
+modest_server_account_set_option_secure_auth (ModestAccountMgr *self, 
+       const gchar* account_name, ModestProtocol secure_auth)
+{
+       /* Get the conf string for the enum value: */
+       const gchar* str_value = NULL;
+       if (secure_auth == MODEST_PROTOCOL_AUTH_NONE)
+               str_value = MODEST_ACCOUNT_AUTH_MECH_VALUE_NONE;
+       else if (secure_auth == MODEST_PROTOCOL_AUTH_PASSWORD)
+               str_value = MODEST_ACCOUNT_AUTH_MECH_VALUE_PASSWORD;
+       else if (secure_auth == MODEST_PROTOCOL_AUTH_CRAMMD5)
+               str_value = MODEST_ACCOUNT_AUTH_MECH_VALUE_CRAMMD5;
+       
+       /* Set it in the configuration: */
+       modest_account_mgr_set_string (self, account_name, MODEST_ACCOUNT_AUTH_MECH, str_value, TRUE);
+}
+
+ModestProtocol
+modest_server_account_data_get_option_security (ModestServerAccountData *account_data)
+{
+       ModestProtocol result = MODEST_PROTOCOL_SECURITY_NONE;
+       gchar* value = modest_server_account_data_get_option_value (account_data->options, 
+               MODEST_ACCOUNT_OPTION_SECURITY);
+       if (value) {
+               if (strcmp(value, MODEST_ACCOUNT_OPTION_SECURITY_VALUE_NONE) == 0)
+                       result = MODEST_PROTOCOL_SECURITY_NONE;
+               else if (strcmp(value, MODEST_ACCOUNT_OPTION_SECURITY_VALUE_NORMAL) == 0)
+                       result = MODEST_PROTOCOL_SECURITY_TLS;
+               else if (strcmp(value, MODEST_ACCOUNT_OPTION_SECURITY_VALUE_SSL) == 0)
+                       result = MODEST_PROTOCOL_SECURITY_SSL;
+                       
+               g_free (value);
+       }
+       
+       return result;
+}
+
+void
+modest_server_account_set_option_security (ModestAccountMgr *self, 
+       const gchar* account_name, ModestProtocol security)
+{
+       GSList *options_list = modest_account_mgr_get_list (self, account_name, MODEST_ACCOUNT_OPTIONS,
+                                                    MODEST_CONF_VALUE_STRING, TRUE);
+
+       if(options_list) {
+               /* Remove the item if it exists already: */
+               GSList* option = NULL;
+               do {
+                       g_slist_find_custom(options_list, MODEST_ACCOUNT_OPTION_SECURITY, (GCompareFunc)compare_option_strings_for_name);
+                       if(option)
+                               options_list = g_slist_remove (options_list, option->data);
+               } while(option);
+       }
+               
+       /* Add the new item to the list: */
+       const gchar* str_value = NULL;
+       if (security == MODEST_PROTOCOL_SECURITY_NONE)
+               str_value = MODEST_ACCOUNT_OPTION_SECURITY_VALUE_NONE;
+       else if (security == MODEST_PROTOCOL_SECURITY_TLS)
+               str_value = MODEST_ACCOUNT_OPTION_SECURITY_VALUE_NORMAL;
+       else if (security == MODEST_PROTOCOL_SECURITY_SSL)
+               str_value = MODEST_ACCOUNT_OPTION_SECURITY_VALUE_SSL;
+       
+       if (str_value) {
+               gchar* pair = g_strdup_printf(MODEST_ACCOUNT_OPTION_SECURITY "=%s", str_value);
+               options_list = g_slist_append(options_list, pair);
+       }
+       
+       /* Set it in the configuration: */
+       modest_account_mgr_set_list (self, account_name, MODEST_ACCOUNT_OPTIONS, options_list,
+                                                    MODEST_CONF_VALUE_STRING, TRUE);
+       
+       /* TODO: Should we free the items too, or just the list? */
+       g_slist_free (options_list);
+}
+                                         
+gchar*
+modest_account_mgr_get_server_account_option (ModestAccountMgr *self, 
+       const gchar* account_name, const gchar* option_name)
+{
+       GSList *option_list = modest_account_mgr_get_list (self, account_name, MODEST_ACCOUNT_OPTIONS,
+                                                    MODEST_CONF_VALUE_STRING, TRUE);
+       if (!option_list)
+               return NULL;
+               
+       gchar *result = modest_server_account_data_get_option_value (option_list, option_name);
+       
+       /* TODO: Should we free the items too, or just the list? */
+       g_slist_free (option_list);
+               
+       return result;
+}
 
 static ModestServerAccountData*
 modest_account_mgr_get_server_account_data (ModestAccountMgr *self, const gchar* name)
@@ -58,39 +239,22 @@ modest_account_mgr_get_server_account_data (ModestAccountMgr *self, const gchar*
        ModestServerAccountData *data;
        gchar *proto;
        
-       g_return_val_if_fail (modest_account_mgr_account_exists (self, name,
-                                                                TRUE, NULL), NULL);    
+       g_return_val_if_fail (modest_account_mgr_account_exists (self, name, TRUE), NULL);      
        data = g_slice_new0 (ModestServerAccountData);
        
        data->account_name = g_strdup (name);
-       data->hostname     = modest_account_mgr_get_string (self, name,
-                                                           MODEST_ACCOUNT_HOSTNAME,
-                                                           TRUE, NULL);
-       data->username     = modest_account_mgr_get_string (self, name,
-                                                           MODEST_ACCOUNT_USERNAME,
-                                                           TRUE, NULL);
-       
-       proto        = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_PROTO,
-                                                     TRUE, NULL);
-       data->proto  = modest_protocol_info_get_protocol (proto);
+       data->hostname     = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_HOSTNAME,TRUE);
+       data->username     = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_USERNAME,TRUE);  
+       proto              = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_PROTO, TRUE);
+       data->proto        = modest_protocol_info_get_protocol (proto);
        g_free (proto);
 
-
-       data->last_updated = modest_account_mgr_get_int    (self, name,
-                                                           MODEST_ACCOUNT_LAST_UPDATED,
-                                                           TRUE, NULL);
+       data->last_updated = modest_account_mgr_get_int    (self, name, MODEST_ACCOUNT_LAST_UPDATED,TRUE);
        
-       data->password     = modest_account_mgr_get_string (self, name,
-                                                           MODEST_ACCOUNT_PASSWORD,
-                                                           TRUE, NULL);
-       
-       data->uri          = modest_account_mgr_get_string (self, name,
-                                                           MODEST_ACCOUNT_URI,
-                                                           TRUE, NULL);
-       data->options = modest_account_mgr_get_list (self, name,
-                                                    MODEST_ACCOUNT_OPTIONS,
-                                                    MODEST_CONF_VALUE_STRING,
-                                                    TRUE, NULL);
+       data->password     = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_PASSWORD, TRUE);
+       data->uri          = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_URI,TRUE);
+       data->options = modest_account_mgr_get_list (self, name, MODEST_ACCOUNT_OPTIONS,
+                                                    MODEST_CONF_VALUE_STRING, TRUE);
        return data;
 }
 
@@ -128,6 +292,8 @@ modest_account_mgr_free_server_account_data (ModestAccountMgr *self,
        g_slice_free (ModestServerAccountData, data);
 }
 
+/** You must use modest_account_mgr_free_account_data() on the result.
+ */
 ModestAccountData*
 modest_account_mgr_get_account_data     (ModestAccountMgr *self, const gchar* name)
 {
@@ -137,21 +303,20 @@ modest_account_mgr_get_account_data     (ModestAccountMgr *self, const gchar* na
        
        g_return_val_if_fail (self, NULL);
        g_return_val_if_fail (name, NULL);
-       g_return_val_if_fail (modest_account_mgr_account_exists (self, name,
-                                                                FALSE, NULL), NULL);   
+       g_return_val_if_fail (modest_account_mgr_account_exists (self, name,FALSE), NULL);      
        data = g_slice_new0 (ModestAccountData);
-
+       
        data->account_name = g_strdup (name);
 
        data->display_name = modest_account_mgr_get_string (self, name,
                                                            MODEST_ACCOUNT_DISPLAY_NAME,
-                                                           FALSE, NULL);
+                                                           FALSE);
        data->fullname     = modest_account_mgr_get_string (self, name,
                                                              MODEST_ACCOUNT_FULLNAME,
-                                                              FALSE, NULL);
+                                                              FALSE);
        data->email        = modest_account_mgr_get_string (self, name,
                                                            MODEST_ACCOUNT_EMAIL,
-                                                           FALSE, NULL);
+                                                           FALSE);
        data->is_enabled   = modest_account_mgr_get_enabled (self, name);
 
        default_account    = modest_account_mgr_get_default_account (self);
@@ -161,22 +326,20 @@ modest_account_mgr_get_account_data     (ModestAccountMgr *self, const gchar* na
        /* store */
        server_account     = modest_account_mgr_get_string (self, name,
                                                            MODEST_ACCOUNT_STORE_ACCOUNT,
-                                                           FALSE, NULL);
+                                                           FALSE);
        if (server_account) {
                data->store_account =
-                       modest_account_mgr_get_server_account_data (self,
-                                                                   server_account);
+                       modest_account_mgr_get_server_account_data (self, server_account);
                g_free (server_account);
        }
 
        /* transport */
        server_account = modest_account_mgr_get_string (self, name,
                                                        MODEST_ACCOUNT_TRANSPORT_ACCOUNT,
-                                                       FALSE, NULL);
+                                                       FALSE);
        if (server_account) {
                data->transport_account =
-                       modest_account_mgr_get_server_account_data (self,
-                                                                   server_account);
+                       modest_account_mgr_get_server_account_data (self, server_account);
                g_free (server_account);
        }
 
@@ -209,19 +372,27 @@ modest_account_mgr_get_default_account  (ModestAccountMgr *self)
 {
        gchar *account; 
        ModestConf *conf;
+       GError *err = NULL;
        
        g_return_val_if_fail (self, NULL);
 
        conf = MODEST_ACCOUNT_MGR_GET_PRIVATE (self)->modest_conf;
-       account = modest_conf_get_string (conf, MODEST_CONF_DEFAULT_ACCOUNT,
-                                         NULL);
+       account = modest_conf_get_string (conf, MODEST_CONF_DEFAULT_ACCOUNT, &err);
+       
+       if (err) {
+               g_printerr ("modest: failed to get '%s': %s\n",
+                           MODEST_CONF_DEFAULT_ACCOUNT, err->message);
+               g_error_free (err);
+               g_free (account);
+               return  NULL;
+       }
        
        /* it's not really an error if there is no default account */
        if (!account) 
                return NULL;
 
        /* sanity check */
-       if (!modest_account_mgr_account_exists (self, account, FALSE, NULL)) {
+       if (!modest_account_mgr_account_exists (self, account, FALSE)) {
                g_printerr ("modest: default account does not exist\n");
                g_free (account);
                return NULL;
@@ -238,7 +409,7 @@ modest_account_mgr_set_default_account  (ModestAccountMgr *self, const gchar* ac
        
        g_return_val_if_fail (self,    FALSE);
        g_return_val_if_fail (account, FALSE);
-       g_return_val_if_fail (modest_account_mgr_account_exists (self, account, FALSE, NULL),
+       g_return_val_if_fail (modest_account_mgr_account_exists (self, account, FALSE),
                              FALSE);
        
        conf = MODEST_ACCOUNT_MGR_GET_PRIVATE (self)->modest_conf;
@@ -248,68 +419,6 @@ modest_account_mgr_set_default_account  (ModestAccountMgr *self, const gchar* ac
 
 }
 
-
-TnyAccount*
-modest_account_mgr_get_tny_account (ModestAccountMgr *self, const gchar* account_name,
-                                       TnyAccountType type)
-{
-       TnyAccount      *account = NULL;
-       TnyList         *accounts;
-       TnyIterator     *iter;
-       gchar           *server_account;
-       const gchar     *conf_key;
-       
-       g_return_val_if_fail (self, NULL);
-       g_return_val_if_fail (account_name, NULL);
-
-       switch (type) {
-       case TNY_ACCOUNT_TYPE_STORE:
-               conf_key = MODEST_ACCOUNT_STORE_ACCOUNT; break;
-       case TNY_ACCOUNT_TYPE_TRANSPORT:
-               conf_key = MODEST_ACCOUNT_TRANSPORT_ACCOUNT; break;
-       default:
-               g_return_val_if_reached (NULL);
-       }
-       
-       server_account = modest_account_mgr_get_string (self, account_name, conf_key, FALSE, NULL);
-       if (!server_account) {
-               g_printerr ("modest: no %s account specified for %s\n",
-                           type == TNY_ACCOUNT_TYPE_TRANSPORT ? "transport" : "store", account_name);
-               return NULL;
-       }
-       
-       accounts = tny_simple_list_new ();
-       tny_account_store_get_accounts (TNY_ACCOUNT_STORE(modest_runtime_get_account_store()),
-                                       accounts, type);        
-       iter = tny_list_create_iterator (accounts);     
-       while (tny_iterator_is_done (iter)) {
-               account = TNY_ACCOUNT(tny_iterator_get_current(iter));
-               if (strcmp (tny_account_get_id (account), server_account) == 0)
-                       break;
-               g_object_unref (G_OBJECT(account));
-       }
-       
-       g_object_unref (G_OBJECT(iter));
-       g_object_unref (G_OBJECT(accounts));
-       
-       if (!account)
-               g_printerr ("modest: no tny %s account found for %s\n",
-                           type == TNY_ACCOUNT_TYPE_TRANSPORT ? "transport" : "store", account_name);
-       else {
-               /* sanity check */
-               if ((type == TNY_ACCOUNT_TYPE_TRANSPORT && !TNY_IS_TRANSPORT_ACCOUNT(account)) ||
-                   (type == TNY_ACCOUNT_TYPE_STORE && !TNY_IS_STORE_ACCOUNT(account))) {
-                       g_printerr ("modest: tny %s acccount found for %s, but was expecting %s account\n",
-                                   type == TNY_ACCOUNT_TYPE_TRANSPORT ? "transport" : "store", account_name,
-                                   type == TNY_ACCOUNT_TYPE_TRANSPORT ? "store" : "transport");
-                       g_object_unref (G_OBJECT(account));
-                       account = NULL;
-               }
-       }
-       return account;
-}
-
-
 gchar*
 modest_account_mgr_get_from_string (ModestAccountMgr *self, const gchar* name)
 {
@@ -319,9 +428,9 @@ modest_account_mgr_get_from_string (ModestAccountMgr *self, const gchar* name)
        g_return_val_if_fail (name, NULL);
 
        fullname      = modest_account_mgr_get_string (self, name,MODEST_ACCOUNT_FULLNAME,
-                                                      FALSE, NULL);
+                                                      FALSE);
        email         = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_EMAIL,
-                                                      FALSE, NULL);
+                                                      FALSE);
        from = g_strdup_printf ("%s <%s>",
                                fullname ? fullname : "",
                                email    ? email    : "");