Bug #655433 - Drag and Drop of messages out of Junk folder broken
authorMilan Crha <mcrha@redhat.com>
Fri, 2 Sep 2011 13:11:27 +0000 (15:11 +0200)
committerMilan Crha <mcrha@redhat.com>
Fri, 2 Sep 2011 13:12:04 +0000 (15:12 +0200)
camel/camel-folder.c
camel/camel-store.c
camel/camel-vtrash-folder.c
camel/providers/local/camel-maildir-folder.c

index 55696d5..7785144 100644 (file)
@@ -408,8 +408,12 @@ folder_transfer_message_to (CamelFolder *source,
        } else
                info = camel_message_info_new_from_header (NULL, ((CamelMimePart *) msg)->headers);
 
-       /* FIXME decide this based on the source folder */
-//     camel_message_info_set_flags (info, CAMEL_MESSAGE_DELETED, 0);
+       /* unset deleted flag when transferring from trash folder */
+       if ((source->folder_flags & CAMEL_FOLDER_IS_TRASH) != 0)
+               camel_message_info_set_flags (info, CAMEL_MESSAGE_DELETED, 0);
+       /* unset junk flag when transferring from junk folder */
+       if ((source->folder_flags & CAMEL_FOLDER_IS_JUNK) != 0)
+               camel_message_info_set_flags (info, CAMEL_MESSAGE_JUNK, 0);
 
        camel_folder_append_message_sync (
                dest, msg, info, transferred_uid,
index 4b9a998..d06bc18 100644 (file)
@@ -1862,14 +1862,12 @@ camel_store_get_folder_sync (CamelStore *store,
                        CAMEL_CHECK_GERROR (
                                store, get_trash_folder_sync,
                                folder != NULL, error);
-
                } else if (folder_name_is_vjunk) {
                        folder = class->get_junk_folder_sync (
                                store, cancellable, error);
                        CAMEL_CHECK_GERROR (
                                store, get_junk_folder_sync,
                                folder != NULL, error);
-
                } else {
                        folder = class->get_folder_sync (
                                store, folder_name, flags,
index 95f604d..088fa1a 100644 (file)
@@ -57,6 +57,10 @@ struct _transfer_data {
        CamelFolder *dest;
        GPtrArray *uids;
        gboolean delete;
+
+       CamelFolder *source_folder;
+       GPtrArray *source_uids;
+       guint32 sbit;
 };
 
 G_DEFINE_TYPE (CamelVTrashFolder, camel_vtrash_folder, CAMEL_TYPE_VEE_FOLDER)
@@ -75,10 +79,22 @@ transfer_messages (CamelFolder *folder,
        if (md->cancellable != NULL)
                g_object_unref (md->cancellable);
 
+       /* set the bit back */
+       for (i = 0; i < md->source_uids->len; i++) {
+               CamelMessageInfo *mi = camel_folder_get_message_info (md->source_folder, md->source_uids->pdata[i]);
+               if (mi) {
+                       camel_message_info_set_flags (mi, md->sbit, md->sbit);
+                       camel_folder_free_message_info (md->source_folder, mi);
+               }
+       }
+
+       camel_folder_thaw (md->folder);
+
        for (i=0;i<md->uids->len;i++)
                g_free (md->uids->pdata[i]);
 
        g_ptr_array_free (md->uids, TRUE);
+       g_ptr_array_free (md->source_uids, TRUE);
        g_object_unref (md->folder);
        g_free (md);
 }
@@ -145,6 +161,9 @@ vtrash_folder_transfer_messages_to_sync (CamelFolder *source,
         * Need to check this uid by uid, but we batch up the copies.
         */
 
+       camel_folder_freeze (source);
+       camel_folder_freeze (dest);
+
        for (i = 0; i < uids->len; i++) {
                mi = (CamelVeeMessageInfo *) camel_folder_get_message_info (source, uids->pdata[i]);
                if (mi == NULL) {
@@ -166,15 +185,24 @@ vtrash_folder_transfer_messages_to_sync (CamelFolder *source,
                                md->folder = g_object_ref (mi->summary->folder);
                                md->uids = g_ptr_array_new ();
                                md->dest = dest;
+                               md->delete = delete_originals;
+                               md->source_folder = source;
+                               md->source_uids = g_ptr_array_new ();
+                               md->sbit = sbit;
                                if (cancellable != NULL)
                                        g_object_ref (cancellable);
+                               camel_folder_freeze (md->folder);
                                g_hash_table_insert (batch, mi->summary->folder, md);
                        }
 
+                       /* unset the bit temporarily */
+                       camel_message_info_set_flags ((CamelMessageInfo *) mi, sbit, 0);
+
                        tuid = uids->pdata[i];
                        if (strlen (tuid)>8)
                                tuid += 8;
                        g_ptr_array_add (md->uids, g_strdup (tuid));
+                       g_ptr_array_add (md->source_uids, uids->pdata[i]);
                }
                camel_folder_free_message_info (source, (CamelMessageInfo *) mi);
        }
@@ -184,6 +212,9 @@ vtrash_folder_transfer_messages_to_sync (CamelFolder *source,
                g_hash_table_destroy (batch);
        }
 
+       camel_folder_thaw (dest);
+       camel_folder_thaw (source);
+
        return TRUE;
 }
 
index ec97c7b..20bb2e6 100644 (file)
@@ -359,6 +359,12 @@ maildir_folder_transfer_messages_to_sync (CamelFolder *source,
                                clone = camel_message_info_clone (info);
                                clone->summary = dest->summary;
                                camel_maildir_info_set_filename (clone, g_strdup (new_filename));
+                               /* unset deleted flag when transferring from trash folder */
+                               if ((source->folder_flags & CAMEL_FOLDER_IS_TRASH) != 0)
+                                       camel_message_info_set_flags (info, CAMEL_MESSAGE_DELETED, 0);
+                               /* unset junk flag when transferring from junk folder */
+                               if ((source->folder_flags & CAMEL_FOLDER_IS_JUNK) != 0)
+                                       camel_message_info_set_flags (info, CAMEL_MESSAGE_JUNK, 0);
                                camel_folder_summary_add (dest->summary, clone);
 
                                camel_folder_change_info_add_uid (df->changes, camel_message_info_uid (clone));