static void ews_set_threading_data (CamelMessageInfo *mi, EEwsItem *item) { const gchar *references_str, *inreplyto_str; const gchar *message_id; GSList *refs, *irt, *link; guint8 *digest; gchar *msgid; CamelSummaryMessageID tmp_msgid; GArray *references; /* set message id */ message_id = e_ews_item_get_msg_id (item); msgid = camel_header_msgid_decode (message_id); if (msgid) { digest = get_md5_digest ((const guchar *) msgid); memcpy (tmp_msgid.id.hash, digest, sizeof (tmp_msgid.id.hash)); g_free (digest); g_free (msgid); camel_message_info_set_message_id (mi, tmp_msgid.id.id); } /* Process References: header */ references_str = e_ews_item_get_references (item); refs = camel_header_references_decode (references_str); /* Prepend In-Reply-To: contents to References: for summary info */ inreplyto_str = e_ews_item_get_in_replyto (item); irt = camel_header_references_decode (inreplyto_str); if (irt) { refs = g_slist_concat (irt, refs); } if (!refs) return; references = g_array_sized_new (FALSE, FALSE, sizeof (guint64), g_slist_length (refs)); for (link = refs; link; link = g_slist_next (link)) { digest = get_md5_digest ((const guchar *) link->data); memcpy (tmp_msgid.id.hash, digest, sizeof (tmp_msgid.id.hash)); g_free (digest); g_array_append_val (references, tmp_msgid.id.id); } g_slist_free_full (refs, g_free); camel_message_info_take_references (mi, references); }
int main (int argc, char **argv) { int i, j; camel_test_init(argc, argv); camel_test_start("references decoding"); for (i=0;i<sizeof(test1)/sizeof(test1[0]);i++) { struct _camel_header_references *head, *node; camel_test_push("references decoding[%d] '%s'", i, test1[i].header); head = camel_header_references_decode(test1[i].header); node = head; for (j=0;test1[i].values[j];j++) { check_msg(node != NULL, "didn't find all references"); check(strcmp(test1[i].values[j], node->id) == 0); node = node->next; } check_msg(node == NULL, "found more references than should have"); camel_header_references_list_clear(&head); camel_test_pull(); } camel_test_end(); return 0; }
gint main (gint argc, gchar **argv) { gint i, j; camel_test_init (argc, argv); camel_test_start ("references decoding"); for (i = 0; i < G_N_ELEMENTS (test1); i++) { GSList *list; camel_test_push ("references decoding[%d] '%s'", i, test1[i].header); list = camel_header_references_decode (test1[i].header); for (j = 0; test1[i].values[j]; j++) { check_msg (list != NULL, "didn't find all references"); check (strcmp (test1[i].values[j], list->data) == 0); list = g_slist_next (list); } check_msg (list == NULL, "found more references than should have"); g_slist_free_full (list, g_free); camel_test_pull (); } camel_test_end (); return 0; }
static CamelSummaryReferences * decode_references (const char *refstr, const char *irtstr) { struct _camel_header_references *refs, *irt, *r; CamelSummaryReferences *references; unsigned char md5sum[16]; guint32 i, n; 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); references = g_malloc (sizeof (CamelSummaryReferences) + (sizeof (CamelSummaryMessageID) * (n - 1))); references->size = n; 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 (CamelSummaryMessageID)); } camel_header_references_list_clear (&refs); return references; }