static void mail_formatter_print_run (EMailFormatter *formatter, EMailFormatterContext *context, GOutputStream *stream, GCancellable *cancellable) { GQueue queue = G_QUEUE_INIT; GQueue attachments = G_QUEUE_INIT; GList *head, *link; const gchar *string; context->mode = E_MAIL_FORMATTER_MODE_PRINTING; string = "<!DOCTYPE HTML>\n" "<html>\n" "<head>\n" "<meta name=\"generator\" content=\"Evolution Mail\" />\n" "<title>Evolution Mail Display</title>\n" "<link type=\"text/css\" rel=\"stylesheet\" " " media=\"print\" href=\"" STYLESHEET_URI "/>\n" "</head>\n" "<body style=\"background: #FFF; color: #000;\">"; g_output_stream_write_all ( stream, string, strlen (string), NULL, cancellable, NULL); e_mail_part_list_queue_parts (context->part_list, NULL, &queue); head = g_queue_peek_head_link (&queue); for (link = head; link != NULL; link = g_list_next (link)) { EMailPart *part = E_MAIL_PART (link->data); const gchar *mime_type; gboolean ok; if (g_cancellable_is_cancelled (cancellable)) break; if (part->is_hidden && !part->is_error) { if (e_mail_part_id_has_suffix (part, ".rfc822")) { link = e_mail_formatter_find_rfc822_end_iter (link); } continue; } mime_type = e_mail_part_get_mime_type (part); if (mime_type == NULL) continue; if (e_mail_part_get_is_attachment (part)) { if (e_mail_part_get_cid (part) != NULL) continue; g_queue_push_tail (&attachments, part); } ok = e_mail_formatter_format_as ( formatter, context, part, stream, mime_type, cancellable); /* If the written part was message/rfc822 then * jump to the end of the message, because content * of the whole message has been formatted by * message_rfc822 formatter */ if (ok && e_mail_part_id_has_suffix (part, ".rfc822")) { link = e_mail_formatter_find_rfc822_end_iter (link); continue; } } while (!g_queue_is_empty (&queue)) g_object_unref (g_queue_pop_head (&queue)); /* This consumes the attachments queue. */ if (!g_queue_is_empty (&attachments)) mail_formatter_print_write_attachments ( formatter, &attachments, stream, cancellable); string = "</body></html>"; g_output_stream_write_all ( stream, string, strlen (string), NULL, cancellable, NULL); }
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; }
static void mail_formatter_quote_run (EMailFormatter *formatter, EMailFormatterContext *context, GOutputStream *stream, GCancellable *cancellable) { EMailFormatterQuote *qf; EMailFormatterQuoteContext *qf_context; GQueue queue = G_QUEUE_INIT; GList *head, *link; const gchar *string; if (g_cancellable_is_cancelled (cancellable)) return; qf = E_MAIL_FORMATTER_QUOTE (formatter); qf_context = (EMailFormatterQuoteContext *) context; qf_context->qf_flags = qf->priv->flags; g_seekable_seek ( G_SEEKABLE (stream), 0, G_SEEK_SET, NULL, NULL); e_mail_part_list_queue_parts (context->part_list, NULL, &queue); head = g_queue_peek_head_link (&queue); for (link = head; link != NULL; link = g_list_next (link)) { EMailPart *part = E_MAIL_PART (link->data); const gchar *mime_type; if (e_mail_part_id_has_suffix (part, ".headers") && !(qf_context->qf_flags & E_MAIL_FORMATTER_QUOTE_FLAG_HEADERS)) { continue; } if (e_mail_part_id_has_suffix (part, ".rfc822")) { link = e_mail_formatter_find_rfc822_end_iter (link); continue; } if (part->is_hidden) continue; if (e_mail_part_get_is_attachment (part)) continue; mime_type = e_mail_part_get_mime_type (part); e_mail_formatter_format_as ( formatter, context, part, stream, mime_type, cancellable); } while (!g_queue_is_empty (&queue)) g_object_unref (g_queue_pop_head (&queue)); /* Before we were inserting the BR elements and the credits in front of * the actual HTML code of the message. But this was wrong as when WebKit * was loading the given HTML code that looked like * <br>CREDITS<html>MESSAGE_CODE</html> WebKit parsed it like * <html><br>CREDITS</html><html>MESSAGE_CODE</html>. As no elements are * allowed outside of the HTML root element WebKit wrapped them into * another HTML root element. Afterwards the first root element was * treated as the primary one and all the elements from the second's root * HEAD and BODY elements were moved to the first one. * Thus the HTML that was loaded into composer contained the i.e. META * or STYLE definitions in the body. * So if we want to put something into the message we have to put it into * the special span element and it will be moved to body in EHTMLEditorView */ if (qf->priv->credits && *qf->priv->credits) { gchar *credits = g_strdup_printf ( "<span class=\"-x-evo-to-body\"><pre>%s</pre></span>", qf->priv->credits); g_output_stream_write_all ( stream, credits, strlen (credits), NULL, cancellable, NULL); g_free (credits); } /* If we want to cite the message we have to append the special span element * after the message and cite it in EHTMLEditorView because of reasons * mentioned above */ if (qf->priv->flags & E_MAIL_FORMATTER_QUOTE_FLAG_CITE) { string = "<span class=\"-x-evo-cite-body\"><span>"; g_output_stream_write_all ( stream, string, strlen (string), NULL, cancellable, NULL); } }