* Call tny_header_set_flag() with just one flag in each call
[modest] / src / modest-mail-operation.c
index b24c4f0..315cf74 100644 (file)
@@ -663,18 +663,15 @@ create_msg_thread (gpointer thread_data)
 
        if (new_msg) {
                TnyHeader *header;
-               TnyHeaderFlags flags = 0;
 
                /* Set priority flags in message */
                header = tny_msg_get_header (new_msg);
-               if (info->priority_flags != 0)
-                       flags |= info->priority_flags;
+               tny_header_set_flag (header, info->priority_flags);
 
                /* Set attachment flags in message */
                if (info->attachments_list != NULL)
-                       flags |= TNY_HEADER_FLAG_ATTACHMENTS;
+                       tny_header_set_flag (header, TNY_HEADER_FLAG_ATTACHMENTS);
 
-               tny_header_set_flag (header, flags);
                g_object_unref (G_OBJECT(header));
        } else {
                priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
@@ -971,7 +968,7 @@ modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self,
        if (!priv->error) {
                SaveToDraftsAddMsgInfo *cb_info = g_slice_new(SaveToDraftsAddMsgInfo);
                cb_info->transport_account = g_object_ref(info->transport_account);
-               cb_info->draft_msg = g_object_ref(info->draft_msg);
+               cb_info->draft_msg = info->draft_msg ? g_object_ref(info->draft_msg) : NULL;
                cb_info->callback = info->callback;
                cb_info->user_data = info->user_data;
                cb_info->drafts = g_object_ref(drafts);
@@ -2339,16 +2336,11 @@ modest_mail_operation_remove_msg (ModestMailOperation *self,
 
                modest_mail_operation_notify_start (self);
 
-               if (TNY_IS_CAMEL_IMAP_FOLDER (folder))
-/*                     tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* FALSE --> don't expunge *\/ */
-                       tny_folder_sync (folder, FALSE, &(priv->error)); /* FALSE --> don't expunge */
-               else if (TNY_IS_CAMEL_POP_FOLDER (folder))
-/*                     tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* TRUE --> dont expunge *\/ */
-                       tny_folder_sync (folder, TRUE, &(priv->error)); /* TRUE --> expunge */
+               if (TNY_IS_CAMEL_IMAP_FOLDER (folder) ||
+                   TNY_IS_CAMEL_POP_FOLDER (folder))
+                       tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /* FALSE --> dont expunge */
                else
-                       /* local folders */
-/*                     tny_folder_sync_async(folder, TRUE, NULL, NULL, NULL); /\* TRUE --> expunge *\/ */
-                       tny_folder_sync (folder, TRUE, &(priv->error)); /* TRUE --> expunge */
+                       tny_folder_sync_async(folder, TRUE, NULL, NULL, NULL); /* TRUE --> expunge */
        }
        
        
@@ -2374,6 +2366,8 @@ modest_mail_operation_remove_msgs (ModestMailOperation *self,
        ModestMailOperationPrivate *priv;
        TnyIterator *iter = NULL;
        TnyHeader *header = NULL;
+       TnyList *remove_headers = NULL;
+       TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN;
 
        g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
        g_return_if_fail (TNY_IS_LIST (headers));
@@ -2383,11 +2377,44 @@ modest_mail_operation_remove_msgs (ModestMailOperation *self,
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
 
+       remove_headers = g_object_ref(headers);
+
        /* Get folder from first header and sync it */
        iter = tny_list_create_iterator (headers);
        header = TNY_HEADER (tny_iterator_get_current (iter));
        folder = tny_header_get_folder (header);
-       
+
+       /* Don't remove messages that are being sent */
+       if (modest_tny_folder_is_local_folder (folder)) {
+               folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
+       }
+       if (folder_type == TNY_FOLDER_TYPE_OUTBOX) {
+               TnyTransportAccount *traccount = NULL;
+               ModestTnyAccountStore *accstore = modest_runtime_get_account_store();
+               traccount = modest_tny_account_store_get_transport_account_from_outbox_header(accstore, header);
+               if (traccount) {
+                       ModestTnySendQueueStatus status;
+                       ModestTnySendQueue *send_queue = modest_runtime_get_send_queue(traccount);
+                       TnyIterator *iter = tny_list_create_iterator(headers);
+                       g_object_unref(remove_headers);
+                       remove_headers = TNY_LIST(tny_simple_list_new());
+                       while (!tny_iterator_is_done(iter)) {
+                               char *msg_id;
+                               TnyHeader *hdr = TNY_HEADER(tny_iterator_get_current(iter));
+                               msg_id = modest_tny_send_queue_get_msg_id (hdr);
+                               status = modest_tny_send_queue_get_msg_status(send_queue, msg_id);
+                               if (status != MODEST_TNY_SEND_QUEUE_SENDING) {
+                                       tny_list_append(remove_headers, G_OBJECT(hdr));
+                               }
+                               g_object_unref(hdr);
+                               g_free(msg_id);
+                               tny_iterator_next(iter);
+                       }
+                       g_object_unref(iter);
+                       g_object_unref(traccount);
+               }
+       }
+
        /* Get account and set it into mail_operation */
        priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder));
        priv->op_type = MODEST_MAIL_OPERATION_TYPE_DELETE;
@@ -2396,7 +2423,7 @@ modest_mail_operation_remove_msgs (ModestMailOperation *self,
        /* remove message from folder */
        modest_mail_operation_notify_start (self);
 
-       tny_folder_remove_msgs (folder, headers, &(priv->error));
+       tny_folder_remove_msgs (folder, remove_headers, &(priv->error));
        if (!priv->error) {
                if (TNY_IS_CAMEL_IMAP_FOLDER (folder) || 
                    TNY_IS_CAMEL_POP_FOLDER (folder))
@@ -2414,6 +2441,7 @@ modest_mail_operation_remove_msgs (ModestMailOperation *self,
                priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
 
        /* Free */
+       g_object_unref (remove_headers);
        g_object_unref (header);
        g_object_unref (iter);
        g_object_unref (G_OBJECT (folder));
@@ -2808,7 +2836,6 @@ modest_mail_operation_notify_start (ModestMailOperation *self)
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
 
        /* Ensure that all the fields are filled correctly */
-       g_return_if_fail (priv->account != NULL);
        g_return_if_fail (priv->op_type != MODEST_MAIL_OPERATION_TYPE_UNKNOWN);
 
        /* Notify the observers about the mail operation. We do not
@@ -2855,3 +2882,21 @@ modest_mail_operation_get_account (ModestMailOperation *self)
 
        return (priv->account) ? g_object_ref (priv->account) : NULL;
 }
+
+void
+modest_mail_operation_noop (ModestMailOperation *self)
+{
+       ModestMailOperationPrivate *priv = NULL;
+
+       g_return_if_fail (self);
+
+       priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
+       priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+       priv->op_type = MODEST_MAIL_OPERATION_TYPE_INFO;
+       priv->done = 0;
+       priv->total = 0;
+
+       /* This mail operation does nothing actually */
+       modest_mail_operation_notify_start (self);
+       modest_mail_operation_notify_end (self);
+}