Still working on it. ...
authorWerner Koch <wk@gnupg.org>
Thu, 25 Aug 2005 18:48:57 +0000 (18:48 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 25 Aug 2005 18:48:57 +0000 (18:48 +0000)
src/Makefile.am
src/MapiGPGME.cpp
src/MapiGPGME.h
src/bitmap1.bmp [deleted file]
src/engine-gpgme.c
src/gpgmsg.cpp
src/gpgmsg.hh
src/logo.bmp [new file with mode: 0644]
src/olflange-dlgs.cpp
src/olflange-rsrcs.rc
src/olflange.cpp

index abbf3b9..5e4ed23 100644 (file)
@@ -12,7 +12,8 @@
 ## Process this file with automake to produce Makefile.in
 
 bin_PROGRAMS = outlgpg 
-EXTRA_DIST = versioninfo.rc.in outlgpg-rsrcs.rc olflange-rsrcs.rc       
+EXTRA_DIST = versioninfo.rc.in outlgpg-rsrcs.rc olflange-rsrcs.rc \
+            logo.bmp decrypt.bmp encrypt.bmp sign.bmp key_mana.bmp    
 EXEEXT = .dll
 
 AM_CFLAGS = $(GPGME_CFLAGS) -shared
index e1dc0dd..ade8bb8 100644 (file)
@@ -138,9 +138,7 @@ public:
     return PACKAGE_VERSION;
   }
     
-  int __stdcall encrypt (HWND hwnd, GpgMsg *msg);
   int __stdcall decrypt (HWND hwnd, GpgMsg *msg);
-  int __stdcall sign (HWND hwnd, GpgMsg *msg);
   int __stdcall signEncrypt (HWND hwnd, GpgMsg *msg);
   int __stdcall verify (HWND hwnd, GpgMsg *msg);
   int __stdcall attachPublicKey (const char *keyid);
@@ -558,17 +556,6 @@ MapiGPGMEImpl::freeKeyArray (void **key)
 }
 
 
-/* Return the number of recipients in the array RECIPIENTS. */
-static int 
-count_recipients (char **recipients)
-{
-  int i;
-  
-  for (i=0; recipients[i] != NULL; i++)
-    ;
-  return i;
-}
-
 
 
 void
@@ -628,81 +615,6 @@ add_html_line_endings (const char *body)
 }
 
 
-/* Encrypt the message MSG. */
-int 
-MapiGPGMEImpl::encrypt (HWND hwnd, GpgMsg *msg)
-{
-  log_debug ("%s:%s: enter\n", __FILE__, __func__);
-  gpgme_key_t *keys = NULL;
-  gpgme_key_t *keys2 = NULL;
-  bool is_html;
-  const char *plaintext;
-  char *ciphertext;
-  char **recipients = msg->getRecipients ();
-  char **unknown = NULL;
-  int opts = 0;
-  int err = 0;
-  size_t all = 0;
-  int n;
-  
-
-  if (!msg || !*(plaintext = msg->getOrigText ())) 
-    {
-      free_recipient_array (recipients);
-      return 0;  /* Empty message - Nothing to encrypt.  FIXME: What
-                    about attachments without a body - is that possible?  */
-    }
-
-  n = op_lookup_keys (recipients, &keys, &unknown, &all);
-  log_debug ("%s: found %d need %d (%p)\n", __func__, n, all, unknown);
-
-  if (n != count_recipients (recipients))
-    {
-      log_debug ("recipient_dialog_box2\n");
-      recipient_dialog_box2 (keys, unknown, all, &keys2, &opts);
-      xfree (keys);
-      keys = keys2;
-      if (opts & OPT_FLAG_CANCEL) 
-        {
-          free_recipient_array (recipients);
-          return 0;
-       }
-    }
-
-  err = op_encrypt (plaintext, &ciphertext, keys, NULL, 0);
-  if (err)
-    MessageBox (NULL, op_strerror (err),
-                "GPG Encryption", MB_ICONERROR|MB_OK);
-  else 
-    {
-      if (is_html) 
-        {
-          msg->setCipherText (add_html_line_endings (ciphertext), true);
-          ciphertext = NULL;
-        }
-      else
-        msg->setCipherText (ciphertext, false);
-      xfree (ciphertext);
-  }
-
-  free_recipient_array (recipients);
-  freeUnknownKeys (unknown, n);
-  if (!err && msg->hasAttachments ())
-    {
-      unsigned int n;
-      
-      n = msg->getAttachments ();
-      log_debug ("%s:%s: message has %u attachments\n", __FILE__, __func__, n);
-      for (int i=0; !err && i < n; i++) 
-        err = msg->encryptAttachment (hwnd, i, keys, NULL, 0);
-      if (err)
-        MessageBox (NULL, op_strerror (err),
-                    "GPG Attachment Encryption", MB_ICONERROR|MB_OK);
-    }
-  freeKeyArray ((void **)keys);
-  return err;
-}
-
 
 /* Decrypt the message MSG and update the window.  HWND identifies the
    current window. */
