2005-09-12 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / op-support.c
index e0fe000..68ff77d 100644 (file)
@@ -1,21 +1,22 @@
 /* op-support.c 
-   Copyright (C) 2002, 2003 g10 Code GmbH
+   Copyright (C) 2002, 2003, 2004 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.
+   under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 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.  */
+   Lesser General Public License for more details.
+   
+   You should have received a copy of the GNU Lesser 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.  */
 
 #if HAVE_CONFIG_H
 #include <config.h>
@@ -50,7 +51,7 @@ _gpgme_op_data_lookup (gpgme_ctx_t ctx, ctx_op_data_id_t type, void **hook,
       data->next = ctx->op_data;
       data->type = type;
       data->cleanup = cleanup;
-      data->hook = ((void *) data) + sizeof (struct ctx_op_data);
+      data->hook = (void *) (((char *) data) + sizeof (struct ctx_op_data));
       ctx->op_data = data;
     }
   *hook = data->hook;
@@ -66,17 +67,27 @@ gpgme_error_t
 _gpgme_op_reset (gpgme_ctx_t ctx, int type)
 {
   gpgme_error_t err = 0;
+  gpgme_engine_info_t info;
   struct gpgme_io_cbs io_cbs;
 
+  info = ctx->engine_info;
+  while (info && info->protocol != ctx->protocol)
+    info = info->next;
+
+  if (!info)
+    return gpg_error (GPG_ERR_UNSUPPORTED_PROTOCOL);
+
   _gpgme_release_result (ctx);
 
-  /* Create an engine object.  */
-  if  (ctx->engine)
+  if (ctx->engine)
     {
       _gpgme_engine_release (ctx->engine);
       ctx->engine = NULL;
     }
-  err = _gpgme_engine_new (ctx->protocol, &ctx->engine);
+
+  /* Create an engine object.  */
+  err = _gpgme_engine_new (info, &ctx->engine,
+                          ctx->lc_ctype, ctx->lc_messages);
   if (err)
     return err;
 
@@ -112,23 +123,25 @@ _gpgme_op_reset (gpgme_ctx_t ctx, int type)
 }
 
 \f
+/* Parse the INV_RECP status line in ARGS and return the result in
+   KEY.  */
 gpgme_error_t
-_gpgme_parse_inv_userid (char *args, gpgme_invalid_user_id_t *userid)
+_gpgme_parse_inv_recp (char *args, gpgme_invalid_key_t *key)
 {
-  gpgme_invalid_user_id_t inv_userid;
+  gpgme_invalid_key_t inv_key;
   char *tail;
   long int reason;
 
-  inv_userid = malloc (sizeof (*inv_userid));
-  if (!inv_userid)
+  inv_key = malloc (sizeof (*inv_key));
+  if (!inv_key)
     return gpg_error_from_errno (errno);
-  inv_userid->next = NULL;
+  inv_key->next = NULL;
   errno = 0;
   reason = strtol (args, &tail, 0);
   if (errno || args == tail || *tail != ' ')
     {
       /* The crypto backend does not behave.  */
-      free (inv_userid);
+      free (inv_key);
       return gpg_error (GPG_ERR_INV_ENGINE);
     }
 
@@ -136,48 +149,47 @@ _gpgme_parse_inv_userid (char *args, gpgme_invalid_user_id_t *userid)
     {
     default:
     case 0:
-      inv_userid->reason = gpg_error (GPG_ERR_GENERAL);
+      inv_key->reason = gpg_error (GPG_ERR_GENERAL);
       break;
 
     case 1:
-      inv_userid->reason = gpg_error (GPG_ERR_NO_PUBKEY);
+      inv_key->reason = gpg_error (GPG_ERR_NO_PUBKEY);
       break;
 
     case 2:
-      /* FIXME: Ambiguous specification.  */
-      inv_userid->reason = gpg_error (GPG_ERR_AMBIGUOUS_NAME);
+      inv_key->reason = gpg_error (GPG_ERR_AMBIGUOUS_NAME);
       break;
 
     case 3:
-      inv_userid->reason = gpg_error (GPG_ERR_WRONG_KEY_USAGE);
+      inv_key->reason = gpg_error (GPG_ERR_WRONG_KEY_USAGE);
       break;
 
     case 4:
-      inv_userid->reason = gpg_error (GPG_ERR_CERT_REVOKED);
+      inv_key->reason = gpg_error (GPG_ERR_CERT_REVOKED);
       break;
 
     case 5:
-      inv_userid->reason = gpg_error (GPG_ERR_CERT_EXPIRED);
+      inv_key->reason = gpg_error (GPG_ERR_CERT_EXPIRED);
       break;
 
     case 6:
-      inv_userid->reason = gpg_error (GPG_ERR_NO_CRL_KNOWN);
+      inv_key->reason = gpg_error (GPG_ERR_NO_CRL_KNOWN);
       break;
 
     case 7:
-      inv_userid->reason = gpg_error (GPG_ERR_CRL_TOO_OLD);
+      inv_key->reason = gpg_error (GPG_ERR_CRL_TOO_OLD);
       break;
 
     case 8:
-      inv_userid->reason = gpg_error (GPG_ERR_NO_POLICY_MATCH);
+      inv_key->reason = gpg_error (GPG_ERR_NO_POLICY_MATCH);
       break;
 
     case 9:
-      inv_userid->reason = gpg_error (GPG_ERR_NO_SECKEY);
+      inv_key->reason = gpg_error (GPG_ERR_NO_SECKEY);
       break;
 
     case 10:
-      inv_userid->reason = gpg_error (GPG_ERR_PUBKEY_NOT_TRUSTED);
+      inv_key->reason = gpg_error (GPG_ERR_PUBKEY_NOT_TRUSTED);
       break;
     }
 
@@ -185,17 +197,61 @@ _gpgme_parse_inv_userid (char *args, gpgme_invalid_user_id_t *userid)
     tail++;
   if (*tail)
     {
-      inv_userid->id = strdup (tail);
-      if (!inv_userid->id)
+      inv_key->fpr = strdup (tail);
+      if (!inv_key->fpr)
        {
          int saved_errno = errno;
-         free (inv_userid);
+         free (inv_key);
          return gpg_error_from_errno (saved_errno);
        }
     }
   else
-    inv_userid->id = NULL;
+    inv_key->fpr = NULL;
+
+  *key = inv_key;
+  return 0;
+}
+
 
-  *userid = inv_userid;
+/* Parse the PLAINTEXT status line in ARGS and return the result in
+   FILENAMEP.  */
+gpgme_error_t
+_gpgme_parse_plaintext (char *args, char **filenamep)
+{
+  char *tail;
+
+  while (*args == ' ')
+    args++;
+  if (*args == '\0')
+    return 0;
+
+  /* First argument is file type.  */
+  while (*args != ' ' && *args != '\0')
+    args++;
+  while (*args == ' ')
+    args++;
+  if (*args == '\0')
+    return 0;
+
+  /* Second argument is the timestamp.  */
+  while (*args != ' ' && *args != '\0')
+    args++;
+  while (*args == ' ')
+    args++;
+  if (*args == '\0')
+    return 0;
+
+  tail = args;
+  while (*tail != ' ' && *tail != '\0')
+    tail++;
+  *tail = '\0';
+  if (filenamep && *args != '\0')
+    {
+      char *filename = strdup (args);
+      if (!filename)
+       return gpg_error_from_errno (errno);
+
+      *filenamep = filename;
+    }
   return 0;
 }