]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-show.c
Rename the -json printer functions in notmuch-reply and notmuch-show to generic ...
[notmuch] / notmuch-show.c
index b9d9f5d208969a281911ad9be2115edd1f741242..d3f08bcdf30e58b1c2f7c98a42bcbb002870988d 100644 (file)
@@ -32,16 +32,12 @@ static const notmuch_show_format_t format_text = {
 };
 
 static notmuch_status_t
-format_part_json_entry (const void *ctx, sprinter_t *sp, mime_node_t *node,
-                       int indent, const notmuch_show_params_t *params);
+format_part_sprinter_entry (const void *ctx, sprinter_t *sp, mime_node_t *node,
+                           int indent, const notmuch_show_params_t *params);
 
 static const notmuch_show_format_t format_json = {
     .new_sprinter = sprinter_json_create,
-    .message_set_start = "[",
-    .part = format_part_json_entry,
-    .message_set_sep = ", ",
-    .message_set_end = "]",
-    .null_message = "null"
+    .part = format_part_sprinter_entry,
 };
 
 static notmuch_status_t
@@ -112,8 +108,11 @@ _get_one_line_summary (const void *ctx, notmuch_message_t *message)
 /* Emit a sequence of key/value pairs for the metadata of message.
  * The caller should begin a map before calling this. */
 static void
-format_message_json (sprinter_t *sp, notmuch_message_t *message)
+format_message_sprinter (sprinter_t *sp, notmuch_message_t *message)
 {
+    /* Any changes to the JSON format should be reflected in the file
+     * devel/schemata. */
+
     void *local = talloc_new (NULL);
     notmuch_tags_t *tags;
     time_t date;
@@ -209,11 +208,15 @@ _is_from_line (const char *line)
 }
 
 void
-format_headers_json (sprinter_t *sp, GMimeMessage *message,
-                    notmuch_bool_t reply)
+format_headers_sprinter (sprinter_t *sp, GMimeMessage *message,
+                        notmuch_bool_t reply)
 {
+    /* Any changes to the JSON format should be reflected in the file
+     * devel/schemata. */
+
     InternetAddressList *recipients;
     const char *recipients_string;
+    const char *reply_to_string;
 
     sp->begin_map (sp);
 
@@ -237,6 +240,19 @@ format_headers_json (sprinter_t *sp, GMimeMessage *message,
        sp->string (sp, recipients_string);
     }
 
+    recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_BCC);
+    recipients_string = internet_address_list_to_string (recipients, 0);
+    if (recipients_string) {
+       sp->map_key (sp, "Bcc");
+       sp->string (sp, recipients_string);
+    }
+
+    reply_to_string = g_mime_message_get_reply_to (message);
+    if (reply_to_string) {
+       sp->map_key (sp, "Reply-To");
+       sp->string (sp, reply_to_string);
+    }
+
     if (reply) {
        sp->map_key (sp, "In-reply-to");
        sp->string (sp, g_mime_object_get_header (GMIME_OBJECT (message), "In-reply-to"));
@@ -347,8 +363,11 @@ signer_status_to_string (GMimeSignerStatus x)
 
 #ifdef GMIME_ATLEAST_26
 static void
-format_part_sigstatus_json (sprinter_t *sp, mime_node_t *node)
+format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node)
 {
+    /* Any changes to the JSON format should be reflected in the file
+     * devel/schemata. */
+
     GMimeSignatureList *siglist = node->sig_list;
 
     sp->begin_list (sp);
@@ -419,7 +438,7 @@ format_part_sigstatus_json (sprinter_t *sp, mime_node_t *node)
 }
 #else
 static void
-format_part_sigstatus_json (sprinter_t *sp, mime_node_t *node)
+format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node)
 {
     const GMimeSignatureValidity* validity = node->sig_validity;
 
@@ -576,23 +595,23 @@ format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node,
 }
 
 void
