2004-09-30 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / context.h
index 982eb1d..64c5276 100644 (file)
-/* context.h 
*     Copyright (C) 2000 Werner Koch (dd9jn)
- *
- * This file is part of GPGME.
- *
- * GPGME is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
+/* context.h - Definitions for a GPGME context.
+   Copyright (C) 2000 Werner Koch (dd9jn)
+   Copyright (C) 2001, 2002, 2003 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 General Public License as published by
+   the Free Software Foundation; either version 2 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
+   General Public License for more details.
  You should have received a copy of the GNU General Public License
+   along with GPGME; if not, write to the Free Software Foundation,
  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #ifndef CONTEXT_H
 #define CONTEXT_H
 
 #include "gpgme.h"
-#include "types.h"
-#include "rungpg.h"  /* for GpgObject */
-
-typedef enum {
-    RESULT_TYPE_NONE = 0,
-    RESULT_TYPE_VERIFY,
-    RESULT_TYPE_DECRYPT,
-    RESULT_TYPE_SIGN,
-} ResultType;
-
-
-struct key_queue_item_s {
-    struct key_queue_item_s *next;
-    GpgmeKey key;
+#include "engine.h"
+#include "wait.h"
+
+\f
+/* 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
+  } ctx_op_data_id_t;
+
+
+struct ctx_op_data
+{
+  /* The next element in the linked list, or NULL if this is the last
+     element.  */
+  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 dealllocation routine is necessary.  */
+  void (*cleanup) (void *hook);
+
+  /* The hook that points to the operation data.  */
+  void *hook;
 };
-struct trust_queue_item_s {
-    struct trust_queue_item_s *next;
-    GpgmeTrustItem item;
-};
-
+typedef struct ctx_op_data *ctx_op_data_t;
 
-/* Currently we need it at several places, so we put the definition 
- * into this header file */
-struct gpgme_context_s {
-    int initialized;
-    int pending;   /* a gpg request is still pending */
+\f
+/* The context defines an environment in which crypto operations can
+   be performed (sequentially).  */
+struct gpgme_context
+{
+  /* The protocol used by this context.  */
+  gpgme_protocol_t protocol;
 
-    /* at some points we need to allocate memory but we are not
-     * able to handle a malloc problem at that point, so we set this
-     * flag to indicate this condition */
-    int out_of_core;   
-    int cancel;    /* cancel operation request */
+  /* The running engine process.  */
+  engine_t engine;
 
+  /* True if armor mode should be used.  */
+  unsigned int use_armor : 1;
 
-    GpgObject gpg; /* the running gpg process */
+  /* True if text mode should be used.  */
+  unsigned int use_textmode : 1;
 
-    int verbosity;  /* level of verbosity to use */
-    int use_armor;  
-    int use_textmode;
-    int keylist_mode;
+  /* Flags for keylist mode.  */
+  gpgme_keylist_mode_t keylist_mode;
 
-    ResultType result_type;
-    union {
-        VerifyResult verify;
-        DecryptResult decrypt;
-        SignResult sign;
-    } result;
+  /* Number of certs to be included.  */
+  unsigned int include_certs;
 
-    GpgmeData notation;    /* last signature notation */
-
-    GpgmeKey tmp_key;       /* used by keylist.c */
-    volatile int key_cond;  /* something new is available */
-    struct key_queue_item_s *key_queue;
-    struct trust_queue_item_s *trust_queue;
-
-    GpgmePassphraseCb passphrase_cb;
-    void *passphrase_cb_value;
-
-    GpgmeProgressCb progress_cb;
-    void *progress_cb_value;
-
-    GpgmeData help_data_1;
-};
+  /* The number of keys in signers.  */
+  unsigned int signers_len;
 
+  /* Size of the following array.  */
+  unsigned int signers_size;
+  gpgme_key_t *signers;
 
-struct gpgme_data_s {
-    size_t len;
-    const char *data;
-    GpgmeDataType type;
-    GpgmeDataMode mode;
+  /* The locale for the pinentry.  */
+  char *lc_ctype;
+  char *lc_messages;
 
-    int (*read_cb)( void *, char *, size_t, size_t *);
-    void *read_cb_value;
-    int read_cb_eof;
+  /* The operation data hooked into the context.  */
+  ctx_op_data_t op_data;
 
-    size_t readpos;
-    size_t writepos;
-    size_t private_len;
-    char *private_buffer;
-};
+  /* The user provided passphrase callback and its hook value.  */
+  gpgme_passphrase_cb_t passphrase_cb;
+  void *passphrase_cb_value;
 
-struct user_id_s {
-    struct user_id_s *next;
-    GpgmeValidity validity; 
-    const char *name_part;    /* all 3 point into strings behind name */
-    const char *email_part;   /* or to read-only strings */
-    const char *comment_part;
-    char name[1];
-};
+  /* The user provided progress callback and its hook value.  */
+  gpgme_progress_cb_t progress_cb;
+  void *progress_cb_value;
 
-struct gpgme_recipients_s {
-    struct user_id_s *list;
-    int checked;   /* wether the recipients are all valid */
+  /* A list of file descriptors in active use by the current
+     operation.  */
+  struct fd_table fdt;
+  struct gpgme_io_cbs io_cbs;
 };
 
-
-#define fail_on_pending_request(c)                            \
-          do {                                                \
-                if (!(c))         return GPGME_Invalid_Value; \
-                if ((c)->pending) return GPGME_Busy;          \
-             } while (0)
-
-#define wait_on_request_or_fail(c)                            \
-          do {                                                \
-                if (!(c))          return GPGME_Invalid_Value;\
-                if (!(c)->pending) return GPGME_No_Request;   \
-                gpgme_wait ((c), 1);                          \
-             } while (0)
-
-
-
-#endif /* CONTEXT_H */
-
-
-
+#endif /* CONTEXT_H */