Don't pass the header_list in GetMsgInfo, it's not needed
[modest] / src / modest-mail-operation.c
index 495cf9b..5836ff5 100644 (file)
@@ -135,6 +135,7 @@ struct _ModestMailOperationPrivate {
 typedef struct {
        GetMsgAsyncUserCallback user_callback;
        TnyHeader *header;
+       TnyIterator *iter;
        gpointer user_data;
        ModestMailOperation *mail_op;
        GDestroyNotify destroy_notify;
@@ -2148,19 +2149,32 @@ get_msg_async_cb (TnyFolder *folder,
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (info->mail_op);
        priv->done++;
-       finished = (priv->done == priv->total) ? TRUE : FALSE;
+
+       if (info->iter) {
+               tny_iterator_next (info->iter);
+               finished = (tny_iterator_is_done (info->iter));
+       } else {
+               finished = (priv->done == priv->total) ? TRUE : FALSE;
+       }
 
        /* Check errors */
        if (canceled || err) {
                priv->status = MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS;
-               if (!priv->error)
+               if (err) {
+                       priv->error = g_error_copy ((const GError *) err);
+                       priv->error->domain = MODEST_MAIL_OPERATION_ERROR;
+               }
+               if (!priv->error) {
                        g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
                                     MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
                                     err->message);
-       } else {
+               }
+       } else if (finished && priv->status == MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS) {
                /* Set the success status before calling the user callback */
-               if (finished && priv->status == MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS)
-                       priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+               priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+       } else if (priv->status == MODEST_MAIL_OPERATION_STATUS_CANCELED) {
+               canceled = TRUE;
+               finished = TRUE;
        }
 
 
@@ -2177,12 +2191,28 @@ get_msg_async_cb (TnyFolder *folder,
 
                /* Notify about operation end */
                modest_mail_operation_notify_end (info->mail_op);
-       }
 
-       /* Clean */
-       g_object_unref (info->header);
-       g_object_unref (info->mail_op);
-       g_slice_free (GetMsgInfo, info);
+               /* Clean */
+               if (info->iter)
+                       g_object_unref (info->iter);
+               g_object_unref (info->header);
+               g_object_unref (info->mail_op);
+               g_slice_free (GetMsgInfo, info);
+       } else if (info->iter) {
+               TnyHeader *header = TNY_HEADER (tny_iterator_get_current (info->iter));
+               TnyFolder *folder = tny_header_get_folder (header);
+
+               g_object_unref (info->header);
+               info->header = g_object_ref (header);
+
+               /* Retrieve the next message */
+               tny_folder_get_msg_async (folder, header, get_msg_async_cb, get_msg_status_cb, info);
+
+               g_object_unref (header);
+               g_object_unref (folder);
+       } else {
+               g_warning ("%s: finished != TRUE but no messages left", __FUNCTION__);
+       }
 }
 
 void 
@@ -2207,8 +2237,8 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self,
 
        /* Get account and set it into mail_operation */
        if (tny_list_get_length (header_list) >= 1) {
-               iter = tny_list_create_iterator (header_list);
-               TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
+               TnyIterator *iterator = tny_list_create_iterator (header_list);
+               TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iterator));
                if (header) {
                        TnyFolder *folder = tny_header_get_folder (header);
                        if (folder) {           
@@ -2217,18 +2247,14 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self,
                        }
                        g_object_unref (header);
                }
-
-               if (tny_list_get_length (header_list) == 1) {
-                       g_object_unref (iter);
-                       iter = NULL;
-               }
+               g_object_unref (iterator);
        }
 
        msg_list_size = compute_message_list_size (header_list);
 
        modest_mail_operation_notify_start (self);
        iter = tny_list_create_iterator (header_list);
-       while (!tny_iterator_is_done (iter)) {
+       if (!tny_iterator_is_done (iter)) {
                /* notify about the start of the operation */
                ModestMailOperationState *state;
                state = modest_mail_operation_clone_state (self);
@@ -2245,6 +2271,7 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self,
                msg_info = g_slice_new0 (GetMsgInfo);
                msg_info->mail_op = g_object_ref (self);
                msg_info->header = g_object_ref (header);
+               msg_info->iter = g_object_ref (iter);
                msg_info->user_callback = user_callback;
                msg_info->user_data = user_data;
                msg_info->destroy_notify = notify;
@@ -2258,7 +2285,7 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self,
                /* Free and go on */
                g_object_unref (header);
                g_object_unref (folder);
-               tny_iterator_next (iter);
+               g_slice_free (ModestMailOperationState, state);
        }
        g_object_unref (iter);
 }