Esempio n. 1
0
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;
}
Esempio n. 3
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;
}
Esempio n. 4
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;
}