Refactor util and common
authorAndre Heinecke <aheinecke@intevation.de>
Wed, 14 Sep 2016 14:08:53 +0000 (16:08 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Wed, 14 Sep 2016 14:13:34 +0000 (16:13 +0200)
* src/Makefile.am: Update accordingly.
* src/common.c: Reduced to platform depentent common code.
* src/common.h: Add util stuff. Include platform indep.
* src/gpgolstr.cpp,
src/engine-assuan.c,
src/gpgoladdin.cpp,
src/mimedataprovider.cpp,
src/mlang-charset.h,
src/msgcache.h,
src/parsecontroller.h,
src/ribbon-callbacks.cpp,
src/windowmessages.cpp: Update accordingly.
* src/mapihelp.h: Include oomhelp to avoid indrection.
* src/util.h: Removed.
* src/common_indep.h, src/common_indep.cpp: New.

--
Platform independent parts of util and common now live in
common_indep.h and common_indep.cpp. Util has been removed
as it basically was another name for common.

16 files changed:
src/Makefile.am
src/common.c
src/common.h
src/common_indep.c [new file with mode: 0644]
src/common_indep.h [new file with mode: 0644]
src/engine-assuan.c
src/gpgoladdin.cpp
src/gpgolstr.cpp
src/mapihelp.h
src/mimedataprovider.h
src/mlang-charset.h
src/msgcache.c
src/parsecontroller.cpp
src/ribbon-callbacks.cpp
src/util.h [deleted file]
src/windowmessages.cpp

index 5fca454..96207d8 100644 (file)
@@ -54,7 +54,8 @@ gpgol_SOURCES = \
        engine.c engine.h           \
         engine-assuan.c engine-assuan.h \
        rfc822parse.c rfc822parse.h \
-        common.h common.c util.h    \
+    common.h common.c \
+    common_indep.h common_indep.c \
        xmalloc.h                   \
         config-dialog.c                    \
        mapihelp.cpp mapihelp.h     \
index 9b554b2..6e41876 100644 (file)
 
 HINSTANCE glob_hinst = NULL;
 
-
-/* The base-64 list used for base64 encoding. */
-static unsigned char bintoasc[64+1] = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                                       "abcdefghijklmnopqrstuvwxyz"
-                                       "0123456789+/");
-
-/* The reverse base-64 list used for base-64 decoding. */
-static unsigned char const asctobin[256] = {
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f,
-  0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
-  0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
-  0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
-  0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
-  0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-  0xff, 0xff, 0xff, 0xff
-};
-
-
-
 void
 set_global_hinstance (HINSTANCE hinst)
 {
@@ -290,56 +256,6 @@ fatal_error (const char *format, ...)
 }
 
 
-void
-out_of_core (void)
-{
-  MessageBox (NULL, "Out of core!", "Fatal Error", MB_OK);
-  abort ();
-}
-
-void*
-xmalloc (size_t n)
-{
-    void *p = malloc (n);
-    if (!p)
-       out_of_core ();
-    return p;
-}
-
-void*
-xcalloc (size_t m, size_t n)
-{
-    void *p = calloc (m, n);
-    if (!p)
-       out_of_core ();
-    return p;
-}
-
-void *
-xrealloc (void *a, size_t n)
-{
-  void *p = realloc (a, n);
-  if (!p)
-    out_of_core ();
-  return p;
-}
-
-char*
-xstrdup (const char *s)
-{
-    char *p = xmalloc (strlen (s)+1);
-    strcpy (p, s);
-    return p;
-}
-
-void
-xfree (void *p)
-{
-    if (p)
-       free (p);
-}
-
-
 /* This is a helper function to load a Windows function from either of
    one DLLs. */
 static HRESULT
@@ -428,119 +344,6 @@ utf8_to_wchar2 (const char *string, size_t len)
 }
 
 
-/* Assume STRING is a Latin-1 encoded and convert it to utf-8.
-   Returns a newly malloced UTF-8 string. */
-char *
-latin1_to_utf8 (const char *string)
-{
-  const char *s;
-  char *buffer, *p;
-  size_t n;
-
-  for (s=string, n=0; *s; s++)
-    {
-      n++;
-      if (*s & 0x80)
-        n++;
-    }
-  buffer = xmalloc (n + 1);
-  for (s=string, p=buffer; *s; s++)
-    {
-      if (*s & 0x80)
-        {
-          *p++ = 0xc0 | ((*s >> 6) & 3);
-          *p++ = 0x80 | (*s & 0x3f);
-        }
-      else
-        *p++ = *s;
-    }
-  *p = 0;
-  return buffer;
-}
-
-
-/* This function is similar to strncpy().  However it won't copy more
-   than N - 1 characters and makes sure that a Nul is appended. With N
-   given as 0, nothing will happen.  With DEST given as NULL, memory
-   will be allocated using xmalloc (i.e. if it runs out of core the
-   function terminates).  Returns DEST or a pointer to the allocated
-   memory.  */
-char *
-mem2str (char *dest, const void *src, size_t n)
-{
-  char *d;
-  const char *s;
-  
-  if (n)
-    {
-      if (!dest)
-        dest = xmalloc (n);
-      d = dest;
-      s = src ;
-      for (n--; n && *s; n--)
-        *d++ = *s++;
-      *d = 0;
-    }
-  else if (!dest)
-    {
-      dest = xmalloc (1);
-      *dest = 0;
-    }
-  
-  return dest;
-}
-
-
-/* Strip off trailing white spaces from STRING.  Returns STRING. */
-char *
-trim_trailing_spaces (char *string)
-{
-  char *p, *mark;
-
-  for (mark=NULL, p=string; *p; p++)
-    {
-      if (strchr (" \t\r\n", *p ))
-        {
-          if (!mark)
-            mark = p;
-       }
-       else
-          mark = NULL;
-    }
-
-  if (mark)
-    *mark = 0;
-  return string;
-}
-
-
-/* Strip off leading and trailing white spaces from STRING.  Returns
-   STRING. */
-char *
-trim_spaces (char *arg_string)
-{
-  char *string = arg_string;
-  char *p, *mark;
-
-  /* Find first non space character. */
-  for (p = string; *p && isascii (*p) && isspace (*p) ; p++ )
-    ;
-  /* Move characters. */
-  for (mark = NULL; (*string = *p); string++, p++ )
-    {
-      if (isascii (*p) && isspace (*p))
-        {
-          if (!mark)
-          mark = string;
-        }
-      else
-        mark = NULL ;
-    }
-  if (mark)
-    *mark = 0;
-  
-  return arg_string;
-}
 
 
 
@@ -763,255 +566,6 @@ get_data_dir (void)
   return dname;
 }
 
