2005-10-01 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / data.h
1 /* data.h - Internal data object abstraction interface.
2    Copyright (C) 2002, 2004, 2005 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   /* File name of the data object.  */
81   char *file_name;
82
83   union
84   {
85     /* For gpgme_data_new_from_fd.  */
86     int fd;
87
88     /* For gpgme_data_new_from_stream.  */
89     FILE *stream;
90
91     /* For gpgme_data_new_from_cbs.  */
92     struct
93     {
94       gpgme_data_cbs_t cbs;
95       void *handle;
96     } user;
97
98     /* For gpgme_data_new_from_mem.  */
99     struct
100     {
101       char *buffer;
102       const char *orig_buffer;
103       /* Allocated size of BUFFER.  */
104       size_t size;
105       size_t length;
106       off_t offset;
107     } mem;
108
109     /* For gpgme_data_new_from_read_cb.  */
110     struct
111     {
112       int (*cb) (void *, char *, size_t, size_t *);
113       void *handle;
114     } old_user;
115   } data;
116 };
117
118 \f
119 gpgme_error_t _gpgme_data_new (gpgme_data_t *r_dh,
120                                struct _gpgme_data_cbs *cbs);
121
122 void _gpgme_data_release (gpgme_data_t dh);
123
124 #endif  /* DATA_H */