X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-mail-operation.c;h=726cf6dcc475edf62fcbac2219374f15a367ecde;hp=4423453452a2f9f6e6a7b6d751ca07a4f4c4a9b3;hb=17d7865c512d65aca2b12dc0a980c3309742319a;hpb=9a62bf948b3b13b44189c70d296c11aa523977d8 diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 4423453..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) @@ -795,6 +799,8 @@ recurse_folders (TnyFolderStore *store, TnyFolderStoreQuery *query, TnyList *all static gboolean idle_notify_progress (gpointer data) { + gdk_threads_enter (); + ModestMailOperation *mail_op = MODEST_MAIL_OPERATION (data); ModestMailOperationState *state; @@ -802,6 +808,8 @@ idle_notify_progress (gpointer data) g_signal_emit (G_OBJECT (mail_op), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL); g_slice_free (ModestMailOperationState, state); + gdk_threads_leave (); + return TRUE; } @@ -813,6 +821,8 @@ idle_notify_progress (gpointer data) static gboolean idle_notify_progress_once (gpointer data) { + gdk_threads_enter (); + ModestPair *pair; pair = (ModestPair *) data; @@ -823,6 +833,8 @@ idle_notify_progress_once (gpointer data) g_slice_free (ModestMailOperationState, (ModestMailOperationState*)pair->second); g_object_unref (pair->first); + gdk_threads_leave (); + return FALSE; } @@ -880,6 +892,8 @@ set_last_updated_idle (gpointer data) time(NULL), TRUE); + gdk_threads_leave (); + return FALSE; } @@ -1519,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)); @@ -1566,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: @@ -1583,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 @@ -1605,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;