if (!err) { gpgme_verify_result_t res;   res = gpgme_op_verify_result (ctx); if (res && res->signatures) verify_dialog_box (res); } else if (gpgme_err_code (err) == GPG_ERR_DECRYPT_FAILED) {  gpgme_decrypt_result_t res; res = gpgme_op_decrypt_result (ctx); if (res != NULL && res->recipients != NULL && gpgme_err_code (res->recipients->status) == GPG_ERR_NO_SECKEY) err = GPG_ERR_NO_SECKEY;  } else {  }    if (err && (dk.opts & OPT_FLAG_CANCEL)) err = gpg_error (GPG_ERR_CANCELED);
op_decrypt_stream (LPSTREAM instream, LPSTREAM outstream, int ttl){      struct decrypt_key_s dk;  struct gpgme_data_cbs cbs;  gpgme_data_t in = NULL;  gpgme_data_t out = NULL;      gpgme_ctx_t ctx = NULL;  gpgme_error_t err;    memset (&cbs, 0, sizeof cbs);  cbs.read = stream_read_cb;  cbs.write = stream_write_cb;  memset (&dk, 0, sizeof dk);  dk.ttl = ttl;  err = gpgme_data_new_from_cbs (&in, &cbs, instream);  if (err)    goto fail;  err = gpgme_new (&ctx);  if (err)    goto fail;  err = gpgme_data_new_from_cbs (&out, &cbs, outstream);  if (err)    goto fail;  gpgme_set_passphrase_cb (ctx, passphrase_callback_box, &dk);  dk.ctx = ctx;  err = gpgme_op_decrypt (ctx, in, out);  dk.ctx = NULL;  update_passphrase_cache (err, &dk); fail:  if (in)    gpgme_data_release (in);  if (out)    gpgme_data_release (out);  if (ctx)    gpgme_release (ctx);  return err;}