X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-show.c;h=3ac29597430177b345729e769e24f2e18f39a14b;hp=e90f07e30b4c60715cdc38ac89bf77a71219683d;hb=593d96ff1d2c7f3f175cd6b258e02e9f4ce2392d;hpb=2e653db38fc38dee92b2ee0564e27921132e7232 diff --git a/notmuch-show.c b/notmuch-show.c index e90f07e3..3ac29597 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -374,33 +374,42 @@ format_headers_json (const void *ctx, notmuch_message_t *message) talloc_free (ctx_quote); } +/* Write a MIME text part out to the given stream. + * + * Both line-ending conversion (CRLF->LF) and charset conversion ( -> + * UTF-8) will be performed, so it is inappropriate to call this + * function with a non-text part. Doing so will trigger an internal + * error. + */ static void -show_part_content (GMimeObject *part, GMimeStream *stream_out) +show_text_part_content (GMimeObject *part, GMimeStream *stream_out) { + GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part)); GMimeStream *stream_filter = NULL; GMimeDataWrapper *wrapper; const char *charset; - /* do nothing if this is a multipart */ - if (GMIME_IS_MULTIPART (part) || GMIME_IS_MESSAGE_PART (part)) + if (! g_mime_content_type_is_type (content_type, "text", "*")) + INTERNAL_ERROR ("Illegal request to format non-text part (%s) as text.", + g_mime_content_type_to_string (content_type)); + + if (stream_out == NULL) return; - charset = g_mime_object_get_content_type_parameter (part, "charset"); + stream_filter = g_mime_stream_filter_new (stream_out); + g_mime_stream_filter_add(GMIME_STREAM_FILTER (stream_filter), + g_mime_filter_crlf_new (FALSE, FALSE)); - if (stream_out) { - stream_filter = g_mime_stream_filter_new (stream_out); - g_mime_stream_filter_add(GMIME_STREAM_FILTER (stream_filter), - g_mime_filter_crlf_new (FALSE, FALSE)); - if (charset) { - GMimeFilter *charset_filter; - charset_filter = g_mime_filter_charset_new (charset, "UTF-8"); - /* This result can be NULL for things like "unknown-8bit". - * Don't set a NULL filter as that makes GMime print - * annoying assertion-failure messages on stderr. */ - if (charset_filter) - g_mime_stream_filter_add (GMIME_STREAM_FILTER (stream_filter), - charset_filter); - } + charset = g_mime_object_get_content_type_parameter (part, "charset"); + if (charset) { + GMimeFilter *charset_filter; + charset_filter = g_mime_filter_charset_new (charset, "UTF-8"); + /* This result can be NULL for things like "unknown-8bit". + * Don't set a NULL filter as that makes GMime print + * annoying assertion-failure messages on stderr. */ + if (charset_filter) + g_mime_stream_filter_add (GMIME_STREAM_FILTER (stream_filter), + charset_filter); } wrapper = g_mime_part_get_content_object (GMIME_PART (part)); @@ -411,7 +420,7 @@ show_part_content (GMimeObject *part, GMimeStream *stream_out) } static const char* -signerstatustostring (GMimeSignerStatus x) +signer_status_to_string (GMimeSignerStatus x) { switch (x) { case GMIME_SIGNER_STATUS_NONE: @@ -463,7 +472,7 @@ format_part_content_text (GMimeObject *part) !g_mime_content_type_is_type (content_type, "text", "html")) { g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE); - show_part_content (part, stream_stdout); + show_text_part_content (part, stream_stdout); g_object_unref(stream_stdout); } else if (g_mime_content_type_is_type (content_type, "multipart", "*") || @@ -537,7 +546,9 @@ format_part_sigstatus_json (const GMimeSignatureValidity* validity) printf ("{"); /* status */ - printf ("\"status\": %s", json_quote_str (ctx_quote, signerstatustostring(signer->status))); + printf ("\"status\": %s", + json_quote_str (ctx_quote, + signer_status_to_string (signer->status))); if (signer->status == GMIME_SIGNER_STATUS_GOOD) { @@ -600,7 +611,7 @@ format_part_content_json (GMimeObject *part) if (g_mime_content_type_is_type (content_type, "text", "*") && !g_mime_content_type_is_type (content_type, "text", "html")) { - show_part_content (part, stream_memory); + show_text_part_content (part, stream_memory); part_content = g_mime_stream_mem_get_byte_array (GMIME_STREAM_MEM (stream_memory)); printf (", \"content\": %s", json_quote_chararray (ctx, (char *) part_content->data, part_content->len)); @@ -633,10 +644,25 @@ format_part_end_json (GMimeObject *part) static void format_part_content_raw (GMimeObject *part) { - GMimeStream *stream_stdout = g_mime_stream_file_new (stdout); + GMimeStream *stream_stdout; + GMimeStream *stream_filter = NULL; + GMimeDataWrapper *wrapper; + + stream_stdout = g_mime_stream_file_new (stdout); g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE); - show_part_content (part, stream_stdout); - g_object_unref(stream_stdout); + + stream_filter = g_mime_stream_filter_new (stream_stdout); + + wrapper = g_mime_part_get_content_object (GMIME_PART (part)); + + if (wrapper && stream_filter) + g_mime_data_wrapper_write_to_stream (wrapper, stream_filter); + + if (stream_filter) + g_object_unref (stream_filter); + + if (stream_stdout) + g_object_unref(stream_stdout); } static void