-
-
-/* Do in-place decoding of quoted-printable data of LENGTH in BUFFER.
-   Returns the new length of the buffer and stores true at R_SLBRK if
-   the line ended with a soft line break; false is stored if not.
-   This fucntion asssumes that a complete line is passed in
-   buffer.  */
-size_t
-qp_decode (char *buffer, size_t length, int *r_slbrk)
-{
-  char *d, *s;
-
-  if (r_slbrk)
-    *r_slbrk = 0;
-
-  /* Fixme:  We should remove trailing white space first.  */
-  for (s=d=buffer; length; length--)
-    if (*s == '=')
-      {
-        if (length > 2 && hexdigitp (s+1) && hexdigitp (s+2))
-          {
-            s++;
-            *(unsigned char*)d++ = xtoi_2 (s);
-            s += 2;
-            length -= 2;
-          }
-        else if (length > 2 && s[1] == '\r' && s[2] == '\n')
-          {
-            /* Soft line break.  */
-            s += 3;
-            length -= 2;
-            if (r_slbrk && length == 1)
-              *r_slbrk = 1;
-          }
-        else if (length > 1 && s[1] == '\n')
-          {
-            /* Soft line break with only a Unix line terminator. */
-            s += 2;
-            length -= 1;
-            if (r_slbrk && length == 1)
-              *r_slbrk = 1;
-          }
-        else if (length == 1)
-          {
-            /* Soft line break at the end of the line. */
-            s += 1;
-            if (r_slbrk)
-              *r_slbrk = 1;
-          }
-        else
-          *d++ = *s++;
-      }
-    else
-      *d++ = *s++;
-
-  return d - buffer;
-}
-
-/* Return the a quoted printable encoded version of the
-   input string. If outlen is not null the size of the
-   quoted printable string is returned. String will be
-   malloced and zero terminated. Aborts if the output
-   is more then three times the size of the input.
-   This is only basic and does not handle mutliline data. */
-char *
-qp_encode (const char *input, size_t inlen, size_t *r_outlen)
-{
-  size_t max_len = inlen * 3 +1;
-  char *outbuf = xmalloc (max_len);
-  size_t outlen = 0;
-  const unsigned char *p;
-
-  memset (outbuf, 0, max_len);
-
-  for (p = input; inlen; p++, inlen--)
-    {
-      if (*p >= '!' && *p <= '~' && *p != '=')
-        {
-          outbuf[outlen++] = *p;
-        }
-      else if (*p == ' ')
-        {
-          /* Outlook does it this way */
-          outbuf[outlen++] = '_';
-        }
-      else
-        {
-          outbuf[outlen++] = '=';
-          outbuf[outlen++] = tohex ((*p>>4)&15);
-          outbuf[outlen++] = tohex (*p&15);
-        }
-      if (outlen == max_len -1)
-        {
-          log_error ("Quoted printable too long. Bug.");
-          r_outlen = NULL;
-          return NULL;
-        }
-    }
-  if (r_outlen)
-    *r_outlen = outlen;
-  return outbuf;
-}
-
-
-/* Initialize the Base 64 decoder state.  */
-void b64_init (b64_state_t *state)
-{
-  state->idx = 0;
-  state->val = 0;
-  state->stop_seen = 0;
-  state->invalid_encoding = 0;
-}
-
-
-/* Do in-place decoding of base-64 data of LENGTH in BUFFER.  Returns
-   the new length of the buffer. STATE is required to return errors and
-   to maintain the state of the decoder.  */
-size_t
-b64_decode (b64_state_t *state, char *buffer, size_t length)
-{
-  int idx = state->idx;
-  unsigned char val = state->val;
-  int c;
-  char *d, *s;
-
-  if (state->stop_seen)
-    return 0;
-
-  for (s=d=buffer; length; length--, s++)
-    {
-      if (*s == '\n' || *s == ' ' || *s == '\r' || *s == '\t')
-        continue;
-      if (*s == '=')
-        {
-          /* Pad character: stop */
-          if (idx == 1)
-            *d++ = val;
-          state->stop_seen = 1;
-          break;
-        }
-
-      if ((c = asctobin[*(unsigned char *)s]) == 255)
-        {
-          if (!state->invalid_encoding)
-            log_debug ("%s: invalid base64 character %02X at pos %d skipped\n",
-                       __func__, *(unsigned char*)s, (int)(s-buffer));
-          state->invalid_encoding = 1;
-          continue;
-        }
-
-      switch (idx)
-        {
-        case 0:
-          val = c << 2;
-          break;
-        case 1:
-          val |= (c>>4)&3;
-          *d++ = val;
-          val = (c<<4)&0xf0;
-          break;
-        case 2:
-          val |= (c>>2)&15;
-          *d++ = val;
-          val = (c<<6)&0xc0;
-          break;
-        case 3:
-          val |= c&0x3f;
-          *d++ = val;
-          break;
-        }
-      idx = (idx+1) % 4;
-    }
-
-
-  state->idx = idx;
-  state->val = val;
-  return d - buffer;
-}
-
-
-/* Base 64 encode the input. If input is null returns NULL otherwise
-   a pointer to the malloced encoded string. */
-char *
-b64_encode (const char *input, size_t length)
-{
-  size_t out_len = 4 * ((length + 2) / 3);
-  char *ret;
-  int i, j;
-
-  if (!length || !input)
-    {
-      return NULL;
-    }
-  ret = xmalloc (out_len);
-  memset (ret, 0, out_len);
-
-  for (i = 0, j = 0; i < length;)
-    {
-      unsigned int a = i < length ? (unsigned char)input[i++] : 0;
-      unsigned int b = i < length ? (unsigned char)input[i++] : 0;
-      unsigned int c = i < length ? (unsigned char)input[i++] : 0;
-
-      unsigned int triple = (a << 0x10) + (b << 0x08) + c;
-
-      ret[j++] = bintoasc[(triple >> 3 * 6) & 0x3F];
-      ret[j++] = bintoasc[(triple >> 2 * 6) & 0x3F];
-      ret[j++] = bintoasc[(triple >> 1 * 6) & 0x3F];
-      ret[j++] = bintoasc[(triple >> 0 * 6) & 0x3F];
-    }
-
-  if (length % 3)
-    {
-      ret [j - 1] = '=';
-    }
-  if (length % 3 == 1)
-    {
-      ret [j - 2] = '=';
-    }
-
-  return ret;
-}
-
-/* Create a boundary.  Note that mimemaker.c knows about the structure
-   of the boundary (i.e. that it starts with "=-=") so that it can
-   protect against accidently used boundaries within the content.  */
-char *
-generate_boundary (char *buffer)
-{
-  char *p = buffer;
-  int i;
-
-#if RAND_MAX < (64*2*BOUNDARYSIZE)
-#error RAND_MAX is way too small
-#endif
-
-  *p++ = '=';
-  *p++ = '-';
-  *p++ = '=';
-  for (i=0; i < BOUNDARYSIZE-6; i++)
-    *p++ = bintoasc[rand () % 64];
-  *p++ = '=';
-  *p++ = '-';
-  *p++ = '=';
-  *p = 0;
-
-  return buffer;
-}
-
-
 /* Percent-escape the string STR by replacing colons with '%3a'.  If
    EXTRA is not NULL all characters in it are also escaped. */
 char *
index b0959eb..d30d41d 100644 (file)
 #ifndef GPGOL_COMMON_H
 #define GPGOL_COMMON_H
 
-#include <gpgme.h>
-
-#include "util.h"
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
 
+#include <gpgme.h>
+
+#include "common_indep.h"
+
+#include <windows.h>
+
 #ifdef MIME_SEND
 # define MIME_UI_DEFAULT 1
 #else
