From: Austin Clements Date: Tue, 27 Mar 2012 21:59:50 +0000 (+2000) Subject: [PATCH v2 1/3] show/reply: Unify the code that extracts text parts X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=6f54d8e7969cc13af975f69b9ea42a1227033f1b;p=notmuch-archives.git [PATCH v2 1/3] show/reply: Unify the code that extracts text parts --- diff --git a/6d/dde5e0f7cf620c0d104522b332f42c96bca548 b/6d/dde5e0f7cf620c0d104522b332f42c96bca548 new file mode 100644 index 000000000..60bd541c1 --- /dev/null +++ b/6d/dde5e0f7cf620c0d104522b332f42c96bca548 @@ -0,0 +1,219 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id 71FA0431FC9 + for ; Tue, 27 Mar 2012 14:59:59 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: -0.7 +X-Spam-Level: +X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id utyCg75NaQGk for ; + Tue, 27 Mar 2012 14:59:58 -0700 (PDT) +Received: from dmz-mailsec-scanner-7.mit.edu (DMZ-MAILSEC-SCANNER-7.MIT.EDU + [18.7.68.36]) + by olra.theworths.org (Postfix) with ESMTP id A5301431FB6 + for ; Tue, 27 Mar 2012 14:59:57 -0700 (PDT) +X-AuditID: 12074424-b7fae6d000000906-c2-4f72385bd73c +Received: from mailhub-auth-3.mit.edu ( [18.9.21.43]) + by dmz-mailsec-scanner-7.mit.edu (Symantec Messaging Gateway) with SMTP + id 2B.23.02310.B58327F4; Tue, 27 Mar 2012 17:59:55 -0400 (EDT) +Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103]) + by mailhub-auth-3.mit.edu (8.13.8/8.9.2) with ESMTP id q2RLxtPW022941; + Tue, 27 Mar 2012 17:59:55 -0400 +Received: from drake.mit.edu (26-4-166.dynamic.csail.mit.edu [18.26.4.166]) + (authenticated bits=0) + (User authenticated as amdragon@ATHENA.MIT.EDU) + by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id q2RLxsUg014142 + (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); + Tue, 27 Mar 2012 17:59:55 -0400 (EDT) +Received: from amthrax by drake.mit.edu with local (Exim 4.77) + (envelope-from ) + id 1SCeQk-0008Vp-HB; Tue, 27 Mar 2012 17:59:54 -0400 +From: Austin Clements +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 +Message-Id: <1332885592-32668-2-git-send-email-amdragon@mit.edu> +X-Mailer: git-send-email 1.7.9.1 +In-Reply-To: <1332885592-32668-1-git-send-email-amdragon@mit.edu> +References: <1332473647-9133-1-git-send-email-amdragon@mit.edu> + <1332885592-32668-1-git-send-email-amdragon@mit.edu> +X-Brightmail-Tracker: + H4sIAAAAAAAAA+NgFtrMIsWRmVeSWpSXmKPExsUixCmqrRttUeRvsPOKtcX1mzOZHRg9nq26 + xRzAGMVlk5Kak1mWWqRvl8CV8fLgMfaCZToV0xfPYW1gvKHSxcjJISFgIjFr8Q82CFtM4sK9 + 9UA2F4eQwD5GiSNb5rBDOBsYJbo/HoRyjjNJXP18khXCmc8o8fnkO0aQfjYBDYlt+5eD2SIC + 0hI7784GKuLgYBZQk/jTBbZOWMBb4tab76wgNouAqsSvvk3MIDavgIPExfc3GSHOUJB4tu44 + E4jNKeAocXXXGzBbSKBM4s6l06wTGPkXMDKsYpRNya3SzU3MzClOTdYtTk7My0st0jXXy80s + 0UtNKd3ECAobdheVHYzNh5QOMQpwMCrx8CozFPkLsSaWFVfmHmKU5GBSEuVVMAUK8SXlp1Rm + JBZnxBeV5qQWH2KU4GBWEuHVjir0F+JNSaysSi3Kh0lJc7AoifNqaL3zExJITyxJzU5NLUgt + gsnKcHAoSfC2mQMNFSxKTU+tSMvMKUFIM3FwggznARr+2Qyohre4IDG3ODMdIn+KUVFKnHcO + SLMASCKjNA+uFxbXrxjFgV4R5l0JUsUDTAlw3a+ABjMBDV5yJB9kcEkiQkqqgbE9r+IVq5Rz + oabrx0OLTk5xuOoXwDBbcpup1IKttVst/1795C+e9//Msg8hSxUfcM+Jcfy9tfpGl+DFevGz + 7zdc/54muX1i5/t1qvvm5LNveWesauF0+Vj6ZtXgsEXKm6bc4WcLMOsvOfhGO3h+cdf2tScu + pWkdtM9rq/yv0GbUt87w0uKe+SJKLMUZiYZazEXFiQChUUDwxgIAAA== +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 27 Mar 2012 21:59:59 -0000 + +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 +