X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-tny-account-store.c;h=0bc5b2362fa6df28c840e32d4b0e95363db8e268;hb=e5346c62591ebffaf5218c77f2687c637390a713;hp=4dad898c55c9634c095f2e9757680629db33077a;hpb=af4def5b80ee0351d6f44c91e3e2d6610e0f394b;p=modest diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index 4dad898..0bc5b23 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -114,8 +114,7 @@ static void on_vfs_volume_unmounted (GnomeVFSVolumeMonitor *volume_monito static void modest_tny_account_store_forget_password_in_memory (ModestTnyAccountStore *self, const gchar *server_account_name); -static void add_connection_specific_transport_accounts (ModestTnyAccountStore *self, - const gchar *account_name); +static void add_connection_specific_transport_accounts (ModestTnyAccountStore *self); /* list my signals */ enum { @@ -146,6 +145,9 @@ struct _ModestTnyAccountStorePrivate { TnyList *store_accounts; TnyList *transport_accounts; TnyList *store_accounts_outboxes; + + /* Matches transport accounts and outbox folder */ + GHashTable *outbox_of_transport; }; #define MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -276,6 +278,12 @@ modest_tny_account_store_instance_init (ModestTnyAccountStore *obj) priv->session = NULL; priv->device = NULL; + priv->outbox_of_transport = + g_hash_table_new_full (g_direct_hash, + g_direct_equal, + NULL, + NULL); + /* An in-memory store of passwords, * for passwords that are not remembered in the configuration, * so they need to be asked for from the user once in each session: @@ -794,6 +802,12 @@ modest_tny_account_store_finalize (GObject *obj) priv->account_settings_dialog_hash = NULL; } + if (priv->outbox_of_transport) { + g_hash_table_destroy (priv->outbox_of_transport); + priv->outbox_of_transport = NULL; + } + + /* Disconnect VFS signals */ volume_monitor = gnome_vfs_get_volume_monitor (); if (g_signal_handler_is_connected (volume_monitor, @@ -1124,15 +1138,23 @@ modest_tny_account_store_alert (TnyAccountStore *self, TnyAccount *account, TnyA case TNY_ACCOUNT_ERROR_TRY_CONNECT_AUTHENTICATION_NOT_SUPPORTED: g_debug ("%s: Handling GError domain=%d, code=%d (authentication not supported), message=%s", __FUNCTION__, error->domain, error->code, error->message); - /* TODO: This needs a logical ID for the string: */ + /* + A more helpful error message than what the UI spec wants prompt = g_strdup_printf( _("Incorrect Account Settings:\nThe secure authentication method is not supported.\n%s"), error->message); + */ + + /* This is "Secure connection failed", even though the logical ID has _certificate_ in the name: */ + prompt = g_strdup (_("mail_ni_ssl_certificate_error")); + break; case TNY_ACCOUNT_ERROR_TRY_CONNECT_CERTIFICATE: g_debug ("%s: Handling GError domain=%d, code=%d (certificatae), message=%s", __FUNCTION__, error->domain, error->code, error->message); + + /* TODO: This needs a logical ID and/or some specified way to ask the different certificate questions: */ prompt = g_strdup_printf( _("Certificate Problem:\n%s"), error->message); @@ -1154,6 +1176,8 @@ modest_tny_account_store_alert (TnyAccountStore *self, TnyAccount *account, TnyA /* TODO: Remove the internal error message for the real release. * This is just so the testers can give us more information: */ + /* However, I haven't seen this for a few weeks, so maybe the users + * will never see it. murrayc. */ /* prompt = _("Modest account not yet fully configured."); */ prompt = g_strdup_printf( "%s\n (Internal error message, often very misleading):\n%s", @@ -1387,7 +1411,7 @@ modest_tny_account_store_get_server_account (ModestTnyAccountStore *self, static TnyAccount* get_smtp_specific_transport_account_for_open_connection (ModestTnyAccountStore *self, - const gchar *account_name) + const gchar *account_name) { /* Get the current connection: */ TnyDevice *device = modest_runtime_get_device (); @@ -1396,7 +1420,6 @@ get_smtp_specific_transport_account_for_open_connection (ModestTnyAccountStore * return NULL; g_return_val_if_fail (self, NULL); - g_return_val_if_fail (account_name, NULL); #ifdef MODEST_PLATFORM_MAEMO @@ -1419,13 +1442,13 @@ get_smtp_specific_transport_account_for_open_connection (ModestTnyAccountStore * /* Get the connection-specific transport acccount, if any: */ ModestAccountMgr *account_manager = modest_runtime_get_account_mgr (); - /* Check if this account has connection-specific SMTP enabled */ - if (!modest_account_mgr_get_use_connection_specific_smtp (account_manager, account_name)) { - return NULL; - } + /* Check if this account has connection-specific SMTP enabled */ + if (!modest_account_mgr_get_use_connection_specific_smtp (account_manager, account_name)) { + return NULL; + } gchar* server_account_name = modest_account_mgr_get_connection_specific_smtp (account_manager, - account_name, connection_name); + connection_name); /* printf ("DEBUG: %s: server_account_name=%s\n", __FUNCTION__, server_account_name); */ if (!server_account_name) { @@ -1603,7 +1626,7 @@ insert_account (ModestTnyAccountStore *self, tny_list_append (priv->transport_accounts, G_OBJECT (transport_account)); /* Add connection-specific transport accounts */ - add_connection_specific_transport_accounts (self, account); + add_connection_specific_transport_accounts (self); /* Create per account local outbox */ account_outbox = @@ -1632,6 +1655,15 @@ insert_account (ModestTnyAccountStore *self, local_account = modest_tny_account_store_get_local_folders_account (MODEST_TNY_ACCOUNT_STORE (self)); modest_tny_local_folders_account_add_folder_to_outbox (MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (local_account), per_account_outbox); + /* Add the pair to the hash table */ + g_hash_table_insert (priv->outbox_of_transport, + transport_account, + per_account_outbox); + + /* Notify that the local folders account chaned */ + if (notify) + g_signal_emit (G_OBJECT (self), signals [ACCOUNT_CHANGED_SIGNAL], 0, local_account); + g_object_unref (local_account); g_object_unref (per_account_outbox); @@ -1681,6 +1713,27 @@ on_account_removed (ModestAccountMgr *acc_mgr, /* If there was any problem creating the account, for example, with the configuration system this could not exist */ if (transport_account) { + TnyAccount *local_account = NULL; + TnyFolder *outbox = NULL; + ModestTnyAccountStorePrivate *priv = NULL; + + /* Remove the OUTBOX of the account from the global outbox */ + priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); + outbox = g_hash_table_lookup (priv->outbox_of_transport, transport_account); + + if (TNY_IS_FOLDER (outbox)) { + local_account = modest_tny_account_store_get_local_folders_account (self); + modest_tny_local_folders_account_remove_folder_from_outbox (MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (local_account), + outbox); + g_hash_table_remove (priv->outbox_of_transport, transport_account); + + /* Notify the change in the local account */ + g_signal_emit (G_OBJECT (self), signals [ACCOUNT_CHANGED_SIGNAL], 0, local_account); + g_object_unref (local_account); + } else { + g_warning ("Removing a transport account that has no outbox"); + } + /* Notify the observers */ g_signal_emit (G_OBJECT (self), signals [ACCOUNT_REMOVED_SIGNAL], 0, transport_account); g_object_unref (transport_account); @@ -1690,18 +1743,24 @@ on_account_removed (ModestAccountMgr *acc_mgr, } static void -add_connection_specific_transport_accounts (ModestTnyAccountStore *self, - const gchar *account_name) +add_connection_specific_transport_accounts (ModestTnyAccountStore *self) { ModestTnyAccountStorePrivate *priv = NULL; GSList *list_specifics = NULL, *iter = NULL; priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); - list_specifics = modest_account_mgr_get_list (priv->account_mgr, - account_name, - MODEST_ACCOUNT_CONNECTION_SPECIFIC_SMTP_LIST, - MODEST_CONF_VALUE_STRING, FALSE); + ModestConf *conf = modest_runtime_get_conf (); + + GError *err = NULL; + list_specifics = modest_conf_get_list (conf, + MODEST_CONF_CONNECTION_SPECIFIC_SMTP_LIST, + MODEST_CONF_VALUE_STRING, &err); + if (err) { + g_printerr ("modest: %s: error getting list: %s\n.", __FUNCTION__, err->message); + g_error_free (err); + err = NULL; + } /* Look at each connection-specific transport account for the * modest account: */ @@ -1719,8 +1778,6 @@ add_connection_specific_transport_accounts (ModestTnyAccountStore *self, priv->session, transport_account_name); if (tny_account) { - modest_tny_account_set_parent_modest_account_name_for_server_account (tny_account, - account_name); g_object_set_data (G_OBJECT(tny_account), "account_store", (gpointer)self);