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 784AA431FAF
\r
6 for <notmuch@notmuchmail.org>; Sun, 5 Feb 2012 09:22:18 -0800 (PST)
\r
7 X-Virus-Scanned: Debian amavisd-new at olra.theworths.org
\r
11 X-Spam-Status: No, score=0.104 tagged_above=-999 required=5
\r
12 tests=[DATE_IN_PAST_12_24=0.804, RCVD_IN_DNSWL_LOW=-0.7]
\r
14 Received: from olra.theworths.org ([127.0.0.1])
\r
15 by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)
\r
16 with ESMTP id 3yrKOQ1NBmVq for <notmuch@notmuchmail.org>;
\r
17 Sun, 5 Feb 2012 09:22:16 -0800 (PST)
\r
18 Received: from dmz-mailsec-scanner-4.mit.edu (DMZ-MAILSEC-SCANNER-4.MIT.EDU
\r
20 by olra.theworths.org (Postfix) with ESMTP id 69983431FB6
\r
21 for <notmuch@notmuchmail.org>; Sun, 5 Feb 2012 09:22:16 -0800 (PST)
\r
22 X-AuditID: 1209190f-b7f8a6d000000914-18-4f2ebac706af
\r
23 Received: from mailhub-auth-4.mit.edu ( [18.7.62.39])
\r
24 by dmz-mailsec-scanner-4.mit.edu (Symantec Messaging Gateway) with SMTP
\r
25 id CD.16.02324.7CABE2F4; Sun, 5 Feb 2012 12:22:15 -0500 (EST)
\r
26 Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103])
\r
27 by mailhub-auth-4.mit.edu (8.13.8/8.9.2) with ESMTP id q15HMFPN018060;
\r
28 Sun, 5 Feb 2012 12:22:15 -0500
\r
29 Received: from drake.mit.edu
\r
30 (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com
\r
31 [209.6.116.242]) (authenticated bits=0)
\r
32 (User authenticated as amdragon@ATHENA.MIT.EDU)
\r
33 by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id q15HMDeN027733
\r
34 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);
\r
35 Sun, 5 Feb 2012 12:22:14 -0500 (EST)
\r
36 Received: from amthrax by drake.mit.edu with local (Exim 4.77)
\r
37 (envelope-from <amthrax@drake.mit.edu>)
\r
38 id 1Ru5n3-0000sm-TY; Sun, 05 Feb 2012 12:22:13 -0500
\r
39 From: Austin Clements <amdragon@MIT.EDU>
\r
40 To: notmuch@notmuchmail.org
\r
41 Subject: [PATCH v2 1/2] show: Convert text format to the new self-recursive
\r
43 Date: Sat, 4 Feb 2012 16:24:25 -0500
\r
44 Message-Id: <1328390666-22435-2-git-send-email-amdragon@mit.edu>
\r
45 X-Mailer: git-send-email 1.7.7.3
\r
46 In-Reply-To: <1328390666-22435-1-git-send-email-amdragon@mit.edu>
\r
47 References: <1327560926-22401-1-git-send-email-amdragon@mit.edu>
\r
48 <1328390666-22435-1-git-send-email-amdragon@mit.edu>
\r
49 X-Brightmail-Tracker:
\r
50 H4sIAAAAAAAAA+NgFtrNIsWRmVeSWpSXmKPExsUixG6nrnt8l56/wbdWG4urW/vZLa7fnMns
\r
51 wOSxc9Zddo9nq24xBzBFcdmkpOZklqUW6dslcGX8XGdWcN+34uvP+4wNjBvtuhg5OSQETCQu
\r
52 /L7DBmGLSVy4tx7I5uIQEtjHKDHr0AsWCGc9o8STe3NZIZx7TBJneiZDOfMZJVZvmQHWzyag
\r
53 IbFt/3JGEFtEQFpi593ZrCA2s4CTxOK/i5hBbGGBQImuhllg9SwCqhJ/fr8FWsHBwSvgINE/
\r
54 TQfiDAWJc6vPsYOEOQUcJTb+LQQJCwmUS2z6dYt1AiP/AkaGVYyyKblVurmJmTnFqcm6xcmJ
\r
55 eXmpRbomermZJXqpKaWbGEFhxCnJv4Px20GlQ4wCHIxKPLzM5nr+QqyJZcWVuYcYJTmYlER5
\r
56 M7cDhfiS8lMqMxKLM+KLSnNSiw8xSnAwK4nwyh7V9RfiTUmsrEotyodJSXOwKInzqmm98xMS
\r
57 SE8sSc1OTS1ILYLJynBwKEnw8gLjRUiwKDU9tSItM6cEIc3EwQkynAdouABIDW9xQWJucWY6
\r
58 RP4Uo6KUOC8DSEIAJJFRmgfXC4vzV4ziQK8I8/KDVPEAUwRc9yugwUxAg/exgVxdXJKIkJJq
\r
59 YFTof5LC/vOpqJ4d59llwTN/6c+Z/fGuutExxkSfJX+9Slav3OITwjM53uZneqx0mKfa25sT
\r
60 ef7tjpD0/7XW30JJ9+ShaoPu0ODCKS8rqnj0y2+a+Vg9miv5lfPT598PPny+cT7Ewv7i1f0O
\r
61 3/InJhQrvzDb8XWxxbH7GW84rs2eH7Bg70kD5lIlluKMREMt5qLiRABBxPV8zgIAAA==
\r
62 X-BeenThere: notmuch@notmuchmail.org
\r
63 X-Mailman-Version: 2.1.13
\r
65 List-Id: "Use and development of the notmuch mail system."
\r
66 <notmuch.notmuchmail.org>
\r
67 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,
\r
68 <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>
\r
69 List-Archive: <http://notmuchmail.org/pipermail/notmuch>
\r
70 List-Post: <mailto:notmuch@notmuchmail.org>
\r
71 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>
\r
72 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,
\r
73 <mailto:notmuch-request@notmuchmail.org?subject=subscribe>
\r
74 X-List-Received-Date: Sun, 05 Feb 2012 17:22:18 -0000
\r
76 This is all code movement and a smidgen of glue. This moves the
\r
77 existing text formatter code into one self-recursive function, but
\r
78 doesn't change any of the logic. The next patch will actually take
\r
79 advantage of what the new structure has to offer.
\r
81 Note that this patch retains format_headers_message_part_text because
\r
82 it is also used by the raw format.
\r
84 notmuch-show.c | 270 +++++++++++++++++++++++++++++---------------------------
\r
85 1 files changed, 139 insertions(+), 131 deletions(-)
\r
87 diff --git a/notmuch-show.c b/notmuch-show.c
\r
88 index dec799c..6a890b2 100644
\r
89 --- a/notmuch-show.c
\r
90 +++ b/notmuch-show.c
\r
92 #include "notmuch-client.h"
\r
95 -format_message_text (unused (const void *ctx),
\r
96 - notmuch_message_t *message,
\r
99 -format_headers_text (const void *ctx,
\r
100 - notmuch_message_t *message);
\r
103 format_headers_message_part_text (GMimeMessage *message);
\r
106 -format_part_start_text (GMimeObject *part,
\r
107 - int *part_count);
\r
110 -format_part_content_text (GMimeObject *part);
\r
113 -format_part_end_text (GMimeObject *part);
\r
114 +format_part_text (const void *ctx, mime_node_t *node,
\r
115 + int indent, const notmuch_show_params_t *params);
\r
117 static const notmuch_show_format_t format_text = {
\r
119 - "\fmessage{ ", format_message_text,
\r
120 - "\fheader{\n", format_headers_text, format_headers_message_part_text, "\fheader}\n",
\r
122 - format_part_start_text,
\r
125 - format_part_content_text,
\r
126 - format_part_end_text,
\r
129 - "\fmessage}\n", "",
\r
131 + .message_set_start = "",
\r
132 + .part = format_part_text,
\r
133 + .message_set_sep = "",
\r
134 + .message_set_end = ""
\r
138 @@ -191,16 +168,6 @@ _get_one_line_summary (const void *ctx, notmuch_message_t *message)
\r
142 -format_message_text (unused (const void *ctx), notmuch_message_t *message, int indent)
\r
144 - printf ("id:%s depth:%d match:%d filename:%s\n",
\r
145 - notmuch_message_get_message_id (message),
\r
147 - notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH),
\r
148 - notmuch_message_get_filename (message));
\r
152 format_message_json (const void *ctx, notmuch_message_t *message, unused (int indent))
\r
154 notmuch_tags_t *tags;
\r
155 @@ -338,26 +305,6 @@ format_message_mbox (const void *ctx,
\r
161 -format_headers_text (const void *ctx, notmuch_message_t *message)
\r
163 - const char *headers[] = {
\r
164 - "Subject", "From", "To", "Cc", "Bcc", "Date"
\r
166 - const char *name, *value;
\r
169 - printf ("%s\n", _get_one_line_summary (ctx, message));
\r
171 - for (i = 0; i < ARRAY_SIZE (headers); i++) {
\r
172 - name = headers[i];
\r
173 - value = notmuch_message_get_header (message, name);
\r
174 - if (value && strlen (value))
\r
175 - printf ("%s: %s\n", name, value);
\r
180 format_headers_message_part_text (GMimeMessage *message)
\r
182 @@ -523,78 +470,6 @@ signer_status_to_string (GMimeSignerStatus x)
\r
186 -format_part_start_text (GMimeObject *part, int *part_count)
\r
188 - GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (part);
\r
190 - if (disposition &&
\r
191 - strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
\r
193 - printf ("\fattachment{ ID: %d", *part_count);
\r
197 - printf ("\fpart{ ID: %d", *part_count);
\r
202 -format_part_content_text (GMimeObject *part)
\r
204 - const char *cid = g_mime_object_get_content_id (part);
\r
205 - GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
\r
207 - if (GMIME_IS_PART (part))
\r
209 - const char *filename = g_mime_part_get_filename (GMIME_PART (part));
\r
211 - printf (", Filename: %s", filename);
\r
215 - printf (", Content-id: %s", cid);
\r
217 - printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));
\r
219 - if (g_mime_content_type_is_type (content_type, "text", "*") &&
\r
220 - !g_mime_content_type_is_type (content_type, "text", "html"))
\r
222 - GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
\r
223 - g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
\r
224 - show_text_part_content (part, stream_stdout);
\r
225 - g_object_unref(stream_stdout);
\r
227 - else if (g_mime_content_type_is_type (content_type, "multipart", "*") ||
\r
228 - g_mime_content_type_is_type (content_type, "message", "rfc822"))
\r
230 - /* Do nothing for multipart since its content will be printed
\r
231 - * when recursing. */
\r
235 - printf ("Non-text part: %s\n",
\r
236 - g_mime_content_type_to_string (content_type));
\r
241 -format_part_end_text (GMimeObject *part)
\r
243 - GMimeContentDisposition *disposition;
\r
245 - disposition = g_mime_object_get_content_disposition (part);
\r
246 - if (disposition &&
\r
247 - strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
\r
249 - printf ("\fattachment}\n");
\r
253 - printf ("\fpart}\n");
\r
258 format_part_start_json (unused (GMimeObject *part), int *part_count)
\r
260 printf ("{\"id\": %d", *part_count);
\r
261 @@ -844,6 +719,139 @@ format_part_content_raw (GMimeObject *part)
\r
265 +format_part_text (const void *ctx, mime_node_t *node,
\r
266 + int indent, const notmuch_show_params_t *params)
\r
268 + /* The disposition and content-type metadata are associated with
\r
269 + * the envelope for message parts */
\r
270 + GMimeObject *meta = node->envelope_part ?
\r
271 + GMIME_OBJECT (node->envelope_part) : node->part;
\r
272 + GMimeContentType *content_type = g_mime_object_get_content_type (meta);
\r
275 + if (node->envelope_file) {
\r
276 + notmuch_message_t *message = node->envelope_file;
\r
277 + const char *headers[] = {
\r
278 + "Subject", "From", "To", "Cc", "Bcc", "Date"
\r
280 + const char *name, *value;
\r
283 + printf ("\fmessage{ ");
\r
284 + printf ("id:%s depth:%d match:%d filename:%s\n",
\r
285 + notmuch_message_get_message_id (message),
\r
287 + notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH),
\r
288 + notmuch_message_get_filename (message));
\r
290 + printf ("\fheader{\n");
\r
292 + printf ("%s\n", _get_one_line_summary (ctx, message));
\r
294 + for (i = 0; i < ARRAY_SIZE (headers); i++) {
\r
295 + name = headers[i];
\r
296 + value = notmuch_message_get_header (message, name);
\r
297 + if (value && strlen (value))
\r
298 + printf ("%s: %s\n", name, value);
\r
300 + printf ("\fheader}\n");
\r
302 + GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (meta);
\r
303 + const char *cid = g_mime_object_get_content_id (meta);
\r
305 + if (disposition &&
\r
306 + strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
\r
308 + printf ("\fattachment{ ID: %d", node->part_num);
\r
312 + printf ("\fpart{ ID: %d", node->part_num);
\r
315 + if (GMIME_IS_PART (node->part))
\r
317 + const char *filename = g_mime_part_get_filename (GMIME_PART (node->part));
\r
319 + printf (", Filename: %s", filename);
\r
323 + printf (", Content-id: %s", cid);
\r
325 + printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));
\r
328 + if (node->envelope_part) {
\r
329 + GMimeMessage *message = GMIME_MESSAGE (node->part);
\r
330 + InternetAddressList *recipients;
\r
331 + const char *recipients_string;
\r
333 + printf ("\fheader{\n");
\r
334 + printf ("Subject: %s\n", g_mime_message_get_subject (message));
\r
335 + printf ("From: %s\n", g_mime_message_get_sender (message));
\r
336 + recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO);
\r
337 + recipients_string = internet_address_list_to_string (recipients, 0);
\r
338 + if (recipients_string)
\r
339 + printf ("To: %s\n", recipients_string);
\r
340 + recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC);
\r
341 + recipients_string = internet_address_list_to_string (recipients, 0);
\r
342 + if (recipients_string)
\r
343 + printf ("Cc: %s\n", recipients_string);
\r
344 + printf ("Date: %s\n", g_mime_message_get_date_as_string (message));
\r
345 + printf ("\fheader}\n");
\r
348 + if (!node->envelope_file) {
\r
349 + if (g_mime_content_type_is_type (content_type, "text", "*") &&
\r
350 + !g_mime_content_type_is_type (content_type, "text", "html"))
\r
352 + GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
\r
353 + g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
\r
354 + show_text_part_content (node->part, stream_stdout);
\r
355 + g_object_unref(stream_stdout);
\r
357 + else if (g_mime_content_type_is_type (content_type, "multipart", "*") ||
\r
358 + g_mime_content_type_is_type (content_type, "message", "rfc822"))
\r
360 + /* Do nothing for multipart since its content will be printed
\r
361 + * when recursing. */
\r
365 + printf ("Non-text part: %s\n",
\r
366 + g_mime_content_type_to_string (content_type));
\r
370 + if (GMIME_IS_MESSAGE (node->part))
\r
371 + printf ("\fbody{\n");
\r
373 + for (i = 0; i < node->nchildren; i++)
\r
374 + format_part_text (ctx, mime_node_child (node, i), indent, params);
\r
376 + if (GMIME_IS_MESSAGE (node->part))
\r
377 + printf ("\fbody}\n");
\r
379 + if (node->envelope_file) {
\r
380 + printf ("\fmessage}\n");
\r
382 + GMimeContentDisposition *disposition;
\r
384 + disposition = g_mime_object_get_content_disposition (meta);
\r
385 + if (disposition &&
\r
386 + strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
\r
388 + printf ("\fattachment}\n");
\r
392 + printf ("\fpart}\n");
\r
398 show_message (void *ctx,
\r
399 const notmuch_show_format_t *format,
\r
400 notmuch_message_t *message,
\r