X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-mail-operation-queue.c;h=e7307121128a41ff6432486dd728857d2cd2b73a;hp=d1acf1467b13c0b06ed6d094c64598986d9c958a;hb=46f5f01a6cf826f2a76914f770daea7c87b9e7d7;hpb=1d1923d45caa49509fc6f2a85b9d0d36400927f6 diff --git a/src/modest-mail-operation-queue.c b/src/modest-mail-operation-queue.c index d1acf14..e730712 100644 --- a/src/modest-mail-operation-queue.c +++ b/src/modest-mail-operation-queue.c @@ -38,13 +38,13 @@ static void modest_mail_operation_queue_init (ModestMailOperationQueue *ob static void modest_mail_operation_queue_finalize (GObject *obj); static void -on_progress_changed (ModestMailOperation *mail_op, - ModestMailOperationState *state, - gpointer user_data); +on_operation_finished (ModestMailOperation *mail_op, + gpointer user_data); /* list my signals */ enum { QUEUE_CHANGED_SIGNAL, + QUEUE_EMPTY_SIGNAL, NUM_SIGNALS }; @@ -116,6 +116,23 @@ modest_mail_operation_queue_class_init (ModestMailOperationQueueClass *klass) NULL, NULL, modest_marshal_VOID__POINTER_INT, G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_INT); + + /** + * ModestMailOperationQueue::queue-empty + * @self: the #ModestMailOperationQueue that emits the signal + * @user_data: user data set when the signal handler was connected + * + * Issued whenever the queue is empty + */ + signals[QUEUE_EMPTY_SIGNAL] = + g_signal_new ("queue-empty", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (ModestMailOperationQueueClass, queue_empty), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + } static void @@ -145,7 +162,7 @@ on_finalize_foreach(gpointer op, /* Simply remove from queue, but without emitting a * QUEUE_CHANGED_SIGNAL because we are in finalize anyway and have * the lock acquired. */ - g_signal_handlers_disconnect_by_func (mail_op, G_CALLBACK (on_progress_changed), user_data); + g_signal_handlers_disconnect_by_func (mail_op, G_CALLBACK (on_operation_finished), user_data); modest_mail_operation_cancel (mail_op); g_queue_remove (priv->op_queue, mail_op); @@ -187,17 +204,12 @@ modest_mail_operation_queue_new (void) } static void -on_progress_changed (ModestMailOperation *mail_op, - ModestMailOperationState *state, - gpointer user_data) +on_operation_finished (ModestMailOperation *mail_op, + gpointer user_data) { - ModestMailOperationQueue *queue; - - if(!state->finished) - return; + ModestMailOperationQueue *queue = MODEST_MAIL_OPERATION_QUEUE (user_data); /* Remove operation from queue when finished */ - queue = MODEST_MAIL_OPERATION_QUEUE (user_data); modest_mail_operation_queue_remove (queue, mail_op); } @@ -214,12 +226,16 @@ modest_mail_operation_queue_add (ModestMailOperationQueue *self, g_mutex_lock (priv->queue_lock); g_queue_push_tail (priv->op_queue, g_object_ref (mail_op)); - modest_mail_operation_set_id (mail_op, priv->op_id++); g_mutex_unlock (priv->queue_lock); - /* Get notified when the operation ends to remove it from the queue */ - g_signal_connect (G_OBJECT (mail_op), "progress_changed", - G_CALLBACK (on_progress_changed), self); + /* Get notified when the operation ends to remove it from the + queue. We connect it using the *after* because we want to + let the other handlers for the finish function happen + before this */ + g_signal_connect_after (G_OBJECT (mail_op), + "operation-finished", + G_CALLBACK (on_operation_finished), + self); /* Notify observers */ g_signal_emit (self, signals[QUEUE_CHANGED_SIGNAL], 0, @@ -243,7 +259,7 @@ modest_mail_operation_queue_remove (ModestMailOperationQueue *self, g_mutex_unlock (priv->queue_lock); g_signal_handlers_disconnect_by_func (G_OBJECT (mail_op), - G_CALLBACK (on_progress_changed), + G_CALLBACK (on_operation_finished), self); /* Notify observers */ @@ -257,9 +273,9 @@ modest_mail_operation_queue_remove (ModestMailOperationQueue *self, prevent possible application crashes. It's useful also for detecting mail operations with invalid status and error handling */ - if (modest_mail_operation_get_error (mail_op) != NULL) + if (modest_mail_operation_get_error (mail_op) != NULL) { modest_mail_operation_execute_error_handler (mail_op); - else { + } else { if (status == MODEST_MAIL_OPERATION_STATUS_CANCELED) g_warning ("%s: operation canceled \n", __FUNCTION__); else @@ -278,6 +294,9 @@ modest_mail_operation_queue_remove (ModestMailOperationQueue *self, * until the signal emission is complete. armin. */ /* modest_runtime_verify_object_last_ref (mail_op, ""); */ g_object_unref (G_OBJECT (mail_op)); + + /* Emit the queue empty-signal */ + g_signal_emit (self, signals[QUEUE_EMPTY_SIGNAL], 0); } guint @@ -316,8 +335,10 @@ modest_mail_operation_queue_cancel (ModestMailOperationQueue *self, static void on_cancel_all_foreach (gpointer op, gpointer list) { - g_return_if_fail (list); - *((GSList**)list) = g_slist_prepend (*((GSList**)list), MODEST_MAIL_OPERATION (op)); + GSList **new_list; + + new_list = (GSList**) list; + *new_list = g_slist_prepend (*new_list, MODEST_MAIL_OPERATION (op)); } void @@ -325,7 +346,7 @@ modest_mail_operation_queue_cancel_all (ModestMailOperationQueue *self) { ModestMailOperationQueuePrivate *priv; GSList* operations_to_cancel = NULL; - GSList* cur; + GSList* cur = NULL; g_return_if_fail (MODEST_IS_MAIL_OPERATION_QUEUE (self)); @@ -343,8 +364,6 @@ modest_mail_operation_queue_cancel_all (ModestMailOperationQueue *self) /* TODO: Reverse the list, to remove operations in order? */ for(cur = operations_to_cancel; cur != NULL; cur = cur->next) { - /* This triggers a progress_changed signal in which we remove - * the operation from the queue. */ if (!MODEST_IS_MAIL_OPERATION(cur->data)) g_printerr ("modest: cur->data is not a valid mail operation\n"); else