* gpgsm/t-encrypt.c (main): Add a simple option parser and allow
[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
29 struct key_queue_item_s {
30     struct key_queue_item_s *next;
31     GpgmeKey key;
32 };
33 struct trust_queue_item_s {
34     struct trust_queue_item_s *next;
35     GpgmeTrustItem item;
36 };
37
38
39 /* Currently we need it at several places, so we put the definition 
40  * into this header file */
41 struct gpgme_context_s
42 {
43   int initialized;
44   /* A gpg request is still pending.  */
45   int pending;
46
47   int use_cms;
48
49   /* At some points we need to remember an error which we can't report
50      immediately.  */
51   GpgmeError error;
52   /* Cancel operation requested.  */
53   int cancel;
54
55   /* The running engine process.  */
56   EngineObject engine;
57
58   /* Level of verbosity to use.  */
59   int verbosity;
60   int use_armor;  
61   int use_textmode;
62   int keylist_mode;
63   int include_certs;
64
65   /* The number of keys in signers.  */
66   int signers_len;
67   /* Size of the following array.  */
68   int signers_size;
69   GpgmeKey *signers;
70
71   struct
72   {
73     VerifyResult verify;
74     DecryptResult decrypt;
75     SignResult sign;
76     EncryptResult encrypt;
77     PassphraseResult passphrase;
78     ImportResult import;
79     DeleteResult delete;
80     GenKeyResult genkey;
81   } result;
82
83   /* Last signature notation.  */
84   GpgmeData notation;
85   /* Last operation info.  */
86   GpgmeData op_info;
87
88   /* Used by keylist.c.  */
89   GpgmeKey tmp_key;
90   /* Something new is available.  */
91   volatile int key_cond;
92   struct key_queue_item_s *key_queue;
93   struct trust_queue_item_s *trust_queue;
94
95   GpgmePassphraseCb passphrase_cb;
96   void *passphrase_cb_value;
97
98   GpgmeProgressCb progress_cb;
99   void *progress_cb_value;
100
101   GpgmeData help_data_1;
102 };
103
104
105 struct gpgme_data_s {
106     size_t len;
107     const char *data;
108     GpgmeDataType type;
109     GpgmeDataMode mode;
110     GpgmeDataEncoding encoding;
111
112     int (*read_cb)( void *, char *, size_t, size_t *);
113     void *read_cb_value;
114     int read_cb_eof;
115
116     size_t readpos;
117     size_t writepos;
118     size_t private_len;
119     char *private_buffer;
120 };
121
122 struct user_id_s {
123     struct user_id_s *next;
124     unsigned int revoked:1;
125     unsigned int invalid:1;
126     GpgmeValidity validity; 
127     const char *name_part;    /* all 3 point into strings behind name */
128     const char *email_part;   /* or to read-only strings */
129     const char *comment_part;
130     char name[1];
131 };
132
133 struct gpgme_recipients_s {
134     struct user_id_s *list;
135     int checked;   /* wether the recipients are all valid */
136 };
137
138
139 #define fail_on_pending_request(c)                            \
140           do {                                                \
141                 if (!(c))         return GPGME_Invalid_Value; \
142                 if ((c)->pending) return GPGME_Busy;          \
143              } while (0)
144
145 #define wait_on_request_or_fail(c)                            \
146           do {                                                \
147                 if (!(c))          return GPGME_Invalid_Value;\
148                 if (!(c)->pending) return GPGME_No_Request;   \
149                 gpgme_wait ((c), 1);                          \
150              } while (0)
151
152 #endif /* CONTEXT_H */