Re: [RFC PATCH 4/5] show: Convert text format to the new self-recursive style

Subject: Re: [RFC PATCH 4/5] show: Convert text format to the new self-recursive style

Date: Tue, 24 Jan 2012 05:32:35 +0400

To: Austin Clements, notmuch@notmuchmail.org

Cc:

From: Dmitry Kurochkin


On Wed, 11 Jan 2012 20:49:32 -0500, Austin Clements <amdragon@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@notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch

Thread: