2002-12-04 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 it
8    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, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
16  
17    You should have received a copy of the GNU General Public License
18    along with GPGME; if not, write to the Free Software Foundation,
19    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 #ifndef CONTEXT_H
22 #define CONTEXT_H
23
24 #include "gpgme.h"
25 #include "types.h"
26 #include "engine.h"
27 #include "wait.h"
28
29 struct key_queue_item_s
30 {
31   struct key_queue_item_s *next;
32   GpgmeKey key;
33 };
34
35 struct trust_queue_item_s
36 {
37   struct trust_queue_item_s *next;
38   GpgmeTrustItem item;
39 };
40
41
42 /* Currently we need it at several places, so we put the definition
43    into this header file.  */
44 struct gpgme_context_s
45 {
46   int initialized;
47   /* An engine request is still pending.  */
48   int pending;
49
50   int use_cms;
51
52   /* At some points we need to remember an error which we can't report
53      immediately.  */
54   GpgmeError error;
55   /* Cancel operation requested.  */
56   int cancel;
57
58   /* The running engine process.  */
59   EngineObject engine;
60
61   /* Level of verbosity to use.  */
62   int verbosity;
63   int use_armor;  
64   int use_textmode;
65   int keylist_mode;
66   int include_certs;
67
68   /* The number of keys in signers.  */
69   int signers_len;
70   /* Size of the following array.  */
71   int signers_size;
72   GpgmeKey *signers;
73
74   struct
75   {
76     VerifyResult verify;
77     DecryptResult decrypt;
78     SignResult sign;
79     EncryptResult encrypt;
80     PassphraseResult passphrase;
81     ImportResult import;
82     DeleteResult delete;
83     GenKeyResult genkey;
84     KeylistResult keylist;
85     EditResult edit;
86   } result;
87
88   /* Last signature notation.  */
89   GpgmeData notation;
90   /* Last operation info.  */
91   GpgmeData op_info;
92
93   /* Used by keylist.c.  */
94   GpgmeKey tmp_key;
95   struct user_id_s *tmp_uid;
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 /* Forward declaration of a structure to store certification
116    signatures.  */
117 struct certsig_s;
118
119 /* Structure to store user IDs.  */
120 struct user_id_s
121 {
122   struct user_id_s *next;
123   unsigned int revoked : 1;
124   unsigned int invalid : 1;
125   GpgmeValidity validity; 
126   struct certsig_s *certsigs;
127   struct certsig_s *last_certsig;
128   const char *name_part;        /* All 3 point into strings behind name  */
129   const char *email_part;       /* or to read-only strings.  */
130   const char *comment_part;
131   char name[1];
132 };
133
134
135 struct gpgme_recipients_s
136 {
137   struct user_id_s *list;
138   int checked;  /* Wether the recipients are all valid.  */
139 };
140
141
142 #define fail_on_pending_request(c)                            \
143           do {                                                \
144                 if (!(c))         return GPGME_Invalid_Value; \
145                 if ((c)->pending) return GPGME_Busy;          \
146              } while (0)
147
148 #define wait_on_request_or_fail(c)                            \
149           do {                                                \
150                 if (!(c))          return GPGME_Invalid_Value;\
151                 if (!(c)->pending) return GPGME_No_Request;   \
152                 gpgme_wait ((c), 1);                          \
153              } while (0)
154
155 #endif  /* CONTEXT_H */