@@ -797,63 +709,13 @@ MapiGPGMEImpl::decrypt (HWND hwnd, GpgMsg * msg)
 }
 
 
-/* Sign the current message. Returns 0 on success. */
-int
-MapiGPGMEImpl::sign (HWND hwnd, GpgMsg * msg)
-{
-  char *signedtext;
-  int err = 0;
-  gpgme_key_t sign_key;
-
-  log_debug ("%s.%s: enter\n", __FILE__, __func__);
-  
-  /* We don't sign an empty body - a signature on a zero length string
-     is pretty much useless. */
-  if (!msg || !*msg->getOrigText ()) 
-    {
-      log_debug ("MapiGPGME.sign: leave (empty message)\n");
-      return 0;
-    }
-
-  /* Pop up a dialog box to ask for the signer of the message. */
-  if (signer_dialog_box (&sign_key, NULL) == -1)
-    {
-      log_debug ("%s.%s: leave (dialog failed)\n", __FILE__, __func__);
-      return gpg_error (GPG_ERR_CANCELED);  
-    }
-
-  err = op_sign (msg->getOrigText (), &signedtext, 
-                 OP_SIG_CLEAR, sign_key, nstorePasswd);
-  if (err)
-    MessageBox (NULL, op_strerror (err), "GPG Sign", MB_ICONERROR|MB_OK);
-  else
-    {
-      msg->setSignedText (signedtext);
-    }
-  
-  if (autoSignAtt && msg->hasAttachments ())
-    {
-      unsigned int n;
-      
-      n = msg->getAttachments ();
-      log_debug ("%s:%s: message has %u attachments\n", __FILE__, __func__, n);
-      for (int i=0; i < n; i++) 
-        msg->signAttachment (hwnd, i, sign_key, nstorePasswd);
-      /* FIXME: we should throw an error if signing of any attachment
-         failed. */
-    }
-
-  gpgme_key_release (sign_key);
-  log_debug ("%s:%s: leave (err=%d)\n", __FILE__, __func__, err);
-  return err;
-}
-
 
 /* Perform a sign+encrypt operation using the data already store in
    the instance variables. Return 0 on success. */
 int
 MapiGPGMEImpl::signEncrypt (HWND hwnd, GpgMsg *msg)
 {
+#if 0
   log_debug ("%s:%s: enter\n", __FILE__, __func__);
   char **recipients = msg->getRecipients ();
   char **unknown = NULL;
@@ -932,6 +794,7 @@ MapiGPGMEImpl::signEncrypt (HWND hwnd, GpgMsg *msg)
   free_recipient_array (recipients);
   log_debug ("%s:%s: leave (rc=%d)\n", err);
   return err;
+#endif
 }
 
 
index d56f686..d69189e 100644 (file)
@@ -45,9 +45,7 @@ public:
 
   virtual const char * __stdcall versionString (void) = 0;
 
-  virtual int __stdcall encrypt (HWND hwnd, GpgMsg *msg) = 0;
   virtual int __stdcall decrypt (HWND hwnd, GpgMsg *msg) = 0;
-  virtual int __stdcall sign (HWND hwnd, GpgMsg *msg) = 0;
   virtual int __stdcall signEncrypt (HWND hwnd, GpgMsg *msg) = 0;
   virtual int __stdcall verify (HWND hwnd, GpgMsg *msg) = 0;
   virtual int __stdcall attachPublicKey (const char *keyid) = 0;
