]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-show.c
cli: use notmuch_bool_t for boolean argument in show
[notmuch] / notmuch-show.c
index e0433095da37b76bc127d372ee9784172b12c5ae..3d11a40c6a597e5f59166a9187c89d9c53e41c88 100644 (file)
@@ -201,7 +201,6 @@ 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;
     void *local = talloc_new (sp);
@@ -212,26 +211,23 @@ 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);
@@ -324,22 +320,21 @@ show_text_part_content (GMimeObject *part, GMimeStream *stream_out,
        g_object_unref(stream_filter);
 }
 
-/* Get signature status string (GMime 2.6) */
 static const char*
-signature_status_to_string (GMimeSignatureStatus x)
+signature_status_to_string (GMimeSignatureStatus status)
 {
-    switch (x) {
-    case GMIME_SIGNATURE_STATUS_GOOD:
-       return "good";
-    case GMIME_SIGNATURE_STATUS_BAD:
+    if (g_mime_signature_status_bad (status))
        return "bad";
-    case GMIME_SIGNATURE_STATUS_ERROR:
+
+    if (g_mime_signature_status_error (status))
        return "error";
-    }
+
+    if (g_mime_signature_status_good (status))
+       return "good";
+
     return "unknown";
 }
 
-
 /* Print signature flags */
 struct key_map_struct {
     GMimeSignatureError bit;
@@ -362,6 +357,7 @@ do_format_signature_errors (sprinter_t *sp, struct key_map_struct *key_map,
     sp->end (sp);
 }
 
+#if (GMIME_MAJOR_VERSION < 3)
 static void
 format_signature_errors (sprinter_t *sp, GMimeSignature *signature)
 {
@@ -380,6 +376,30 @@ format_signature_errors (sprinter_t *sp, GMimeSignature *signature)
 
     do_format_signature_errors (sp, key_map, ARRAY_SIZE(key_map), errors);
 }
+#else
+static void
+format_signature_errors (sprinter_t *sp, GMimeSignature *signature)
+{
+    GMimeSignatureError errors = g_mime_signature_get_errors (signature);
+
+    if (!(errors & GMIME_SIGNATURE_STATUS_ERROR_MASK))
+       return;
+
+    struct key_map_struct key_map[] = {
+       { GMIME_SIGNATURE_STATUS_KEY_REVOKED, "key-revoked"},
+       { GMIME_SIGNATURE_STATUS_KEY_EXPIRED, "key-expired"},
+       { GMIME_SIGNATURE_STATUS_SIG_EXPIRED, "sig-expired" },
+       { GMIME_SIGNATURE_STATUS_KEY_MISSING, "key-missing"},
+       { GMIME_SIGNATURE_STATUS_CRL_MISSING, "crl-missing"},
+       { GMIME_SIGNATURE_STATUS_CRL_TOO_OLD, "crl-too-old"},
+       { GMIME_SIGNATURE_STATUS_BAD_POLICY, "bad-policy"},
+       { GMIME_SIGNATURE_STATUS_SYS_ERROR, "sys-error"},
+       { GMIME_SIGNATURE_STATUS_TOFU_CONFLICT, "tofu-conflict"},
+    };
+
+    do_format_signature_errors (sp, key_map, ARRAY_SIZE(key_map), errors);
+}
+#endif
 
 /* Signature status sprinter (GMime 2.6) */
 static void
@@ -409,7 +429,7 @@ format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node)
        sp->string (sp, signature_status_to_string (status));
 
        GMimeCertificate *certificate = g_mime_signature_get_certificate (signature);
