* Fixed an issue whith signal handlers when unregistering windows
[modest] / src / modest-mail-operation.c
index f88ff79..726cf6d 100644 (file)
@@ -644,13 +644,17 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self,
                header = tny_msg_get_header (draft_msg);
                /* Remove the old draft expunging it */
                tny_folder_remove_msg (folder, header, NULL);
-               tny_folder_sync (folder, TRUE, NULL);
+               tny_folder_sync (folder, TRUE, &(priv->error));
                g_object_unref (header);
        }
        
-       tny_folder_add_msg (folder, msg, &(priv->error));
+       if (!priv->error)
+               tny_folder_add_msg (folder, msg, &(priv->error));
+
        if (!priv->error)
                priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+       else
+               priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
 
 end:
        if (msg)
@@ -1529,6 +1533,11 @@ void modest_mail_operation_get_msg (ModestMailOperation *self,
                helper->user_data = user_data;
                helper->header = g_object_ref (header);
 
+               // The callback's reference so that the mail op is not
+               // finalized until the async operation is completed even if
+               // the user canceled the request meanwhile.
+               g_object_ref (G_OBJECT (helper->mail_op));
+
                tny_folder_get_msg_async (folder, header, get_msg_cb, get_msg_status_cb, helper);
 
                g_object_unref (G_OBJECT (folder));
@@ -1576,15 +1585,19 @@ get_msg_cb (TnyFolder *folder,
                goto out;
        }
 
-       priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+       /* The mail operation might have been canceled in which case we do not
+          want to notify anyone anymore. */
+       if(priv->status != MODEST_MAIL_OPERATION_STATUS_CANCELED) {
+               priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
 
-       /* If user defined callback function was defined, call it */
-       if (helper->user_callback) {
-               /* This callback is called into an iddle by tinymail,
-                  and idles are not in the main lock */
-               gdk_threads_enter ();
-               helper->user_callback (self, helper->header, msg, helper->user_data);
-               gdk_threads_leave ();
+               /* If user defined callback function was defined, call it */
+               if (helper->user_callback) {
+                       /* This callback is called into an iddle by tinymail,
+                          and idles are not in the main lock */
+                       gdk_threads_enter ();
+                       helper->user_callback (self, helper->header, msg, helper->user_data);
+                       gdk_threads_leave ();
+               }
        }
 
  out:
@@ -1593,7 +1606,10 @@ get_msg_cb (TnyFolder *folder,
        g_slice_free (GetMsgAsyncHelper, helper);
                
        /* Notify about operation end */
-       modest_mail_operation_notify_end (self, TRUE);
+       if(priv->status != MODEST_MAIL_OPERATION_STATUS_CANCELED)
+               modest_mail_operation_notify_end (self, TRUE);
+
+       g_object_unref (G_OBJECT (self));
 }
 
 static void     
@@ -1615,6 +1631,9 @@ get_msg_status_cb (GObject *obj,
        self = helper->mail_op;
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
 
+       if(priv->status == MODEST_MAIL_OPERATION_STATUS_CANCELED)
+               return;
+
        if ((status->position == 1) && (status->of_total == 100))
                return;