diff options
Diffstat (limited to 'src/engine-uiserver.c')
| -rw-r--r-- | src/engine-uiserver.c | 43 | 
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, | 
