diff options
Diffstat (limited to 'em-format/e-mail-parser-multipart-digest.c')
-rw-r--r-- | em-format/e-mail-parser-multipart-digest.c | 62 |
1 files changed, 27 insertions, 35 deletions
diff --git a/em-format/e-mail-parser-multipart-digest.c b/em-format/e-mail-parser-multipart-digest.c index 2acd8ee614..70f5eebda0 100644 --- a/em-format/e-mail-parser-multipart-digest.c +++ b/em-format/e-mail-parser-multipart-digest.c @@ -56,31 +56,27 @@ G_DEFINE_TYPE_EXTENDED ( static const gchar * parser_mime_types[] = { "multipart/digest", NULL }; -static GSList * +static gboolean empe_mp_digest_parse (EMailParserExtension *extension, EMailParser *parser, CamelMimePart *part, GString *part_id, - GCancellable *cancellable) + GCancellable *cancellable, + GQueue *out_mail_parts) { CamelMultipart *mp; gint i, nparts, len; - GSList *parts; - - if (g_cancellable_is_cancelled (cancellable)) - return NULL; mp = (CamelMultipart *) camel_medium_get_content ((CamelMedium *) 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); - } + parser, part, part_id, + "application/vnd.evolution.source", + cancellable, out_mail_parts); len = part_id->len; nparts = camel_multipart_get_number (mp); - parts = NULL; for (i = 0; i < nparts; i++) { CamelMimePart *subpart; CamelContentType *ct; @@ -99,43 +95,39 @@ empe_mp_digest_parse (EMailParserExtension *extension, if (ct && !camel_content_type_is (ct, "message", "rfc822")) { cts = camel_content_type_simple (ct); - parts = g_slist_concat ( - parts, - e_mail_parser_parse_part_as ( - parser, subpart, part_id, - cts, cancellable)); + e_mail_parser_parse_part_as ( + parser, subpart, part_id, cts, + cancellable, out_mail_parts); g_free (cts); } else { - GSList *new_parts; + GQueue work_queue = G_QUEUE_INIT; + EMailPart *mail_part; + + e_mail_parser_parse_part_as ( + parser, subpart, part_id, "message/rfc822", + cancellable, &work_queue); - new_parts = e_mail_parser_parse_part_as ( - parser, subpart, part_id, - "message/rfc822", cancellable); + mail_part = g_queue_peek_head (&work_queue); /* Force the message to be collapsable */ - if (new_parts && new_parts->data && - !E_MAIL_PART (new_parts->data)->is_attachment) { - new_parts = e_mail_parser_wrap_as_attachment ( - parser, subpart, new_parts, part_id, - cancellable); - } + if (mail_part != NULL && !mail_part->is_attachment) + e_mail_parser_wrap_as_attachment ( + parser, subpart, part_id, &work_queue); + + mail_part = g_queue_peek_head (&work_queue); /* Force the message to be expanded */ - if (new_parts) { - EMailPart *p = new_parts->data; - if (p) { - p->force_inline = TRUE; - } - } - - parts = g_slist_concat (parts, new_parts); + if (mail_part != NULL) + mail_part->force_inline = TRUE; + + e_queue_transfer (&work_queue, out_mail_parts); } g_string_truncate (part_id, len); } - return parts; + return TRUE; } static guint32 |