[PATCH 2/2] show: Simplify new text formatter code

2012-02-03 Thread Austin Clements
Quoth Dmitry Kurochkin on Jan 31 at  3:37 am:
> On Thu, 26 Jan 2012 01:55:26 -0500, Austin Clements  
> wrote:
> > This makes the text formatter take advantage of the new code
> > structure.  The previously duplicated header logic is now unified,
> > several things that we used to compute repeatedly across different
> > callbacks are now computed once, and the code is simpler overall and
> > 32% shorter.
> > 
> > Unifying the header logic causes this to format some dates slightly
> > differently, so the two affected test cases are updated.
> > ---
> 
> Looks good to me.  Two minor comments, which can be freely ignored, are
> below.
> 
> >  notmuch-show.c |   88 
> > +--
> >  test/crypto|2 +-
> >  test/thread-naming |   16 +-
> >  3 files changed, 32 insertions(+), 74 deletions(-)
> > 
> > diff --git a/notmuch-show.c b/notmuch-show.c
> > index 6a890b2..30f6501 100644
> > --- a/notmuch-show.c
> > +++ b/notmuch-show.c
> > @@ -727,67 +727,48 @@ format_part_text (const void *ctx, mime_node_t *node,
> >  GMimeObject *meta = node->envelope_part ?
> > GMIME_OBJECT (node->envelope_part) : node->part;
> >  GMimeContentType *content_type = g_mime_object_get_content_type (meta);
> > +const notmuch_bool_t leaf = GMIME_IS_PART (node->part);
> > +const char *part_type;
> >  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",
> > +   part_type = "message";
> > +   printf ("\f%s{ id:%s depth:%d match:%d filename:%s\n",
> > +   part_type,
> > 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);
> > +   const char *filename = leaf ?
> > +   g_mime_part_get_filename (GMIME_PART (node->part)) : NULL;
> >  
> > 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);
> > -   }
> > +   part_type = "attachment";
> > +   else
> > +   part_type = "part";
> 
> Others may disagree, but I would write this using the (? :) operator.
> Not important, feel free to leave it as is.

Normally I would, too, but when the condition is that long, I find it
makes it more obtuse.

