X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmodest-tny-account-store.c;h=0d380e3f3030444be87c211f8f1bce6762cc0679;hb=e9c67b1991508f5be50928eac2d32ff52b50bd5e;hp=cbfc2b0495673eedbbb11e4fb5323f0787149b06;hpb=954146ff39f5b5c2290404b523839d7c64ffebf5;p=modest diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index cbfc2b0..0d380e3 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -301,20 +301,6 @@ modest_tny_account_store_instance_init (ModestTnyAccountStore *obj) /* disconnect the list of TnyAccounts */ static void -account_disconnect (TnyAccount *account) -{ - g_return_if_fail (account && TNY_IS_ACCOUNT(account)); - - if (TNY_IS_STORE_ACCOUNT (account) && - !modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account))) - return; - - tny_camel_account_set_online (TNY_CAMEL_ACCOUNT(account), FALSE, NULL, NULL); -} - - -/* disconnect the list of TnyAccounts */ -static void account_verify_last_ref (TnyAccount *account, const gchar *str) { gchar *txt; @@ -541,7 +527,6 @@ show_wrong_password_dialog (TnyAccount *account) const gchar *modest_account_name; modest_account_name = modest_tny_account_get_parent_modest_account_name_for_server_account (account); dialog = modest_tny_account_store_show_account_settings_dialog (self, modest_account_name); - modest_account_settings_dialog_save_password (MODEST_ACCOUNT_SETTINGS_DIALOG (dialog)); } /* Show an explanatory temporary banner: */ modest_platform_information_banner (dialog, NULL, _("mcen_ib_username_pw_incorrect")); @@ -838,14 +823,12 @@ modest_tny_account_store_finalize (GObject *obj) /* Destroy all accounts. Disconnect all accounts before they are destroyed */ if (priv->store_accounts) { - tny_list_foreach (priv->store_accounts, (GFunc)account_disconnect, NULL); tny_list_foreach (priv->store_accounts, (GFunc)account_verify_last_ref, "store"); g_object_unref (priv->store_accounts); priv->store_accounts = NULL; } if (priv->transport_accounts) { - tny_list_foreach (priv->transport_accounts, (GFunc)account_disconnect, NULL); tny_list_foreach (priv->transport_accounts, (GFunc)account_verify_last_ref, "transport"); g_object_unref (priv->transport_accounts); priv->transport_accounts = NULL; @@ -1630,9 +1613,13 @@ add_outbox_from_transport_account_to_global_outbox_get_folders_cb (TnyFolderStor self = MODEST_TNY_ACCOUNT_STORE (info->account_store); priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); + /* Note that this could happen if there is not enough space + available on disk, then the outbox folder could not be + created */ if (tny_list_get_length (list) != 1) { - g_warning ("%s: > 1 outbox found (%d)?!", __FUNCTION__, + g_warning ("%s: could not create outbox folder (%d folders found)", __FUNCTION__, tny_list_get_length (list)); + goto frees; } iter_folders = tny_list_create_iterator (list); @@ -1653,10 +1640,11 @@ add_outbox_from_transport_account_to_global_outbox_get_folders_cb (TnyFolderStor /* Notify that the local account changed */ g_signal_emit (G_OBJECT (self), signals [ACCOUNT_CHANGED_SIGNAL], 0, local_account); - - g_object_unref (info->transport_account); g_object_unref (local_account); g_object_unref (per_account_outbox); + + frees: + g_object_unref (info->transport_account); g_slice_free (AddOutboxInfo, info); } @@ -1824,7 +1812,7 @@ on_account_disconnect_when_removing (TnyCamelAccount *account, } else if (TNY_IS_TRANSPORT_ACCOUNT (account)) { ModestTnySendQueue* send_queue; send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT (account), FALSE); - if (send_queue) { + if (TNY_IS_SEND_QUEUE (send_queue)) { if (modest_tny_send_queue_sending_in_progress (send_queue)) tny_send_queue_cancel (TNY_SEND_QUEUE (send_queue), TNY_SEND_QUEUE_CANCEL_ACTION_REMOVE, @@ -1850,8 +1838,8 @@ remove_transport_account (ModestTnyAccountStore *self, /* Remove it from the list of accounts and notify the observers. Do not need to wait for account disconnection */ - tny_list_remove (priv->transport_accounts, (GObject *) transport_account); g_signal_emit (G_OBJECT (self), signals [ACCOUNT_REMOVED_SIGNAL], 0, transport_account); + tny_list_remove (priv->transport_accounts, (GObject *) transport_account); /* Remove the OUTBOX of the account from the global outbox */ outbox = g_hash_table_lookup (priv->outbox_of_transport, transport_account); @@ -2124,7 +2112,6 @@ modest_tny_account_store_get_transport_account_from_outbox_header(ModestTnyAccou g_return_val_if_fail (MODEST_IS_TNY_ACCOUNT_STORE (self), NULL); g_return_val_if_fail (TNY_IS_HEADER (header), NULL); priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE (self); - msg_id = modest_tny_send_queue_get_msg_id (header); acc_iter = tny_list_create_iterator (priv->transport_accounts); while (!header_acc && !tny_iterator_is_done (acc_iter)) { @@ -2132,9 +2119,10 @@ modest_tny_account_store_get_transport_account_from_outbox_header(ModestTnyAccou ModestTnySendQueue *send_queue; ModestTnySendQueueStatus status; send_queue = modest_runtime_get_send_queue(TNY_TRANSPORT_ACCOUNT(account), TRUE); - status = modest_tny_send_queue_get_msg_status(send_queue, msg_id); - if (status != MODEST_TNY_SEND_QUEUE_UNKNOWN) { - header_acc = g_object_ref(account); + if (TNY_IS_SEND_QUEUE (send_queue)) { + status = modest_tny_send_queue_get_msg_status(send_queue, msg_id); + if (status != MODEST_TNY_SEND_QUEUE_UNKNOWN) + header_acc = g_object_ref(account); } g_object_unref (account); tny_iterator_next (acc_iter); @@ -2148,7 +2136,7 @@ modest_tny_account_store_get_transport_account_from_outbox_header(ModestTnyAccou GtkWidget * modest_tny_account_store_show_account_settings_dialog (ModestTnyAccountStore *self, - const gchar *account_name) + const gchar *account_name) { ModestTnyAccountStorePrivate *priv; gpointer dialog_as_gpointer = NULL; @@ -2188,3 +2176,67 @@ modest_tny_account_store_show_account_settings_dialog (ModestTnyAccountStore *se } } + +typedef struct { + ModestTnyAccountStore *account_store; + ModestTnyAccountStoreShutdownCallback callback; + gpointer userdata; + gint pending; +} ShutdownOpData; + +static void +account_shutdown_callback (TnyCamelAccount *account, gboolean canceled, GError *err, gpointer userdata) +{ + ShutdownOpData *op_data = (ShutdownOpData *) userdata; + op_data->pending--; + if (op_data->pending == 0) { + if (op_data->callback) + op_data->callback (op_data->account_store, op_data->userdata); + g_object_unref (op_data->account_store); + g_free (op_data); + } +} + +static void +account_shutdown (TnyAccount *account, ShutdownOpData *op_data) +{ + g_return_if_fail (account && TNY_IS_ACCOUNT(account)); + + if (TNY_IS_STORE_ACCOUNT (account) && + !modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account))) + return; + + op_data->pending++; + + tny_camel_account_set_online (TNY_CAMEL_ACCOUNT(account), FALSE, account_shutdown_callback, op_data); +} + + +void +modest_tny_account_store_shutdown (ModestTnyAccountStore *self, + ModestTnyAccountStoreShutdownCallback callback, + gpointer userdata) +{ + ShutdownOpData *op_data = g_new0 (ShutdownOpData, 1); + ModestTnyAccountStorePrivate *priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE (self); + op_data->callback = callback; + op_data->userdata = userdata; + op_data->pending = 0; + op_data->account_store = g_object_ref (self); + + /* Destroy all accounts. Disconnect all accounts before they are destroyed */ + if (priv->store_accounts) { + tny_list_foreach (priv->store_accounts, (GFunc)account_shutdown, op_data); + } + + if (priv->transport_accounts) { + tny_list_foreach (priv->transport_accounts, (GFunc)account_shutdown, op_data); + } + + if (op_data->pending == 0) { + if (op_data->callback) + op_data->callback (op_data->account_store, op_data->userdata); + g_object_unref (op_data->account_store); + g_free (op_data); + } +}