diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/audio-inline/e-mail-parser-audio-inline.c | 25 | ||||
-rw-r--r-- | modules/itip-formatter/e-mail-parser-itip.c | 17 | ||||
-rw-r--r-- | modules/prefer-plain/e-mail-parser-prefer-plain.c | 179 | ||||
-rw-r--r-- | modules/text-highlight/e-mail-parser-text-highlight.c | 26 | ||||
-rw-r--r-- | modules/tnef-attachment/e-mail-parser-tnef-attachment.c | 34 | ||||
-rw-r--r-- | modules/vcard-inline/e-mail-parser-vcard-inline.c | 29 |
6 files changed, 162 insertions, 148 deletions
diff --git a/modules/audio-inline/e-mail-parser-audio-inline.c b/modules/audio-inline/e-mail-parser-audio-inline.c index 5509306118..ca87693fe4 100644 --- a/modules/audio-inline/e-mail-parser-audio-inline.c +++ b/modules/audio-inline/e-mail-parser-audio-inline.c @@ -101,15 +101,18 @@ mail_part_audio_inline_free (EMailPart *mail_part) } } -static GSList * +static gint empe_audio_inline_parse (EMailParserExtension *extension, EMailParser *parser, CamelMimePart *part, GString *part_id, - GCancellable *cancellable) + GCancellable *cancellable, + GQueue *out_mail_queue) { EMailPartAudioInline *mail_part; + GQueue work_queue = G_QUEUE_INIT; gint len; + gint n_parts_added = 0; len = part_id->len; g_string_append (part_id, ".org-gnome-audio-inline-button-panel"); @@ -117,16 +120,22 @@ empe_audio_inline_parse (EMailParserExtension *extension, d (printf ("audio inline formatter: format classid %s\n", part_id->str)); mail_part = (EMailPartAudioInline *) e_mail_part_subclass_new ( - part, part_id->str, sizeof (EMailPartAudioInline), - (GFreeFunc) mail_part_audio_inline_free); + part, part_id->str, sizeof (EMailPartAudioInline), + (GFreeFunc) mail_part_audio_inline_free); mail_part->parent.mime_type = camel_content_type_simple ( - camel_mime_part_get_content_type (part)); + camel_mime_part_get_content_type (part)); mail_part->parent.is_attachment = TRUE; g_string_truncate (part_id, len); - return e_mail_parser_wrap_as_attachment ( - parser, part, g_slist_append (NULL, mail_part), - part_id, cancellable); + g_queue_push_tail (&work_queue, mail_part); + n_parts_added++; + + e_mail_parser_wrap_as_attachment ( + parser, part, part_id, &work_queue); + + e_queue_transfer (&work_queue, out_mail_queue); + + return TRUE; } static guint32 diff --git a/modules/itip-formatter/e-mail-parser-itip.c b/modules/itip-formatter/e-mail-parser-itip.c index 56bbd53da1..505842807a 100644 --- a/modules/itip-formatter/e-mail-parser-itip.c +++ b/modules/itip-formatter/e-mail-parser-itip.c @@ -180,12 +180,13 @@ bind_itip_view (EMailPart *part, /*******************************************************************************/ -static GSList * +static gboolean empe_itip_parse (EMailParserExtension *extension, EMailParser *parser, CamelMimePart *part, GString *part_id, - GCancellable *cancellable) + GCancellable *cancellable, + GQueue *out_mail_parts) { EShell *shell; GSettings *settings; @@ -195,7 +196,7 @@ empe_itip_parse (EMailParserExtension *extension, GByteArray *byte_array; gint len; const CamelContentDisposition *disposition; - GSList *parts; + GQueue work_queue = G_QUEUE_INIT; len = part_id->len; g_string_append_printf (part_id, ".itip"); @@ -234,18 +235,20 @@ empe_itip_parse (EMailParserExtension *extension, g_object_unref (stream); - parts = g_slist_append (NULL, itip_part); + g_queue_push_tail (&work_queue, itip_part); disposition = camel_mime_part_get_content_disposition (part); if (disposition && (g_strcmp0 (disposition->disposition, "attachment") == 0)) { - parts = e_mail_parser_wrap_as_attachment ( - parser, part, parts, part_id, cancellable); + e_mail_parser_wrap_as_attachment ( + parser, part, part_id, &work_queue); } + e_queue_transfer (&work_queue, out_mail_parts); + g_string_truncate (part_id, len); - return parts; + return TRUE; } static guint32 diff --git a/modules/prefer-plain/e-mail-parser-prefer-plain.c b/modules/prefer-plain/e-mail-parser-prefer-plain.c index 66ff32106c..296369ed32 100644 --- a/modules/prefer-plain/e-mail-parser-prefer-plain.c +++ b/modules/prefer-plain/e-mail-parser-prefer-plain.c @@ -99,18 +99,19 @@ enum { PROP_SHOW_SUPPRESSED }; -static GSList * +static void make_part_attachment (EMailParser *parser, CamelMimePart *part, GString *part_id, gboolean force_html, - GCancellable *cancellable) + GCancellable *cancellable, + GQueue *out_mail_parts) { - GSList *parts; - if (camel_content_type_is (camel_mime_part_get_content_type (part), "text", "html")) { + GQueue work_queue = G_QUEUE_INIT; EMailPart *mail_part; gint len; + /* always show HTML as attachments and not inline */ camel_mime_part_set_disposition (part, "attachment"); @@ -126,9 +127,12 @@ make_part_attachment (EMailParser *parser, mail_part->mime_type = g_strdup ("text/html"); g_string_truncate (part_id, len); - parts = e_mail_parser_wrap_as_attachment ( - parser, part, g_slist_append (NULL, mail_part), - part_id, cancellable); + g_queue_push_tail (&work_queue, mail_part); + + e_mail_parser_wrap_as_attachment ( + parser, part, part_id, &work_queue); + + e_queue_transfer (&work_queue, out_mail_parts); } else if (force_html && CAMEL_IS_MIME_MESSAGE (part)) { /* message was asked to be formatted as text/html; @@ -137,52 +141,51 @@ make_part_attachment (EMailParser *parser, CamelDataWrapper *content; content = camel_medium_get_content (CAMEL_MEDIUM (part)); - g_return_val_if_fail (content != NULL, NULL); + g_return_if_fail (content != NULL); new_part = camel_mime_part_new (); camel_medium_set_content (CAMEL_MEDIUM (new_part), content); - parts = e_mail_parser_parse_part ( - parser, new_part, part_id, cancellable); + e_mail_parser_parse_part ( + parser, new_part, part_id, + cancellable, out_mail_parts); g_object_unref (new_part); } else { - parts = e_mail_parser_parse_part ( - parser, part, part_id, cancellable); + e_mail_parser_parse_part ( + parser, part, part_id, cancellable, out_mail_parts); } - - return parts; } static void -hide_parts (GSList *parts) +hide_parts (GQueue *work_queue) { - GSList *iter; + GList *head, *link; - for (iter = parts; iter; iter = g_slist_next (iter)) { - EMailPart *p = iter->data; + head = g_queue_peek_head_link (work_queue); - if (!p) - continue; + for (link = head; link != NULL; link = g_list_next (link)) { + EMailPart *mail_part = link->data; - p->is_hidden = TRUE; + mail_part->is_hidden = TRUE; } } -static GSList * +static gboolean empe_prefer_plain_parse (EMailParserExtension *extension, EMailParser *parser, CamelMimePart *part, GString *part_id, - GCancellable *cancellable) + GCancellable *cancellable, + GQueue *out_mail_parts) { EMailParserPreferPlain *emp_pp; CamelMultipart *mp; gint i, nparts, partidlen; - GSList *parts; CamelContentType *ct; gboolean has_calendar = FALSE; - GSList *plain_text_parts = NULL; + GQueue plain_text_parts = G_QUEUE_INIT; + GQueue work_queue = G_QUEUE_INIT; emp_pp = (EMailParserPreferPlain *) extension; @@ -194,36 +197,35 @@ empe_prefer_plain_parse (EMailParserExtension *extension, /* Prevent recursion, fall back to next (real text/html) parser */ if (strstr (part_id->str, ".alternative-prefer-plain.") != NULL) - return NULL; + return FALSE; /* Not enforcing text/plain, so use real parser */ if (emp_pp->mode != ONLY_PLAIN) - return NULL; + return FALSE; /* Enforcing text/plain, but got only HTML part, so add it * as attachment, to not show empty message preview, which * is confusing. */ - return make_part_attachment ( - parser, part, part_id, - FALSE, cancellable); + make_part_attachment ( + parser, part, part_id, FALSE, + cancellable, out_mail_parts); + + return TRUE; } - parts = NULL; partidlen = part_id->len; mp = (CamelMultipart *) camel_medium_get_content (CAMEL_MEDIUM (part)); - if (!CAMEL_IS_MULTIPART (mp)) { + if (!CAMEL_IS_MULTIPART (mp)) return e_mail_parser_parse_part_as ( parser, part, part_id, - "application/vnd.evolution.source", cancellable); - } + "application/vnd.evolution.source", + cancellable, out_mail_parts); nparts = camel_multipart_get_number (mp); for (i = 0; i < nparts; i++) { - CamelMimePart *sp; - GSList *sparts = NULL; sp = camel_multipart_get_part (mp, i); ct = camel_mime_part_get_content_type (sp); @@ -232,61 +234,52 @@ empe_prefer_plain_parse (EMailParserExtension *extension, g_string_append_printf (part_id, ".alternative-prefer-plain.%d", i); if (camel_content_type_is (ct, "text", "html")) { - if (emp_pp->mode != PREFER_HTML) { if (emp_pp->show_suppressed) { - sparts = make_part_attachment ( - parser, sp, part_id, - FALSE, cancellable); + make_part_attachment ( + parser, sp, part_id, FALSE, + cancellable, &work_queue); } } else { - sparts = e_mail_parser_parse_part ( - parser, sp, part_id, cancellable); + e_mail_parser_parse_part ( + parser, sp, part_id, + cancellable, &work_queue); } - parts = g_slist_concat (parts, sparts); - continue; - } - - if (camel_content_type_is (ct, "text", "plain")) { - - sparts = e_mail_parser_parse_part ( - parser, sp, part_id, cancellable); - - plain_text_parts = g_slist_concat (plain_text_parts, sparts); - continue; - } + } else if (camel_content_type_is (ct, "text", "plain")) { + e_mail_parser_parse_part ( + parser, sp, part_id, + cancellable, &plain_text_parts); /* Always show calendar part! */ - if (camel_content_type_is (ct, "text", "calendar") || + } else if (camel_content_type_is (ct, "text", "calendar") || camel_content_type_is (ct, "text", "x-calendar")) { - /* Hide everything else, displaying native calendar part only */ - hide_parts (parts); + /* Hide everything else, displaying + * native calendar part only. */ + hide_parts (&work_queue); - sparts = e_mail_parser_parse_part ( - parser, sp, part_id, cancellable); + e_mail_parser_parse_part ( + parser, sp, part_id, cancellable, &work_queue); - parts = g_slist_concat (parts, sparts); has_calendar = TRUE; - continue; - } /* Multiparts can represent a text/html with inline images or so */ - if (camel_content_type_is (ct, "multipart", "*")) { - GSList *iter; + } else if (camel_content_type_is (ct, "multipart", "*")) { + GQueue inner_queue = G_QUEUE_INIT; + GList *head, *link; gboolean has_html = FALSE; - sparts = e_mail_parser_parse_part ( - parser, sp, part_id, cancellable); + e_mail_parser_parse_part ( + parser, sp, part_id, cancellable, &inner_queue); + + head = g_queue_peek_head_link (&inner_queue); /* Check whether the multipart contains a text/html part */ - for (iter = sparts; iter; iter = g_slist_next (iter)) { - EMailPart *p = iter->data; - if (!p) - continue; + for (link = head; link != NULL; link = g_list_next (link)) { + EMailPart *mail_part = link->data; - if (strstr (p->id, ".text_html") != NULL) { + if (strstr (mail_part->id, ".text_html") != NULL) { has_html = TRUE; break; } @@ -294,41 +287,41 @@ empe_prefer_plain_parse (EMailParserExtension *extension, if (has_html && (emp_pp->mode != PREFER_HTML)) { if (emp_pp->show_suppressed) { - sparts = e_mail_parser_wrap_as_attachment ( - parser, sp, sparts, part_id, - cancellable); + e_mail_parser_wrap_as_attachment ( + parser, sp, part_id, + &inner_queue); } else { - hide_parts (sparts); + hide_parts (&inner_queue); } } - parts = g_slist_concat (parts, sparts); - continue; - } + e_queue_transfer (&inner_queue, &work_queue); /* Parse everything else as an attachment */ - sparts = e_mail_parser_parse_part ( - parser, sp, part_id, cancellable); - parts = g_slist_concat ( - parts, - e_mail_parser_wrap_as_attachment ( - parser, sp, sparts, part_id, - cancellable)); + } else { + GQueue inner_queue = G_QUEUE_INIT; + + e_mail_parser_parse_part ( + parser, sp, part_id, + cancellable, &inner_queue); + e_mail_parser_wrap_as_attachment ( + parser, sp, part_id, &inner_queue); + + e_queue_transfer (&inner_queue, &work_queue); + } } /* Don't hide the plain text if there's nothing else to display */ - if (has_calendar || (nparts > 1 && emp_pp->mode == PREFER_HTML)) { - hide_parts (plain_text_parts); - } + if (has_calendar || (nparts > 1 && emp_pp->mode == PREFER_HTML)) + hide_parts (&plain_text_parts); - if (plain_text_parts) { - /* plain_text parts should be always first */ - parts = g_slist_concat (plain_text_parts, parts); - } + /* plain_text parts should be always first */ + e_queue_transfer (&plain_text_parts, out_mail_parts); + e_queue_transfer (&work_queue, out_mail_parts); g_string_truncate (part_id, partidlen); - return parts; + return TRUE; } static const gchar ** diff --git a/modules/text-highlight/e-mail-parser-text-highlight.c b/modules/text-highlight/e-mail-parser-text-highlight.c index 69aa1ccff2..eb56162a3d 100644 --- a/modules/text-highlight/e-mail-parser-text-highlight.c +++ b/modules/text-highlight/e-mail-parser-text-highlight.c @@ -58,21 +58,20 @@ G_DEFINE_DYNAMIC_TYPE_EXTENDED ( E_TYPE_MAIL_PARSER_EXTENSION, e_mail_parser_parser_extension_interface_init)); -static GSList * +static gboolean empe_text_highlight_parse (EMailParserExtension *extension, EMailParser *parser, CamelMimePart *part, GString *part_id, - GCancellable *cancellable) + GCancellable *cancellable, + GQueue *out_mail_parts) { - GSList *parts; - gint len; CamelContentType *ct; + gint len; /* Prevent recursion */ - if (strstr (part_id->str, ".text-highlight") != NULL) { - return NULL; - } + if (strstr (part_id->str, ".text-highlight") != NULL) + return FALSE; /* Don't parse text/html if it's not an attachment */ ct = camel_mime_part_get_content_type (part); @@ -80,9 +79,8 @@ empe_text_highlight_parse (EMailParserExtension *extension, const CamelContentDisposition *disp; disp = camel_mime_part_get_content_disposition (part); - if (!disp || (g_strcmp0 (disp->disposition, "attachment") != 0)) { - return NULL; - } + if (!disp || (g_strcmp0 (disp->disposition, "attachment") != 0)) + return FALSE; } len = part_id->len; @@ -90,12 +88,14 @@ empe_text_highlight_parse (EMailParserExtension *extension, /* All source codes and scripts are in general plain texts, * so let text/plain parser handle it. */ - parts = e_mail_parser_parse_part_as ( - parser, part, part_id, "text/plain", cancellable); + + e_mail_parser_parse_part_as ( + parser, part, part_id, "text/plain", + cancellable, out_mail_parts); g_string_truncate (part_id, len); - return parts; + return TRUE; } static const gchar ** diff --git a/modules/tnef-attachment/e-mail-parser-tnef-attachment.c b/modules/tnef-attachment/e-mail-parser-tnef-attachment.c index 3de54e627f..a0342aaa37 100644 --- a/modules/tnef-attachment/e-mail-parser-tnef-attachment.c +++ b/modules/tnef-attachment/e-mail-parser-tnef-attachment.c @@ -114,12 +114,13 @@ sanitize_filename (const gchar *filename) } } -static GSList * +static gboolean empe_tnef_attachment_parse (EMailParserExtension *extension, EMailParser *parser, CamelMimePart *part, GString *part_id, - GCancellable *cancellable) + GCancellable *cancellable, + GQueue *out_mail_parts) { gchar *tmpdir, *name; CamelStream *out; @@ -130,30 +131,30 @@ empe_tnef_attachment_parse (EMailParserExtension *extension, CamelDataWrapper *content; gint len; TNEFStruct tnef; - GSList *parts; + GQueue work_queue = G_QUEUE_INIT; tmpdir = e_mkdtemp ("tnef-attachment-XXXXXX"); if (tmpdir == NULL) - return NULL; + return FALSE; name = g_build_filename (tmpdir, ".evo-attachment.tnef", NULL); out = camel_stream_fs_new_with_name (name, O_RDWR | O_CREAT, 0666, NULL); if (out == NULL) { g_free (name); - return NULL; + return FALSE; } content = camel_medium_get_content ((CamelMedium *) part); if (content == NULL) { g_free (name); g_object_unref (out); - return NULL; + return FALSE; } if (camel_data_wrapper_decode_to_stream_sync (content, out, NULL, NULL) == -1 || camel_stream_close (out, NULL, NULL) == -1) { g_object_unref (out); g_free (name); - return NULL; + return FALSE; } g_object_unref (out); @@ -172,7 +173,7 @@ empe_tnef_attachment_parse (EMailParserExtension *extension, if (dir == NULL) { g_object_unref (out); g_free (name); - return NULL; + return FALSE; } mainpart = camel_mime_part_new (); @@ -226,7 +227,6 @@ empe_tnef_attachment_parse (EMailParserExtension *extension, len = part_id->len; g_string_append_printf (part_id, ".tnef"); - parts = NULL; if (camel_multipart_get_number (mp) > 0) { CamelMimePart *part = camel_mime_part_new (); @@ -235,18 +235,20 @@ empe_tnef_attachment_parse (EMailParserExtension *extension, (CamelMedium *) part, CAMEL_DATA_WRAPPER (mp)); - parts = e_mail_parser_parse_part_as ( - parser, part, part_id, - "multipart/mixed", cancellable); + e_mail_parser_parse_part_as ( + parser, part, part_id, "multipart/mixed", + cancellable, &work_queue); g_object_unref (part); } g_string_truncate (part_id, len); - if (parts) - parts = e_mail_parser_wrap_as_attachment ( - parser, part, parts, part_id, cancellable); + if (!g_queue_is_empty (&work_queue)) + e_mail_parser_wrap_as_attachment ( + parser, part, part_id, &work_queue); + + e_queue_transfer (&work_queue, out_mail_parts); g_object_unref (mp); g_object_unref (mainpart); @@ -254,7 +256,7 @@ empe_tnef_attachment_parse (EMailParserExtension *extension, g_free (name); g_free (tmpdir); - return parts; + return TRUE; } static const gchar ** diff --git a/modules/vcard-inline/e-mail-parser-vcard-inline.c b/modules/vcard-inline/e-mail-parser-vcard-inline.c index 319775b6eb..84f4f2f538 100644 --- a/modules/vcard-inline/e-mail-parser-vcard-inline.c +++ b/modules/vcard-inline/e-mail-parser-vcard-inline.c @@ -328,39 +328,46 @@ decode_vcard (EMailPartVCardInline *vcard_part, g_object_unref (stream); } -static GSList * +static gboolean empe_vcard_inline_parse (EMailParserExtension *extension, EMailParser *parser, CamelMimePart *part, GString *part_id, - GCancellable *cancellable) + GCancellable *cancellable, + GQueue *out_mail_parts) { EMailPartVCardInline *vcard_part; + GQueue work_queue = G_QUEUE_INIT; gint len; len = part_id->len; g_string_append (part_id, ".org-gnome-vcard-inline-display"); vcard_part = (EMailPartVCardInline *) e_mail_part_subclass_new ( - part, part_id->str, sizeof (EMailPartVCardInline), - (GFreeFunc) mail_part_vcard_inline_free); + part, part_id->str, sizeof (EMailPartVCardInline), + (GFreeFunc) mail_part_vcard_inline_free); vcard_part->parent.mime_type = camel_content_type_simple ( - camel_mime_part_get_content_type (part)); + camel_mime_part_get_content_type (part)); vcard_part->parent.bind_func = (EMailPartDOMBindFunc) bind_dom; vcard_part->parent.is_attachment = TRUE; vcard_part->formatter = g_object_new ( - EAB_TYPE_CONTACT_FORMATTER, - "display-mode", EAB_CONTACT_DISPLAY_RENDER_COMPACT, - "render-maps", FALSE, NULL); + EAB_TYPE_CONTACT_FORMATTER, + "display-mode", EAB_CONTACT_DISPLAY_RENDER_COMPACT, + "render-maps", FALSE, NULL); g_object_ref (part); decode_vcard (vcard_part, part); g_string_truncate (part_id, len); - return e_mail_parser_wrap_as_attachment ( - parser, part, g_slist_append (NULL, vcard_part), - part_id, cancellable); + g_queue_push_tail (&work_queue, vcard_part); + + e_mail_parser_wrap_as_attachment ( + parser, part, part_id, &work_queue); + + e_queue_transfer (&work_queue, out_mail_parts); + + return TRUE; } static guint32 |