doc/
[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) (GpgmeData 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) (GpgmeData 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) (GpgmeData dh, off_t offset, int whence);
49
50 /* Release the data object with the handle DH.  */
51 typedef void (*gpgme_data_release_cb) (GpgmeData dh);
52
53 struct gpgme_data_cbs
54 {
55   gpgme_data_read_cb read;
56   gpgme_data_write_cb write;
57   gpgme_data_seek_cb seek;
58   gpgme_data_release_cb release;
59 };
60
61 struct gpgme_data_s
62 {
63   struct gpgme_data_cbs *cbs;
64   GpgmeDataEncoding encoding;
65
66 #ifdef PIPE_BUF
67 #define BUFFER_SIZE PIPE_BUF
68 #else
69 #ifdef _POSIX_PIPE_BUF
70 #define BUFFER_SIZE _POSIX_PIPE_BUF
71 #else
72 #define BUFFER_SIZE 512
73 #endif
74 #endif
75   char pending[BUFFER_SIZE];
76   int pending_len;
77
78   union
79   {
80     /* For gpgme_data_new_from_fd.  */
81     int fd;
82
83     /* For gpgme_data_new_from_stream.  */
84     FILE *stream;
85
86     /* For gpgme_data_new_from_cbs.  */
87     struct
88     {
89       struct GpgmeDataCbs *cbs;
90       void *handle;
91     } user;
92
93     /* For gpgme_data_new_from_mem.  */
94     struct
95     {
96       char *buffer;
97       const char *orig_buffer;
98       /* Allocated size of BUFFER.  */
99       size_t size;
100       size_t length;
101       size_t offset;
102     } mem;
103
104     /* For gpgme_data_new_from_read_cb.  */
105     struct
106     {
107       int (*cb) (void *, char *, size_t, size_t *);
108       void *handle;
109     } old_user;
110   } data;
111 };
112
113 \f
114 GpgmeError _gpgme_data_new (GpgmeData *r_dh, struct gpgme_data_cbs *cbs);
115
116 void _gpgme_data_release (GpgmeData dh);
117
118 #endif  /* DATA_H */