X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-mail-operation-queue.c;h=01a36b9f7644a9010e6796cd2f81850d93cf8522;hb=a22f6573fb95c7b8c8dc6bc4256e6968c550e735;hp=aadb3b86b031f105cdeec3866f5943d2a49585e7;hpb=bb2db35bafed990fa0e9212422a59a39439ffa4b;p=modest diff --git a/src/modest-mail-operation-queue.c b/src/modest-mail-operation-queue.c index aadb3b8..01a36b9 100644 --- a/src/modest-mail-operation-queue.c +++ b/src/modest-mail-operation-queue.c @@ -55,6 +55,7 @@ struct _ModestMailOperationQueuePrivate { GMutex *queue_lock; guint op_id; guint queue_empty_handler; + gboolean running_final_sync; }; #define MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_MAIL_OPERATION_QUEUE, \ @@ -148,6 +149,7 @@ modest_mail_operation_queue_init (ModestMailOperationQueue *obj) priv->queue_lock = g_mutex_new (); priv->op_id = 0; priv->queue_empty_handler = 0; + priv->running_final_sync = FALSE; } static void @@ -178,7 +180,7 @@ on_finalize_foreach(gpointer op, g_signal_handlers_disconnect_by_func (mail_op, G_CALLBACK (on_operation_finished), user_data); MODEST_DEBUG_BLOCK (print_queue_item (mail_op, "cancel/remove");); - + modest_mail_operation_cancel (mail_op); g_queue_remove (priv->op_queue, mail_op); g_object_unref (G_OBJECT (mail_op)); @@ -243,13 +245,15 @@ modest_mail_operation_queue_add (ModestMailOperationQueue *self, g_return_if_fail (MODEST_IS_MAIL_OPERATION_QUEUE (self)); g_return_if_fail (MODEST_IS_MAIL_OPERATION (mail_op)); - + priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(self); + priv->running_final_sync = (modest_mail_operation_get_type_operation (mail_op) == MODEST_MAIL_OPERATION_TYPE_SHUTDOWN); + g_mutex_lock (priv->queue_lock); g_queue_push_tail (priv->op_queue, g_object_ref (mail_op)); g_mutex_unlock (priv->queue_lock); - + MODEST_DEBUG_BLOCK (print_queue_item (mail_op, "add");); /* Get notified when the operation ends to remove it from the @@ -298,7 +302,7 @@ notify_queue_empty (gpointer user_data) } -void +void modest_mail_operation_queue_remove (ModestMailOperationQueue *self, ModestMailOperation *mail_op) { @@ -363,14 +367,14 @@ modest_mail_operation_queue_remove (ModestMailOperationQueue *self, } } -guint +guint modest_mail_operation_queue_num_elements (ModestMailOperationQueue *self) { ModestMailOperationQueuePrivate *priv; guint length = 0; g_return_val_if_fail (MODEST_IS_MAIL_OPERATION_QUEUE (self), 0); - + priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(self); g_mutex_lock (priv->queue_lock); @@ -427,7 +431,7 @@ modest_mail_operation_queue_cancel_all (ModestMailOperationQueue *self) g_queue_foreach (priv->op_queue, (GFunc) on_cancel_all_foreach, &operations_to_cancel); g_mutex_unlock (priv->queue_lock); - /* TODO: Reverse the list, to remove operations in order? */ + operations_to_cancel = g_slist_reverse (operations_to_cancel); for(cur = operations_to_cancel; cur != NULL; cur = cur->next) { if (!MODEST_IS_MAIL_OPERATION(cur->data)) @@ -448,18 +452,21 @@ typedef struct static void on_find_by_source_foreach (gpointer op, gpointer data) { - FindBySourceInfo *info = (FindBySourceInfo*) data; + FindBySourceInfo *info = (FindBySourceInfo*) data; + GObject *source = NULL; - if ( info->source == modest_mail_operation_get_source (MODEST_MAIL_OPERATION (op))) { + source = modest_mail_operation_get_source (MODEST_MAIL_OPERATION (op)); + if (info->source == source) { g_object_ref (G_OBJECT (op)); *(info->new_list) = g_slist_prepend (*(info->new_list), MODEST_MAIL_OPERATION (op)); } + if (source) + g_object_unref (source); } GSList* -modest_mail_operation_queue_get_by_source ( - ModestMailOperationQueue *self, - GObject *source) +modest_mail_operation_queue_get_by_source (ModestMailOperationQueue *self, + GObject *source) { ModestMailOperationQueuePrivate *priv; GSList* found_operations= NULL; @@ -467,18 +474,18 @@ modest_mail_operation_queue_get_by_source ( g_return_val_if_fail (MODEST_IS_MAIL_OPERATION_QUEUE (self), NULL); g_return_val_if_fail (source != NULL, NULL); - + priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(self); info->new_list = &found_operations; info->source = source; - + g_mutex_lock (priv->queue_lock); g_queue_foreach (priv->op_queue, (GFunc) on_find_by_source_foreach, info); g_mutex_unlock (priv->queue_lock); - + g_free (info); - + return found_operations; } @@ -509,6 +516,28 @@ modest_mail_operation_queue_to_string (ModestMailOperationQueue *self) g_queue_foreach (priv->op_queue, (GFunc)accumulate_mail_op_strings, &str); g_mutex_unlock (priv->queue_lock); } - + return str; } + +gboolean +modest_mail_operation_queue_running_shutdown (ModestMailOperationQueue *self) +{ + ModestMailOperationQueuePrivate *priv; + + g_return_val_if_fail (MODEST_IS_MAIL_OPERATION_QUEUE (self), FALSE); + + priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(self); + return priv->running_final_sync; +} + +void +modest_mail_operation_queue_set_running_shutdown (ModestMailOperationQueue *self) +{ + ModestMailOperationQueuePrivate *priv; + + g_return_if_fail (MODEST_IS_MAIL_OPERATION_QUEUE (self)); + + priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(self); + priv->running_final_sync = TRUE; +}