Re: [PATCH] emacs: wash: make word-wrap bound message width
[notmuch-archives.git] / d0 / dc778c4452b13665664e9b125a512ea02a213e
1 Return-Path: <amthrax@drake.mit.edu>\r
2 X-Original-To: notmuch@notmuchmail.org\r
3 Delivered-To: notmuch@notmuchmail.org\r
4 Received: from localhost (localhost [127.0.0.1])\r
5         by olra.theworths.org (Postfix) with ESMTP id 54FB8431FAE\r
6         for <notmuch@notmuchmail.org>; Thu, 22 Mar 2012 20:34:16 -0700 (PDT)\r
7 X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
8 X-Spam-Flag: NO\r
9 X-Spam-Score: -0.7\r
10 X-Spam-Level: \r
11 X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5\r
12         tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled\r
13 Received: from olra.theworths.org ([127.0.0.1])\r
14         by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
15         with ESMTP id 50rKvTXI2DoC for <notmuch@notmuchmail.org>;\r
16         Thu, 22 Mar 2012 20:34:14 -0700 (PDT)\r
17 Received: from dmz-mailsec-scanner-8.mit.edu (DMZ-MAILSEC-SCANNER-8.MIT.EDU\r
18         [18.7.68.37])\r
19         by olra.theworths.org (Postfix) with ESMTP id 1A415431FAF\r
20         for <notmuch@notmuchmail.org>; Thu, 22 Mar 2012 20:34:13 -0700 (PDT)\r
21 X-AuditID: 12074425-b7f4a6d0000008e0-2e-4f6bef336a72\r
22 Received: from mailhub-auth-4.mit.edu ( [18.7.62.39])\r
23         by dmz-mailsec-scanner-8.mit.edu (Symantec Messaging Gateway) with SMTP\r
24         id F6.A7.02272.33FEB6F4; Thu, 22 Mar 2012 23:34:11 -0400 (EDT)\r
25 Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103])\r
26         by mailhub-auth-4.mit.edu (8.13.8/8.9.2) with ESMTP id q2N3YBVC025961; \r
27         Thu, 22 Mar 2012 23:34:11 -0400\r
28 Received: from drake.mit.edu\r
29         (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com\r
30         [209.6.116.242]) (authenticated bits=0)\r
31         (User authenticated as amdragon@ATHENA.MIT.EDU)\r
32         by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id q2N3Y8Tx007968\r
33         (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);\r
34         Thu, 22 Mar 2012 23:34:10 -0400 (EDT)\r
35 Received: from amthrax by drake.mit.edu with local (Exim 4.77)\r
36         (envelope-from <amthrax@drake.mit.edu>)\r
37         id 1SAvGS-0002PE-GJ; Thu, 22 Mar 2012 23:34:08 -0400\r
38 From: Austin Clements <amdragon@MIT.EDU>\r
39 To: notmuch@notmuchmail.org\r
40 Subject: [PATCH 1/3] show/reply: Unify the code that extracts text parts\r
41 Date: Thu, 22 Mar 2012 23:34:05 -0400\r
42 Message-Id: <1332473647-9133-2-git-send-email-amdragon@mit.edu>\r
43 X-Mailer: git-send-email 1.7.7.3\r
44 In-Reply-To: <1332473647-9133-1-git-send-email-amdragon@mit.edu>\r
45 References: <1332473647-9133-1-git-send-email-amdragon@mit.edu>\r
46 X-Brightmail-Tracker:\r
47  H4sIAAAAAAAAA+NgFtrEIsWRmVeSWpSXmKPExsUixG6nrmv8PtvfYO9HA4vrN2cyOzB6PFt1\r
48         izmAMYrLJiU1J7MstUjfLoEr4+f5rywFC3QquvsvszUwXlPpYuTkkBAwkdg9vY8dwhaTuHBv\r
49         PVsXIxeHkMA+RomGO09ZIJwNjBK3ts1lhXDuM0l0P/wLVTYfKDNzARNIP5uAhsS2/csZQWwR\r
50         AWmJnXdnA3VwcDALqEn86QJbJyzgIdH5vYcRJMwioCpxohGsk1fAXmLx1BdMEFcoSJxbfQ7s\r
51         Ik4BB4mzn++BTRQCqtn65Av7BEb+BYwMqxhlU3KrdHMTM3OKU5N1i5MT8/JSi3Qt9HIzS/RS\r
52         U0o3MYKDxkV1B+OEQ0qHGAU4GJV4eJt9sv2FWBPLiitzDzFKcjApifIyvAMK8SXlp1RmJBZn\r
53         xBeV5qQWH2KU4GBWEuFVcgbK8aYkVlalFuXDpKQ5WJTEeTW13vkJCaQnlqRmp6YWpBbBZGU4\r
54         OJQkeCeBDBUsSk1PrUjLzClBSDNxcIIM5wEanglSw1tckJhbnJkOkT/FqCglzpsCkhAASWSU\r
55         5sH1wqL6FaM40CvCvLkgVTzAhADX/QpoMBPQ4AnXskAGlyQipKQaGD3/37Ha8L6u4qHL3h8v\r
56         DbfkBFv8CDP9mWI/1Tj217VzjhWmszUEF/FNCip52NZ4iW+q0Okts3rWhlWx7Y1w3/1oTt0v\r
57         ztKyL0HHFicrnmHc7OTle1BS/63aM46V0r2SqkVdUXzHVj05ynDNQ/2hK+tGpXsdRuZ9h+Qq\r
58         DH1mnxFJuXr/2s1jzUosxRmJhlrMRcWJAMqc3BjFAgAA\r
59 X-BeenThere: notmuch@notmuchmail.org\r
60 X-Mailman-Version: 2.1.13\r
61 Precedence: list\r
62 List-Id: "Use and development of the notmuch mail system."\r
63         <notmuch.notmuchmail.org>\r
64 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
65         <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
66 List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
67 List-Post: <mailto:notmuch@notmuchmail.org>\r
68 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
69 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
70         <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
71 X-List-Received-Date: Fri, 23 Mar 2012 03:34:16 -0000\r
72 \r
73 Previously, show and reply had separate implementations of decoding\r
74 and printing text parts.  Now both use show's implementation, which\r
75 was more complete.  Show's implementation has been extended with an\r
76 option to add reply quoting to the extracted part (this is implemented\r
77 as a named flag to avoid naked booleans, even though it's the only\r
78 flag it can take).\r
79 ---\r
80  notmuch-client.h |    8 ++++++++\r
81  notmuch-reply.c  |   28 ++++------------------------\r
82  notmuch-show.c   |   23 +++++++++++++++++++----\r
83  3 files changed, 31 insertions(+), 28 deletions(-)\r
84 \r
85 diff --git a/notmuch-client.h b/notmuch-client.h\r
86 index fa04fa2..e24d6b6 100644\r
87 --- a/notmuch-client.h\r
88 +++ b/notmuch-client.h\r
89 @@ -197,6 +197,14 @@ format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first);\r
90  void\r
91  format_headers_json (const void *ctx, GMimeMessage *message, notmuch_bool_t reply);\r
92  \r
93 +typedef enum {\r
94 +    NOTMUCH_SHOW_TEXT_PART_REPLY = 1<<0,\r
95 +} notmuch_show_text_part_flags;\r
96 +\r
97 +void\r
98 +show_text_part_content (GMimeObject *part, GMimeStream *stream_out,\r
99 +                       notmuch_show_text_part_flags flags);\r
100 +\r
101  char *\r
102  json_quote_chararray (const void *ctx, const char *str, const size_t len);\r
103  \r
104 diff --git a/notmuch-reply.c b/notmuch-reply.c\r
105 index e2b6c25..2f5ed3d 100644\r
106 --- a/notmuch-reply.c\r
107 +++ b/notmuch-reply.c\r
108 @@ -21,7 +21,6 @@\r
109   */\r
110  \r
111  #include "notmuch-client.h"\r
112 -#include "gmime-filter-reply.h"\r
113  #include "gmime-filter-headers.h"\r
114  \r
115  static void\r
116 @@ -106,29 +105,10 @@ reply_part_content (GMimeObject *part)\r
117      else if (g_mime_content_type_is_type (content_type, "text", "*") &&\r
118         !g_mime_content_type_is_type (content_type, "text", "html"))\r
119      {\r
120 -       GMimeStream *stream_stdout = NULL, *stream_filter = NULL;\r
121 -       GMimeDataWrapper *wrapper;\r
122 -       const char *charset;\r
123 -\r
124 -       charset = g_mime_object_get_content_type_parameter (part, "charset");\r
125 -       stream_stdout = g_mime_stream_file_new (stdout);\r
126 -       if (stream_stdout) {\r
127 -           g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);\r
128 -           stream_filter = g_mime_stream_filter_new(stream_stdout);\r
129 -           if (charset) {\r
130 -               g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),\r
131 -                                        g_mime_filter_charset_new(charset, "UTF-8"));\r
132 -           }\r
133 -       }\r
134 -       g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),\r
135 -                                g_mime_filter_reply_new(TRUE));\r
136 -       wrapper = g_mime_part_get_content_object (GMIME_PART (part));\r
137 -       if (wrapper && stream_filter)\r
138 -           g_mime_data_wrapper_write_to_stream (wrapper, stream_filter);\r
139 -       if (stream_filter)\r
140 -           g_object_unref(stream_filter);\r
141 -       if (stream_stdout)\r
142 -           g_object_unref(stream_stdout);\r
143 +       GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);\r
144 +       g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);\r
145 +       show_text_part_content (part, stream_stdout, NOTMUCH_SHOW_TEXT_PART_REPLY);\r
146 +       g_object_unref(stream_stdout);\r
147      }\r
148      else\r
149      {\r
150 diff --git a/notmuch-show.c b/notmuch-show.c\r
151 index ff9d427..9944791 100644\r
152 --- a/notmuch-show.c\r
153 +++ b/notmuch-show.c\r
154 @@ -19,6 +19,7 @@\r
155   */\r
156  \r
157  #include "notmuch-client.h"\r
158 +#include "gmime-filter-reply.h"\r
159  \r
160  static notmuch_status_t\r
161  format_part_text (const void *ctx, mime_node_t *node,\r
162 @@ -247,13 +248,17 @@ format_headers_json (const void *ctx, GMimeMessage *message, notmuch_bool_t repl\r
163  \r
164  /* Write a MIME text part out to the given stream.\r
165   *\r
166 + * If flags&NOTMUCH_SHOW_TEXT_PART_REPLY, this prepends "> " to each\r
167 + * output line.\r
168 + *\r
169   * Both line-ending conversion (CRLF->LF) and charset conversion ( ->\r
170   * UTF-8) will be performed, so it is inappropriate to call this\r
171   * function with a non-text part. Doing so will trigger an internal\r
172   * error.\r
173   */\r
174 -static void\r
175 -show_text_part_content (GMimeObject *part, GMimeStream *stream_out)\r
176 +void\r
177 +show_text_part_content (GMimeObject *part, GMimeStream *stream_out,\r
178 +                       notmuch_show_text_part_flags flags)\r
179  {\r
180      GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));\r
181      GMimeStream *stream_filter = NULL;\r
182 @@ -286,6 +291,16 @@ show_text_part_content (GMimeObject *part, GMimeStream *stream_out)\r
183  \r
184      }\r
185  \r
186 +    if (flags & NOTMUCH_SHOW_TEXT_PART_REPLY) {\r
187 +       GMimeFilter *reply_filter;\r
188 +       reply_filter = g_mime_filter_reply_new (TRUE);\r
189 +       if (reply_filter) {\r
190 +           g_mime_stream_filter_add (GMIME_STREAM_FILTER (stream_filter),\r
191 +                                     reply_filter);\r
192 +           g_object_unref (reply_filter);\r
193 +       }\r
194 +    }\r
195 +\r
196      wrapper = g_mime_part_get_content_object (GMIME_PART (part));\r
197      if (wrapper && stream_filter)\r
198         g_mime_data_wrapper_write_to_stream (wrapper, stream_filter);\r
199 @@ -532,7 +547,7 @@ format_part_text (const void *ctx, mime_node_t *node,\r
200         {\r
201             GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);\r
202             g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);\r
203 -           show_text_part_content (node->part, stream_stdout);\r
204 +           show_text_part_content (node->part, stream_stdout, 0);\r
205             g_object_unref(stream_stdout);\r
206         } else {\r
207             printf ("Non-text part: %s\n",\r
208 @@ -624,7 +639,7 @@ format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first)\r
209         } else if (g_mime_content_type_is_type (content_type, "text", "*")) {\r
210             GMimeStream *stream_memory = g_mime_stream_mem_new ();\r
211             GByteArray *part_content;\r
212 -           show_text_part_content (node->part, stream_memory);\r
213 +           show_text_part_content (node->part, stream_memory, 0);\r
214             part_content = g_mime_stream_mem_get_byte_array (GMIME_STREAM_MEM (stream_memory));\r
215  \r
216             printf (", \"content\": %s", json_quote_chararray (local, (char *) part_content->data, part_content->len));\r
217 -- \r
218 1.7.7.3\r
219 \r