[evolution-data-server] Bug #655433 - Drag and Drop of messages out of Junk folder broken



commit 34eac457160ad0df853aedee684c934bf9724aaa
Author: Milan Crha <mcrha redhat com>
Date:   Fri Sep 2 15:11:27 2011 +0200

    Bug #655433 - Drag and Drop of messages out of Junk folder broken

 camel/camel-folder.c                         |    8 +++++-
 camel/camel-store.c                          |    2 -
 camel/camel-vtrash-folder.c                  |   31 ++++++++++++++++++++++++++
 camel/providers/local/camel-maildir-folder.c |    6 +++++
 4 files changed, 43 insertions(+), 4 deletions(-)
---
diff --git a/camel/camel-folder.c b/camel/camel-folder.c
index 55696d5..7785144 100644
--- a/camel/camel-folder.c
+++ b/camel/camel-folder.c
@@ -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,
diff --git a/camel/camel-store.c b/camel/camel-store.c
index 4b9a998..d06bc18 100644
--- a/camel/camel-store.c
+++ b/camel/camel-store.c
@@ -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,
diff --git a/camel/camel-vtrash-folder.c b/camel/camel-vtrash-folder.c
index 95f604d..088fa1a 100644
--- a/camel/camel-vtrash-folder.c
+++ b/camel/camel-vtrash-folder.c
@@ -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;
 }
 
diff --git a/camel/providers/local/camel-maildir-folder.c b/camel/providers/local/camel-maildir-folder.c
index ec97c7b..20bb2e6 100644
--- a/camel/providers/local/camel-maildir-folder.c
+++ b/camel/providers/local/camel-maildir-folder.c
@@ -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));



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]