2004-06-23 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / data.h
1 /* data.h - Internal data object abstraction interface.
2    Copyright (C) 2002 g10 Code GmbH
3  
4    This file is part of GPGME.
5  
6    GPGME is free software; you can redistribute it and/or modify it
7    under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10  
11    GPGME is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    General Public License for more details.
15  
16    You should have received a copy of the GNU General Public License
17    along with GPGME; if not, write to the Free Software Foundation,
18    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20 #ifndef DATA_H
21 #define DATA_H
22
23 #if HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <sys/types.h>
28 #include <limits.h>
29
30 #include "gpgme.h"
31
32 \f
33 /* Read up to SIZE bytes into buffer BUFFER from the data object with
34    the handle DH.  Return the number of characters read, 0 on EOF and
35    -1 on error.  If an error occurs, errno is set.  */
36 typedef ssize_t (*gpgme_data_read_cb) (gpgme_data_t dh, void *buffer,
37                                        size_t size);
38
39 /* Write up to SIZE bytes from buffer BUFFER to the data object with
40    the handle DH.  Return the number of characters written, or -1 on
41    error.  If an error occurs, errno is set.  */
42 typedef ssize_t (*gpgme_data_write_cb) (gpgme_data_t dh, const void *buffer,
43                                         size_t size);
44
45 /* Set the current position from where the next read or write starts
46    in the data object with the handle DH to OFFSET, relativ to
47    WHENCE.  */
48 typedef off_t (*gpgme_data_seek_cb) (gpgme_data_t dh, off_t offset,
49                                      int whence);
50
51 /* Release the data object with the handle DH.  */
52 typedef void (*gpgme_data_release_cb) (gpgme_data_t dh);
53
54 struct _gpgme_data_cbs
55 {
56   gpgme_data_read_cb read;
57   gpgme_data_write_cb write;
58   gpgme_data_seek_cb seek;
59   gpgme_data_release_cb release;
60 };
61
62 struct gpgme_data
63 {
64   struct _gpgme_data_cbs *cbs;
65   gpgme_data_encoding_t encoding;
66
67 #ifdef PIPE_BUF
68 #define BUFFER_SIZE PIPE_BUF
69 #else
70 #ifdef _POSIX_PIPE_BUF
71 #define BUFFER_SIZE _POSIX_PIPE_BUF
72 #else
73 #define BUFFER_SIZE 512
74 #endif
75 #endif
76   char pending[BUFFER_SIZE];
77   int pending_len;
78
79   union
80   {
81     /* For gpgme_data_new_from_fd.  */
82     int fd;
83
84     /* For gpgme_data_new_from_stream.  */
85     FILE *stream;
86
87     /* For gpgme_data_new_from_cbs.  */
88     struct
89     {
90       gpgme_data_cbs_t cbs;
91       void *handle;
92     } user;
93
94     /* For gpgme_data_new_from_mem.  */
95     struct
96     {
97       char *buffer;
98       const char *orig_buffer;
99       /* Allocated size of BUFFER.  */
100       size_t size;
101       size_t length;
102       size_t offset;
103     } mem;
104
105     /* For gpgme_data_new_from_read_cb.  */
106     struct
107     {
108       int (*cb) (void *, char *, size_t, size_t *);
109       void *handle;
110     } old_user;
111   } data;
112 };
113
114 \f
115 gpgme_error_t _gpgme_data_new (gpgme_data_t *r_dh,
116                                struct _gpgme_data_cbs *cbs);
117
118 void _gpgme_data_release (gpgme_data_t dh);
119
120 #endif  /* DATA_H */