2001-11-21 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Wed, 21 Nov 2001 03:40:17 +0000 (03:40 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Wed, 21 Nov 2001 03:40:17 +0000 (03:40 +0000)
* context.h: Do not include rungpg.h, but engine.h.
(struct gpgme_context_s): Replace member gpg with engine.
* gpgme.c (gpgme_release): Release engine, not gpg.

* recipient.c (_gpgme_append_gpg_args_from_recifgpients): Function
moved ...
* rungpg.c (_gpgme_append_gpg_args_from_recipients): ... here.
Make static, change order of arguments, and return an error value.
* ops.h (_gpgme_append_gpg_args_from_recipients): Removed prototype.

* rungpg.h (_gpgme_gpg_op_verify): Add prototype.
(_gpgme_gpg_op_encrypt): Likewise.
(_gpgme_gpg_op_decrypt): Likewise.
(_gpgme_gpg_op_delete): Likewise.
(_gpgme_gpg_op_export): Likewise.
(_gpgme_gpg_op_genkey): Likewise.
(_gpgme_gpg_op_import): Likewise.
(_gpgme_gpg_op_keylist): Likewise.
(_gpgme_gpg_op_sign): Likewise.
(_gpgme_gpg_op_trustlist): Likewise.
* rungpg.c (_gpgme_gpg_op_verify): New function.
(_gpgme_gpg_op_encrypt): Likewise.
(_gpgme_gpg_op_decrypt): Likewise.
(_gpgme_gpg_op_delete): Likewise.
(_gpgme_gpg_op_export): Likewise.
(_gpgme_gpg_op_genkey): Likewise.
(_gpgme_gpg_op_import): Likewise.
(_gpgme_gpg_op_keylist): Likewise.
(_gpgme_gpg_op_sign): Likewise.
(_gpgme_gpg_op_trustlist): Likewise.

* engine.h (_gpgme_engine_set_status_handler): Add prototype.
(_gpgme_engine_set_command_handler): Likewise.
(_gpgme_engine_set_colon_line_handler): Likewise.
(_gpgme_engine_op_decrypt): Likewise.
(_gpgme_engine_op_delete): Likewise.
(_gpgme_engine_op_encrypt): Likewise.
(_gpgme_engine_op_export): Likewise.
(_gpgme_engine_op_genkey): Likewise.
(_gpgme_engine_op_import): Likewise.
(_gpgme_engine_op_keylist): Likewise.
(_gpgme_engine_op_sign): Likewise.
(_gpgme_engine_op_trustlist): Likewise.
(_gpgme_engine_op_verify): Likewise.
(_gpgme_engine_start): Likewise.
* engine.c (_gpgme_engine_set_status_handler): New function.
(_gpgme_engine_set_command_handler): Likewise.
(_gpgme_engine_set_colon_line_handler): Likewise.
(_gpgme_engine_op_decrypt): Likewise.
(_gpgme_engine_op_delete): Likewise.
(_gpgme_engine_op_encrypt): Likewise.
(_gpgme_engine_op_export): Likewise.
(_gpgme_engine_op_genkey): Likewise.
(_gpgme_engine_op_import): Likewise.
(_gpgme_engine_op_keylist): Likewise.
(_gpgme_engine_op_sign): Likewise.
(_gpgme_engine_op_trustlist): Likewise.
(_gpgme_engine_op_verify): Likewise.
(_gpgme_engine_start): Likewise.

* verify.c (gpgme_op_verify_start): Reimplement in terms of above
functions.
* encrypt.c (gpgme_op_encrypt_start): Likewise.
* decrypt.c (_gpgme_decrypt_start): Likewise.
* passphrase.c (_gpgme_passphrase_start): Likewise.
* keylist.c (gpgme_op_keylist_start): Likewise.

20 files changed:
trunk/gpgme/ChangeLog
trunk/gpgme/context.h
trunk/gpgme/decrypt.c
trunk/gpgme/delete.c
trunk/gpgme/encrypt.c
trunk/gpgme/engine.c
trunk/gpgme/engine.h
trunk/gpgme/export.c
trunk/gpgme/genkey.c
trunk/gpgme/gpgme.c
trunk/gpgme/import.c
trunk/gpgme/keylist.c
trunk/gpgme/ops.h
trunk/gpgme/passphrase.c
trunk/gpgme/recipient.c
trunk/gpgme/rungpg.c
trunk/gpgme/rungpg.h
trunk/gpgme/sign.c
trunk/gpgme/trustlist.c
trunk/gpgme/verify.c

index b6d17a233c76e4a724444358d7835a72f9c9c6de..2ee8f90087893a80c1f00e1914c75a8a7fcb4ac4 100644 (file)
@@ -1,3 +1,72 @@
+2001-11-21  Marcus Brinkmann  <marcus@g10code.de>
+
+       * context.h: Do not include rungpg.h, but engine.h.
+       (struct gpgme_context_s): Replace member gpg with engine.
+       * gpgme.c (gpgme_release): Release engine, not gpg.
+
+       * recipient.c (_gpgme_append_gpg_args_from_recifgpients): Function
+       moved ...
+       * rungpg.c (_gpgme_append_gpg_args_from_recipients): ... here.
+       Make static, change order of arguments, and return an error value.
+       * ops.h (_gpgme_append_gpg_args_from_recipients): Removed prototype.
+
+       * rungpg.h (_gpgme_gpg_op_verify): Add prototype.
+       (_gpgme_gpg_op_encrypt): Likewise.
+       (_gpgme_gpg_op_decrypt): Likewise.
+       (_gpgme_gpg_op_delete): Likewise.
+       (_gpgme_gpg_op_export): Likewise.
+       (_gpgme_gpg_op_genkey): Likewise.
+       (_gpgme_gpg_op_import): Likewise.
+       (_gpgme_gpg_op_keylist): Likewise.
+       (_gpgme_gpg_op_sign): Likewise.
+       (_gpgme_gpg_op_trustlist): Likewise.
+       * rungpg.c (_gpgme_gpg_op_verify): New function.
+       (_gpgme_gpg_op_encrypt): Likewise.
+       (_gpgme_gpg_op_decrypt): Likewise.
+       (_gpgme_gpg_op_delete): Likewise.
+       (_gpgme_gpg_op_export): Likewise.
+       (_gpgme_gpg_op_genkey): Likewise.
+       (_gpgme_gpg_op_import): Likewise.
+       (_gpgme_gpg_op_keylist): Likewise.
+       (_gpgme_gpg_op_sign): Likewise.
+       (_gpgme_gpg_op_trustlist): Likewise.
+
+       * engine.h (_gpgme_engine_set_status_handler): Add prototype.
+       (_gpgme_engine_set_command_handler): Likewise.
+       (_gpgme_engine_set_colon_line_handler): Likewise.
+       (_gpgme_engine_op_decrypt): Likewise.
+       (_gpgme_engine_op_delete): Likewise.
+       (_gpgme_engine_op_encrypt): Likewise.
+       (_gpgme_engine_op_export): Likewise.
+       (_gpgme_engine_op_genkey): Likewise.
+       (_gpgme_engine_op_import): Likewise.
+       (_gpgme_engine_op_keylist): Likewise.
+       (_gpgme_engine_op_sign): Likewise.
+       (_gpgme_engine_op_trustlist): Likewise.
+       (_gpgme_engine_op_verify): Likewise.
+       (_gpgme_engine_start): Likewise.
+       * engine.c (_gpgme_engine_set_status_handler): New function.
+       (_gpgme_engine_set_command_handler): Likewise.
+       (_gpgme_engine_set_colon_line_handler): Likewise.
+       (_gpgme_engine_op_decrypt): Likewise.
+       (_gpgme_engine_op_delete): Likewise.
+       (_gpgme_engine_op_encrypt): Likewise.
+       (_gpgme_engine_op_export): Likewise.
+       (_gpgme_engine_op_genkey): Likewise.
+       (_gpgme_engine_op_import): Likewise.
+       (_gpgme_engine_op_keylist): Likewise.
+       (_gpgme_engine_op_sign): Likewise.
+       (_gpgme_engine_op_trustlist): Likewise.
+       (_gpgme_engine_op_verify): Likewise.
+       (_gpgme_engine_start): Likewise.
+
+       * verify.c (gpgme_op_verify_start): Reimplement in terms of above
+       functions.
+       * encrypt.c (gpgme_op_encrypt_start): Likewise.
+       * decrypt.c (_gpgme_decrypt_start): Likewise.
+       * passphrase.c (_gpgme_passphrase_start): Likewise.
+       * keylist.c (gpgme_op_keylist_start): Likewise.
+
 2001-11-20  Marcus Brinkmann  <marcus@g10code.de>
 
        * types.h: Add types EngineObject and GpgsmObject.
index c2a0bca439172471f6d512b5ceac9fe623de61a5..df2f40ae2180a9ea08ab7933b8f2abb918938bb6 100644 (file)
@@ -24,7 +24,7 @@
 
 #include "gpgme.h"
 #include "types.h"
-#include "rungpg.h"  /* for GpgObject */
+#include "engine.h"
 
 struct key_queue_item_s {
     struct key_queue_item_s *next;
@@ -51,7 +51,7 @@ struct gpgme_context_s {
     int cancel;    /* cancel operation request */
 
 
-    GpgObject gpg; /* the running gpg process */
+    EngineObject engine; /* The running engine process.  */
 
     int verbosity;  /* level of verbosity to use */
     int use_armor;  
index fcf440062b725c600630dee62d26734c6f89e150..cc0c3be628fd43662cbc4cf0fcf1808a1cb2c030 100644 (file)
@@ -94,7 +94,6 @@ _gpgme_decrypt_start (GpgmeCtx ctx, GpgmeData ciph, GpgmeData plain,
                      void *status_handler)
 {
   GpgmeError err = 0;
-  int i;
 
   fail_on_pending_request (ctx);
   ctx->pending = 1;
@@ -102,25 +101,13 @@ _gpgme_decrypt_start (GpgmeCtx ctx, GpgmeData ciph, GpgmeData plain,
   _gpgme_release_result (ctx);
   ctx->out_of_core = 0;
 
-  /* Do some checks.  */
   /* Create a process object.  */
-  _gpgme_gpg_release (ctx->gpg);
-  err = _gpgme_gpg_new (&ctx->gpg);
+  _gpgme_engine_release (ctx->engine);
+  err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+                          : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
   if (err)
     goto leave;
 
-  _gpgme_gpg_set_status_handler (ctx->gpg, status_handler, ctx);
-
-  err = _gpgme_passphrase_start (ctx);
-  if (err)
-    goto leave;
-
-  /* Build the commandline.  */
-  _gpgme_gpg_add_arg (ctx->gpg, "--decrypt");
-  for (i = 0; i < ctx->verbosity; i++)
-    _gpgme_gpg_add_arg (ctx->gpg, "--verbose");
-
   /* Check the supplied data.  */
   if (!ciph || gpgme_data_get_type (ciph) == GPGME_DATA_TYPE_NONE)
     {
@@ -136,21 +123,24 @@ _gpgme_decrypt_start (GpgmeCtx ctx, GpgmeData ciph, GpgmeData plain,
     }
   _gpgme_data_set_mode (plain, GPGME_DATA_MODE_IN);
 
-  /* Tell the gpg object about the data.  */
-  _gpgme_gpg_add_arg (ctx->gpg, "--output");
-  _gpgme_gpg_add_arg (ctx->gpg, "-");
-  _gpgme_gpg_add_data (ctx->gpg, plain, 1);
-  _gpgme_gpg_add_data (ctx->gpg, ciph, 0);
+  err = _gpgme_passphrase_start (ctx);
+  if (err)
+    goto leave;
+
+  _gpgme_engine_set_status_handler (ctx->engine, status_handler, ctx);
+  _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
+
+  err = _gpgme_engine_op_decrypt (ctx->engine, ciph, plain);
 
-  /* And kick off the process.  */
-  err = _gpgme_gpg_spawn (ctx->gpg, ctx);
+  if (!err)    /* And kick off the process.  */
+    err = _gpgme_engine_start (ctx->engine, ctx);
 
  leave:
   if (err)
     {
       ctx->pending = 0; 
-      _gpgme_gpg_release (ctx->gpg);
-      ctx->gpg = NULL;
+      _gpgme_engine_release (ctx->engine);
+      ctx->engine = NULL;
     }
   return err;
 }
index 84f2f687c89e1a7dd19b42aed1d142701de6e915..1e2677807c025d211f6b3a667444b7b54936c8ae 100644 (file)
@@ -48,54 +48,45 @@ delete_status_handler ( GpgmeCtx ctx, GpgStatusCode code, char *args )
 
 
 GpgmeError
-gpgme_op_delete_start ( GpgmeCtx c, const GpgmeKey key, int allow_secret )
+gpgme_op_delete_start (GpgmeCtx ctx, const GpgmeKey key, int allow_secret)
 {
-    GpgmeError rc = 0;
-    int i;
-    const char *s;
+  GpgmeError err = 0;
 
-    fail_on_pending_request( c );
-    c->pending = 1;
+  fail_on_pending_request (ctx);
+  ctx->pending = 1;
 
-    if (!key) {
-        rc = mk_error (Invalid_Value);
-        goto leave;
+  if (!key)
+    {
+      err = mk_error (Invalid_Value);
+      goto leave;
     }
 
-    if ( c->gpg ) {
-        _gpgme_gpg_release ( c->gpg ); 
-        c->gpg = NULL;
+  if (ctx->engine)
+    {
+      _gpgme_engine_release (ctx->engine); 
+      ctx->engine = NULL;
     }
     
-    rc = _gpgme_gpg_new ( &c->gpg );
-    if (rc)
-        goto leave;
+  err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+                          : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+  if (err)
+    goto leave;
 
-    _gpgme_gpg_set_status_handler ( c->gpg, delete_status_handler, c );
+  _gpgme_engine_set_status_handler (ctx->engine, delete_status_handler, ctx);
+  _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
 
-    /* build the commandline */
-    for ( i=0; i < c->verbosity; i++ )
-        _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
-    _gpgme_gpg_add_arg ( c->gpg, allow_secret?
-                         "--delete-secret-and-public-key":"--delete-key" );
-    
-    _gpgme_gpg_add_arg ( c->gpg, "--" );
-    s = gpgme_key_get_string_attr ( key, GPGME_ATTR_FPR, NULL, 0 );
-    if (!s) {
-        rc = mk_error (Invalid_Key);
-        goto leave;
-    }
-    _gpgme_gpg_add_arg ( c->gpg, s );
-
-    /* do it */
-    rc = _gpgme_gpg_spawn ( c->gpg, c );
+  err = _gpgme_engine_op_delete (ctx->engine, key, allow_secret);
+  if (!err)
+    err = _gpgme_engine_start (ctx->engine, ctx);
 
  leave:
-    if (rc) {
-        c->pending = 0; 
-        _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+  if (err)
+    {
+      ctx->pending = 0; 
+      _gpgme_engine_release (ctx->engine);
+      ctx->engine = NULL;
     }
-    return rc;
+  return err;
 }
 
 
index 2179443ed178a500ce6d9fbd8471926b3861ce99..d2463336dfcd83e2fdbf3f2a0a8e0656fc0c479e 100644 (file)
@@ -138,73 +138,64 @@ encrypt_status_handler (GpgmeCtx ctx, GpgStatusCode code, char *args)
 
 
 GpgmeError
-gpgme_op_encrypt_start ( GpgmeCtx c, GpgmeRecipients recp,
-                         GpgmeData plain, GpgmeData ciph )
+gpgme_op_encrypt_start (GpgmeCtx ctx, GpgmeRecipients recp, GpgmeData plain,
+                       GpgmeData ciph)
 {
-    int rc = 0;
-    int i;
+  int err = 0;
 
-    fail_on_pending_request( c );
-    c->pending = 1;
+  fail_on_pending_request (ctx);
+  ctx->pending = 1;
 
-    _gpgme_release_result (c);
-    c->out_of_core = 0;
+  _gpgme_release_result (ctx);
+  ctx->out_of_core = 0;
 
-    /* do some checks */
-    if ( !gpgme_recipients_count ( recp ) ) {
-        /* Fixme: In this case we should do symmentric encryption */
-        rc = mk_error (No_Recipients);
-        goto leave;
+  /* Do some checks.  */
+  if (!gpgme_recipients_count (recp))
+    {
+      /* Fixme: In this case we should do symmentric encryption.  */
+      err = mk_error (No_Recipients);
+      goto leave;
     }
-        
-    /* create a process object */
-    _gpgme_gpg_release (c->gpg); c->gpg = NULL;
-    rc = _gpgme_gpg_new ( &c->gpg );
-    if (rc)
-        goto leave;
-
-    _gpgme_gpg_set_status_handler ( c->gpg, encrypt_status_handler, c );
-
-    /* build the commandline */
-    _gpgme_gpg_add_arg ( c->gpg, "--encrypt" );
-    if ( c->use_armor )
-        _gpgme_gpg_add_arg ( c->gpg, "--armor" );
-    for ( i=0; i < c->verbosity; i++ )
-        _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
-    /* If we know that all recipients are valid (full or ultimate trust)
-     * we can suppress further checks */
-    if ( _gpgme_recipients_all_valid (recp) )
-        _gpgme_gpg_add_arg ( c->gpg, "--always-trust" );
-    
-    _gpgme_append_gpg_args_from_recipients ( recp, c->gpg );
 
-    /* Check the supplied data */
-    if ( gpgme_data_get_type (plain) == GPGME_DATA_TYPE_NONE ) {
-        rc = mk_error (No_Data);
-        goto leave;
+  /* Create an engine object.  */
+  _gpgme_engine_release (ctx->engine);
+  ctx->engine = NULL;
+  err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+                          : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+  if (err)
+    goto leave;
+
+  _gpgme_engine_set_status_handler (ctx->engine, encrypt_status_handler, ctx);
+  _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
+
+  /* Check the supplied data */
+  if (gpgme_data_get_type (plain) == GPGME_DATA_TYPE_NONE)
+    {
+      err = mk_error (No_Data);
+      goto leave;
     }
-    _gpgme_data_set_mode (plain, GPGME_DATA_MODE_OUT );
-    if ( !ciph || gpgme_data_get_type (ciph) != GPGME_DATA_TYPE_NONE ) {
-        rc = mk_error (Invalid_Value);
-        goto leave;
+  _gpgme_data_set_mode (plain, GPGME_DATA_MODE_OUT);
+  if (!ciph || gpgme_data_get_type (ciph) != GPGME_DATA_TYPE_NONE)
+    {
+      err = mk_error (Invalid_Value);
+      goto leave;
     }
-    _gpgme_data_set_mode (ciph, GPGME_DATA_MODE_IN );
-    /* Tell the gpg object about the data */
-    _gpgme_gpg_add_arg ( c->gpg, "--output" );
-    _gpgme_gpg_add_arg ( c->gpg, "-" );
-    _gpgme_gpg_add_data ( c->gpg, ciph, 1 );
-    _gpgme_gpg_add_arg ( c->gpg, "--" );
-    _gpgme_gpg_add_data ( c->gpg, plain, 0 );
+  _gpgme_data_set_mode (ciph, GPGME_DATA_MODE_IN);
+
+  err = _gpgme_engine_op_encrypt (ctx->engine, recp, plain, ciph, ctx->use_armor);
+
 
-    /* and kick off the process */
-    rc = _gpgme_gpg_spawn ( c->gpg, c );
+  if (!err)    /* And kick off the process.  */
+    err = _gpgme_engine_start (ctx->engine, ctx);
 
  leave:
-    if (rc) {
-        c->pending = 0; 
-        _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+  if (err)
+    {
+      ctx->pending = 0; 
+      _gpgme_engine_release (ctx->engine);
+      ctx->engine = NULL;
     }
-    return rc;
+  return err;
 }
 
 
index 0485fb9bead4495e2b0b4927d444804d6870e302..29c915047986baa61b148440ab272b418b781e3a 100644 (file)
@@ -155,3 +155,301 @@ _gpgme_engine_release (EngineObject engine)
     }
   xfree (engine);
 }
+
+void
+_gpgme_engine_set_verbosity (EngineObject engine, int verbosity)
+{
+  if (!engine)
+    return;
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      while (verbosity-- > 0)
+       _gpgme_gpg_add_arg (engine->engine.gpg, "--verbose");
+      break;
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+}
+
+void
+_gpgme_engine_set_status_handler (EngineObject engine,
+                                 GpgStatusHandler fnc, void *fnc_value)
+{
+  if (!engine)
+    return;
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      _gpgme_gpg_set_status_handler (engine->engine.gpg, fnc, fnc_value);
+      break;
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+}
+
+GpgmeError
+_gpgme_engine_set_command_handler (EngineObject engine,
+                                 GpgCommandHandler fnc, void *fnc_value)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_set_command_handler (engine->engine.gpg, fnc, fnc_value);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+GpgmeError _gpgme_engine_set_colon_line_handler (EngineObject engine,
+                                                GpgColonLineHandler fnc,
+                                                void *fnc_value)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_set_colon_line_handler (engine->engine.gpg, fnc,
+                                               fnc_value);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_decrypt (EngineObject engine, GpgmeData ciph, GpgmeData plain)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_op_decrypt (engine->engine.gpg, ciph, plain);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_delete (EngineObject engine, GpgmeKey key, int allow_secret)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_op_delete (engine->engine.gpg, key, allow_secret);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_encrypt (EngineObject engine, GpgmeRecipients recp,
+                         GpgmeData plain, GpgmeData ciph, int use_armor)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_op_encrypt (engine->engine.gpg, recp, plain, ciph,
+                                   use_armor);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_export (EngineObject engine, GpgmeRecipients recp,
+                        GpgmeData keydata, int use_armor)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_op_export (engine->engine.gpg, recp, keydata,
+                                  use_armor);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_genkey (EngineObject engine, GpgmeData help_data, int use_armor)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_op_genkey (engine->engine.gpg, help_data, use_armor);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_import (EngineObject engine, GpgmeData keydata)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_op_import (engine->engine.gpg, keydata);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_keylist (EngineObject engine, const char *pattern, int secret_only,
+                         int keylist_mode)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_op_keylist (engine->engine.gpg, pattern, secret_only,
+                                   keylist_mode);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_sign (EngineObject engine, GpgmeData in, GpgmeData out,
+                   GpgmeSigMode mode, int use_armor,
+                   int use_textmode, GpgmeCtx ctx /* FIXME */)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_op_sign (engine->engine.gpg, in, out, mode, use_armor,
+                                use_textmode, ctx);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_trustlist (EngineObject engine, const char *pattern)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_op_trustlist (engine->engine.gpg, pattern);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_verify (EngineObject engine, GpgmeData sig, GpgmeData text)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_op_verify (engine->engine.gpg, sig, text);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+GpgmeError _gpgme_engine_start (EngineObject engine, void *opaque)
+{
+  if (!engine)
+    return mk_error (Invalid_Value);
+
+  switch (engine->protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return _gpgme_gpg_spawn (engine->engine.gpg, opaque);
+    case GPGME_PROTOCOL_CMS:
+      /* FIXME */
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
index 372128b755acda2829f732a3c0413918a5bc485f..a2f2f6c2be1a0a0f0a9db9b3b4547d8e83d4b939 100644 (file)
 #define ENGINE_H
 
 #include "types.h"
+#include "rungpg.h"
 
 const char *_gpgme_engine_get_path (GpgmeProtocol proto);
 const char *_gpgme_engine_get_version (GpgmeProtocol proto);
 GpgmeError _gpgme_engine_new (GpgmeProtocol proto, EngineObject *r_engine);
 void _gpgme_engine_release (EngineObject engine);
+void _gpgme_engine_set_status_handler (EngineObject engine,
+                                      GpgStatusHandler fnc, void *fnc_value);
+GpgmeError _gpgme_engine_set_command_handler (EngineObject engine,
+                                             GpgCommandHandler fnc,
+                                             void *fnc_value);
+GpgmeError _gpgme_engine_set_colon_line_handler (EngineObject gpg,
+                                                GpgColonLineHandler fnc,
+                                                void *fnc_value);
+void _gpgme_engine_set_verbosity (EngineObject engine, int verbosity);
+GpgmeError _gpgme_engine_op_decrypt (EngineObject engine, GpgmeData ciph,
+                                    GpgmeData plain);
+GpgmeError _gpgme_engine_op_delete (EngineObject engine, GpgmeKey key,
+                                   int allow_secret);
+GpgmeError _gpgme_engine_op_encrypt (EngineObject engine, GpgmeRecipients recp,
+                                    GpgmeData plain, GpgmeData ciph,
+                                    int use_armor);
+GpgmeError _gpgme_engine_op_export (EngineObject engine, GpgmeRecipients recp,
+                                   GpgmeData keydata, int use_armor);
+GpgmeError _gpgme_engine_op_genkey (EngineObject engine, GpgmeData help_data,
+                                   int use_armor);
+GpgmeError _gpgme_engine_op_import (EngineObject engine, GpgmeData keydata);
+GpgmeError _gpgme_engine_op_keylist (EngineObject engine, const char *pattern,
+                                    int secret_only,
+                                    int keylist_mode);
+GpgmeError _gpgme_engine_op_sign (EngineObject engine, GpgmeData in,
+                                 GpgmeData out, GpgmeSigMode mode,
+                                 int use_armor, int use_textmode,
+                                 GpgmeCtx ctx /* FIXME */);
+GpgmeError _gpgme_engine_op_trustlist (EngineObject engine,
+                                      const char *pattern);
+GpgmeError _gpgme_engine_op_verify (EngineObject engine, GpgmeData sig,
+                                   GpgmeData text);
+GpgmeError _gpgme_engine_start (EngineObject engine, void *opaque);
 
 #endif /* ENGINE_H */
index 506b3a0301d59a51533f1ab3f4ed05245cf300b2..e5f51abc5572c8821a5b5d85253e8ec41dde13b7 100644 (file)
@@ -36,66 +36,46 @@ export_status_handler ( GpgmeCtx ctx, GpgStatusCode code, char *args )
     /* FIXME: Need to do more */
 }
 
-
 GpgmeError
-gpgme_op_export_start ( GpgmeCtx c, GpgmeRecipients recp,
-                         GpgmeData keydata )
+gpgme_op_export_start (GpgmeCtx ctx, GpgmeRecipients recp, GpgmeData keydata)
 {
-    int rc = 0;
-    int i;
-
-    fail_on_pending_request( c );
-    c->pending = 1;
+  GpgmeError err = 0;
 
-    /* create a process object */
-    _gpgme_gpg_release (c->gpg); c->gpg = NULL;
-    rc = _gpgme_gpg_new ( &c->gpg );
-    if (rc)
-        goto leave;
+  fail_on_pending_request (ctx);
+  ctx->pending = 1;
 
-    _gpgme_gpg_set_status_handler ( c->gpg, export_status_handler, c );
+  _gpgme_engine_release (ctx->engine);
+  ctx->engine = NULL;
 
-    /* build the commandline */
-    _gpgme_gpg_add_arg ( c->gpg, "--export" );
-    if ( c->use_armor )
-        _gpgme_gpg_add_arg ( c->gpg, "--armor" );
-    for ( i=0; i < c->verbosity; i++ )
-        _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
+  err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+                          : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+  if (err)
+    goto leave;
 
-    if ( !keydata || gpgme_data_get_type (keydata) != GPGME_DATA_TYPE_NONE ) {
-        rc = mk_error (Invalid_Value);
-        goto leave;
+  if (!keydata || gpgme_data_get_type (keydata) != GPGME_DATA_TYPE_NONE)
+    {
+      err = mk_error (Invalid_Value);
+      goto leave;
     }
-    _gpgme_data_set_mode (keydata, GPGME_DATA_MODE_IN );
-    _gpgme_gpg_add_data ( c->gpg, keydata, 1 );
-    _gpgme_gpg_add_arg ( c->gpg, "--" );
+  _gpgme_data_set_mode (keydata, GPGME_DATA_MODE_IN);
 
-    { 
-       void *ec;
-       const char *s;
-    
-       rc = gpgme_recipients_enum_open ( recp, &ec );
-       if ( rc )
-           goto leave;
-       while ( (s = gpgme_recipients_enum_read ( recp, &ec )) )
-           _gpgme_gpg_add_arg (c->gpg, s);
-       rc = gpgme_recipients_enum_close ( recp, &ec );
-       if ( rc )
-           goto leave;
-    }
+  _gpgme_engine_set_status_handler (ctx->engine, export_status_handler, ctx);
+  _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
 
-    rc = _gpgme_gpg_spawn ( c->gpg, c );
+  err = _gpgme_engine_op_export (ctx->engine, recp, keydata, ctx->use_armor);
+  if (!err)
+    err = _gpgme_engine_start (ctx->engine, ctx);
 
  leave:
-    if (rc) {
-        c->pending = 0; 
-        _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+  if (err)
+    {
+      ctx->pending = 0; 
+      _gpgme_engine_release (ctx->engine);
+      ctx->engine = NULL;
     }
-    return rc;
+  return err;
 }
 
-
-
 /**
  * gpgme_op_export:
  * @c: the context
index bb0351cccadace2ab652c9747942b8200cc27338..033369aea83867e66c08a27550e2049a33c9cf5f 100644 (file)
@@ -104,93 +104,92 @@ genkey_status_handler ( GpgmeCtx ctx, GpgStatusCode code, char *args )
  * 
  * Return value: 0 for success or an error code
  **/
-
 GpgmeError
-gpgme_op_genkey_start ( GpgmeCtx c, const char *parms,
-                        GpgmeData pubkey, GpgmeData seckey )
+gpgme_op_genkey_start (GpgmeCtx ctx, const char *parms,
+                      GpgmeData pubkey, GpgmeData seckey)
 {
-    int rc = 0;
-    int i;
-    const char *s, *s2, *sx;
-
-    fail_on_pending_request( c );
-    c->pending = 1;
-
-    gpgme_data_release (c->help_data_1); c->help_data_1 = NULL;
-
-    /* create a process object */
-    _gpgme_gpg_release (c->gpg); c->gpg = NULL;
-    rc = _gpgme_gpg_new ( &c->gpg );
-    if (rc)
-        goto leave;
-
-    /* We need a special mechanism to get the fd of a pipe here, so
-     * that we can use this for the %pubring and %secring parameters.
-     * We don't have this yet, so we implement only the adding to the
-     * standard keyrings */
-    if ( pubkey || seckey ) {
-        rc = mk_error (Not_Implemented);
-        goto leave;
+  int err = 0;
+  int i;
+  const char *s, *s2, *sx;
+
+  fail_on_pending_request (ctx);
+  ctx->pending = 1;
+
+  gpgme_data_release (ctx->help_data_1);
+  ctx->help_data_1 = NULL;
+
+  _gpgme_engine_release (ctx->engine);
+  ctx->engine = NULL;
+  err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+                          : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+  if (err)
+    goto leave;
+
+  /* We need a special mechanism to get the fd of a pipe here, so
+   * that we can use this for the %pubring and %secring parameters.
+   * We don't have this yet, so we implement only the adding to the
+   * standard keyrings */
+  if (pubkey || seckey)
+    {
+      err = mk_error (Not_Implemented);
+      goto leave;
     }
 
-    _gpgme_gpg_set_status_handler ( c->gpg, genkey_status_handler, c );
-
-    /* build the commandline */
-    _gpgme_gpg_add_arg ( c->gpg, "--gen-key" );
-    if ( c->use_armor )
-        _gpgme_gpg_add_arg ( c->gpg, "--armor" );
-    for ( i=0; i < c->verbosity; i++ )
-        _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
-
-    if ( !pubkey && !seckey )
-        ; /* okay: Add key to the keyrings */
-    else if ( !pubkey
-              || gpgme_data_get_type (pubkey) != GPGME_DATA_TYPE_NONE ) {
-        rc = mk_error (Invalid_Value);
-        goto leave;
+  if (!pubkey && !seckey)
+    ; /* okay: Add key to the keyrings */
+  else if (!pubkey || gpgme_data_get_type (pubkey) != GPGME_DATA_TYPE_NONE)
+    {
+      err = mk_error (Invalid_Value);
+      goto leave;
     }
-    else if ( !seckey
-              || gpgme_data_get_type (seckey) != GPGME_DATA_TYPE_NONE ) {
-        rc = mk_error (Invalid_Value);
-        goto leave;
+  else if (!seckey || gpgme_data_get_type (seckey) != GPGME_DATA_TYPE_NONE)
+    {
+      err = mk_error (Invalid_Value);
+      goto leave;
     }
     
-    if ( pubkey ) {
-        _gpgme_data_set_mode (pubkey, GPGME_DATA_MODE_IN );
-        _gpgme_data_set_mode (seckey, GPGME_DATA_MODE_IN );
-        /* need some more things here */
+  if (pubkey)
+    {
+      _gpgme_data_set_mode (pubkey, GPGME_DATA_MODE_IN);
+      _gpgme_data_set_mode (seckey, GPGME_DATA_MODE_IN);
+      /* FIXME: Need some more things here.  */
     }
 
-
-    if ( (parms = strstr (parms, "<GnupgKeyParms ")) 
-         && (s = strchr (parms, '>'))
-         && (sx = strstr (parms, "format=\"internal\""))
-         && sx < s
-         && (s2 = strstr (s+1, "</GnupgKeyParms>")) ) {
-        /* fixme: check that there are no control statements inside */
-        rc = gpgme_data_new_from_mem ( &c->help_data_1, s+1, s2-s-1, 1 );
+  if ((parms = strstr (parms, "<GnupgKeyParms ")) 
+      && (s = strchr (parms, '>'))
+      && (sx = strstr (parms, "format=\"internal\""))
+      && sx < s
+      && (s2 = strstr (s+1, "</GnupgKeyParms>")))
+    {
+      /* FIXME: Check that there are no control statements inside.  */
+      err = gpgme_data_new_from_mem (&ctx->help_data_1, s+1, s2-s-1, 1);
     }
-    else 
-        rc = mk_error (Invalid_Value);
+  else 
+    err = mk_error (Invalid_Value);
 
-    if (rc )
-        goto leave;
+  if (err)
+    goto leave;
     
-    _gpgme_data_set_mode (c->help_data_1, GPGME_DATA_MODE_OUT );
-    _gpgme_gpg_add_data (c->gpg, c->help_data_1, 0);
+  _gpgme_data_set_mode (ctx->help_data_1, GPGME_DATA_MODE_OUT);
+
+  _gpgme_engine_set_status_handler (ctx->engine, genkey_status_handler, ctx);
+  _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
+
+  err = _gpgme_engine_op_genkey (ctx->engine, ctx->help_data_1, ctx->use_armor);
+
+  if (!err)
+    err = _gpgme_engine_start (ctx->engine, ctx);
 
-    rc = _gpgme_gpg_spawn ( c->gpg, c );
-    
  leave:
-    if (rc) {
-        c->pending = 0; 
-        _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+  if (err)
+    {
+      ctx->pending = 0; 
+      _gpgme_engine_release (ctx->engine);
+      ctx->engine = NULL;
     }
-    return rc;
+  return err;
 }
 
-
-
 /**
  * gpgme_op_genkey:
  * @c: the context
index 2e010bc50bb5990840bfe0d29eee5da8741ce2fa..917f150ec565c1edabaab039878246f6e997946a 100644 (file)
@@ -64,23 +64,22 @@ gpgme_new (GpgmeCtx *r_ctx)
  * Release all resources associated with the given context.
  **/
 void
-gpgme_release ( GpgmeCtx c )
+gpgme_release (GpgmeCtx c)
 {
-    if (!c)
-        return;
-    _gpgme_gpg_release ( c->gpg ); 
-    _gpgme_release_result ( c );
-    gpgme_key_release ( c->tmp_key );
-    gpgme_data_release ( c->help_data_1 );
-    gpgme_data_release ( c->notation );
-    gpgme_signers_clear (c);
-    if (c->signers)
-        xfree (c->signers);
-    /* fixme: release the key_queue */
-    xfree (c);
+  if (!c)
+    return;
+  _gpgme_engine_release (c->engine); 
+  _gpgme_release_result (c);
+  gpgme_key_release (c->tmp_key);
+  gpgme_data_release (c->help_data_1);
+  gpgme_data_release (c->notation);
+  gpgme_signers_clear (c);
+  if (c->signers)
+    xfree (c->signers);
+  /* FIXME: Release the key_queue.  */
+  xfree (c);
 }
 
-
 void
 _gpgme_release_result (GpgmeCtx c)
 {
index 357fa88769492266e577209178cd8527e9a60583..de0b894b7202c413a41c6bad27f5ca641a1ca9bd 100644 (file)
@@ -38,50 +38,47 @@ import_status_handler ( GpgmeCtx ctx, GpgStatusCode code, char *args )
      * a progress callback */
 }
 
-
-
 GpgmeError
-gpgme_op_import_start ( GpgmeCtx c, GpgmeData keydata )
+gpgme_op_import_start (GpgmeCtx ctx, GpgmeData keydata)
 {
-    int rc = 0;
-    int i;
-
-    fail_on_pending_request( c );
-    c->pending = 1;
-
-    /* create a process object */
-    _gpgme_gpg_release (c->gpg); c->gpg = NULL;
-    rc = _gpgme_gpg_new ( &c->gpg );
-    if (rc)
-        goto leave;
-
-    _gpgme_gpg_set_status_handler ( c->gpg, import_status_handler, c );
-
-    /* build the commandline */
-    _gpgme_gpg_add_arg ( c->gpg, "--import" );
-    for ( i=0; i < c->verbosity; i++ )
-        _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
-    
-    /* Check the supplied data */
-    if ( gpgme_data_get_type (keydata) == GPGME_DATA_TYPE_NONE ) {
-        rc = mk_error (No_Data);
-        goto leave;
+  int err = 0;
+
+  fail_on_pending_request (ctx);
+  ctx->pending = 1;
+
+  _gpgme_engine_release (ctx->engine);
+  ctx->engine = NULL;
+  err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+                          : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+  if (err)
+    goto leave;
+
+  /* Check the supplied data */
+  if (gpgme_data_get_type (keydata) == GPGME_DATA_TYPE_NONE)
+    {
+      err = mk_error (No_Data);
+      goto leave;
     }
-    _gpgme_data_set_mode (keydata, GPGME_DATA_MODE_OUT );
+  _gpgme_data_set_mode (keydata, GPGME_DATA_MODE_OUT);
+
+  _gpgme_engine_set_status_handler (ctx->engine, import_status_handler, ctx);
+  _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
 
-    _gpgme_gpg_add_data ( c->gpg, keydata, 0 );
+  _gpgme_engine_op_import (ctx->engine, keydata);
 
-    rc = _gpgme_gpg_spawn ( c->gpg, c );
+  if (!err)
+    err = _gpgme_engine_start (ctx->engine, ctx);
 
  leave:
-    if (rc) {
-        c->pending = 0; 
-        _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+  if (err)
+    {
+      ctx->pending = 0;
+      _gpgme_engine_release (ctx->engine);
+      ctx->engine = NULL;
     }
-    return rc;
+  return err;
 }
 
-
 /**
  * gpgme_op_import:
  * @c: Context 
index ebdb707a83d174e267117b557d01c94ea0dac52d..2685f4f68204795e4d0be905fbf4a515cd93cafa 100644 (file)
@@ -383,62 +383,51 @@ finish_key ( GpgmeCtx ctx )
  * Return value:  0 on success or an errorcode. 
  **/
 GpgmeError
-gpgme_op_keylist_start ( GpgmeCtx c,  const char *pattern, int secret_only )
+gpgme_op_keylist_start (GpgmeCtx ctx, const char *pattern, int secret_only)
 {
-    GpgmeError rc = 0;
-    int i;
+  GpgmeError err = 0;
 
-    if ( !c )
-        return mk_error (Invalid_Value);
-    c->pending = 1;
+  if (!ctx)
+    return mk_error (Invalid_Value);
+  ctx->pending = 1;
 
-    _gpgme_release_result (c);
-    c->out_of_core = 0;
+  _gpgme_release_result (ctx);
+  ctx->out_of_core = 0;
 
-    if ( c->gpg ) {
-        _gpgme_gpg_release ( c->gpg ); 
-        c->gpg = NULL;
+  if (ctx->engine)
+    {
+      _gpgme_engine_release (ctx->engine); 
+      ctx->engine = NULL;
     }
-    gpgme_key_release (c->tmp_key);
-    c->tmp_key = NULL;
-    /* Fixme: release key_queue */
-    
-    rc = _gpgme_gpg_new ( &c->gpg );
-    if (rc)
-        goto leave;
-
-    _gpgme_gpg_set_status_handler ( c->gpg, keylist_status_handler, c );
-
-    rc = _gpgme_gpg_set_colon_line_handler ( c->gpg,
-                                             keylist_colon_handler, c );
-    if (rc)
-        goto leave;
-
-    /* build the commandline */
-    for ( i=0; i < c->verbosity; i++ )
-        _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
-    _gpgme_gpg_add_arg ( c->gpg, "--with-colons" );
-    _gpgme_gpg_add_arg ( c->gpg, "--fixed-list-mode" );
-    _gpgme_gpg_add_arg ( c->gpg, "--with-fingerprint" );
-    if (c->keylist_mode == 1)
-        _gpgme_gpg_add_arg ( c->gpg, "--no-expensive-trust-checks" );
-    _gpgme_gpg_add_arg ( c->gpg, secret_only?
-                         "--list-secret-keys":"--list-keys" );
+  gpgme_key_release (ctx->tmp_key);
+  ctx->tmp_key = NULL;
+  /* Fixme: Release key_queue.  */
     
-    /* Tell the gpg object about the data */
-    _gpgme_gpg_add_arg ( c->gpg, "--" );
-    if (pattern && *pattern)
-        _gpgme_gpg_add_arg ( c->gpg, pattern );
+  err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+                          : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+  if (err)
+    goto leave;
+
+  _gpgme_engine_set_status_handler (ctx->engine, keylist_status_handler, ctx);
+  err = _gpgme_engine_set_colon_line_handler (ctx->engine,
+                                             keylist_colon_handler, ctx);
+  if (err)
+    goto leave;
+  _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
+
+  err = _gpgme_engine_op_keylist (ctx->engine, pattern, secret_only, ctx->keylist_mode);
 
-    /* and kick off the process */
-    rc = _gpgme_gpg_spawn ( c->gpg, c );
+  if (!err)    /* And kick off the process.  */
+    err = _gpgme_engine_start (ctx->engine, ctx);
 
  leave:
-    if (rc) {
-        c->pending = 0; 
-        _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+  if (err)
+    {
+      ctx->pending = 0; 
+      _gpgme_engine_release (ctx->engine);
+      ctx->engine = NULL;
     }
-    return rc;
+  return err;
 }
 
 
index f061897357d0cd0109151636cd9d38cec03d9364..044bcef5c8780000a40c577e0a71ceb90b7c1b02 100644 (file)
@@ -37,9 +37,6 @@ void _gpgme_thaw_fd ( int fd );
 
 
 /*-- recipient.c --*/
-void _gpgme_append_gpg_args_from_recipients (
-    const GpgmeRecipients rset,
-    GpgObject gpg );
 int _gpgme_recipients_all_valid ( const GpgmeRecipients rset );
 
 
index 0ecea6dd182436deedb2610fcde168a513e6a297..b821bbef7926f25ada278e5355755f290d9821bb 100644 (file)
@@ -168,7 +168,7 @@ _gpgme_passphrase_start (GpgmeCtx ctx)
   GpgmeError err = 0;
 
   if (ctx->passphrase_cb)
-    err = _gpgme_gpg_set_command_handler (ctx->gpg, command_handler, ctx);
+    err = _gpgme_engine_set_command_handler (ctx->engine, command_handler, ctx);
   return err;
 }
 
index 284b658fb7e16fde3dbfbd316004f38c216dcc54..f1899ce9c232d4cf168426c28287f46060943933 100644 (file)
@@ -222,21 +222,6 @@ gpgme_recipients_enum_close ( const GpgmeRecipients rset, void **ctx )
     return 0;
 }
 
-
-void
-_gpgme_append_gpg_args_from_recipients (
-    const GpgmeRecipients rset,
-    GpgObject gpg )
-{
-    struct user_id_s *r;
-
-    assert (rset);
-    for (r=rset->list ; r; r = r->next ) {
-        _gpgme_gpg_add_arg ( gpg, "-r" );
-        _gpgme_gpg_add_arg ( gpg, r->name );
-    }    
-}
-
 int
 _gpgme_recipients_all_valid ( const GpgmeRecipients rset )
 {
index df3bcf8245f1416d8148aeeb24ddc78fbc22d722..940f971b93f0ef6f9a4e40ea5e49490c3457724d 100644 (file)
@@ -1434,6 +1434,273 @@ command_cb ( void *opaque, char *buffer, size_t length, size_t *nread )
     return 0;
 }
 
+GpgmeError
+_gpgme_gpg_op_decrypt (GpgObject gpg, GpgmeData ciph, GpgmeData plain)
+{
+  GpgmeError err;
+
+  err = _gpgme_gpg_add_arg (gpg, "--decrypt");
+
+  /* Tell the gpg object about the data.  */
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, "--output");
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, "-");
+  if (!err)
+    err = _gpgme_gpg_add_data (gpg, plain, 1);
+  if (!err)
+    err = _gpgme_gpg_add_data (gpg, ciph, 0);
+
+  return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_delete (GpgObject gpg, GpgmeKey key, int allow_secret)
+{
+  GpgmeError err;
+
+  err = _gpgme_gpg_add_arg (gpg, allow_secret
+                           ? "--delete-secret-and-public-key"
+                           : "--delete-key");
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, "--");
+  if (!err)
+    {
+      const char *s = gpgme_key_get_string_attr (key, GPGME_ATTR_FPR, NULL, 0);
+      if (!s)
+       err = mk_error (Invalid_Key);
+      else
+       err = _gpgme_gpg_add_arg (gpg, s);
+    }
+
+  return err;
+}
+
+static GpgmeError
+_gpgme_append_gpg_args_from_recipients (GpgObject gpg,
+                                       const GpgmeRecipients rset)
+{
+  GpgmeError err = 0;
+  struct user_id_s *r;
+
+  assert (rset);
+  for (r = rset->list; r; r = r->next)
+    {
+      err = _gpgme_gpg_add_arg (gpg, "-r");
+      if (!err)
+       _gpgme_gpg_add_arg (gpg, r->name);
+      if (err)
+       break;
+    }    
+  return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_encrypt (GpgObject gpg, GpgmeRecipients recp,
+                      GpgmeData plain, GpgmeData ciph, int use_armor)
+{
+  GpgmeError err;
+
+  err = _gpgme_gpg_add_arg (gpg, "--encrypt");
+  if (!err && use_armor)
+    err = _gpgme_gpg_add_arg (gpg, "--armor");
+
+  /* If we know that all recipients are valid (full or ultimate trust)
+   * we can suppress further checks */
+  if (!err && _gpgme_recipients_all_valid (recp))
+    err = _gpgme_gpg_add_arg (gpg, "--always-trust");
+
+  if (!err)
+    err = _gpgme_append_gpg_args_from_recipients (gpg, recp);
+
+  /* Tell the gpg object about the data.  */
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, "--output");
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, "-");
+  if (!err)
+    err = _gpgme_gpg_add_data (gpg, ciph, 1);
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, "--");
+  if (!err)
+    err = _gpgme_gpg_add_data (gpg, plain, 0);
+
+  return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_export (GpgObject gpg, GpgmeRecipients recp,
+                     GpgmeData keydata, int use_armor)
+{
+  GpgmeError err;
+
+  err = _gpgme_gpg_add_arg (gpg, "--export");
+  if (!err && use_armor)
+    err = _gpgme_gpg_add_arg (gpg, "--armor");
+  if (!err)
+    err = _gpgme_gpg_add_data (gpg, keydata, 1);
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, "--");
+
+  if (!err)
+    {
+      void *ec;
+      const char *s;
+
+      err = gpgme_recipients_enum_open (recp, &ec);
+      while (!err && (s = gpgme_recipients_enum_read (recp, &ec)))
+       err = _gpgme_gpg_add_arg (gpg, s);
+      if (!err)
+       err = gpgme_recipients_enum_close (recp, &ec);
+    }
+
+  return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_genkey (GpgObject gpg, GpgmeData help_data, int use_armor)
+{
+  GpgmeError err;
 
+  err = _gpgme_gpg_add_arg (gpg, "--gen-key");
+  if (!err && use_armor)
+    err = _gpgme_gpg_add_arg (gpg, "--armor");
+  if (!err)
+    err = _gpgme_gpg_add_data (gpg, help_data, 0);
 
+  return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_import (GpgObject gpg, GpgmeData keydata)
+{
+  GpgmeError err;
+
+  err = _gpgme_gpg_add_arg (gpg, "--import");
+  if (!err)
+    err = _gpgme_gpg_add_data (gpg, keydata, 0);
+
+  return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_keylist (GpgObject gpg, const char *pattern, int secret_only,
+                      int keylist_mode)
+{
+  GpgmeError err;
+
+  err = _gpgme_gpg_add_arg (gpg, "--with-colons");
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, "--fixed-list-mode");
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, "--with-fingerprint");
+  if (!err && keylist_mode == 1)
+    err = _gpgme_gpg_add_arg (gpg, "--no-expensive-trust-checks");
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, secret_only ? "--list-secret-keys"
+                             : "--list-keys");
+  
+  /* Tell the gpg object about the data */
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, "--");
+  if (!err && pattern && *pattern)
+    err = _gpgme_gpg_add_arg (gpg, pattern);
+
+  return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_sign (GpgObject gpg, GpgmeData in, GpgmeData out,
+                   GpgmeSigMode mode, int use_armor,
+                   int use_textmode, GpgmeCtx ctx /* FIXME */)
+{
+  GpgmeError err;
+  GpgmeKey key;
+  int i;
+
+  if (mode == GPGME_SIG_MODE_CLEAR)
+    err = _gpgme_gpg_add_arg (gpg, "--clearsign");
+  else
+    {
+      err = _gpgme_gpg_add_arg (gpg, "--sign");
+      if (!err && mode == GPGME_SIG_MODE_DETACH)
+       err = _gpgme_gpg_add_arg (gpg, "--detach");
+      if (!err && use_armor)
+       err = _gpgme_gpg_add_arg (gpg, "--armor");
+      if (!err && use_textmode)
+       _gpgme_gpg_add_arg (gpg, "--textmode");
+    }
+  for (i = 0; (key = gpgme_signers_enum (ctx, i)); i++)
+    {
+      const char *s = gpgme_key_get_string_attr (key, GPGME_ATTR_KEYID,
+                                                NULL, 0);
+      if (s)
+       {
+         if (!err)
+           err = _gpgme_gpg_add_arg (gpg, "-u");
+         if (!err)
+           err = _gpgme_gpg_add_arg (gpg, s);
+       }
+      gpgme_key_unref (key);
+      if (err) break;
+    }
+
+  /* Tell the gpg object about the data.  */
+  if (!err)
+    err = _gpgme_gpg_add_data (gpg, in, 0);
+  if (!err)
+    err = _gpgme_gpg_add_data (gpg, out, 1);
+
+  return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_trustlist (GpgObject gpg, const char *pattern)
+{
+  GpgmeError err;
+
+  err = _gpgme_gpg_add_arg (gpg, "--with-colons");
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, "--list-trust-path");
+  
+  /* Tell the gpg object about the data */
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, "--");
+  if (!err)
+    err = _gpgme_gpg_add_arg (gpg, pattern);
+
+  return err;
+}
 
+GpgmeError
+_gpgme_gpg_op_verify (GpgObject gpg, GpgmeData sig, GpgmeData text)
+{
+  GpgmeError err = 0;
+
+  if (gpg->pm.used)
+    {
+      err = _gpgme_gpg_add_arg (gpg, gpg->pm.used ? "--pipemode" : "--verify");
+      if (!err)
+       err = _gpgme_gpg_add_arg (gpg, "--");
+      if (!err)
+       err = _gpgme_gpg_add_pm_data (gpg, sig, 0);
+      if (!err)
+       err = _gpgme_gpg_add_pm_data (gpg, text, 1);
+    }
+  else
+    {
+      err = _gpgme_gpg_add_arg (gpg, "--verify");
+      if (!err)
+       err = _gpgme_gpg_add_arg (gpg, "--");
+      if (!err)
+       err = _gpgme_gpg_add_data (gpg, sig, -1);
+      if (text)
+       {
+         if (!err)
+           err = _gpgme_gpg_add_arg (gpg, "-");
+         if (!err)
+           err = _gpgme_gpg_add_data (gpg, text, 0);
+       }
+    }
+  return err;
+}
index fbbdbf9a8a5d942fce1adaa4f2baf58be3ba113a..3ca993ce22a9162c6dd3b2b30813d2533f84044b 100644 (file)
@@ -119,14 +119,24 @@ GpgmeError _gpgme_gpg_set_command_handler ( GpgObject gpg,
                                             GpgCommandHandler fnc,
                                             void *fnc_value );
 
-GpgmeError _gpgme_gpg_spawn ( GpgObject gpg, void *opaque );
-
-
+GpgmeError _gpgme_gpg_op_decrypt (GpgObject gpg, GpgmeData ciph,
+                                 GpgmeData plain);
+GpgmeError _gpgme_gpg_op_delete (GpgObject gpg, GpgmeKey key, int allow_secret);
+GpgmeError _gpgme_gpg_op_encrypt (GpgObject gpg, GpgmeRecipients recp,
+                                 GpgmeData plain, GpgmeData ciph,
+                                 int use_armor);
+GpgmeError _gpgme_gpg_op_export (GpgObject gpg, GpgmeRecipients recp,
+                                GpgmeData keydata, int use_armor);
+GpgmeError _gpgme_gpg_op_genkey (GpgObject gpg, GpgmeData help_data,
+                                int use_armor);
+GpgmeError _gpgme_gpg_op_import (GpgObject gpg, GpgmeData keydata);
+GpgmeError _gpgme_gpg_op_keylist (GpgObject gpg, const char *pattern,
+                                 int secret_only, int keylist_mode);
+GpgmeError _gpgme_gpg_op_sign (GpgObject gpg, GpgmeData in, GpgmeData out,
+                              GpgmeSigMode mode, int use_armor,
+                              int use_textmode, GpgmeCtx ctx /* FIXME */);
+GpgmeError _gpgme_gpg_op_trustlist (GpgObject gpg, const char *pattern);
+GpgmeError _gpgme_gpg_op_verify (GpgObject gpg, GpgmeData sig, GpgmeData text);
+GpgmeError _gpgme_gpg_spawn (GpgObject gpg, void *opaque);
 
 #endif /* RUNGPG_H */
-
-
-
-
-
-
index dc53b7b0b8b8d951f557e508f717fa732c2569c2..448381d78b0c9d2614015e9afab94a334f27e340 100644 (file)
@@ -177,8 +177,6 @@ gpgme_op_sign_start (GpgmeCtx ctx, GpgmeData in, GpgmeData out,
                     GpgmeSigMode mode)
 {
   GpgmeError err = 0;
-  int i;
-  GpgmeKey key;
 
   fail_on_pending_request (ctx);
   ctx->pending = 1;
@@ -192,45 +190,13 @@ gpgme_op_sign_start (GpgmeCtx ctx, GpgmeData in, GpgmeData out,
     return mk_error (Invalid_Value);
         
   /* Create a process object.  */
-  _gpgme_gpg_release (ctx->gpg);
-  ctx->gpg = NULL;
-  err = _gpgme_gpg_new (&ctx->gpg);
+  _gpgme_engine_release (ctx->engine);
+  ctx->engine = NULL;
+  err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+                          : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
   if (err)
     goto leave;
 
-  _gpgme_gpg_set_status_handler (ctx->gpg, sign_status_handler, ctx);
-
-  err = _gpgme_passphrase_start (ctx);
-  if (err)
-    goto leave;
-
-  /* Build the commandline.  */
-  if (mode == GPGME_SIG_MODE_CLEAR)
-    _gpgme_gpg_add_arg (ctx->gpg, "--clearsign");
-  else
-    {
-      _gpgme_gpg_add_arg (ctx->gpg, "--sign");
-      if (mode == GPGME_SIG_MODE_DETACH)
-       _gpgme_gpg_add_arg (ctx->gpg, "--detach");
-      if (ctx->use_armor)
-       _gpgme_gpg_add_arg (ctx->gpg, "--armor");
-      if (ctx->use_textmode)
-       _gpgme_gpg_add_arg (ctx->gpg, "--textmode");
-    }
-  for (i = 0; i < ctx->verbosity; i++)
-    _gpgme_gpg_add_arg (ctx->gpg, "--verbose");
-  for (i = 0; (key = gpgme_signers_enum (ctx, i)); i++)
-    {
-      const char *s = gpgme_key_get_string_attr (key, GPGME_ATTR_KEYID,
-                                                NULL, 0);
-        if (s)
-         {
-            _gpgme_gpg_add_arg (ctx->gpg, "-u");
-            _gpgme_gpg_add_arg (ctx->gpg, s);
-         }
-        gpgme_key_unref (key);
-    }
-    
   /* Check the supplied data.  */
   if (gpgme_data_get_type (in) == GPGME_DATA_TYPE_NONE)
     {
@@ -245,19 +211,25 @@ gpgme_op_sign_start (GpgmeCtx ctx, GpgmeData in, GpgmeData out,
     }
   _gpgme_data_set_mode (out, GPGME_DATA_MODE_IN);
 
-  /* Tell the gpg object about the data.  */
-  _gpgme_gpg_add_data (ctx->gpg, in, 0);
-  _gpgme_gpg_add_data (ctx->gpg, out, 1);
+  err = _gpgme_passphrase_start (ctx);
+  if (err)
+    goto leave;
+
+  _gpgme_engine_set_status_handler (ctx->engine, sign_status_handler, ctx);
+  _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
+
+  _gpgme_engine_op_sign (ctx->engine, in, out, mode, ctx->use_armor,
+                        ctx->use_textmode, ctx /* FIXME */);
 
   /* And kick off the process.  */
-  err = _gpgme_gpg_spawn (ctx->gpg, ctx);
+  err = _gpgme_engine_start (ctx->engine, ctx);
   
  leave:
   if (err)
     {
       ctx->pending = 0; 
-      _gpgme_gpg_release (ctx->gpg);
-      ctx->gpg = NULL;
+      _gpgme_engine_release (ctx->engine);
+      ctx->engine = NULL;
     }
   return err;
 }
index c6ba8e8bc53a27e91c1a948f3f3d28f81fb8ba03..664962a41a09369872f44639530463623d53ecf5 100644 (file)
@@ -154,55 +154,49 @@ trustlist_colon_handler ( GpgmeCtx ctx, char *line )
         ctx->key_cond = 1;
 }
 
-
-
 GpgmeError
-gpgme_op_trustlist_start ( GpgmeCtx c, const char *pattern, int max_level )
+gpgme_op_trustlist_start (GpgmeCtx ctx, const char *pattern, int max_level)
 {
-    GpgmeError rc = 0;
+  GpgmeError err = 0;
 
-    fail_on_pending_request( c );
-    if ( !pattern || !*pattern ) {
-        return mk_error (Invalid_Value);
-    }
+  fail_on_pending_request (ctx);
+  if (!pattern || !*pattern)
+    return mk_error (Invalid_Value);
 
-    c->pending = 1;
+  ctx->pending = 1;
 
-    _gpgme_release_result (c);
-    c->out_of_core = 0;
+  _gpgme_release_result (ctx);
+  ctx->out_of_core = 0;
 
-    if ( c->gpg ) {
-        _gpgme_gpg_release ( c->gpg ); 
-        c->gpg = NULL;
+  if (ctx->engine)
+    {
+      _gpgme_engine_release (ctx->engine); 
+      ctx->engine = NULL;
     }
     
-    rc = _gpgme_gpg_new ( &c->gpg );
-    if (rc)
-        goto leave;
-
-    _gpgme_gpg_set_status_handler ( c->gpg, trustlist_status_handler, c );
-    rc = _gpgme_gpg_set_colon_line_handler ( c->gpg,
-                                             trustlist_colon_handler, c );
-    if (rc)
-        goto leave;
-
-    /* build the commandline */
-    _gpgme_gpg_add_arg ( c->gpg, "--with-colons" );
-    _gpgme_gpg_add_arg ( c->gpg, "--list-trust-path" );
-    
-    /* Tell the gpg object about the data */
-    _gpgme_gpg_add_arg ( c->gpg, "--" );
-    _gpgme_gpg_add_arg ( c->gpg, pattern );
+  err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+                          : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+  if (err)
+    goto leave;
+
+  _gpgme_engine_set_status_handler (ctx->engine, trustlist_status_handler, ctx);
+  err = _gpgme_engine_set_colon_line_handler (ctx->engine,
+                                             trustlist_colon_handler, ctx);
+  if (err)
+    goto leave;
 
-    /* and kick off the process */
-    rc = _gpgme_gpg_spawn ( c->gpg, c );
+  err =_gpgme_engine_op_trustlist (ctx->engine, pattern);
+
+  if (!err)    /* And kick off the process.  */
+    err = _gpgme_engine_start (ctx->engine, ctx);
 
  leave:
-    if (rc) {
-        c->pending = 0; 
-        _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
-    }
-    return rc;
+  if (err) {
+    ctx->pending = 0; 
+    _gpgme_engine_release (ctx->engine);
+    ctx->engine = NULL;
+  }
+  return err;
 }
 
 
index aa09b9b523b12463043bac64a0e560e95eb12a3d..c0e8776c80f630cbb4148726c072125af465128a 100644 (file)
@@ -218,78 +218,68 @@ _gpgme_verify_status_handler (GpgmeCtx ctx, GpgStatusCode code, char *args)
     }
 }
 
-
-
 GpgmeError
-gpgme_op_verify_start ( GpgmeCtx c,  GpgmeData sig, GpgmeData text )
+gpgme_op_verify_start (GpgmeCtx ctx, GpgmeData sig, GpgmeData text)
 {
-    int rc = 0;
-    int i;
-    int pipemode = 0; /*!!text; use pipemode for detached sigs */
+  int err = 0;
+  int pipemode = 0;     /* !!text; use pipemode for detached sigs.  */
 
-    fail_on_pending_request( c );
-    c->pending = 1;
+  fail_on_pending_request(ctx);
+  ctx->pending = 1;
 
-    _gpgme_release_result (c);
-    c->out_of_core = 0;
+  _gpgme_release_result (ctx);
+  ctx->out_of_core = 0;
     
-    if ( !pipemode ) {
-        _gpgme_gpg_release ( c->gpg );
-        c->gpg = NULL;
+  if (!pipemode)
+    {
+      _gpgme_engine_release (ctx->engine);
+      ctx->engine = NULL;
     }
 
-    if ( !c->gpg ) 
-        rc = _gpgme_gpg_new ( &c->gpg );
-    if (rc)
-        goto leave;
+  if (!ctx->engine)
+    err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+                            : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+  if (err)
+    goto leave;
 
-    if (pipemode)
-        _gpgme_gpg_enable_pipemode ( c->gpg ); 
-    _gpgme_gpg_set_status_handler (c->gpg, _gpgme_verify_status_handler, c);
+#if 0  /* FIXME */
+  if (pipemode)
+    _gpgme_gpg_enable_pipemode (c->engine->engine.gpg);
+#endif
 
-    /* build the commandline */
-    _gpgme_gpg_add_arg ( c->gpg, pipemode?"--pipemode" : "--verify" );
-    for ( i=0; i < c->verbosity; i++ )
-        _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
+  _gpgme_engine_set_status_handler (ctx->engine, _gpgme_verify_status_handler,
+                                   ctx);
+  _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
 
-    /* Check the supplied data */
-    if ( gpgme_data_get_type (sig) == GPGME_DATA_TYPE_NONE ) {
-        rc = mk_error (No_Data);
-        goto leave;
-    }
-    if ( text && gpgme_data_get_type (text) == GPGME_DATA_TYPE_NONE ) {
-        rc = mk_error (No_Data);
-        goto leave;
-    }
-    _gpgme_data_set_mode (sig, GPGME_DATA_MODE_OUT );
-    if (text) /* detached signature */
-        _gpgme_data_set_mode (text, GPGME_DATA_MODE_OUT );
-    /* Tell the gpg object about the data */
-    _gpgme_gpg_add_arg ( c->gpg, "--" );
-    if (pipemode) {
-        _gpgme_gpg_add_pm_data ( c->gpg, sig, 0 );
-        _gpgme_gpg_add_pm_data ( c->gpg, text, 1 );
+  /* Check the supplied data.  */
+  if (gpgme_data_get_type (sig) == GPGME_DATA_TYPE_NONE)
+    {
+      err = mk_error (No_Data);
+      goto leave;
     }
-    else {
-        _gpgme_gpg_add_data ( c->gpg, sig, -1 );
-        if (text) {
-            _gpgme_gpg_add_arg ( c->gpg, "-" );
-            _gpgme_gpg_add_data ( c->gpg, text, 0 );
-        }
+  if (text && gpgme_data_get_type (text) == GPGME_DATA_TYPE_NONE)
+    {
+      err = mk_error (No_Data);
+      goto leave;
     }
+  _gpgme_data_set_mode (sig, GPGME_DATA_MODE_OUT);
+  if (text)        /* Detached signature.  */
+    _gpgme_data_set_mode (text, GPGME_DATA_MODE_OUT);
 
-    /* and kick off the process */
-    rc = _gpgme_gpg_spawn ( c->gpg, c );
+  err = _gpgme_engine_op_verify (ctx->engine, sig, text);
+  if (!err)    /* And kick off the process.  */
+    err = _gpgme_engine_start (ctx->engine, ctx);
 
  leave:
-    if (rc) {
-        c->pending = 0; 
-        _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+  if (err)
+    {
+      ctx->pending = 0; 
+      _gpgme_engine_release (ctx->engine);
+      ctx->engine = NULL;
     }
-    return rc;
+  return err;
 }
 
-
 /* 
  * Figure out a common status value for all signatures 
  */