Re: [PATCH] emacs: wash: make word-wrap bound message width
[notmuch-archives.git] / 14 / 4ac0d475c77d86b87b3bdb8aa4efbca5950c8d
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
8 X-Spam-Flag: NO\r
9 X-Spam-Score: 0.104\r
10 X-Spam-Level: \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
13         autolearn=disabled\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
19         [18.9.25.15])\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
42         style\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
64 Precedence: list\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
75 \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
80 \r
81 Note that this patch retains format_headers_message_part_text because\r
82 it is also used by the raw format.\r
83 ---\r
84  notmuch-show.c |  270 +++++++++++++++++++++++++++++---------------------------\r
85  1 files changed, 139 insertions(+), 131 deletions(-)\r
86 \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
91 @@ -21,40 +21,17 @@\r
92  #include "notmuch-client.h"\r
93  \r
94  static void\r
95 -format_message_text (unused (const void *ctx),\r
96 -                    notmuch_message_t *message,\r
97 -                    int indent);\r
98 -static void\r
99 -format_headers_text (const void *ctx,\r
100 -                    notmuch_message_t *message);\r
101 -\r
102 -static void\r
103  format_headers_message_part_text (GMimeMessage *message);\r
104  \r
105  static void\r
106 -format_part_start_text (GMimeObject *part,\r
107 -                       int *part_count);\r
108 -\r
109 -static void\r
110 -format_part_content_text (GMimeObject *part);\r
111 -\r
112 -static void\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
116  \r
117  static const notmuch_show_format_t format_text = {\r
118 -    "", NULL,\r
119 -       "\fmessage{ ", format_message_text,\r
120 -           "\fheader{\n", format_headers_text, format_headers_message_part_text, "\fheader}\n",\r
121 -           "\fbody{\n",\r
122 -               format_part_start_text,\r
123 -               NULL,\r
124 -               NULL,\r
125 -               format_part_content_text,\r
126 -               format_part_end_text,\r
127 -               "",\r
128 -           "\fbody}\n",\r
129 -       "\fmessage}\n", "",\r
130 -    ""\r
131 +    .message_set_start = "",\r
132 +    .part = format_part_text,\r
133 +    .message_set_sep = "",\r
134 +    .message_set_end = ""\r
135  };\r
136  \r
137  static void\r
138 @@ -191,16 +168,6 @@ _get_one_line_summary (const void *ctx, notmuch_message_t *message)\r
139  }\r
140  \r
141  static void\r
142 -format_message_text (unused (const void *ctx), notmuch_message_t *message, int indent)\r
143 -{\r
144 -    printf ("id:%s depth:%d match:%d filename:%s\n",\r
145 -           notmuch_message_get_message_id (message),\r
146 -           indent,\r
147 -           notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH),\r
148 -           notmuch_message_get_filename (message));\r
149 -}\r
150 -\r
151 -static void\r
152  format_message_json (const void *ctx, notmuch_message_t *message, unused (int indent))\r
153  {\r
154      notmuch_tags_t *tags;\r
155 @@ -338,26 +305,6 @@ format_message_mbox (const void *ctx,\r
156      fclose (file);\r
157  }\r
158  \r
159 -\r
160 -static void\r
161 -format_headers_text (const void *ctx, notmuch_message_t *message)\r
162 -{\r
163 -    const char *headers[] = {\r
164 -       "Subject", "From", "To", "Cc", "Bcc", "Date"\r
165 -    };\r
166 -    const char *name, *value;\r
167 -    unsigned int i;\r
168 -\r
169 -    printf ("%s\n", _get_one_line_summary (ctx, message));\r
170 -\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
176 -    }\r
177 -}\r
178 -\r
179  static void\r
180  format_headers_message_part_text (GMimeMessage *message)\r
181  {\r
182 @@ -523,78 +470,6 @@ signer_status_to_string (GMimeSignerStatus x)\r
183  #endif\r
184  \r
185  static void\r
186 -format_part_start_text (GMimeObject *part, int *part_count)\r
187 -{\r
188 -    GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (part);\r
189 -\r
190 -    if (disposition &&\r
191 -       strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)\r
192 -    {\r
193 -       printf ("\fattachment{ ID: %d", *part_count);\r
194 -\r
195 -    } else {\r
196 -\r
197 -       printf ("\fpart{ ID: %d", *part_count);\r
198 -    }\r
199 -}\r
200 -\r
201 -static void\r
202 -format_part_content_text (GMimeObject *part)\r
203 -{\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
206 -\r
207 -    if (GMIME_IS_PART (part))\r
208 -    {\r
209 -       const char *filename = g_mime_part_get_filename (GMIME_PART (part));\r
210 -       if (filename)\r
211 -           printf (", Filename: %s", filename);\r
212 -    }\r
213 -\r
214 -    if (cid)\r
215 -       printf (", Content-id: %s", cid);\r
216 -\r
217 -    printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));\r
218 -\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
221 -    {\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
226 -    }\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
229 -    {\r
230 -       /* Do nothing for multipart since its content will be printed\r
231 -        * when recursing. */\r
232 -    }\r
233 -    else\r
234 -    {\r
235 -       printf ("Non-text part: %s\n",\r
236 -               g_mime_content_type_to_string (content_type));\r
237 -    }\r
238 -}\r
239 -\r
240 -static void\r
241 -format_part_end_text (GMimeObject *part)\r
242 -{\r
243 -    GMimeContentDisposition *disposition;\r
244 -\r
245 -    disposition = g_mime_object_get_content_disposition (part);\r
246 -    if (disposition &&\r
247 -       strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)\r
248 -    {\r
249 -       printf ("\fattachment}\n");\r
250 -    }\r
251 -    else\r
252 -    {\r
253 -       printf ("\fpart}\n");\r
254 -    }\r
255 -}\r
256 -\r
257 -static void\r
258  format_part_start_json (unused (GMimeObject *part), int *part_count)\r
259  {\r
260      printf ("{\"id\": %d", *part_count);\r
261 @@ -844,6 +719,139 @@ format_part_content_raw (GMimeObject *part)\r
262  }\r
263  \r
264  static void\r
265 +format_part_text (const void *ctx, mime_node_t *node,\r
266 +                 int indent, const notmuch_show_params_t *params)\r
267 +{\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
273 +    int i;\r
274 +\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
279 +       };\r
280 +       const char *name, *value;\r
281 +       unsigned int i;\r
282 +\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
286 +               indent,\r
287 +               notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH),\r
288 +               notmuch_message_get_filename (message));\r
289 +\r
290 +       printf ("\fheader{\n");\r
291 +\r
292 +       printf ("%s\n", _get_one_line_summary (ctx, message));\r
293 +\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
299 +       }\r
300 +       printf ("\fheader}\n");\r
301 +    } else {\r
302 +       GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (meta);\r
303 +       const char *cid = g_mime_object_get_content_id (meta);\r
304 +\r
305 +       if (disposition &&\r
306 +           strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)\r
307 +       {\r
308 +           printf ("\fattachment{ ID: %d", node->part_num);\r
309 +\r
310 +       } else {\r
311 +\r
312 +           printf ("\fpart{ ID: %d", node->part_num);\r
313 +       }\r
314 +\r
315 +       if (GMIME_IS_PART (node->part))\r
316 +       {\r
317 +           const char *filename = g_mime_part_get_filename (GMIME_PART (node->part));\r
318 +           if (filename)\r
319 +               printf (", Filename: %s", filename);\r
320 +       }\r
321 +\r
322 +       if (cid)\r
323 +           printf (", Content-id: %s", cid);\r
324 +\r
325 +       printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));\r
326 +    }\r
327 +\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
332 +\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
346 +    }\r
347 +\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
351 +       {\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
356 +       }\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
359 +       {\r
360 +           /* Do nothing for multipart since its content will be printed\r
361 +            * when recursing. */\r
362 +       }\r
363 +       else\r
364 +       {\r
365 +           printf ("Non-text part: %s\n",\r
366 +                   g_mime_content_type_to_string (content_type));\r
367 +       }\r
368 +    }\r
369 +\r
370 +    if (GMIME_IS_MESSAGE (node->part))\r
371 +       printf ("\fbody{\n");\r
372 +\r
373 +    for (i = 0; i < node->nchildren; i++)\r
374 +       format_part_text (ctx, mime_node_child (node, i), indent, params);\r
375 +\r
376 +    if (GMIME_IS_MESSAGE (node->part))\r
377 +       printf ("\fbody}\n");\r
378 +\r
379 +    if (node->envelope_file) {\r
380 +       printf ("\fmessage}\n");\r
381 +    } else {\r
382 +       GMimeContentDisposition *disposition;\r
383 +\r
384 +       disposition = g_mime_object_get_content_disposition (meta);\r
385 +       if (disposition &&\r
386 +           strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)\r
387 +       {\r
388 +           printf ("\fattachment}\n");\r
389 +       }\r
390 +       else\r
391 +       {\r
392 +           printf ("\fpart}\n");\r
393 +       }\r
394 +    }\r
395 +}\r
396 +\r
397 +static void\r
398  show_message (void *ctx,\r
399               const notmuch_show_format_t *format,\r
400               notmuch_message_t *message,\r
401 -- \r
402 1.7.7.3\r
403 \r