X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-account-mgr.c;h=7f0ee82c97ae6ec284bfd09ed7c5ca437010f080;hp=b1dd0d4cfa7e4625bc2d34eb57831efd84c25197;hb=c87b080ad757bc0b4264453362533aacfabc3ed5;hpb=cf91ea78db899fb9c9327f9fdba81fa7f1f899d0 diff --git a/src/modest-account-mgr.c b/src/modest-account-mgr.c index b1dd0d4..7f0ee82 100644 --- a/src/modest-account-mgr.c +++ b/src/modest-account-mgr.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -218,9 +219,8 @@ modest_account_mgr_finalize (GObject * obj) MODEST_ACCOUNT_MGR_GET_PRIVATE (obj); if (priv->notification_id_accounts) { - /* TODO: forget dirs */ - g_hash_table_destroy (priv->notification_id_accounts); + priv->notification_id_accounts = NULL; } if (priv->modest_conf) { @@ -242,6 +242,12 @@ modest_account_mgr_finalize (GObject * obj) priv->account_key_hash = NULL; } + if (priv->busy_accounts) { + g_slist_foreach (priv->busy_accounts, (GFunc) g_free, NULL); + g_slist_free (priv->busy_accounts); + priv->busy_accounts = NULL; + } + G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -292,7 +298,7 @@ modest_account_mgr_add_account_from_settings (ModestAccountMgr *self, * but let's check again just in case */ if (!display_name || modest_account_mgr_account_with_display_name_exists (self, display_name)) { - return FALSE; + display_name = _("mcen_ia_emailsetup_defaultname"); } /* Increment the non-user visible name if necessary, @@ -472,19 +478,21 @@ modest_account_mgr_add_server_account (ModestAccountMgr * self, guint portnumber, const gchar *username, const gchar *password, - ModestTransportStoreProtocol proto, - ModestConnectionProtocol security, - ModestAuthProtocol auth) + ModestProtocolType proto, + ModestProtocolType security, + ModestProtocolType auth) { ModestAccountMgrPrivate *priv; const gchar *key; gboolean ok = TRUE; GError *err = NULL; + ModestProtocolRegistry *protocol_registry; g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE); g_return_val_if_fail (name, FALSE); g_return_val_if_fail (strchr(name, '/') == NULL, FALSE); - + + protocol_registry = modest_runtime_get_protocol_registry (); priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self); /* hostname */ @@ -531,7 +539,7 @@ modest_account_mgr_add_server_account (ModestAccountMgr * self, /* proto */ key = _modest_account_mgr_get_account_keyname_cached (priv, name, MODEST_ACCOUNT_PROTO, TRUE); ok = modest_conf_set_string (priv->modest_conf, key, - modest_protocol_info_get_transport_store_protocol_name(proto), + modest_protocol_get_name (modest_protocol_registry_get_protocol_by_type (protocol_registry, proto)), &err); if (err) { g_printerr ("modest: failed to set %s: %s\n", key, err->message); @@ -557,7 +565,7 @@ modest_account_mgr_add_server_account (ModestAccountMgr * self, /* auth mechanism */ key = _modest_account_mgr_get_account_keyname_cached (priv, name, MODEST_ACCOUNT_AUTH_MECH, TRUE); ok = modest_conf_set_string (priv->modest_conf, key, - modest_protocol_info_get_auth_protocol_name (auth), + modest_protocol_get_name (modest_protocol_registry_get_protocol_by_type (protocol_registry, auth)), &err); if (err) { g_printerr ("modest: failed to set %s: %s\n", key, err->message); @@ -585,12 +593,13 @@ cleanup: gboolean modest_account_mgr_add_server_account_uri (ModestAccountMgr * self, const gchar *name, - ModestTransportStoreProtocol proto, + ModestProtocolType proto, const gchar *uri) { ModestAccountMgrPrivate *priv; const gchar *key; gboolean ok; + ModestProtocolRegistry *protocol_registry; g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE); g_return_val_if_fail (name, FALSE); @@ -598,11 +607,12 @@ modest_account_mgr_add_server_account_uri (ModestAccountMgr * self, g_return_val_if_fail (uri, FALSE); priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self); + protocol_registry = modest_runtime_get_protocol_registry (); /* proto */ key = _modest_account_mgr_get_account_keyname_cached (priv, name, MODEST_ACCOUNT_PROTO, TRUE); ok = modest_conf_set_string (priv->modest_conf, key, - modest_protocol_info_get_transport_store_protocol_name(proto), + modest_protocol_get_name (modest_protocol_registry_get_protocol_by_type (protocol_registry, proto)), NULL); if (!ok) { @@ -711,6 +721,26 @@ modest_account_mgr_remove_account (ModestAccountMgr * self, return TRUE; } +gboolean +modest_account_mgr_remove_server_account (ModestAccountMgr * self, + const gchar* name) +{ + ModestAccountMgrPrivate *priv; + + g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE); + g_return_val_if_fail (name, FALSE); + + if (!modest_account_mgr_account_exists (self, name, TRUE)) { + g_printerr ("modest: %s: server account '%s' does not exist\n", __FUNCTION__, name); + return FALSE; + } + + priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self); + real_remove_account (priv->modest_conf, name, TRUE); + + return TRUE; +} + /* strip the first /n/ character from each element @@ -736,7 +766,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); @@ -758,9 +789,11 @@ modest_account_mgr_account_names (ModestAccountMgr * self, gboolean only_enabled /* Unescape the keys to get the account names: */ GSList *iter = accounts; while (iter) { - if (!(iter->data)) + if (!(iter->data)) { + iter = iter->next; continue; - + } + const gchar* account_name_key = (const gchar*)iter->data; gchar* unescaped_name = account_name_key ? modest_conf_key_unescape (account_name_key) @@ -926,7 +959,7 @@ modest_account_mgr_get_list (ModestAccountMgr *self, const gchar *name, const gchar *key, ModestConfValueType list_type, gboolean server_account) { - ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self); + ModestAccountMgrPrivate *priv = NULL; const gchar *keyname; GSList *retval; @@ -946,7 +979,7 @@ modest_account_mgr_get_list (ModestAccountMgr *self, const gchar *name, g_printerr ("modest: error getting list '%s': %s\n", keyname, err->message); g_error_free (err); - retval = FALSE; + retval = NULL; } return retval; } @@ -1122,6 +1155,7 @@ modest_account_mgr_account_with_display_name_exists (ModestAccountMgr *self, ModestAccountSettings *settings = modest_account_mgr_load_account_settings (self, account_name); if (!settings) { g_printerr ("modest: failed to get account data for %s\n", account_name); + cursor = cursor->next; continue; } @@ -1141,6 +1175,89 @@ modest_account_mgr_account_with_display_name_exists (ModestAccountMgr *self, return found; } +static gboolean +server_accounts_equal (ModestServerAccountSettings *s1, + ModestServerAccountSettings *s2) +{ + const gchar *str1, *str2; + + if (modest_server_account_settings_get_protocol (s1) != + modest_server_account_settings_get_protocol (s2)) + return FALSE; + + str1 = modest_server_account_settings_get_username (s1); + str2 = modest_server_account_settings_get_username (s2); + if (str1 && str2 && (str1 != str2) && + strcmp (str1, str2) != 0) + return FALSE; + + str1 = modest_server_account_settings_get_hostname (s1); + str2 = modest_server_account_settings_get_hostname (s2); + if (str1 && str2 && (str1 != str2) && + strcmp (str1, str2) != 0) + return FALSE; + + if (modest_server_account_settings_get_port (s1) != + modest_server_account_settings_get_port (s2)) + return FALSE; + + return TRUE; +} + +gboolean +modest_account_mgr_check_already_configured_account (ModestAccountMgr *self, + ModestAccountSettings *settings) +{ + GSList *account_names = NULL; + GSList *cursor = NULL; + ModestServerAccountSettings *server_settings; + + cursor = account_names = modest_account_mgr_account_names (self, + TRUE /* enabled accounts, because disabled accounts are not user visible. */); + + gboolean found = FALSE; + + server_settings = modest_account_settings_get_store_settings (settings); + if (!server_settings) { + g_printerr ("modest: couldn't get store settings from settings"); + modest_account_mgr_free_account_names (account_names); + return FALSE; + } + + /* Look at each non-server account to check their display names; */ + while (cursor && !found) { + const gchar *account_name; + ModestAccountSettings *from_mgr_settings; + ModestServerAccountSettings *from_mgr_server_settings; + + account_name = (gchar*)cursor->data; + from_mgr_settings = modest_account_mgr_load_account_settings (self, account_name); + if (!settings) { + g_printerr ("modest: failed to get account data for %s\n", account_name); + cursor = cursor->next; + continue; + } + + from_mgr_server_settings = modest_account_settings_get_store_settings (from_mgr_settings); + if (server_settings) { + if (server_accounts_equal (from_mgr_server_settings, server_settings)) { + found = TRUE; + } + g_object_unref (from_mgr_server_settings); + } else { + g_printerr ("modest: couldn't get store settings from account %s", account_name); + } + g_object_unref (from_mgr_settings); + cursor = cursor->next; + } + + g_object_unref (server_settings); + modest_account_mgr_free_account_names (account_names); + account_names = NULL; + + return found; +} + @@ -1174,6 +1291,11 @@ modest_account_mgr_unset (ModestAccountMgr *self, const gchar *name, gchar* _modest_account_mgr_account_from_key (const gchar *key, gboolean *is_account_key, gboolean *is_server_account) { + const gchar* account_ns; + const gchar* server_account_ns; + gchar *account = NULL; + gchar *unescaped_name = NULL; + /* Initialize input parameters: */ if (is_account_key) *is_account_key = FALSE; @@ -1181,10 +1303,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 "/"; - gchar *cursor; - gchar *account = NULL; + account_ns = modest_defs_namespace (MODEST_ACCOUNT_SUBNAMESPACE "/"); + server_account_ns = modest_defs_namespace (MODEST_SERVER_ACCOUNT_SUBNAMESPACE "/"); /* determine whether it's an account or a server account, * based on the prefix */ @@ -1192,37 +1312,40 @@ _modest_account_mgr_account_from_key (const gchar *key, gboolean *is_account_key if (is_server_account) *is_server_account = FALSE; - + account = g_strdup (key + strlen (account_ns)); } else if (g_str_has_prefix (key, server_account_ns)) { if (is_server_account) *is_server_account = TRUE; - - account = g_strdup (key + strlen (server_account_ns)); + + account = g_strdup (key + strlen (server_account_ns)); } else return NULL; - /* if there are any slashes left in the key, it's not - * the toplevel entry for an account - */ - cursor = strstr(account, "/"); - - if (is_account_key && cursor) - *is_account_key = TRUE; + if (account) { + gchar *cursor; + + /* if there are any slashes left in the key, it's not + * the toplevel entry for an account + */ + cursor = strstr(account, "/"); - /* put a NULL where the first slash was */ - if (cursor) - *cursor = '\0'; + if (cursor) { + if (is_account_key) + *is_account_key = TRUE; - if (account) { - /* The key is an escaped string, so unescape it to get the actual account name: */ - gchar *unescaped_name = modest_conf_key_unescape (account); + /* put a NULL where the first slash was */ + *cursor = '\0'; + } + + /* The key is an escaped string, so unescape it to get the actual account name */ + unescaped_name = modest_conf_key_unescape (account); g_free (account); - return unescaped_name; - } else - return NULL; + } + + return unescaped_name; } @@ -1253,7 +1376,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) @@ -1422,23 +1545,27 @@ void modest_account_mgr_notify_account_update (ModestAccountMgr* self, const gchar *server_account_name) { - ModestTransportStoreProtocol proto; + ModestProtocolType proto; ModestAccountMgrPrivate* priv; + ModestProtocolRegistry *protocol_registry; gchar *proto_name = NULL; g_return_if_fail (self); g_return_if_fail (server_account_name); priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self); + protocol_registry = modest_runtime_get_protocol_registry (); /* Get protocol */ proto_name = modest_account_mgr_get_string (self, server_account_name, MODEST_ACCOUNT_PROTO, TRUE); if (!proto_name) { - g_free (proto_name); g_return_if_reached (); + return; } - proto = modest_protocol_info_get_transport_store_protocol (proto_name); + proto = modest_protocol_get_type_id (modest_protocol_registry_get_protocol_by_name (protocol_registry, + MODEST_PROTOCOL_REGISTRY_TRANSPORT_STORE_PROTOCOLS, + proto_name)); g_free (proto_name); /* there is some update in the account, so we can't @@ -1451,7 +1578,7 @@ modest_account_mgr_notify_account_update (ModestAccountMgr* self, g_signal_emit (G_OBJECT(self), signals[ACCOUNT_CHANGED_SIGNAL], 0, server_account_name, - (modest_protocol_info_protocol_is_store (proto)) ? + (modest_protocol_registry_protocol_type_has_tag (protocol_registry, proto, MODEST_PROTOCOL_REGISTRY_STORE_PROTOCOLS)) ? TNY_ACCOUNT_TYPE_STORE : TNY_ACCOUNT_TYPE_TRANSPORT); } @@ -1495,7 +1622,6 @@ modest_account_mgr_get_default_account (ModestAccountMgr *self) g_printerr ("modest: failed to get '%s': %s\n", MODEST_CONF_DEFAULT_ACCOUNT, err->message); g_error_free (err); - g_free (account); return NULL; } @@ -1540,6 +1666,11 @@ modest_account_mgr_set_display_name (ModestAccountMgr *self, const gchar *account_name, const gchar *display_name) { + gboolean notify = TRUE; + + if (!modest_account_mgr_get_display_name (self, account_name)) + notify = FALSE; + modest_account_mgr_set_string (self, account_name, MODEST_ACCOUNT_DISPLAY_NAME, @@ -1547,5 +1678,31 @@ modest_account_mgr_set_display_name (ModestAccountMgr *self, FALSE /* not server account */); /* Notify about the change in the display name */ - g_signal_emit (self, signals[DISPLAY_NAME_CHANGED_SIGNAL], 0, account_name); + if (notify) + g_signal_emit (self, signals[DISPLAY_NAME_CHANGED_SIGNAL], 0, account_name); +} + +gboolean +modest_account_mgr_singleton_protocol_exists (ModestAccountMgr *mgr, + ModestProtocolType protocol_type) +{ + GSList *account_names, *node; + gboolean found = FALSE; + + g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR (mgr), FALSE); + account_names = modest_account_mgr_account_names (mgr, TRUE); + + for (node = account_names; node != NULL; node = g_slist_next (node)) { + ModestProtocolType current_protocol; + + current_protocol = modest_account_mgr_get_store_protocol (mgr, (gchar *) node->data); + if (current_protocol == protocol_type) { + found = TRUE; + break; + } + } + + modest_account_mgr_free_account_names (account_names); + + return found; }