Re: [PATCH v4 08/16] reorganize indexing of multipart/signed and multipart/encrypted
[notmuch-archives.git] / 51 / e5b185d408ef091c27ed96754ca4effada6964
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 C9AD7431FBC\r
6         for <notmuch@notmuchmail.org>; Wed, 25 Jan 2012 22:55:39 -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.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 lRM0ER2RKMiH for <notmuch@notmuchmail.org>;\r
16         Wed, 25 Jan 2012 22:55:38 -0800 (PST)\r
17 Received: from dmz-mailsec-scanner-1.mit.edu (DMZ-MAILSEC-SCANNER-1.MIT.EDU\r
18         [18.9.25.12])\r
19         by olra.theworths.org (Postfix) with ESMTP id 7134B431FAF\r
20         for <notmuch@notmuchmail.org>; Wed, 25 Jan 2012 22:55:38 -0800 (PST)\r
21 X-AuditID: 1209190c-b7fad6d000000920-02-4f20f8e97c5f\r
22 Received: from mailhub-auth-1.mit.edu ( [18.9.21.35])\r
23         by dmz-mailsec-scanner-1.mit.edu (Symantec Messaging Gateway) with SMTP\r
24         id 57.FC.02336.9E8F02F4; Thu, 26 Jan 2012 01:55:37 -0500 (EST)\r
25 Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103])\r
26         by mailhub-auth-1.mit.edu (8.13.8/8.9.2) with ESMTP id q0Q6taBY010091; \r
27         Thu, 26 Jan 2012 01:55:36 -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 q0Q6tXAa005478\r
33         (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);\r
34         Thu, 26 Jan 2012 01:55:34 -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 1RqJF7-0005uF-3O; Thu, 26 Jan 2012 01:55:33 -0500\r
38 From: Austin Clements <amdragon@MIT.EDU>\r
39 To: notmuch@notmuchmail.org\r
40 Subject: [PATCH 1/2] show: Convert text format to the new self-recursive style\r
41 Date: Thu, 26 Jan 2012 01:55:25 -0500\r
42 Message-Id: <1327560926-22401-2-git-send-email-amdragon@mit.edu>\r
43 X-Mailer: git-send-email 1.7.7.3\r
44 In-Reply-To: <1327560926-22401-1-git-send-email-amdragon@mit.edu>\r
45 References: <1327560926-22401-1-git-send-email-amdragon@mit.edu>\r
46 X-Brightmail-Tracker:\r
47  H4sIAAAAAAAAA+NgFrrJIsWRmVeSWpSXmKPExsUixCmqrPvyh4K/wfNHlhZXt/azWzRNd7bY\r
48         s8/L4vrNmcwWb1bOY3Vg9bh7mstj56y77B6Hvy5k8bh1/zW7x7NVt5gDWKO4bFJSczLLUov0\r
49         7RK4Mn6uMyu471vx9ed9xgbGjXZdjJwcEgImEoc3PGaGsMUkLtxbz9bFyMUhJLCPUWLtlQss\r
50         EM4GRonmi+uYIZz7TBKb169mhXDmM0qsObmcBaSfTUBDYtv+5YwgtoiAtMTOu7PBipgFehgl\r
51         Fh56DpYQFvCTWLt3OxOIzSKgKnFk4USwZl4BB4ndC0+zQByiIHFu9Tl2EJtTwFHi5bm/YLYQ\r
52         UE1D3y/2CYz8CxgZVjHKpuRW6eYmZuYUpybrFicn5uWlFuka6uVmluilppRuYgSHoCTPDsY3\r
53         B5UOMQpwMCrx8O4wUvAXYk0sK67MPcQoycGkJMqb+R0oxJeUn1KZkVicEV9UmpNafIhRgoNZ\r
54         SYRXzB4ox5uSWFmVWpQPk5LmYFES51XReucnJJCeWJKanZpakFoEk5Xh4FCS4I0FxpqQYFFq\r
55         empFWmZOCUKaiYMTZDgP0HB3kBre4oLE3OLMdIj8KUZFKXFeU5CEAEgiozQPrheWIl4xigO9\r
56         IswbCFLFA0wvcN2vgAYzAQ1eqisPMrgkESEl1cCY1aqpzW6zr27Wfs/r3A+VFG8vP/ZQzeJJ\r
57         qmzQd8+PL8//Fn3QpOpkMNXFV1Szir1r8dOrK2oP2UyTqd4YuyTj4NP2bVouP/V+2Tkp5jxY\r
58         xfw5b5vRxMnrNvRMz955/KPS1vMRnTub89ct2/f53zb76Mwysc7PaVtvt6gq/8vafUnXUyNi\r
59         56FjSizFGYmGWsxFxYkAH9Gr5OwCAAA=\r
60 Cc: tomi.ollila@iki.fi\r
61 X-BeenThere: notmuch@notmuchmail.org\r
62 X-Mailman-Version: 2.1.13\r
63 Precedence: list\r
64 List-Id: "Use and development of the notmuch mail system."\r
65         <notmuch.notmuchmail.org>\r
66 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
67         <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
68 List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
69 List-Post: <mailto:notmuch@notmuchmail.org>\r
70 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
71 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
72         <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
73 X-List-Received-Date: Thu, 26 Jan 2012 06:55:40 -0000\r
74 \r
75 This is all code movement and a smidgen of glue.  This moves the\r
76 existing text formatter code into one self-recursive function, but\r
77 doesn't change any of the logic.  The next patch will actually take\r
78 advantage of what the new structure has to offer.\r
79 \r
80 Note that this patch retains format_headers_message_part_text because\r
81 it is also used by the raw format.\r
82 ---\r
83  notmuch-show.c |  270 +++++++++++++++++++++++++++++---------------------------\r
84  1 files changed, 139 insertions(+), 131 deletions(-)\r
85 \r
86 diff --git a/notmuch-show.c b/notmuch-show.c\r
87 index dec799c..6a890b2 100644\r
88 --- a/notmuch-show.c\r
89 +++ b/notmuch-show.c\r
90 @@ -21,40 +21,17 @@\r
91  #include "notmuch-client.h"\r
92  \r
93  static void\r
94 -format_message_text (unused (const void *ctx),\r
95 -                    notmuch_message_t *message,\r
96 -                    int indent);\r
97 -static void\r
98 -format_headers_text (const void *ctx,\r
99 -                    notmuch_message_t *message);\r
100 -\r
101 -static void\r
102  format_headers_message_part_text (GMimeMessage *message);\r
103  \r
104  static void\r
105 -format_part_start_text (GMimeObject *part,\r
106 -                       int *part_count);\r
107 -\r
108 -static void\r
109 -format_part_content_text (GMimeObject *part);\r
110 -\r
111 -static void\r
112 -format_part_end_text (GMimeObject *part);\r
113 +format_part_text (const void *ctx, mime_node_t *node,\r
114 +                 int indent, const notmuch_show_params_t *params);\r
115  \r
116  static const notmuch_show_format_t format_text = {\r
117 -    "", NULL,\r
118 -       "\fmessage{ ", format_message_text,\r
119 -           "\fheader{\n", format_headers_text, format_headers_message_part_text, "\fheader}\n",\r
120 -           "\fbody{\n",\r
121 -               format_part_start_text,\r
122 -               NULL,\r
123 -               NULL,\r
124 -               format_part_content_text,\r
125 -               format_part_end_text,\r
126 -               "",\r
127 -           "\fbody}\n",\r
128 -       "\fmessage}\n", "",\r
129 -    ""\r
130 +    .message_set_start = "",\r
131 +    .part = format_part_text,\r
132 +    .message_set_sep = "",\r
133 +    .message_set_end = ""\r
134  };\r
135  \r
136  static void\r
137 @@ -191,16 +168,6 @@ _get_one_line_summary (const void *ctx, notmuch_message_t *message)\r
138  }\r
139  \r
140  static void\r
141 -format_message_text (unused (const void *ctx), notmuch_message_t *message, int indent)\r
142 -{\r
143 -    printf ("id:%s depth:%d match:%d filename:%s\n",\r
144 -           notmuch_message_get_message_id (message),\r
145 -           indent,\r
146 -           notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH),\r
147 -           notmuch_message_get_filename (message));\r
148 -}\r
149 -\r
150 -static void\r
151  format_message_json (const void *ctx, notmuch_message_t *message, unused (int indent))\r
152  {\r
153      notmuch_tags_t *tags;\r
154 @@ -338,26 +305,6 @@ format_message_mbox (const void *ctx,\r
155      fclose (file);\r
156  }\r
157  \r
158 -\r
159 -static void\r
160 -format_headers_text (const void *ctx, notmuch_message_t *message)\r
161 -{\r
162 -    const char *headers[] = {\r
163 -       "Subject", "From", "To", "Cc", "Bcc", "Date"\r
164 -    };\r
165 -    const char *name, *value;\r
166 -    unsigned int i;\r
167 -\r
168 -    printf ("%s\n", _get_one_line_summary (ctx, message));\r
169 -\r
170 -    for (i = 0; i < ARRAY_SIZE (headers); i++) {\r
171 -       name = headers[i];\r
172 -       value = notmuch_message_get_header (message, name);\r
173 -       if (value && strlen (value))\r
174 -           printf ("%s: %s\n", name, value);\r
175 -    }\r
176 -}\r
177 -\r
178  static void\r
179  format_headers_message_part_text (GMimeMessage *message)\r
180  {\r
181 @@ -523,78 +470,6 @@ signer_status_to_string (GMimeSignerStatus x)\r
182  #endif\r
183  \r
184  static void\r
185 -format_part_start_text (GMimeObject *part, int *part_count)\r
186 -{\r
187 -    GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (part);\r
188 -\r
189 -    if (disposition &&\r
190 -       strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)\r
191 -    {\r
192 -       printf ("\fattachment{ ID: %d", *part_count);\r
193 -\r
194 -    } else {\r
195 -\r
196 -       printf ("\fpart{ ID: %d", *part_count);\r
197 -    }\r
198 -}\r
199 -\r
200 -static void\r
201 -format_part_content_text (GMimeObject *part)\r
202 -{\r
203 -    const char *cid = g_mime_object_get_content_id (part);\r
204 -    GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));\r
205 -\r
206 -    if (GMIME_IS_PART (part))\r
207 -    {\r
208 -       const char *filename = g_mime_part_get_filename (GMIME_PART (part));\r
209 -       if (filename)\r
210 -           printf (", Filename: %s", filename);\r
211 -    }\r
212 -\r
213 -    if (cid)\r
214 -       printf (", Content-id: %s", cid);\r
215 -\r
216 -    printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));\r
217 -\r
218 -    if (g_mime_content_type_is_type (content_type, "text", "*") &&\r
219 -       !g_mime_content_type_is_type (content_type, "text", "html"))\r
220 -    {\r
221 -       GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);\r
222 -       g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);\r
223 -       show_text_part_content (part, stream_stdout);\r
224 -       g_object_unref(stream_stdout);\r
225 -    }\r
226 -    else if (g_mime_content_type_is_type (content_type, "multipart", "*") ||\r
227 -            g_mime_content_type_is_type (content_type, "message", "rfc822"))\r
228 -    {\r
229 -       /* Do nothing for multipart since its content will be printed\r
230 -        * when recursing. */\r
231 -    }\r
232 -    else\r
233 -    {\r
234 -       printf ("Non-text part: %s\n",\r
235 -               g_mime_content_type_to_string (content_type));\r
236 -    }\r
237 -}\r
238 -\r
239 -static void\r
240 -format_part_end_text (GMimeObject *part)\r
241 -{\r
242 -    GMimeContentDisposition *disposition;\r
243 -\r
244 -    disposition = g_mime_object_get_content_disposition (part);\r
245 -    if (disposition &&\r
246 -       strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)\r
247 -    {\r
248 -       printf ("\fattachment}\n");\r
249 -    }\r
250 -    else\r
251 -    {\r
252 -       printf ("\fpart}\n");\r
253 -    }\r
254 -}\r
255 -\r
256 -static void\r
257  format_part_start_json (unused (GMimeObject *part), int *part_count)\r
258  {\r
259      printf ("{\"id\": %d", *part_count);\r
260 @@ -844,6 +719,139 @@ format_part_content_raw (GMimeObject *part)\r
261  }\r
262  \r
263  static void\r
264 +format_part_text (const void *ctx, mime_node_t *node,\r
265 +                 int indent, const notmuch_show_params_t *params)\r
266 +{\r
267 +    /* The disposition and content-type metadata are associated with\r
268 +     * the envelope for message parts */\r
269 +    GMimeObject *meta = node->envelope_part ?\r
270 +       GMIME_OBJECT (node->envelope_part) : node->part;\r
271 +    GMimeContentType *content_type = g_mime_object_get_content_type (meta);\r
272 +    int i;\r
273 +\r
274 +    if (node->envelope_file) {\r
275 +       notmuch_message_t *message = node->envelope_file;\r
276 +       const char *headers[] = {\r
277 +           "Subject", "From", "To", "Cc", "Bcc", "Date"\r
278 +       };\r
279 +       const char *name, *value;\r
280 +       unsigned int i;\r
281 +\r
282 +       printf ("\fmessage{ ");\r
283 +       printf ("id:%s depth:%d match:%d filename:%s\n",\r
284 +               notmuch_message_get_message_id (message),\r
285 +               indent,\r
286 +               notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH),\r
287 +               notmuch_message_get_filename (message));\r
288 +\r
289 +       printf ("\fheader{\n");\r
290 +\r
291 +       printf ("%s\n", _get_one_line_summary (ctx, message));\r
292 +\r
293 +       for (i = 0; i < ARRAY_SIZE (headers); i++) {\r
294 +           name = headers[i];\r
295 +           value = notmuch_message_get_header (message, name);\r
296 +           if (value && strlen (value))\r
297 +               printf ("%s: %s\n", name, value);\r
298 +       }\r
299 +       printf ("\fheader}\n");\r
300 +    } else {\r
301 +       GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (meta);\r
302 +       const char *cid = g_mime_object_get_content_id (meta);\r
303 +\r
304 +       if (disposition &&\r
305 +           strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)\r
306 +       {\r
307 +           printf ("\fattachment{ ID: %d", node->part_num);\r
308 +\r
309 +       } else {\r
310 +\r
311 +           printf ("\fpart{ ID: %d", node->part_num);\r
312 +       }\r
313 +\r
314 +       if (GMIME_IS_PART (node->part))\r
315 +       {\r
316 +           const char *filename = g_mime_part_get_filename (GMIME_PART (node->part));\r
317 +           if (filename)\r
318 +               printf (", Filename: %s", filename);\r
319 +       }\r
320 +\r
321 +       if (cid)\r
322 +           printf (", Content-id: %s", cid);\r
323 +\r
324 +       printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));\r
325 +    }\r
326 +\r
327 +    if (node->envelope_part) {\r
328 +       GMimeMessage *message = GMIME_MESSAGE (node->part);\r
329 +       InternetAddressList *recipients;\r
330 +       const char *recipients_string;\r
331 +\r
332 +       printf ("\fheader{\n");\r
333 +       printf ("Subject: %s\n", g_mime_message_get_subject (message));\r
334 +       printf ("From: %s\n", g_mime_message_get_sender (message));\r
335 +       recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO);\r
336 +       recipients_string = internet_address_list_to_string (recipients, 0);\r
337 +       if (recipients_string)\r
338 +           printf ("To: %s\n", recipients_string);\r
339 +       recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC);\r
340 +       recipients_string = internet_address_list_to_string (recipients, 0);\r
341 +       if (recipients_string)\r
342 +           printf ("Cc: %s\n", recipients_string);\r
343 +       printf ("Date: %s\n", g_mime_message_get_date_as_string (message));\r
344 +       printf ("\fheader}\n");\r
345 +    }\r
346 +\r
347 +    if (!node->envelope_file) {\r
348 +       if (g_mime_content_type_is_type (content_type, "text", "*") &&\r
349 +           !g_mime_content_type_is_type (content_type, "text", "html"))\r
350 +       {\r
351 +           GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);\r
352 +           g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);\r
353 +           show_text_part_content (node->part, stream_stdout);\r
354 +           g_object_unref(stream_stdout);\r
355 +       }\r
356 +       else if (g_mime_content_type_is_type (content_type, "multipart", "*") ||\r
357 +                g_mime_content_type_is_type (content_type, "message", "rfc822"))\r
358 +       {\r
359 +           /* Do nothing for multipart since its content will be printed\r
360 +            * when recursing. */\r
361 +       }\r
362 +       else\r
363 +       {\r
364 +           printf ("Non-text part: %s\n",\r
365 +                   g_mime_content_type_to_string (content_type));\r
366 +       }\r
367 +    }\r
368 +\r
369 +    if (GMIME_IS_MESSAGE (node->part))\r
370 +       printf ("\fbody{\n");\r
371 +\r
372 +    for (i = 0; i < node->nchildren; i++)\r
373 +       format_part_text (ctx, mime_node_child (node, i), indent, params);\r
374 +\r
375 +    if (GMIME_IS_MESSAGE (node->part))\r
376 +       printf ("\fbody}\n");\r
377 +\r
378 +    if (node->envelope_file) {\r
379 +       printf ("\fmessage}\n");\r
380 +    } else {\r
381 +       GMimeContentDisposition *disposition;\r
382 +\r
383 +       disposition = g_mime_object_get_content_disposition (meta);\r
384 +       if (disposition &&\r
385 +           strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)\r
386 +       {\r
387 +           printf ("\fattachment}\n");\r
388 +       }\r
389 +       else\r
390 +       {\r
391 +           printf ("\fpart}\n");\r
392 +       }\r
393 +    }\r
394 +}\r
395 +\r
396 +static void\r
397  show_message (void *ctx,\r
398               const notmuch_show_format_t *format,\r
399               notmuch_message_t *message,\r
400 -- \r
401 1.7.7.3\r
402 \r