@@ -41,157 +43,9 @@ extern "C" {
 }
 #endif
 #endif
-
-/* The Registry key used by Gpg4win.  */
-#ifdef WIN64
-# define GPG4WIN_REGKEY_2  "Software\\Wow6432Node\\GNU\\GnuPG"
-#else
-# define GPG4WIN_REGKEY_2  "Software\\GNU\\GnuPG"
-#endif
-#ifdef WIN64
-# define GPG4WIN_REGKEY_3  "Software\\Wow6432Node\\Gpg4win"
-#else
-# define GPG4WIN_REGKEY_3  "Software\\Gpg4win"
-#endif
-/* Identifiers for the protocol.  We use different one than those use
-   by gpgme.  FIXME: We might want to define an unknown protocol to
-   non-null and define such a value also in gpgme. */
-typedef enum
-  {
-    PROTOCOL_UNKNOWN = 0,
-    PROTOCOL_OPENPGP = 1000,
-    PROTOCOL_SMIME   = 1001
-  }
-protocol_t;
-
-
-/* Possible options for the recipient dialog. */
-enum
-  {
-    OPT_FLAG_TEXT     =  2,
-    OPT_FLAG_FORCE    =  4,
-    OPT_FLAG_CANCEL   =  8
-  };
-
-
-typedef enum
-  {
-    GPG_FMT_NONE = 0,       /* do not encrypt attachments */
-    GPG_FMT_CLASSIC = 1,    /* encrypt attachments without any encoding */
-    GPG_FMT_PGP_PEF = 2     /* use the PGP partioned encoding format (PEF) */
-  }
-gpgol_format_t;
-
-/* Type of a message. */
-typedef enum
-  {
-    OPENPGP_NONE = 0,
-    OPENPGP_MSG,
-    OPENPGP_SIG,
-    OPENPGP_CLEARSIG,
-    OPENPGP_PUBKEY,   /* Note, that this type is only partly supported */
-    OPENPGP_SECKEY    /* Note, that this type is only partly supported */
-  }
-openpgp_t;
-
-
 extern HINSTANCE glob_hinst;
 extern UINT      this_dll;
 
-
-/* Passphrase callback structure. */
-struct passphrase_cb_s
-{
-  gpgme_key_t signer;
-  gpgme_ctx_t ctx;
-  char keyid[16+1];
-  char *user_id;
-  char *pass;
-  int opts;
-  int ttl;  /* TTL of the passphrase. */
-  unsigned int decrypt_cmd:1; /* 1 = show decrypt dialog, otherwise secret key
-                                selection. */
-  unsigned int hide_pwd:1;
-  unsigned int last_was_bad:1;
-};
-
-/* Global options - initialized to default by main.c. */
-#ifdef __cplusplus
-extern
-#endif
-struct
-{
-  int enable_debug;         /* Enable extra debug options.  Values
-                                larger than 1 increases the debug log
-                                verbosity.  */
-  int enable_smime;         /* Enable S/MIME support. */
-  int passwd_ttl;            /* Time in seconds the passphrase is stored. */
-  protocol_t default_protocol;/* The default protocol. */
-  int encrypt_default;       /* Encrypt by default. */
-  int sign_default;          /* Sign by default. */
-  int enc_format;            /* Encryption format for attachments. */
-  char *default_key;         /* The key we want to always encrypt to. */
-  int enable_default_key;    /* Enable the use of DEFAULT_KEY. */
-  int preview_decrypt;       /* Decrypt in preview window. */
-  int prefer_html;           /* Prefer html in html/text alternatives. */
-  int body_as_attachment;    /* Present encrypted message as attachment.  */
-  int mime_ui;               /* Only for Addin. Use the PGP/MIME ui */
-
-  /* The compatibility flags. */
-  struct
-  {
-    unsigned int no_msgcache:1;
-    unsigned int no_pgpmime:1;
-    unsigned int no_oom_write:1; /* Don't write using Outlooks object model. */
-    unsigned int no_preview_info:1; /* No preview info about PGP/MIME. */
-    unsigned int old_reply_hack: 1; /* See gpgmsg.cpp:decrypt. */
-    unsigned int auto_decrypt: 1;   /* Try to decrypt when clicked. */
-    unsigned int no_attestation: 1; /* Don't create an attestation. */
-    unsigned int use_mwfmo: 1;      /* Use MsgWaitForMultipleObjects.  */
-  } compat;
-
-  /* The current git commit id.  */
-  unsigned int git_commit;
-
-  /* The forms revision number of the binary.  */
-  int forms_revision;
-
-  /* The stored number of the binary which showed the last announcement.  */
-  int announce_number;
-
-  /* Disable message processing until restart.  This is required to
-     implement message reverting as a perparation to remove GpgOL.  */
-  int disable_gpgol;
-
-} opt;
-
-
-/* The state object used by b64_decode.  */
-struct b64_state_s
-{
-  int idx;
-  unsigned char val;
-  int stop_seen;
-  int invalid_encoding;
-};
-typedef struct b64_state_s b64_state_t;
-
-/* Bit values used for extra log file verbosity.  Value 1 is reserved
-   to enable debug menu options.  */
-#define DBG_IOWORKER       (1<<1)
-#define DBG_IOWORKER_EXTRA (1<<2)
-#define DBG_FILTER         (1<<3)
-#define DBG_FILTER_EXTRA   (1<<4)
-#define DBG_MEMORY         (1<<5)
-#define DBG_COMMANDS       (1<<6)
-#define DBG_MIME_PARSER    (1<<7)
-#define DBG_MIME_DATA      (1<<8)
-#define DBG_OOM            (1<<9)
-#define DBG_OOM_EXTRA      (1<<10)
-
-/* Macros to used in conditionals to enable debug output.  */
-#define debug_commands    (opt.enable_debug & DBG_COMMANDS)
-
 /*-- common.c --*/
 void set_global_hinstance (HINSTANCE hinst);
 void center_window (HWND childwnd, HWND style);
@@ -204,23 +58,12 @@ const char *default_homedir (void);
 char *get_data_dir (void);
 char *get_gpg4win_dir (void);
 
-size_t qp_decode (char *buffer, size_t length, int *r_slbrk);
-char *qp_encode (const char *input, size_t length, size_t* outlen);
-void b64_init (b64_state_t *state);
-size_t b64_decode (b64_state_t *state, char *buffer, size_t length);
-char * b64_encode (const char *input, size_t length);
-
 /* Get a temporary filename with and its name */
 wchar_t *get_tmp_outfile (wchar_t *name, HANDLE *outHandle);
 
 wchar_t *get_pretty_attachment_name (wchar_t *path, protocol_t protocol,
                                      int signature);
 
