Break up format->part function into part_start and part_content functions.
authorJameson Graef Rollins <jrollins@finestructure.net>
Thu, 26 May 2011 01:01:13 +0000 (18:01 -0700)
committerCarl Worth <cworth@cworth.org>
Fri, 27 May 2011 23:18:57 +0000 (16:18 -0700)
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
notmuch-reply.c
notmuch-show.c
show-message.c

index 7221c68108a59174b83835f61943df91928b7a50..b278bc774a8a84b19fa7d315f33ecf5b8a1356e7 100644 (file)
@@ -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;
index 79599358fa23c481e1e109735bb05627bc43bf70..9c35475d0553fa96bb37b141116dfa22c63b1569 100644 (file)
 #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);
index 65c780e7b8681716c85a1b11e990ffbfd40d6dfb..363cdbfed7760207d30516e89cc1e8d158c043a1 100644 (file)
@@ -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);
 
index 32bb860f63dd8c86d54389d3d4333fde46956386..fbae530180b99b95eb5ac4e788c63a2975043eff 100644 (file)
@@ -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)) {