X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-show.c;h=96f287408fa12c2f729f3cc3f68a81fd533c46aa;hp=7647e9e4c5f7a22b6f4b37ef31757b854c80a932;hb=1ddba66a3f4a7a118bc774d16cde00739144afcf;hpb=50144f95cababfb73027ca95ad1fb303c235a893 diff --git a/notmuch-show.c b/notmuch-show.c index 7647e9e4..96f28740 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -67,49 +67,11 @@ _get_one_line_summary (void *ctx, notmuch_message_t *message) } static void -show_message_part (GMimeObject *part, int *part_count) +show_part (GMimeObject *part, int *part_count) { - GMimeStream *stream; - GMimeDataWrapper *wrapper; GMimeContentDisposition *disposition; GMimeContentType *content_type; - - *part_count = *part_count + 1; - - if (GMIME_IS_MULTIPART (part)) { - GMimeMultipart *multipart = GMIME_MULTIPART (part); - int i; - - for (i = 0; i < g_mime_multipart_get_count (multipart); i++) { - if (GMIME_IS_MULTIPART_SIGNED (multipart)) { - /* Don't index the signature. */ - if (i == 1) - continue; - if (i > 1) - fprintf (stderr, "Warning: Unexpected extra parts of mutlipart/signed. Continuing.\n"); - } - show_message_part (g_mime_multipart_get_part (multipart, i), - part_count); - } - return; - } - - if (GMIME_IS_MESSAGE_PART (part)) { - GMimeMessage *mime_message; - - mime_message = g_mime_message_part_get_message (GMIME_MESSAGE_PART (part)); - - show_message_part (g_mime_message_get_mime_part (mime_message), - part_count); - - return; - } - - if (! (GMIME_IS_PART (part))) { - fprintf (stderr, "Warning: Not displaying unknown mime part: %s.\n", - g_type_name (G_OBJECT_TYPE (part))); - return; - } + GMimeDataWrapper *wrapper; disposition = g_mime_object_get_content_disposition (part); if (disposition && @@ -137,14 +99,23 @@ show_message_part (GMimeObject *part, int *part_count) if (g_mime_content_type_is_type (content_type, "text", "*") && !g_mime_content_type_is_type (content_type, "text", "html")) { - stream = g_mime_stream_file_new (stdout); - g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream), FALSE); + GMimeStream *stream_stdout = g_mime_stream_file_new (stdout); + GMimeStream *stream_filter = NULL; + + if (stream_stdout) { + g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE); + stream_filter = g_mime_stream_filter_new(stream_stdout); + g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter), + g_mime_filter_crlf_new(FALSE, FALSE)); + } wrapper = g_mime_part_get_content_object (GMIME_PART (part)); - if (wrapper) - g_mime_data_wrapper_write_to_stream (wrapper, stream); - - g_object_unref (stream); + 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); } else { @@ -155,136 +126,116 @@ show_message_part (GMimeObject *part, int *part_count) printf ("\fpart}\n"); } -static notmuch_status_t -show_message_body (const char *filename) +static void +show_message (void *ctx, notmuch_message_t *message, int indent) { - GMimeStream *stream = NULL; - GMimeParser *parser = NULL; - GMimeMessage *mime_message = NULL; - notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS; - static int initialized = 0; - FILE *file = NULL; - int part_count = 0; - - if (! initialized) { - g_mime_init (0); - initialized = 1; - } + const char *headers[] = { + "Subject", "From", "To", "Cc", "Bcc", "Date" + }; + const char *name, *value; + unsigned int i; + + printf ("\fmessage{ id:%s depth:%d filename:%s\n", + notmuch_message_get_message_id (message), + indent, + notmuch_message_get_filename (message)); - file = fopen (filename, "r"); - if (! file) { - fprintf (stderr, "Error opening %s: %s\n", filename, strerror (errno)); - ret = NOTMUCH_STATUS_FILE_ERROR; - goto DONE; + printf ("\fheader{\n"); + + printf ("%s\n", _get_one_line_summary (ctx, message)); + + for (i = 0; i < ARRAY_SIZE (headers); i++) { + name = headers[i]; + value = notmuch_message_get_header (message, name); + if (value) + printf ("%s: %s\n", name, value); } - stream = g_mime_stream_file_new (file); - g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream), FALSE); + printf ("\fheader}\n"); + printf ("\fbody{\n"); - parser = g_mime_parser_new_with_stream (stream); + show_message_body (notmuch_message_get_filename (message), show_part); - mime_message = g_mime_parser_construct_message (parser); + printf ("\fbody}\n"); + + printf ("\fmessage}\n"); +} - show_message_part (g_mime_message_get_mime_part (mime_message), - &part_count); - DONE: - if (mime_message) - g_object_unref (mime_message); +static void +show_messages (void *ctx, notmuch_messages_t *messages, int indent) +{ + notmuch_message_t *message; - if (parser) - g_object_unref (parser); + for (; + notmuch_messages_has_more (messages); + notmuch_messages_advance (messages)) + { + message = notmuch_messages_get (messages); - if (stream) - g_object_unref (stream); + show_message (ctx, message, indent); - if (file) - fclose (file); + show_messages (ctx, notmuch_message_get_replies (message), indent + 1); - return ret; + notmuch_message_destroy (message); + } } int notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[])) { - void *local = talloc_new (ctx); - char *query_string; - notmuch_database_t *notmuch = NULL; - notmuch_query_t *query = NULL; + notmuch_config_t *config; + notmuch_database_t *notmuch; + notmuch_query_t *query; + notmuch_threads_t *threads; + notmuch_thread_t *thread; notmuch_messages_t *messages; - notmuch_message_t *message; - int ret = 0; - - const char *headers[] = { - "From", "To", "Cc", "Bcc", "Date" - }; - const char *name, *value; - unsigned int i; + char *query_string; - notmuch = notmuch_database_open (NULL); - if (notmuch == NULL) { - ret = 1; - goto DONE; - } + config = notmuch_config_open (ctx, NULL, NULL); + if (config == NULL) + return 1; - query_string = query_string_from_args (local, argc, argv); + query_string = query_string_from_args (ctx, argc, argv); if (query_string == NULL) { fprintf (stderr, "Out of memory\n"); - ret = 1; - goto DONE; + return 1; } + if (*query_string == '\0') { + fprintf (stderr, "Error: notmuch show requires at least one search term.\n"); + return 1; + } + + notmuch = notmuch_database_open (notmuch_config_get_database_path (config)); + if (notmuch == NULL) + return 1; + query = notmuch_query_create (notmuch, query_string); if (query == NULL) { fprintf (stderr, "Out of memory\n"); - ret = 1; - goto DONE; + return 1; } - for (messages = notmuch_query_search_messages (query); - notmuch_messages_has_more (messages); - notmuch_messages_advance (messages)) + for (threads = notmuch_query_search_threads (query, 0, -1); + notmuch_threads_has_more (threads); + notmuch_threads_advance (threads)) { - message = notmuch_messages_get (messages); - - printf ("\fmessage{ id:%s filename:%s\n", - notmuch_message_get_message_id (message), - notmuch_message_get_filename (message)); + thread = notmuch_threads_get (threads); - printf ("\fheader{\n"); + messages = notmuch_thread_get_toplevel_messages (thread); - printf ("%s\n", _get_one_line_summary (local, message)); + if (messages == NULL) + INTERNAL_ERROR ("Thread %s has no toplevel messages.\n", + notmuch_thread_get_thread_id (thread)); - printf ("%s\n", notmuch_message_get_header (message, "subject")); - - for (i = 0; i < ARRAY_SIZE (headers); i++) { - name = headers[i]; - value = notmuch_message_get_header (message, name); - if (value) - printf ("%s: %s\n", name, value); - } + show_messages (ctx, messages, 0); - printf ("\fheader}\n"); - printf ("\fbody{\n"); - - show_message_body (notmuch_message_get_filename (message)); - - printf ("\fbody}\n"); - - printf ("\fmessage}\n"); - - notmuch_message_destroy (message); + notmuch_thread_destroy (thread); } - DONE: - if (local) - talloc_free (local); - - if (query) - notmuch_query_destroy (query); - - if (notmuch) - notmuch_database_close (notmuch); + notmuch_query_destroy (query); + notmuch_database_close (notmuch); - return ret; + return 0; }