[evolution] I#494 - Format text/rfc822-headers as message headers
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] I#494 - Format text/rfc822-headers as message headers
- Date: Thu, 20 Jun 2019 19:23:23 +0000 (UTC)
commit 714602094a4fb772a0d369ce6091b68990e3729b
Author: Milan Crha <mcrha redhat com>
Date: Thu Jun 20 21:25:24 2019 +0200
I#494 - Format text/rfc822-headers as message headers
Closes https://gitlab.gnome.org/GNOME/evolution/issues/494
src/em-format/e-mail-formatter-headers.c | 65 +++++++++++++++-------
src/em-format/e-mail-formatter-print-headers.c | 11 +++-
src/em-format/e-mail-formatter-utils.c | 46 ++++++++-------
.../e-mail-parser-message-deliverystatus.c | 55 ++++++++++++++++--
4 files changed, 128 insertions(+), 49 deletions(-)
---
diff --git a/src/em-format/e-mail-formatter-headers.c b/src/em-format/e-mail-formatter-headers.c
index d9f7f3ab13..12835be98b 100644
--- a/src/em-format/e-mail-formatter-headers.c
+++ b/src/em-format/e-mail-formatter-headers.c
@@ -42,7 +42,8 @@ G_DEFINE_TYPE (
E_TYPE_MAIL_FORMATTER_EXTENSION)
static const gchar *formatter_mime_types[] = {
- "application/vnd.evolution.headers",
+ E_MAIL_PART_HEADERS_MIME_TYPE,
+ "text/rfc822-headers",
NULL
};
@@ -208,6 +209,7 @@ format_full_headers (EMailFormatter *formatter,
GString *buffer,
EMailPart *part,
EMailFormatterContext *context,
+ gboolean is_rfc822_headers,
GCancellable *cancellable)
{
guint32 mode = context->mode;
@@ -247,7 +249,7 @@ format_full_headers (EMailFormatter *formatter,
break;
}
- if ((context->flags & E_MAIL_FORMATTER_HEADER_FLAG_NO_FORMATTING) != 0)
+ if (is_rfc822_headers || (context->flags & E_MAIL_FORMATTER_HEADER_FLAG_NO_FORMATTING) != 0)
formatting_flag |= E_MAIL_FORMATTER_HEADER_FLAG_NO_FORMATTING;
ct = camel_mime_part_get_content_type (mime_part);
@@ -263,8 +265,9 @@ format_full_headers (EMailFormatter *formatter,
buffer,
"<table cellspacing=\"0\" cellpadding=\"0\" "
"border=\"0\" width=\"100%%\" "
- "id=\"__evo-full-headers\" "
+ "id=\"__evo-full-%sheaders\" "
"style=\"display: %s; direction: %s;\">",
+ is_rfc822_headers ? "rfc822-" : "",
flags & E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSED ? "none" : "table",
direction);
@@ -320,7 +323,7 @@ format_full_headers (EMailFormatter *formatter,
g_free (hdr_charset);
- if (header_sender && header_from && mail_from_delegate) {
+ if (!is_rfc822_headers && header_sender && header_from && mail_from_delegate) {
gchar *bold_sender, *bold_from;
g_string_append (
@@ -358,7 +361,7 @@ format_full_headers (EMailFormatter *formatter,
g_free (evolution_imagesdir);
/* dump selected headers */
- if (mode & E_MAIL_FORMATTER_MODE_ALL_HEADERS) {
+ if ((mode & E_MAIL_FORMATTER_MODE_ALL_HEADERS) != 0) {
for (ii = 0; ii < len; ii++) {
const gchar *header_name = NULL, *header_value = NULL;
@@ -447,7 +450,7 @@ format_full_headers (EMailFormatter *formatter,
g_string_append (buffer, "</table></td>");
- show_sender_photo =
+ show_sender_photo = !is_rfc822_headers &&
e_mail_formatter_get_show_sender_photo (formatter);
/* Prefer contact photos over archaic "Face" headers. */
@@ -467,7 +470,7 @@ format_full_headers (EMailFormatter *formatter,
g_free (name);
- } else if (face_header_value != NULL) {
+ } else if (!is_rfc822_headers && face_header_value != NULL) {
CamelMimePart *image_part;
image_part = camel_mime_part_new ();
@@ -501,9 +504,10 @@ emfe_headers_format (EMailFormatterExtension *extension,
{
CamelMimePart *mime_part;
GString *buffer;
- const gchar *direction;
+ const gchar *direction, *mime_type;
gboolean is_collapsable;
gboolean is_collapsed;
+ gboolean is_rfc822_headers;
if (g_cancellable_is_cancelled (cancellable))
return FALSE;
@@ -524,24 +528,44 @@ emfe_headers_format (EMailFormatterExtension *extension,
break;
}
- is_collapsable =
+ mime_type = e_mail_part_get_mime_type (part);
+ is_rfc822_headers = mime_type && g_ascii_strcasecmp (mime_type, "text/rfc822-headers") == 0;
+
+ if (is_rfc822_headers && (context->mode == E_MAIL_FORMATTER_MODE_PRINTING || !E_IS_MAIL_PART_HEADERS
(part))) {
+ g_object_unref (mime_part);
+
+ return e_mail_formatter_format_as (formatter, context, part, stream, "text/plain",
cancellable);
+ }
+
+ is_collapsable = !is_rfc822_headers &&
(context->flags & E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSABLE);
- is_collapsed =
+ is_collapsed = !is_rfc822_headers &&
(context->flags & E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSED);
buffer = g_string_new ("");
- g_string_append_printf (
- buffer,
- "%s id=\"%s\"><table class=\"-e-mail-formatter-header-color\" border=\"0\" width=\"100%%\" "
- "style=\"direction: %s; border-spacing: 0px\">"
- "<tr>",
- (context->mode != E_MAIL_FORMATTER_MODE_PRINTING) ?
- "<div class=\"headers -e-mail-formatter-body-color\"" :
- "<div class=\"headers\" style=\"background-color: #ffffff;\"",
- e_mail_part_get_id (part),
- direction);
+ if (is_rfc822_headers) {
+ g_string_append_printf (buffer,
+ "<div class=\"headers pre -e-mail-formatter-body-color
-e-mail-formatter-frame-color\""
+ " style=\"border-width: 1px; border-style: solid;\" id=\"%s\">"
+ "<table class=\"part-container -e-web-view-background-color -e-web-view-text-color\""
+ " border=\"0\" width=\"100%%\" style=\"border: none; padding: 8px; margin: 0;
direction: %s; border-spacing: 0px;\">"
+ "<tr>",
+ e_mail_part_get_id (part),
+ direction);
+ } else {
+ g_string_append_printf (
+ buffer,
+ "%s id=\"%s\"><table class=\"-e-mail-formatter-header-color\" border=\"0\"
width=\"100%%\" "
+ "style=\"direction: %s; border-spacing: 0px\">"
+ "<tr>",
+ (context->mode != E_MAIL_FORMATTER_MODE_PRINTING) ?
+ "<div class=\"headers -e-mail-formatter-body-color\"" :
+ "<div class=\"headers\" style=\"background-color: #ffffff;\"",
+ e_mail_part_get_id (part),
+ direction);
+ }
if (is_collapsable) {
gint icon_width, icon_height;
@@ -576,6 +600,7 @@ emfe_headers_format (EMailFormatterExtension *extension,
buffer,
part,
context,
+ is_rfc822_headers,
cancellable);
g_string_append (buffer, "</td>");
diff --git a/src/em-format/e-mail-formatter-print-headers.c b/src/em-format/e-mail-formatter-print-headers.c
index e35224aa06..4239d7d0dd 100644
--- a/src/em-format/e-mail-formatter-print-headers.c
+++ b/src/em-format/e-mail-formatter-print-headers.c
@@ -41,7 +41,8 @@ G_DEFINE_TYPE (
E_TYPE_MAIL_FORMATTER_PRINT_EXTENSION)
static const gchar *formatter_mime_types[] = {
- "application/vnd.evolution.headers",
+ E_MAIL_PART_HEADERS_MIME_TYPE,
+ "text/rfc822-headers",
NULL
};
@@ -59,7 +60,7 @@ emfpe_headers_format (EMailFormatterExtension *extension,
gboolean iter_valid;
GString *str;
gchar *subject;
- const gchar *buf;
+ const gchar *buf, *mime_type;
gint attachments_count;
gchar *part_id_prefix;
CamelMimePart *mime_part;
@@ -67,7 +68,11 @@ emfpe_headers_format (EMailFormatterExtension *extension,
GList *head, *link;
const gchar *part_id;
- g_return_val_if_fail (E_IS_MAIL_PART_HEADERS (part), FALSE);
+ g_return_val_if_fail (E_IS_MAIL_PART (part), FALSE);
+
+ mime_type = e_mail_part_get_mime_type (part);
+ if ((mime_type && g_ascii_strcasecmp (mime_type, "text/rfc822-headers") == 0) ||
!E_IS_MAIL_PART_HEADERS (part))
+ return e_mail_formatter_format_as (formatter, context, part, stream, "text/plain",
cancellable);
mime_part = e_mail_part_ref_mime_part (part);
diff --git a/src/em-format/e-mail-formatter-utils.c b/src/em-format/e-mail-formatter-utils.c
index 5724db203f..bc8b910be4 100644
--- a/src/em-format/e-mail-formatter-utils.c
+++ b/src/em-format/e-mail-formatter-utils.c
@@ -45,7 +45,7 @@ e_mail_formatter_format_text_header (EMailFormatter *formatter,
GtkTextDirection direction;
const gchar *fmt, *html;
const gchar *display;
- gchar *mhtml = NULL;
+ gchar *mhtml = NULL, *mfmt = NULL;
g_return_if_fail (E_IS_MAIL_FORMATTER (formatter));
g_return_if_fail (buffer != NULL);
@@ -79,28 +79,33 @@ e_mail_formatter_format_text_header (EMailFormatter *formatter,
fmt = "<tr style=\"display: %s\">"
"<td>%s: %s</td></tr>";
}
- } else if (flags & E_MAIL_FORMATTER_HEADER_FLAG_NODEC) {
- if (direction == GTK_TEXT_DIR_RTL)
- fmt = "<tr class=\"header\" style=\"display: %s\">"
- "<th class=\"header rtl\">%s</th>"
- "<td class=\"header rtl\">%s</td>"
- "</tr>";
- else
- fmt = "<tr class=\"header\" style=\"display: %s\">"
- "<th class=\"header ltr\">%s</th>"
- "<td class=\"header ltr\">%s</td>"
- "</tr>";
} else {
+ const gchar *decstr;
+ const gchar *dirstr;
+ const gchar *extra_style;
+
+ if ((flags & E_MAIL_FORMATTER_HEADER_FLAG_NODEC) != 0)
+ decstr = "";
+ else
+ decstr = ":";
+
+ if ((flags & E_MAIL_FORMATTER_HEADER_FLAG_NO_FORMATTING) != 0)
+ extra_style = " style=\"font-weight: normal;\"";
+ else
+ extra_style = "";
+
if (direction == GTK_TEXT_DIR_RTL)
- fmt = "<tr class=\"header\" style=\"display: %s\">"
- "<th class=\"header rtl\">%s:</th>"
- "<td class=\"header rtl\">%s</td>"
- "</tr>";
+ dirstr = "rtl";
else
- fmt = "<tr class=\"header\" style=\"display: %s\">"
- "<th class=\"header ltr\">%s:</th>"
- "<td class=\"header ltr\">%s</td>"
- "</tr>";
+ dirstr = "ltr";
+
+ mfmt = g_strdup_printf (
+ "<tr class=\"header\" style=\"display: %%s;\">"
+ "<th class=\"header %s\"%s>%%s%s</th>"
+ "<td class=\"header %s\">%%s</td>"
+ "</tr>",
+ dirstr, extra_style, decstr, dirstr);
+ fmt = mfmt;
}
if (flags & E_MAIL_FORMATTER_HEADER_FLAG_HIDDEN)
@@ -111,6 +116,7 @@ e_mail_formatter_format_text_header (EMailFormatter *formatter,
g_string_append_printf (buffer, fmt, display, label, html);
g_free (mhtml);
+ g_free (mfmt);
}
gchar *
diff --git a/src/em-format/e-mail-parser-message-deliverystatus.c
b/src/em-format/e-mail-parser-message-deliverystatus.c
index b22d9ca1ca..081503acde 100644
--- a/src/em-format/e-mail-parser-message-deliverystatus.c
+++ b/src/em-format/e-mail-parser-message-deliverystatus.c
@@ -22,6 +22,7 @@
#include <e-util/e-util.h>
#include "e-mail-part-attachment.h"
+#include "e-mail-part-headers.h"
#include "e-mail-parser-extension.h"
typedef EMailParserExtension EMailParserMessageDeliveryStatus;
@@ -38,6 +39,7 @@ static const gchar *parser_mime_types[] = {
"message/delivery-status",
"message/feedback-report",
"message/disposition-notification",
+ "text/rfc822-headers",
NULL
};
@@ -51,14 +53,58 @@ empe_msg_deliverystatus_parse (EMailParserExtension *extension,
{
GQueue work_queue = G_QUEUE_INIT;
CamelContentType *ct;
- EMailPart *mail_part;
+ EMailPart *mail_part = NULL;
gboolean show_inline;
gsize len;
+ ct = camel_mime_part_get_content_type (part);
+ show_inline = ct && camel_content_type_is (ct, "message", "feedback-report");
+
len = part_id->len;
g_string_append (part_id, ".delivery-status");
- mail_part = e_mail_part_new (part, part_id->str);
- e_mail_part_set_mime_type (mail_part, "text/plain");
+
+ if (ct && camel_content_type_is (ct, "text", "rfc822-headers")) {
+ CamelMimePart *replace_part;
+ CamelMimeParser *parser;
+ CamelStream *stream;
+ gboolean success;
+
+ show_inline = TRUE;
+
+ stream = camel_stream_mem_new ();
+ parser = camel_mime_parser_new ();
+ replace_part = camel_mime_part_new ();
+
+ success = camel_data_wrapper_decode_to_stream_sync (camel_medium_get_content (CAMEL_MEDIUM
(part)), stream, cancellable, NULL);
+ if (success) {
+ g_seekable_seek (G_SEEKABLE (stream), 0, G_SEEK_SET, cancellable, NULL);
+
+ success = camel_mime_parser_init_with_stream (parser, stream, NULL) != -1;
+ }
+
+ success = success && camel_mime_part_construct_from_parser_sync (replace_part, parser,
cancellable, NULL);
+
+ if (success) {
+ const CamelNameValueArray *headers;
+
+ headers = camel_medium_get_headers (CAMEL_MEDIUM (replace_part));
+ success = camel_name_value_array_get_length (headers) > 0;
+ }
+
+ if (success) {
+ mail_part = e_mail_part_headers_new (replace_part, part_id->str);
+ e_mail_part_set_mime_type (mail_part, "text/rfc822-headers");
+ }
+
+ g_object_unref (replace_part);
+ g_object_unref (parser);
+ g_object_unref (stream);
+ }
+
+ if (!mail_part) {
+ mail_part = e_mail_part_new (part, part_id->str);
+ e_mail_part_set_mime_type (mail_part, "text/plain");
+ }
g_string_truncate (part_id, len);
@@ -68,9 +114,6 @@ empe_msg_deliverystatus_parse (EMailParserExtension *extension,
* message/delivery-status is to display the part as an attachment */
e_mail_parser_wrap_as_attachment (parser, part, part_id, &work_queue);
- ct = camel_mime_part_get_content_type (part);
- show_inline = ct && camel_content_type_is (ct, "message", "feedback-report");
-
if (!show_inline) {
GSettings *settings;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]