]> git.notmuchmail.org Git - notmuch/commitdiff
show/reply: Unify the code that extracts text parts
authorAustin Clements <amdragon@MIT.EDU>
Tue, 27 Mar 2012 21:59:50 +0000 (17:59 -0400)
committerDavid Bremner <bremner@debian.org>
Sat, 31 Mar 2012 11:17:20 +0000 (08:17 -0300)
Previously, show and reply had separate implementations of decoding
and printing text parts.  Now both use show's implementation, which
was more complete.  Show's implementation has been extended with an
option to add reply quoting to the extracted part (this is implemented
as a named flag to avoid naked booleans, even though it's the only
flag it can take).

notmuch-client.h
notmuch-reply.c
notmuch-show.c

index fa04fa2e48d68761fe6fab97b12856db75fe4529..203ac496731f238837020603b50a8a2ca35d3f42 100644 (file)
@@ -197,6 +197,14 @@ format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first);
 void
 format_headers_json (const void *ctx, GMimeMessage *message, notmuch_bool_t reply);
 
+typedef enum {
+    NOTMUCH_SHOW_TEXT_PART_REPLY = 1 << 0,
+} notmuch_show_text_part_flags;
+
+void
+show_text_part_content (GMimeObject *part, GMimeStream *stream_out,
+                       notmuch_show_text_part_flags flags);
+
 char *
 json_quote_chararray (const void *ctx, const char *str, const size_t len);
 
index e2b6c253a1ef505a8648ec87a874e43aaab9881b..2f5ed3dc9ea4c16c09b48cc7062b18f39845e5ce 100644 (file)
@@ -21,7 +21,6 @@
  */
 
 #include "notmuch-client.h"
-#include "gmime-filter-reply.h"
 #include "gmime-filter-headers.h"
 
 static void
@@ -106,29 +105,10 @@ reply_part_content (GMimeObject *part)
     else if (g_mime_content_type_is_type (content_type, "text", "*") &&
        !g_mime_content_type_is_type (content_type, "text", "html"))
     {
-       GMimeStream *stream_stdout = NULL, *stream_filter = NULL;
-       GMimeDataWrapper *wrapper;
-       const char *charset;
-
-       charset = g_mime_object_get_content_type_parameter (part, "charset");
-       stream_stdout = g_mime_stream_file_new (stdout);
-       if (stream_stdout) {
-           g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
-           stream_filter = g_mime_stream_filter_new(stream_stdout);
-           if (charset) {
-               g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),
-                                        g_mime_filter_charset_new(charset, "UTF-8"));
-           }
-       }
-       g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),
-                                g_mime_filter_reply_new(TRUE));
-       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);
+       GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
+       g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
+       show_text_part_content (part, stream_stdout, NOTMUCH_SHOW_TEXT_PART_REPLY);
+       g_object_unref(stream_stdout);
     }
     else
     {
index ff9d4278b04e1261afa8a33c5c2d50cfb8aacd50..0bf5e219c86d7a79823400a5ef8bbeacb40a1be7 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 #include "notmuch-client.h"
+#include "gmime-filter-reply.h"
 
 static notmuch_status_t
 format_part_text (const void *ctx, mime_node_t *node,
@@ -246,14 +247,18 @@ format_headers_json (const void *ctx, GMimeMessage *message, notmuch_bool_t repl
 }
 
 /* Write a MIME text part out to the given stream.
+ *
+ * If (flags & NOTMUCH_SHOW_TEXT_PART_REPLY), this prepends "> " to
+ * each output line.
  *
  * 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_text_part_content (GMimeObject *part, GMimeStream *stream_out)
+void
+show_text_part_content (GMimeObject *part, GMimeStream *stream_out,
+                       notmuch_show_text_part_flags flags)
 {
     GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
     GMimeStream *stream_filter = NULL;
@@ -286,6 +291,16 @@ show_text_part_content (GMimeObject *part, GMimeStream *stream_out)
 
     }
 
+    if (flags & NOTMUCH_SHOW_TEXT_PART_REPLY) {
+       GMimeFilter *reply_filter;
+       reply_filter = g_mime_filter_reply_new (TRUE);
+       if (reply_filter) {
+           g_mime_stream_filter_add (GMIME_STREAM_FILTER (stream_filter),
+                                     reply_filter);
+           g_object_unref (reply_filter);
+       }
+    }
+
     wrapper = g_mime_part_get_content_object (GMIME_PART (part));
     if (wrapper && stream_filter)
        g_mime_data_wrapper_write_to_stream (wrapper, stream_filter);
@@ -532,7 +547,7 @@ format_part_text (const void *ctx, mime_node_t *node,
        {
            GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
            g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
-           show_text_part_content (node->part, stream_stdout);
+           show_text_part_content (node->part, stream_stdout, 0);
            g_object_unref(stream_stdout);
        } else {
            printf ("Non-text part: %s\n",
@@ -624,7 +639,7 @@ format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first)
        } else if (g_mime_content_type_is_type (content_type, "text", "*")) {
            GMimeStream *stream_memory = g_mime_stream_mem_new ();
            GByteArray *part_content;
-           show_text_part_content (node->part, stream_memory);
+           show_text_part_content (node->part, stream_memory, 0);
            part_content = g_mime_stream_mem_get_byte_array (GMIME_STREAM_MEM (stream_memory));
 
            printf (", \"content\": %s", json_quote_chararray (local, (char *) part_content->data, part_content->len));