[evolution-data-server] Bug 654480 - [imapx] Mark as Junk is not reliable



commit 9538392df91ea9c46c1598feab01460951c5176e
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Jul 24 11:34:42 2011 -0500

    Bug 654480 - [imapx] Mark as Junk is not reliable
    
    When comparing server-side message flags to local flags, disregard
    non-permanent flags that appear to have been cleared on the server.
    
    This solves the problem of IMAP servers not storing junk-related flags
    permanently, then when we synchronize message flags with the server, our
    local junk-related flags (which -are- stored permanently) get clobbered.

 camel/providers/imapx/camel-imapx-server.c |    4 ++--
 camel/providers/imapx/camel-imapx-utils.c  |    8 +++++++-
 camel/providers/imapx/camel-imapx-utils.h  |    2 +-
 3 files changed, 10 insertions(+), 4 deletions(-)
---
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index ae6f983..1563bb3 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -1528,7 +1528,7 @@ imapx_untagged (CamelIMAPXServer *imap,
 					if (mi) {
 						/* It's unsolicited _unless_ imap->select_pending (i.e. during
 						   a QRESYNC SELECT */
-						changed = imapx_update_message_info_flags (mi, finfo->flags, finfo->user_flags, folder, !imap->select_pending);
+						changed = imapx_update_message_info_flags (mi, finfo->flags, finfo->user_flags, imap->permanentflags, folder, !imap->select_pending);
 					} else {
 						/* This (UID + FLAGS for previously unknown message) might
 						   happen during a SELECT (QRESYNC). We should use it. */
@@ -3866,7 +3866,7 @@ imapx_job_scan_changes_done (CamelIMAPXServer *is,
 			if (s_minfo && uid_cmp (s_minfo->uid, r->uid, s) == 0) {
 				info = (CamelIMAPXMessageInfo *) s_minfo;
 
-				if (imapx_update_message_info_flags ((CamelMessageInfo *) info, r->server_flags, r->server_user_flags, job->folder, FALSE))
+				if (imapx_update_message_info_flags ((CamelMessageInfo *) info, r->server_flags, r->server_user_flags, is->permanentflags, job->folder, FALSE))
 					camel_folder_change_info_change_uid (job->u.refresh_info.changes, camel_message_info_uid (s_minfo));
 				r->exists = TRUE;
 			} else
diff --git a/camel/providers/imapx/camel-imapx-utils.c b/camel/providers/imapx/camel-imapx-utils.c
index 82ed237..91aa429 100644
--- a/camel/providers/imapx/camel-imapx-utils.c
+++ b/camel/providers/imapx/camel-imapx-utils.c
@@ -252,7 +252,7 @@ imapx_update_user_flags (CamelMessageInfo *info, CamelFlag *server_user_flags)
 }
 
 gboolean
-imapx_update_message_info_flags (CamelMessageInfo *info, guint32 server_flags, CamelFlag *server_user_flags, CamelFolder *folder, gboolean unsolicited)
+imapx_update_message_info_flags (CamelMessageInfo *info, guint32 server_flags, CamelFlag *server_user_flags, guint32 permanent_flags, CamelFolder *folder, gboolean unsolicited)
 {
 	gboolean changed = FALSE;
 	CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) folder;
@@ -266,6 +266,12 @@ imapx_update_message_info_flags (CamelMessageInfo *info, guint32 server_flags, C
 		server_set = server_flags & ~xinfo->server_flags;
 		server_cleared = xinfo->server_flags & ~server_flags;
 
+		/* Don't clear non-permanent server-side flags.
+		 * This avoids overwriting local flags that we
+		 * do store permanently, such as junk flags. */
+		if (permanent_flags > 0)
+			server_cleared &= permanent_flags;
+
 		if (server_set & CAMEL_MESSAGE_SEEN)
 			read = 1;
 		else if (server_cleared & CAMEL_MESSAGE_SEEN)
diff --git a/camel/providers/imapx/camel-imapx-utils.h b/camel/providers/imapx/camel-imapx-utils.h
index 2568318..6f8c179 100644
--- a/camel/providers/imapx/camel-imapx-utils.h
+++ b/camel/providers/imapx/camel-imapx-utils.h
@@ -86,7 +86,7 @@ enum {
 GPtrArray *imapx_parse_uids (struct _CamelIMAPXStream *is, GCancellable *cancellable, GError **error);
 void imapx_parse_flags (struct _CamelIMAPXStream *stream, guint32 *flagsp, struct _CamelFlag **user_flagsp, GCancellable *cancellable, GError **error);
 void imapx_write_flags (CamelStream *stream, guint32 flags, struct _CamelFlag *user_flags, GCancellable *cancellable, GError **error);
-gboolean imapx_update_message_info_flags (CamelMessageInfo *info, guint32 server_flags, CamelFlag *server_user_flags, CamelFolder *folder, gboolean unsolicited);
+gboolean imapx_update_message_info_flags (CamelMessageInfo *info, guint32 server_flags, CamelFlag *server_user_flags, guint32 permanent_flags, CamelFolder *folder, gboolean unsolicited);
 void imapx_set_message_info_flags_for_new_message (CamelMessageInfo *info, guint32 server_flags, CamelFlag *server_user_flags,
 							CamelFolder *folder);
 void imapx_update_summary_for_removed_message (CamelMessageInfo *info, CamelFolder *folder, gboolean unsolicited);



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