GList * e_mail_formatter_find_rfc822_end_iter (GList *rfc822_start_iter) { GList *link = rfc822_start_iter; EMailPart *part; const gchar *part_id; gchar *end; g_return_val_if_fail (rfc822_start_iter != NULL, NULL); part = E_MAIL_PART (link->data); part_id = e_mail_part_get_id (part); g_return_val_if_fail (part_id != NULL, NULL); end = g_strconcat (part_id, ".end", NULL); while (link != NULL) { part = E_MAIL_PART (link->data); part_id = e_mail_part_get_id (part); g_return_val_if_fail (part_id != NULL, NULL); if (g_strcmp0 (part_id, end) == 0) break; link = g_list_next (link); } g_free (end); return link; }
static gboolean emfe_attachment_bar_format (EMailFormatterExtension *extension, EMailFormatter *formatter, EMailFormatterContext *context, EMailPart *part, GOutputStream *stream, GCancellable *cancellable) { gchar *str; if ((context->mode != E_MAIL_FORMATTER_MODE_NORMAL) && (context->mode != E_MAIL_FORMATTER_MODE_RAW) && (context->mode != E_MAIL_FORMATTER_MODE_ALL_HEADERS)) return FALSE; str = g_strdup_printf ( "<object type=\"application/vnd.evolution.widget.attachment-bar\" " "height=\"0\" width=\"100%%\" data=\"%s\" id=\"%s\"></object>", e_mail_part_get_id (part), e_mail_part_get_id (part)); g_output_stream_write_all ( stream, str, strlen (str), NULL, cancellable, NULL); g_free (str); return TRUE; }
static EAttachmentStore * find_attachment_store (EMailPartList *part_list, EMailPart *start) { EAttachmentStore *store = NULL; GQueue queue = G_QUEUE_INIT; GList *head, *link; const gchar *start_id; gchar *tmp, *pos; EMailPart *part; gchar *id; start_id = e_mail_part_get_id (start); e_mail_part_list_queue_parts (part_list, NULL, &queue); head = g_queue_peek_head_link (&queue); id = g_strconcat (start_id, ".attachment-bar", NULL); tmp = g_strdup (id); part = NULL; do { d (printf ("Looking up attachment bar as %s\n", id)); for (link = head; link != NULL; link = g_list_next (link)) { EMailPart *p = link->data; const gchar *p_id; p_id = e_mail_part_get_id (p); if (g_strcmp0 (p_id, id) == 0) { part = p; break; } } pos = g_strrstr (tmp, "."); if (!pos) break; g_free (id); g_free (tmp); tmp = g_strndup (start_id, pos - tmp); id = g_strdup_printf ("%s.attachment-bar", tmp); } while (pos && !part); g_free (id); g_free (tmp); if (part != NULL) store = e_mail_part_attachment_bar_get_store ( E_MAIL_PART_ATTACHMENT_BAR (part)); while (!g_queue_is_empty (&queue)) g_object_unref (g_queue_pop_head (&queue)); return store; }
static GtkWidget * emfe_attachment_get_widget (EMailFormatterExtension *extension, EMailPartList *context, EMailPart *part, GHashTable *params) { EAttachment *attachment; EAttachmentStore *store; EAttachmentView *view; GtkWidget *widget; const gchar *part_id; g_return_val_if_fail (E_IS_MAIL_PART_ATTACHMENT (part), NULL); attachment = e_mail_part_attachment_ref_attachment ( E_MAIL_PART_ATTACHMENT (part)); part_id = e_mail_part_get_id (part); store = find_attachment_store (context, part); widget = e_attachment_button_new (); g_object_set_data_full ( G_OBJECT (widget), "uri", g_strdup (part_id), (GDestroyNotify) g_free); e_attachment_button_set_attachment ( E_ATTACHMENT_BUTTON (widget), attachment); view = g_object_get_data (G_OBJECT (store), "attachment-bar"); if (view != NULL) e_attachment_button_set_view ( E_ATTACHMENT_BUTTON (widget), view); gtk_widget_set_can_focus (widget, TRUE); gtk_widget_show (widget); g_object_unref (attachment); return widget; }
static gboolean emfe_attachment_format (EMailFormatterExtension *extension, EMailFormatter *formatter, EMailFormatterContext *context, EMailPart *part, GOutputStream *stream, GCancellable *cancellable) { gchar *text, *html; gchar *button_id; EAttachmentStore *store; EMailExtensionRegistry *registry; GQueue *extensions; EMailPartAttachment *empa; CamelMimePart *mime_part; CamelMimeFilterToHTMLFlags flags; GString *buffer; const gchar *attachment_part_id; const gchar *part_id; g_return_val_if_fail (E_IS_MAIL_PART_ATTACHMENT (part), FALSE); empa = (EMailPartAttachment *) part; part_id = e_mail_part_get_id (part); if ((context->mode == E_MAIL_FORMATTER_MODE_NORMAL) || (context->mode == E_MAIL_FORMATTER_MODE_PRINTING) || (context->mode == E_MAIL_FORMATTER_MODE_ALL_HEADERS)) { EAttachment *attachment; GList *head, *link; attachment = e_mail_part_attachment_ref_attachment ( E_MAIL_PART_ATTACHMENT (part)); head = g_queue_peek_head_link (&part->validities); for (link = head; link != NULL; link = g_list_next (link)) { EMailPartValidityPair *pair = link->data; if (pair == NULL) continue; if ((pair->validity_type & E_MAIL_PART_VALIDITY_SIGNED) != 0) e_attachment_set_signed ( attachment, pair->validity->sign.status); if ((pair->validity_type & E_MAIL_PART_VALIDITY_ENCRYPTED) != 0) e_attachment_set_encrypted ( attachment, pair->validity->encrypt.status); } store = find_attachment_store (context->part_list, part); if (store) { GList *attachments = e_attachment_store_get_attachments (store); if (!g_list_find (attachments, attachment)) { e_attachment_store_add_attachment ( store, attachment); } g_list_free (attachments); } else { g_warning ("Failed to locate attachment-bar for %s", part_id); } g_object_unref (attachment); } registry = e_mail_formatter_get_extension_registry (formatter); extensions = e_mail_extension_registry_get_for_mime_type ( registry, empa->snoop_mime_type); if (extensions == NULL) extensions = e_mail_extension_registry_get_fallback ( registry, empa->snoop_mime_type); /* If the attachment is requested as RAW, then call the * handler directly and do not append any other code. */ if ((context->mode == E_MAIL_FORMATTER_MODE_RAW) || (context->mode == E_MAIL_FORMATTER_MODE_PRINTING)) { GList *head, *link; gboolean success = FALSE; if (extensions == NULL) return FALSE; if (context->mode == E_MAIL_FORMATTER_MODE_PRINTING) { gchar *name; EAttachment *attachment; GFileInfo *file_info; const gchar *display_name; gchar *description; attachment = e_mail_part_attachment_ref_attachment ( E_MAIL_PART_ATTACHMENT (part)); file_info = e_attachment_ref_file_info (attachment); display_name = g_file_info_get_display_name (file_info); description = e_attachment_dup_description (attachment); if (description != NULL && *description != '\0') { name = g_strdup_printf ( "<h2>Attachment: %s (%s)</h2>\n", description, display_name); } else { name = g_strdup_printf ( "<h2>Attachment: %s</h2>\n", display_name); } g_output_stream_write_all ( stream, name, strlen (name), NULL, cancellable, NULL); g_free (description); g_free (name); g_object_unref (attachment); g_object_unref (file_info); } head = g_queue_peek_head_link (extensions); for (link = head; link != NULL; link = g_list_next (link)) { success = e_mail_formatter_extension_format ( E_MAIL_FORMATTER_EXTENSION (link->data), formatter, context, part, stream, cancellable); if (success) break; } return success; } /* E_MAIL_FORMATTER_MODE_NORMAL: */ mime_part = e_mail_part_ref_mime_part (part); text = e_mail_part_describe (mime_part, empa->snoop_mime_type); flags = e_mail_formatter_get_text_format_flags (formatter); html = camel_text_to_html ( text, flags & CAMEL_MIME_FILTER_TOHTML_CONVERT_URLS, 0); g_free (text); g_object_unref (mime_part); if (empa->attachment_view_part_id) attachment_part_id = empa->attachment_view_part_id; else attachment_part_id = part_id; button_id = g_strconcat (attachment_part_id, ".attachment_button", NULL); /* XXX Wild guess at the initial size. */ buffer = g_string_sized_new (8192); g_string_append_printf ( buffer, "<div class=\"attachment\">" "<table width=\"100%%\" border=\"0\">" "<tr valign=\"middle\">" "<td align=\"left\" width=\"100\">" "<object type=\"application/vnd.evolution.widget.attachment-button\" " "height=\"20\" width=\"100\" data=\"%s\" id=\"%s\"></object>" "</td>" "<td align=\"left\">%s</td>" "</tr>", part_id, button_id, html); g_free (button_id); g_free (html); if (extensions != NULL) { GOutputStream *content_stream; gboolean success = FALSE; content_stream = g_memory_output_stream_new_resizable (); if (empa->attachment_view_part_id != NULL) { EMailPart *attachment_view_part; attachment_view_part = e_mail_part_list_ref_part ( context->part_list, empa->attachment_view_part_id); /* Avoid recursion. */ if (attachment_view_part == part) g_clear_object (&attachment_view_part); if (attachment_view_part != NULL) { success = e_mail_formatter_format_as ( formatter, context, attachment_view_part, content_stream, NULL, cancellable); g_object_unref (attachment_view_part); } } else { GList *head, *link; head = g_queue_peek_head_link (extensions); for (link = head; link != NULL; link = g_list_next (link)) { success = e_mail_formatter_extension_format ( E_MAIL_FORMATTER_EXTENSION (link->data), formatter, context, part, content_stream, cancellable); if (success) break; } } if (success) { gchar *wrapper_element_id; gconstpointer data; gsize size; wrapper_element_id = g_strconcat ( attachment_part_id, ".wrapper", NULL); data = g_memory_output_stream_get_data ( G_MEMORY_OUTPUT_STREAM (content_stream)); size = g_memory_output_stream_get_data_size ( G_MEMORY_OUTPUT_STREAM (content_stream)); g_string_append_printf ( buffer, "<tr><td colspan=\"2\">" "<div class=\"attachment-wrapper\" id=\"%s\">", wrapper_element_id); g_string_append_len (buffer, data, size); g_string_append (buffer, "</div></td></tr>"); g_free (wrapper_element_id); } g_object_unref (content_stream); } g_string_append (buffer, "</table></div>"); g_output_stream_write_all ( stream, buffer->str, buffer->len, NULL, cancellable, NULL); g_string_free (buffer, TRUE); return TRUE; }
static gboolean emfe_message_rfc822_format (EMailFormatterExtension *extension, EMailFormatter *formatter, EMailFormatterContext *context, EMailPart *part, GOutputStream *stream, GCancellable *cancellable) { const gchar *part_id; part_id = e_mail_part_get_id (part); if (g_cancellable_is_cancelled (cancellable)) return FALSE; if (context->mode == E_MAIL_FORMATTER_MODE_RAW) { GQueue queue = G_QUEUE_INIT; GList *head, *link; gchar *header, *end; const gchar *string; header = e_mail_formatter_get_html_header (formatter); g_output_stream_write_all ( stream, header, strlen (header), NULL, cancellable, NULL); g_free (header); /* Print content of the message normally */ context->mode = E_MAIL_FORMATTER_MODE_NORMAL; e_mail_part_list_queue_parts ( context->part_list, part_id, &queue); /* Discard the first EMailPart. */ if (!g_queue_is_empty (&queue)) g_object_unref (g_queue_pop_head (&queue)); head = g_queue_peek_head_link (&queue); end = g_strconcat (part_id, ".end", NULL); for (link = head; link != NULL; link = g_list_next (link)) { EMailPart *p = link->data; const gchar *p_id; p_id = e_mail_part_get_id (p); /* Check for nested rfc822 messages */ if (e_mail_part_id_has_suffix (p, ".rfc822")) { gchar *sub_end = g_strconcat (p_id, ".end", NULL); while (link != NULL) { p = link->data; if (g_strcmp0 (p_id, sub_end) == 0) break; link = g_list_next (link); } g_free (sub_end); continue; } if ((g_strcmp0 (p_id, end) == 0)) break; if (p->is_hidden) continue; e_mail_formatter_format_as ( formatter, context, p, stream, NULL, cancellable); } g_free (end); while (!g_queue_is_empty (&queue)) g_object_unref (g_queue_pop_head (&queue)); context->mode = E_MAIL_FORMATTER_MODE_RAW; string = "</body></html>"; g_output_stream_write_all ( stream, string, strlen (string), NULL, cancellable, NULL); } else if (context->mode == E_MAIL_FORMATTER_MODE_PRINTING) { GQueue queue = G_QUEUE_INIT; GList *head, *link; gchar *end; /* Part is EMailPartAttachment */ e_mail_part_list_queue_parts ( context->part_list, part_id, &queue); /* Discard the first EMailPart. */ if (!g_queue_is_empty (&queue)) g_object_unref (g_queue_pop_head (&queue)); if (g_queue_is_empty (&queue)) return FALSE; part = g_queue_pop_head (&queue); end = g_strconcat (part_id, ".end", NULL); g_object_unref (part); head = g_queue_peek_head_link (&queue); for (link = head; link != NULL; link = g_list_next (link)) { EMailPart *p = link->data; const gchar *p_id; p_id = e_mail_part_get_id (p); /* Check for nested rfc822 messages */ if (e_mail_part_id_has_suffix (p, ".rfc822")) { gchar *sub_end = g_strconcat (p_id, ".end", NULL); while (link != NULL) { p = link->data; if (g_strcmp0 (p_id, sub_end) == 0) break; link = g_list_next (link); } g_free (sub_end); continue; } if ((g_strcmp0 (p_id, end) == 0)) break; if (p->is_hidden) continue; e_mail_formatter_format_as ( formatter, context, p, stream, NULL, cancellable); } g_free (end); while (!g_queue_is_empty (&queue)) g_object_unref (g_queue_pop_head (&queue)); } else { EMailPart *p; CamelFolder *folder; const gchar *message_uid; const gchar *default_charset, *charset; gchar *str; gchar *uri; p = e_mail_part_list_ref_part (context->part_list, part_id); if (p == NULL) return FALSE; folder = e_mail_part_list_get_folder (context->part_list); message_uid = e_mail_part_list_get_message_uid (context->part_list); default_charset = e_mail_formatter_get_default_charset (formatter); charset = e_mail_formatter_get_charset (formatter); if (!default_charset) default_charset = ""; if (!charset) charset = ""; uri = e_mail_part_build_uri ( folder, message_uid, "part_id", G_TYPE_STRING, e_mail_part_get_id (p), "mode", G_TYPE_INT, E_MAIL_FORMATTER_MODE_RAW, "headers_collapsable", G_TYPE_INT, 0, "formatter_default_charset", G_TYPE_STRING, default_charset, "formatter_charset", G_TYPE_STRING, charset, NULL); str = g_strdup_printf ( "<div class=\"part-container " "-e-mail-formatter-body-color\">\n" "<iframe width=\"100%%\" height=\"10\"" " id=\"%s.iframe\" " " class=\"-e-mail-formatter-frame-color\"" " frameborder=\"0\" src=\"%s\" name=\"%s\"></iframe>" "</div>", part_id, uri, part_id); g_output_stream_write_all ( stream, str, strlen (str), NULL, cancellable, NULL); g_free (str); g_free (uri); g_object_unref (p); } return TRUE; }
void e_mail_formatter_format_security_header (EMailFormatter *formatter, EMailFormatterContext *context, GString *buffer, EMailPart *part, guint32 flags) { const gchar* part_id; gchar* part_id_prefix; GString* tmp; GQueue queue = G_QUEUE_INIT; GList *head, *link; g_return_if_fail (E_IS_MAIL_PART_HEADERS (part)); /* Get prefix of this PURI */ part_id = e_mail_part_get_id (part); part_id_prefix = g_strndup (part_id, g_strrstr (part_id, ".") - part_id); /* Add encryption/signature header */ tmp = g_string_new (""); e_mail_part_list_queue_parts (context->part_list, NULL, &queue); head = g_queue_peek_head_link (&queue); /* Find first secured part. */ for (link = head; link != NULL; link = g_list_next(link)) { EMailPart *mail_part = link->data; if (!e_mail_part_has_validity (mail_part)) continue; if (!e_mail_part_id_has_prefix (mail_part, part_id_prefix)) continue; if (e_mail_part_get_validity (mail_part, E_MAIL_PART_VALIDITY_PGP | E_MAIL_PART_VALIDITY_SIGNED)) { g_string_append (tmp, _("GPG signed")); } if (e_mail_part_get_validity (mail_part, E_MAIL_PART_VALIDITY_PGP | E_MAIL_PART_VALIDITY_ENCRYPTED)) { if (tmp->len > 0) g_string_append (tmp, ", "); g_string_append (tmp, _("GPG encrypted")); } if (e_mail_part_get_validity (mail_part, E_MAIL_PART_VALIDITY_SMIME | E_MAIL_PART_VALIDITY_SIGNED)) { if (tmp->len > 0) g_string_append (tmp, ", "); g_string_append (tmp, _("S/MIME signed")); } if (e_mail_part_get_validity (mail_part, E_MAIL_PART_VALIDITY_SMIME | E_MAIL_PART_VALIDITY_ENCRYPTED)) { if (tmp->len > 0) g_string_append (tmp, ", "); g_string_append (tmp, _("S/MIME encrypted")); } break; } if (tmp->len > 0) { e_mail_formatter_format_header ( formatter, buffer, _("Security"), tmp->str, flags, "UTF-8"); } while (!g_queue_is_empty (&queue)) g_object_unref (g_queue_pop_head (&queue)); g_string_free (tmp, TRUE); g_free (part_id_prefix); }
static gboolean emfpe_headers_format (EMailFormatterExtension *extension, EMailFormatter *formatter, EMailFormatterContext *context, EMailPart *part, GOutputStream *stream, GCancellable *cancellable) { EMailPartHeaders *headers_part; GtkTreeModel *tree_model; GtkTreeIter iter; gboolean iter_valid; GString *str, *tmp; gchar *subject; const gchar *buf; gint attachments_count; gchar *part_id_prefix; CamelMimePart *mime_part; GQueue queue = G_QUEUE_INIT; GList *head, *link; const gchar *part_id; g_return_val_if_fail (E_IS_MAIL_PART_HEADERS (part), FALSE); mime_part = e_mail_part_ref_mime_part (part); buf = camel_medium_get_header (CAMEL_MEDIUM (mime_part), "subject"); subject = camel_header_decode_string (buf, "UTF-8"); str = g_string_new (""); g_string_append_printf (str, "<h1>%s</h1>\n", subject); g_free (subject); g_string_append ( str, "<table border=\"0\" cellspacing=\"5\" " "cellpadding=\"0\" class=\"printing-header\">\n"); headers_part = E_MAIL_PART_HEADERS (part); tree_model = e_mail_part_headers_ref_print_model (headers_part); iter_valid = gtk_tree_model_get_iter_first (tree_model, &iter); while (iter_valid) { gchar *header_name = NULL; gchar *header_value = NULL; gboolean include = FALSE; gtk_tree_model_get ( tree_model, &iter, E_MAIL_PART_HEADERS_PRINT_MODEL_COLUMN_INCLUDE, &include, E_MAIL_PART_HEADERS_PRINT_MODEL_COLUMN_HEADER_NAME, &header_name, E_MAIL_PART_HEADERS_PRINT_MODEL_COLUMN_HEADER_VALUE, &header_value, -1); if (include) e_mail_formatter_format_header ( formatter, str, header_name, header_value, E_MAIL_FORMATTER_HEADER_FLAG_NOLINKS, "UTF-8"); g_free (header_name); g_free (header_value); iter_valid = gtk_tree_model_iter_next (tree_model, &iter); } g_object_unref (tree_model); /* Get prefix of this PURI */ part_id = e_mail_part_get_id (part); part_id_prefix = g_strndup (part_id, g_strrstr (part_id, ".") - part_id); /* Add encryption/signature header */ tmp = g_string_new (""); e_mail_part_list_queue_parts (context->part_list, NULL, &queue); head = g_queue_peek_head_link (&queue); /* Find first secured part. */ for (link = head; link != NULL; link = g_list_next (link)) { EMailPart *mail_part = link->data; if (!e_mail_part_has_validity (mail_part)) continue; if (!e_mail_part_id_has_prefix (mail_part, part_id_prefix)) continue; if (e_mail_part_get_validity (mail_part, E_MAIL_PART_VALIDITY_PGP | E_MAIL_PART_VALIDITY_SIGNED)) { g_string_append (tmp, _("GPG signed")); } if (e_mail_part_get_validity (mail_part, E_MAIL_PART_VALIDITY_PGP | E_MAIL_PART_VALIDITY_ENCRYPTED)) { if (tmp->len > 0) g_string_append (tmp, ", "); g_string_append (tmp, _("GPG encrpyted")); } if (e_mail_part_get_validity (mail_part, E_MAIL_PART_VALIDITY_SMIME | E_MAIL_PART_VALIDITY_SIGNED)) { if (tmp->len > 0) g_string_append (tmp, ", "); g_string_append (tmp, _("S/MIME signed")); } if (e_mail_part_get_validity (mail_part, E_MAIL_PART_VALIDITY_SMIME | 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) { e_mail_formatter_format_header ( formatter, str, _("Security"), tmp->str, 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 (link = head; link != NULL; link = g_list_next (link)) { EMailPart *mail_part = E_MAIL_PART (link->data); if (!e_mail_part_id_has_prefix (mail_part, part_id_prefix)) continue; if (!e_mail_part_get_is_attachment (mail_part)) continue; if (mail_part->is_hidden) continue; if (e_mail_part_get_cid (mail_part) != NULL) continue; attachments_count++; } if (attachments_count > 0) { gchar *header_value; header_value = g_strdup_printf ("%d", attachments_count); e_mail_formatter_format_header ( formatter, str, _("Attachments"), header_value, E_MAIL_FORMATTER_HEADER_FLAG_BOLD | E_MAIL_FORMATTER_HEADER_FLAG_NOLINKS, "UTF-8"); g_free (header_value); } while (!g_queue_is_empty (&queue)) g_object_unref (g_queue_pop_head (&queue)); g_string_append (str, "</table>"); g_output_stream_write_all ( stream, str->str, str->len, NULL, cancellable, NULL); g_string_free (str, TRUE); g_free (part_id_prefix); g_object_unref (mime_part); return TRUE; }