-format_part_json (const void *ctx, sprinter_t *sp, mime_node_t *node,
-                 notmuch_bool_t first, notmuch_bool_t output_body)
+format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
+                     notmuch_bool_t first, notmuch_bool_t output_body)
 {
     /* Any changes to the JSON format should be reflected in the file
      * devel/schemata. */
 
     if (node->envelope_file) {
        sp->begin_map (sp);
-       format_message_json (sp, node->envelope_file);
+       format_message_sprinter (sp, node->envelope_file);
 
        sp->map_key (sp, "headers");
-       format_headers_json (sp, GMIME_MESSAGE (node->part), FALSE);
+       format_headers_sprinter (sp, GMIME_MESSAGE (node->part), FALSE);
 
        if (output_body) {
            sp->map_key (sp, "body");
            sp->begin_list (sp);
-           format_part_json (ctx, sp, mime_node_child (node, 0), first, TRUE);
+           format_part_sprinter (ctx, sp, mime_node_child (node, 0), first, TRUE);
            sp->end (sp);
        }
        sp->end (sp);
@@ -627,7 +646,7 @@ format_part_json (const void *ctx, sprinter_t *sp, mime_node_t *node,
 
     if (node->verify_attempted) {
        sp->map_key (sp, "sigstatus");
-       format_part_sigstatus_json (sp, node);
+       format_part_sigstatus_sprinter (sp, node);
     }
 
     sp->map_key (sp, "content-type");
@@ -679,7 +698,7 @@ format_part_json (const void *ctx, sprinter_t *sp, mime_node_t *node,
        sp->begin_map (sp);
 
        sp->map_key (sp, "headers");
-       format_headers_json (sp, GMIME_MESSAGE (node->part), FALSE);
+       format_headers_sprinter (sp, GMIME_MESSAGE (node->part), FALSE);
 
        sp->map_key (sp, "body");
        sp->begin_list (sp);
@@ -687,7 +706,7 @@ format_part_json (const void *ctx, sprinter_t *sp, mime_node_t *node,
     }
 
     for (i = 0; i < node->nchildren; i++)
-       format_part_json (ctx, sp, mime_node_child (node, i), i == 0, TRUE);
+       format_part_sprinter (ctx, sp, mime_node_child (node, i), i == 0, TRUE);
 
     /* Close content structures */
     for (i = 0; i < nclose; i++)
@@ -697,11 +716,11 @@ format_part_json (const void *ctx, sprinter_t *sp, mime_node_t *node,
 }
 
 static notmuch_status_t
-format_part_json_entry (const void *ctx, sprinter_t *sp,
-                       mime_node_t *node, unused (int indent),
-                       const notmuch_show_params_t *params)
+format_part_sprinter_entry (const void *ctx, sprinter_t *sp,
+                           mime_node_t *node, unused (int indent),
+                           const notmuch_show_params_t *params)
 {
-    format_part_json (ctx, sp, node, TRUE, params->output_body);
+    format_part_sprinter (ctx, sp, node, TRUE, params->output_body);
 
     return NOTMUCH_STATUS_SUCCESS;
 }
@@ -841,15 +860,6 @@ format_part_raw (unused (const void *ctx), unused (sprinter_t *sp),
     return NOTMUCH_STATUS_SUCCESS;
 }
 
-static notmuch_status_t
-show_null_message (const notmuch_show_format_t *format)
-{
-    /* Output a null message. Currently empty for all formats except Json */
-    if (format->null_message)
-       printf ("%s", format->null_message);
-    return NOTMUCH_STATUS_SUCCESS;
-}
-
 static notmuch_status_t
 show_message (void *ctx,
              const notmuch_show_format_t *format,
@@ -884,23 +894,16 @@ show_messages (void *ctx,
     notmuch_message_t *message;
     notmuch_bool_t match;
     notmuch_bool_t excluded;
-    int first_set = 1;
     int next_indent;
     notmuch_status_t status, res = NOTMUCH_STATUS_SUCCESS;
 
-    if (format->message_set_start)
-       fputs (format->message_set_start, stdout);
+    sp->begin_list (sp);
 
     for (;
         notmuch_messages_valid (messages);
         notmuch_messages_move_to_next (messages))
     {
-       if (!first_set && format->message_set_sep)
-           fputs (format->message_set_sep, stdout);
-       first_set = 0;
-
-       if (format->message_set_start)
-           fputs (format->message_set_start, stdout);
+       sp->begin_list (sp);
 
        message = notmuch_messages_get (messages);
 
@@ -915,12 +918,9 @@ show_messages (void *ctx,
                res = status;
            next_indent = indent + 1;
        } else {
-           status = show_null_message (format);
+           sp->null (sp);
        }
 
-       if (!status && format->message_set_sep)
-           fputs (format->message_set_sep, stdout);
-
        status = show_messages (ctx,
                                format, sp,
                                notmuch_message_get_replies (message),
@@ -931,12 +931,10 @@ show_messages (void *ctx,
 
        notmuch_message_destroy (message);
 
-       if (format->message_set_end)
-           fputs (format->message_set_end, stdout);
+       sp->end (sp);
     }
 
-    if (format->message_set_end)
-       fputs (format->message_set_end, stdout);
+    sp->end (sp);
 
     return res;
 }
@@ -982,11 +980,9 @@ do_show (void *ctx,
     notmuch_threads_t *threads;
     notmuch_thread_t *thread;
     notmuch_messages_t *messages;
-    int first_toplevel = 1;
     notmuch_status_t status, res = NOTMUCH_STATUS_SUCCESS;
 
-    if (format->message_set_start)
-       fputs (format->message_set_start, stdout);
+    sp->begin_list (sp);
 
     for (threads = notmuch_query_search_threads (query);
         notmuch_threads_valid (threads);
@@ -1000,10 +996,6 @@ do_show (void *ctx,
            INTERNAL_ERROR ("Thread %s has no toplevel messages.\n",
                            notmuch_thread_get_thread_id (thread));
 
-       if (!first_toplevel && format->message_set_sep)
-           fputs (format->message_set_sep, stdout);
-       first_toplevel = 0;
-
        status = show_messages (ctx, format, sp, messages, 0, params);
        if (status && !res)
            res = status;
@@ -1012,8 +1004,7 @@ do_show (void *ctx,
 
     }
 
-    if (format->message_set_end)
-       fputs (format->message_set_end, stdout);
+    sp->end (sp);
 
     return res != NOTMUCH_STATUS_SUCCESS;
 }