aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine-uiserver.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2016-05-19 15:01:07 +0000
committerWerner Koch <[email protected]>2016-05-19 15:04:54 +0000
commit88f2c1c0d16eee6bb36a901623ea65ac69499f03 (patch)
tree4ac0d8ab84bee699987f61e277e8c4d80e857850 /src/engine-uiserver.c
parentapi: Remove arbitrary restriction from gpgme_op_verify. (diff)
downloadgpgme-88f2c1c0d16eee6bb36a901623ea65ac69499f03.tar.gz
gpgme-88f2c1c0d16eee6bb36a901623ea65ac69499f03.zip
api: Add new function gpgme_set_ctx_flag.
* src/gpgme.h.in (gpgme_set_ctx_flag): New prototype. * src/gpgme.c (gpgme_set_ctx_flag): New. * src/gpgme.def, src/libgpgme.vers: Add new function. * src/context.h (struct gpgme_context): Add FULL_STATUS. * src/decrypt.c (_gpgme_decrypt_status_handler): Do not call the status callback if FULL_STATUS is set. * src/genkey.c (genkey_status_handler): Ditto. * src/passphrase.c (_gpgme_passphrase_status_handler): Ditto. * src/sign.c (_gpgme_sign_status_handler): Ditto. * src/engine-backend.h (struct engine_ops): Add SET_STATUS_CB and add adjust all definitions of that variable. * src/engine.c (_gpgme_engine_set_status_cb): New. * src/op-support.c (_gpgme_op_reset): Call this function. * src/engine-gpg.c (struct engine_gpg): Add fields MON_CB and MON_CB_VALUE. (gpg_set_status_cb): New. (_gpgme_engine_ops_gpg): Register that function. (read_status): Call the monitor callback. * src/engine-gpgsm.c (struct engine_gpgsm): Add fields MON_CB and MON_CB_VALUE. (_gpgme_engine_ops_gpgsm): Register that function. (gpgsm_assuan_simple_command): Change first arg to be an engine context and adjust call callers. Call the monitor callback. * src/engine-uiserver.c (struct engine_uiserver): Add fields MON_CB and MON_CB_VALUE. (_gpgme_engine_ops_uiserver): Register that function. (uiserver_assuan_simple_command): Change first arg to be an engine context and adjust call callers. Call the monitor callback. * tests/run-verify.c (status_cb): New. (print_result): Print algo names. (main): Add option --status. -- This new feature is mainly intended for bug tracking. Having access to the raw status lines might also be useful for applications, though. Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src/engine-uiserver.c')
-rw-r--r--src/engine-uiserver.c43
1 files changed, 34 insertions, 9 deletions
diff --git a/src/engine-uiserver.c b/src/engine-uiserver.c
index e4fd47c3..d05ade61 100644
--- a/src/engine-uiserver.c
+++ b/src/engine-uiserver.c
@@ -90,6 +90,8 @@ struct engine_uiserver
{
engine_status_handler_t fnc;
void *fnc_value;
+ gpgme_status_cb_t mon_cb;
+ void *mon_cb_value;
} status;
struct
@@ -451,10 +453,11 @@ uiserver_set_protocol (void *engine, gpgme_protocol_t protocol)
static gpgme_error_t
-uiserver_assuan_simple_command (assuan_context_t ctx, char *cmd,
- engine_status_handler_t status_fnc,
- void *status_fnc_value)
+uiserver_assuan_simple_command (engine_uiserver_t uiserver, char *cmd,
+ engine_status_handler_t status_fnc,
+ void *status_fnc_value)
{
+ assuan_context_t ctx = uiserver->assuan_ctx;
gpg_error_t err;
char *line;
size_t linelen;
@@ -493,8 +496,17 @@ uiserver_assuan_simple_command (assuan_context_t ctx, char *cmd,
*(rest++) = 0;
r = _gpgme_parse_status (line + 2);
+ if (uiserver->status.mon_cb && r != GPGME_STATUS_PROGRESS)
+ {
+ /* Note that we call the monitor even if we do
+ * not know the status code (r < 0). */
+ err = uiserver->status.mon_cb (uiserver->status.mon_cb_value,
+ line + 2, rest);
+ }
- if (r >= 0 && status_fnc)
+ if (err)
+ ;
+ else if (r >= 0 && status_fnc)
err = status_fnc (status_fnc_value, r, rest);
else
err = gpg_error (GPG_ERR_GENERAL);
@@ -576,7 +588,7 @@ uiserver_set_fd (engine_uiserver_t uiserver, fd_type_t fd_type, const char *opt)
else
snprintf (line, COMMANDLINELEN, "%s FD", which);
- err = uiserver_assuan_simple_command (uiserver->assuan_ctx, line, NULL, NULL);
+ err = uiserver_assuan_simple_command (uiserver, line, NULL, NULL);
leave_set_fd:
if (err)
@@ -915,7 +927,7 @@ uiserver_reset (void *engine)
/* We must send a reset because we need to reset the list of
signers. Note that RESET does not reset OPTION commands. */
- return uiserver_assuan_simple_command (uiserver->assuan_ctx, "RESET", NULL, NULL);
+ return uiserver_assuan_simple_command (uiserver, "RESET", NULL, NULL);
}
@@ -984,7 +996,6 @@ static gpgme_error_t
set_recipients (engine_uiserver_t uiserver, gpgme_key_t recp[])
{
gpgme_error_t err = 0;
- assuan_context_t ctx = uiserver->assuan_ctx;
char *line;
int linelen;
int invalid_recipients = 0;
@@ -1023,7 +1034,8 @@ set_recipients (engine_uiserver_t uiserver, gpgme_key_t recp[])
/* FIXME: need to do proper escaping */
strcpy (&line[10], uid);
- err = uiserver_assuan_simple_command (ctx, line, uiserver->status.fnc,
+ err = uiserver_assuan_simple_command (uiserver, line,
+ uiserver->status.fnc,
uiserver->status.fnc_value);
/* FIXME: This might requires more work. */
if (gpg_err_code (err) == GPG_ERR_NO_PUBKEY)
@@ -1160,7 +1172,7 @@ uiserver_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
char buf[100];
strcpy (stpcpy (buf, "SENDER --info "), s);
- err = uiserver_assuan_simple_command (uiserver->assuan_ctx, buf,
+ err = uiserver_assuan_simple_command (uiserver, buf,
uiserver->status.fnc,
uiserver->status.fnc_value);
}
@@ -1252,6 +1264,18 @@ uiserver_verify (void *engine, gpgme_data_t sig, gpgme_data_t signed_text,
}
+/* This sets a status callback for monitoring status lines before they
+ * are passed to a caller set handler. */
+static void
+uiserver_set_status_cb (void *engine, gpgme_status_cb_t cb, void *cb_value)
+{
+ engine_uiserver_t uiserver = engine;
+
+ uiserver->status.mon_cb = cb;
+ uiserver->status.mon_cb_value = cb_value;
+}
+
+
static void
uiserver_set_status_handler (void *engine, engine_status_handler_t fnc,
void *fnc_value)
@@ -1309,6 +1333,7 @@ struct engine_ops _gpgme_engine_ops_uiserver =
/* Member functions. */
uiserver_release,
uiserver_reset,
+ uiserver_set_status_cb,
uiserver_set_status_handler,
NULL, /* set_command_handler */
uiserver_set_colon_line_handler,