diff options
| author | David Bremner <david@tethera.net> | 2017-06-03 14:47:34 -0300 |
|---|---|---|
| committer | David Bremner <david@tethera.net> | 2017-07-04 08:32:44 -0300 |
| commit | e1b7d32db00ea8afaa1f2ae31bdaa5cb423dda96 (patch) | |
| tree | c14dea5dda1e59dbf2f1aa55302e6f5933f3e03f /notmuch-show.c | |
| parent | 9eacd7d367aff4c5e8069e4b9f4c7ed8f466f6ee (diff) | |
cli: implement structured output version 4
Since the error field is unused by the emacs front end, no changes are
needed other than bumping the format version number.
As it is, this is a bit overengineered, but it will reduce duplication
when we support gmime 3.0
Diffstat (limited to 'notmuch-show.c')
| -rw-r--r-- | notmuch-show.c | 54 |
1 files changed, 50 insertions, 4 deletions
diff --git a/notmuch-show.c b/notmuch-show.c index 3ce4b63c..5c2d56e8 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -340,6 +340,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 +446,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); |
