[evolution-data-server] Bug #655433 - Drag and Drop of messages out of Junk folder broken
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Bug #655433 - Drag and Drop of messages out of Junk folder broken
- Date: Fri, 2 Sep 2011 13:12:16 +0000 (UTC)
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]