2003-04-25 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / trustlist.c
index 5c4a848..ba1188a 100644 (file)
@@ -1,6 +1,6 @@
-/* trustlist.c -  key listing
+/* trustlist.c - Trust item listing.
    Copyright (C) 2000 Werner Koch (dd9jn)
-   Copyright (C) 2001, 2002 g10 Code GmbH
+   Copyright (C) 2001, 2002, 2003 g10 Code GmbH
 
    This file is part of GPGME.
  
@@ -52,12 +52,9 @@ trust_item_new (void)
 }
 
 
-static void
+static GpgmeError
 trustlist_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args)
 {
-  if (ctx->error)
-    return;
-
   switch (code)
     {
     case GPGME_STATUS_EOF:
@@ -66,6 +63,7 @@ trustlist_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args)
     default:
       break;
     }
+  return 0;
 }
 
 
@@ -80,17 +78,15 @@ trustlist_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args)
    counter and only available on U lines CC is the same for the
    complete count NAME ist the username and only printed on U
    lines.  */
-static void
+static GpgmeError
 trustlist_colon_handler (GpgmeCtx ctx, char *line)
 {
   char *p, *pend;
   int field = 0;
   GpgmeTrustItem item = NULL;
 
-  if (ctx->error)
-    return;
   if (!line)
-    return; /* EOF */
+    return 0; /* EOF */
 
   for (p = line; p; p = pend)
     {
@@ -104,10 +100,7 @@ trustlist_colon_handler (GpgmeCtx ctx, char *line)
        case 1: /* level */
          item = trust_item_new ();
          if (!item)
-           {
-             ctx->error = mk_error (Out_Of_Core);
-             return;
-            }
+           return GPGME_Out_Of_Core;
          item->level = atoi (p);
          break;
        case 2: /* long keyid */
@@ -127,14 +120,17 @@ trustlist_colon_handler (GpgmeCtx ctx, char *line)
          break;
        case 9: /* user ID */
          item->name = strdup (p);
-         if (!item->name)
-           ctx->error = mk_error (Out_Of_Core);
+         if (!item->name) {
+           gpgme_trust_item_release (item);
+           return GPGME_Out_Of_Core;
+         }
          break;
         }
     }
 
   if (item)
     _gpgme_engine_io_event (ctx->engine, GPGME_EVENT_NEXT_TRUSTITEM, item);
+  return 0;
 }
 
 
@@ -145,13 +141,14 @@ _gpgme_op_trustlist_event_cb (void *data, GpgmeEventIO type, void *type_data)
   GpgmeTrustItem item = (GpgmeTrustItem) type_data;
   struct trust_queue_item_s *q, *q2;
 
-  assert (type == GPGME_EVENT_NEXT_KEY);
+  assert (type == GPGME_EVENT_NEXT_TRUSTITEM);
 
   q = malloc (sizeof *q);
   if (!q)
     {
       gpgme_trust_item_release (item);
-      ctx->error = mk_error (Out_Of_Core);
+      /* FIXME */
+      /* ctx->error = GPGME_Out_Of_Core; */
       return;
     }
   q->item = item;
@@ -177,7 +174,7 @@ gpgme_op_trustlist_start (GpgmeCtx ctx, const char *pattern, int max_level)
   GpgmeError err = 0;
 
   if (!pattern || !*pattern)
-    return mk_error (Invalid_Value);
+    return GPGME_Invalid_Value;
 
   err = _gpgme_op_reset (ctx, 2);
   if (err)
@@ -195,7 +192,6 @@ gpgme_op_trustlist_start (GpgmeCtx ctx, const char *pattern, int max_level)
  leave:
   if (err)
     {
-      ctx->pending = 0; 
       _gpgme_engine_release (ctx->engine);
       ctx->engine = NULL;
     }
@@ -209,37 +205,18 @@ gpgme_op_trustlist_next (GpgmeCtx ctx, GpgmeTrustItem *r_item)
   struct trust_queue_item_s *q;
 
   if (!r_item)
-    return mk_error (Invalid_Value);
+    return GPGME_Invalid_Value;
   *r_item = NULL;
   if (!ctx)
-    return mk_error (Invalid_Value);
-  if (!ctx->pending)
-    return mk_error (No_Request);
-  if (ctx->error)
-    return ctx->error;
+    return GPGME_Invalid_Value;
 
   if (!ctx->trust_queue)
     {
       GpgmeError err = _gpgme_wait_on_condition (ctx, &ctx->key_cond);
       if (err)
-       {
-         ctx->pending = 0;
-         return err;
-       }
-      if (!ctx->pending)
-       {
-         /* The operation finished.  Because not all keys might have
-            been returned to the caller yet, we just reset the
-            pending flag to 1.  This will cause us to call
-            _gpgme_wait_on_condition without any active file
-            descriptors, but that is a no-op, so it is safe.  */
-         ctx->pending = 1;
-       }
+       return err;
       if (!ctx->key_cond)
-       {
-         ctx->pending = 0;
-         return mk_error (EOF);
-       }
+       return GPGME_EOF;
       ctx->key_cond = 0; 
       assert (ctx->trust_queue);
     }
@@ -263,13 +240,8 @@ GpgmeError
 gpgme_op_trustlist_end (GpgmeCtx ctx)
 {
   if (!ctx)
-    return mk_error (Invalid_Value);
-  if (!ctx->pending)
-    return mk_error (No_Request);
-  if (ctx->error)
-    return ctx->error;
+    return GPGME_Invalid_Value;
 
-  ctx->pending = 0;
   return 0;
 }
 
@@ -279,7 +251,8 @@ gpgme_trust_item_release (GpgmeTrustItem item)
 {
   if (!item)
     return;
-  free (item->name);
+  if (item->name)
+    free (item->name);
   free (item);
 }