summaryrefslogtreecommitdiff
path: root/src/context.h
blob: e92143682070cc0871538099b10a3c5cff4e40e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* context.h - Definitions for a GPGME context.
   Copyright (C) 2000 Werner Koch (dd9jn)
   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2010 g10 Code GmbH

   This file is part of GPGME.

   GPGME is free software; you can redistribute it and/or modify it
   under the terms of the GNU Lesser General Public License as
   published by the Free Software Foundation; either version 2.1 of
   the License, or (at your option) any later version.

   GPGME is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

#ifndef CONTEXT_H
#define CONTEXT_H

#include "gpgme.h"
#include "engine.h"
#include "wait.h"
#include "sema.h"


extern gpgme_error_t _gpgme_selftest;

/* Operations might require to remember arbitrary information and data
   objects during invocations of the status handler.  The
   ctx_op_data structure provides a generic framework to hook in
   such additional data.  */
typedef enum
  {
    OPDATA_DECRYPT, OPDATA_SIGN, OPDATA_ENCRYPT, OPDATA_PASSPHRASE,
    OPDATA_IMPORT, OPDATA_GENKEY, OPDATA_KEYLIST, OPDATA_EDIT,
    OPDATA_VERIFY, OPDATA_TRUSTLIST, OPDATA_ASSUAN, OPDATA_VFS_MOUNT,
    OPDATA_PASSWD
  } ctx_op_data_id_t;


/* "gpgmeres" in ASCII.  */
#define CTX_OP_DATA_MAGIC 0x736572656d677067ULL
struct ctx_op_data
{
  /* A magic word just to make sure people don't deallocate something
     that ain't a result structure.  */
  unsigned long long magic;

  /* The next element in the linked list, or NULL if this is the last
     element.  Used by op data structures linked into a context.  */
  struct ctx_op_data *next;

  /* The type of the hook data, which can be used by a routine to
     lookup the hook data.  */
  ctx_op_data_id_t type;

  /* The function to release HOOK and all its associated resources.
     Can be NULL if no special deallocation routine is necessary.  */
  void (*cleanup) (void *hook);

  /* The hook that points to the operation data.  */
  void *hook;

  /* The number of outstanding references.  */
  int references;
};
typedef struct ctx_op_data *ctx_op_data_t;


/* The context defines an environment in which crypto operations can
   be performed (sequentially).  */
struct gpgme_context
{
  DECLARE_LOCK (lock);

  /* True if the context was canceled asynchronously.  */
  int canceled;

  /* The engine info for this context.  */
  gpgme_engine_info_t engine_info;

  /* The protocol used by this context.  */
  gpgme_protocol_t protocol;

  /* The running engine process.  */
  engine_t engine;

  /* Engine's sub protocol.  */
  gpgme_protocol_t sub_protocol;

  /* True if armor mode should be used.  */
  unsigned int use_armor : 1;

  /* True if text mode should be used.  */
  unsigned int use_textmode : 1;

  /* Flags for keylist mode.  */
  gpgme_keylist_mode_t keylist_mode;

  /* The current pinnetry mode.  */
  gpgme_pinentry_mode_t pinentry_mode;

  /* Number of certs to be included.  */
  unsigned int include_certs;

  /* The number of keys in signers.  */
  unsigned int signers_len;

  /* Size of the following array.  */
  unsigned int signers_size;
  gpgme_key_t *signers;

  /* The signature notations for this context.  */
  gpgme_sig_notation_t sig_notations;

  /* The locale for the pinentry.  */
  char *lc_ctype;
  char *lc_messages;

  /* The operation data hooked into the context.  */
  ctx_op_data_t op_data;

  /* The user provided passphrase callback and its hook value.  */
  gpgme_passphrase_cb_t passphrase_cb;
  void *passphrase_cb_value;

  /* The user provided progress callback and its hook value.  */
  gpgme_progress_cb_t progress_cb;
  void *progress_cb_value;

  /* A list of file descriptors in active use by the current
     operation.  */
  struct fd_table fdt;
  struct gpgme_io_cbs io_cbs;
};

#endif	/* CONTEXT_H */