X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmodest-tny-account-store.c;h=4539336c8ce3ae77937b2f761a22d8bbb8176382;hb=305b5f8ec558ffedb3b531618b7877cf8ee722b6;hp=d2ba6a6de69c52b7e0164903e6e7daa75929ce3f;hpb=68038836eb76f43910cf943e03a09567ec6448f6;p=modest diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index d2ba6a6..4539336 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -50,8 +50,6 @@ #include #include #include -#include -#include #include #include @@ -63,6 +61,8 @@ #ifdef MODEST_PLATFORM_MAEMO #include +#include +#include #endif #include @@ -121,7 +121,9 @@ typedef struct _ModestTnyAccountStorePrivate ModestTnyAccountStorePrivate; struct _ModestTnyAccountStorePrivate { gchar *cache_dir; GHashTable *password_hash; +#ifdef MODEST_PLATFORM_MAEMO GHashTable *account_settings_dialog_hash; +#endif ModestAccountMgr *account_mgr; TnySessionCamel *session; TnyDevice *device; @@ -277,11 +279,13 @@ modest_tny_account_store_instance_init (ModestTnyAccountStore *obj) */ priv->password_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - + +#ifdef MODEST_PLATFORM_MAEMO /* A hash-map of modest account names to dialog pointers, * so we can avoid showing the account settings twice for the same modest account: */ priv->account_settings_dialog_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); +#endif /* Respond to volume mounts and unmounts, such * as the insertion/removal of the memory card: */ @@ -497,6 +501,7 @@ on_account_changed (ModestAccountMgr *acc_mgr, g_object_unref (iter); } +#ifdef MODEST_PLATFORM_MAEMO static void on_account_settings_hide (GtkWidget *widget, gpointer user_data) { @@ -511,6 +516,7 @@ on_account_settings_hide (GtkWidget *widget, gpointer user_data) if (modest_account_name) g_hash_table_remove (priv->account_settings_dialog_hash, modest_account_name); } +#endif static void show_password_warning_only () @@ -526,7 +532,7 @@ show_password_warning_only () g_warning ("%s: %s", __FUNCTION__, _("mcen_ib_username_pw_incorrect")); } - +#ifdef MODEST_PLATFORM_MAEMO static void show_wrong_password_dialog (TnyAccount *account) { @@ -594,7 +600,7 @@ show_wrong_password_dialog (TnyAccount *account) gtk_window_present (GTK_WINDOW (dialog)); } } - +#endif static void @@ -690,7 +696,9 @@ get_password (TnyAccount *account, const gchar * prompt_not_used, gboolean *canc ); if (settings_have_password) { /* The password must be wrong, so show the account settings dialog so it can be corrected: */ +#ifdef MODEST_PLATFORM_MAEMO show_wrong_password_dialog (account); +#endif if (cancel) *cancel = TRUE; @@ -819,10 +827,12 @@ modest_tny_account_store_finalize (GObject *obj) priv->password_hash = NULL; } +#ifdef MODEST_PLATFORM_MAEMO if (priv->account_settings_dialog_hash) { g_hash_table_destroy (priv->account_settings_dialog_hash); priv->account_settings_dialog_hash = NULL; } +#endif if (priv->outbox_of_transport) { g_hash_table_destroy (priv->outbox_of_transport); @@ -1644,13 +1654,53 @@ on_account_inserted (ModestAccountMgr *acc_mgr, insert_account (MODEST_TNY_ACCOUNT_STORE (user_data), account, TRUE); } +/* This is the callback of the tny_camel_account_set_online called in + on_account_removed to disconnect the account */ +static void +on_account_disconnect_when_removing (TnyCamelAccount *account, + gboolean canceled, + GError *err, + gpointer user_data) +{ + ModestTnyAccountStore *self; + ModestTnyAccountStorePrivate *priv; + + self = MODEST_TNY_ACCOUNT_STORE (user_data); + priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE (self); + + if (canceled || err) { + /* The account was not cancelled */ + } else { + /* Clear the cache if it's an store account */ + if (TNY_IS_STORE_ACCOUNT (account)) + tny_store_account_delete_cache (TNY_STORE_ACCOUNT (account)); + } + + /* Remove it from the list of accounts */ + if (TNY_IS_STORE_ACCOUNT (account)) + tny_list_remove (priv->store_accounts, (GObject *) account); + else + tny_list_remove (priv->transport_accounts, (GObject *) account); + + /* Notify the observers */ + g_signal_emit (G_OBJECT (self), signals [ACCOUNT_REMOVED_SIGNAL], + 0, account); + + /* Unref the extra reference added by get_server_account */ + g_object_unref (account); +} + static void on_account_removed (ModestAccountMgr *acc_mgr, const gchar *account, gpointer user_data) { TnyAccount *store_account = NULL, *transport_account = NULL; - ModestTnyAccountStore *self = MODEST_TNY_ACCOUNT_STORE(user_data); + ModestTnyAccountStore *self; + ModestTnyAccountStorePrivate *priv; + self = MODEST_TNY_ACCOUNT_STORE (user_data); + priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE (self); + /* Get the server and the transport account */ store_account = modest_tny_account_store_get_server_account (self, account, TNY_ACCOUNT_TYPE_STORE); @@ -1660,13 +1710,11 @@ on_account_removed (ModestAccountMgr *acc_mgr, const gchar *account, /* If there was any problem creating the account, for example, with the configuration system this could not exist */ if (store_account) { - /* Clear the cache */ - tny_store_account_delete_cache (TNY_STORE_ACCOUNT (store_account)); - - /* Notify the observers */ - g_signal_emit (G_OBJECT (self), signals [ACCOUNT_REMOVED_SIGNAL], 0, store_account); - account_disconnect (store_account); /* disconnect the account */ - g_object_unref (store_account); + /* Disconnect before deleting the cache, because the + disconnection will rewrite the cache to the + disk */ + tny_camel_account_set_online (TNY_CAMEL_ACCOUNT (store_account), FALSE, + on_account_disconnect_when_removing, self); } else { g_warning ("There is no store account for account %s\n", account); } @@ -1695,10 +1743,9 @@ on_account_removed (ModestAccountMgr *acc_mgr, const gchar *account, 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); - account_disconnect (transport_account); /* disconnect the account */ - g_object_unref (transport_account); + /* Disconnect and notify the observers. The callback will free the reference */ + tny_camel_account_set_online (TNY_CAMEL_ACCOUNT (transport_account), FALSE, + on_account_disconnect_when_removing, self); } else { g_warning ("There is no transport account for account %s\n", account); }