-/* The length of the boundary - the buffer needs to be allocated one
-   byte larger. */
-#define BOUNDARYSIZE 20
-char *generate_boundary (char *buffer);
-
 /*-- recipient-dialog.c --*/
 unsigned int recipient_dialog_box (gpgme_key_t **ret_rset);
 unsigned int recipient_dialog_box2 (gpgme_key_t *fnd, char **unknown,
@@ -248,6 +91,45 @@ int verify_dialog_box (gpgme_protocol_t protocol,
 /*-- inspectors.cpp --*/
 int initialize_inspectors (void);
 
+#if __GNUC__ >= 4
+# define GPGOL_GCC_A_SENTINEL(a) __attribute__ ((sentinel(a)))
+#else
+# define GPGOL_GCC_A_SENTINEL(a)
+#endif
+
+
+/* i18n stuff */
+#include "w32-gettext.h"
+#define _(a) gettext (a)
+#define N_(a) gettext_noop (a)
+
+
+/*-- common.c --*/
+
+#include "xmalloc.h"
+
+void fatal_error (const char *format, ...);
+
+char *wchar_to_utf8_2 (const wchar_t *string, size_t len);
+wchar_t *utf8_to_wchar2 (const char *string, size_t len);
+char *read_w32_registry_string (const char *root, const char *dir,
+                                const char *name);
+char *percent_escape (const char *str, const char *extra);
+
+void fix_linebreaks (char *str, int *len);
+
+/*-- main.c --*/
+const void *get_128bit_session_key (void);
+const void *get_64bit_session_marker (void);
+void *create_initialization_vector (size_t nbytes);
+
+void read_options (void);
+int write_options (void);
+
+extern int g_ol_version_major;
+
+void log_window_hierarchy (HWND window, const char *fmt,
+                           ...) __attribute__ ((format (printf,2,3)));
 
 #ifdef __cplusplus
 }
diff --git a/src/common_indep.c b/src/common_indep.c
new file mode 100644 (file)
index 0000000..843f455
--- /dev/null
@@ -0,0 +1,463 @@
+/* common_indep.c - Common, platform indepentent routines used by GpgOL
+ *    Copyright (C) 2005, 2007, 2008 g10 Code GmbH
+ *    Copyright (C) 2016 Intevation GmbH
+ *
+ * This file is part of GpgOL.
+ *
+ * GpgOL 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.
+ *
+ * GpgOL 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 Lesser General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "common_indep.h"
+#ifdef HAVE_W32_SYSTEM
+#include <windows.h>
+#endif
+/* The base-64 list used for base64 encoding. */
+static unsigned char bintoasc[64+1] = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+                                       "abcdefghijklmnopqrstuvwxyz"
+                                       "0123456789+/");
+
+/* The reverse base-64 list used for base-64 decoding. */
+static unsigned char const asctobin[256] = {
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f,
+  0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
+  0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
+  0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
+  0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
+  0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff
+};
+
+void
+out_of_core (void)
+{
+#ifdef HAVE_W32_SYSTEM
+  MessageBox (NULL, "Out of core!", "Fatal Error", MB_OK);
+#endif
+  abort ();
+}
+
+void*
+xmalloc (size_t n)
+{
+  void *p = malloc (n);
+  if (!p)
+    out_of_core ();
+  return p;
+}
+
+void*
+xcalloc (size_t m, size_t n)
+{
+  void *p = calloc (m, n);
+  if (!p)
+    out_of_core ();
+  return p;
+}
+
+void *
+xrealloc (void *a, size_t n)
+{
+  void *p = realloc (a, n);
+  if (!p)
+    out_of_core ();
+  return p;
+}
+
+char*
+xstrdup (const char *s)
+{
+  char *p = xmalloc (strlen (s)+1);
+  strcpy (p, s);
+  return p;
+}
+
+void
+xfree (void *p)
+{
+  if (p)
+    free (p);
+}
+
+/* Strip off leading and trailing white spaces from STRING.  Returns
+   STRING. */
+char *
+trim_spaces (char *arg_string)
+{
+  char *string = arg_string;
+  char *p, *mark;
+
+  /* Find first non space character. */
+  for (p = string; *p && isascii (*p) && isspace (*p) ; p++ )
+    ;
+  /* Move characters. */
+  for (mark = NULL; (*string = *p); string++, p++ )
+    {
+      if (isascii (*p) && isspace (*p))
+        {
+          if (!mark)
+            mark = string;
+        }
+      else
+        mark = NULL ;
+    }
+  if (mark)
+    *mark = 0;
+
+  return arg_string;
+}
+/* Assume STRING is a Latin-1 encoded and convert it to utf-8.
+   Returns a newly malloced UTF-8 string. */
+char *
+latin1_to_utf8 (const char *string)
+{
+  const char *s;
+  char *buffer, *p;
+  size_t n;
+
+  for (s=string, n=0; *s; s++)
+    {
+      n++;
+      if (*s & 0x80)
+        n++;
+    }
+  buffer = xmalloc (n + 1);
+  for (s=string, p=buffer; *s; s++)
+    {
+      if (*s & 0x80)
+        {
+          *p++ = 0xc0 | ((*s >> 6) & 3);
+          *p++ = 0x80 | (*s & 0x3f);
+        }
+      else
+        *p++ = *s;
+    }
+  *p = 0;
+  return buffer;
+}
+
+
+/* This function is similar to strncpy().  However it won't copy more
+   than N - 1 characters and makes sure that a Nul is appended. With N
+   given as 0, nothing will happen.  With DEST given as NULL, memory
+   will be allocated using xmalloc (i.e. if it runs out of core the
+   function terminates).  Returns DEST or a pointer to the allocated
+   memory.  */
+char *
+mem2str (char *dest, const void *src, size_t n)
+{
+  char *d;
+  const char *s;
+
+  if (n)
+    {
+      if (!dest)
+        dest = xmalloc (n);
+      d = dest;
+      s = src ;
+      for (n--; n && *s; n--)
+        *d++ = *s++;
+      *d = 0;
+    }
+  else if (!dest)
+    {
+      dest = xmalloc (1);
+      *dest = 0;
+    }
+
+  return dest;
+}
+
+
+/* Strip off trailing white spaces from STRING.  Returns STRING. */
+char *
+trim_trailing_spaces (char *string)
+{
+  char *p, *mark;
+
+  for (mark=NULL, p=string; *p; p++)
+    {
+      if (strchr (" \t\r\n", *p ))
+        {
+          if (!mark)
+            mark = p;
+        }
+      else
+        mark = NULL;
+    }
+
+  if (mark)
+    *mark = 0;
+  return string;
+}
+
+/* Do in-place decoding of quoted-printable data of LENGTH in BUFFER.
+   Returns the new length of the buffer and stores true at R_SLBRK if
+   the line ended with a soft line break; false is stored if not.
+   This fucntion asssumes that a complete line is passed in
+   buffer.  */
+size_t
+qp_decode (char *buffer, size_t length, int *r_slbrk)
+{
+  char *d, *s;
+
+  if (r_slbrk)
+    *r_slbrk = 0;
+
+  /* Fixme:  We should remove trailing white space first.  */
+  for (s=d=buffer; length; length--)
+    if (*s == '=')
+      {
+        if (length > 2 && hexdigitp (s+1) && hexdigitp (s+2))
+          {
+            s++;
+            *(unsigned char*)d++ = xtoi_2 (s);
+            s += 2;
+            length -= 2;
+          }
+        else if (length > 2 && s[1] == '\r' && s[2] == '\n')
+          {
+            /* Soft line break.  */
+            s += 3;
+            length -= 2;
+            if (r_slbrk && length == 1)
+              *r_slbrk = 1;
+          }
+        else if (length > 1 && s[1] == '\n')
+          {
+            /* Soft line break with only a Unix line terminator. */
+            s += 2;
+            length -= 1;
+            if (r_slbrk && length == 1)
+              *r_slbrk = 1;
+          }
+        else if (length == 1)
+          {
+            /* Soft line break at the end of the line. */
+            s += 1;
+            if (r_slbrk)
+              *r_slbrk = 1;
+          }
+        else
+          *d++ = *s++;
+      }
+    else
+      *d++ = *s++;
+
+  return d - buffer;
+}
+
+/* Return the a quoted printable encoded version of the
+   input string. If outlen is not null the size of the
+   quoted printable string is returned. String will be
+   malloced and zero terminated. Aborts if the output
+   is more then three times the size of the input.
+   This is only basic and does not handle mutliline data. */
+char *
+qp_encode (const char *input, size_t inlen, size_t *r_outlen)
+{
+  size_t max_len = inlen * 3 +1;
+  char *outbuf = xmalloc (max_len);
+  size_t outlen = 0;
+  const unsigned char *p;
+
+  memset (outbuf, 0, max_len);
+
+  for (p = input; inlen; p++, inlen--)
+    {
+      if (*p >= '!' && *p <= '~' && *p != '=')
+        {
+          outbuf[outlen++] = *p;
+        }
+      else if (*p == ' ')
+        {
+          /* Outlook does it this way */
+          outbuf[outlen++] = '_';
+        }
+      else
+        {
+          outbuf[outlen++] = '=';
+          outbuf[outlen++] = tohex ((*p>>4)&15);
+          outbuf[outlen++] = tohex (*p&15);
+        }
+      if (outlen == max_len -1)
+        {
+          log_error ("Quoted printable too long. Bug.");
+          r_outlen = NULL;
+          return NULL;
+        }
+    }
+  if (r_outlen)
+    *r_outlen = outlen;
+  return outbuf;
+}
+
+
+/* Initialize the Base 64 decoder state.  */
+void b64_init (b64_state_t *state)
+{
+  state->idx = 0;
+  state->val = 0;
+  state->stop_seen = 0;
+  state->invalid_encoding = 0;
+}
+
+
+/* Do in-place decoding of base-64 data of LENGTH in BUFFER.  Returns
+   the new length of the buffer. STATE is required to return errors and
+   to maintain the state of the decoder.  */
+size_t
+b64_decode (b64_state_t *state, char *buffer, size_t length)
+{
+  int idx = state->idx;
+  unsigned char val = state->val;
+  int c;
+  char *d, *s;
+
+  if (state->stop_seen)
+    return 0;
+
+  for (s=d=buffer; length; length--, s++)
+    {
+      if (*s == '\n' || *s == ' ' || *s == '\r' || *s == '\t')
+        continue;
+      if (*s == '=')
+        {
+          /* Pad character: stop */
+          if (idx == 1)
+            *d++ = val;
+          state->stop_seen = 1;
+          break;
+        }
+
+      if ((c = asctobin[*(unsigned char *)s]) == 255)
+        {
+          if (!state->invalid_encoding)
+            log_debug ("%s: invalid base64 character %02X at pos %d skipped\n",
+                       __func__, *(unsigned char*)s, (int)(s-buffer));
+          state->invalid_encoding = 1;
+          continue;
+        }
+
+      switch (idx)
+        {
+        case 0:
+          val = c << 2;
+          break;
+        case 1:
+          val |= (c>>4)&3;
+          *d++ = val;
+          val = (c<<4)&0xf0;
+          break;
+        case 2:
+          val |= (c>>2)&15;
+          *d++ = val;
+          val = (c<<6)&0xc0;
+          break;
+        case 3:
+          val |= c&0x3f;
+          *d++ = val;
+          break;
+        }
+      idx = (idx+1) % 4;
+    }
+
+
+  state->idx = idx;
+  state->val = val;
+  return d - buffer;
+}
+
+
+/* Base 64 encode the input. If input is null returns NULL otherwise
+   a pointer to the malloced encoded string. */
+char *
+b64_encode (const char *input, size_t length)
+{
+  size_t out_len = 4 * ((length + 2) / 3);
+  char *ret;
+  int i, j;
+
+  if (!length || !input)
+    {
+      return NULL;
+    }
+  ret = xmalloc (out_len);
+  memset (ret, 0, out_len);
+
+  for (i = 0, j = 0; i < length;)
+    {
+      unsigned int a = i < length ? (unsigned char)input[i++] : 0;
+      unsigned int b = i < length ? (unsigned char)input[i++] : 0;
+      unsigned int c = i < length ? (unsigned char)input[i++] : 0;
+
+      unsigned int triple = (a << 0x10) + (b << 0x08) + c;
+
+      ret[j++] = bintoasc[(triple >> 3 * 6) & 0x3F];
+      ret[j++] = bintoasc[(triple >> 2 * 6) & 0x3F];
+      ret[j++] = bintoasc[(triple >> 1 * 6) & 0x3F];
+      ret[j++] = bintoasc[(triple >> 0 * 6) & 0x3F];
+    }
+
+  if (length % 3)
+    {
+      ret [j - 1] = '=';
+    }
+  if (length % 3 == 1)
+    {
+      ret [j - 2] = '=';
+    }
+
+  return ret;
+}
+
+/* Create a boundary.  Note that mimemaker.c knows about the structure
+   of the boundary (i.e. that it starts with "=-=") so that it can
+   protect against accidently used boundaries within the content.  */
+char *
+generate_boundary (char *buffer)
+{
+  char *p = buffer;
+  int i;
+
+#if RAND_MAX < (64*2*BOUNDARYSIZE)
+#error RAND_MAX is way too small
+#endif
+
+  *p++ = '=';
+  *p++ = '-';
+  *p++ = '=';
+  for (i=0; i < BOUNDARYSIZE-6; i++)
+    *p++ = bintoasc[rand () % 64];
+  *p++ = '=';
+  *p++ = '-';
+  *p++ = '=';
+  *p = 0;
+
+  return buffer;
+}
diff --git a/src/common_indep.h b/src/common_indep.h
new file mode 100644 (file)
index 0000000..695be41
--- /dev/null
@@ -0,0 +1,325 @@
+#ifndef COMMON_INDEP_H
+#define COMMON_INDEP_H
+/* common_indep.h - Common, platform indepentent routines used by GpgOL
+ *    Copyright (C) 2005, 2007, 2008 g10 Code GmbH
+ *    Copyright (C) 2016 Intevation GmbH
+ *
+ * This file is part of GpgOL.
+ *
+ * GpgOL 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.
+ *
+ * GpgOL 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 Lesser General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+
+#include <gpgme.h>
+
+/* The Registry key used by Gpg4win.  */
+#ifdef WIN64
+# define GPG4WIN_REGKEY_2  "Software\\Wow6432Node\\GNU\\GnuPG"
+#else
+# define GPG4WIN_REGKEY_2  "Software\\GNU\\GnuPG"
+#endif
+#ifdef WIN64
+# define GPG4WIN_REGKEY_3  "Software\\Wow6432Node\\Gpg4win"
+#else
+# define GPG4WIN_REGKEY_3  "Software\\Gpg4win"
+#endif
+/* Identifiers for the protocol.  We use different one than those use
+   by gpgme.  FIXME: We might want to define an unknown protocol to
+   non-null and define such a value also in gpgme. */
+typedef enum
+  {
+    PROTOCOL_UNKNOWN = 0,
+    PROTOCOL_OPENPGP = 1000,
+    PROTOCOL_SMIME   = 1001
+  }
+protocol_t;
+
+
+/* Possible options for the recipient dialog. */
+enum
+  {
+    OPT_FLAG_TEXT     =  2,
+    OPT_FLAG_FORCE    =  4,
+    OPT_FLAG_CANCEL   =  8
+  };
+
+
+typedef enum
+  {
+    GPG_FMT_NONE = 0,       /* do not encrypt attachments */
+    GPG_FMT_CLASSIC = 1,    /* encrypt attachments without any encoding */
+    GPG_FMT_PGP_PEF = 2     /* use the PGP partioned encoding format (PEF) */
+  }
+gpgol_format_t;
+
+/* Type of a message. */
+typedef enum
+  {
+    OPENPGP_NONE = 0,
+    OPENPGP_MSG,
+    OPENPGP_SIG,
+    OPENPGP_CLEARSIG,
+    OPENPGP_PUBKEY,   /* Note, that this type is only partly supported */
+    OPENPGP_SECKEY    /* Note, that this type is only partly supported */
+  }
+openpgp_t;
+
+
+/* Passphrase callback structure. */
+struct passphrase_cb_s
+{
+  gpgme_key_t signer;
+  gpgme_ctx_t ctx;
+  char keyid[16+1];
+  char *user_id;
+  char *pass;
+  int opts;
+  int ttl;  /* TTL of the passphrase. */
+  unsigned int decrypt_cmd:1; /* 1 = show decrypt dialog, otherwise secret key
+                                selection. */
+  unsigned int hide_pwd:1;
+  unsigned int last_was_bad:1;
+};
+
+/* Global options - initialized to default by main.c. */
+#ifdef __cplusplus
+extern "C" {
+#if 0
+}
+#endif
+#endif
+
+#ifdef __cplusplus
+extern
+#endif
+
+struct
+{
+  int enable_debug;         /* Enable extra debug options.  Values
+                                larger than 1 increases the debug log
+                                verbosity.  */
+  int enable_smime;         /* Enable S/MIME support. */
+  int passwd_ttl;            /* Time in seconds the passphrase is stored. */
+  protocol_t default_protocol;/* The default protocol. */
+  int encrypt_default;       /* Encrypt by default. */
+  int sign_default;          /* Sign by default. */
+  int enc_format;            /* Encryption format for attachments. */
+  char *default_key;         /* The key we want to always encrypt to. */
+  int enable_default_key;    /* Enable the use of DEFAULT_KEY. */
+  int preview_decrypt;       /* Decrypt in preview window. */
+  int prefer_html;           /* Prefer html in html/text alternatives. */
+  int body_as_attachment;    /* Present encrypted message as attachment.  */
+  int mime_ui;               /* Only for Addin. Use the PGP/MIME ui */
+
+  /* The compatibility flags. */
+  struct
+  {
+    unsigned int no_msgcache:1;
+    unsigned int no_pgpmime:1;
+    unsigned int no_oom_write:1; /* Don't write using Outlooks object model. */
+    unsigned int no_preview_info:1; /* No preview info about PGP/MIME. */
+    unsigned int old_reply_hack: 1; /* See gpgmsg.cpp:decrypt. */
+    unsigned int auto_decrypt: 1;   /* Try to decrypt when clicked. */
+    unsigned int no_attestation: 1; /* Don't create an attestation. */
+    unsigned int use_mwfmo: 1;      /* Use MsgWaitForMultipleObjects.  */
+  } compat;
+
+  /* The current git commit id.  */
+  unsigned int git_commit;
+
+  /* The forms revision number of the binary.  */
+  int forms_revision;
+
+  /* The stored number of the binary which showed the last announcement.  */
+  int announce_number;
+
+  /* Disable message processing until restart.  This is required to
+     implement message reverting as a perparation to remove GpgOL.  */
+  int disable_gpgol;
+
+} opt;
+
+
+/* The state object used by b64_decode.  */
+struct b64_state_s
+{
+  int idx;
+  unsigned char val;
+  int stop_seen;
+  int invalid_encoding;
+};
+typedef struct b64_state_s b64_state_t;
+
+/* Bit values used for extra log file verbosity.  Value 1 is reserved
+   to enable debug menu options.  */
+#define DBG_IOWORKER       (1<<1)
+#define DBG_IOWORKER_EXTRA (1<<2)
+#define DBG_FILTER         (1<<3)
+#define DBG_FILTER_EXTRA   (1<<4)
+#define DBG_MEMORY         (1<<5)
+#define DBG_COMMANDS       (1<<6)
+#define DBG_MIME_PARSER    (1<<7)
+#define DBG_MIME_DATA      (1<<8)
+#define DBG_OOM            (1<<9)
+#define DBG_OOM_EXTRA      (1<<10)
+
+/* Macros to used in conditionals to enable debug output.  */
+#define debug_commands    (opt.enable_debug & DBG_COMMANDS)
+
+size_t qp_decode (char *buffer, size_t length, int *r_slbrk);
+char *qp_encode (const char *input, size_t length, size_t* outlen);
+void b64_init (b64_state_t *state);
+size_t b64_decode (b64_state_t *state, char *buffer, size_t length);
+char * b64_encode (const char *input, size_t length);
+
+char *latin1_to_utf8 (const char *string);
+
+char *mem2str (char *dest, const void *src, size_t n);
+
+char *trim_spaces (char *string);
+char *trim_trailing_spaces (char *string);
+
+/* To avoid that a compiler optimizes certain memset calls away, these
+   macros may be used instead. */
+#define wipememory2(_ptr,_set,_len) do { \
+              volatile char *_vptr=(volatile char *)(_ptr); \
+              size_t _vlen=(_len); \
+              while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } \
+                  } while(0)
+#define wipememory(_ptr,_len) wipememory2(_ptr,0,_len)
+#define wipestring(_ptr) do { \
+              volatile char *_vptr=(volatile char *)(_ptr); \
+              while(*_vptr) { *_vptr=0; _vptr++; } \
+                  } while(0)
+
+#define debug_oom        (opt.enable_debug & DBG_OOM)
+#define debug_oom_extra  (opt.enable_debug & DBG_OOM_EXTRA)
+void log_debug (const char *fmt, ...) __attribute__ ((format (printf,1,2)));
+void log_error (const char *fmt, ...) __attribute__ ((format (printf,1,2)));
+void log_vdebug (const char *fmt, va_list a);
+void log_debug_w32 (int w32err, const char *fmt,
+                    ...) __attribute__ ((format (printf,2,3)));
+void log_error_w32 (int w32err, const char *fmt,
+                    ...) __attribute__ ((format (printf,2,3)));
+void log_hexdump (const void *buf, size_t buflen, const char *fmt,
+                  ...)  __attribute__ ((format (printf,3,4)));
+
+#define log_oom if (opt.enable_debug & DBG_OOM) log_debug
+#define log_oom_extra if (opt.enable_debug & DBG_OOM_EXTRA) log_debug
+#define log_mime_parser if (opt.enable_debug & DBG_MIME_PARSER) log_debug
+
+#define gpgol_release(X) \
+{ \
+  if (X && opt.enable_debug & DBG_OOM_EXTRA) \
+    { \
+      log_debug ("%s:%s: Object: %p released ref: %lu \n", \
+                 SRCNAME, __func__, X, X->Release()); \
+    } \
+  else if (X) \
+    { \
+      X->Release(); \
+    } \
+}
+
+const char *log_srcname (const char *s);
+#define SRCNAME log_srcname (__FILE__)
+
+#define TRACEPOINT log_debug ("%s:%s:%d: tracepoint\n", \
+                              SRCNAME, __func__, __LINE__);
+
+const char *get_log_file (void);
+void set_log_file (const char *name);
+void set_default_key (const char *name);
+
+/*-- Convenience macros. -- */
+#define DIM(v)              (sizeof(v)/sizeof((v)[0]))
+#define DIMof(type,member)   DIM(((type *)0)->member)
+
+/*-- Macros to replace ctype ones to avoid locale problems. --*/
+#define spacep(p)   (*(p) == ' ' || *(p) == '\t')
+#define digitp(p)   (*(p) >= '0' && *(p) <= '9')
+#define hexdigitp(a) (digitp (a)                     \
+                      || (*(a) >= 'A' && *(a) <= 'F')  \
+                      || (*(a) >= 'a' && *(a) <= 'f'))
+  /* Note this isn't identical to a C locale isspace() without \f and
+     \v, but works for the purposes used here. */
+#define ascii_isspace(a) ((a)==' ' || (a)=='\n' || (a)=='\r' || (a)=='\t')
+
+/* The atoi macros assume that the buffer has only valid digits. */
+#define atoi_1(p)   (*(p) - '0' )
+#define atoi_2(p)   ((atoi_1(p) * 10) + atoi_1((p)+1))
+#define atoi_4(p)   ((atoi_2(p) * 100) + atoi_2((p)+2))
+#define xtoi_1(p)   (*(p) <= '9'? (*(p)- '0'): \
+                     *(p) <= 'F'? (*(p)-'A'+10):(*(p)-'a'+10))
+#define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))
+#define xtoi_4(p)   ((xtoi_2(p) * 256) + xtoi_2((p)+2))
+
+#define tohex(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'A'))
+
+#define tohex_lower(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'a'))
+/***** Inline functions.  ****/
+
+/* Return true if LINE consists only of white space (up to and
+   including the LF). */
+static inline int
+trailing_ws_p (const char *line)
+{
+  for ( ; *line && *line != '\n'; line++)
+    if (*line != ' ' && *line != '\t' && *line != '\r')
+      return 0;
+  return 1;
+}
+
+/* An strcmp variant with the compare ending at the end of B.  */
+static inline int
+tagcmp (const char *a, const char *b)
+{
+  return strncmp (a, b, strlen (b));
+}
+
+
+/*****  Missing functions.  ****/
+
+#ifndef HAVE_STPCPY
+static inline char *
+_gpgol_stpcpy (char *a, const char *b)
+{
+  while (*b)
+    *a++ = *b++;
+  *a = 0;
+  return a;
+}
+#define stpcpy(a,b) _gpgol_stpcpy ((a), (b))
+#endif /*!HAVE_STPCPY*/
+
+#ifdef WIN64
+#define SIZE_T_FORMAT "%I64u"
+#else
+#define SIZE_T_FORMAT "%u"
+#endif
+
+/* The length of the boundary - the buffer needs to be allocated one
+   byte larger. */
+#define BOUNDARYSIZE 20
+char *generate_boundary (char *buffer);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // COMMON_INDEP_H
index c60713b..5375563 100644 (file)
@@ -31,7 +31,6 @@
 #include "common.h"
 #include "engine.h"
 #include "engine-assuan.h"
