X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-mail-operation.c;h=3f0f98a2f5357b8038cdff84e601ff1c12a3919c;hb=02ed529dfdf90b37289f66010a74723b604cbbb5;hp=0caffc3a6c9381d9b2f2481373b78a6d979bdfe4;hpb=a38f50af4c0747976ed5d869e50cb46f29e3bb8a;p=modest diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 0caffc3..3f0f98a 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -504,7 +504,8 @@ modest_mail_operation_cancel (ModestMailOperation *self) if (priv->op_type == MODEST_MAIL_OPERATION_TYPE_SEND) { ModestTnySendQueue *queue; - queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT (priv->account)); + queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT (priv->account), + TRUE); /* Cancel the sending of the following next messages */ tny_send_queue_cancel (TNY_SEND_QUEUE (queue), TNY_SEND_QUEUE_CANCEL_ACTION_SUSPEND, NULL); @@ -619,8 +620,12 @@ modest_mail_operation_send_mail (ModestMailOperation *self, priv->done = 1; priv->total = 1; - send_queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (transport_account)); + send_queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (transport_account, TRUE)); if (!TNY_IS_SEND_QUEUE(send_queue)) { + if (priv->error) { + g_error_free (priv->error); + priv->error = NULL; + } g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND, "modest: could not find send queue for account\n"); @@ -634,7 +639,11 @@ modest_mail_operation_send_mail (ModestMailOperation *self, tny_send_queue_add_async (send_queue, msg, NULL, NULL, NULL); modest_tny_send_queue_set_requested_send_receive (MODEST_TNY_SEND_QUEUE (send_queue), FALSE); - priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; + if (priv->error) { + priv->status = MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS; + } else { + priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; + } modest_mail_operation_notify_end (self); } @@ -672,12 +681,14 @@ create_msg_thread (gpointer thread_data) if (info->html_body == NULL) { new_msg = modest_tny_msg_new (info->to, info->from, info->cc, info->bcc, info->subject, info->plain_body, - info->attachments_list); + info->attachments_list, + &(priv->error)); } else { new_msg = modest_tny_msg_new_html_plain (info->to, info->from, info->cc, info->bcc, info->subject, info->html_body, info->plain_body, info->attachments_list, - info->images_list); + info->images_list, + &(priv->error)); } if (new_msg) { @@ -694,9 +705,10 @@ create_msg_thread (gpointer thread_data) g_object_unref (G_OBJECT(header)); } else { priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; - g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, - MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED, - "modest: failed to create a new msg\n"); + if (!priv->error) + g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, + MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED, + "modest: failed to create a new msg\n"); } @@ -784,13 +796,15 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self, TnyFolder *outbox_folder = NULL; TnyHeader *header = NULL; + priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); + if (!msg) { + priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; + modest_mail_operation_notify_end (self); goto end; } - priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); - - if (priv->error) { + if (priv->error && priv->error->code != MODEST_MAIL_OPERATION_ERROR_FILE_IO) { priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; modest_mail_operation_notify_end (self); goto end; @@ -935,9 +949,14 @@ modest_mail_operation_save_to_drafts_add_msg_cb(TnyFolder *self, { ModestMailOperationPrivate *priv = NULL; SaveToDraftsAddMsgInfo *info = (SaveToDraftsAddMsgInfo *) userdata; + GError *io_error = NULL; priv = MODEST_MAIL_OPERATION_GET_PRIVATE(info->mailop); + if (priv->error && priv->error->code == MODEST_MAIL_OPERATION_ERROR_FILE_IO) { + io_error = priv->error; + priv->error = NULL; + } if (priv->error) { g_warning ("%s: priv->error != NULL", __FUNCTION__); g_error_free(priv->error); @@ -960,10 +979,18 @@ modest_mail_operation_save_to_drafts_add_msg_cb(TnyFolder *self, g_object_unref (G_OBJECT(src_folder)); } - if (!priv->error) - priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; - else + if (priv->error) { priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; + if (io_error) { + g_error_free (io_error); + io_error = NULL; + } + } else if (io_error) { + priv->error = io_error; + priv->status = MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS; + } else { + priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; + } /* Call the user callback */ if (info->callback) @@ -1018,7 +1045,7 @@ modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self, } } - if (!priv->error) { + if (!priv->error || priv->error->code == MODEST_MAIL_OPERATION_ERROR_FILE_IO) { SaveToDraftsAddMsgInfo *cb_info = g_slice_new(SaveToDraftsAddMsgInfo); cb_info->transport_account = g_object_ref(info->transport_account); cb_info->draft_msg = info->draft_msg ? g_object_ref(info->draft_msg) : NULL; @@ -1385,7 +1412,7 @@ inbox_refreshed_cb (TnyFolder *inbox, TnyFolder *outbox; guint num_messages; - send_queue = modest_runtime_get_send_queue (transport_account); + send_queue = modest_runtime_get_send_queue (transport_account, TRUE); g_object_unref (transport_account); /* Get outbox folder */ @@ -1417,6 +1444,41 @@ inbox_refreshed_cb (TnyFolder *inbox, update_account_notify_user_and_free (info, new_headers); } +static void +inbox_refresh_status_update (GObject *obj, + TnyStatus *status, + gpointer user_data) +{ + UpdateAccountInfo *info = NULL; + ModestMailOperation *self = NULL; + ModestMailOperationPrivate *priv = NULL; + ModestMailOperationState *state; + + g_return_if_fail (user_data != NULL); + g_return_if_fail (status != NULL); + + /* Show only the status information we want */ + if (status->code != TNY_FOLDER_STATUS_CODE_REFRESH) + return; + + info = (UpdateAccountInfo *) user_data; + self = info->mail_op; + g_return_if_fail (MODEST_IS_MAIL_OPERATION(self)); + + priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); + + priv->done = status->position; + priv->total = status->of_total; + + state = modest_mail_operation_clone_state (self); + + /* This is not a GDK lock because we are a Tinymail callback and + * Tinymail already acquires the Gdk lock */ + g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL); + + g_slice_free (ModestMailOperationState, state); +} + static void recurse_folders_async_cb (TnyFolderStore *folder_store, gboolean canceled, @@ -1517,7 +1579,7 @@ recurse_folders_async_cb (TnyFolderStore *folder_store, tny_folder_add_observer (inbox, info->inbox_observer); /* Refresh the INBOX */ - tny_folder_refresh_async (inbox, inbox_refreshed_cb, NULL, info); + tny_folder_refresh_async (inbox, inbox_refreshed_cb, inbox_refresh_status_update, info); g_object_unref (inbox); } else { /* We could not perform the inbox refresh but @@ -2174,6 +2236,7 @@ modest_mail_operation_get_msg (ModestMailOperation *self, helper->last_total_bytes = 0; helper->sum_total_bytes = 0; helper->total_bytes = tny_header_get_message_size (header); + helper->more_msgs = NULL; modest_mail_operation_notify_start (self); @@ -2238,7 +2301,7 @@ get_msg_async_cb (TnyFolder *folder, if (canceled) { canceled = TRUE; finished = TRUE; - priv->status == MODEST_MAIL_OPERATION_STATUS_CANCELED; + priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED; } else if (err) { priv->status = MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS; if (err) { @@ -2483,7 +2546,7 @@ modest_mail_operation_remove_msgs (ModestMailOperation *self, traccount = modest_tny_account_store_get_transport_account_from_outbox_header(accstore, header); if (traccount) { ModestTnySendQueueStatus status; - ModestTnySendQueue *send_queue = modest_runtime_get_send_queue(traccount); + ModestTnySendQueue *send_queue = modest_runtime_get_send_queue(traccount, TRUE); TnyIterator *iter = tny_list_create_iterator(headers); g_object_unref(remove_headers); remove_headers = TNY_LIST(tny_simple_list_new()); @@ -2792,7 +2855,6 @@ modest_mail_operation_xfer_msgs (ModestMailOperation *self, helper->dest_folder = g_object_ref(folder); helper->user_callback = user_callback; helper->user_data = user_data; - helper->delete = delete_original; helper->last_total_bytes = 0; helper->sum_total_bytes = 0; helper->total_bytes = compute_message_list_size (headers); @@ -2836,11 +2898,14 @@ modest_mail_operation_xfer_msgs (ModestMailOperation *self, leave_on_server = FALSE; } + /* Do not delete messages if leave on server is TRUE */ + helper->delete = (leave_on_server) ? FALSE : delete_original; + modest_mail_operation_notify_start (self); tny_folder_transfer_msgs_async (src_folder, helper->headers, folder, - (leave_on_server) ? FALSE : delete_original, + helper->delete, transfer_msgs_cb, transfer_msgs_status_cb, helper); @@ -3055,7 +3120,7 @@ modest_mail_operation_sync_folder (ModestMailOperation *self, priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS; - priv->account = TNY_ACCOUNT (tny_folder_get_account (folder)); + priv->account = modest_tny_folder_get_account (folder); priv->op_type = MODEST_MAIL_OPERATION_TYPE_SYNC_FOLDER; modest_mail_operation_notify_start (self);