From 5b8340563c271fb684a88c6e5bb6dd3bfb629058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Vr=C3=A1til?= Date: Wed, 6 Jun 2012 15:27:19 +0200 Subject: Mail formatter rewrite All mail-parsing and formatting code has been moved to em-format. Parsing is handeled by EMailParser class, formatting by EMailFormatter. Both classes have registry which hold extensions - simple classes that do actual parsing and formatting. Each supported mime-type has it's own parser and formatter extension class. --- em-format/e-mail-formatter-print-headers.c | 258 +++++++++++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 em-format/e-mail-formatter-print-headers.c (limited to 'em-format/e-mail-formatter-print-headers.c') diff --git a/em-format/e-mail-formatter-print-headers.c b/em-format/e-mail-formatter-print-headers.c new file mode 100644 index 0000000000..86fc85b063 --- /dev/null +++ b/em-format/e-mail-formatter-print-headers.c @@ -0,0 +1,258 @@ +/* + * e-mail-formatter-print-headers.c + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the program; if not, see + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "e-mail-format-extensions.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include + +typedef struct _EMailFormatterPrintHeaders { + GObject parent; +} EMailFormatterPrintHeaders; + +typedef struct _EMailFormatterPrintHeadersClass { + GObjectClass parent_class; +} EMailFormatterPrintHeadersClass; + +static const gchar *formatter_mime_types[] = { "application/vnd.evolution.headers", NULL }; + +static void e_mail_formatter_print_formatter_extension_interface_init + (EMailFormatterExtensionInterface *iface); +static void e_mail_formatter_print_mail_extension_interface_init + (EMailExtensionInterface *iface); + +G_DEFINE_TYPE_EXTENDED ( + EMailFormatterPrintHeaders, + e_mail_formatter_print_headers, + G_TYPE_OBJECT, + 0, + G_IMPLEMENT_INTERFACE ( + E_TYPE_MAIL_EXTENSION, + e_mail_formatter_print_mail_extension_interface_init) + G_IMPLEMENT_INTERFACE ( + E_TYPE_MAIL_FORMATTER_EXTENSION, + e_mail_formatter_print_formatter_extension_interface_init)) + +static gboolean +emfpe_headers_format (EMailFormatterExtension *extension, + EMailFormatter *formatter, + EMailFormatterContext *context, + EMailPart *part, + CamelStream *stream, + GCancellable *cancellable) +{ + struct _camel_header_raw raw_header; + GString *str, *tmp; + gchar *subject; + const gchar *buf; + GSList *parts_iter; + GList *iter; + gint attachments_count; + gchar *part_id_prefix; + const GQueue *headers; + + buf = camel_medium_get_header (CAMEL_MEDIUM (part->part), "subject"); + subject = camel_header_decode_string (buf, "UTF-8"); + str = g_string_new (""); + g_string_append_printf (str, "

%s

