summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2015-09-07 18:20:39 +0200
committerMilan Crha <mcrha@redhat.com>2015-09-07 18:20:39 +0200
commit73d0803774e3557bd0dc38a825b11f873c0bd5f3 (patch)
treebeeb65cb1c384a9e255269841883070428507e96
parentaf16040ed2c27616c9607ac4bfb96335de2af51a (diff)
downloadevolution-data-server-73d0803774e3557bd0dc38a825b11f873c0bd5f3.tar.gz
[IMAPx] Move to real Trash keeps original message with UID COPY
Due to the \Deleted flag not being stored in the original folder, the following EXPUNGE didn't delete the copied message from the server, thus the next enter of the folder the message was back. Reported downstream as: https://bugzilla.redhat.com/show_bug.cgi?id=1260416
-rw-r--r--camel/providers/imapx/camel-imapx-conn-manager.c46
-rw-r--r--camel/providers/imapx/camel-imapx-server.c75
-rw-r--r--camel/providers/imapx/camel-imapx-server.h1
3 files changed, 84 insertions, 38 deletions
diff --git a/camel/providers/imapx/camel-imapx-conn-manager.c b/camel/providers/imapx/camel-imapx-conn-manager.c
index 49598d9d3..d708a30d9 100644
--- a/camel/providers/imapx/camel-imapx-conn-manager.c
+++ b/camel/providers/imapx/camel-imapx-conn-manager.c
@@ -1414,7 +1414,7 @@ imapx_conn_manager_sync_changes_run_sync (CamelIMAPXJob *job,
{
CamelIMAPXMailbox *mailbox;
GError *local_error = NULL;
- gboolean success;
+ gboolean can_influence_flags, success;
g_return_val_if_fail (job != NULL, FALSE);
g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE);
@@ -1422,7 +1422,9 @@ imapx_conn_manager_sync_changes_run_sync (CamelIMAPXJob *job,
mailbox = camel_imapx_job_get_mailbox (job);
g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE);
- success = camel_imapx_server_sync_changes_sync (server, mailbox, cancellable, &local_error);
+ can_influence_flags = GPOINTER_TO_INT (camel_imapx_job_get_user_data (job)) == 1;
+
+ success = camel_imapx_server_sync_changes_sync (server, mailbox, can_influence_flags, cancellable, &local_error);
camel_imapx_job_set_result (job, success, NULL, local_error, NULL);
@@ -1432,6 +1434,25 @@ imapx_conn_manager_sync_changes_run_sync (CamelIMAPXJob *job,
return success;
}
+static gboolean
+imapx_conn_manager_sync_changes_matches (CamelIMAPXJob *job,
+ CamelIMAPXJob *other_job)
+{
+ gboolean job_can_influence_flags, other_job_can_influence_flags;
+
+ g_return_val_if_fail (job != NULL, FALSE);
+ g_return_val_if_fail (other_job != NULL, FALSE);
+
+ if (camel_imapx_job_get_kind (job) != CAMEL_IMAPX_JOB_SYNC_CHANGES ||
+ camel_imapx_job_get_kind (job) != camel_imapx_job_get_kind (other_job))
+ return FALSE;
+
+ job_can_influence_flags = GPOINTER_TO_INT (camel_imapx_job_get_user_data (job)) == 1;
+ other_job_can_influence_flags = GPOINTER_TO_INT (camel_imapx_job_get_user_data (other_job)) == 1;
+
+ return job_can_influence_flags == other_job_can_influence_flags;
+}
+
gboolean
camel_imapx_conn_manager_sync_changes_sync (CamelIMAPXConnManager *conn_man,
CamelIMAPXMailbox *mailbox,
@@ -1446,7 +1467,11 @@ camel_imapx_conn_manager_sync_changes_sync (CamelIMAPXConnManager *conn_man,
g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE);
job = camel_imapx_job_new (CAMEL_IMAPX_JOB_SYNC_CHANGES, mailbox,
- imapx_conn_manager_sync_changes_run_sync, NULL, NULL);
+ imapx_conn_manager_sync_changes_run_sync,
+ imapx_conn_manager_sync_changes_matches, NULL);
+
+ /* Skip store of the \Deleted flag */
+ camel_imapx_job_set_user_data (job, GINT_TO_POINTER (1), NULL);
success = camel_imapx_conn_manager_run_job_sync (conn_man, job,
imapx_conn_manager_matches_sync_changes_or_refresh_info,
@@ -1475,6 +1500,19 @@ camel_imapx_conn_manager_sync_changes_sync (CamelIMAPXConnManager *conn_man,
}
if (success && expunge) {
+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_SYNC_CHANGES, mailbox,
+ imapx_conn_manager_sync_changes_run_sync,
+ imapx_conn_manager_sync_changes_matches, NULL);
+
+ /* Store also the \Deleted flag */
+ camel_imapx_job_set_user_data (job, GINT_TO_POINTER (0), NULL);
+
+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job,
+ imapx_conn_manager_matches_sync_changes_or_refresh_info,
+ cancellable, error);
+
+ camel_imapx_job_unref (job);
+
success = imapx_conn_manager_expunge_sync (conn_man, mailbox, TRUE, cancellable, error);
}
@@ -1509,7 +1547,7 @@ imapx_conn_manager_expunge_run_sync (CamelIMAPXJob *job,
return success;
}
-gboolean
+static gboolean
imapx_conn_manager_expunge_sync (CamelIMAPXConnManager *conn_man,
CamelIMAPXMailbox *mailbox,
gboolean skip_sync_changes,
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index c40d8affa..6f74fc021 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -5015,6 +5015,7 @@ imapx_server_info_changed_cb (CamelIMAPXSummary *summary,
gboolean
camel_imapx_server_sync_changes_sync (CamelIMAPXServer *is,
CamelIMAPXMailbox *mailbox,
+ gboolean can_influence_flags,
GCancellable *cancellable,
GError **error)
{
@@ -5023,14 +5024,13 @@ camel_imapx_server_sync_changes_sync (CamelIMAPXServer *is,
GArray *on_user = NULL, *off_user = NULL;
CamelFolder *folder;
CamelIMAPXMessageInfo *info;
- CamelIMAPXSettings *settings;
GHashTable *changed_meanwhile;
gulong changed_meanwhile_handler_id;
guint32 permanentflags;
struct _uidset_state uidset;
gint unread_change = 0;
- gboolean use_real_junk_path;
- gboolean use_real_trash_path;
+ gboolean use_real_junk_path = FALSE;
+ gboolean use_real_trash_path = FALSE;
gboolean remove_deleted_flags = FALSE;
gboolean nothing_to_do;
gboolean success;
@@ -5063,36 +5063,38 @@ camel_imapx_server_sync_changes_sync (CamelIMAPXServer *is,
changed_meanwhile_handler_id = g_signal_connect (folder->summary, "info-changed",
G_CALLBACK (imapx_server_info_changed_cb), changed_meanwhile);
- settings = camel_imapx_server_ref_settings (is);
- use_real_junk_path = camel_imapx_settings_get_use_real_junk_path (settings);
- use_real_trash_path = camel_imapx_settings_get_use_real_trash_path (settings);
- if (use_real_trash_path) {
- CamelFolder *trash_folder = NULL;
- gchar *real_trash_path;
+ if (can_influence_flags) {
+ CamelIMAPXSettings *settings;
+
+ settings = camel_imapx_server_ref_settings (is);
+ use_real_junk_path = camel_imapx_settings_get_use_real_junk_path (settings);
+ use_real_trash_path = camel_imapx_settings_get_use_real_trash_path (settings);
+ if (use_real_trash_path) {
+ CamelFolder *trash_folder = NULL;
+ gchar *real_trash_path;
- real_trash_path = camel_imapx_settings_dup_real_trash_path (settings);
- if (real_trash_path)
- trash_folder = camel_store_get_folder_sync (
- camel_folder_get_parent_store (folder),
- real_trash_path, 0, cancellable, NULL);
+ real_trash_path = camel_imapx_settings_dup_real_trash_path (settings);
+ if (real_trash_path)
+ trash_folder = camel_store_get_folder_sync (
+ camel_folder_get_parent_store (folder),
+ real_trash_path, 0, cancellable, NULL);
- /* Remove deleted flags in all but the trash folder itself */
- remove_deleted_flags = !trash_folder || trash_folder != folder;
+ /* Remove deleted flags in all but the trash folder itself */
+ remove_deleted_flags = !trash_folder || trash_folder != folder;
- use_real_trash_path = trash_folder != NULL;
+ use_real_trash_path = trash_folder != NULL;
- g_clear_object (&trash_folder);
- g_free (real_trash_path);
+ g_clear_object (&trash_folder);
+ g_free (real_trash_path);
+ }
+ g_object_unref (settings);
}
- g_object_unref (settings);
off_orset = on_orset = 0;
for (i = 0; i < changed_uids->len; i++) {
guint32 flags, sflags;
CamelFlag *uflags, *suflags;
const gchar *uid;
- gboolean move_to_real_junk;
- gboolean move_to_real_trash;
guint j = 0;
uid = g_ptr_array_index (changed_uids, i);
@@ -5111,21 +5113,26 @@ camel_imapx_server_sync_changes_sync (CamelIMAPXServer *is,
flags = info->info.flags & CAMEL_IMAPX_SERVER_FLAGS;
sflags = info->server_flags & CAMEL_IMAPX_SERVER_FLAGS;
- move_to_real_junk =
- use_real_junk_path &&
- (flags & CAMEL_MESSAGE_JUNK);
+ if (can_influence_flags) {
+ gboolean move_to_real_junk;
+ gboolean move_to_real_trash;
- move_to_real_trash =
- use_real_trash_path && remove_deleted_flags &&
- (flags & CAMEL_MESSAGE_DELETED);
+ move_to_real_junk =
+ use_real_junk_path &&
+ (flags & CAMEL_MESSAGE_JUNK);
- if (move_to_real_junk)
- camel_imapx_folder_add_move_to_real_junk (
- CAMEL_IMAPX_FOLDER (folder), uid);
+ move_to_real_trash =
+ use_real_trash_path && remove_deleted_flags &&
+ (flags & CAMEL_MESSAGE_DELETED);
- if (move_to_real_trash)
- camel_imapx_folder_add_move_to_real_trash (
- CAMEL_IMAPX_FOLDER (folder), uid);
+ if (move_to_real_junk)
+ camel_imapx_folder_add_move_to_real_junk (
+ CAMEL_IMAPX_FOLDER (folder), uid);
+
+ if (move_to_real_trash)
+ camel_imapx_folder_add_move_to_real_trash (
+ CAMEL_IMAPX_FOLDER (folder), uid);
+ }
if (flags != sflags) {
off_orset |= (flags ^ sflags) & ~flags;
diff --git a/camel/providers/imapx/camel-imapx-server.h b/camel/providers/imapx/camel-imapx-server.h
index 45823dd72..e617ea2fd 100644
--- a/camel/providers/imapx/camel-imapx-server.h
+++ b/camel/providers/imapx/camel-imapx-server.h
@@ -188,6 +188,7 @@ gboolean camel_imapx_server_refresh_info_sync
gboolean camel_imapx_server_sync_changes_sync
(CamelIMAPXServer *is,
CamelIMAPXMailbox *mailbox,
+ gboolean can_influence_flags,
GCancellable *cancellable,
GError **error);
gboolean camel_imapx_server_expunge_sync (CamelIMAPXServer *is,