* gpgme.texi (Key Listing Mode): Doc KEYLIST_MODE_VALIDATE.
[gpgme.git] / gpgme / export.c
index bbee68d..59c6896 100644 (file)
-/* export.c -  encrypt functions
*     Copyright (C) 2000 Werner Koch (dd9jn)
*      Copyright (C) 2001, 2002 g10 Code GmbH
- *
* This file is part of GPGME.
- *
- * GPGME is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
- * GPGME is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
- *
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
+/* export.c - Export a key.
+   Copyright (C) 2000 Werner Koch (dd9jn)
  Copyright (C) 2001, 2002, 2003 g10 Code GmbH
+
  This file is part of GPGME.
+   GPGME is free software; you can redistribute it and/or modify it
  under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.
+   GPGME is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  General Public License for more details.
  You should have received a copy of the GNU General Public License
+   along with GPGME; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#if HAVE_CONFIG_H
 #include <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
+#endif
 
-#include "util.h"
+#include "gpgme.h"
 #include "context.h"
 #include "ops.h"
 
+\f
+static gpgme_error_t
+export_status_handler (void *priv, gpgme_status_code_t code, char *args)
+{
+  return 0;
+}
+
 
-static void
-export_status_handler (GpgmeCtx ctx, GpgStatusCode code, char *args)
+static gpgme_error_t
+export_start (gpgme_ctx_t ctx, int synchronous, const char *pattern,
+             unsigned int reserved, gpgme_data_t keydata)
 {
-  if (ctx->error)
-    return;
+  gpgme_error_t err;
+
+  if (!keydata)
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  err = _gpgme_op_reset (ctx, synchronous);
+  if (err)
+    return err;
+
+  _gpgme_engine_set_status_handler (ctx->engine, export_status_handler, ctx);
 
-  DEBUG2 ("export_status: code=%d args=`%s'\n", code, args);
-  /* FIXME: Need to do more */
+  return _gpgme_engine_op_export (ctx->engine, pattern, reserved, keydata,
+                                 ctx->use_armor);
 }
 
 
-GpgmeError
-gpgme_op_export_start (GpgmeCtx ctx, GpgmeRecipients recp, GpgmeData keydata)
+/* Export the keys listed in RECP into KEYDATA.  */
+gpgme_error_t
+gpgme_op_export_start (gpgme_ctx_t ctx, const char *pattern,
+                      unsigned int reserved, gpgme_data_t keydata)
 {
-  GpgmeError err = 0;
+  return export_start (ctx, 0, pattern, reserved, keydata);
+}
 
-  fail_on_pending_request (ctx);
-  ctx->pending = 1;
 
-  _gpgme_engine_release (ctx->engine);
-  ctx->engine = NULL;
+/* Export the keys listed in RECP into KEYDATA.  */
+gpgme_error_t
+gpgme_op_export (gpgme_ctx_t ctx, const char *pattern, unsigned int reserved,
+                gpgme_data_t keydata)
+{
+  gpgme_error_t err = export_start (ctx, 1, pattern, reserved, keydata);
+  if (!err)
+    err = _gpgme_wait_one (ctx);
+  return err;
+}
+
+\f
+static gpgme_error_t
+export_ext_start (gpgme_ctx_t ctx, int synchronous, const char *pattern[],
+                 unsigned int reserved, gpgme_data_t keydata)
+{
+  gpgme_error_t err;
 
-  _gpgme_release_result (ctx);
+  if (!keydata)
+    return gpg_error (GPG_ERR_INV_VALUE);
 
-  err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
-                          : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+  err = _gpgme_op_reset (ctx, synchronous);
   if (err)
-    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);
+    return err;
 
   _gpgme_engine_set_status_handler (ctx->engine, export_status_handler, ctx);
-  _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
 
-  err = _gpgme_engine_op_export (ctx->engine, recp, keydata, ctx->use_armor);
-  if (!err)
-    err = _gpgme_engine_start (ctx->engine, ctx);
+  return _gpgme_engine_op_export_ext (ctx->engine, pattern, reserved, keydata,
+                                     ctx->use_armor);
+}
 
- leave:
-  if (err)
-    {
-      ctx->pending = 0; 
-      _gpgme_engine_release (ctx->engine);
-      ctx->engine = NULL;
-    }
-  return err;
+
+/* Export the keys listed in RECP into KEYDATA.  */
+gpgme_error_t
+gpgme_op_export_ext_start (gpgme_ctx_t ctx, const char *pattern[],
+                          unsigned int reserved, gpgme_data_t keydata)
+{
+  return export_ext_start (ctx, 0, pattern, reserved, keydata);
 }
 
 
-/**
- * gpgme_op_export:
- * @c: the context
- * @recp: a list of recipients or NULL
- * @keydata: Returns the keys
- * 
- * This function can be used to extract public keys from the GnuPG key
- * database either in armored (by using gpgme_set_armor()) or in plain
- * binary form.  The function expects a list of user IDs in @recp for
- * whom the public keys are to be exported.
- * 
- * Return value: 0 for success or an error code
- **/
-GpgmeError
-gpgme_op_export (GpgmeCtx ctx, GpgmeRecipients recipients, GpgmeData keydata)
+/* Export the keys listed in RECP into KEYDATA.  */
+gpgme_error_t
+gpgme_op_export_ext (gpgme_ctx_t ctx, const char *pattern[],
+                    unsigned int reserved, gpgme_data_t keydata)
 {
-  GpgmeError err = gpgme_op_export_start (ctx, recipients, keydata);
+  gpgme_error_t err = export_ext_start (ctx, 1, pattern, reserved, keydata);
   if (!err)
-    gpgme_wait (ctx, &err, 1);
+    err = _gpgme_wait_one (ctx);
   return err;
 }