2002-02-02 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / sign.c
index dc53b7b..0c2514c 100644 (file)
@@ -138,17 +138,11 @@ append_xml_siginfo (GpgmeData *rdh, char *args)
 static void
 sign_status_handler (GpgmeCtx ctx, GpgStatusCode code, char *args)
 {
-  if (ctx->out_of_core)
+  _gpgme_passphrase_status_handler (ctx, code, args);
+
+  if (ctx->error)
     return;
-  if (!ctx->result.sign)
-    {
-      ctx->result.sign = xtrycalloc (1, sizeof *ctx->result.sign);
-      if (!ctx->result.sign)
-       {
-         ctx->out_of_core = 1;
-         return;
-       }
-    }
+  test_and_allocate_result (ctx, sign);
 
   switch (code)
     {
@@ -159,12 +153,14 @@ sign_status_handler (GpgmeCtx ctx, GpgStatusCode code, char *args)
          _gpgme_set_op_info (ctx, ctx->result.sign->xmlinfo);
          ctx->result.sign->xmlinfo = NULL;
         }
+      if (!ctx->error && !ctx->result.sign->okay)
+       ctx->error = mk_error (No_Data); /* Hmmm: choose a better error? */
       break;
 
     case STATUS_SIG_CREATED: 
       /* FIXME: We have no error return for multiple signatures.  */
       append_xml_siginfo (&ctx->result.sign->xmlinfo, args);
-      ctx->result.sign->okay =1;
+      ctx->result.sign->okay = 1;
       break;
 
     default:
@@ -177,14 +173,11 @@ 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;
 
   _gpgme_release_result (ctx);
-  ctx->out_of_core = 0;
 
   if (mode != GPGME_SIG_MODE_NORMAL
       && mode != GPGME_SIG_MODE_DETACH
@@ -192,45 +185,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 +206,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;
 }
@@ -290,20 +257,7 @@ gpgme_op_sign (GpgmeCtx ctx, GpgmeData in, GpgmeData out, GpgmeSigMode mode)
   if (!err)
     {
       gpgme_wait (ctx, 1);
-      if (!ctx->result.sign)
-       err = mk_error (General_Error);
-      else if (ctx->out_of_core)
-       err = mk_error (Out_Of_Core);
-      else
-       {
-         err = _gpgme_passphrase_result (ctx);
-          if (! err)
-            {
-             if (!ctx->result.sign->okay)
-                err = mk_error (No_Data); /* Hmmm: choose a better error? */
-           }
-       }
-      ctx->pending = 0;
+      err = ctx->error;
     }
   return err;
 }