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; }
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; }