Future improvements (eg. crypto support) will require adding new part
header.  By breaking up the output of part headers from the output of
part content, we can easily out new part headers with new formatting
functions.
---
 notmuch-client.h |    5 +-
 notmuch-reply.c  |   13 ++++--
 notmuch-show.c   |  122 +++++++++++++++++++++++++++++++----------------------
 show-message.c   |    4 +-
 4 files changed, 85 insertions(+), 59 deletions(-)

diff --git a/notmuch-client.h b/notmuch-client.h
index 7221c68..b278bc7 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -65,8 +65,9 @@ typedef struct notmuch_show_format {
                    notmuch_message_t *message);
     const char *header_end;
     const char *body_start;
-    void (*part) (GMimeObject *part,
-                 int *part_count);
+    void (*part_start) (GMimeObject *part,
+                       int *part_count);
+    void (*part_content) (GMimeObject *part);
     void (*part_end) (GMimeObject *part);
     const char *part_sep;
     const char *body_end;
diff --git a/notmuch-reply.c b/notmuch-reply.c
index 7959935..9c35475 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -25,14 +25,18 @@
 #include "gmime-filter-headers.h"

 static void
-reply_part (GMimeObject *part,
-           unused (int *part_count));
+reply_part_content (GMimeObject *part);

 static const notmuch_show_format_t format_reply = {
     "",
        "", NULL,
            "", NULL, "",
-           "", reply_part, NULL, "", "",
+           "",
+               NULL,
+               reply_part_content,
+               NULL,
+               "",
+           "",
        "", "",
     ""
 };
@@ -57,8 +61,7 @@ show_reply_headers (GMimeMessage *message)
 }

 static void
-reply_part (GMimeObject *part,
-           unused (int *part_count))
+reply_part_content (GMimeObject *part)
 {
     GMimeContentType *content_type = g_mime_object_get_content_type 
(GMIME_OBJECT (part));
     GMimeContentDisposition *disposition = 
g_mime_object_get_content_disposition (part);
diff --git a/notmuch-show.c b/notmuch-show.c
index 65c780e..363cdbf 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -29,8 +29,11 @@ format_headers_text (const void *ctx,
                     notmuch_message_t *message);

 static void
-format_part_text (GMimeObject *part,
-                 int *part_count);
+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);
@@ -39,7 +42,12 @@ static const notmuch_show_format_t format_text = {
     "",
        "\fmessage{ ", format_message_text,
            "\fheader{\n", format_headers_text, "\fheader}\n",
-           "\fbody{\n", format_part_text, format_part_end_text, "", 
"\fbody}\n",
+           "\fbody{\n",
+               format_part_start_text,
+               format_part_content_text,
+               format_part_end_text,
+               "",
+           "\fbody}\n",
        "\fmessage}\n", "",
     ""
 };
@@ -53,8 +61,11 @@ format_headers_json (const void *ctx,
                     notmuch_message_t *message);

 static void
-format_part_json (GMimeObject *part,
-                 int *part_count);
+format_part_start_json (unused (GMimeObject *part),
+                       int *part_count);
+
+static void
+format_part_content_json (GMimeObject *part);

 static void
 format_part_end_json (GMimeObject *part);
@@ -63,7 +74,12 @@ static const notmuch_show_format_t format_json = {
     "[",
        "{", format_message_json,
            ", \"headers\": {", format_headers_json, "}",
-           ", \"body\": [", format_part_json, format_part_end_json, ", ", "]",
+           ", \"body\": [",
+               format_part_start_json,
+               format_part_content_json,
+               format_part_end_json,
+               ", ",
+           "]",
        "}", ", ",
     "]"
 };
@@ -77,20 +93,29 @@ static const notmuch_show_format_t format_mbox = {
     "",
         "", format_message_mbox,
             "", NULL, "",
-            "", NULL, NULL, "", "",
+            "",
+                NULL,
+                NULL,
+                NULL,
+                "",
+            "",
         "", "",
     ""
 };

 static void
-format_part_raw (GMimeObject *part,
-                unused (int *part_count));
+format_part_content_raw (GMimeObject *part);

 static const notmuch_show_format_t format_raw = {
     "",
        "", NULL,
            "", NULL, "",
-            "", format_part_raw, NULL, "", "",
+            "",
+                NULL,
+                format_part_content_raw,
+                NULL,
+                "",
+            "",
        "", "",
     ""
 };
@@ -372,46 +397,41 @@ show_part_content (GMimeObject *part, GMimeStream 
*stream_out)
 }

 static void
