diff options
author | Milan Crha <mcrha@redhat.com> | 2015-08-31 21:15:15 +0200 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2015-08-31 21:15:15 +0200 |
commit | 548c81c00e6d3d25f98185455593e6c5d630c9a1 (patch) | |
tree | 452d0e3a1c17abc850bcbc4930bad639ece1e594 | |
parent | d376307831a623ababe82602cfa6602bdd8335c0 (diff) | |
download | evolution-data-server-548c81c00e6d3d25f98185455593e6c5d630c9a1.tar.gz |
Bug 402843 - Remove Junk/Deleted flag when moving out of real Junk/Trash folder
-rw-r--r-- | camel/providers/imapx/camel-imapx-server.c | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c index 2f77b2b74..6def01008 100644 --- a/camel/providers/imapx/camel-imapx-server.c +++ b/camel/providers/imapx/camel-imapx-server.c @@ -305,6 +305,8 @@ struct _CamelIMAPXServerPrivate { CamelFolder *fetch_changes_folder; /* not referenced */ GHashTable *fetch_changes_infos; /* gchar *uid ~> FetchChangesInfo-s */ gint64 fetch_changes_last_progress; /* when was called last progress */ + + struct _status_info *copyuid_status; }; enum { @@ -1793,11 +1795,17 @@ imapx_untagged_ok_no_bad (CamelIMAPXServer *is, imapx_server_stash_command_arguments (is); } break; + case IMAPX_COPYUID: + imapx_free_status (is->priv->copyuid_status); + is->priv->copyuid_status = is->priv->context->sinfo; + is->priv->context->sinfo = NULL; + break; default: break; } imapx_free_status (is->priv->context->sinfo); + is->priv->context->sinfo = NULL; return TRUE; } @@ -3229,6 +3237,7 @@ imapx_server_finalize (GObject *object) g_mutex_clear (&is->priv->select_lock); camel_folder_change_info_free (is->priv->changes); + imapx_free_status (is->priv->copyuid_status); g_free (is->priv->context); g_hash_table_destroy (is->priv->untagged_handlers); @@ -3332,6 +3341,7 @@ camel_imapx_server_init (CamelIMAPXServer *is) is->priv->state = IMAPX_DISCONNECTED; is->priv->is_cyrus = FALSE; + is->priv->copyuid_status = NULL; is->priv->changes = camel_folder_change_info_new (); @@ -4082,6 +4092,8 @@ camel_imapx_server_copy_message_sync (CamelIMAPXServer *is, gboolean use_move_command = FALSE; CamelIMAPXCommand *ic; CamelFolder *folder; + GHashTable *source_infos; + gboolean remove_junk_flags; gboolean success = TRUE; g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); @@ -4102,6 +4114,9 @@ camel_imapx_server_copy_message_sync (CamelIMAPXServer *is, folder = imapx_server_ref_folder (is, mailbox); g_return_val_if_fail (folder != NULL, FALSE); + remove_deleted_flags = remove_deleted_flags || (folder->folder_flags & CAMEL_FOLDER_IS_TRASH) != 0; + remove_junk_flags = (folder->folder_flags & CAMEL_FOLDER_IS_JUNK) != 0; + /* If we're moving messages, prefer "UID MOVE" if supported. */ if (delete_originals) { if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, MOVE)) { @@ -4110,10 +4125,14 @@ camel_imapx_server_copy_message_sync (CamelIMAPXServer *is, } } + source_infos = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, camel_message_info_unref); data_uids = g_ptr_array_new (); for (ii = 0; ii < uids->len; ii++) { - g_ptr_array_add (data_uids, (gpointer) camel_pstring_strdup (uids->pdata[ii])); + gchar *uid = (gchar *) camel_pstring_strdup (uids->pdata[ii]); + + g_ptr_array_add (data_uids, uid); + g_hash_table_insert (source_infos, uid, camel_folder_summary_get (folder->summary, uid)); } g_ptr_array_sort (data_uids, (GCompareFunc) imapx_uids_array_cmp); @@ -4143,13 +4162,17 @@ camel_imapx_server_copy_message_sync (CamelIMAPXServer *is, camel_imapx_command_add (ic, " %M", destination); + imapx_free_status (is->priv->copyuid_status); + is->priv->copyuid_status = NULL; + success = camel_imapx_server_process_command_sync (is, ic, use_move_command ? _("Error moving messages") : _("Error copying messages"), cancellable, error); if (success) { - if (ic->status && ic->status->u.copyuid.uids && ic->status->u.copyuid.copied_uids && - ic->status->u.copyuid.uids->len == ic->status->u.copyuid.copied_uids->len) { + if (is->priv->copyuid_status && is->priv->copyuid_status->u.copyuid.uids && + is->priv->copyuid_status->u.copyuid.copied_uids && + is->priv->copyuid_status->u.copyuid.uids->len == is->priv->copyuid_status->u.copyuid.copied_uids->len) { CamelFolder *destination_folder; destination_folder = imapx_server_ref_folder (is, destination); @@ -4160,18 +4183,18 @@ camel_imapx_server_copy_message_sync (CamelIMAPXServer *is, changes = camel_folder_change_info_new (); - for (ii = 0; ii < ic->status->u.copyuid.uids->len; ii++) { + for (ii = 0; ii < is->priv->copyuid_status->u.copyuid.uids->len; ii++) { gchar *uid; gboolean is_new = FALSE; - uid = g_strdup_printf ("%d", g_array_index (ic->status->u.copyuid.uids, guint32, ii)); - source_info = camel_folder_summary_get (folder->summary, uid); + uid = g_strdup_printf ("%d", g_array_index (is->priv->copyuid_status->u.copyuid.uids, guint32, ii)); + source_info = g_hash_table_lookup (source_infos, uid); g_free (uid); if (!source_info) continue; - uid = g_strdup_printf ("%d", g_array_index (ic->status->u.copyuid.copied_uids, guint32, ii)); + uid = g_strdup_printf ("%d", g_array_index (is->priv->copyuid_status->u.copyuid.copied_uids, guint32, ii)); destination_info = camel_folder_summary_get (folder->summary, uid); if (!destination_info) { @@ -4193,6 +4216,8 @@ camel_imapx_server_copy_message_sync (CamelIMAPXServer *is, camel_imapx_mailbox_get_permanentflags (destination)); if (remove_deleted_flags) camel_message_info_set_flags (destination_info, CAMEL_MESSAGE_DELETED, 0); + if (remove_junk_flags) + camel_message_info_set_flags (destination_info, CAMEL_MESSAGE_JUNK, 0); if (is_new) camel_folder_summary_add (destination_folder->summary, destination_info); camel_folder_change_info_add_uid (changes, destination_info->uid); @@ -4247,9 +4272,13 @@ camel_imapx_server_copy_message_sync (CamelIMAPXServer *is, } } + imapx_free_status (is->priv->copyuid_status); + is->priv->copyuid_status = NULL; + camel_imapx_command_unref (ic); } + g_hash_table_destroy (source_infos); g_ptr_array_foreach (data_uids, (GFunc) camel_pstring_free, NULL); g_ptr_array_free (data_uids, TRUE); g_object_unref (folder); |