> >  
> > +   printf ("\f%s{ ID: %d", part_type, node->part_num);
> > +   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) {
> > +if (GMIME_IS_MESSAGE (node->part)) {
> > GMimeMessage *message = GMIME_MESSAGE (node->part);
> > InternetAddressList *recipients;
> > const char *recipients_string;
> >  
> > printf ("\fheader{\n");
> > +   if (node->envelope_file)
> > +   printf ("%s\n", _get_one_line_summary (ctx, node->envelope_file));
> > 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);
> > @@ -800,9 +781,11 @@ format_part_text (const void *ctx, mime_node_t *node,
> > printf ("Cc: %s\n", recipients_string);
> > printf ("Date: %s\n", g_mime_message_get_date_as_string (message));
> > printf ("\fheader}\n");
> > +
> > +   printf ("\fbody{\n");
> >  }
> >  
> > -if (!node->envelope_file) {
> > +if (leaf) {
> > if (g_mime_content_type_is_type (content_type, "text", "*") &&
> > !g_mime_content_type_is_type (content_type, "text", "html"))
> >   

Re: [PATCH 2/2] show: Simplify new text formatter code

2012-02-03 Thread Austin Clements
Quoth Dmitry Kurochkin on Jan 31 at  3:37 am:
 On Thu, 26 Jan 2012 01:55:26 -0500, Austin Clements amdra...@mit.edu wrote:
  This makes the text formatter take advantage of the new code
  structure.  The previously duplicated header logic is now unified,
  several things that we used to compute repeatedly across different
  callbacks are now computed once, and the code is simpler overall and
  32% shorter.
  
  Unifying the header logic causes this to format some dates slightly
  differently, so the two affected test cases are updated.
  ---
 
 Looks good to me.  Two minor comments, which can be freely ignored, are
 below.
 
   notmuch-show.c |   88 
  +--
   test/crypto|2 +-
   test/thread-naming |   16 +-
   3 files changed, 32 insertions(+), 74 deletions(-)
  
  diff --git a/notmuch-show.c b/notmuch-show.c
  index 6a890b2..30f6501 100644
  --- a/notmuch-show.c
  +++ b/notmuch-show.c
  @@ -727,67 +727,48 @@ format_part_text (const void *ctx, mime_node_t *node,
   GMimeObject *meta = node-envelope_part ?
  GMIME_OBJECT (node-envelope_part) : node-part;
   GMimeContentType *content_type = g_mime_object_get_content_type (meta);
  +const notmuch_bool_t leaf = GMIME_IS_PART (node-part);
  +const char *part_type;
   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,
  +   part_type = message;
  +   printf (\f%s{ id:%s depth:%d match:%d filename:%s\n,
  +   part_type,
  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);
  +   const char *filename = leaf ?
  +   g_mime_part_get_filename (GMIME_PART (node-part)) : NULL;
   
  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);
  -   }
  +   part_type = attachment;
  +   else
  +   part_type = part;
 
 Others may disagree, but I would write this using the (? :) operator.
 Not important, feel free to leave it as is.

Normally I would, too, but when the condition is that long, I find it
makes it more obtuse.

   
  +   printf (\f%s{ ID: %d, part_type, node-part_num);
  +   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) {
  +if (GMIME_IS_MESSAGE (node-part)) {
  GMimeMessage *message = GMIME_MESSAGE (node-part);
  InternetAddressList *recipients;
  const char *recipients_string;
   
  printf (\fheader{\n);
  +   if (node-envelope_file)
  +   printf (%s\n, _get_one_line_summary (ctx, node-envelope_file));
  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);
  @@ -800,9 +781,11 @@ format_part_text (const void *ctx, mime_node_t *node,
  printf (Cc: %s\n, recipients_string);
  printf (Date: %s\n, g_mime_message_get_date_as_string (message));
  printf (\fheader}\n);
  +
  +   printf (\fbody{\n);
   }
   
  -if (!node-envelope_file) {
  +if (leaf) {
  if (g_mime_content_type_is_type (content_type, text, *) 
  !g_mime_content_type_is_type (content_type, text, html))
  {
  @@ -810,45 +793,20 @@ format_part_text (const void *ctx, mime_node_t *node,
  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 

[PATCH 2/2] show: Simplify new text formatter code

2012-01-31 Thread Dmitry Kurochkin
On Thu, 26 Jan 2012 01:55:26 -0500, Austin Clements  wrote:
> This makes the text formatter take advantage of the new code
> structure.  The previously duplicated header logic is now unified,
> several things that we used to compute repeatedly across different
> callbacks are now computed once, and the code is simpler overall and
> 32% shorter.
> 
> Unifying the header logic causes this to format some dates slightly
> differently, so the two affected test cases are updated.
> ---

Looks good to me.  Two minor comments, which can be freely ignored, are
below.

>  notmuch-show.c |   88 +--
>  test/crypto|2 +-
>  test/thread-naming |   16 +-
>  3 files changed, 32 insertions(+), 74 deletions(-)
> 
> diff --git a/notmuch-show.c b/notmuch-show.c
> index 6a890b2..30f6501 100644
> --- a/notmuch-show.c
> +++ b/notmuch-show.c
> @@ -727,67 +727,48 @@ format_part_text (const void *ctx, mime_node_t *node,
>  GMimeObject *meta = node->envelope_part ?
>   GMIME_OBJECT (node->envelope_part) : node->part;
>  GMimeContentType *content_type = g_mime_object_get_content_type (meta);
> +const notmuch_bool_t leaf = GMIME_IS_PART (node->part);
> +const char *part_type;
>  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",
> + part_type = "message";
> + printf ("\f%s{ id:%s depth:%d match:%d filename:%s\n",
> + part_type,
>   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);
> + const char *filename = leaf ?
> + g_mime_part_get_filename (GMIME_PART (node->part)) : NULL;
>  
>   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);
> - }
> + part_type = "attachment";
> + else
> + part_type = "part";

Others may disagree, but I would write this using the (? :) operator.
Not important, feel free to leave it as is.

>  
> + printf ("\f%s{ ID: %d", part_type, node->part_num);
> + 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) {
> +if (GMIME_IS_MESSAGE (node->part)) {
>   GMimeMessage *message = GMIME_MESSAGE (node->part);
>   InternetAddressList *recipients;
>   const char *recipients_string;
>  
>   printf ("\fheader{\n");
> + if (node->envelope_file)
> + printf ("%s\n", _get_one_line_summary (ctx, node->envelope_file));
>   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);
> @@ -800,9 +781,11 @@ format_part_text (const void *ctx, mime_node_t *node,
>   printf ("Cc: %s\n", recipients_string);
>   printf ("Date: %s\n", g_mime_message_get_date_as_string (message));
>   printf ("\fheader}\n");
> +
> + printf ("\fbody{\n");
>  }
>  
> -if (!node->envelope_file) {
> +if (leaf) {
>   if (g_mime_content_type_is_type (content_type, "text", "*") &&
>   !g_mime_content_type_is_type (content_type, "text", "html"))
>   {
> @@ -810,45 +793,20 @@ format_part_text (const void *ctx, mime_node_t *node,
>   g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), 
> FALSE);
>   show_text_part_content (node->part, stream_stdout);
>   

[PATCH 2/2] show: Simplify new text formatter code

2012-01-30 Thread Tomi Ollila
On Thu, 26 Jan 2012 01:55:26 -0500, Austin Clements  wrote:
> This makes the text formatter take advantage of the new code
> structure.  The previously duplicated header logic is now unified,
> several things that we used to compute repeatedly across different
> callbacks are now computed once, and the code is simpler overall and
> 32% shorter.
> 
> Unifying the header logic causes this to format some dates slightly
> differently, so the two affected test cases are updated.
> ---

Looks good, works fine.


Tomi


Re: [PATCH 2/2] show: Simplify new text formatter code

2012-01-30 Thread Tomi Ollila
On Thu, 26 Jan 2012 01:55:26 -0500, Austin Clements amdra...@mit.edu wrote:
 This makes the text formatter take advantage of the new code
 structure.  The previously duplicated header logic is now unified,
 several things that we used to compute repeatedly across different
 callbacks are now computed once, and the code is simpler overall and
 32% shorter.
 
 Unifying the header logic causes this to format some dates slightly
 differently, so the two affected test cases are updated.
 ---

Looks good, works fine.


Tomi
___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch


[PATCH 2/2] show: Simplify new text formatter code

2012-01-26 Thread Austin Clements
This makes the text formatter take advantage of the new code
structure.  The previously duplicated header logic is now unified,
several things that we used to compute repeatedly across different
callbacks are now computed once, and the code is simpler overall and
32% shorter.

Unifying the header logic causes this to format some dates slightly
differently, so the two affected test cases are updated.
---
 notmuch-show.c |   88 +--
 test/crypto|2 +-
 test/thread-naming |   16 +-
 3 files changed, 32 insertions(+), 74 deletions(-)

diff --git a/notmuch-show.c b/notmuch-show.c
index 6a890b2..30f6501 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -727,67 +727,48 @@ format_part_text (const void *ctx, mime_node_t *node,
 GMimeObject *meta = node->envelope_part ?
GMIME_OBJECT (node->envelope_part) : node->part;
 GMimeContentType *content_type = g_mime_object_get_content_type (meta);
+const notmuch_bool_t leaf = GMIME_IS_PART (node->part);
+const char *part_type;
 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",
+   part_type = "message";
+   printf ("\f%s{ id:%s depth:%d match:%d filename:%s\n",
+   part_type,
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);
+   const char *filename = leaf ?
+   g_mime_part_get_filename (GMIME_PART (node->part)) : NULL;

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);
-   }
+   part_type = "attachment";
+   else
+   part_type = "part";

+   printf ("\f%s{ ID: %d", part_type, node->part_num);
+   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) {
+if (GMIME_IS_MESSAGE (node->part)) {
GMimeMessage *message = GMIME_MESSAGE (node->part);
InternetAddressList *recipients;
const char *recipients_string;

printf ("\fheader{\n");
+   if (node->envelope_file)
+   printf ("%s\n", _get_one_line_summary (ctx, node->envelope_file));
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);
@@ -800,9 +781,11 @@ format_part_text (const void *ctx, mime_node_t *node,
printf ("Cc: %s\n", recipients_string);
printf ("Date: %s\n", g_mime_message_get_date_as_string (message));
printf ("\fheader}\n");
+
+   printf ("\fbody{\n");
 }

-if (!node->envelope_file) {
+if (leaf) {
if (g_mime_content_type_is_type (content_type, "text", "*") &&
!g_mime_content_type_is_type (content_type, "text", "html"))
{
@@ -810,45 +793,20 @@ format_part_text (const void *ctx, mime_node_t *node,
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
-   {
+   } else {
printf 

[PATCH 2/2] show: Simplify new text formatter code

2012-01-25 Thread Austin Clements
This makes the text formatter take advantage of the new code
structure.  The previously duplicated header logic is now unified,
several things that we used to compute repeatedly across different
callbacks are now computed once, and the code is simpler overall and
32% shorter.

Unifying the header logic causes this to format some dates slightly
differently, so the two affected test cases are updated.
---
 notmuch-show.c |   88 +--
 test/crypto|2 +-
 test/thread-naming |   16 +-
 3 files changed, 32 insertions(+), 74 deletions(-)

diff --git a/notmuch-show.c b/notmuch-show.c
index 6a890b2..30f6501 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -727,67 +727,48 @@ format_part_text (const void *ctx, mime_node_t *node,
 GMimeObject *meta = node-envelope_part ?
GMIME_OBJECT (node-envelope_part) : node-part;
 GMimeContentType *content_type = g_mime_object_get_content_type (meta);
+const notmuch_bool_t leaf = GMIME_IS_PART (node-part);
+const char *part_type;
 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,
+   part_type = message;
+   printf (\f%s{ id:%s depth:%d match:%d filename:%s\n,
+   part_type,
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);
+   const char *filename = leaf ?
+   g_mime_part_get_filename (GMIME_PART (node-part)) : NULL;
 
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);
-   }
+   part_type = attachment;
+   else
+   part_type = part;
 
+   printf (\f%s{ ID: %d, part_type, node-part_num);
+   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) {
+if (GMIME_IS_MESSAGE (node-part)) {
GMimeMessage *message = GMIME_MESSAGE (node-part);
InternetAddressList *recipients;
const char *recipients_string;
 
printf (\fheader{\n);
+   if (node-envelope_file)
+   printf (%s\n, _get_one_line_summary (ctx, node-envelope_file));
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);
@@ -800,9 +781,11 @@ format_part_text (const void *ctx, mime_node_t *node,
printf (Cc: %s\n, recipients_string);
printf (Date: %s\n, g_mime_message_get_date_as_string (message));
printf (\fheader}\n);
+
+   printf (\fbody{\n);
 }
 
-if (!node-envelope_file) {
+if (leaf) {
if (g_mime_content_type_is_type (content_type, text, *) 
!g_mime_content_type_is_type (content_type, text, html))
{
@@ -810,45 +793,20 @@ format_part_text (const void *ctx, mime_node_t *node,
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
-   {
+   } else {
printf (Non-text part: %s\n,
g_mime_content_type_to_string (content_type));
}