diff options
author | Milan Crha <mcrha@redhat.com> | 2013-01-18 03:07:41 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2013-01-18 03:07:41 +0800 |
commit | 8850b60bb9ee8e79920c5043cad05d347c30169d (patch) | |
tree | 96f03dfea53cf2fd0c4ddecf49703a3e069da7c2 | |
parent | eb640ec974b7fda3ef57c09a39e72eb1fe7ff5b3 (diff) | |
download | gsoc2013-evolution-8850b60bb9ee8e79920c5043cad05d347c30169d.tar.gz gsoc2013-evolution-8850b60bb9ee8e79920c5043cad05d347c30169d.tar.zst gsoc2013-evolution-8850b60bb9ee8e79920c5043cad05d347c30169d.zip |
Bug #691732 - multipart/related hides attachments
-rw-r--r-- | em-format/e-mail-parser-multipart-related.c | 27 | ||||
-rw-r--r-- | em-format/e-mail-part-utils.c | 28 | ||||
-rw-r--r-- | em-format/e-mail-part-utils.h | 2 |
3 files changed, 56 insertions, 1 deletions
diff --git a/em-format/e-mail-parser-multipart-related.c b/em-format/e-mail-parser-multipart-related.c index e72b61e26c..491e126ad8 100644 --- a/em-format/e-mail-parser-multipart-related.c +++ b/em-format/e-mail-parser-multipart-related.c @@ -66,6 +66,8 @@ empe_mp_related_parse (EMailParserExtension *extension, { CamelMultipart *mp; CamelMimePart *body_part, *display_part = NULL; + CamelContentType *display_content_type; + gchar *html_body = NULL; gint i, nparts, partidlen, displayid = 0; GSList *parts; @@ -88,6 +90,27 @@ empe_mp_related_parse (EMailParserExtension *extension, cancellable); } + display_content_type = camel_mime_part_get_content_type (display_part); + if (display_content_type && + camel_content_type_is (display_content_type, "text", "html")) { + CamelDataWrapper *dw; + + dw = camel_medium_get_content ((CamelMedium *) display_part); + if (dw) { + CamelStream *mem = camel_stream_mem_new (); + GByteArray *bytes; + + camel_data_wrapper_decode_to_stream_sync (dw, mem, cancellable, NULL); + camel_stream_close (mem, cancellable, NULL); + + bytes = camel_stream_mem_get_byte_array (CAMEL_STREAM_MEM (mem)); + if (bytes && bytes->len) + html_body = g_strndup ((const gchar *) bytes->data, bytes->len); + + g_object_unref (mem); + } + } + /* The to-be-displayed part goes first */ partidlen = part_id->len; g_string_append_printf (part_id, ".related.%d", displayid); @@ -122,13 +145,15 @@ empe_mp_related_parse (EMailParserExtension *extension, continue; /* Don't render the part on it's own! */ - if (mail_part->cid != NULL) + if (e_mail_part_utils_body_refers (html_body, mail_part->cid)) mail_part->is_hidden = TRUE; } parts = g_slist_concat (parts, list); } + g_free (html_body); + return parts; } diff --git a/em-format/e-mail-part-utils.c b/em-format/e-mail-part-utils.c index b1c514d49e..97f539a614 100644 --- a/em-format/e-mail-part-utils.c +++ b/em-format/e-mail-part-utils.c @@ -551,3 +551,31 @@ e_mail_part_is_inline (CamelMimePart *mime_part, return (e_mail_parser_extension_get_flags (extension) & E_MAIL_PARSER_EXTENSION_INLINE) != 0; } + +/** + * e_mail_part_utils_body_refers: + * @body: text body to search for references in; can be %NULL, then returns %FALSE + * @cid: a Content-ID to search for; if found in body, it should be of form "cid:xxxxx"; can be %NULL + * + * Returns whether @body contains a reference to @cid enclosed in quotes; + * returns %FALSE if any of the arguments is %NULL. + **/ +gboolean +e_mail_part_utils_body_refers (const gchar *body, + const gchar *cid) +{ + const gchar *ptr; + + if (!body || !cid || !*cid) + return FALSE; + + ptr = body; + while (ptr = strstr (ptr, cid), ptr != NULL) { + if (ptr - body > 1 && ptr[-1] == '\"' && ptr[strlen (cid)] == '\"') + return TRUE; + + ptr++; + } + + return FALSE; +} diff --git a/em-format/e-mail-part-utils.h b/em-format/e-mail-part-utils.h index 97c483db94..54d98e2c0c 100644 --- a/em-format/e-mail-part-utils.h +++ b/em-format/e-mail-part-utils.h @@ -53,6 +53,8 @@ gchar * e_mail_part_describe (CamelMimePart *part, gboolean e_mail_part_is_inline (CamelMimePart *part, GQueue *extensions); +gboolean e_mail_part_utils_body_refers (const gchar *body, + const gchar *cid); G_END_DECLS #endif /* E_MAIL_PART_UTILS_H_ */ |