X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-mail-operation.c;h=726cf6dcc475edf62fcbac2219374f15a367ecde;hp=0564f08c45456a9a518976fd0cfa5a8389210354;hb=17d7865c512d65aca2b12dc0a980c3309742319a;hpb=953b423dda6919b6f7c31f65b99ddb3d9fd90012 diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 0564f08..726cf6d 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -70,7 +70,8 @@ static void get_msg_status_cb (GObject *obj, TnyStatus *status, gpointer user_data); -static void modest_mail_operation_notify_end (ModestMailOperation *self); +static void modest_mail_operation_notify_end (ModestMailOperation *self, + gboolean need_lock); static gboolean did_a_cancel = FALSE; @@ -373,7 +374,7 @@ modest_mail_operation_cancel (ModestMailOperation *self) /* This emits progress-changed on which the mail operation queue is * listening, so the mail operation is correctly removed from the * queue without further explicit calls. */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); return TRUE; } @@ -522,7 +523,7 @@ modest_mail_operation_send_mail (ModestMailOperation *self, /* TODO: do this in the handler of the "msg-sent" signal.Notify about operation end */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); } void @@ -643,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) @@ -657,7 +662,7 @@ end: if (folder) g_object_unref (G_OBJECT(folder)); - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); } typedef struct @@ -840,17 +845,14 @@ idle_notify_progress_once (gpointer data) static gboolean idle_notify_update_account_queue (gpointer data) { - gdk_threads_enter (); - ModestMailOperation *mail_op = MODEST_MAIL_OPERATION (data); ModestMailOperationPrivate *priv = NULL; priv = MODEST_MAIL_OPERATION_GET_PRIVATE(mail_op); - - modest_mail_operation_notify_end (mail_op); - g_object_unref (mail_op); - gdk_threads_leave (); + /* Do not need to block, the notify end will do it for us */ + modest_mail_operation_notify_end (mail_op, TRUE); + g_object_unref (mail_op); return FALSE; } @@ -1227,7 +1229,7 @@ modest_mail_operation_update_account (ModestMailOperation *self, priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; if (callback) callback (self, 0, user_data); - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); return FALSE; } @@ -1271,7 +1273,7 @@ modest_mail_operation_create_folder (ModestMailOperation *self, } /* Notify about operation end */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); return new_folder; } @@ -1326,7 +1328,7 @@ modest_mail_operation_remove_folder (ModestMailOperation *self, end: /* Notify about operation end */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); } static void @@ -1389,11 +1391,9 @@ transfer_folder_cb (TnyFolder *folder, /* Free */ g_object_unref (folder); g_object_unref (into); - if (new_folder != NULL) - g_object_unref (new_folder); /* Notify about operation end */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, TRUE); } void @@ -1432,7 +1432,7 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self, _("mail_in_ui_folder_move_target_error")); /* Notify the queue */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); } else if (parent_rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE) { /* Set status failed and set an error */ priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; @@ -1441,7 +1441,7 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self, _("FIXME: parent folder does not accept new folders")); /* Notify the queue */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); } else { /* Pick references for async calls */ g_object_ref (folder); @@ -1485,7 +1485,7 @@ modest_mail_operation_rename_folder (ModestMailOperation *self, _("FIXME: unable to rename")); /* Notify about operation end */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); } else { /* Rename. Camel handles folder subscription/unsubscription */ TnyFolderStore *into; @@ -1533,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)); @@ -1544,7 +1549,7 @@ void modest_mail_operation_get_msg (ModestMailOperation *self, _("Error trying to get a message. No folder found for header")); /* Notify the queue */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); } } @@ -1580,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: @@ -1597,7 +1606,10 @@ get_msg_cb (TnyFolder *folder, g_slice_free (GetMsgAsyncHelper, helper); /* Notify about operation end */ - modest_mail_operation_notify_end (self); + if(priv->status != MODEST_MAIL_OPERATION_STATUS_CANCELED) + modest_mail_operation_notify_end (self, TRUE); + + g_object_unref (G_OBJECT (self)); } static void @@ -1619,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; @@ -1657,8 +1672,6 @@ typedef struct { static gboolean notify_get_msgs_full (gpointer data) { - gdk_threads_enter (); - NotifyGetMsgsInfo *info; info = (NotifyGetMsgsInfo *) data; @@ -1671,8 +1684,6 @@ notify_get_msgs_full (gpointer data) g_slice_free (NotifyGetMsgsInfo, info); - gdk_threads_leave (); - return FALSE; } @@ -1683,21 +1694,20 @@ notify_get_msgs_full (gpointer data) static gboolean get_msgs_full_destroyer (gpointer data) { - gdk_threads_enter (); - GetFullMsgsInfo *info; info = (GetFullMsgsInfo *) data; - if (info->notify) + if (info->notify) { + gdk_threads_enter (); info->notify (info->user_data); + gdk_threads_leave (); + } /* free */ g_object_unref (info->headers); g_slice_free (GetFullMsgsInfo, info); - gdk_threads_leave (); - return FALSE; } @@ -1858,7 +1868,7 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self, MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT, _("emev_ni_ui_imap_msg_size_exceed_error")); /* Remove from queue and free resources */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); if (notify) notify (user_data); } @@ -1932,7 +1942,7 @@ modest_mail_operation_remove_msg (ModestMailOperation *self, g_object_unref (G_OBJECT (folder)); /* Notify about operation end */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); } static void @@ -2009,7 +2019,7 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError **err, gpointer g_object_unref (folder); /* Notify about operation end */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, TRUE); } void @@ -2045,7 +2055,7 @@ modest_mail_operation_xfer_msgs (ModestMailOperation *self, MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES, _("FIXME: folder does not accept msgs")); /* Notify the queue */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, FALSE); return; } @@ -2112,9 +2122,9 @@ on_refresh_folder (TnyFolder *folder, out: /* Call user defined callback, if it exists */ if (helper->user_callback) { -/* gdk_threads_enter (); */ + gdk_threads_enter (); helper->user_callback (priv->source, folder, helper->user_data); -/* gdk_threads_leave (); */ + gdk_threads_leave (); } /* Free */ @@ -2123,7 +2133,7 @@ on_refresh_folder (TnyFolder *folder, g_object_unref (folder); /* Notify about operation end */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, TRUE); } static void @@ -2197,7 +2207,8 @@ modest_mail_operation_refresh_folder (ModestMailOperation *self, * callback). */ static void -modest_mail_operation_notify_end (ModestMailOperation *self) +modest_mail_operation_notify_end (ModestMailOperation *self, + gboolean need_lock) { ModestMailOperationState *state; ModestMailOperationPrivate *priv = NULL; @@ -2221,6 +2232,10 @@ modest_mail_operation_notify_end (ModestMailOperation *self) /* Notify the observers about the mail opertation end */ state = modest_mail_operation_clone_state (self); + if (need_lock) + gdk_threads_enter (); g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL); + if (need_lock) + gdk_threads_leave (); g_slice_free (ModestMailOperationState, state); }