2002-07-28 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / context.h
1 /* context.h 
2  *      Copyright (C) 2000 Werner Koch (dd9jn)
3  *      Copyright (C) 2001, 2002 g10 Code GmbH
4  *
5  * This file is part of GPGME.
6  *
7  * GPGME is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * GPGME is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20  */
21
22 #ifndef CONTEXT_H
23 #define CONTEXT_H
24
25 #include "gpgme.h"
26 #include "types.h"
27 #include "engine.h"
28 #include "wait.h"
29
30 struct key_queue_item_s
31 {
32   struct key_queue_item_s *next;
33   GpgmeKey key;
34 };
35
36 struct trust_queue_item_s
37 {
38   struct trust_queue_item_s *next;
39   GpgmeTrustItem item;
40 };
41
42
43 /* Currently we need it at several places, so we put the definition 
44  * into this header file */
45 struct gpgme_context_s
46 {
47   int initialized;
48   /* A gpg request is still pending.  */
49   int pending;
50
51   int use_cms;
52
53   /* At some points we need to remember an error which we can't report
54      immediately.  */
55   GpgmeError error;
56   /* Cancel operation requested.  */
57   int cancel;
58
59   /* The running engine process.  */
60   EngineObject engine;
61
62   /* Level of verbosity to use.  */
63   int verbosity;
64   int use_armor;  
65   int use_textmode;
66   int keylist_mode;
67   int include_certs;
68
69   /* The number of keys in signers.  */
70   int signers_len;
71   /* Size of the following array.  */
72   int signers_size;
73   GpgmeKey *signers;
74
75   struct
76   {
77     VerifyResult verify;
78     DecryptResult decrypt;
79     SignResult sign;
80     EncryptResult encrypt;
81     PassphraseResult passphrase;
82     ImportResult import;
83     DeleteResult delete;
84     GenKeyResult genkey;
85     KeylistResult keylist;
86     EditResult edit;
87   } result;
88
89   /* Last signature notation.  */
90   GpgmeData notation;
91   /* Last operation info.  */
92   GpgmeData op_info;
93
94   /* Used by keylist.c.  */
95   GpgmeKey tmp_key;
96   /* Something new is available.  */
97   volatile int key_cond;
98   struct key_queue_item_s *key_queue;
99   struct trust_queue_item_s *trust_queue;
100
101   GpgmePassphraseCb passphrase_cb;
102   void *passphrase_cb_value;
103
104   GpgmeProgressCb progress_cb;
105   void *progress_cb_value;
106
107   /* A list of file descriptors in active use by the current
108      (synchronous) operation.  */
109   struct fd_table fdt;
110   struct GpgmeIOCbs io_cbs;
111   
112   GpgmeData help_data_1;
113 };
114
115
116 struct gpgme_data_s {
117     size_t len;
118     const char *data;
119     GpgmeDataType type;
120     GpgmeDataMode mode;
121     GpgmeDataEncoding encoding;
122
123     int (*read_cb)( void *, char *, size_t, size_t *);
124     void *read_cb_value;
125     int read_cb_eof;
126
127     size_t readpos;
128     size_t writepos;
129     size_t private_len;
130     char *private_buffer;
131 };
132
133 struct user_id_s {
134     struct user_id_s *next;
135     unsigned int revoked:1;
136     unsigned int invalid:1;
137     GpgmeValidity validity; 
138     const char *name_part;    /* all 3 point into strings behind name */
139     const char *email_part;   /* or to read-only strings */
140     const char *comment_part;
141     char name[1];
142 };
143
144 struct gpgme_recipients_s {
145     struct user_id_s *list;
146     int checked;   /* wether the recipients are all valid */
147 };
148
149
150 #define fail_on_pending_request(c)                            \
151           do {                                                \
152                 if (!(c))         return GPGME_Invalid_Value; \
153                 if ((c)->pending) return GPGME_Busy;          \
154              } while (0)
155
156 #define wait_on_request_or_fail(c)                            \
157           do {                                                \
158                 if (!(c))          return GPGME_Invalid_Value;\
159                 if (!(c)->pending) return GPGME_No_Request;   \
160                 gpgme_wait ((c), 1);                          \
161              } while (0)
162
163 #endif /* CONTEXT_H */