X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-mail-operation.c;h=726cf6dcc475edf62fcbac2219374f15a367ecde;hp=f88ff79352cefac47f6c369a207ab49bf1fa114f;hb=17d7865c512d65aca2b12dc0a980c3309742319a;hpb=c04e24ad16b9a570a1152ec2c05c953fe39a3c3c diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index f88ff79..726cf6d 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -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;