static MessageData *convert_message(GMimeMessage *message, guint content_option) { if (!message) return NULL; MessageData *md = new_message_data(); const gchar *message_id = g_mime_message_get_message_id(message); if (message_id) md->message_id = g_strdup(message_id); md->from = get_from_addresses(message); md->reply_to = get_reply_to_addresses(message); md->to = get_to_addresses(message); md->cc = get_cc_addresses(message); md->bcc = get_bcc_addresses(message); const gchar *subject = g_mime_message_get_subject(message); if (subject) md->subject = g_strdup(subject); md->date = g_mime_message_get_date_as_string(message); const gchar *in_reply_to = g_mime_object_get_header(GMIME_OBJECT (message), "In-Reply-To"); if (in_reply_to) { gchar *in_reply_to_str = g_mime_utils_header_decode_text(in_reply_to); md->in_reply_to = g_mime_references_decode(in_reply_to_str); g_free(in_reply_to_str); } const gchar *references = g_mime_object_get_header(GMIME_OBJECT (message), "References"); if (references) { gchar *references_str = g_mime_utils_header_decode_text(references); md->references = g_mime_references_decode(references_str); g_free(references_str); } if (content_option) { PartCollectorData *pc = collect_parts(message, content_option); if (pc->text_part) md->text = get_body(pc->text_part, (content_option != COLLECT_RAW_CONTENT), NULL); if (pc->html_part) md->html = get_body(pc->html_part, (content_option != COLLECT_RAW_CONTENT), pc->inlines); md->attachments = get_attachments(pc); free_part_collector_data(pc); } return md; }
static gchar* get_refs_str (GMimeMessage *msg) { const gchar *str; const GMimeReferences *cur; GMimeReferences *mime_refs; gchar *rv; str = g_mime_object_get_header (GMIME_OBJECT(msg), "References"); if (!str) return NULL; mime_refs = g_mime_references_decode (str); for (rv = NULL, cur = mime_refs; cur; cur = g_mime_references_get_next(cur)) { const char* msgid; msgid = g_mime_references_get_message_id (cur); rv = g_strdup_printf ("%s%s%s", rv ? rv : "", rv ? "," : "", msgid); } g_mime_references_free (mime_refs); return rv; }
static SpruceSummaryReferences * decode_references (const char *string) { SpruceSummaryReferences *references; GMimeReferences *refs, *r; unsigned char md5sum[16]; GChecksum *checksum; guint32 i, n = 0; size_t len = 16; if (!(r = refs = g_mime_references_decode (string))) return NULL; while (r != NULL) { r = r->next; n++; } references = g_malloc (sizeof (SpruceSummaryReferences) + (sizeof (SpruceSummaryMessageID) * (n - 1))); references->count = n; checksum = g_checksum_new (G_CHECKSUM_MD5); for (i = 0, r = refs; i < n; i++, r = r->next) { g_checksum_update (checksum, r->msgid, strlen (r->msgid)); g_checksum_get_digest (checksum, md5sum, &len); g_checksum_reset (checksum); len = 16; memcpy (references->references[i].id.hash, md5sum, sizeof (references->references[i].id.hash)); } g_mime_references_clear (&refs); g_checksum_free (checksum); return references; }