From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 54FB8431FAE for ; Thu, 22 Mar 2012 20:34:16 -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 50rKvTXI2DoC for ; Thu, 22 Mar 2012 20:34:14 -0700 (PDT) Received: from dmz-mailsec-scanner-8.mit.edu (DMZ-MAILSEC-SCANNER-8.MIT.EDU [18.7.68.37]) by olra.theworths.org (Postfix) with ESMTP id 1A415431FAF for ; Thu, 22 Mar 2012 20:34:13 -0700 (PDT) X-AuditID: 12074425-b7f4a6d0000008e0-2e-4f6bef336a72 Received: from mailhub-auth-4.mit.edu ( [18.7.62.39]) by dmz-mailsec-scanner-8.mit.edu (Symantec Messaging Gateway) with SMTP id F6.A7.02272.33FEB6F4; Thu, 22 Mar 2012 23:34:11 -0400 (EDT) Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103]) by mailhub-auth-4.mit.edu (8.13.8/8.9.2) with ESMTP id q2N3YBVC025961; Thu, 22 Mar 2012 23:34:11 -0400 Received: from drake.mit.edu (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com [209.6.116.242]) (authenticated bits=0) (User authenticated as amdragon@ATHENA.MIT.EDU) by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id q2N3Y8Tx007968 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); Thu, 22 Mar 2012 23:34:10 -0400 (EDT) Received: from amthrax by drake.mit.edu with local (Exim 4.77) (envelope-from ) id 1SAvGS-0002PE-GJ; Thu, 22 Mar 2012 23:34:08 -0400 From: Austin Clements To: notmuch@notmuchmail.org Subject: [PATCH 1/3] show/reply: Unify the code that extracts text parts Date: Thu, 22 Mar 2012 23:34:05 -0400 Message-Id: <1332473647-9133-2-git-send-email-amdragon@mit.edu> X-Mailer: git-send-email 1.7.7.3 In-Reply-To: <1332473647-9133-1-git-send-email-amdragon@mit.edu> References: <1332473647-9133-1-git-send-email-amdragon@mit.edu> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrEIsWRmVeSWpSXmKPExsUixG6nrmv8PtvfYO9HA4vrN2cyOzB6PFt1 izmAMYrLJiU1J7MstUjfLoEr4+f5rywFC3QquvsvszUwXlPpYuTkkBAwkdg9vY8dwhaTuHBv PVsXIxeHkMA+RomGO09ZIJwNjBK3ts1lhXDuM0l0P/wLVTYfKDNzARNIP5uAhsS2/csZQWwR AWmJnXdnA3VwcDALqEn86QJbJyzgIdH5vYcRJMwioCpxohGsk1fAXmLx1BdMEFcoSJxbfQ7s Ik4BB4mzn++BTRQCqtn65Av7BEb+BYwMqxhlU3KrdHMTM3OKU5N1i5MT8/JSi3Qt9HIzS/RS U0o3MYKDxkV1B+OEQ0qHGAU4GJV4eJt9sv2FWBPLiitzDzFKcjApifIyvAMK8SXlp1RmJBZn xBeV5qQWH2KU4GBWEuFVcgbK8aYkVlalFuXDpKQ5WJTEeTW13vkJCaQnlqRmp6YWpBbBZGU4 OJQkeCeBDBUsSk1PrUjLzClBSDNxcIIM5wEanglSw1tckJhbnJkOkT/FqCglzpsCkhAASWSU 5sH1wqL6FaM40CvCvLkgVTzAhADX/QpoMBPQ4AnXskAGlyQipKQaGD3/37Ha8L6u4qHL3h8v DbfkBFv8CDP9mWI/1Tj217VzjhWmszUEF/FNCip52NZ4iW+q0Okts3rWhlWx7Y1w3/1oTt0v ztKyL0HHFicrnmHc7OTle1BS/63aM46V0r2SqkVdUXzHVj05ynDNQ/2hK+tGpXsdRuZ9h+Qq DH1mnxFJuXr/2s1jzUosxRmJhlrMRcWJAMqc3BjFAgAA 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: Fri, 23 Mar 2012 03:34:16 -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..e24d6b6 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..9944791 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.7.3