[evolution-patches] imap4 message threading fix
- From: Jeffrey Stedfast <fejj novell com>
- To: evolution-patches gnome org
- Subject: [evolution-patches] imap4 message threading fix
- Date: Fri, 31 Mar 2006 17:14:39 -0500
The following patch is a fix for
http://bugzilla.gnome.org/show_bug.cgi?id=272058
Jeff
--
Jeffrey Stedfast
Evolution Hacker - Novell, Inc.
fejj ximian com - www.novell.com
? 272058.patch
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/providers/imap4/ChangeLog,v
retrieving revision 1.24
diff -u -r1.24 ChangeLog
--- ChangeLog 28 Mar 2006 17:22:42 -0000 1.24
+++ ChangeLog 31 Mar 2006 22:14:14 -0000
@@ -1,3 +1,18 @@
+2006-03-31 Jeffrey Stedfast <fejj novell com>
+
+ Fix for bug #272058
+
+ * camel-imap4-summary.c (untagged_fetch_all): Get the In-Reply-To
+ header too.
+ (decode_envelope): Only decode the ENVELOPE's In-Reply-To field if
+ we don't already have a list of references decoded (e.g. from a
+ header query). Decode the Message-Id value before getting the md5
+ digest so that the format matches the References/In-Reply-To
+ values.
+ (decode_references): Modified to take 2 string args - References
+ and In-Reply-To - so that we can merge the 2 references lists like
+ the default CamelFolderSummary implementation.
+
2006-03-28 Jeffrey Stedfast <fejj novell com>
* camel-imap4-store.c (imap4_reconnect): Only try to authenticate
Index: camel-imap4-summary.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/providers/imap4/camel-imap4-summary.c,v
retrieving revision 1.43
diff -u -r1.43 camel-imap4-summary.c
--- camel-imap4-summary.c 8 Dec 2005 11:09:12 -0000 1.43
+++ camel-imap4-summary.c 31 Mar 2006 22:14:14 -0000
@@ -429,19 +429,32 @@
}
static CamelSummaryReferences *
-decode_references (const char *string, int inreplyto)
+decode_references (const char *refstr, const char *irtstr)
{
- struct _camel_header_references *refs, *r;
+ struct _camel_header_references *refs, *irt, *r;
CamelSummaryReferences *references;
unsigned char md5sum[16];
guint32 i, n;
- if (inreplyto) {
- if (!(refs = camel_header_references_inreplyto_decode (string)))
- return NULL;
- } else {
- if (!(refs = camel_header_references_decode (string)))
- return NULL;
+ refs = camel_header_references_decode (refstr);
+ irt = camel_header_references_inreplyto_decode (irtstr);
+
+ if (!refs && !irt)
+ return NULL;
+
+ if (irt) {
+ /* The References field is populated from the `References' and/or `In-Reply-To'
+ headers. If both headers exist, take the first thing in the In-Reply-To header
+ that looks like a Message-ID, and append it to the References header. */
+
+ if (refs) {
+ r = irt;
+ while (r->next != NULL)
+ r = r->next;
+ r->next = refs;
+ }
+
+ refs = irt;
}
n = camel_header_references_list_size (&refs);
@@ -450,7 +463,7 @@
for (i = 0, r = refs; r != NULL; i++, r = r->next) {
md5_get_digest (r->id, strlen (r->id), md5sum);
- memcpy (references->references[i].id.hash, md5sum, sizeof (references->references[i].id.hash));
+ memcpy (references->references[i].id.hash, md5sum, sizeof (CamelSummaryMessageID));
}
camel_header_references_list_clear (&refs);
@@ -462,9 +475,8 @@
decode_envelope (CamelIMAP4Engine *engine, CamelMessageInfo *info, camel_imap4_token_t *token, CamelException *ex)
{
CamelIMAP4MessageInfo *iinfo = (CamelIMAP4MessageInfo *) info;
- CamelSummaryReferences *refs;
unsigned char md5sum[16];
- char *nstring;
+ char *nstring, *msgid;
if (camel_imap4_engine_next_token (engine, token, ex) == -1)
return -1;
@@ -521,12 +533,8 @@
goto exception;
if (nstring != NULL) {
- refs = decode_references (nstring, TRUE);
-
if (!iinfo->info.references)
- iinfo->info.references = refs;
- else
- g_free (refs);
+ iinfo->info.references = decode_references (NULL, nstring);
g_free (nstring);
}
@@ -536,8 +544,11 @@
goto exception;
if (nstring != NULL) {
- md5_get_digest (nstring, strlen (nstring), md5sum);
- memcpy (iinfo->info.message_id.id.hash, md5sum, sizeof (iinfo->info.message_id.id.hash));
+ if ((msgid = camel_header_msgid_decode (nstring))) {
+ md5_get_digest (msgid, strlen (msgid), md5sum);
+ memcpy (iinfo->info.message_id.id.hash, md5sum, sizeof (CamelSummaryMessageID));
+ g_free (msgid);
+ }
g_free (nstring);
}
@@ -991,7 +1002,7 @@
struct _camel_header_raw *h;
CamelMimeParser *parser;
unsigned char *literal;
- const char *str;
+ const char *refs, *str;
char *mlist;
size_t n;
@@ -1065,10 +1076,10 @@
}
/* check for References: */
- if ((str = camel_header_raw_find (&h, "References", NULL))) {
- g_free (iinfo->info.references);
- iinfo->info.references = decode_references (str, FALSE);
- }
+ g_free (iinfo->info.references);
+ refs = camel_header_raw_find (&h, "References", NULL);
+ str = camel_header_raw_find (&h, "In-Reply-To", NULL);
+ iinfo->info.references = decode_references (refs, str);
default:
break;
}
@@ -1105,7 +1116,7 @@
#define IMAP4_ALL "FLAGS INTERNALDATE RFC822.SIZE ENVELOPE"
#define MAILING_LIST_HEADERS "List-Post List-Id Mailing-List Originator X-Mailing-List X-Loop X-List Sender Delivered-To Return-Path X-BeenThere List-Unsubscribe"
-#define BASE_HEADER_FIELDS "Content-Type References"
+#define BASE_HEADER_FIELDS "Content-Type References In-Reply-To"
#define MORE_HEADER_FIELDS BASE_HEADER_FIELDS " " MAILING_LIST_HEADERS
static CamelIMAP4Command *
[
Date Prev][Date Next] [
Thread Prev][Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]