From 3ab2cd11a9cd7454659b14870209ebb6da1c23c5 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Wed, 5 Jan 2011 23:22:41 +0200 Subject: [PATCH] * initial JSON output support (WIP) --- TODO | 6 ++--- src/mu-output.c | 71 +++++++++++++++++++++++++++++++++++++++---------- src/mu-str.c | 9 ------- src/mu-str.h | 10 ------- 4 files changed, 60 insertions(+), 36 deletions(-) diff --git a/TODO b/TODO index 873d95e5..c50bed8a 100644 --- a/TODO +++ b/TODO @@ -9,16 +9,16 @@ - [ ] completion for zsh - [ ] don't make test mail files executable -** release 0.9.2 [20%] +** release 0.9.2 [30%] - [ ] xml,json,sexp output - [ ] check all strings are really UTF8 - [ ] fix size value - - [ ] separate exit code for 'not found' vs other errors + - [X] separate exit code for 'not found' vs other errors - [ ] fix build for Solaris - [X] clearer errors when /home/user does not exist - [X] fix -pedantic build - - [ ] make commit batch size configure param + - [X] make commit batch size configurable param - [ ] better 'usage' info - [ ] add version info to output of configure, mu.log - [ ] make 'make check' more useful for others diff --git a/src/mu-output.c b/src/mu-output.c index a09ec2f3..58871ef5 100644 --- a/src/mu-output.c +++ b/src/mu-output.c @@ -229,20 +229,18 @@ mu_output_plain (MuMsgIter *iter, const char *fields, size_t summary_len, } static void -print_attr (const char* elm, const char *str) +print_attr_xml (const char* elm, const char *str) { gchar *esc; if (!str || strlen(str) == 0) return; /* empty: don't include */ - esc = mu_str_escape_xml (str); + esc = g_markup_escape_text (str, -1); g_print ("\t\t<%s>%s\n", elm, esc, elm); g_free (esc); } - - gboolean mu_output_xml (MuMsgIter *iter, size_t *count) { @@ -257,17 +255,17 @@ mu_output_xml (MuMsgIter *iter, size_t *count) for (myiter = iter, mycount = 0; !mu_msg_iter_is_done (myiter); mu_msg_iter_next (myiter), ++mycount) { g_print ("\t\n"); - print_attr ("from", mu_msg_iter_get_from (iter)); - print_attr ("to", mu_msg_iter_get_to (iter)); - print_attr ("cc", mu_msg_iter_get_cc (iter)); - print_attr ("subject", mu_msg_iter_get_subject (iter)); + print_attr_xml ("from", mu_msg_iter_get_from (iter)); + print_attr_xml ("to", mu_msg_iter_get_to (iter)); + print_attr_xml ("cc", mu_msg_iter_get_cc (iter)); + print_attr_xml ("subject", mu_msg_iter_get_subject (iter)); g_print ("\t\t%u\n", (unsigned) mu_msg_iter_get_date (iter)); g_print ("\t\t%u\n", (unsigned) mu_msg_iter_get_size (iter)); - print_attr ("msgid", mu_msg_iter_get_msgid (iter)); - print_attr ("path", mu_msg_iter_get_path (iter)); - print_attr ("maildir", mu_msg_iter_get_maildir (iter)); + print_attr_xml ("msgid", mu_msg_iter_get_msgid (iter)); + print_attr_xml ("path", mu_msg_iter_get_path (iter)); + print_attr_xml ("maildir", mu_msg_iter_get_maildir (iter)); g_print ("\t\n"); } @@ -279,13 +277,58 @@ mu_output_xml (MuMsgIter *iter, size_t *count) return TRUE; } + +static void +print_attr_json (const char* elm, const char *str, gboolean comma) +{ + gchar *esc; + + if (!str || strlen(str) == 0) + return; /* empty: don't include */ + + esc = g_strescape (str, NULL); + g_print ("\t\t\t\"%s\":\"%s\"%s\n", elm, esc, comma ? "," : ""); + g_free (esc); +} + + gboolean mu_output_json (MuMsgIter *iter, size_t *count) { - g_print ("{\n"); - g_print ("\t%s\n", __FUNCTION__); - g_print ("}\n"); + MuMsgIter *myiter; + size_t mycount; + + g_return_val_if_fail (iter, FALSE); + + g_print ("{\n\t\"messages\":\n\t[\n"); + + for (myiter = iter, mycount = 0; !mu_msg_iter_is_done (myiter); + mu_msg_iter_next (myiter), ++mycount) { + if (mycount != 0) + g_print (",\n"); + + g_print ("\t\t{\n"); + print_attr_json ("from", mu_msg_iter_get_from (iter), TRUE); + print_attr_json ("to", mu_msg_iter_get_to (iter),TRUE); + print_attr_json ("cc", mu_msg_iter_get_cc (iter),TRUE); + print_attr_json ("subject", mu_msg_iter_get_subject (iter), + TRUE); + g_print ("\t\t\t\"date\":%u,\n", + (unsigned) mu_msg_iter_get_date (iter)); + g_print ("\t\t\t\"size\":%u,\n", + (unsigned) mu_msg_iter_get_size (iter)); + print_attr_json ("msgid", mu_msg_iter_get_msgid (iter),TRUE); + print_attr_json ("path", mu_msg_iter_get_path (iter),TRUE); + print_attr_json ("maildir", mu_msg_iter_get_maildir (iter), + TRUE); + g_print ("\t\t}"); + } + g_print ("\t]\n}\n"); + + if (count) + *count = mycount; + return TRUE; } diff --git a/src/mu-str.c b/src/mu-str.c index 732ab6ed..ba3d0d93 100644 --- a/src/mu-str.c +++ b/src/mu-str.c @@ -368,12 +368,3 @@ mu_str_fullpath_s (const char* path, const char* name) return buf; } - -char* -mu_str_escape_xml (const gchar* str) -{ - if (!str) - return NULL; - - return g_markup_escape_text (str, -1); -} diff --git a/src/mu-str.h b/src/mu-str.h index 9e2ff677..99c1cdac 100644 --- a/src/mu-str.h +++ b/src/mu-str.h @@ -221,16 +221,6 @@ time_t mu_str_date_parse_hdwmy (const char* str); const char* mu_str_fullpath_s (const char* path, const char* name); -/** - * escape string for inclusion in XML-data - * - * @param str a str or NULL - * - * @return the escaped version of the string; g_free when you're done - * with it. - */ -char* mu_str_escape_xml (const gchar* str); - G_END_DECLS #endif /*__MU_STR_H__*/