2001-11-16 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / context.h
1 /* context.h 
2  *      Copyright (C) 2000 Werner Koch (dd9jn)
3  *      Copyright (C) 2001 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 "rungpg.h"  /* for GpgObject */
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     int initialized;
43     int pending;   /* a gpg request is still pending */
44
45     int use_cms;
46
47     /* at some points we need to allocate memory but we are not
48      * able to handle a malloc problem at that point, so we set this
49      * flag to indicate this condition */
50     int out_of_core;   
51     int cancel;    /* cancel operation request */
52
53
54     GpgObject gpg; /* the running gpg process */
55
56     int verbosity;  /* level of verbosity to use */
57     int use_armor;  
58     int use_textmode;
59     int keylist_mode;
60
61     int signers_len;   /* The number of keys in signers.  */
62     int signers_size;  /* size of the following array */
63     GpgmeKey *signers;
64
65     struct {
66         VerifyResult verify;
67         DecryptResult decrypt;
68         SignResult sign;
69         EncryptResult encrypt;
70         PassphraseResult passphrase;
71     } result;
72
73     GpgmeData notation;    /* last signature notation */
74     GpgmeData op_info;     /* last operation info */
75
76     GpgmeKey tmp_key;       /* used by keylist.c */
77     volatile int key_cond;  /* something new is available */
78     struct key_queue_item_s *key_queue;
79     struct trust_queue_item_s *trust_queue;
80
81     GpgmePassphraseCb passphrase_cb;
82     void *passphrase_cb_value;
83
84     GpgmeProgressCb progress_cb;
85     void *progress_cb_value;
86
87     GpgmeData help_data_1;
88 };
89
90
91 struct gpgme_data_s {
92     size_t len;
93     const char *data;
94     GpgmeDataType type;
95     GpgmeDataMode mode;
96
97     int (*read_cb)( void *, char *, size_t, size_t *);
98     void *read_cb_value;
99     int read_cb_eof;
100
101     size_t readpos;
102     size_t writepos;
103     size_t private_len;
104     char *private_buffer;
105 };
106
107 struct user_id_s {
108     struct user_id_s *next;
109     unsigned int revoked:1;
110     unsigned int invalid:1;
111     GpgmeValidity validity; 
112     const char *name_part;    /* all 3 point into strings behind name */
113     const char *email_part;   /* or to read-only strings */
114     const char *comment_part;
115     char name[1];
116 };
117
118 struct gpgme_recipients_s {
119     struct user_id_s *list;
120     int checked;   /* wether the recipients are all valid */
121 };
122
123
124 #define fail_on_pending_request(c)                            \
125           do {                                                \
126                 if (!(c))         return GPGME_Invalid_Value; \
127                 if ((c)->pending) return GPGME_Busy;          \
128              } while (0)
129
130 #define wait_on_request_or_fail(c)                            \
131           do {                                                \
132                 if (!(c))          return GPGME_Invalid_Value;\
133                 if (!(c)->pending) return GPGME_No_Request;   \
134                 gpgme_wait ((c), 1);                          \
135              } while (0)
136
137
138
139 #endif /* CONTEXT_H */
140
141
142