-format_part_text (GMimeObject *part, int *part_count)
+format_part_start_text (GMimeObject *part, int *part_count)
 {
-    GMimeContentDisposition *disposition;
-    GMimeContentType *content_type;
+    GMimeContentDisposition *disposition = 
g_mime_object_get_content_disposition (part);

-    disposition = g_mime_object_get_content_disposition (part);
     if (disposition &&
        strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
     {
-       const char *filename = g_mime_part_get_filename (GMIME_PART (part));
-       content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
-
-       printf ("\fattachment{ ID: %d, Content-type: %s\n",
-               *part_count,
-               g_mime_content_type_to_string (content_type));
-       printf ("Attachment: %s (%s)\n", filename,
-               g_mime_content_type_to_string (content_type));
+       printf ("\fattachment{ ID: %d", *part_count);

-       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_part_content (part, stream_stdout);
-           g_object_unref(stream_stdout);
-       }
+    } else {

-       return;
+       printf ("\fpart{ ID: %d", *part_count);
     }
+}

-    content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
+static void
+format_part_content_text (GMimeObject *part)
+{
+    GMimeContentDisposition *disposition = 
g_mime_object_get_content_disposition (part);
+    GMimeContentType *content_type = g_mime_object_get_content_type 
(GMIME_OBJECT (part));
+    GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
+
+    printf (", Content-type: %s\n", g_mime_content_type_to_string 
(content_type));

-    printf ("\fpart{ ID: %d, Content-type: %s\n",
-           *part_count,
-           g_mime_content_type_to_string (content_type));
+    if (disposition &&
+       strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
+    {
+       const char *filename = g_mime_part_get_filename (GMIME_PART (part));
+       printf ("Attachment: %s (%s)\n", filename,
+               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_part_content (part, stream_stdout);
        g_object_unref(stream_stdout);
@@ -447,27 +467,27 @@ format_part_end_text (GMimeObject *part)
 }

 static void
-format_part_json (GMimeObject *part, int *part_count)
+format_part_start_json (unused (GMimeObject *part), int *part_count)
 {
-    GMimeContentType *content_type;
-    GMimeContentDisposition *disposition;
-    void *ctx = talloc_new (NULL);
+    printf ("{\"id\": %d", *part_count);
+}
+
+static void
+format_part_content_json (GMimeObject *part)
+{
+    GMimeContentType *content_type = g_mime_object_get_content_type 
(GMIME_OBJECT (part));
     GMimeStream *stream_memory = g_mime_stream_mem_new ();
+    const char *cid = g_mime_object_get_content_id (part);
+    void *ctx = talloc_new (NULL);
+    GMimeContentDisposition *disposition = 
g_mime_object_get_content_disposition (part);
     GByteArray *part_content;
-    const char *cid;

-    content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
-
-    printf ("{\"id\": %d, \"content-type\": %s",
-           *part_count,
+    printf (", \"content-type\": %s",
            json_quote_str (ctx, g_mime_content_type_to_string (content_type)));

-    cid = g_mime_object_get_content_id (part);
     if (cid != NULL)
-           printf(", \"content-id\": %s",
-                  json_quote_str (ctx, cid));
+           printf(", \"content-id\": %s", json_quote_str (ctx, cid));

-    disposition = g_mime_object_get_content_disposition (part);
     if (disposition &&
        strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
     {
@@ -510,7 +530,7 @@ format_part_end_json (GMimeObject *part)
 }

 static void
-format_part_raw (GMimeObject *part, unused (int *part_count))
+format_part_content_raw (GMimeObject *part)
 {
     GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
     g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
@@ -538,7 +558,7 @@ show_message (void *ctx,
        fputs (format->body_start, stdout);
     }

-    if (format->part)
+    if (format->part_content)
        show_message_body (notmuch_message_get_filename (message),
                           format, params);

diff --git a/show-message.c b/show-message.c
index 32bb860..fbae530 100644
--- a/show-message.c
+++ b/show-message.c
@@ -49,7 +49,9 @@ show_message_part (GMimeObject *part,
        if (!first && (params->part <= 0 || state->in_zone))
            fputs (format->part_sep, stdout);

-       format->part (part, &(state->part_count));
+       if (format->part_start)
+           format->part_start (part, &(state->part_count));
+       format->part_content (part);
     }

     if (GMIME_IS_MULTIPART (part)) {
-- 
1.7.4.4

Reply via email to