+ /* Remember which operations to cancel. This is the only thing that
+ * is done while holding the lock, so we do not need to call
+ * functions from other files while holding the lock, which could
+ * lead to a deadlock if such a call re-enters into this queue and
+ * tries to acquire another lock. */
+ g_mutex_lock (priv->queue_lock);
+ g_queue_foreach (priv->op_queue, (GFunc) on_cancel_all_foreach, &operations_to_cancel);
+ g_mutex_unlock (priv->queue_lock);
+
+ 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))
+ g_printerr ("modest: cur->data is not a valid mail operation\n");
+ else
+ modest_mail_operation_cancel (MODEST_MAIL_OPERATION (cur->data));
+ }
+
+ 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;
+ GObject *source;
+
+ 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));
+ }
+ g_object_unref (source);
+}
+
+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;
+