* Use the async function instead of the sync call
[modest] / src / modest-mail-operation-queue.c
index 7b4b25d..a05c8fd 100644 (file)
@@ -44,6 +44,7 @@ on_operation_finished (ModestMailOperation *mail_op,
 /* list my signals  */
 enum {
        QUEUE_CHANGED_SIGNAL,
+       QUEUE_EMPTY_SIGNAL,
        NUM_SIGNALS
 };
 
@@ -115,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
@@ -276,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 
@@ -351,3 +372,46 @@ modest_mail_operation_queue_cancel_all (ModestMailOperationQueue *self)
 
        g_slist_free(operations_to_cancel);
 }
+
+typedef struct
+{
+       GSList **new_list;
+       GObject *source;
+} FindBySourceInfo;
+
+static void
+on_find_by_source_foreach (gpointer op, gpointer data)
+{
+       FindBySourceInfo *info = (FindBySourceInfo*) data; 
+
+       if ( info->source == modest_mail_operation_get_source (MODEST_MAIL_OPERATION (op))) {
+               g_object_ref (G_OBJECT (op));
+               *(info->new_list) = g_slist_prepend (*(info->new_list), MODEST_MAIL_OPERATION (op));
+       }
+}
+
+GSList*
+modest_mail_operation_queue_get_by_source (
+               ModestMailOperationQueue *self, 
+               GObject *source)
+{
+       ModestMailOperationQueuePrivate *priv;
+       GSList* found_operations= NULL;
+       FindBySourceInfo *info = g_new0 (FindBySourceInfo, 1);
+
+       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;
+}