\n", subject); + g_free (subject); + + g_string_append ( + str, + "\n"); + + headers = e_mail_formatter_get_headers (formatter); + for (iter = headers->head; iter; iter = iter->next) { + + EMailFormatterHeader *header = iter->data; + raw_header.name = header->name; + + /* Skip 'Subject' header, it's already displayed. */ + if (g_ascii_strncasecmp (header->name, "Subject", 7) == 0) + continue; + + if (header->value && *header->value) { + raw_header.value = header->value; + e_mail_formatter_format_header (formatter, str, + CAMEL_MEDIUM (part->part), &raw_header, + header->flags | E_MAIL_FORMATTER_HEADER_FLAG_NOLINKS, + "UTF-8"); + } else { + raw_header.value = g_strdup (camel_medium_get_header ( + CAMEL_MEDIUM (context->message), header->name)); + + if (raw_header.value && *raw_header.value) { + e_mail_formatter_format_header (formatter, str, + CAMEL_MEDIUM (part->part), &raw_header, + header->flags | E_MAIL_FORMATTER_HEADER_FLAG_NOLINKS, + "UTF-8"); + } + + if (raw_header.value) + g_free (raw_header.value); + } + } + + /* Get prefix of this PURI */ + part_id_prefix = g_strndup (part->id, g_strrstr (part->id, ".") - part->id); + + /* Add encryption/signature header */ + raw_header.name = _("Security"); + tmp = g_string_new (""); + /* Find first secured part. */ + for (parts_iter = context->parts; parts_iter; parts_iter = parts_iter->next) { + + EMailPart *mail_part = parts_iter->data; + if (mail_part == NULL) + continue; + + if (mail_part->validity_type == 0) + continue; + + if (!g_str_has_prefix (mail_part->id, part_id_prefix)) + continue; + + if ((mail_part->validity_type & E_MAIL_PART_VALIDITY_PGP) && + (mail_part->validity_type & E_MAIL_PART_VALIDITY_SIGNED)) { + g_string_append (tmp, _("GPG signed")); + } + if ((mail_part->validity_type & E_MAIL_PART_VALIDITY_PGP) && + (mail_part->validity_type & E_MAIL_PART_VALIDITY_ENCRYPTED)) { + if (tmp->len > 0) g_string_append (tmp, ", "); + g_string_append (tmp, _("GPG encrpyted")); + } + if ((mail_part->validity_type & E_MAIL_PART_VALIDITY_SMIME) && + (mail_part->validity_type & E_MAIL_PART_VALIDITY_SIGNED)) { + + if (tmp->len > 0) g_string_append (tmp, ", "); + g_string_append (tmp, _("S/MIME signed")); + } + if ((mail_part->validity_type & E_MAIL_PART_VALIDITY_SMIME) && + (mail_part->validity_type & E_MAIL_PART_VALIDITY_ENCRYPTED)) { + + if (tmp->len > 0) g_string_append (tmp, ", "); + g_string_append (tmp, _("S/MIME encrpyted")); + } + + break; + } + + if (tmp->len > 0) { + raw_header.value = tmp->str; + e_mail_formatter_format_header ( + formatter, str, CAMEL_MEDIUM (part->part), &raw_header, + E_MAIL_FORMATTER_HEADER_FLAG_BOLD | + E_MAIL_FORMATTER_HEADER_FLAG_NOLINKS, "UTF-8"); + } + g_string_free (tmp, TRUE); + + /* Count attachments and display the number as a header */ + attachments_count = 0; + + for (parts_iter = context->parts; parts_iter; parts_iter = parts_iter->next) { + + EMailPart *mail_part = parts_iter->data; + if (!mail_part) + continue; + + if (!g_str_has_prefix (mail_part->id, part_id_prefix)) + continue; + + if (mail_part->is_attachment && !mail_part->cid && + !mail_part->is_hidden) { + attachments_count++; + } + } + + if (attachments_count > 0) { + raw_header.name = _("Attachments"); + raw_header.value = g_strdup_printf ("%d", attachments_count); + e_mail_formatter_format_header ( + formatter, str, CAMEL_MEDIUM (part->part), &raw_header, + E_MAIL_FORMATTER_HEADER_FLAG_BOLD | + E_MAIL_FORMATTER_HEADER_FLAG_NOLINKS, "UTF-8"); + g_free (raw_header.value); + } + + g_string_append (str, "
"); + + camel_stream_write_string (stream, str->str, cancellable, NULL); + g_string_free (str, TRUE); + g_free (part_id_prefix); + + return TRUE; +} + +static const gchar * +emfpe_headers_get_display_name (EMailFormatterExtension *extension) +{ + return NULL; +} + +static const gchar * +emfpe_headers_get_description (EMailFormatterExtension *extension) +{ + return NULL; +} + +static const gchar ** +emfpe_headers_mime_types (EMailExtension *extension) +{ + return formatter_mime_types; +} + +static void +e_mail_formatter_print_headers_class_init (EMailFormatterPrintHeadersClass *klass) +{ + e_mail_formatter_print_headers_parent_class = g_type_class_peek_parent (klass); +} + +static void +e_mail_formatter_print_formatter_extension_interface_init (EMailFormatterExtensionInterface *iface) +{ + iface->format = emfpe_headers_format; + iface->get_display_name = emfpe_headers_get_display_name; + iface->get_description = emfpe_headers_get_description; +} + +static void +e_mail_formatter_print_mail_extension_interface_init (EMailExtensionInterface *iface) +{ + iface->mime_types = emfpe_headers_mime_types; +} + +static void +e_mail_formatter_print_headers_init (EMailFormatterPrintHeaders *formatter) +{ + +} -- cgit v1.2.3