[evolution] I#494 - Format text/rfc822-headers as message headers



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]