[evolution-data-server] Bug 654480 - [imapx] Mark as Junk is not reliable
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Bug 654480 - [imapx] Mark as Junk is not reliable
- Date: Sun, 24 Jul 2011 16:40:30 +0000 (UTC)
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]