From 4cf5bbfa5a228f47256e74a7a11180e2d512561b Mon Sep 17 00:00:00 2001 From: Not Zed Date: Fri, 2 Jun 2000 18:09:18 +0000 Subject: If we get a funny result, just throw it out. Basically a fix for the one 2000-06-02 Not Zed * camel-mime-utils.c (header_decode_date): If we get a funny result, just throw it out. Basically a fix for the one true broken TradeClient. 2000-06-01 Not Zed * camel-folder-summary.c (message_info_free): Free references/messsage id. (message_info_save): Save them. (message_info_load): Load them. (message_info_new): And get them from the new message. (CAMEL_FOLDER_SUMMARY_VERSION): Bumped for new changes. * camel-folder-summary.h: Added references and messageid to summary. svn path=/trunk/; revision=3391 --- camel/ChangeLog | 19 ++++++++++ camel/camel-folder-summary.c | 35 ++++++++++++++++- camel/camel-folder-summary.h | 4 ++ camel/camel-mime-utils.c | 89 ++++++++++++++++++++++++++++++++++++++++---- camel/camel-mime-utils.h | 12 ++++++ 5 files changed, 149 insertions(+), 10 deletions(-) (limited to 'camel') diff --git a/camel/ChangeLog b/camel/ChangeLog index 64ae632671..661a4f8d2c 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,21 @@ +2000-06-02 Not Zed + + * camel-mime-utils.c (header_decode_date): If we get a funny + result, just throw it out. Basically a fix for the one true + broken TradeClient. + +2000-06-01 Not Zed + + * camel-folder-summary.c (message_info_free): Free + references/messsage id. + (message_info_save): Save them. + (message_info_load): Load them. + (message_info_new): And get them from the new message. + (CAMEL_FOLDER_SUMMARY_VERSION): Bumped for new changes. + + * camel-folder-summary.h: Added references and messageid to + summary. + 2000-06-02 Christopher James Lahey * camel-session.c: Ref and unref objects in the service cache @@ -26,6 +44,7 @@ * camel-data-wrapper.c (finalize): unref the stream, if it exists. 2000-06-01 Not Zed +>>>>>>> 1.212 * camel-mime-part.c (construct_from_parser): For a message part, set the default content-type to message/rfc822. Maybe needs to be diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c index 9e3b478236..1224047b29 100644 --- a/camel/camel-folder-summary.c +++ b/camel/camel-folder-summary.c @@ -48,7 +48,7 @@ extern int strdup_count, malloc_count, free_count; #endif -#define CAMEL_FOLDER_SUMMARY_VERSION (4) +#define CAMEL_FOLDER_SUMMARY_VERSION (5) struct _CamelFolderSummaryPrivate { GHashTable *filter_charset; /* CamelMimeFilterCharset's indexed by source charset */ @@ -969,7 +969,16 @@ message_info_new(CamelFolderSummary *s, struct _header_raw *h) mi->user_flags = NULL; mi->date_sent = header_decode_date(header_raw_find(&h, "date", NULL), NULL); mi->date_received = 0; - + mi->message_id = header_msgid_decode(header_raw_find(&h, "message-id", NULL)); + /* if we have a references, use that, otherwise, see if we have an in-reply-to + header, with parsable content, otherwise *shrug* */ + mi->references = header_references_decode(header_raw_find(&h, "references", NULL)); + if (mi->references == NULL) { + char *id; + id = header_msgid_decode(header_raw_find(&h, "in-reply-to", NULL)); + if (id) + header_references_list_append_asis(&mi->references, id); + } return mi; } @@ -995,6 +1004,15 @@ message_info_load(CamelFolderSummary *s, FILE *in) camel_folder_summary_decode_string(in, &mi->to); mi->content = NULL; + camel_folder_summary_decode_string(in, &mi->message_id); + + camel_folder_summary_decode_uint32(in, &count); + for (i=0;ireferences, id); + } + camel_folder_summary_decode_uint32(in, &count); for (i=0;ifrom); camel_folder_summary_encode_string(out, mi->to); + camel_folder_summary_encode_string(out, mi->message_id); + + count = header_references_list_size(&mi->references); + camel_folder_summary_encode_uint32(out, count); + refs = mi->references; + while (refs) { + camel_folder_summary_encode_string(out, refs->id); + refs = refs->next; + } + count = camel_flag_list_size(&mi->user_flags); camel_folder_summary_encode_uint32(out, count); flag = mi->user_flags; @@ -1040,6 +1069,8 @@ message_info_free(CamelFolderSummary *s, CamelMessageInfo *mi) g_free(mi->subject); g_free(mi->from); g_free(mi->to); + g_free(mi->message_id); + header_references_list_clear(&mi->references); camel_flag_list_free(&mi->user_flags); g_free(mi); } diff --git a/camel/camel-folder-summary.h b/camel/camel-folder-summary.h index a22172c41b..1281415368 100644 --- a/camel/camel-folder-summary.h +++ b/camel/camel-folder-summary.h @@ -79,6 +79,10 @@ typedef struct { time_t date_sent; time_t date_received; + /* Message-ID / References structures */ + char *message_id; /* for this message */ + struct _header_references *references; /* from parent to root */ + struct _CamelFlag *user_flags; /* tree of content description - NULL if it is not available */ diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c index af7e9356e1..c893c10050 100644 --- a/camel/camel-mime-utils.c +++ b/camel/camel-mime-utils.c @@ -1505,17 +1505,14 @@ header_decode_address(const char **in) return addr; } -char * -header_msgid_decode(const char *in) +static char * +header_msgid_decode_internal(const char **in) { - const char *inptr = in; + const char *inptr = *in; char *msgid = NULL; d(printf("decoding Message-ID: '%s'\n", in)); - if (in == NULL) - return NULL; - header_decode_lwsp(&inptr); if (*inptr == '<') { inptr++; @@ -1534,10 +1531,82 @@ header_msgid_decode(const char *in) } else { w(g_warning("missing opening '<' on message id: %s", in)); } + *in = inptr; return msgid; } +char * +header_msgid_decode(const char *in) +{ + if (in == NULL) + return NULL; + + return header_msgid_decode_internal(&in); +} + +void +header_references_list_append_asis(struct _header_references **list, char *ref) +{ + struct _header_references *w = (struct _header_references *)list, *n; + while (w->next) + w = w->next; + n = g_malloc(sizeof(*n)); + n->id = ref; + n->next = 0; + w->next = n; +} + +int +header_references_list_size(struct _header_references **list) +{ + int count = 0; + struct _header_references *w = *list; + while (w) { + count++; + w = w->next; + } + return count; +} + +void +header_references_list_clear(struct _header_references **list) +{ + struct _header_references *w = *list, *n; + while (w) { + n = w->next; + g_free(w->id); + g_free(w); + w = n; + } + *list = NULL; +} + +/* generate a list of references, from most recent up */ +struct _header_references * +header_references_decode(const char *in) +{ + const char *inptr = in, *intmp; + struct _header_references *head = NULL, *node; + char *id, *last; + + if (in == NULL) + return NULL; + + do { + last = inptr; + id = header_msgid_decode_internal(&inptr); + if (id) { + node = g_malloc(sizeof(*node)); + node->next = head; + head = node; + node->id = id; + } + } while (last != inptr); + + return head; +} + struct _header_address * header_mailbox_decode(const char *in) { @@ -1891,8 +1960,12 @@ header_decode_date(const char *in, int *saveoffset) header_decode_lwsp(&inptr); if (*inptr == ',') inptr++; - else - w(g_warning("day not followed by ','")); + else { + w(g_warning("day not followed by ',' its probably a broken TradeClient, so we'll ignore its date entirely")); + if (saveoffset) + *saveoffset = 0; + return 0; + } } } tm.tm_mday = header_decode_int(&inptr); diff --git a/camel/camel-mime-utils.h b/camel/camel-mime-utils.h index f95f76363c..5f715243d0 100644 --- a/camel/camel-mime-utils.h +++ b/camel/camel-mime-utils.h @@ -23,6 +23,12 @@ #include +/* a list of references for this message */ +struct _header_references { + struct _header_references *next; + char *id; +}; + struct _header_param { struct _header_param *next; char *name; @@ -137,6 +143,12 @@ char *header_format_date(time_t time, int offset); /* decode a message id */ char *header_msgid_decode(const char *in); +/* decode a References header */ +struct _header_references *header_references_decode(const char *in); +void header_references_list_clear(struct _header_references **list); +void header_references_list_append_asis(struct _header_references **list, char *ref); +int header_references_list_size(struct _header_references **list); + /* decode the mime-type header */ void header_mime_decode(const char *in, int *maj, int *min); -- cgit v1.2.3