X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-show.c;h=88699e90666d4715a302d78426352e36b57f1312;hp=1072ea558dfbcc04b91b4aa9041c3f7dd8692adf;hb=325a92422737f16377307dbd584158d3ee8cdb51;hpb=aa605f7e8a4c5e046503d61fdb953721c32f9d3a diff --git a/notmuch-show.c b/notmuch-show.c index 1072ea55..88699e90 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -272,6 +272,7 @@ 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; GMimeFilter *crlf_filter = NULL; + GMimeFilter *windows_filter = NULL; GMimeDataWrapper *wrapper; const char *charset; @@ -282,13 +283,37 @@ show_text_part_content (GMimeObject *part, GMimeStream *stream_out, if (stream_out == NULL) return; + charset = g_mime_object_get_content_type_parameter (part, "charset"); + charset = charset ? g_mime_charset_canon_name (charset) : NULL; + wrapper = g_mime_part_get_content_object (GMIME_PART (part)); + if (wrapper && charset && !g_ascii_strncasecmp (charset, "iso-8859-", 9)) { + GMimeStream *null_stream = NULL; + GMimeStream *null_stream_filter = NULL; + + /* Check for mislabeled Windows encoding */ + null_stream = g_mime_stream_null_new (); + null_stream_filter = g_mime_stream_filter_new (null_stream); + windows_filter = g_mime_filter_windows_new (charset); + g_mime_stream_filter_add(GMIME_STREAM_FILTER (null_stream_filter), + windows_filter); + g_mime_data_wrapper_write_to_stream (wrapper, null_stream_filter); + charset = g_mime_filter_windows_real_charset( + (GMimeFilterWindows *) windows_filter); + + if (null_stream_filter) + g_object_unref (null_stream_filter); + if (null_stream) + g_object_unref (null_stream); + /* Keep a reference to windows_filter in order to prevent the + * charset string from deallocation. */ + } + stream_filter = g_mime_stream_filter_new (stream_out); crlf_filter = g_mime_filter_crlf_new (false, false); g_mime_stream_filter_add(GMIME_STREAM_FILTER (stream_filter), crlf_filter); g_object_unref (crlf_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"); @@ -313,11 +338,12 @@ show_text_part_content (GMimeObject *part, GMimeStream *stream_out, } } - 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 (windows_filter) + g_object_unref (windows_filter); } static const char* @@ -403,13 +429,11 @@ format_signature_errors (sprinter_t *sp, GMimeSignature *signature) /* Signature status sprinter (GMime 2.6) */ static void -format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node) +format_part_sigstatus_sprinter (sprinter_t *sp, GMimeSignatureList *siglist) { /* Any changes to the JSON or S-Expression format should be * reflected in the file devel/schemata. */ - GMimeSignatureList *siglist = node->sig_list; - sp->begin_list (sp); if (!siglist) { @@ -548,12 +572,18 @@ format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node, g_mime_stream_printf (stream, "Date: %s\n", date_string); g_mime_stream_printf (stream, "\fheader}\n"); + if (!params->output_body) + { + g_mime_stream_printf (stream, "\f%s}\n", part_type); + return NOTMUCH_STATUS_SUCCESS; + } g_mime_stream_printf (stream, "\fbody{\n"); } if (leaf) { if (g_mime_content_type_is_type (content_type, "text", "*") && - !g_mime_content_type_is_type (content_type, "text", "html")) + (params->include_html || + ! g_mime_content_type_is_type (content_type, "text", "html"))) { show_text_part_content (node->part, stream, 0); } else { @@ -652,7 +682,7 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node, if (node->verify_attempted) { sp->map_key (sp, "sigstatus"); - format_part_sigstatus_sprinter (sp, node); + format_part_sigstatus_sprinter (sp, node->sig_list); } sp->map_key (sp, "content-type"); @@ -1178,15 +1208,19 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[]) fprintf (stderr, "Warning: --body=false is incompatible with --part > 0. Disabling.\n"); params.output_body = true; } else { - if (format != NOTMUCH_FORMAT_JSON && format != NOTMUCH_FORMAT_SEXP) + if (format != NOTMUCH_FORMAT_TEXT && + format != NOTMUCH_FORMAT_JSON && + format != NOTMUCH_FORMAT_SEXP) fprintf (stderr, - "Warning: --body=false only implemented for format=json and format=sexp\n"); + "Warning: --body=false only implemented for format=text, format=json and format=sexp\n"); } } if (params.include_html && - (format != NOTMUCH_FORMAT_JSON && format != NOTMUCH_FORMAT_SEXP)) { - fprintf (stderr, "Warning: --include-html only implemented for format=json and format=sexp\n"); + (format != NOTMUCH_FORMAT_TEXT && + format != NOTMUCH_FORMAT_JSON && + format != NOTMUCH_FORMAT_SEXP)) { + fprintf (stderr, "Warning: --include-html only implemented for format=text, format=json and format=sexp\n"); } query_string = query_string_from_args (config, argc-opt_index, argv+opt_index);