X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-mail-operation-queue.c;h=c4611bfa3d2821de341a8a9fa84f43b63d6239c4;hp=720e66841f00a49973f3606462fa0921c12238ca;hb=2130b41c3722f14f8bda39544aff1c93c50ae8b4;hpb=e374da56f67092cecb1572dd4bee2ca34e0bc04c diff --git a/src/modest-mail-operation-queue.c b/src/modest-mail-operation-queue.c index 720e668..c4611bf 100644 --- a/src/modest-mail-operation-queue.c +++ b/src/modest-mail-operation-queue.c @@ -228,6 +228,28 @@ modest_mail_operation_queue_new (void) } static void +on_operation_started (ModestMailOperation *mail_op, + gpointer user_data) +{ + ModestMailOperationQueue *self = MODEST_MAIL_OPERATION_QUEUE (user_data); + ModestMailOperationTypeOperation op_type; + ModestMailOperationQueuePrivate *priv; + TnyDevice *device; + + priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(self); + + op_type = modest_mail_operation_get_type_operation (mail_op); + device = modest_runtime_get_device (); + + if ((op_type != MODEST_MAIL_OPERATION_TYPE_SHUTDOWN) && + priv->running_final_sync && + tny_device_is_forced (device)) + tny_device_reset (device); + + priv->running_final_sync = (op_type == MODEST_MAIL_OPERATION_TYPE_SHUTDOWN); +} + +static void on_operation_finished (ModestMailOperation *mail_op, gpointer user_data) { @@ -248,21 +270,24 @@ modest_mail_operation_queue_add (ModestMailOperationQueue *self, 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");); + g_signal_connect (G_OBJECT (mail_op), + "operation-started", + G_CALLBACK (on_operation_started), + 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), + g_signal_connect_after (G_OBJECT (mail_op), "operation-finished", - G_CALLBACK (on_operation_finished), + G_CALLBACK (on_operation_finished), self); /* Notify observers */ @@ -342,7 +367,7 @@ modest_mail_operation_queue_remove (ModestMailOperationQueue *self, modest_mail_operation_execute_error_handler (mail_op); } else { if (status == MODEST_MAIL_OPERATION_STATUS_CANCELED) - g_warning ("%s: operation canceled \n", __FUNCTION__); + g_debug ("%s: operation canceled \n", __FUNCTION__); else g_warning ("%s: possible error in a mail operation " \ "implementation. The status is not successful " \ @@ -452,63 +477,72 @@ 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; - FindBySourceInfo *info = g_new0 (FindBySourceInfo, 1); + FindBySourceInfo *info; 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 = g_new0 (FindBySourceInfo, 1); 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; } static void accumulate_mail_op_strings (ModestMailOperation *op, gchar **str) { - *str = g_strdup_printf ("%s\n%s", *str, modest_mail_operation_to_string (op)); + gchar *mail_op_to_str = modest_mail_operation_to_string (op); + *str = g_strdup_printf ("%s\n%s", *str, mail_op_to_str); + g_free (mail_op_to_str); } gchar* modest_mail_operation_queue_to_string (ModestMailOperationQueue *self) { - gchar *str; + gchar *str = NULL; guint len; ModestMailOperationQueuePrivate *priv; - + g_return_val_if_fail (MODEST_IS_MAIL_OPERATION_QUEUE (self), NULL); - + priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(self); len = g_queue_get_length (priv->op_queue); str = g_strdup_printf ("mail operation queue (%02d)\n-------------------------", len); - if (len == 0) - str = g_strdup_printf ("%s\n%s", str, ""); - else { + if (len == 0) { + gchar *copy; + copy = str; + str = g_strdup_printf ("%s\n%s", copy, ""); + g_free (copy); + } else { g_mutex_lock (priv->queue_lock); g_queue_foreach (priv->op_queue, (GFunc)accumulate_mail_op_strings, &str); g_mutex_unlock (priv->queue_lock);