2002-07-28 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / data.c
index 911be5c..dcdf4ec 100644 (file)
@@ -27,7 +27,6 @@
 #include <errno.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#include "syshdr.h"
 
 #include "util.h"
 #include "context.h"
@@ -466,6 +465,24 @@ gpgme_data_get_type (GpgmeData dh)
   return dh->type;
 }
 
+/* Get the current encoding meta information. */
+GpgmeDataEncoding
+gpgme_data_get_encoding (GpgmeData dh)
+{
+  return dh? dh->encoding : GPGME_DATA_ENCODING_NONE;
+}
+
+/* Set the encoding meta information for DB to ENC */
+GpgmeError
+gpgme_data_set_encoding (GpgmeData dh, GpgmeDataEncoding enc)
+{
+  if (!dh)
+    return GPGME_Invalid_Value;
+  if (enc < 0 || enc > GPGME_DATA_ENCODING_ARMOR)
+    return GPGME_Invalid_Value;
+  dh->encoding = enc;
+  return 0;
+}
 
 void 
 _gpgme_data_set_mode (GpgmeData dh, GpgmeDataMode mode)
@@ -540,7 +557,7 @@ gpgme_data_rewind (GpgmeData dh)
  * error code GPGME_EOF.
  **/
 GpgmeError
-gpgme_data_read (GpgmeData dh, char *buffer, size_t length, size_t *nread)
+gpgme_data_read (GpgmeData dh, void *buffer, size_t length, size_t *nread)
 {
   size_t nbytes;
 
@@ -549,6 +566,11 @@ gpgme_data_read (GpgmeData dh, char *buffer, size_t length, size_t *nread)
   
   switch (dh->type)
     {
+    case GPGME_DATA_TYPE_NONE:
+      *nread = 0;
+      return mk_error(EOF);
+      break;
+
     case GPGME_DATA_TYPE_MEM:
       nbytes = dh->len - dh->readpos;
       if (!nbytes)
@@ -662,12 +684,12 @@ _gpgme_data_get_as_string (GpgmeData dh)
  * Return value: 0 on success or an error code
  **/
 GpgmeError
-gpgme_data_write (GpgmeData dh, const char *buffer, size_t length)
+gpgme_data_write (GpgmeData dh, const void *buffer, size_t length)
 {
   if (!dh || !buffer)
     return mk_error (Invalid_Value);
       
-  return _gpgme_data_append (dh, buffer, length );
+  return _gpgme_data_append (dh, (const char *)buffer, length );
 }
 
 
@@ -857,8 +879,8 @@ _gpgme_data_append_percentstring_for_xml (GpgmeData dh, const char *string)
 
 /* Functions to support the wait interface.  */
 
-int
-_gpgme_data_inbound_handler (void *opaque, int pid, int fd)
+void
+_gpgme_data_inbound_handler (void *opaque, int fd)
 {
   GpgmeData dh = opaque;
   GpgmeError err;
@@ -872,11 +894,14 @@ _gpgme_data_inbound_handler (void *opaque, int pid, int fd)
     {
       DEBUG3 ("read_mem_data: read failed on fd %d (n=%d): %s",
              fd, nread, strerror (errno) );
-      return 1;
+      _gpgme_io_close (fd);    /* XXX ??? */
+      return;
     }
   else if (!nread)
-    return 1; /* eof */
-
+    {
+      _gpgme_io_close (fd);
+      return; /* eof */
+    }
   /* We could improve this with a GpgmeData function which takes
    * the read function or provides a memory area for writing to it.
    */
@@ -888,10 +913,11 @@ _gpgme_data_inbound_handler (void *opaque, int pid, int fd)
              gpgme_strerror(err));
       /* Fixme: we should close the pipe or read it to /dev/null in
        * this case. Returnin EOF is not sufficient */
-      return 1;
+      _gpgme_io_close (fd);    /* XXX ??? */
+      return;
     }
 
-  return 0;
+  return;
 }
 
 static int
@@ -903,7 +929,6 @@ write_mem_data (GpgmeData dh, int fd)
   nbytes = dh->len - dh->readpos;
   if (!nbytes)
     {
-      _gpgme_io_close (fd);
       return 1;
     }
     
@@ -921,7 +946,6 @@ write_mem_data (GpgmeData dh, int fd)
     {
       DEBUG3 ("write_mem_data(%d): write failed (n=%d): %s",
              fd, nwritten, strerror (errno));
-      _gpgme_io_close (fd);
       return 1;
     }
 
@@ -939,7 +963,6 @@ write_cb_data (GpgmeData dh, int fd)
   err = gpgme_data_read (dh, buffer, DIM(buffer), &nbytes);
   if (err == GPGME_EOF)
     {
-      _gpgme_io_close (fd);
       return 1;
     }
     
@@ -950,7 +973,6 @@ write_cb_data (GpgmeData dh, int fd)
     {
       DEBUG3 ("write_cb_data(%d): write failed (n=%d): %s",
              fd, nwritten, strerror (errno));
-      _gpgme_io_close (fd);
       return 1;
     }
 
@@ -960,15 +982,14 @@ write_cb_data (GpgmeData dh, int fd)
       if (_gpgme_data_unread (dh, buffer + nwritten, nbytes - nwritten))
        DEBUG1 ("wite_cb_data: unread of %d bytes failed\n",
                nbytes - nwritten);
-      _gpgme_io_close (fd);
       return 1;
     }
   
   return 0;
 }
 
-int
-_gpgme_data_outbound_handler (void *opaque, int pid, int fd)
+void
+_gpgme_data_outbound_handler (void *opaque, int fd)
 {
   GpgmeData dh = opaque;
 
@@ -977,15 +998,13 @@ _gpgme_data_outbound_handler (void *opaque, int pid, int fd)
     {
     case GPGME_DATA_TYPE_MEM:
       if (write_mem_data (dh, fd))
-       return 1; /* ready */
+       _gpgme_io_close (fd);
       break;
     case GPGME_DATA_TYPE_CB:
       if (write_cb_data (dh, fd))
-       return 1; /* ready */
+       _gpgme_io_close (fd);
       break;
     default:
       assert (0);
     }
-  
-  return 0;
 }