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