From 150ba8f76c3f21dcbefb997b6040bea42fbe25e6 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Sun, 5 Feb 2012 16:24:25 +1900 Subject: [PATCH] [PATCH v2 1/2] show: Convert text format to the new self-recursive style --- 14/4ac0d475c77d86b87b3bdb8aa4efbca5950c8d | 403 ++++++++++++++++++++++ 1 file changed, 403 insertions(+) create mode 100644 14/4ac0d475c77d86b87b3bdb8aa4efbca5950c8d diff --git a/14/4ac0d475c77d86b87b3bdb8aa4efbca5950c8d b/14/4ac0d475c77d86b87b3bdb8aa4efbca5950c8d new file mode 100644 index 000000000..71210d046 --- /dev/null +++ b/14/4ac0d475c77d86b87b3bdb8aa4efbca5950c8d @@ -0,0 +1,403 @@ +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 784AA431FAF + for ; Sun, 5 Feb 2012 09:22:18 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: 0.104 +X-Spam-Level: +X-Spam-Status: No, score=0.104 tagged_above=-999 required=5 + tests=[DATE_IN_PAST_12_24=0.804, 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 3yrKOQ1NBmVq for ; + Sun, 5 Feb 2012 09:22:16 -0800 (PST) +Received: from dmz-mailsec-scanner-4.mit.edu (DMZ-MAILSEC-SCANNER-4.MIT.EDU + [18.9.25.15]) + by olra.theworths.org (Postfix) with ESMTP id 69983431FB6 + for ; Sun, 5 Feb 2012 09:22:16 -0800 (PST) +X-AuditID: 1209190f-b7f8a6d000000914-18-4f2ebac706af +Received: from mailhub-auth-4.mit.edu ( [18.7.62.39]) + by dmz-mailsec-scanner-4.mit.edu (Symantec Messaging Gateway) with SMTP + id CD.16.02324.7CABE2F4; Sun, 5 Feb 2012 12:22:15 -0500 (EST) +Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103]) + by mailhub-auth-4.mit.edu (8.13.8/8.9.2) with ESMTP id q15HMFPN018060; + Sun, 5 Feb 2012 12:22:15 -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 q15HMDeN027733 + (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); + Sun, 5 Feb 2012 12:22:14 -0500 (EST) +Received: from amthrax by drake.mit.edu with local (Exim 4.77) + (envelope-from ) + id 1Ru5n3-0000sm-TY; Sun, 05 Feb 2012 12:22:13 -0500 +From: Austin Clements +To: notmuch@notmuchmail.org +Subject: [PATCH v2 1/2] show: Convert text format to the new self-recursive + style +Date: Sat, 4 Feb 2012 16:24:25 -0500 +Message-Id: <1328390666-22435-2-git-send-email-amdragon@mit.edu> +X-Mailer: git-send-email 1.7.7.3 +In-Reply-To: <1328390666-22435-1-git-send-email-amdragon@mit.edu> +References: <1327560926-22401-1-git-send-email-amdragon@mit.edu> + <1328390666-22435-1-git-send-email-amdragon@mit.edu> +X-Brightmail-Tracker: + H4sIAAAAAAAAA+NgFtrNIsWRmVeSWpSXmKPExsUixG6nrnt8l56/wbdWG4urW/vZLa7fnMns + wOSxc9Zddo9nq24xBzBFcdmkpOZklqUW6dslcGX8XGdWcN+34uvP+4wNjBvtuhg5OSQETCQu + /L7DBmGLSVy4tx7I5uIQEtjHKDHr0AsWCGc9o8STe3NZIZx7TBJneiZDOfMZJVZvmQHWzyag + IbFt/3JGEFtEQFpi593ZrCA2s4CTxOK/i5hBbGGBQImuhllg9SwCqhJ/fr8FWsHBwSvgINE/ + TQfiDAWJc6vPsYOEOQUcJTb+LQQJCwmUS2z6dYt1AiP/AkaGVYyyKblVurmJmTnFqcm6xcmJ + eXmpRbomermZJXqpKaWbGEFhxCnJv4Px20GlQ4wCHIxKPLzM5nr+QqyJZcWVuYcYJTmYlER5 + M7cDhfiS8lMqMxKLM+KLSnNSiw8xSnAwK4nwyh7V9RfiTUmsrEotyodJSXOwKInzqmm98xMS + SE8sSc1OTS1ILYLJynBwKEnw8gLjRUiwKDU9tSItM6cEIc3EwQkynAdouABIDW9xQWJucWY6 + RP4Uo6KUOC8DSEIAJJFRmgfXC4vzV4ziQK8I8/KDVPEAUwRc9yugwUxAg/exgVxdXJKIkJJq + YFTof5LC/vOpqJ4d59llwTN/6c+Z/fGuutExxkSfJX+9Slav3OITwjM53uZneqx0mKfa25sT + ef7tjpD0/7XW30JJ9+ShaoPu0ODCKS8rqnj0y2+a+Vg9miv5lfPT598PPny+cT7Ewv7i1f0O + 3/InJhQrvzDb8XWxxbH7GW84rs2eH7Bg70kD5lIlluKMREMt5qLiRABBxPV8zgIAAA== +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: Sun, 05 Feb 2012 17:22:18 -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