unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
From: Austin Clements <amdragon@MIT.EDU>
To: notmuch@notmuchmail.org
Subject: [PATCH v2 1/3] show/reply: Unify the code that extracts text parts
Date: Tue, 27 Mar 2012 17:59:50 -0400	[thread overview]
Message-ID: <1332885592-32668-2-git-send-email-amdragon@mit.edu> (raw)
In-Reply-To: <1332885592-32668-1-git-send-email-amdragon@mit.edu>

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 |    8 ++++++++
 notmuch-reply.c  |   28 ++++------------------------
 notmuch-show.c   |   23 +++++++++++++++++++----
 3 files changed, 31 insertions(+), 28 deletions(-)

diff --git a/notmuch-client.h b/notmuch-client.h
index fa04fa2..203ac49 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -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);
 
diff --git a/notmuch-reply.c b/notmuch-reply.c
index e2b6c25..2f5ed3d 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -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
     {
diff --git a/notmuch-show.c b/notmuch-show.c
index ff9d427..0bf5e21 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -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,
@@ -247,13 +248,17 @@ 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));
-- 
1.7.9.1

  reply	other threads:[~2012-03-27 21:59 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-23  3:34 [PATCH 0/3] Rewrite default reply format Austin Clements
2012-03-23  3:34 ` [PATCH 1/3] show/reply: Unify the code that extracts text parts Austin Clements
2012-03-23  3:34 ` [PATCH 2/3] reply: Convert default reply format to self-recursive style Austin Clements
2012-03-23  3:34 ` [PATCH 3/3] reply: Move reply citation printing to the recursive MIME walk Austin Clements
2012-03-24 10:06 ` [PATCH 0/3] Rewrite default reply format Tomi Ollila
2012-03-27 21:57   ` Austin Clements
2012-03-27 21:59 ` [PATCH v2 " Austin Clements
2012-03-27 21:59   ` Austin Clements [this message]
2012-03-27 21:59   ` [PATCH v2 2/3] reply: Convert default reply format to self-recursive style Austin Clements
2012-03-27 21:59   ` [PATCH v2 3/3] reply: Move reply citation printing to the recursive MIME walk Austin Clements
2012-03-31 11:31   ` [PATCH v2 0/3] Rewrite default reply format David Bremner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://notmuchmail.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1332885592-32668-2-git-send-email-amdragon@mit.edu \
    --to=amdragon@mit.edu \
    --cc=notmuch@notmuchmail.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).