]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-show.c
cli: replace use of g_mime_message_get_recipients
[notmuch] / notmuch-show.c
index accea48a194a00a1fced46fef95ab54f263681c4..1f359a917a2fcb4196912fe45102c3326fa18da2 100644 (file)
@@ -201,10 +201,9 @@ format_headers_sprinter (sprinter_t *sp, GMimeMessage *message,
     /* Any changes to the JSON or S-Expression format should be
      * reflected in the file devel/schemata. */
 
-    InternetAddressList *recipients;
     char *recipients_string;
     const char *reply_to_string;
-    char *date_string;
+    void *local = talloc_new (sp);
 
     sp->begin_map (sp);
 
@@ -212,33 +211,30 @@ format_headers_sprinter (sprinter_t *sp, GMimeMessage *message,
     sp->string (sp, g_mime_message_get_subject (message));
 
     sp->map_key (sp, "From");
-    sp->string (sp, g_mime_message_get_sender (message));
+    sp->string (sp, g_mime_message_get_from_string (message));
 
-    recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO);
-    recipients_string = internet_address_list_to_string (recipients, 0);
+    recipients_string = g_mime_message_get_address_string (message, GMIME_ADDRESS_TYPE_TO);
     if (recipients_string) {
        sp->map_key (sp, "To");
        sp->string (sp, recipients_string);
        g_free (recipients_string);
     }
 
-    recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC);
-    recipients_string = internet_address_list_to_string (recipients, 0);
+    recipients_string = g_mime_message_get_address_string (message, GMIME_ADDRESS_TYPE_CC);
     if (recipients_string) {
        sp->map_key (sp, "Cc");
        sp->string (sp, recipients_string);
        g_free (recipients_string);
     }
 
-    recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_BCC);
-    recipients_string = internet_address_list_to_string (recipients, 0);
+    recipients_string = g_mime_message_get_address_string (message, GMIME_ADDRESS_TYPE_BCC);
     if (recipients_string) {
        sp->map_key (sp, "Bcc");
        sp->string (sp, recipients_string);
        g_free (recipients_string);
     }
 
-    reply_to_string = g_mime_message_get_reply_to (message);
+    reply_to_string = g_mime_message_get_reply_to_string (local, message);
     if (reply_to_string) {
        sp->map_key (sp, "Reply-To");
        sp->string (sp, reply_to_string);
@@ -252,12 +248,11 @@ format_headers_sprinter (sprinter_t *sp, GMimeMessage *message,
        sp->string (sp, g_mime_object_get_header (GMIME_OBJECT (message), "References"));
     } else {
        sp->map_key (sp, "Date");
-       date_string = g_mime_message_get_date_as_string (message);
-       sp->string (sp, date_string);
-       g_free (date_string);
+       sp->string (sp, g_mime_message_get_date_string (sp, message));
     }
 
     sp->end (sp);
+    talloc_free (local);
 }
 
 /* Write a MIME text part out to the given stream.
@@ -340,6 +335,48 @@ signature_status_to_string (GMimeSignatureStatus x)
     return "unknown";
 }
 
+
+/* Print signature flags */
+struct key_map_struct {
+    GMimeSignatureError bit;
+    const char * string;
+};
+
+static void
+do_format_signature_errors (sprinter_t *sp, struct key_map_struct *key_map,
+                           unsigned int array_map_len, GMimeSignatureError errors) {
+    sp->map_key (sp, "errors");
+    sp->begin_map (sp);
+
+    for (unsigned int i = 0; i < array_map_len; i++) {
+       if (errors & key_map[i].bit) {
+           sp->map_key (sp, key_map[i].string);
+           sp->boolean (sp, TRUE);
+       }
+    }
+
+    sp->end (sp);
+}
+
+static void
+format_signature_errors (sprinter_t *sp, GMimeSignature *signature)
+{
+    GMimeSignatureError errors = g_mime_signature_get_errors (signature);
+
+    if (errors == GMIME_SIGNATURE_ERROR_NONE)
+       return;
+
+    struct key_map_struct key_map[] = {
+       { GMIME_SIGNATURE_ERROR_EXPSIG, "sig-expired" },
+       { GMIME_SIGNATURE_ERROR_NO_PUBKEY, "key-missing"},
+       { GMIME_SIGNATURE_ERROR_EXPKEYSIG, "key-expired"},
+       { GMIME_SIGNATURE_ERROR_REVKEYSIG, "key-revoked"},
+       { GMIME_SIGNATURE_ERROR_UNSUPP_ALGO, "alg-unsupported"},
+    };
+
+    do_format_signature_errors (sp, key_map, ARRAY_SIZE(key_map), errors);
+}
+
 /* Signature status sprinter (GMime 2.6) */
 static void
 format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node)
@@ -404,10 +441,14 @@ format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node)
            }
        }
 
