2008-06-27 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / wait-user.c
index e148491..7fd61a9 100644 (file)
@@ -1,22 +1,23 @@
-/* wait.c 
+/* wait-user.c 
    Copyright (C) 2000 Werner Koch (dd9jn)
-   Copyright (C) 2001, 2002, 2003 g10 Code GmbH
+   Copyright (C) 2001, 2002, 2003, 2004, 2005 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>
@@ -25,7 +26,7 @@
 
 #include "gpgme.h"
 #include "context.h"
-#include "io.h"
+#include "priv-io.h"
 #include "wait.h"
 
 \f
 \f
 /* Internal I/O Callbacks.  */
 
-GpgmeError
+gpgme_error_t
 _gpgme_user_io_cb_handler (void *data, int fd)
 {
-  GpgmeError err;
+  gpgme_error_t err = 0;
   struct tag *tag = (struct tag *) data;
-  GpgmeCtx ctx;
-  struct wait_item_s *item;
+  gpgme_ctx_t ctx;
 
   assert (data);
   ctx = tag->ctx;
   assert (ctx);
-  item = (struct wait_item_s *) ctx->fdt.fds[tag->idx].opaque;
-  assert (item);
 
-  err = (*item->handler) (item->handler_value, fd);
+  LOCK (ctx->lock);
+  if (ctx->canceled)
+    err = gpg_error (GPG_ERR_CANCELED);
+  UNLOCK (ctx->lock);
+
+  if (! err)
+    err = _gpgme_run_io_cb (&ctx->fdt.fds[tag->idx], 0);
   if (err)
     {
-      int idx;
+      unsigned int idx;
 
       for (idx = 0; idx < ctx->fdt.size; idx++)
        if (ctx->fdt.fds[idx].fd != -1)
          _gpgme_io_close (ctx->fdt.fds[idx].fd);
       _gpgme_engine_io_event (ctx->engine, GPGME_EVENT_DONE, &err);
     }
+  else
+    {
+      unsigned int i;
+
+      for (i = 0; i < ctx->fdt.size; i++)
+       if (ctx->fdt.fds[i].fd != -1)
+         break;
+      if (i == ctx->fdt.size)
+       _gpgme_engine_io_event (ctx->engine, GPGME_EVENT_DONE, &err);
+    }
   return 0;
 }
 
@@ -67,13 +81,13 @@ _gpgme_user_io_cb_handler (void *data, int fd)
    FNC_DATA as its first argument) for the direction DIR.  DATA should
    be the context for which the fd is added.  R_TAG will hold the tag
    that can be used to remove the fd.  */
-GpgmeError
-_gpgme_wait_user_add_io_cb (void *data, int fd, int dir, GpgmeIOCb fnc,
+gpgme_error_t
+_gpgme_wait_user_add_io_cb (void *data, int fd, int dir, gpgme_io_cb_t fnc,
                            void *fnc_data, void **r_tag)
 {
-  GpgmeCtx ctx = (GpgmeCtx) data;
+  gpgme_ctx_t ctx = (gpgme_ctx_t) data;
   struct tag *tag;
-  GpgmeError err;
+  gpgme_error_t err;
 
   assert (ctx);
   err = _gpgme_add_io_cb (data, fd, dir, fnc, fnc_data, r_tag);
@@ -94,33 +108,20 @@ void
 _gpgme_wait_user_remove_io_cb (void *data)
 {
   struct tag *tag = (struct tag *) data;
-  GpgmeCtx ctx;
-  int i;
+  gpgme_ctx_t ctx;
 
   assert (tag);
   ctx = tag->ctx;
 
   (*ctx->io_cbs.remove) (tag->user_tag);
   _gpgme_remove_io_cb (data);
-
-  for (i = 0; i < ctx->fdt.size; i++)
-    if (ctx->fdt.fds[i].fd != -1)
-      break;
-  if (i == ctx->fdt.size)
-    {
-      GpgmeError err = 0;
-      _gpgme_engine_io_event (ctx->engine, GPGME_EVENT_DONE, &err);
-    }
 }
 
 
 void
-_gpgme_wait_user_event_cb (void *data, GpgmeEventIO type, void *type_data)
+_gpgme_wait_user_event_cb (void *data, gpgme_event_io_t type, void *type_data)
 {
-  GpgmeCtx ctx = data;
-
-  if (type == GPGME_EVENT_DONE)
-    ctx->pending = 0;
+  gpgme_ctx_t ctx = data;
 
   if (ctx->io_cbs.event)
     (*ctx->io_cbs.event) (ctx->io_cbs.event_priv, type, type_data);