diff --git a/src/bitmap1.bmp b/src/bitmap1.bmp
deleted file mode 100644 (file)
index 1c4f5aa..0000000
Binary files a/src/bitmap1.bmp and /dev/null differ
index fdce374..f03ec51 100644 (file)
 static char *debug_file = NULL;
 static int init_done = 0;
 
-/* dummy */
-//struct _gpgme_engine_info  _gpgme_engine_ops_gpgsm;
-
-
 static void
 cleanup (void)
 {
@@ -757,14 +753,3 @@ op_strerror (int err)
 }
 
 
-
-#if 0
-long 
-ftello (FILE *f)
-{
-    /* XXX: find out if this is really needed */
-    printf ("fd %d pos %ld\n", fileno(f), (long)ftell(f));
-    return ftell (f);
-}
-#endif
-
index c9823af..093be8b 100644 (file)
@@ -30,7 +30,7 @@
 #include "mymapi.h"
 #include "mymapitags.h"
 
-
+#include "intern.h"
 #include "gpgmsg.hh"
 #include "util.h"
 #include "msgcache.h"
@@ -125,6 +125,10 @@ public:
   void setSignedText (char *string);
   void saveChanges (bool permanent);
   bool matchesString (const char *string);
+
+  int encrypt (HWND hwnd);
+  int sign (HWND hwnd);
+
   char **getRecipients (void);
   unsigned int getAttachments (void);
   void decryptAttachment (HWND hwnd, int pos, bool save_plaintext, int ttl);
@@ -524,9 +528,203 @@ GpgMsgImpl::getRecipients ()
 }
 
 
