[evolution/webkit: 26/100] Add custom EMFormatHandler for message headers.



commit 5f5379024452a0728eb496f02274115b703be78e
Author: Dan VrÃtil <dvratil redhat com>
Date:   Thu Sep 15 16:15:40 2011 +0200

    Add custom EMFormatHandler for message headers.

 em-format/em-format.c         |  115 ++++++++++++++++++++++++++--------------
 em-format/em-format.h         |    1 +
 mail/e-mail-display.c         |   40 +++++---------
 mail/e-mail-request.c         |   72 ++++++--------------------
 mail/em-format-html-display.c |   27 +++++-----
 mail/em-format-html.c         |   59 ++++++++++++++++-----
 6 files changed, 164 insertions(+), 150 deletions(-)
---
diff --git a/em-format/em-format.c b/em-format/em-format.c
index 6d20237..6215813 100644
--- a/em-format/em-format.c
+++ b/em-format/em-format.c
@@ -73,6 +73,9 @@ static void emf_parse_multipart_digest		(EMFormat *emf, CamelMimePart *part, GSt
 static void emf_parse_message_deliverystatus	(EMFormat *emf, CamelMimePart *part, GString *part_id, EMFormatParserInfo *info, GCancellable *cancellable);
 static void emf_parse_inlinepgp_signed		(EMFormat *emf, CamelMimePart *part, GString *part_id, EMFormatParserInfo *info, GCancellable *cancellable);
 static void emf_parse_inlinepgp_encrypted	(EMFormat *emf, CamelMimePart *part, GString *part_id, EMFormatParserInfo *info, GCancellable *cancellable);
+static void emf_parse_message			(EMFormat *emf, CamelMimePart *part, GString *part_id, EMFormatParserInfo *info, GCancellable *cancellable);
+static void emf_parse_headers			(EMFormat *emf, CamelMimePart *part, GString *part_id, EMFormatParserInfo *info, GCancellable *cancellable);
+static void emf_parse_post_headers		(EMFormat *emf, CamelMimePart *part, GString *part_id, EMFormatParserInfo *info, GCancellable *cancellable);
 static void emf_parse_source			(EMFormat *emf, CamelMimePart *part, GString *part_id, EMFormatParserInfo *info, GCancellable *cancellable);
 static void emf_parse_attachment		(EMFormat *emf, CamelMimePart *part, GString *part_id, EMFormatParserInfo *info, GCancellable *cancellable);
 
@@ -669,7 +672,7 @@ emf_parse_multipart_digest (EMFormat *emf,
 		CamelMimePart *subpart;
 		CamelContentType *ct;
 		gchar *cts;
-		EMFormatHandler *handler;
+		const EMFormatHandler *handler;
 
 		subpart = camel_multipart_get_part (mp, i);
 
@@ -688,7 +691,7 @@ emf_parse_multipart_digest (EMFormat *emf,
 			continue;
 		}
 
-		handler = em_format_find_handler (emf, "x-evolution/message/attachment");
+		handler = em_format_find_handler (emf, "message/rfc822");
 		handler->parse_func (emf, subpart, part_id, info, cancellable);
 
 		g_string_truncate (part_id, len);
@@ -763,6 +766,7 @@ emf_parse_message_deliverystatus (EMFormat *emf,
 
 	puri = em_format_puri_new (emf, sizeof (EMFormatPURI), part, part_id->str);
 	puri->write_func = emf_write_text;
+	puri->mime_type = g_strdup ("text/html");
 
 	g_string_truncate (part_id, len);
 
@@ -945,6 +949,58 @@ emf_parse_inlinepgp_encrypted (EMFormat *emf,
 }
 
 static void
+emf_parse_message (EMFormat *emf,
+		   CamelMimePart *part,
+		   GString *part_id,
+		   EMFormatParserInfo *info,
+		   GCancellable *cancellable)
+{
+	/* Headers */
+	em_format_parse_part_as (emf, part, part_id, info,
+			"x-evolution/message/headers", cancellable);
+
+	/* Anything that comes between headers and message body */
+	em_format_parse_part_as (emf, part, part_id, info,
+			"x-evolution/message/post-headers", cancellable);
+
+	/* Begin parsing the message */
+	em_format_parse_part (emf, part, part_id, info, cancellable);
+}
+
+static void
+emf_parse_headers (EMFormat *emf,
+		   CamelMimePart *part,
+		   GString *part_id,
+		   EMFormatParserInfo *info,
+		   GCancellable *cancellable)
+{
+	EMFormatPURI *puri;
+	gint len;
+
+	len = part_id->len;
+	g_string_append (part_id, ".headers");
+
+	puri = em_format_puri_new (emf, sizeof (EMFormatPURI), part, part_id->str);
+	puri->write_func = info->handler->write_func;
+	puri->mime_type = g_strdup ("text/html");
+	em_format_add_puri (emf, puri);
+
+	g_string_truncate (part_id, len);
+}
+
+static void
+emf_parse_post_headers (EMFormat *emf,
+		        CamelMimePart *part,
+		        GString *part_id,
+		        EMFormatParserInfo *info,
+		        GCancellable *cancellable)
+{
+	/* Add attachment bar */
+	em_format_parse_part_as (emf, part, part_id, info,
+		"x-evolution/message/attachment-bar", cancellable);
+}
+
+static void
 emf_parse_source (EMFormat *emf,
 		  CamelMimePart *part,
 		  GString *part_id,
@@ -962,6 +1018,7 @@ emf_parse_source (EMFormat *emf,
 
 	puri = em_format_puri_new (emf, sizeof (EMFormatPURI), part, part_id->str);
 	puri->write_func = emf_write_source;
+	puri->mime_type = g_strdup ("text/html");
 	g_string_truncate (part_id, len);
 
 	em_format_add_puri (emf, puri);
@@ -1047,15 +1104,10 @@ emf_parse (EMFormat *emf,
 	g_return_if_fail (emf->message);
 	g_return_if_fail (emf->folder);
 
-
 	part_id = g_string_new ("");
-	/* Begun parsing the message */
-	em_format_parse_part (emf, CAMEL_MIME_PART (message), part_id, &info, cancellable);
 
-	/* Now call some internal handlers */
 	em_format_parse_part_as (emf, CAMEL_MIME_PART (message), part_id, &info,
-			"x-evolution/message/post-header", cancellable);
-
+			"x-evolution/message", cancellable);
 
 	g_string_free (part_id, TRUE);
 }
@@ -1115,6 +1167,9 @@ static EMFormatHandler type_handlers[] = {
 		/* internal types */
 		{ (gchar *) "application/x-inlinepgp-signed", emf_parse_inlinepgp_signed, },
 		{ (gchar *) "application/x-inlinepgp-encrypted", emf_parse_inlinepgp_encrypted, },
+		{ (gchar *) "x-evolution/message", emf_parse_message, },
+		{ (gchar *) "x-evolution/message/headers", emf_parse_headers, },
+		{ (gchar *) "x-evolution/message/post-headers", emf_parse_post_headers, },
 		{ (gchar *) "x-evolution/message/source", emf_parse_source, },
 		{ (gchar *) "x-evolution/message/attachment", emf_parse_attachment, },
 };
@@ -1536,9 +1591,6 @@ em_format_add_puri (EMFormat *emf,
 
 	g_hash_table_insert (emf->mail_part_table,
 			puri->uri, puri);
-
-	printf("  added PURI '%s', type %s, cid %s\n", puri->uri,
-			camel_content_type_simple (camel_mime_part_get_content_type (puri->part)), puri->cid);
 }
 
 EMFormatPURI*
@@ -2131,24 +2183,9 @@ em_format_puri_new (EMFormat *emf,
 
 	if (part)
 		puri->part = g_object_ref (part);
-	else
-		puri->part = NULL;
 
 	if (uri)
 		puri->uri = g_strdup (uri);
-	else
-		puri->uri = NULL;
-
-	puri->cid = NULL;
-
-	puri->validity_type = 0;
-	puri->validity = NULL;
-	puri->validity_parent = NULL;
-
-	puri->write_func = NULL;
-	puri->widget_func = NULL;
-
-	puri->free = NULL;
 
 	return puri;
 }
@@ -2167,6 +2204,9 @@ em_format_puri_free (EMFormatPURI *puri)
 	if (puri->cid)
 		g_free (puri->cid);
 
+	if (puri->mime_type)
+		g_free (puri->mime_type);
+
 	if (puri->validity)
 		camel_cipher_validity_free (puri->validity);
 
@@ -2185,30 +2225,25 @@ em_format_puri_write (EMFormatPURI *puri,
 		      CamelStream *stream,
 		      GCancellable *cancellable)
 {
-	const EMFormatHandler *handler;
-	CamelContentType *ct;
-	gchar *mime_type;
-
 	g_return_if_fail (puri);
 	g_return_if_fail (CAMEL_IS_STREAM (stream));
 
-	ct = camel_mime_part_get_content_type (puri->part);
-	if (ct) {
-		mime_type = camel_content_type_simple (ct);
-	} else {
-		mime_type = (gchar *) "plain/text";
-	}
-
 	if (puri->write_func) {
 		puri->write_func (puri->emf, puri, stream, cancellable);
 	} else {
+		const EMFormatHandler *handler;
+		const gchar *mime_type;
+
+		if (puri->mime_type) {
+			mime_type = puri->mime_type;
+		} else {
+			mime_type = (gchar *) "plain/text";
+		}
+
 		handler = em_format_find_handler (puri->emf, mime_type);
 		if (handler && handler->write_func) {
 			handler->write_func (puri->emf,
 					puri, stream, cancellable);
 		}
 	}
-
-	if (ct)
-		g_free (mime_type);
 }
diff --git a/em-format/em-format.h b/em-format/em-format.h
index ba3909a..78f28b4 100644
--- a/em-format/em-format.h
+++ b/em-format/em-format.h
@@ -128,6 +128,7 @@ struct _EMFormatPURI {
 
 	gchar *uri;
 	gchar *cid;
+	gchar *mime_type;
 
 	/* EM_FORMAT_VALIDITY_* flags */
 	guint32 validity_type;
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c
index a26913f..0ec33bf 100644
--- a/mail/e-mail-display.c
+++ b/mail/e-mail-display.c
@@ -632,8 +632,6 @@ e_mail_display_load (EMailDisplay *display,
 		     const gchar *msg_uri)
 {
 	EWebView *web_view;
-	EAttachmentStore *attachment_store;
-	GtkWidget *attachment_bar;
 	EMFormatPURI *puri;
 	EMFormat *emf = (EMFormat *) display->priv->formatter;
 	gchar *uri;
@@ -655,38 +653,29 @@ e_mail_display_load (EMailDisplay *display,
 	box = GTK_BOX (display->priv->vbox);
 	gtk_widget_show (display->priv->vbox);
 
-	/* Headers webview */
-	web_view = mail_display_setup_webview (display);
-	mail_display_insert_web_view (display, web_view, FALSE);
-	uri = em_format_build_mail_uri (emf->folder, emf->message_uid, "headers");
-	e_web_view_load_uri (web_view, uri);
-	g_free (uri);
-
-	/* Attachment bar */
-	attachment_store = NULL;
-	puri = g_hash_table_lookup (emf->mail_part_table, "attachment-bar:");
-	if (puri && puri->widget_func) {
-		attachment_bar = g_object_ref (puri->widget_func (emf, puri, NULL));
-		gtk_box_pack_start (box, attachment_bar, TRUE, TRUE, 0);
-		attachment_store = e_attachment_view_get_store (E_ATTACHMENT_VIEW (attachment_bar));
-		gtk_widget_show (attachment_bar);
-	}
-
 	for (iter = emf->mail_part_list; iter; iter = iter->next) {
 		GtkWidget *widget = NULL;
 
 		puri = iter->data;
 		uri = em_format_build_mail_uri (emf->folder, emf->message_uid, puri->uri);
 
-		if (puri->widget_func && strcmp (puri->uri, "attachment-bar:") != 0) {
+		if (puri->widget_func) {
 
 			widget = puri->widget_func (emf, puri, NULL);
-			if (!widget) {
+			if (!GTK_IS_WIDGET (widget)) {
 				g_message ("Part %s didn't provide a valid widget, skipping!", puri->uri);
 				continue;
 			}
+
 			gtk_box_pack_start (box, widget, TRUE, TRUE, 0);
-			gtk_widget_show (widget);
+			if (E_IS_ATTACHMENT_VIEW (widget)) {
+				EAttachmentStore *store = e_attachment_view_get_store (E_ATTACHMENT_VIEW (widget));
+				if (e_attachment_store_get_num_attachments (store) > 0)
+					gtk_widget_show (widget);
+				else
+					gtk_widget_hide (widget);
+			} else
+				gtk_widget_show (widget);
 
 		}
 
@@ -704,10 +693,6 @@ e_mail_display_load (EMailDisplay *display,
 
 		g_free (uri);
 	}
-
-	/* Don't display EAttachmentBar if it's empty. */
-	if (attachment_store && e_attachment_store_get_num_attachments (attachment_store) == 0)
-		gtk_widget_hide (attachment_bar);
 }
 
 void
@@ -757,6 +742,9 @@ remove_widget (GtkWidget *widget, gpointer user_data)
 {
 	EMailDisplay *display = user_data;
 
+	if (!GTK_IS_WIDGET (widget))
+		return;
+
 	gtk_container_remove  (GTK_CONTAINER (display->priv->vbox), widget);
 
 	/* We must not destroy attachment bar, it's owned by EMFormatHTMLDisplay */
diff --git a/mail/e-mail-request.c b/mail/e-mail-request.c
index 6497cc1..cf40415 100644
--- a/mail/e-mail-request.c
+++ b/mail/e-mail-request.c
@@ -13,29 +13,17 @@ G_DEFINE_TYPE (EMailRequest, e_mail_request, SOUP_TYPE_REQUEST)
 
 struct _EMailRequestPrivate {
 	EMFormatHTML *efh;
-	CamelMimePart *part;
 
 	CamelStream *output_stream;
-
-	CamelContentType *content_type;
+	EMFormatPURI *puri;
 	gchar *mime_type;
+
 	gint content_length;
 
 	GHashTable *uri_query;
 };
 
 static void
-mail_request_set_content_type (EMailRequest *emr,
-			       CamelContentType *ct)
-{
-	if (emr->priv->content_type)
-		camel_content_type_unref (emr->priv->content_type);
-
-	emr->priv->content_type = ct;
-	camel_content_type_ref (emr->priv->content_type);
-}
-
-static void
 start_mail_formatting (GSimpleAsyncResult *res,
 		       GObject *object,
 		       GCancellable *cancellable)
@@ -58,21 +46,11 @@ start_mail_formatting (GSimpleAsyncResult *res,
 	part_id = g_hash_table_lookup (request->priv->uri_query, "part_id");
 
 	if (part_id) {
-		gboolean all_headers = GPOINTER_TO_INT (g_hash_table_lookup (
-				request->priv->uri_query, "all-headers"));
-
-		if (strcmp (part_id, "headers") == 0) {
-			em_format_html_format_headers (efh, request->priv->output_stream,
-				CAMEL_MEDIUM (emf->message), all_headers, cancellable);
+		request->priv->puri = em_format_find_puri (emf, part_id);
+		if (request->priv->puri) {
+			em_format_puri_write (request->priv->puri, request->priv->output_stream, NULL);
 		} else {
-			EMFormatPURI *puri = em_format_find_puri (emf, part_id);
-			if (puri) {
-				em_format_puri_write (puri, request->priv->output_stream, NULL);
-				mail_request_set_content_type (request,
-					camel_mime_part_get_content_type (puri->part));
-			} else {
-				g_warning ("Failed to lookup requested part '%s' - this should not happen!", part_id);
-			}
+			g_warning ("Failed to lookup requested part '%s' - this should not happen!", part_id);
 		}
 	}
 
@@ -106,11 +84,7 @@ get_file_content (GSimpleAsyncResult *res,
 	uri = soup_request_get_uri (SOUP_REQUEST (request));
 
 	if (g_file_get_contents (uri->path, &contents, &length, NULL)) {
-		CamelContentType *ct;
 		request->priv->mime_type = g_content_type_guess (uri->path, NULL, 0, NULL);
-		ct = camel_content_type_decode (request->priv->mime_type);
-		mail_request_set_content_type (request, ct);
-		camel_content_type_unref (ct);
 
 		request->priv->content_length = length;
 
@@ -126,10 +100,9 @@ e_mail_request_init (EMailRequest *request)
 		request, E_TYPE_MAIL_REQUEST, EMailRequestPrivate);
 
 	request->priv->efh = NULL;
-	request->priv->part = NULL;
 	request->priv->output_stream = NULL;
 	request->priv->uri_query = NULL;
-	request->priv->content_type = NULL;
+	request->priv->puri = NULL;
 	request->priv->mime_type = NULL;
 	request->priv->content_length = 0;
 }
@@ -144,11 +117,6 @@ mail_request_finalize (GObject *object)
 		request->priv->output_stream = NULL;
 	}
 
-	if (request->priv->content_type) {
-		camel_content_type_unref (request->priv->content_type);
-		request->priv->content_type = NULL;
-	}
-
 	if (request->priv->mime_type) {
 		g_free (request->priv->mime_type);
 		request->priv->mime_type = NULL;
@@ -251,27 +219,19 @@ mail_request_get_content_type (SoupRequest *request)
 {
 	EMailRequest *emr = E_MAIL_REQUEST (request);
 
-	if (emr->priv->mime_type) {
-		d(printf("Content-Type: %s\n", emr->priv->mime_type));
+	if (emr->priv->mime_type)
 		return emr->priv->mime_type;
-	}
-
-	if (emr->priv->content_type == NULL) {
-		emr->priv->mime_type = g_strdup ("text/html; charset=utf-8");
 
-	/* For text/* content type, return text/html, because we
-	 * have converted it from whatever type it was to HTML */
-	} else if (camel_content_type_is (emr->priv->content_type, "text", "*")) {
-		emr->priv->mime_type = g_strdup ("text/html; charset=utf-8");
+	if (!emr->priv->puri)
+		return "text/html";
 
-	/* For any other format return it's native format, because then it is
-	 * most probably image or something similar */
-	} else {
-		emr->priv->mime_type = camel_content_type_simple (emr->priv->content_type);
-	}
+	if (!emr->priv->puri->mime_type) {
+		CamelContentType *ct = camel_mime_part_get_content_type (emr->priv->puri->part);
+		return camel_content_type_format (ct);
+	} else
+		return emr->priv->puri->mime_type;
 
-	d(printf("Content-Type: %s\n", emr->priv->mime_type));
-	return emr->priv->mime_type;
+	return "text/html";
 }
 
 static const char *data_schemes[] = { "mail", "evo-file", NULL };
diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c
index 154bfff..4644889 100644
--- a/mail/em-format-html-display.c
+++ b/mail/em-format-html-display.c
@@ -367,17 +367,19 @@ efhd_parse_attachment (EMFormat *emf,
                        EMFormatParserInfo *info,
                        GCancellable *cancellable)
 {
-	gchar *classid, *text, *html;
+	gchar *text, *html;
 	EMFormatAttachmentPURI *puri;
 	const EMFormatHandler *handler;
 	CamelContentType *ct;
 	gchar *mime_type;
+	gint len;
 	const gchar *cid;
 
 	if (g_cancellable_is_cancelled (cancellable))
 		return;
 
-	classid = g_strdup_printf ("attachment.%s", part_id->str);
+	len = part_id->len;
+	g_string_append (part_id, ".attachment");
 
 	ct = camel_mime_part_get_content_type (part);
 	if (ct) {
@@ -395,14 +397,13 @@ efhd_parse_attachment (EMFormat *emf,
 	g_free (mime_type);
 
 	puri = (EMFormatAttachmentPURI*) em_format_puri_new (
-			emf, sizeof (EMFormatAttachmentPURI), part, classid);
+			emf, sizeof (EMFormatAttachmentPURI), part, part_id->str);
 	puri->puri.free = efhd_free_attach_puri_data;
 	puri->puri.widget_func = efhd_attachment_button;
-	puri->shown = em_format_is_inline (
-		emf, part_id->str,part, info->handler);
+	puri->shown = em_format_is_inline (emf, part_id->str, part, info->handler);
 	puri->snoop_mime_type = em_format_snoop_type (part);
 	puri->attachment = e_attachment_new ();
-	puri->attachment_view_part_id = g_strdup (classid);
+	puri->attachment_view_part_id = g_strdup (part_id->str);
 	puri->description = html;
 	puri->handle = handler;
 
@@ -422,7 +423,7 @@ efhd_parse_attachment (EMFormat *emf,
 		puri->encrypt = info->validity->encrypt.status;
 	}
 
-	g_free (classid);
+	g_string_truncate (part_id, len);
 }
 
 static void
@@ -794,7 +795,7 @@ em_format_html_display_new (void)
 
 static EMFormatHandler type_builtin_table[] = {
 	{ (gchar *) "x-evolution/message/prefix", efhd_message_prefix, },
-	{ (gchar *) "x-evolution/message/post-header", (EMFormatParseFunc) efhd_message_add_bar, },
+	{ (gchar *) "x-evolution/message/attachment-bar", (EMFormatParseFunc) efhd_message_add_bar, },
 	{ (gchar *) "x-evolution/message/attachment", efhd_parse_attachment, },
 };
 
@@ -1029,19 +1030,19 @@ efhd_message_add_bar (EMFormat *emf,
 {
 	gchar *classid;
 	EMFormatAttachmentPURI *puri;
+	gint len;
 
 	if (g_cancellable_is_cancelled (cancellable))
 		return;
 
-	classid = g_strdup_printf (
-		"attachment-bar:%s", part_id->str);
-
+	len = part_id->len;
+	g_string_append (part_id, ".attachment-bar");
 	puri = (EMFormatAttachmentPURI *) em_format_puri_new (
-			emf, sizeof (EMFormatAttachmentPURI), part, classid);
+			emf, sizeof (EMFormatAttachmentPURI), part, part_id->str);
 	puri->puri.widget_func = efhd_attachment_bar;
 	em_format_add_puri (emf, (EMFormatPURI*) puri);
 
-	g_free (classid);
+	g_string_truncate (part_id, len);
 }
 
 static void
diff --git a/mail/em-format-html.c b/mail/em-format-html.c
index 430fec4..d3d9da7 100644
--- a/mail/em-format-html.c
+++ b/mail/em-format-html.c
@@ -146,6 +146,7 @@ static void efh_write_text_plain		(EMFormat *emf, EMFormatPURI *puri, CamelStrea
 static void efh_write_text_html			(EMFormat *emf, EMFormatPURI *puri, CamelStream *stream, GCancellable *cancellable);
 static void efh_write_source			(EMFormat *emf, EMFormatPURI *puri, CamelStream *stream, GCancellable *cancellable);
 static void efh_write_message_rfc822		(EMFormat *emf, EMFormatPURI *puri, CamelStream *stream, GCancellable *cancellable);
+static void efh_write_headers			(EMFormat *emf, EMFormatPURI *puri, CamelStream *stream, GCancellable *cancellable);
 /*****************************************************************************/
 static void
 efh_parse_image (EMFormat *emf,
@@ -175,6 +176,7 @@ efh_parse_image (EMFormat *emf,
 	puri = em_format_puri_new (emf, sizeof (EMFormatPURI), part, part_id->str);
 	puri->cid = cid;
 	puri->write_func = efh_write_image;
+	puri->mime_type = g_strdup (info->handler->mime_type);
 	puri->is_attachment = TRUE;
 
 	em_format_add_puri (emf, puri);
@@ -207,6 +209,7 @@ efh_parse_text_enriched (EMFormat *emf,
 	g_string_append (part_id, ".text_enriched");
 	puri = em_format_puri_new (emf, sizeof (EMFormatPURI), part, part_id->str);
 	puri->cid = cid;
+	puri->mime_type = g_strdup (info->handler->mime_type);
 	puri->write_func = efh_write_text_enriched;
 
 	em_format_add_puri (emf, puri);
@@ -318,6 +321,7 @@ efh_parse_text_plain (EMFormat *emf,
 			g_string_append (part_id, ".plain_text");
 			puri = em_format_puri_new (emf, sizeof (EMFormatPURI), newpart, part_id->str);
 			puri->write_func = efh_write_text_plain;
+			puri->mime_type = g_strdup ("text/html");
 			g_string_truncate (part_id, s_len);
 			em_format_add_puri (emf, puri);
 		} else {
@@ -486,6 +490,7 @@ addPart:
 	g_string_append (part_id, ".msg_external");
 	puri = em_format_puri_new (emf, sizeof (EMFormatPURI), part, part_id->str);
 	puri->write_func = efh_write_text_html;
+	puri->mime_type = g_strdup ("text/html");
 
 	em_format_add_puri (emf, puri);
 	g_string_truncate (part_id, len);
@@ -508,6 +513,7 @@ efh_parse_message_deliverystatus (EMFormat *emf,
 	g_string_append (part_id, ".deliverystatus");
 	puri = em_format_puri_new (emf, sizeof (EMFormatPURI), part, part_id->str);
 	puri->write_func = efh_write_source;
+	puri->mime_type = g_strdup ("text/html");
 
 	em_format_add_puri (emf, puri);
 	g_string_truncate (part_id, len);
@@ -520,16 +526,37 @@ efh_parse_message_rfc822 (EMFormat *emf,
 			  EMFormatParserInfo *info,
 			  GCancellable *cancellable)
 {
-	EMFormatPURI *puri;
+	CamelDataWrapper *dw;
+	CamelMimePart *opart;
+	CamelStream *stream;
+	CamelMimeParser *parser;
+	CamelContentType *ct;
+	gchar *cts;
 	gint len;
+	EMFormatParserInfo oinfo = *info;
 
 	len = part_id->len;
 	g_string_append (part_id, ".rfc822");
-	puri = em_format_puri_new (emf, sizeof (EMFormatPURI), part, part_id->str);
-	puri->write_func = efh_write_message_rfc822;
 
-	em_format_add_puri (emf, puri);
+	stream = camel_stream_mem_new ();
+	dw = camel_medium_get_content ((CamelMedium *) part);
+	camel_data_wrapper_write_to_stream_sync (dw, stream, cancellable, NULL);
+	g_seekable_seek (G_SEEKABLE (stream), 0, G_SEEK_SET, cancellable, NULL);
+
+	parser = camel_mime_parser_new ();
+	camel_mime_parser_init_with_stream (parser, stream, NULL);
+
+	opart = camel_mime_part_new ();
+	camel_mime_part_construct_from_parser_sync (opart, parser, cancellable, NULL);
+
+	em_format_parse_part_as (emf, opart, part_id, &oinfo,
+		"x-evolution/message", cancellable);
+
 	g_string_truncate (part_id, len);
+
+	g_object_unref (opart);
+	g_object_unref (parser);
+	g_object_unref (stream);
 }
 
 
@@ -730,13 +757,13 @@ efh_write_source (EMFormat *emf,
 }
 
 static void
-efh_write_message_rfc822 (EMFormat *emf,
-			  EMFormatPURI *puri,
-			  CamelStream *stream,
-			  GCancellable *cancellable)
+efh_write_headers (EMFormat *emf,
+		   EMFormatPURI *puri,
+		   CamelStream *stream,
+		   GCancellable *cancellable)
 {
-
-
+	/* FIXME: We could handle this more nicely */
+	em_format_html_format_headers ((EMFormatHTML *) emf, stream, (CamelMedium *)  puri->part, FALSE, cancellable);
 }
 
 /*****************************************************************************/
@@ -771,10 +798,10 @@ static EMFormatHandler type_builtin_table[] = {
 	{ (gchar *) "text/html", efh_parse_text_html, efh_write_text_html, },
 	{ (gchar *) "text/richtext", efh_parse_text_enriched, efh_write_text_enriched, },
 	{ (gchar *) "text/*", efh_parse_text_plain, efh_write_text_plain, },
-        { (gchar *) "nessage/rfc822", efh_parse_message_rfc822, efh_write_message_rfc822, EM_FORMAT_HANDLER_INLINE },
-        { (gchar *) "message/news", efh_parse_message_rfc822, efh_write_message_rfc822, EM_FORMAT_HANDLER_INLINE },
-        { (gchar *) "message/delivery-status", efh_parse_message_deliverystatus, efh_write_message_rfc822, },
-	{ (gchar *) "message/external-body", efh_parse_message_external, efh_write_message_rfc822, },
+        { (gchar *) "message/rfc822", efh_parse_message_rfc822, 0, EM_FORMAT_HANDLER_INLINE },
+        { (gchar *) "message/news", efh_parse_message_rfc822, 0, EM_FORMAT_HANDLER_INLINE },
+        { (gchar *) "message/delivery-status", efh_parse_message_deliverystatus, efh_write_text_plain, },
+	{ (gchar *) "message/external-body", efh_parse_message_external, efh_write_text_plain, },
         { (gchar *) "message/*", efh_parse_message_rfc822, 0, EM_FORMAT_HANDLER_INLINE },
 
 	/* This is where one adds those busted, non-registered types,
@@ -784,7 +811,8 @@ static EMFormatHandler type_builtin_table[] = {
 	{ (gchar *) "image/pjpeg", efh_parse_image, efh_write_image, },
 
 	/* special internal types */
-	{ (gchar *) "x-evolution/message/rfc822", 0, efh_write_text_plain }
+	{ (gchar *) "x-evolution/message/rfc822", 0, efh_write_text_plain, },
+	{ (gchar *) "x-evolution/message/headers", 0, efh_write_headers, },
 };
 
 static void
@@ -1029,6 +1057,7 @@ efh_format_error (EMFormat *emf,
 
 	puri = em_format_puri_new (emf, sizeof (EMFormatPURI), part, em_format_get_error_id (emf));
 	puri->write_func = efh_write_text_html;
+	puri->mime_type = g_strdup ("text/html");
 
 	em_format_add_puri (emf, puri);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]