[RFC PATCH 4/5] show: Convert text format to the new self-recursive style
Dmitry Kurochkin
dmitry.kurochkin at gmail.com
Mon Jan 23 17:32:35 PST 2012
On Wed, 11 Jan 2012 20:49:32 -0500, Austin Clements <amdragon at MIT.EDU> wrote:
> 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.
The patch looks good to me.
Regards,
Dmitry
> ---
> notmuch-show.c | 267 +++++++++++++++++++++++++++++---------------------------
> 1 files changed, 140 insertions(+), 127 deletions(-)
>
> diff --git a/notmuch-show.c b/notmuch-show.c
> index ad54d69..3241965 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, 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
> @@ -140,6 +117,9 @@ static const notmuch_show_format_t format_raw = {
> ""
> };
>
> +static void
> +show_text_part_content (GMimeObject *part, GMimeStream *stream_out);
> +
> static const char *
> _get_tags_as_string (const void *ctx, notmuch_message_t *message)
> {
> @@ -187,13 +167,138 @@ _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)
> +format_part_text (const void *ctx, mime_node_t *node,
> + int indent, notmuch_show_params_t *params)
> {
> - 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));
> + /* 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
> @@ -334,26 +439,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)
> {
> @@ -503,78 +588,6 @@ signer_status_to_string (GMimeSignerStatus x)
> }
>
> 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);
> --
> 1.7.7.3
>
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch
More information about the notmuch
mailing list