-#include "util.h"
 #include "exechelp.h"
 
 /* Debug macros.  */
index 7c1ba7f..58d2a58 100644 (file)
 #include <stdio.h>
 #include <string.h>
 
-#include "util.h"
+#include "common.h"
 #include "gpgoladdin.h"
 
 #include "mymapi.h"
 #include "mymapitags.h"
 #include "myexchext.h"
 
-#include "common.h"
 #include "display.h"
 #include "msgcache.h"
 #include "engine.h"
index d24dd35..9c5ec28 100644 (file)
@@ -17,7 +17,7 @@
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 #include "gpgolstr.h"
-#include "util.h"
+#include "common.h"
 
 GpgOLStr::GpgOLStr(const char *str) :
   m_utf8str(NULL), m_widestr(NULL)
index da60531..c7d42e2 100644 (file)
@@ -26,6 +26,11 @@ extern "C" {
 }
 #endif
 #endif
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <oomhelp.h>
 
 /* The list of message types we support in GpgOL.  */
 typedef enum 
index 9722d00..b24c6a5 100644 (file)
 #ifndef MIMEDATAPROVIDER_H
 #define MIMEDATAPROVIDER_H
 
+#include "config.h"
+
 #include <gpgme++/interfaces/dataprovider.h>
 #include <gpgme++/data.h>
