unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH] initial proof of concept patch to output a message in json
@ 2009-12-13 23:31 david
  0 siblings, 0 replies; only message in thread
From: david @ 2009-12-13 23:31 UTC (permalink / raw)
  To: notmuch; +Cc: David Bremner

From: David Bremner <bremner@unb.ca>

---

Like I said in the apology/introduction, I don't claim this patch is
ready for the master branch; hence the complete lack of sensible
commit message.  But it does give some idea about what would be
required. In particular definitely more things will have to be passed
around.

 configure        |    2 +-
 notmuch-client.h |    2 +-
 notmuch-reply.c  |    4 +-
 notmuch-show.c   |  110 ++++++++++++++++++++++++++---------------------------
 show-message.c   |   12 +++---
 5 files changed, 64 insertions(+), 66 deletions(-)

diff --git a/configure b/configure
index fa8e142..34587a5 100755
--- a/configure
+++ b/configure
@@ -291,5 +291,5 @@ CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)      \\
 CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)    \\
 		     \$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
 		     \$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS)
-CONFIGURE_LDFLAGS =  \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(XAPIAN_LDFLAGS)
+CONFIGURE_LDFLAGS =  \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(XAPIAN_LDFLAGS) -ljansson
 EOF
diff --git a/notmuch-client.h b/notmuch-client.h
index 50a30fe..6600ed4 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -141,7 +141,7 @@ query_string_from_args (void *ctx, int argc, char *argv[]);
 
 notmuch_status_t
 show_message_body (const char *filename,
-		   void (*show_part) (GMimeObject *part, int *part_count));
+		   void (*show_part) (GMimeObject *part, int *part_count, void *arg), void *output);
 
 /* notmuch-config.c */
 
diff --git a/notmuch-reply.c b/notmuch-reply.c
index 0cda72d..29a6517 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -63,7 +63,7 @@ reply_part_content (GMimeObject *part)
 }
 
 static void
-reply_part (GMimeObject *part, int *part_count)
+reply_part (GMimeObject *part, int *part_count, unused(void *arg))
 {
     GMimeContentDisposition *disposition;
     GMimeContentType *content_type;
@@ -282,7 +282,7 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t *config, notmuch_query_
 		notmuch_message_get_header (message, "date"),
 		notmuch_message_get_header (message, "from"));
 
-	show_message_body (notmuch_message_get_filename (message), reply_part);
+	show_message_body (notmuch_message_get_filename (message), reply_part,NULL);
 
 	notmuch_message_destroy (message);
     }
diff --git a/notmuch-show.c b/notmuch-show.c
index 376aacd..4f00675 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -18,8 +18,11 @@
  * Author: Carl Worth <cworth@cworth.org>
  */
 
+#include <jansson.h>
 #include "notmuch-client.h"
 
+json_t *show_part_content (GMimeObject *part);
+
 static const char *
 _get_tags_as_string (void *ctx, notmuch_message_t *message)
 {
@@ -66,19 +69,23 @@ _get_one_line_summary (void *ctx, notmuch_message_t *message)
 			    from, relative_date, tags);
 }
 
-static void
+json_t *
 show_part_content (GMimeObject *part)
 {
-    GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
+    GMimeStream *stream_out = g_mime_stream_mem_new ();
     GMimeStream *stream_filter = NULL;
     GMimeDataWrapper *wrapper;
+    GByteArray *content_data;
+
+    guint8 terminator[]={0};
     const char *charset;
+    json_t *content;
 
     charset = g_mime_object_get_content_type_parameter (part, "charset");
-
-    if (stream_stdout) {
-	g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
-	stream_filter = g_mime_stream_filter_new(stream_stdout);
+    
+    if (stream_out) {
+	g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_out), FALSE);
+	stream_filter = g_mime_stream_filter_new(stream_out);
 	g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),
 				 g_mime_filter_crlf_new(FALSE, FALSE));
         if (charset) {
@@ -90,60 +97,50 @@ show_part_content (GMimeObject *part)
     wrapper = g_mime_part_get_content_object (GMIME_PART (part));
     if (wrapper && stream_filter)
 	g_mime_data_wrapper_write_to_stream (wrapper, stream_filter);
+
+    content_data = g_mime_stream_mem_get_byte_array ((GMimeStreamMem *)stream_out);
+    g_byte_array_append(content_data, terminator,1);
+    content = json_string (content_data->data);
     if (stream_filter)
 	g_object_unref(stream_filter);
-    if (stream_stdout)
-	g_object_unref(stream_stdout);
+    if (stream_out)
+	g_object_unref(stream_out);
+    
+    return content;
 }
 
 static void
