[PATCH 04/11] Break up format->part function into part_start and part_content functions.

Jameson Graef Rollins jrollins at finestructure.net
Wed May 25 18:01:13 PDT 2011


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



More information about the notmuch mailing list