+\f
+/* Release an arrat of GPGME keys. */
+static void 
+free_key_array (gpgme_key_t *keys)
+{
+  if (keys)
+    {
+      for (int i = 0; keys[i]; i++) 
+       gpgme_key_release (keys[i]);
+      xfree (keys);
+    }
+}
+
+/* Release an array of strings with recipient names. */
+static void
+free_recipient_array (char **recipients)
+{
+  int i;
+
+  if (recipients)
+    {
+      for (i=0; recipients[i]; i++) 
+       xfree (recipients[i]);  
+      xfree (recipients);
+    }
+}
+
+/* Return the number of recipients in the array RECIPIENTS. */
+static int 
+count_recipients (char **recipients)
+{
+  int i;
+  
+  for (i=0; recipients[i] != NULL; i++)
+    ;
+  return i;
+}
+
+
+/* Encrypt the entire message including all attachments. Returns 0 on
+   success. */
+int 
+GpgMsgImpl::encrypt (HWND hwnd)
+{
+  log_debug ("%s:%s: enter\n", __FILE__, __func__);
+  gpgme_key_t *keys = NULL;
+  bool is_html;
+  const char *plaintext;
+  char *ciphertext = NULL;
+  char **recipients = NULL;
+  char **unknown = NULL;
+  int err = 0;
+  size_t all = 0;
+  int n_keys;
+  
+  if (!*(plaintext = getOrigText ()) && !hasAttachments ()) 
+    {
+      log_debug ("%s:%s: leave (empty)", __FILE__, __func__);
+      return 0; 
+    }
+
+  recipients = getRecipients ();
+  n_keys = op_lookup_keys (recipients, &keys, &unknown, &all);
+
+  log_debug ("%s:%s: found %d recipients, need %d, unknown=%p\n",
+             __FILE__, __func__, n_keys, all, unknown);
+  
+  if (n_keys != count_recipients (recipients))
+    {
+      int opts = 0;
+      gpgme_key_t *keys2 = NULL;
+
+      log_debug ("%s:%s: calling recipient_dialog_box2", __FILE__, __func__);
+      recipient_dialog_box2 (keys, unknown, all, &keys2, &opts);
+      xfree (keys);
+      keys = keys2;
+      if (opts & OPT_FLAG_CANCEL) 
+        {
+          err = gpg_error (GPG_ERR_CANCELED);
+          goto leave;
+       }
+    }
+
+  if (*plaintext)
+    {
+      err = op_encrypt (plaintext, &ciphertext, keys, NULL, 0);
+      if (err)
+        {
+          MessageBox (NULL, op_strerror (err),
+                      "GPG Encryption", MB_ICONERROR|MB_OK);
+          goto leave;
+        }
+
+      // Need to figure out whether the plaintext was HTML encoded.
+//       if (is_html) 
+//         {
+//           setCipherText (add_html_line_endings (ciphertext), true);
+//           ciphertext = NULL;
+//         }
+//       else
+      setCipherText (ciphertext, false);
+      ciphertext = NULL;
+    }
+
+  if (hasAttachments ())
+    {
+      unsigned int n;
+      
+      n = getAttachments ();
+      log_debug ("%s:%s: message has %u attachments\n", __FILE__, __func__, n);
+      for (int i=0; !err && i < n; i++) 
+        err = encryptAttachment (hwnd, i, keys, NULL, 0);
+      if (err)
+        MessageBox (NULL, op_strerror (err),
+                    "GPG Attachment Encryption", MB_ICONERROR|MB_OK);
+    }
+
+ leave:
+  for (int i=0; i < n_keys; i++)
+    xfree (unknown[i]);
+  if (n_keys)
+    xfree (unknown);
+
+  free_key_array (keys);
+  free_recipient_array (recipients);
+  xfree (ciphertext);
+  log_debug ("%s:%s: leave (err=%s)\n", __FILE__, __func__, op_strerror (err));
+  return err;
+}
+
+
+/* Sign the current message. Returns 0 on success. */
+int
+GpgMsgImpl::sign (HWND hwnd)
+{
+  const char *plaintext;
+  char *signedtext = NULL;
+  int err = 0;
+  gpgme_key_t sign_key = NULL;
+
+  log_debug ("%s:%s: enter\n", __FILE__, __func__);
+  
+  /* We don't sign an empty body - a signature on a zero length string
+     is pretty much useless. */
+  if (!*(plaintext = getOrigText ()) && !hasAttachments ()) 
+    {
+      log_debug ("%s:%s: leave (empty)", __FILE__, __func__);
+      return 0; 
+    }
+
+  /* Pop up a dialog box to ask for the signer of the message. */
+  if (signer_dialog_box (&sign_key, NULL) == -1)
+    {
+      log_debug ("%s.%s: leave (dialog failed)\n", __FILE__, __func__);
+      return gpg_error (GPG_ERR_CANCELED);  
+    }
+
+  int nstorePasswd = 10; /* FIXME*/
+  int autoSignAtt = 1; /* FIXME*/
+  if (*plaintext)
+    {
+      err = op_sign (plaintext, &signedtext, 
+                     OP_SIG_CLEAR, sign_key, nstorePasswd);
+      if (err)
+        {
+          MessageBox (NULL, op_strerror (err),
+                      "GPG Sign", MB_ICONERROR|MB_OK);
+          goto leave;
+        }
+      setSignedText (signedtext);
+      signedtext = NULL;
+    }
+
+  if (autoSignAtt && hasAttachments ())
+    {
+      unsigned int n;
+      
+      n = getAttachments ();
+      log_debug ("%s:%s: message has %u attachments\n", __FILE__, __func__, n);
+      for (int i=0; i < n; i++) 
+        signAttachment (hwnd, i, sign_key, nstorePasswd);
+      /* FIXME: we should throw an error if signing of any attachment
+         failed. */
+    }
+
+ leave:
+  xfree (signedtext);
+  gpgme_key_release (sign_key);
+  log_debug ("%s:%s: leave (err=%s)\n", __FILE__, __func__, op_strerror (err));
+  return err;
+}
+
+
 
 
 
+\f
 /* Returns whether the message has any attachments. */
 bool
 GpgMsgImpl::hasAttachments (void)
index 6a56291..4ccbbd6 100644 (file)
@@ -100,6 +100,14 @@ public:
      the strings.  On failure NULL is returned.  */
   virtual char **getRecipients (void);
 
+
+  /* Encrypt the entire message including any attachments. Return 0 on
+     success. */
+  virtual int encrypt (HWND hwnd);
+
+  virtual int sign (HWND hwnd);
+
+
   /* Return the number of attachments. */
   virtual unsigned int getAttachments (void);
 