-show_part (GMimeObject *part, int *part_count)
+show_part (GMimeObject *part, int *part_count, void *output_arg)
 {
     GMimeContentDisposition *disposition;
     GMimeContentType *content_type;
+    json_t *output = output_arg;
+    json_t *part_obj=json_object();
 
     disposition = g_mime_object_get_content_disposition (part);
+    content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
+
+    json_object_set (part_obj, "id", json_integer (*part_count));
+    json_object_set (part_obj, "content-type", 
+		     json_string(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));
-	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));
-
-	if (g_mime_content_type_is_type (content_type, "text", "*") &&
-	    !g_mime_content_type_is_type (content_type, "text", "html"))
-	{
-	    show_part_content (part);
-	}
+    	const char *filename = g_mime_part_get_filename (GMIME_PART (part));
 
-	printf ("\fattachment}\n");
+	json_object_set (part_obj, "filename", 
+			 json_string (filename));
 
-	return;
-    }
+    };
 
-    content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
 
-    printf ("\fpart{ ID: %d, Content-type: %s\n",
-	    *part_count,
-	    g_mime_content_type_to_string (content_type));
+    if (g_mime_content_type_is_type (content_type, "text", "*"))
+	json_object_set (part_obj, "text", show_part_content (part));
+	
 
-    if (g_mime_content_type_is_type (content_type, "text", "*") &&
-	!g_mime_content_type_is_type (content_type, "text", "html"))
-    {
-	show_part_content (part);
-    }
-    else
-    {
-	printf ("Non-text part: %s\n",
-		g_mime_content_type_to_string (content_type));
-    }
+    json_array_append(output,part_obj);
 
-    printf ("\fpart}\n");
 }
 
 static void
@@ -154,32 +151,33 @@ show_message (void *ctx, notmuch_message_t *message, int indent)
     };
     const char *name, *value;
     unsigned int i;
+    json_t *message_obj=json_object();
+    json_t *header_obj=json_object();
+    json_t *parts=json_array();
 
-    printf ("\fmessage{ 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));
+    // all of these calls need return-value checking
+    json_object_set(message_obj,"id",json_string (notmuch_message_get_message_id (message)));
+    json_object_set(message_obj,"depth",json_integer (indent));
+    json_object_set(message_obj,"match",
+		    notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH) ? json_true() : json_false());
+    json_object_set(message_obj,"filename",json_string (notmuch_message_get_filename (message)));
 
-    printf ("\fheader{\n");
-
-    printf ("%s\n", _get_one_line_summary (ctx, message));
+    json_object_set(header_obj,"summary", json_string (_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)
-	    printf ("%s: %s\n", name, value);
+	  json_object_set (header_obj, name, json_string (value));
     }
 
-    printf ("\fheader}\n");
-    printf ("\fbody{\n");
-
-    show_message_body (notmuch_message_get_filename (message), show_part);
+    json_object_set (message_obj, "header", header_obj);
 
-    printf ("\fbody}\n");
+    show_message_body (notmuch_message_get_filename (message), show_part, parts);
+    
+    json_object_set (message_obj, "parts", parts);
+    json_dumpf(message_obj,stdout,JSON_INDENT(4));
 
-    printf ("\fmessage}\n");
 }
 
 
diff --git a/show-message.c b/show-message.c
index 784981b..e41f51c 100644
--- a/show-message.c
+++ b/show-message.c
@@ -24,7 +24,7 @@
 
 static void
 show_message_part (GMimeObject *part, int *part_count,
-		   void (*show_part) (GMimeObject *part, int *part_count))
+		   void (*show_part) (GMimeObject *part, int *part_count, void *argument), void *output)
 {
     *part_count = *part_count + 1;
 
@@ -34,7 +34,7 @@ show_message_part (GMimeObject *part, int *part_count,
 
 	for (i = 0; i < g_mime_multipart_get_count (multipart); i++) {
 	    show_message_part (g_mime_multipart_get_part (multipart, i),
-			       part_count, show_part);
+			       part_count, show_part, output);
 	}
 	return;
     }
@@ -45,7 +45,7 @@ show_message_part (GMimeObject *part, int *part_count,
 	mime_message = g_mime_message_part_get_message (GMIME_MESSAGE_PART (part));
 
 	show_message_part (g_mime_message_get_mime_part (mime_message),
-			   part_count, show_part);
+			   part_count, show_part, output);
 
 	return;
     }
@@ -56,12 +56,12 @@ show_message_part (GMimeObject *part, int *part_count,
 	return;
     }
 
-    (*show_part) (part, part_count);
+    (*show_part) (part, part_count, output);
 }
 
 notmuch_status_t
 show_message_body (const char *filename,
-		   void (*show_part) (GMimeObject *part, int *part_count))
+		   void (*show_part) (GMimeObject *part, int *part_count, void *argument), void *output)
 {
     GMimeStream *stream = NULL;
     GMimeParser *parser = NULL;
@@ -85,7 +85,7 @@ show_message_body (const char *filename,
     mime_message = g_mime_parser_construct_message (parser);
 
     show_message_part (g_mime_message_get_mime_part (mime_message),
-		       &part_count, show_part);
+		       &part_count, show_part, output);
 
   DONE:
     if (mime_message)
-- 
1.6.5.3

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2009-12-13 23:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-13 23:31 [PATCH] initial proof of concept patch to output a message in json david

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).