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 03A3D431FB6
\r
6 for <notmuch@notmuchmail.org>; Wed, 11 Jan 2012 17:49:49 -0800 (PST)
\r
7 X-Virus-Scanned: Debian amavisd-new at olra.theworths.org
\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 STbyMSZMJGOU for <notmuch@notmuchmail.org>;
\r
16 Wed, 11 Jan 2012 17:49:48 -0800 (PST)
\r
17 Received: from dmz-mailsec-scanner-4.mit.edu (DMZ-MAILSEC-SCANNER-4.MIT.EDU
\r
19 by olra.theworths.org (Postfix) with ESMTP id C6313429E21
\r
20 for <notmuch@notmuchmail.org>; Wed, 11 Jan 2012 17:49:47 -0800 (PST)
\r
21 X-AuditID: 1209190f-b7f8a6d000000914-f6-4f0e3c3b0c6b
\r
22 Received: from mailhub-auth-2.mit.edu ( [18.7.62.36])
\r
23 by dmz-mailsec-scanner-4.mit.edu (Symantec Messaging Gateway) with SMTP
\r
24 id 10.B1.02324.B3C3E0F4; Wed, 11 Jan 2012 20:49:47 -0500 (EST)
\r
25 Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103])
\r
26 by mailhub-auth-2.mit.edu (8.13.8/8.9.2) with ESMTP id q0C1nkWL023347;
\r
27 Wed, 11 Jan 2012 20:49:46 -0500
\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 q0C1ngHH001515
\r
33 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);
\r
34 Wed, 11 Jan 2012 20:49:46 -0500 (EST)
\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 1Rl9nS-00080C-IJ; Wed, 11 Jan 2012 20:49:42 -0500
\r
38 From: Austin Clements <amdragon@MIT.EDU>
\r
39 To: notmuch@notmuchmail.org
\r
40 Subject: [RFC PATCH 4/5] show: Convert text format to the new self-recursive
\r
42 Date: Wed, 11 Jan 2012 20:49:32 -0500
\r
43 Message-Id: <1326332973-30225-5-git-send-email-amdragon@mit.edu>
\r
44 X-Mailer: git-send-email 1.7.7.3
\r
45 In-Reply-To: <1326332973-30225-1-git-send-email-amdragon@mit.edu>
\r
46 References: <1326332973-30225-1-git-send-email-amdragon@mit.edu>
\r
47 X-Brightmail-Tracker:
\r
48 H4sIAAAAAAAAA+NgFtrMIsWRmVeSWpSXmKPExsUixG6nomttw+dvcOCVoMX1mzOZHRg9nq26
\r
49 xRzAGMVlk5Kak1mWWqRvl8CVsXDZVNaCtT4Vp3acYW9gnG3bxcjJISFgInF2YzM7hC0mceHe
\r
50 erYuRi4OIYF9jBK9+w6wQjgbGCV6PncyQTj3mSTOzHkL5cxnlGh8M4sJpJ9NQENi2/7ljCC2
\r
51 iIC0xM67s4HaOTiYBUQk3s0EKxEWCJJY/ukJ2DoWAVWJeeefg5XzCjhIvD81iQ3iDAWJc6vP
\r
52 gdVwCjhK9B8/BhYXAqp5sfMp8wRG/gWMDKsYZVNyq3RzEzNzilOTdYuTE/PyUot0TfRyM0v0
\r
53 UlNKNzGCwoZTkn8H47eDSocYBTgYlXh4d+7l9RdiTSwrrsw9xCjJwaQkyvvdis9fiC8pP6Uy
\r
54 I7E4I76oNCe1+BCjBAezkgivUw1QOW9KYmVValE+TEqag0VJnFdN652fkEB6YklqdmpqQWoR
\r
55 TFaGg0NJgne9NdBQwaLU9NSKtMycEoQ0EwcnyHAeoOEZIDW8xQWJucWZ6RD5U4yKUuK87iAJ
\r
56 AZBERmkeXC8srl8xigO9Isy7FqSKB5gS4LpfAQ1mAhq8ZR0PyOCSRISUVAOjYlvUYqZ1WqHJ
\r
57 r7ZJ6lV+vprTX/RCpuT+2YVVfTHhdi8zNi2+x+HeFrqL6fQWT/aEg/HM67Zb1Eb0n/xs4xUl
\r
58 z/DOwpxnkegfth9L+p/e8+aMkJx/ZcKxi1kfW307Ukw+LZLaUK70N3z1jp3buiW3SHLPDHm+
\r
59 9s6HhuoTQfu678RxuF7JX/RLiaU4I9FQi7moOBEANzb2jMYCAAA=
\r
60 X-BeenThere: notmuch@notmuchmail.org
\r
61 X-Mailman-Version: 2.1.13
\r
63 List-Id: "Use and development of the notmuch mail system."
\r
64 <notmuch.notmuchmail.org>
\r
65 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,
\r
66 <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>
\r
67 List-Archive: <http://notmuchmail.org/pipermail/notmuch>
\r
68 List-Post: <mailto:notmuch@notmuchmail.org>
\r
69 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>
\r
70 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,
\r
71 <mailto:notmuch-request@notmuchmail.org?subject=subscribe>
\r
72 X-List-Received-Date: Thu, 12 Jan 2012 01:49:49 -0000
\r
74 This is all code movement and a smidgen of glue. This moves the
\r
75 existing text formatter code into one self-recursive function, but
\r
76 doesn't change any of the logic. The next patch will actually take
\r
77 advantage of what the new structure has to offer.
\r
79 notmuch-show.c | 267 +++++++++++++++++++++++++++++---------------------------
\r
80 1 files changed, 140 insertions(+), 127 deletions(-)
\r
82 diff --git a/notmuch-show.c b/notmuch-show.c
\r
83 index ad54d69..3241965 100644
\r
84 --- a/notmuch-show.c
\r
85 +++ b/notmuch-show.c
\r
87 #include "notmuch-client.h"
\r
90 -format_message_text (unused (const void *ctx),
\r
91 - notmuch_message_t *message,
\r
94 -format_headers_text (const void *ctx,
\r
95 - notmuch_message_t *message);
\r
98 format_headers_message_part_text (GMimeMessage *message);
\r
101 -format_part_start_text (GMimeObject *part,
\r
102 - int *part_count);
\r
105 -format_part_content_text (GMimeObject *part);
\r
108 -format_part_end_text (GMimeObject *part);
\r
109 +format_part_text (const void *ctx, mime_node_t *node,
\r
110 + int indent, notmuch_show_params_t *params);
\r
112 static const notmuch_show_format_t format_text = {
\r
114 - "\fmessage{ ", format_message_text,
\r
115 - "\fheader{\n", format_headers_text, format_headers_message_part_text, "\fheader}\n",
\r
117 - format_part_start_text,
\r
120 - format_part_content_text,
\r
121 - format_part_end_text,
\r
124 - "\fmessage}\n", "",
\r
126 + .message_set_start = "",
\r
127 + .part = format_part_text,
\r
128 + .message_set_sep = "",
\r
129 + .message_set_end = ""
\r
133 @@ -140,6 +117,9 @@ static const notmuch_show_format_t format_raw = {
\r
138 +show_text_part_content (GMimeObject *part, GMimeStream *stream_out);
\r
140 static const char *
\r
141 _get_tags_as_string (const void *ctx, notmuch_message_t *message)
\r
143 @@ -187,13 +167,138 @@ _get_one_line_summary (const void *ctx, notmuch_message_t *message)
\r
147 -format_message_text (unused (const void *ctx), notmuch_message_t *message, int indent)
\r
148 +format_part_text (const void *ctx, mime_node_t *node,
\r
149 + int indent, notmuch_show_params_t *params)
\r
151 - printf ("id:%s depth:%d match:%d filename:%s\n",
\r
152 - notmuch_message_get_message_id (message),
\r
154 - notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH),
\r
155 - notmuch_message_get_filename (message));
\r
156 + /* The disposition and content-type metadata are associated with
\r
157 + * the envelope for message parts */
\r
158 + GMimeObject *meta = node->envelope_part ?
\r
159 + GMIME_OBJECT (node->envelope_part) : node->part;
\r
160 + GMimeContentType *content_type = g_mime_object_get_content_type (meta);
\r
163 + if (node->envelope_file) {
\r
164 + notmuch_message_t *message = node->envelope_file;
\r
165 + const char *headers[] = {
\r
166 + "Subject", "From", "To", "Cc", "Bcc", "Date"
\r
168 + const char *name, *value;
\r
171 + printf ("\fmessage{ ");
\r
172 + printf ("id:%s depth:%d match:%d filename:%s\n",
\r
173 + notmuch_message_get_message_id (message),
\r
175 + notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH),
\r
176 + notmuch_message_get_filename (message));
\r
178 + printf ("\fheader{\n");
\r
180 + printf ("%s\n", _get_one_line_summary (ctx, message));
\r
182 + for (i = 0; i < ARRAY_SIZE (headers); i++) {
\r
183 + name = headers[i];
\r
184 + value = notmuch_message_get_header (message, name);
\r
185 + if (value && strlen (value))
\r
186 + printf ("%s: %s\n", name, value);
\r
188 + printf ("\fheader}\n");
\r
190 + GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (meta);
\r
191 + const char *cid = g_mime_object_get_content_id (meta);
\r
193 + if (disposition &&
\r
194 + strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
\r
196 + printf ("\fattachment{ ID: %d", node->part_num);
\r
200 + printf ("\fpart{ ID: %d", node->part_num);
\r
203 + if (GMIME_IS_PART (node->part))
\r
205 + const char *filename = g_mime_part_get_filename (GMIME_PART (node->part));
\r
207 + printf (", Filename: %s", filename);
\r
211 + printf (", Content-id: %s", cid);
\r
213 + printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));
\r
216 + if (node->envelope_part) {
\r
217 + GMimeMessage *message = GMIME_MESSAGE (node->part);
\r
218 + InternetAddressList *recipients;
\r
219 + const char *recipients_string;
\r
221 + printf ("\fheader{\n");
\r
222 + printf ("Subject: %s\n", g_mime_message_get_subject (message));
\r
223 + printf ("From: %s\n", g_mime_message_get_sender (message));
\r
224 + recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO);
\r
225 + recipients_string = internet_address_list_to_string (recipients, 0);
\r
226 + if (recipients_string)
\r
227 + printf ("To: %s\n", recipients_string);
\r
228 + recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC);
\r
229 + recipients_string = internet_address_list_to_string (recipients, 0);
\r
230 + if (recipients_string)
\r
231 + printf ("Cc: %s\n", recipients_string);
\r
232 + printf ("Date: %s\n", g_mime_message_get_date_as_string (message));
\r
233 + printf ("\fheader}\n");
\r
236 + if (!node->envelope_file) {
\r
237 + if (g_mime_content_type_is_type (content_type, "text", "*") &&
\r
238 + !g_mime_content_type_is_type (content_type, "text", "html"))
\r
240 + GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
\r
241 + g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
\r
242 + show_text_part_content (node->part, stream_stdout);
\r
243 + g_object_unref(stream_stdout);
\r
245 + else if (g_mime_content_type_is_type (content_type, "multipart", "*") ||
\r
246 + g_mime_content_type_is_type (content_type, "message", "rfc822"))
\r
248 + /* Do nothing for multipart since its content will be printed
\r
249 + * when recursing. */
\r
253 + printf ("Non-text part: %s\n",
\r
254 + g_mime_content_type_to_string (content_type));
\r
258 + if (GMIME_IS_MESSAGE (node->part)) {
\r
259 + printf ("\fbody{\n");
\r
262 + for (i = 0; i < node->nchildren; i++)
\r
263 + format_part_text (ctx, mime_node_child (node, i), indent, params);
\r
265 + if (GMIME_IS_MESSAGE (node->part)) {
\r
266 + printf ("\fbody}\n");
\r
269 + if (node->envelope_file) {
\r
270 + printf ("\fmessage}\n");
\r
272 + GMimeContentDisposition *disposition;
\r
274 + disposition = g_mime_object_get_content_disposition (meta);
\r
275 + if (disposition &&
\r
276 + strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
\r
278 + printf ("\fattachment}\n");
\r
282 + printf ("\fpart}\n");
\r
288 @@ -334,26 +439,6 @@ format_message_mbox (const void *ctx,
\r
294 -format_headers_text (const void *ctx, notmuch_message_t *message)
\r
296 - const char *headers[] = {
\r
297 - "Subject", "From", "To", "Cc", "Bcc", "Date"
\r
299 - const char *name, *value;
\r
302 - printf ("%s\n", _get_one_line_summary (ctx, message));
\r
304 - for (i = 0; i < ARRAY_SIZE (headers); i++) {
\r
305 - name = headers[i];
\r
306 - value = notmuch_message_get_header (message, name);
\r
307 - if (value && strlen (value))
\r
308 - printf ("%s: %s\n", name, value);
\r
313 format_headers_message_part_text (GMimeMessage *message)
\r
315 @@ -503,78 +588,6 @@ signer_status_to_string (GMimeSignerStatus x)
\r
319 -format_part_start_text (GMimeObject *part, int *part_count)
\r
321 - GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (part);
\r
323 - if (disposition &&
\r
324 - strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
\r
326 - printf ("\fattachment{ ID: %d", *part_count);
\r
330 - printf ("\fpart{ ID: %d", *part_count);
\r
335 -format_part_content_text (GMimeObject *part)
\r
337 - const char *cid = g_mime_object_get_content_id (part);
\r
338 - GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
\r
340 - if (GMIME_IS_PART (part))
\r
342 - const char *filename = g_mime_part_get_filename (GMIME_PART (part));
\r
344 - printf (", Filename: %s", filename);
\r
348 - printf (", Content-id: %s", cid);
\r
350 - printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));
\r
352 - if (g_mime_content_type_is_type (content_type, "text", "*") &&
\r
353 - !g_mime_content_type_is_type (content_type, "text", "html"))
\r
355 - GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
\r
356 - g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
\r
357 - show_text_part_content (part, stream_stdout);
\r
358 - g_object_unref(stream_stdout);
\r
360 - else if (g_mime_content_type_is_type (content_type, "multipart", "*") ||
\r
361 - g_mime_content_type_is_type (content_type, "message", "rfc822"))
\r
363 - /* Do nothing for multipart since its content will be printed
\r
364 - * when recursing. */
\r
368 - printf ("Non-text part: %s\n",
\r
369 - g_mime_content_type_to_string (content_type));
\r
374 -format_part_end_text (GMimeObject *part)
\r
376 - GMimeContentDisposition *disposition;
\r
378 - disposition = g_mime_object_get_content_disposition (part);
\r
379 - if (disposition &&
\r
380 - strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
\r
382 - printf ("\fattachment}\n");
\r
386 - printf ("\fpart}\n");
\r
391 format_part_start_json (unused (GMimeObject *part), int *part_count)
\r
393 printf ("{\"id\": %d", *part_count);
\r