diff --git a/src/logo.bmp b/src/logo.bmp
new file mode 100644 (file)
index 0000000..455ab7d
Binary files /dev/null and b/src/logo.bmp differ
index 26a106a..038f7b3 100644 (file)
@@ -27,6 +27,7 @@
 #include <windows.h>
 #include <prsht.h>
 
+#include "intern.h"
 #include "mymapi.h"
 #include "mymapitags.h"
 #include "MapiGPGME.h"
 
 /* GPGOptionsDlgProc -
    Handles the notifications sent for managing the options property page. */
-bool GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+bool 
+GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
-    BOOL bMsgResult;    
-    static LPNMHDR pnmhdr;
-    static HWND hWndPage;
-    static int enable = 1;
+  BOOL bMsgResult;    
+  static LPNMHDR pnmhdr;
+  static HWND hWndPage;
+  static int enable = 1;
     
-    switch (uMsg) {
+  switch (uMsg) 
+    {
     case WM_INITDIALOG:
+      {
+        HDC hdc = GetDC (hDlg);
+        if (hdc)
+          {
+            int bits_per_pixel = GetDeviceCaps (hdc, BITSPIXEL);
+            HBITMAP bitmap;
+                
+            ReleaseDC (hDlg, hdc);     
+            if (bits_per_pixel > 15)
+              {
+                bitmap = LoadBitmap (glob_hinst, MAKEINTRESOURCE(IDB_BANNER));
+                if (bitmap)
+                  {
+                    HBITMAP old = (HBITMAP) SendDlgItemMessage
+                      (hDlg, IDC_BITMAP, STM_SETIMAGE,
+                       IMAGE_BITMAP, (LPARAM)bitmap);
+                    if (old)
+                      DeleteObject (old);      
+                  }    
+              }                
+          }
+        
        const char *s;
        s = NULL;
        s = m_gpg->getDefaultKey ();
        enable = s && *s? 1 : 0;
-       EnableWindow (GetDlgItem (hDlg, IDC_ENCRYPT_TO), enable==0? FALSE: TRUE);
+       EnableWindow (GetDlgItem (hDlg, IDC_ENCRYPT_TO), enable? TRUE:FALSE);
        if (enable == 1)
-           CheckDlgButton (hDlg, IDC_ENCRYPT_WITH_STANDARD_KEY, BST_CHECKED);
+          CheckDlgButton (hDlg, IDC_ENCRYPT_WITH_STANDARD_KEY, BST_CHECKED);
        SetDlgItemText (hDlg, IDC_VERSION_INFO, 
                        "Version "VERSION " ("__DATE__")");
-       return TRUE;
-               
+      }
+      return TRUE;
+
+    case WM_LBUTTONDOWN:
+      {
+        int x = LOWORD (lParam);
+        int y = HIWORD (lParam);
+        RECT rect_banner = {0,0,0,0};
+        RECT rect_dlg = {0,0,0,0};
+        HWND bitmap;
+        
+        GetWindowRect (hDlg, &rect_dlg);
+        bitmap = GetDlgItem (hDlg, IDC_BITMAP);
+        if (bitmap)
+          GetWindowRect (bitmap, &rect_banner);
+
+        rect_banner.left   -= rect_dlg.left;
+        rect_banner.right  -= rect_dlg.left;
+        rect_banner.top    -= rect_dlg.top;
+        rect_banner.bottom -= rect_dlg.top;
+        
+        if (x >= rect_banner.left && x <= rect_banner.right
+            && y >= rect_banner.top && y <= rect_banner.bottom)
+          {
+            ShellExecute (NULL, "open",
+                          "http://www.g10code.com/p-outlgpg.html",
+                          NULL, NULL, SW_SHOWNORMAL);  
+          }
+      }
+      break;
+
     case WM_COMMAND:
        if (HIWORD (wParam) == BN_CLICKED &&
            LOWORD (wParam) == IDC_ENCRYPT_WITH_STANDARD_KEY) {
index 98dc1d9..dcd8280 100644 (file)
@@ -44,6 +44,7 @@ IDB_DECRYPT             BITMAP  DISCARDABLE     "decrypt.bmp"
 IDB_ENCRYPT             BITMAP  DISCARDABLE     "encrypt.bmp"
 IDB_SIGN                BITMAP  DISCARDABLE     "sign.bmp"
 IDB_KEY_MANAGER         BITMAP  DISCARDABLE     "key_mana.bmp"
+IDB_BANNER              BITMAP  DISCARDABLE     "logo.bmp"
 
 /////////////////////////////////////////////////////////////////////////////
 //
@@ -80,9 +81,10 @@ BEGIN
     LTEXT           "Logdatei",IDC_STATIC,18,146,28,8
     EDITTEXT        IDC_DEBUG_LOGFILE,48,145,138,13,ES_AUTOHSCROLL
     PUSHBUTTON      "&Erweitert...",IDC_GPG_OPTIONS,202,166,50,14
-    LTEXT           "By g10 Code GmbH; available under the LGPL",
-                    IDC_STATIC,8,185,148,8
-    LTEXT           "Version 0.99",IDC_VERSION_INFO,161,185,98,9
+    LTEXT           "OutlGPG by g10 Code GmbH", IDC_STATIC,8,185,100,8
+    LTEXT           "Version x ",IDC_VERSION_INFO,150,185,200,9
+    CONTROL         IDB_BANNER,IDC_BITMAP,"Static",
+                    SS_BITMAP | SS_REALSIZEIMAGE,8,200,150,64
 END
 
 
@@ -197,9 +199,10 @@ BEGIN
     LTEXT           "Logfile",IDC_STATIC,18,146,22,8
     EDITTEXT        IDC_DEBUG_LOGFILE,48,145,138,13,ES_AUTOHSCROLL
     PUSHBUTTON      "Ad&vanced..",IDC_GPG_OPTIONS,202,166,50,14
-    LTEXT           "By g10 Code GmbH; available under the LGPL",
-                    IDC_STATIC,8,185,148,8
-    LTEXT           "Version 0.99",IDC_VERSION_INFO,161,185,98,9
+    LTEXT           "OutlGPG by g10 Code GmbH", IDC_STATIC,8,185,100,8
+    LTEXT           "Version x ",IDC_VERSION_INFO,150,185,200,9
+    CONTROL         IDB_BANNER,IDC_BITMAP,"Static",
+                    SS_BITMAP | SS_REALSIZEIMAGE,8,200,150,64
 END
 
 
index 59288c6..b7aacfd 100644 (file)
@@ -44,8 +44,8 @@
 #include "olflange.h"
 
 
-#define TRACEPOINT() do { ExchLogInfo ("%s:%s:%d: tracepoint\n", \
-                                       __FILE__, __func__, __LINE__); \
+#define TRACEPOINT() do { log_debug ("%s:%s:%d: tracepoint\n", \
+                                     __FILE__, __func__, __LINE__); \
                         } while (0)
 
 
