X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-show.c;h=1ed49d995efad1fac8dd1c5e9b37532f18734b32;hp=bb54e563bea87378398773ac7ab420203818b505;hb=f744b050b16d2a8c7223e06f7e071914ae05645e;hpb=8b18efe171ef80cbb238a9446137c39908755d2d diff --git a/notmuch-show.c b/notmuch-show.c index bb54e563..1ed49d99 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -45,6 +45,7 @@ static const notmuch_show_format_t format_text = { "\fbody{\n", format_part_start_text, NULL, + NULL, format_part_content_text, format_part_end_text, "", @@ -65,6 +66,9 @@ static void format_part_start_json (unused (GMimeObject *part), int *part_count); +static void +format_part_encstatus_json (int status); + static void format_part_sigstatus_json (const GMimeSignatureValidity* validity); @@ -80,6 +84,7 @@ static const notmuch_show_format_t format_json = { ", \"headers\": {", format_headers_json, "}", ", \"body\": [", format_part_start_json, + format_part_encstatus_json, format_part_sigstatus_json, format_part_content_json, format_part_end_json, @@ -103,6 +108,7 @@ static const notmuch_show_format_t format_mbox = { NULL, NULL, NULL, + NULL, "", "", "", "", @@ -117,6 +123,7 @@ static const notmuch_show_format_t format_raw = { "", NULL, "", NULL, "", "", + NULL, NULL, NULL, format_part_content_raw, @@ -367,16 +374,24 @@ 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)) - return; + 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)); charset = g_mime_object_get_content_type_parameter (part, "charset"); @@ -456,7 +471,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", "*") || @@ -495,6 +510,18 @@ format_part_start_json (unused (GMimeObject *part), int *part_count) printf ("{\"id\": %d", *part_count); } +static void +format_part_encstatus_json (int status) +{ + printf (", \"encstatus\": [{\"status\": "); + if (status) { + printf ("\"good\""); + } else { + printf ("\"bad\""); + } + printf ("}]"); +} + static void format_part_sigstatus_json (const GMimeSignatureValidity* validity) { @@ -581,7 +608,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)); @@ -614,10 +641,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 @@ -822,6 +864,7 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[])) params.raw = 0; params.part = -1; params.cryptoctx = NULL; + params.decrypt = 0; for (i = 0; i < argc && argv[i][0] == '-'; i++) { if (strcmp (argv[i], "--") == 0) { @@ -850,7 +893,8 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[])) params.part = atoi(argv[i] + sizeof ("--part=") - 1); } else if (STRNCMP_LITERAL (argv[i], "--entire-thread") == 0) { params.entire_thread = 1; - } else if (STRNCMP_LITERAL (argv[i], "--verify") == 0) { + } else if ((STRNCMP_LITERAL (argv[i], "--verify") == 0) || + (STRNCMP_LITERAL (argv[i], "--decrypt") == 0)) { if (params.cryptoctx == NULL) { GMimeSession* session = g_object_new(notmuch_gmime_session_get_type(), NULL); if (NULL == (params.cryptoctx = g_mime_gpg_context_new(session, "gpg"))) @@ -860,6 +904,8 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[])) g_object_unref (session); session = NULL; } + if (STRNCMP_LITERAL (argv[i], "--decrypt") == 0) + params.decrypt = 1; } else { fprintf (stderr, "Unrecognized option: %s\n", argv[i]); return 1;