Work to fix bug NB#80656.
[modest] / src / modest-mail-operation.c
index ff0b2e3..001d4ae 100644 (file)
@@ -621,6 +621,10 @@ modest_mail_operation_send_mail (ModestMailOperation *self,
 
        send_queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (transport_account));
        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 +638,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 +680,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 +704,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");
        }
 
 
@@ -783,15 +794,16 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self,
        TnyFolder *draft_folder = NULL;
        TnyFolder *outbox_folder = NULL;
        TnyHeader *header = NULL;
-       GError *err = 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;
@@ -801,6 +813,7 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self,
        modest_mail_operation_send_mail (self, info->transport_account, msg);
 
        if (info->draft_msg != NULL) {
+               TnyList *tmp_headers = NULL;
                TnyFolder *folder = NULL;
                TnyFolder *src_folder = NULL;
                TnyFolderType folder_type;              
@@ -844,11 +857,12 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self,
                        src_folder = draft_folder;
 
                /* Note: This can fail (with a warning) if the message is not really already in a folder,
-                * because this function requires it to have a UID. */          
-               tny_folder_remove_msg (src_folder, header, NULL);
-
-               tny_folder_sync (folder, TRUE, &err); /* FALSE --> don't expunge */
-/*             tny_folder_sync_async (src_folder, TRUE, NULL, NULL, NULL);  /\* expunge *\/ */
+                * because this function requires it to have a UID. */
+               tmp_headers = tny_simple_list_new ();
+               tny_list_append (tmp_headers, (GObject*) header);
+               tny_folder_remove_msgs_async (src_folder, tmp_headers, NULL, NULL, NULL);
+               g_object_unref (tmp_headers);
+               tny_folder_sync_async (src_folder, TRUE, NULL, NULL, NULL);  /* expunge */
                
                g_object_unref (folder);
        }
@@ -856,8 +870,6 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self,
 end:
        if (header)
                g_object_unref (header);
-       if (err != NULL)
-               g_error_free(err);      
        if (info->draft_msg)
                g_object_unref (info->draft_msg);
        if (draft_folder)
@@ -936,9 +948,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);
@@ -961,10 +978,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)
@@ -1019,7 +1044,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;
@@ -2110,10 +2135,11 @@ modest_mail_operation_rename_folder (ModestMailOperation *self,
                                               transfer_folder_cb,
                                               transfer_folder_status_cb,
                                               helper);
+                       g_object_unref (into);
                } else {
+                       g_object_unref (into);
                        goto error;
                }
-               g_object_unref (into);
 
                return;
        }
@@ -2174,6 +2200,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);
        
@@ -2235,9 +2262,10 @@ get_msg_async_cb (TnyFolder *folder,
        }
 
        /* If canceled by the user, ignore the error given by Tinymail */
-       if (priv->status == MODEST_MAIL_OPERATION_STATUS_CANCELED || canceled) {
+       if (canceled) {
                canceled = TRUE;
                finished = TRUE;
+               priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED;
        } else if (err) {
                priv->status = MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS;
                if (err) {
@@ -2611,16 +2639,12 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError *err, gpointer u
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
 
-       if (err) {
+       if (cancelled) {
+               priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED;
+       } else if (err) {
                priv->error = g_error_copy (err);
                priv->done = 0;
                priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;     
-       } else if (cancelled) {
-               priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED;
-               g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
-                            MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
-                            _("Error trying to refresh the contents of %s"),
-                            tny_folder_get_name (folder));
        } else if (priv->status != MODEST_MAIL_OPERATION_STATUS_CANCELED) {
                if (helper->more_msgs) {
                        /* We'll transfer the next message in the list */
@@ -2635,7 +2659,6 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError *err, gpointer u
                                finished = FALSE;
                        }
                }
-
                if (finished) {
                        priv->done = 1;
                        priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
@@ -3064,7 +3087,9 @@ modest_mail_operation_sync_folder (ModestMailOperation *self,
 
        modest_mail_operation_notify_start (self);
        g_object_ref (self);
-       tny_folder_sync_async (folder, expunge, (TnyFolderCallback) sync_folder_finish_callback, NULL, self);
+       tny_folder_sync_async (folder, expunge, 
+                              (TnyFolderCallback) sync_folder_finish_callback, 
+                              NULL, self);
 }
 
 static void