@@ -611,19 +611,15 @@ CGPGExchExtMessageEvents::OnWriteComplete (LPEXCHEXTCALLBACK pEECB,
   HRESULT hr = pEECB->GetObject (&pMDB, (LPMAPIPROP *)&msg);
   if (SUCCEEDED (hr))
     {
-      log_debug ("%s:%s:%d: here\n", __FILE__, __func__, __LINE__);
-      
       GpgMsg *m = CreateGpgMsg (msg);
-      log_debug ("%s:%s:%d: here\n", __FILE__, __func__, __LINE__);
       if (m_pExchExt->m_gpgEncrypt && m_pExchExt->m_gpgSign)
         rc = m_gpg->signEncrypt (hWnd, m);
       if (m_pExchExt->m_gpgEncrypt && !m_pExchExt->m_gpgSign)
-        rc = m_gpg->encrypt (hWnd, m);
+        rc = m->encrypt (hWnd);
       if (!m_pExchExt->m_gpgEncrypt && m_pExchExt->m_gpgSign)
-        rc = m_gpg->sign (hWnd, m);
+        rc = m->sign (hWnd);
       else
         rc = 0;
-      log_debug ("%s:%s:%d: here\n", __FILE__, __func__, __LINE__);
       delete m;
       
       if (rc)