-       GMimeSignatureError errors = g_mime_signature_get_errors (signature);
-       if (errors != GMIME_SIGNATURE_ERROR_NONE) {
-           sp->map_key (sp, "errors");
-           sp->integer (sp, errors);
+       if (notmuch_format_version <= 3) {
+           GMimeSignatureError errors = g_mime_signature_get_errors (signature);
+           if (errors != GMIME_SIGNATURE_ERROR_NONE) {
+               sp->map_key (sp, "errors");
+               sp->integer (sp, errors);
+           }
+       } else {
+           format_signature_errors (sp, signature);
        }
 
        sp->end (sp);
@@ -467,7 +508,6 @@ format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node,
 
     if (GMIME_IS_MESSAGE (node->part)) {
        GMimeMessage *message = GMIME_MESSAGE (node->part);
-       InternetAddressList *recipients;
        char *recipients_string;
        char *date_string;
 
@@ -475,20 +515,17 @@ format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node,
        if (node->envelope_file)
            g_mime_stream_printf (stream, "%s\n", _get_one_line_summary (ctx, node->envelope_file));
        g_mime_stream_printf (stream, "Subject: %s\n", g_mime_message_get_subject (message));
-       g_mime_stream_printf (stream, "From: %s\n", g_mime_message_get_sender (message));
-       recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO);
-       recipients_string = internet_address_list_to_string (recipients, 0);
+       g_mime_stream_printf (stream, "From: %s\n", g_mime_message_get_from_string (message));
+       recipients_string = g_mime_message_get_address_string (message, GMIME_ADDRESS_TYPE_TO);
        if (recipients_string)
            g_mime_stream_printf (stream, "To: %s\n", recipients_string);
        g_free (recipients_string);
-       recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC);
-       recipients_string = internet_address_list_to_string (recipients, 0);
+       recipients_string = g_mime_message_get_address_string (message, GMIME_ADDRESS_TYPE_CC);
        if (recipients_string)
            g_mime_stream_printf (stream, "Cc: %s\n", recipients_string);
        g_free (recipients_string);
-       date_string = g_mime_message_get_date_as_string (message);
+       date_string = g_mime_message_get_date_string (node, message);
        g_mime_stream_printf (stream, "Date: %s\n", date_string);
-       g_free (date_string);
        g_mime_stream_printf (stream, "\fheader}\n");
 
        g_mime_stream_printf (stream, "\fbody{\n");
@@ -902,7 +939,7 @@ do_show_single (void *ctx,
        return 1;
 
     if (count != 1) {
-       fprintf (stderr, "Error: search term did not match precisely one message (matched %d messages).\n", count);
+       fprintf (stderr, "Error: search term did not match precisely one message (matched %u messages).\n", count);
        return 1;
     }
 
@@ -1009,18 +1046,6 @@ static const notmuch_show_format_t *formatters[] = {
     [NOTMUCH_FORMAT_RAW] = &format_raw,
 };
 
-enum {
-    ENTIRE_THREAD_DEFAULT = -1,
-    ENTIRE_THREAD_FALSE = FALSE,
-    ENTIRE_THREAD_TRUE = TRUE,
-};
-
-/* The following is to allow future options to be added more easily */
-enum {
-    EXCLUDE_TRUE,
-    EXCLUDE_FALSE,
-};
-
 int
 notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
 {
@@ -1036,8 +1061,11 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
        .output_body = TRUE,
     };
     int format = NOTMUCH_FORMAT_NOT_SPECIFIED;
-    int exclude = EXCLUDE_TRUE;
-    int entire_thread = ENTIRE_THREAD_DEFAULT;
+    int exclude = TRUE;
+
+    /* This value corresponds to neither true nor false being passed
+     * on the command line */
+    int entire_thread = -1;
     notmuch_bool_t single_message;
 
     notmuch_opt_desc_t options[] = {
@@ -1049,15 +1077,8 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
                                  { "raw", NOTMUCH_FORMAT_RAW },
                                  { 0, 0 } } },
        { NOTMUCH_OPT_INT, &notmuch_format_version, "format-version", 0, 0 },
-       { NOTMUCH_OPT_KEYWORD, &exclude, "exclude", 'x',
-         (notmuch_keyword_t []){ { "true", EXCLUDE_TRUE },
-                                 { "false", EXCLUDE_FALSE },
-                                 { 0, 0 } } },
-       { NOTMUCH_OPT_KEYWORD, &entire_thread, "entire-thread", 't',
-         (notmuch_keyword_t []){ { "true", ENTIRE_THREAD_TRUE },
-                                 { "false", ENTIRE_THREAD_FALSE },
-                                 { "", ENTIRE_THREAD_TRUE },
-                                 { 0, 0 } } },
+       { NOTMUCH_OPT_BOOLEAN, &exclude, "exclude", 'x', 0 },
+       { NOTMUCH_OPT_BOOLEAN, &entire_thread, "entire-thread", 't', 0 },
        { NOTMUCH_OPT_INT, &params.part, "part", 'p', 0 },
        { NOTMUCH_OPT_BOOLEAN, &params.crypto.decrypt, "decrypt", 'd', 0 },
        { NOTMUCH_OPT_BOOLEAN, &params.crypto.verify, "verify", 'v', 0 },
@@ -1102,7 +1123,7 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
 
     /* Default is entire-thread = FALSE except for format=json and
      * format=sexp. */
-    if (entire_thread == ENTIRE_THREAD_DEFAULT) {
+    if (entire_thread != FALSE && entire_thread != TRUE) {
        if (format == NOTMUCH_FORMAT_JSON || format == NOTMUCH_FORMAT_SEXP)
            params.entire_thread = TRUE;
        else
@@ -1182,7 +1203,7 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
            }
        }
 
-       if (exclude == EXCLUDE_FALSE) {
+       if (exclude == FALSE) {
            notmuch_query_set_omit_excluded (query, FALSE);
            params.omit_excluded = FALSE;
        }