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