aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Austin Clements <amdragon@MIT.EDU>2012-03-27 17:59:50 -0400
committerGravatar David Bremner <bremner@debian.org>2012-03-31 08:17:20 -0300
commitea4fd50f45b0bc0888070125c632ea2326eb18f7 (patch)
tree1a450a3512310a45afcec7f2d3f56993fea11d72
parentee1180018ee3c772d7ac769222ff9c6940f3c838 (diff)
show/reply: Unify the code that extracts text parts
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).
-rw-r--r--notmuch-client.h8
-rw-r--r--notmuch-reply.c28
-rw-r--r--notmuch-show.c23
3 files changed, 31 insertions, 28 deletions
diff --git a/notmuch-client.h b/notmuch-client.h
index fa04fa2e..203ac496 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 e2b6c253..2f5ed3dc 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 ff9d4278..0bf5e219 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));