-       if (status == GMIME_SIGNATURE_STATUS_GOOD) {
+       if (g_mime_signature_status_good (status)) {
            if (certificate) {
                sp->map_key (sp, "fingerprint");
                sp->string (sp, g_mime_certificate_get_fingerprint (certificate));
@@ -430,7 +450,7 @@ format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node)
            /* note that gmime is using the term "trust" here, which
             * is WRONG.  It's actually user id "validity". */
            if (certificate) {
-               const char *name = g_mime_certificate_get_name (certificate);
+               const char *name = g_mime_certificate_get_uid (certificate);
                GMimeCertificateTrust trust = g_mime_certificate_get_trust (certificate);
                if (name && (trust == GMIME_CERTIFICATE_TRUST_FULLY || trust == GMIME_CERTIFICATE_TRUST_ULTIMATE)) {
                    sp->map_key (sp, "userid");
@@ -438,7 +458,7 @@ format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node)
                }
            }
        } else if (certificate) {
-           const char *key_id = g_mime_certificate_get_key_id (certificate);
+           const char *key_id = g_mime_certificate_get_fpr16 (certificate);
            if (key_id) {
                sp->map_key (sp, "keyid");
                sp->string (sp, key_id);
@@ -447,7 +467,7 @@ format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node)
 
        if (notmuch_format_version <= 3) {
            GMimeSignatureError errors = g_mime_signature_get_errors (signature);
-           if (errors != GMIME_SIGNATURE_ERROR_NONE) {
+           if (g_mime_signature_status_error (errors)) {
                sp->map_key (sp, "errors");
                sp->integer (sp, errors);
            }
@@ -512,7 +532,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;
 
@@ -520,14 +539,12 @@ 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);
@@ -586,7 +603,7 @@ format_omitted_part_meta_sprinter (sprinter_t *sp, GMimeObject *meta, GMimePart
 
 void
 format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
-                     notmuch_bool_t first, notmuch_bool_t output_body,
+                     notmuch_bool_t output_body,
                      notmuch_bool_t include_html)
 {
     /* Any changes to the JSON or S-Expression format should be
@@ -602,7 +619,7 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
        if (output_body) {
            sp->map_key (sp, "body");
            sp->begin_list (sp);
-           format_part_sprinter (ctx, sp, mime_node_child (node, 0), first, TRUE, include_html);
+           format_part_sprinter (ctx, sp, mime_node_child (node, 0), TRUE, include_html);
            sp->end (sp);
        }
        sp->end (sp);
@@ -704,7 +721,7 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
     }
 
     for (i = 0; i < node->nchildren; i++)
-       format_part_sprinter (ctx, sp, mime_node_child (node, i), i == 0, TRUE, include_html);
+       format_part_sprinter (ctx, sp, mime_node_child (node, i), TRUE, include_html);
 
     /* Close content structures */
     for (i = 0; i < nclose; i++)
@@ -718,7 +735,7 @@ 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_sprinter (ctx, sp, node, TRUE, params->output_body, params->include_html);
+    format_part_sprinter (ctx, sp, node, params->output_body, params->include_html);
 
     return NOTMUCH_STATUS_SUCCESS;
 }
@@ -1068,31 +1085,29 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
        .output_body = TRUE,
     };
     int format = NOTMUCH_FORMAT_NOT_SPECIFIED;
-    int exclude = TRUE;
-
-    /* This value corresponds to neither true nor false being passed
-     * on the command line */
-    int entire_thread = -1;
+    notmuch_bool_t exclude = TRUE;
+    notmuch_bool_t entire_thread_set = FALSE;
     notmuch_bool_t single_message;
 
     notmuch_opt_desc_t options[] = {
-       { NOTMUCH_OPT_KEYWORD, &format, "format", 'f',
+       { .opt_keyword = &format, .name = "format", .keywords =
          (notmuch_keyword_t []){ { "json", NOTMUCH_FORMAT_JSON },
                                  { "text", NOTMUCH_FORMAT_TEXT },
                                  { "sexp", NOTMUCH_FORMAT_SEXP },
                                  { "mbox", NOTMUCH_FORMAT_MBOX },
                                  { "raw", NOTMUCH_FORMAT_RAW },
                                  { 0, 0 } } },
-       { NOTMUCH_OPT_INT, &notmuch_format_version, "format-version", 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 },
-       { NOTMUCH_OPT_BOOLEAN, &params.output_body, "body", 'b', 0 },
-       { NOTMUCH_OPT_BOOLEAN, &params.include_html, "include-html", 0, 0 },
-       { NOTMUCH_OPT_INHERIT, (void *) &notmuch_shared_options, NULL, 0, 0 },
-       { 0, 0, 0, 0, 0 }
+       { .opt_int = &notmuch_format_version, .name = "format-version" },
+       { .opt_bool = &exclude, .name = "exclude" },
+       { .opt_bool = &params.entire_thread, .name = "entire-thread",
+         .present = &entire_thread_set },
+       { .opt_int = &params.part, .name = "part" },
+       { .opt_bool = &params.crypto.decrypt, .name = "decrypt" },
+       { .opt_bool = &params.crypto.verify, .name = "verify" },
+       { .opt_bool = &params.output_body, .name = "body" },
+       { .opt_bool = &params.include_html, .name = "include-html" },
+       { .opt_inherit = notmuch_shared_options },
+       { }
     };
 
     opt_index = parse_arguments (argc, argv, options, 1);
@@ -1130,14 +1145,9 @@ 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 != FALSE && entire_thread != TRUE) {
-       if (format == NOTMUCH_FORMAT_JSON || format == NOTMUCH_FORMAT_SEXP)
-           params.entire_thread = TRUE;
-       else
-           params.entire_thread = FALSE;
-    } else {
-       params.entire_thread = entire_thread;
-    }
+    if (! entire_thread_set &&
+       (format == NOTMUCH_FORMAT_JSON || format == NOTMUCH_FORMAT_SEXP))
+       params.entire_thread = TRUE;
 
     if (!params.output_body) {
        if (params.part > 0) {
@@ -1166,7 +1176,9 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
        return EXIT_FAILURE;
     }
 
+#if (GMIME_MAJOR_VERSION < 3)
     params.crypto.gpgpath = notmuch_config_get_crypto_gpg_path (config);
+#endif
 
     if (notmuch_database_open (notmuch_config_get_database_path (config),
                               NOTMUCH_DATABASE_MODE_READ_ONLY, &notmuch))