Add e_mail_part_ref_mime_part().

This commit is contained in:
Matthew Barnes
2013-05-18 11:24:40 -04:00
parent 5ad0b6d8f7
commit f19058ea7a
17 changed files with 131 additions and 39 deletions

View File

@ -122,6 +122,7 @@ emfe_attachment_format (EMailFormatterExtension *extension,
EMailExtensionRegistry *reg;
GQueue *extensions;
EMailPartAttachment *empa;
CamelMimePart *mime_part;
CamelMimeFilterToHTMLFlags flags;
const gchar *attachment_part_id;
const gchar *part_id;
@ -250,11 +251,13 @@ emfe_attachment_format (EMailFormatterExtension *extension,
reg, empa->snoop_mime_type);
}
text = e_mail_part_describe (part->part, empa->snoop_mime_type);
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;

View File

@ -51,10 +51,12 @@ emfe_error_format (EMailFormatterExtension *extension,
{
CamelStream *filtered_stream;
CamelMimeFilter *filter;
CamelMimePart *mime_part;
CamelDataWrapper *dw;
gchar *html;
dw = camel_medium_get_content (CAMEL_MEDIUM (part->part));
mime_part = e_mail_part_ref_mime_part (part);
dw = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
html = g_strdup_printf (
"<div class=\"part-container\" style=\""
@ -100,6 +102,8 @@ emfe_error_format (EMailFormatterExtension *extension,
"</div>",
cancellable, NULL);
g_object_unref (mime_part);
return TRUE;
}

View File

@ -532,6 +532,7 @@ emfe_headers_format (EMailFormatterExtension *extension,
CamelStream *stream,
GCancellable *cancellable)
{
CamelMimePart *mime_part;
GString *buffer;
const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
const GdkRGBA *body_rgba = &white;
@ -543,7 +544,8 @@ emfe_headers_format (EMailFormatterExtension *extension,
if (g_cancellable_is_cancelled (cancellable))
return FALSE;
if (!part->part)
mime_part = e_mail_part_ref_mime_part (part);
if (mime_part == NULL)
return FALSE;
switch (gtk_widget_get_default_direction ()) {
@ -599,13 +601,13 @@ emfe_headers_format (EMailFormatterExtension *extension,
if (is_collapsable)
format_short_headers (
formatter, buffer,
CAMEL_MEDIUM (part->part),
CAMEL_MEDIUM (mime_part),
context->flags,
cancellable);
format_full_headers (
formatter, buffer,
CAMEL_MEDIUM (part->part),
CAMEL_MEDIUM (mime_part),
context->mode,
context->flags,
cancellable);
@ -618,6 +620,8 @@ emfe_headers_format (EMailFormatterExtension *extension,
g_string_free (buffer, TRUE);
g_object_unref (mime_part);
return TRUE;
}

View File

@ -69,6 +69,7 @@ emfe_image_format (EMailFormatterExtension *extension,
GCancellable *cancellable)
{
gchar *content;
CamelMimePart *mime_part;
CamelDataWrapper *dw;
GByteArray *ba;
CamelStream *raw_content;
@ -76,7 +77,8 @@ emfe_image_format (EMailFormatterExtension *extension,
if (g_cancellable_is_cancelled (cancellable))
return FALSE;
dw = camel_medium_get_content (CAMEL_MEDIUM (part->part));
mime_part = e_mail_part_ref_mime_part (part);
dw = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
g_return_val_if_fail (dw, FALSE);
raw_content = camel_stream_mem_new ();
@ -139,6 +141,8 @@ emfe_image_format (EMailFormatterExtension *extension,
g_object_unref (raw_content);
g_object_unref (mime_part);
return TRUE;
}

View File

@ -61,12 +61,15 @@ emfpe_headers_format (EMailFormatterExtension *extension,
const gchar *buf;
gint attachments_count;
gchar *part_id_prefix;
CamelMimePart *mime_part;
GQueue *headers_queue;
GQueue queue = G_QUEUE_INIT;
GList *head, *link;
const gchar *part_id;
buf = camel_medium_get_header (CAMEL_MEDIUM (part->part), "subject");
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);
@ -90,7 +93,7 @@ emfpe_headers_format (EMailFormatterExtension *extension,
raw_header.value = header->value;
e_mail_formatter_format_header (
formatter, str,
CAMEL_MEDIUM (part->part), &raw_header,
CAMEL_MEDIUM (mime_part), &raw_header,
header->flags | E_MAIL_FORMATTER_HEADER_FLAG_NOLINKS,
"UTF-8");
} else {
@ -106,7 +109,7 @@ emfpe_headers_format (EMailFormatterExtension *extension,
if (raw_header.value && *raw_header.value) {
e_mail_formatter_format_header (
formatter, str,
CAMEL_MEDIUM (part->part), &raw_header,
CAMEL_MEDIUM (mime_part), &raw_header,
header->flags | E_MAIL_FORMATTER_HEADER_FLAG_NOLINKS,
"UTF-8");
}
@ -169,7 +172,7 @@ emfpe_headers_format (EMailFormatterExtension *extension,
raw_header.value = tmp->str;
e_mail_formatter_format_header (
formatter, str,
CAMEL_MEDIUM (part->part), &raw_header,
CAMEL_MEDIUM (mime_part), &raw_header,
E_MAIL_FORMATTER_HEADER_FLAG_BOLD |
E_MAIL_FORMATTER_HEADER_FLAG_NOLINKS, "UTF-8");
}
@ -201,7 +204,7 @@ emfpe_headers_format (EMailFormatterExtension *extension,
raw_header.value = g_strdup_printf ("%d", attachments_count);
e_mail_formatter_format_header (
formatter, str,
CAMEL_MEDIUM (part->part), &raw_header,
CAMEL_MEDIUM (mime_part), &raw_header,
E_MAIL_FORMATTER_HEADER_FLAG_BOLD |
E_MAIL_FORMATTER_HEADER_FLAG_NOLINKS, "UTF-8");
g_free (raw_header.value);
@ -216,6 +219,8 @@ emfpe_headers_format (EMailFormatterExtension *extension,
g_string_free (str, TRUE);
g_free (part_id_prefix);
g_object_unref (mime_part);
return TRUE;
}

View File

@ -59,6 +59,7 @@ emfqe_attachment_format (EMailFormatterExtension *extension,
EMailPartAttachment *empa;
EMailPart *attachment_view_part;
CamelMimeFilterToHTMLFlags text_format_flags;
CamelMimePart *mime_part;
empa = E_MAIL_PART_ATTACHMENT (part);
@ -74,9 +75,11 @@ emfqe_attachment_format (EMailFormatterExtension *extension,
text_format_flags =
e_mail_formatter_get_text_format_flags (formatter);
mime_part = e_mail_part_ref_mime_part (part);
text = e_mail_part_describe (
part->part,
mime_part,
empa ? empa->snoop_mime_type : part->mime_type);
g_object_unref (mime_part);
html = camel_text_to_html (
text,

View File

@ -190,6 +190,7 @@ emqfe_headers_format (EMailFormatterExtension *extension,
GCancellable *cancellable)
{
CamelContentType *ct;
CamelMimePart *mime_part;
const gchar *charset;
GList *iter;
GString *buffer;
@ -198,7 +199,9 @@ emqfe_headers_format (EMailFormatterExtension *extension,
if (!part)
return FALSE;
ct = camel_mime_part_get_content_type ((CamelMimePart *) part->part);
mime_part = e_mail_part_ref_mime_part (part);
ct = camel_mime_part_get_content_type (mime_part);
charset = camel_content_type_param (ct, "charset");
charset = camel_iconv_charset_name (charset);
@ -214,13 +217,13 @@ emqfe_headers_format (EMailFormatterExtension *extension,
flags = h->flags & ~E_MAIL_FORMATTER_HEADER_FLAG_HTML;
flags |= E_MAIL_FORMATTER_HEADER_FLAG_NOELIPSIZE;
for (raw_header = part->part->headers; raw_header; raw_header = raw_header->next) {
for (raw_header = mime_part->headers; raw_header; raw_header = raw_header->next) {
if (g_strcmp0 (raw_header->name, h->name) == 0) {
emfqe_format_header (
formatter, buffer,
(CamelMedium *) part->part,
CAMEL_MEDIUM (mime_part),
raw_header, flags, charset);
break;
}
@ -235,6 +238,8 @@ emqfe_headers_format (EMailFormatterExtension *extension,
g_string_free (buffer, TRUE);
g_object_unref (mime_part);
return TRUE;
}

View File

@ -56,13 +56,15 @@ emqfe_text_plain_format (EMailFormatterExtension *extension,
CamelStream *filtered_stream;
CamelMimeFilter *html_filter;
CamelMimeFilter *sig_strip;
CamelMimePart *mime_part;
CamelContentType *type;
EMailFormatterQuoteContext *qf_context;
CamelMimeFilterToHTMLFlags text_flags;
const gchar *format;
guint32 rgb = 0x737373;
if (!part->part)
mime_part = e_mail_part_ref_mime_part (part);
if (mime_part == NULL)
return FALSE;
qf_context = (EMailFormatterQuoteContext *) context;
@ -76,7 +78,7 @@ emqfe_text_plain_format (EMailFormatterExtension *extension,
text_flags |= CAMEL_MIME_FILTER_TOHTML_MARK_CITATION;
/* Check for RFC 2646 flowed text. */
type = camel_mime_part_get_content_type (part->part);
type = camel_mime_part_get_content_type (mime_part);
if (camel_content_type_is (type, "text", "plain")
&& (format = camel_content_type_param (type, "format"))
&& !g_ascii_strcasecmp (format, "flowed"))
@ -102,6 +104,8 @@ emqfe_text_plain_format (EMailFormatterExtension *extension,
camel_stream_flush (filtered_stream, cancellable, NULL);
g_object_unref (filtered_stream);
g_object_unref (mime_part);
return TRUE;
}

View File

@ -53,7 +53,9 @@ emfe_source_format (EMailFormatterExtension *extension,
GString *buffer;
CamelStream *filtered_stream;
CamelMimeFilter *filter;
CamelDataWrapper *dw = (CamelDataWrapper *) part->part;
CamelMimePart *mime_part;
mime_part = e_mail_part_ref_mime_part (part);
filtered_stream = camel_stream_filter_new (stream);
@ -67,7 +69,7 @@ emfe_source_format (EMailFormatterExtension *extension,
buffer = g_string_new ("");
if (CAMEL_IS_MIME_MESSAGE (part->part)) {
if (CAMEL_IS_MIME_MESSAGE (mime_part)) {
g_string_append_printf (
buffer,
"<div class=\"part-container\" "
@ -101,8 +103,8 @@ emfe_source_format (EMailFormatterExtension *extension,
stream, "<code class=\"pre\">", cancellable, NULL);
camel_data_wrapper_write_to_stream_sync (
dw, filtered_stream,
cancellable, NULL);
CAMEL_DATA_WRAPPER (mime_part),
filtered_stream, cancellable, NULL);
camel_stream_flush (filtered_stream, cancellable, NULL);
g_object_unref (filtered_stream);
@ -111,12 +113,14 @@ emfe_source_format (EMailFormatterExtension *extension,
g_string_free (buffer, TRUE);
if (CAMEL_IS_MIME_MESSAGE (part->part)) {
if (CAMEL_IS_MIME_MESSAGE (mime_part)) {
camel_stream_write_string (stream, "</div>", cancellable, NULL);
} else {
camel_stream_write_string (stream, "</div></div>", cancellable, NULL);
}
g_object_unref (mime_part);
return TRUE;
}

View File

@ -54,7 +54,6 @@ emfe_text_plain_format (EMailFormatterExtension *extension,
CamelStream *stream,
GCancellable *cancellable)
{
CamelDataWrapper *dw;
CamelStream *filtered_stream;
CamelMimeFilter *html_filter;
gchar *content;
@ -67,6 +66,8 @@ emfe_text_plain_format (EMailFormatterExtension *extension,
if ((context->mode == E_MAIL_FORMATTER_MODE_RAW) ||
(context->mode == E_MAIL_FORMATTER_MODE_PRINTING)) {
CamelMimeFilterToHTMLFlags flags;
CamelMimePart *mime_part;
CamelDataWrapper *dw;
if (context->mode == E_MAIL_FORMATTER_MODE_RAW) {
gchar *header;
@ -83,9 +84,12 @@ emfe_text_plain_format (EMailFormatterExtension *extension,
flags = e_mail_formatter_get_text_format_flags (formatter);
dw = camel_medium_get_content (CAMEL_MEDIUM (part->part));
if (!dw)
mime_part = e_mail_part_ref_mime_part (part);
dw = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
if (dw == NULL) {
g_object_unref (mime_part);
return FALSE;
}
/* Check for RFC 2646 flowed text. */
if (camel_content_type_is (dw->mime_type, "text", "plain")
@ -129,6 +133,8 @@ emfe_text_plain_format (EMailFormatterExtension *extension,
cancellable, NULL);
}
g_object_unref (mime_part);
return TRUE;
} else {

View File

@ -1037,14 +1037,14 @@ e_mail_formatter_format_text (EMailFormatter *formatter,
const gchar *charset = NULL;
CamelMimeFilter *windows = NULL;
CamelStream *mem_stream = NULL;
CamelDataWrapper *dw;
CamelMimePart *mime_part;
CamelContentType *mime_type;
if (g_cancellable_is_cancelled (cancellable))
return;
dw = CAMEL_DATA_WRAPPER (part->part);
mime_type = dw->mime_type;
mime_part = e_mail_part_ref_mime_part (part);
mime_type = CAMEL_DATA_WRAPPER (mime_part)->mime_type;
if (formatter->priv->charset != NULL) {
charset = formatter->priv->charset;
@ -1067,7 +1067,8 @@ e_mail_formatter_format_text (EMailFormatter *formatter,
CAMEL_STREAM_FILTER (filter_stream), windows);
camel_data_wrapper_decode_to_stream_sync (
dw, filter_stream, cancellable, NULL);
CAMEL_DATA_WRAPPER (mime_part),
filter_stream, cancellable, NULL);
camel_stream_flush (filter_stream, cancellable, NULL);
g_object_unref (filter_stream);
@ -1088,7 +1089,7 @@ e_mail_formatter_format_text (EMailFormatter *formatter,
}
camel_data_wrapper_decode_to_stream_sync (
camel_medium_get_content (CAMEL_MEDIUM (dw)),
camel_medium_get_content (CAMEL_MEDIUM (mime_part)),
filter_stream, cancellable, NULL);
camel_stream_flush (filter_stream, cancellable, NULL);
g_object_unref (filter_stream);
@ -1103,6 +1104,8 @@ e_mail_formatter_format_text (EMailFormatter *formatter,
g_object_unref (windows);
g_object_unref (mem_stream);
g_object_unref (mime_part);
}
gchar *

View File

@ -31,6 +31,8 @@
#include "e-mail-part.h"
#include <string.h>
struct _EMailPartPrivate {
guint ref_cnt;
gsize instance_size;
@ -221,6 +223,29 @@ e_mail_part_id_has_suffix (EMailPart *part,
return g_str_has_suffix (part->id, suffix);
}
gboolean
e_mail_part_id_has_substr (EMailPart *part,
const gchar *substr)
{
g_return_val_if_fail (part != NULL, FALSE);
g_return_val_if_fail (substr != NULL, FALSE);
return (strstr (part->id, substr) != NULL);
}
CamelMimePart *
e_mail_part_ref_mime_part (EMailPart *part)
{
CamelMimePart *mime_part = NULL;
g_return_val_if_fail (part != NULL, NULL);
if (part->part != NULL)
mime_part = g_object_ref (part->part);
return mime_part;
}
static EMailPartValidityPair *
mail_part_find_validity_pair (EMailPart *part,
guint32 validity_type)

View File

@ -105,6 +105,7 @@ gboolean e_mail_part_id_has_suffix (EMailPart *part,
const gchar *suffix);
gboolean e_mail_part_id_has_substr (EMailPart *part,
const gchar *substr);
CamelMimePart * e_mail_part_ref_mime_part (EMailPart *part);
void e_mail_part_update_validity (EMailPart *part,
CamelCipherValidity *validity,
guint32 validity_type);

View File

@ -941,6 +941,7 @@ mail_display_plugin_widget_requested (WebKitWebView *web_view,
e_attachment_button_set_expandable (
E_ATTACHMENT_BUTTON (widget), FALSE);
} else {
CamelMimePart *mime_part;
const CamelContentDisposition *disposition;
e_attachment_button_set_expandable (
@ -957,11 +958,13 @@ mail_display_plugin_widget_requested (WebKitWebView *web_view,
G_CALLBACK (attachment_button_expanded),
display);
mime_part = e_mail_part_ref_mime_part (part);
/* Automatically expand attachments that have inline
* disposition or the EMailParts have specific
* force_inline flag set. */
disposition =
camel_mime_part_get_content_disposition (part->part);
camel_mime_part_get_content_disposition (mime_part);
if (!part->force_collapse &&
(part->force_inline ||
(g_strcmp0 (empa->snoop_mime_type, "message/rfc822") == 0) ||
@ -977,6 +980,8 @@ mail_display_plugin_widget_requested (WebKitWebView *web_view,
attachment_button_expanded (
G_OBJECT (widget), NULL, display);
}
g_object_unref (mime_part);
}
}

View File

@ -142,10 +142,12 @@ handle_mail_request (GSimpleAsyncResult *res,
if (part != NULL) {
if (context.mode == E_MAIL_FORMATTER_MODE_CID) {
CamelDataWrapper *dw;
CamelMimePart *mime_part;
CamelStream *raw_content;
GByteArray *ba;
dw = camel_medium_get_content (CAMEL_MEDIUM (part->part));
mime_part = e_mail_part_ref_mime_part (part);
dw = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
g_return_if_fail (dw);
raw_content = camel_stream_mem_new ();
@ -155,6 +157,8 @@ handle_mail_request (GSimpleAsyncResult *res,
camel_stream_write (request->priv->output_stream, (gchar *) ba->data, ba->len, cancellable, NULL);
g_object_unref (raw_content);
g_object_unref (mime_part);
} else {
if (mime_type == NULL)
mime_type = part->mime_type;

View File

@ -176,6 +176,7 @@ play_clicked (GtkWidget *button,
if (!part->filename) {
CamelStream *stream;
CamelDataWrapper *data;
CamelMimePart *mime_part;
GError *error = NULL;
gint argc = 1;
const gchar *argv[] = { "org_gnome_audio_inline", NULL };
@ -187,9 +188,11 @@ play_clicked (GtkWidget *button,
stream = camel_stream_fs_new_with_name (
part->filename, O_RDWR | O_CREAT | O_TRUNC, 0600, NULL);
data = camel_medium_get_content (CAMEL_MEDIUM (part->parent.part));
mime_part = e_mail_part_ref_mime_part (E_MAIL_PART (part));
data = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
camel_data_wrapper_decode_to_stream_sync (data, stream, NULL, NULL);
camel_stream_flush (stream, NULL, NULL);
g_object_unref (mime_part);
g_object_unref (stream);
d (printf ("audio inline formatter: init gst playbin\n"));

View File

@ -54,6 +54,9 @@ get_syntax (EMailPart *part,
{
gchar *syntax = NULL;
CamelContentType *ct = NULL;
CamelMimePart *mime_part;
mime_part = e_mail_part_ref_mime_part (part);
if (uri) {
SoupURI *soup_uri = soup_uri_new (uri);
@ -69,7 +72,7 @@ get_syntax (EMailPart *part,
/* Try to detect syntax by content-type first */
if (syntax == NULL) {
ct = camel_mime_part_get_content_type (part->part);
ct = camel_mime_part_get_content_type (mime_part);
if (ct) {
gchar *mime_type = camel_content_type_simple (ct);
@ -87,7 +90,7 @@ get_syntax (EMailPart *part,
(camel_content_type_is (ct, "text", "plain"))))) {
const gchar *filename;
filename = camel_mime_part_get_filename (part->part);
filename = camel_mime_part_get_filename (mime_part);
if (filename != NULL) {
gchar *ext = g_strrstr (filename, ".");
if (ext != NULL) {
@ -102,6 +105,8 @@ get_syntax (EMailPart *part,
syntax = g_strdup ("txt");
}
g_object_unref (mime_part);
return syntax;
}
@ -113,16 +118,18 @@ emfe_text_highlight_format (EMailFormatterExtension *extension,
CamelStream *stream,
GCancellable *cancellable)
{
CamelMimePart *mime_part;
CamelContentType *ct;
gboolean success = FALSE;
ct = camel_mime_part_get_content_type (part->part);
mime_part = e_mail_part_ref_mime_part (part);
ct = camel_mime_part_get_content_type (mime_part);
/* Don't format text/html unless it's an attachment */
if (ct && camel_content_type_is (ct, "text", "html")) {
const CamelContentDisposition *disp;
disp = camel_mime_part_get_content_disposition (part->part);
disp = camel_mime_part_get_content_disposition (mime_part);
if (disp == NULL)
goto exit;
@ -136,7 +143,7 @@ emfe_text_highlight_format (EMailFormatterExtension *extension,
CamelStream *filter_stream;
CamelMimeFilter *mime_filter;
dw = camel_medium_get_content (CAMEL_MEDIUM (part->part));
dw = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
if (dw == NULL)
goto exit;
@ -181,7 +188,7 @@ emfe_text_highlight_format (EMailFormatterExtension *extension,
"--failsafe",
NULL };
dw = camel_medium_get_content (CAMEL_MEDIUM (part->part));
dw = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
if (dw == NULL)
goto exit;
@ -349,6 +356,8 @@ emfe_text_highlight_format (EMailFormatterExtension *extension,
success = TRUE;
exit:
g_object_unref (mime_part);
return success;
}