-#include "oomhelp.h"
-#include "mapihelp.h"
 #include "rfc822parse.h"
 
+#ifdef HAVE_W32_SYSTEM
+#include "mapihelp.h"
+#endif
+
 #include <string>
 struct mime_context;
 typedef struct mime_context *mime_context_t;
@@ -58,9 +62,14 @@ class MimeDataProvider : public GpgME::DataProvider
 public:
   /* Create an empty dataprovider, useful for writing to. */
   MimeDataProvider();
+#ifdef HAVE_W32_SYSTEM
   /* Read and parse the stream. Does not hold a reference
      to the stream but releases it after read. */
   MimeDataProvider(LPSTREAM stream);
+#else
+  /* Test instrumentation. */
+  MimeDataProvider(FILE *stream);
+#endif
   ~MimeDataProvider();
 
   /* Dataprovider interface */
index 3c55fd3..470ec02 100644 (file)
@@ -19,7 +19,7 @@
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "util.h"
+#include "common.h"
 #ifdef __cplusplus
 extern "C" {
 #if 0
index 252f5cd..bb132b0 100644 (file)
@@ -69,7 +69,7 @@
 #include "mymapitags.h"
 
 #include "msgcache.h"
-#include "util.h"
+#include "common.h"
 
 
 /* We limit the size of the cache to this value. The cache might take
index 0005c61..abda537 100644 (file)
@@ -19,7 +19,7 @@
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 #include "config.h"
-#include "common.h"
+#include "common_indep.h"
 
 #include "parsecontroller.h"
 #include "attachment.h"
index dccd3b2..12f40e7 100644 (file)
@@ -31,7 +31,7 @@
 
 #include "ribbon-callbacks.h"
 #include "gpgoladdin.h"
-#include "util.h"
+#include "common.h"
 
 #include "mymapi.h"
 #include "mymapitags.h"
diff --git a/src/util.h b/src/util.h
deleted file mode 100644 (file)
index 0b78332..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-/* util.h - Common functions.
- *     Copyright (C) 2005 g10 Code GmbH
- *
- * This file is part of GpgOL.
- * 
- * GpgOL 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.
- * 
- * GpgOL 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 UTIL_H
-#define UTIL_H
-
-#ifdef __cplusplus
-extern "C" {
-#if 0
-}
-#endif
-#endif
-
-#if __GNUC__ >= 4 
-# define GPGOL_GCC_A_SENTINEL(a) __attribute__ ((sentinel(a)))
-#else
-# define GPGOL_GCC_A_SENTINEL(a) 
-#endif
-
-
-/* To avoid that a compiler optimizes certain memset calls away, these
-   macros may be used instead. */
-#define wipememory2(_ptr,_set,_len) do { \
-              volatile char *_vptr=(volatile char *)(_ptr); \
-              size_t _vlen=(_len); \
-              while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } \
-                  } while(0)
-#define wipememory(_ptr,_len) wipememory2(_ptr,0,_len)
-#define wipestring(_ptr) do { \
-              volatile char *_vptr=(volatile char *)(_ptr); \
-              while(*_vptr) { *_vptr=0; _vptr++; } \
-                  } while(0)
-
-#include <windows.h>
-
-/* i18n stuff */
-#include "w32-gettext.h"
-#define _(a) gettext (a)
-#define N_(a) gettext_noop (a)
-
-
-/*-- common.c --*/
-
-#include "xmalloc.h"
-
-void fatal_error (const char *format, ...);
-
-char *wchar_to_utf8_2 (const wchar_t *string, size_t len);
-wchar_t *utf8_to_wchar2 (const char *string, size_t len);
-char *latin1_to_utf8 (const char *string);
-
-char *mem2str (char *dest, const void *src, size_t n);
-
-char *trim_spaces (char *string);
-char *trim_trailing_spaces (char *string);
-char *read_w32_registry_string (const char *root, const char *dir,
-                                const char *name);
-char *percent_escape (const char *str, const char *extra);
-
-void fix_linebreaks (char *str, int *len);
-
-/*-- main.c --*/
-const void *get_128bit_session_key (void);
-const void *get_64bit_session_marker (void);
-void *create_initialization_vector (size_t nbytes);
-
-#define debug_oom        (opt.enable_debug & DBG_OOM)
-#define debug_oom_extra  (opt.enable_debug & DBG_OOM_EXTRA)
-void log_debug (const char *fmt, ...) __attribute__ ((format (printf,1,2)));
-void log_error (const char *fmt, ...) __attribute__ ((format (printf,1,2)));
-void log_vdebug (const char *fmt, va_list a);
-void log_debug_w32 (int w32err, const char *fmt,
-                    ...) __attribute__ ((format (printf,2,3)));
-void log_error_w32 (int w32err, const char *fmt,
-                    ...) __attribute__ ((format (printf,2,3)));
-void log_hexdump (const void *buf, size_t buflen, const char *fmt, 
-                  ...)  __attribute__ ((format (printf,3,4)));
-void log_window_hierarchy (HWND window, const char *fmt, 
-                           ...) __attribute__ ((format (printf,2,3)));
-
-#define log_oom if (opt.enable_debug & DBG_OOM) log_debug
-#define log_oom_extra if (opt.enable_debug & DBG_OOM_EXTRA) log_debug
-#define log_mime_parser if (opt.enable_debug & DBG_MIME_PARSER) log_debug
-
-#define gpgol_release(X) \
-{ \
-  if (X && opt.enable_debug & DBG_OOM_EXTRA) \
-    { \
-      log_debug ("%s:%s: Object: %p released ref: %lu \n", \
-                 SRCNAME, __func__, X, X->Release()); \
-    } \
-  else if (X) \
-    { \
-      X->Release(); \
-    } \
-}
-
-const char *log_srcname (const char *s);
-#define SRCNAME log_srcname (__FILE__)
-
-#define TRACEPOINT log_debug ("%s:%s:%d: tracepoint\n", \
-                              SRCNAME, __func__, __LINE__);
-
-const char *get_log_file (void);
-void set_log_file (const char *name);
-void set_default_key (const char *name);
-void read_options (void);
-int write_options (void);
-
-/*-- Convenience macros. -- */
-#define DIM(v)              (sizeof(v)/sizeof((v)[0]))
-#define DIMof(type,member)   DIM(((type *)0)->member)
-
-/*-- Macros to replace ctype ones to avoid locale problems. --*/
-#define spacep(p)   (*(p) == ' ' || *(p) == '\t')
-#define digitp(p)   (*(p) >= '0' && *(p) <= '9')
-#define hexdigitp(a) (digitp (a)                     \
-                      || (*(a) >= 'A' && *(a) <= 'F')  \
-                      || (*(a) >= 'a' && *(a) <= 'f'))
-  /* Note this isn't identical to a C locale isspace() without \f and
-     \v, but works for the purposes used here. */
-#define ascii_isspace(a) ((a)==' ' || (a)=='\n' || (a)=='\r' || (a)=='\t')
-
-/* The atoi macros assume that the buffer has only valid digits. */
-#define atoi_1(p)   (*(p) - '0' )
-#define atoi_2(p)   ((atoi_1(p) * 10) + atoi_1((p)+1))
-#define atoi_4(p)   ((atoi_2(p) * 100) + atoi_2((p)+2))
-#define xtoi_1(p)   (*(p) <= '9'? (*(p)- '0'): \
-                     *(p) <= 'F'? (*(p)-'A'+10):(*(p)-'a'+10))
-#define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))
-#define xtoi_4(p)   ((xtoi_2(p) * 256) + xtoi_2((p)+2))
-
-#define tohex(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'A'))
-
-#define tohex_lower(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'a'))
-/***** Inline functions.  ****/
-
-/* Return true if LINE consists only of white space (up to and
-   including the LF). */
-static inline int
-trailing_ws_p (const char *line)
-{
-  for ( ; *line && *line != '\n'; line++)
-    if (*line != ' ' && *line != '\t' && *line != '\r')
-      return 0;
-  return 1;
-}
-
-/* An strcmp variant with the compare ending at the end of B.  */
-static inline int
-tagcmp (const char *a, const char *b)
-{
-  return strncmp (a, b, strlen (b));
-}
-
-
-/*****  Missing functions.  ****/
-
-#ifndef HAVE_STPCPY
-static inline char *
-_gpgol_stpcpy (char *a, const char *b)
-{
-  while (*b)
-    *a++ = *b++;
-  *a = 0;
-  return a;
-}
-#define stpcpy(a,b) _gpgol_stpcpy ((a), (b))
-#endif /*!HAVE_STPCPY*/
-
-extern int g_ol_version_major;
-
-#ifdef WIN64
-#define SIZE_T_FORMAT "%I64u"
-#else
-#define SIZE_T_FORMAT "%u"
-#endif
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif /*UTIL_H*/
index d850a8c..c1d7a18 100644 (file)
@@ -20,7 +20,7 @@
  */
 #include "windowmessages.h"
 
-#include "util.h"
+#include "common.h"
 #include "oomhelp.h"
 #include "mail.h"