From 97b4479aaf7c03688750ceb9c5de9df71ae77864 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 27 Jan 2012 01:55:25 +1900 Subject: [PATCH] [PATCH 1/2] show: Convert text format to the new self-recursive style --- 51/e5b185d408ef091c27ed96754ca4effada6964 | 402 ++++++++++++++++++++++ 1 file changed, 402 insertions(+) create mode 100644 51/e5b185d408ef091c27ed96754ca4effada6964 diff --git a/51/e5b185d408ef091c27ed96754ca4effada6964 b/51/e5b185d408ef091c27ed96754ca4effada6964 new file mode 100644 index 000000000..1139438fa --- /dev/null +++ b/51/e5b185d408ef091c27ed96754ca4effada6964 @@ -0,0 +1,402 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id C9AD7431FBC + for ; Wed, 25 Jan 2012 22:55:39 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: -0.7 +X-Spam-Level: +X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id lRM0ER2RKMiH for ; + Wed, 25 Jan 2012 22:55:38 -0800 (PST) +Received: from dmz-mailsec-scanner-1.mit.edu (DMZ-MAILSEC-SCANNER-1.MIT.EDU + [18.9.25.12]) + by olra.theworths.org (Postfix) with ESMTP id 7134B431FAF + for ; Wed, 25 Jan 2012 22:55:38 -0800 (PST) +X-AuditID: 1209190c-b7fad6d000000920-02-4f20f8e97c5f +Received: from mailhub-auth-1.mit.edu ( [18.9.21.35]) + by dmz-mailsec-scanner-1.mit.edu (Symantec Messaging Gateway) with SMTP + id 57.FC.02336.9E8F02F4; Thu, 26 Jan 2012 01:55:37 -0500 (EST) +Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103]) + by mailhub-auth-1.mit.edu (8.13.8/8.9.2) with ESMTP id q0Q6taBY010091; + Thu, 26 Jan 2012 01:55:36 -0500 +Received: from drake.mit.edu + (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com + [209.6.116.242]) (authenticated bits=0) + (User authenticated as amdragon@ATHENA.MIT.EDU) + by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id q0Q6tXAa005478 + (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); + Thu, 26 Jan 2012 01:55:34 -0500 (EST) +Received: from amthrax by drake.mit.edu with local (Exim 4.77) + (envelope-from ) + id 1RqJF7-0005uF-3O; Thu, 26 Jan 2012 01:55:33 -0500 +From: Austin Clements +To: notmuch@notmuchmail.org +Subject: [PATCH 1/2] show: Convert text format to the new self-recursive style +Date: Thu, 26 Jan 2012 01:55:25 -0500 +Message-Id: <1327560926-22401-2-git-send-email-amdragon@mit.edu> +X-Mailer: git-send-email 1.7.7.3 +In-Reply-To: <1327560926-22401-1-git-send-email-amdragon@mit.edu> +References: <1327560926-22401-1-git-send-email-amdragon@mit.edu> +X-Brightmail-Tracker: + H4sIAAAAAAAAA+NgFrrJIsWRmVeSWpSXmKPExsUixCmqrPvyh4K/wfNHlhZXt/azWzRNd7bY + s8/L4vrNmcwWb1bOY3Vg9bh7mstj56y77B6Hvy5k8bh1/zW7x7NVt5gDWKO4bFJSczLLUov0 + 7RK4Mn6uMyu471vx9ed9xgbGjXZdjJwcEgImEoc3PGaGsMUkLtxbz9bFyMUhJLCPUWLtlQss + EM4GRonmi+uYIZz7TBKb169mhXDmM0qsObmcBaSfTUBDYtv+5YwgtoiAtMTOu7PBipgFehgl + Fh56DpYQFvCTWLt3OxOIzSKgKnFk4USwZl4BB4ndC0+zQByiIHFu9Tl2EJtTwFHi5bm/YLYQ + UE1D3y/2CYz8CxgZVjHKpuRW6eYmZuYUpybrFicn5uWlFuka6uVmluilppRuYgSHoCTPDsY3 + B5UOMQpwMCrx8O4wUvAXYk0sK67MPcQoycGkJMqb+R0oxJeUn1KZkVicEV9UmpNafIhRgoNZ + SYRXzB4ox5uSWFmVWpQPk5LmYFES51XReucnJJCeWJKanZpakFoEk5Xh4FCS4I0FxpqQYFFq + empFWmZOCUKaiYMTZDgP0HB3kBre4oLE3OLMdIj8KUZFKXFeU5CEAEgiozQPrheWIl4xigO9 + IswbCFLFA0wvcN2vgAYzAQ1eqisPMrgkESEl1cCY1aqpzW6zr27Wfs/r3A+VFG8vP/ZQzeJJ + qmzQd8+PL8//Fn3QpOpkMNXFV1Szir1r8dOrK2oP2UyTqd4YuyTj4NP2bVouP/V+2Tkp5jxY + xfw5b5vRxMnrNvRMz955/KPS1vMRnTub89ct2/f53zb76Mwysc7PaVtvt6gq/8vafUnXUyNi + 56FjSizFGYmGWsxFxYkAH9Gr5OwCAAA= +Cc: tomi.ollila@iki.fi +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Thu, 26 Jan 2012 06:55:40 -0000 + +This is all code movement and a smidgen of glue. This moves the +existing text formatter code into one self-recursive function, but +doesn't change any of the logic. The next patch will actually take +advantage of what the new structure has to offer. + +Note that this patch retains format_headers_message_part_text because +it is also used by the raw format. +--- + notmuch-show.c | 270 +++++++++++++++++++++++++++++--------------------------- + 1 files changed, 139 insertions(+), 131 deletions(-) + +diff --git a/notmuch-show.c b/notmuch-show.c +index dec799c..6a890b2 100644 +--- a/notmuch-show.c ++++ b/notmuch-show.c +@@ -21,40 +21,17 @@ + #include "notmuch-client.h" + + static void +-format_message_text (unused (const void *ctx), +- notmuch_message_t *message, +- int indent); +-static void +-format_headers_text (const void *ctx, +- notmuch_message_t *message); +- +-static void + format_headers_message_part_text (GMimeMessage *message); + + static void +-format_part_start_text (GMimeObject *part, +- int *part_count); +- +-static void +-format_part_content_text (GMimeObject *part); +- +-static void +-format_part_end_text (GMimeObject *part); ++format_part_text (const void *ctx, mime_node_t *node, ++ int indent, const notmuch_show_params_t *params); + + static const notmuch_show_format_t format_text = { +- "", NULL, +- "\fmessage{ ", format_message_text, +- "\fheader{\n", format_headers_text, format_headers_message_part_text, "\fheader}\n", +- "\fbody{\n", +- format_part_start_text, +- NULL, +- NULL, +- format_part_content_text, +- format_part_end_text, +- "", +- "\fbody}\n", +- "\fmessage}\n", "", +- "" ++ .message_set_start = "", ++ .part = format_part_text, ++ .message_set_sep = "", ++ .message_set_end = "" + }; + + static void +@@ -191,16 +168,6 @@ _get_one_line_summary (const void *ctx, notmuch_message_t *message) + } + + static void +-format_message_text (unused (const void *ctx), notmuch_message_t *message, int indent) +-{ +- printf ("id:%s depth:%d match:%d filename:%s\n", +- notmuch_message_get_message_id (message), +- indent, +- notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH), +- notmuch_message_get_filename (message)); +-} +- +-static void + format_message_json (const void *ctx, notmuch_message_t *message, unused (int indent)) + { + notmuch_tags_t *tags; +@@ -338,26 +305,6 @@ format_message_mbox (const void *ctx, + fclose (file); + } + +- +-static void +-format_headers_text (const void *ctx, notmuch_message_t *message) +-{ +- const char *headers[] = { +- "Subject", "From", "To", "Cc", "Bcc", "Date" +- }; +- const char *name, *value; +- unsigned int i; +- +- printf ("%s\n", _get_one_line_summary (ctx, message)); +- +- for (i = 0; i < ARRAY_SIZE (headers); i++) { +- name = headers[i]; +- value = notmuch_message_get_header (message, name); +- if (value && strlen (value)) +- printf ("%s: %s\n", name, value); +- } +-} +- + static void + format_headers_message_part_text (GMimeMessage *message) + { +@@ -523,78 +470,6 @@ signer_status_to_string (GMimeSignerStatus x) + #endif + + static void +-format_part_start_text (GMimeObject *part, int *part_count) +-{ +- GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (part); +- +- if (disposition && +- strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0) +- { +- printf ("\fattachment{ ID: %d", *part_count); +- +- } else { +- +- printf ("\fpart{ ID: %d", *part_count); +- } +-} +- +-static void +-format_part_content_text (GMimeObject *part) +-{ +- const char *cid = g_mime_object_get_content_id (part); +- GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part)); +- +- if (GMIME_IS_PART (part)) +- { +- const char *filename = g_mime_part_get_filename (GMIME_PART (part)); +- if (filename) +- printf (", Filename: %s", filename); +- } +- +- if (cid) +- printf (", Content-id: %s", cid); +- +- printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type)); +- +- if (g_mime_content_type_is_type (content_type, "text", "*") && +- !g_mime_content_type_is_type (content_type, "text", "html")) +- { +- GMimeStream *stream_stdout = g_mime_stream_file_new (stdout); +- g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE); +- show_text_part_content (part, stream_stdout); +- g_object_unref(stream_stdout); +- } +- else if (g_mime_content_type_is_type (content_type, "multipart", "*") || +- g_mime_content_type_is_type (content_type, "message", "rfc822")) +- { +- /* Do nothing for multipart since its content will be printed +- * when recursing. */ +- } +- else +- { +- printf ("Non-text part: %s\n", +- g_mime_content_type_to_string (content_type)); +- } +-} +- +-static void +-format_part_end_text (GMimeObject *part) +-{ +- GMimeContentDisposition *disposition; +- +- disposition = g_mime_object_get_content_disposition (part); +- if (disposition && +- strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0) +- { +- printf ("\fattachment}\n"); +- } +- else +- { +- printf ("\fpart}\n"); +- } +-} +- +-static void + format_part_start_json (unused (GMimeObject *part), int *part_count) + { + printf ("{\"id\": %d", *part_count); +@@ -844,6 +719,139 @@ format_part_content_raw (GMimeObject *part) + } + + static void ++format_part_text (const void *ctx, mime_node_t *node, ++ int indent, const notmuch_show_params_t *params) ++{ ++ /* The disposition and content-type metadata are associated with ++ * the envelope for message parts */ ++ GMimeObject *meta = node->envelope_part ? ++ GMIME_OBJECT (node->envelope_part) : node->part; ++ GMimeContentType *content_type = g_mime_object_get_content_type (meta); ++ int i; ++ ++ if (node->envelope_file) { ++ notmuch_message_t *message = node->envelope_file; ++ const char *headers[] = { ++ "Subject", "From", "To", "Cc", "Bcc", "Date" ++ }; ++ const char *name, *value; ++ unsigned int i; ++ ++ printf ("\fmessage{ "); ++ printf ("id:%s depth:%d match:%d filename:%s\n", ++ notmuch_message_get_message_id (message), ++ indent, ++ notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH), ++ notmuch_message_get_filename (message)); ++ ++ printf ("\fheader{\n"); ++ ++ printf ("%s\n", _get_one_line_summary (ctx, message)); ++ ++ for (i = 0; i < ARRAY_SIZE (headers); i++) { ++ name = headers[i]; ++ value = notmuch_message_get_header (message, name); ++ if (value && strlen (value)) ++ printf ("%s: %s\n", name, value); ++ } ++ printf ("\fheader}\n"); ++ } else { ++ GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (meta); ++ const char *cid = g_mime_object_get_content_id (meta); ++ ++ if (disposition && ++ strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0) ++ { ++ printf ("\fattachment{ ID: %d", node->part_num); ++ ++ } else { ++ ++ printf ("\fpart{ ID: %d", node->part_num); ++ } ++ ++ if (GMIME_IS_PART (node->part)) ++ { ++ const char *filename = g_mime_part_get_filename (GMIME_PART (node->part)); ++ if (filename) ++ printf (", Filename: %s", filename); ++ } ++ ++ if (cid) ++ printf (", Content-id: %s", cid); ++ ++ printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type)); ++ } ++ ++ if (node->envelope_part) { ++ GMimeMessage *message = GMIME_MESSAGE (node->part); ++ InternetAddressList *recipients; ++ const char *recipients_string; ++ ++ printf ("\fheader{\n"); ++ printf ("Subject: %s\n", g_mime_message_get_subject (message)); ++ printf ("From: %s\n", g_mime_message_get_sender (message)); ++ recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); ++ recipients_string = internet_address_list_to_string (recipients, 0); ++ if (recipients_string) ++ printf ("To: %s\n", recipients_string); ++ recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC); ++ recipients_string = internet_address_list_to_string (recipients, 0); ++ if (recipients_string) ++ printf ("Cc: %s\n", recipients_string); ++ printf ("Date: %s\n", g_mime_message_get_date_as_string (message)); ++ printf ("\fheader}\n"); ++ } ++ ++ if (!node->envelope_file) { ++ if (g_mime_content_type_is_type (content_type, "text", "*") && ++ !g_mime_content_type_is_type (content_type, "text", "html")) ++ { ++ GMimeStream *stream_stdout = g_mime_stream_file_new (stdout); ++ g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE); ++ show_text_part_content (node->part, stream_stdout); ++ g_object_unref(stream_stdout); ++ } ++ else if (g_mime_content_type_is_type (content_type, "multipart", "*") || ++ g_mime_content_type_is_type (content_type, "message", "rfc822")) ++ { ++ /* Do nothing for multipart since its content will be printed ++ * when recursing. */ ++ } ++ else ++ { ++ printf ("Non-text part: %s\n", ++ g_mime_content_type_to_string (content_type)); ++ } ++ } ++ ++ if (GMIME_IS_MESSAGE (node->part)) ++ printf ("\fbody{\n"); ++ ++ for (i = 0; i < node->nchildren; i++) ++ format_part_text (ctx, mime_node_child (node, i), indent, params); ++ ++ if (GMIME_IS_MESSAGE (node->part)) ++ printf ("\fbody}\n"); ++ ++ if (node->envelope_file) { ++ printf ("\fmessage}\n"); ++ } else { ++ GMimeContentDisposition *disposition; ++ ++ disposition = g_mime_object_get_content_disposition (meta); ++ if (disposition && ++ strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0) ++ { ++ printf ("\fattachment}\n"); ++ } ++ else ++ { ++ printf ("\fpart}\n"); ++ } ++ } ++} ++ ++static void + show_message (void *ctx, + const notmuch_show_format_t *format, + notmuch_message_t *message, +-- +1.7.7.3 + -- 2.26.2