doc/
[gpgme.git] / gpgme / signers.c
index 95d8a22..a5662a2 100644 (file)
-/* signers.c - maintain signer sets
*     Copyright (C) 2001 Werner Koch (dd9jn)
*      Copyright (C) 2001 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
- */
-
+/* signers.c - Maintain signer sets.
+   Copyright (C) 2001 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>
+#endif
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <assert.h>
+#include <errno.h>
 
 #include "util.h"
 #include "context.h"
-#include "rungpg.h"
-
-/* The signers are directly stored in the context.
- * So this is quite different to a recipient set.
- */
-
 
+\f
+/* Delete all signers from CTX.  */
 void
-gpgme_signers_clear (GpgmeCtx c)
+gpgme_signers_clear (gpgme_ctx_t ctx)
 {
-    int i;
+  unsigned int i;
 
-    return_if_fail (c);
+  if (!ctx || !ctx->signers)
+    return;
 
-    if (!c->signers)
-        return;
-    for (i=0; i < c->signers_size; i++ ) {
-        if (!c->signers[i])
-            break;
-        gpgme_key_unref (c->signers[i]);
-        c->signers[i] = NULL;
+  for (i = 0; i < ctx->signers_len; i++)
+    {
+      assert (ctx->signers[i]);
+      gpgme_key_unref (ctx->signers[i]);
+      ctx->signers[i] = NULL;
     }
+  ctx->signers_len = 0;
 }
 
-
-GpgmeError
-gpgme_signers_add (GpgmeCtx c, const GpgmeKey key)
+/* Add KEY to list of signers in CTX.  */
+gpgme_error_t
+gpgme_signers_add (gpgme_ctx_t ctx, const gpgme_key_t key)
 {
-    int i = 0;
-
-    if (!c || !key)
-        return mk_error (Invalid_Value);
-
-    if (!c->signers)
-        c->signers_size = 0;
-
-    for (i=0; i < c->signers_size && c->signers[i]; i++ )
-        ;
-    if ( !(i < c->signers_size) ) {
-        GpgmeKey *newarr;
-        int j;
-        int n = c->signers_size + 5;
-
-        newarr = xtrycalloc ( n, sizeof *newarr );
-        if ( !newarr )
-            return mk_error (Out_Of_Core);
-        for (j=0; j < c->signers_size; j++ )
-            newarr[j] = c->signers[j];
-        c->signers_size = n;
-        xfree (c->signers);
-        c->signers = newarr;
+  if (!ctx || !key)
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  if (ctx->signers_len == ctx->signers_size)
+    {
+      gpgme_key_t *newarr;
+      int n = ctx->signers_size + 5;
+      int j;
+
+      newarr = realloc (ctx->signers, n * sizeof (*newarr));
+      if (!newarr)
+       return gpg_error_from_errno (errno);
+      for (j = ctx->signers_size; j < n; j++)
+       newarr[j] = NULL;
+      ctx->signers = newarr;
+      ctx->signers_size = n;
     }
-    gpgme_key_ref (key);
-    c->signers[i] = key;
-    return 0;
+
+  gpgme_key_ref (key);
+  ctx->signers[ctx->signers_len++] = key;
+  return 0;
 }
 
 
-GpgmeKey
-gpgme_signers_enum (const GpgmeCtx c, int seq )
+/* Return the SEQth signer's key in CTX with one reference.  */
+gpgme_key_t
+gpgme_signers_enum (const gpgme_ctx_t ctx, int seq)
 {
-    int i;
+  unsigned int seqno;
 
-    return_null_if_fail (c);
-    return_null_if_fail (seq>=0);
+  if (!ctx || seq < 0)
+    return NULL;
 
-    if (!c->signers)
-        c->signers_size = 0;
-    for (i=0; i < c->signers_size && c->signers[i]; i++ ) {
-        if (i==seq) {
-            gpgme_key_ref (c->signers[i]);
-            return c->signers[i];
-        }
-    }
+  seqno = (unsigned int) seq;
+  if (seqno >= ctx->signers_len)
     return NULL;
+  gpgme_key_ref (ctx->signers[seqno]);
+  return ctx->signers[seqno];
 }
-
-
-
-