Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}