Cleanups, revamped logging. Timo: If you want to provide a new
authorWerner Koch <wk@gnupg.org>
Thu, 11 Aug 2005 18:43:28 +0000 (18:43 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 11 Aug 2005 18:43:28 +0000 (18:43 +0000)
GPGEchg, please move the new logDebug method directly after the
existing one first.

ChangeLog
olflange/ChangeLog
olflange/GPGExch.cpp
src/ChangeLog
src/MapiGPGME.cpp
src/MapiGPGME.h
src/engine-gpgme.c
src/engine.h
src/intern.h
src/libgpgmedlgs.def
src/passphrase-dialog.c

index e69de29..63a764a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -0,0 +1,4 @@
+2005-08-10  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: Check for and define DLLTOOL.
+
index 6b4d099..a4c3a31 100644 (file)
@@ -1,3 +1,8 @@
+2005-08-11  Werner Koch  <wk@g10code.com>
+
+       * GPGExch.cpp (ExchLogInfo): Changed to make use of
+       MapiGPGME->logDebug.
+
 2005-08-09  Timo Schulz  <ts@g10code.com>
 
        * GPGOptionsDlg.cpp: Include MapiGPGME.h and
index 2d451d0..9a59e40 100644 (file)
@@ -39,22 +39,13 @@ MapiGPGME *m_gpg = NULL;
 static void \r
 ExchLogInfo (const char * fmt, ...)\r
 {\r
-    FILE * f;\r
-    const char * name = NULL;\r
-    va_list a;\r
-\r
-    if (!m_gpg)\r
-       return;\r
-    name = m_gpg->getLogFile ();\r
-    if (!name || strlen (name) < 3)    \r
-       return;\r
-    f = fopen (name, "a+b");\r
-    if (!f)\r
-       return;\r
-    va_start (a, fmt);\r
-    vfprintf (f, fmt, a);\r
-    va_end (a);\r
-    fclose (f);\r
+    if (m_gpg) {\r
+        va_list a;\r
+  \r
+        va_start (a, fmt);\r
+        m_gpg->logDebug (fmt, a);\r
+        va_end (a);\r
+    }\r
 }\r
 \r
 /* The one and only CGPGExchApp object */\r
@@ -63,7 +54,7 @@ END_MESSAGE_MAP()
 \r
 CGPGExchApp::CGPGExchApp (void)\r
 {\r
-    ExchLogInfo("GPGExch\r\n");\r
+    ExchLogInfo("GPGExch\n");\r
 }\r
 \r
 CGPGExchApp theApp;\r
@@ -79,7 +70,7 @@ CGPGExchApp theApp;
 LPEXCHEXT CALLBACK \r
 ExchEntryPoint (void)\r
 {\r
-    ExchLogInfo ("extension entry point...\r\n");\r
+    ExchLogInfo ("extension entry point...\n");\r
     return new CGPGExchExt;\r
 }\r
 \r
@@ -108,7 +99,7 @@ DllRegisterServer (void)
                                   REG_OPTION_NON_VOLATILE,\r
                                   KEY_ALL_ACCESS, NULL, &hKey, NULL);\r
     if (lResult != ERROR_SUCCESS) {\r
-       ExchLogInfo ("DllRegisterServer failed\r\n");\r
+       ExchLogInfo ("DllRegisterServer failed\n");\r
        return E_ACCESSDENIED;\r
     }\r
     DWORD dwTemp = 0;\r
@@ -121,7 +112,7 @@ DllRegisterServer (void)
     RegSetValueEx (hKey, "Outlook Setup Extension", 0, REG_SZ, (BYTE*) szEntry, dwTemp);\r
     RegCloseKey (hKey);\r
     \r
-    ExchLogInfo ("DllRegisterServer succeeded\r\n");\r
+    ExchLogInfo ("DllRegisterServer succeeded\n");\r
     return S_OK;\r
 }\r
 \r
@@ -139,7 +130,7 @@ DllUnregisterServer (void)
                                    REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, \r
                                    NULL, &hKey, NULL);\r
     if (lResult != ERROR_SUCCESS) {\r
-       ExchLogInfo ("DllUnregisterServer: access denied.\r\n");\r
+       ExchLogInfo ("DllUnregisterServer: access denied.\n");\r
        return E_ACCESSDENIED;\r
     }\r
     RegDeleteValue (hKey, "GPG Exchange");\r
@@ -173,10 +164,10 @@ CGPGExchExt::CGPGExchExt (void)
            m_gpg->readOptions ();\r
        }\r
        g_bInitDll = TRUE;\r
-       ExchLogInfo("CGPGExchExt load\r\n");\r
+       ExchLogInfo("CGPGExchExt load\n");\r
     }\r
     else\r
-       ExchLogInfo("CGPGExchExt exists\r\n");\r
+       ExchLogInfo("CGPGExchExt exists\n");\r
 }\r
 \r
 \r
@@ -230,7 +221,7 @@ CGPGExchExt::QueryInterface(
     if (*ppvObj != NULL)\r
         ((LPUNKNOWN)*ppvObj)->AddRef();\r
 \r
-    /*ExchLogInfo("QueryInterface %d\r\n", __LINE__);*/\r
+    /*ExchLogInfo("QueryInterface %d\n", __LINE__);*/\r
     return hr;\r
 }\r
 \r
@@ -250,7 +241,7 @@ STDMETHODIMP CGPGExchExt::Install(
 \r
     m_lContext = lContext;\r
 \r
-    /*ExchLogInfo("Install %d\r\n", __LINE__);*/\r
+    /*ExchLogInfo("Install %d\n", __LINE__);*/\r
     // check the version \r
     pEECB->GetVersion (&lBuildVersion, EECBGV_GETBUILDVERSION);\r
     if (EECBGV_BUILDVERSION_MAJOR != (lBuildVersion & EECBGV_BUILDVERSION_MAJOR_MASK))\r
@@ -301,7 +292,7 @@ CGPGExchExtMessageEvents::QueryInterface (REFIID riid, LPVOID FAR *ppvObj)
 STDMETHODIMP CGPGExchExtMessageEvents::OnRead(\r
        LPEXCHEXTCALLBACK pEECB) // A pointer to IExchExtCallback interface.\r
 {\r
-    ExchLogInfo ("OnRead\r\n");\r
+    ExchLogInfo ("OnRead\n");\r
     return S_FALSE;\r
 }\r
 \r
@@ -314,7 +305,7 @@ STDMETHODIMP CGPGExchExtMessageEvents::OnReadComplete(
        LPEXCHEXTCALLBACK pEECB, // A pointer to IExchExtCallback interface.\r
        ULONG lFlags)\r
 {\r
-    ExchLogInfo ("OnReadComplete\r\n");\r
+    ExchLogInfo ("OnReadComplete\n");\r
     return S_FALSE;\r
 }\r
 \r
@@ -324,7 +315,7 @@ STDMETHODIMP CGPGExchExtMessageEvents::OnReadComplete(
 STDMETHODIMP CGPGExchExtMessageEvents::OnWrite(\r
        LPEXCHEXTCALLBACK pEECB) // A pointer to IExchExtCallback interface.\r
 {\r
-    ExchLogInfo ("OnWrite\r\n");\r
+    ExchLogInfo ("OnWrite\n");\r
     return S_FALSE;\r
 }\r
 \r
index e3ca499..55e9a9f 100644 (file)
@@ -1,3 +1,26 @@
+2005-08-11  Werner Koch  <wk@g10code.com>
+
+       * MapiGPGME.cpp (log_debug): New.  Rewrote the whole log stuff.
+       It is not anymore per instance.
+       (logDebug): New version with va_list arg.
+
+       * MapiGPGME.cpp (passphraseCallback): Use gpgme_error_t becuase
+       C++ enforces enum types.
+
+       * engine-gpgme.c (op_lookup_keys): s/id/names/.  id is a reved
+       word Obj-C and it is good style not to use it in plain C code.
+       (op_sign_file_next): Use gpgme_passphrase_cb_t in declaration.
+       (op_decrypt_next): Ditto.
+
+       * MapiGPGME.cpp (count_recipients): Renamed from countRecipients
+       method, made local and changed both callers.
+       (log_key_info): Changed output format.  New arg PREFIX. Changed
+       callers.
+       (add_html_line_endings): Renamed from addHtmlLineEndings method
+       and made local.
+       (logDebug): Open in text mode.  Removed all superfluous "\r" from
+       callers.
+
 2005-08-09  Timo Schulz  <ts@g10code.com>
 
        * main.c (outlook_gpg_get_version): New.
index d5d613c..12fd54c 100644 (file)
 #include "MapiGPGME.h"
 #include "engine.h"
 
-// #define  FreeProws(a)               do { ; } while(0)
-// #define  HrGetOneProp(a,b,c)        0
-// #define  HrSetOneProp(a,b)          0
-// #define  FPropExists(a,b)           0
-// #define  FreePadrlist(a)            0
-// #define  HrQueryAllRows(a,b,c,d,e,f)  0
-// #define  PpropFindProp(a,b,c)       0
-// #define  RTFSync(a,b,c)             0
-
 /* These were omitted from the standard headers */
 #ifndef PR_BODY_HTML
 #define PR_BODY_HTML (PROP_TAG(PT_TSTRING, 0x1013))
 #define delete_buf(buf) delete [] (buf)
 
 #define fail_if_null(p) do { if (!(p)) abort (); } while (0)
+#define lock_log()    do { /*FIXME*/; } while (0) 
+#define unlock_log()  do { /*FIXME*/; } while (0)
+
+
+/* Given that we are only able to configure one log file, it does not
+   make much sense t bind a log file to a specific instance of this
+   class. We use a global variable instead which will be set by any
+   instance.  The same goes for the respecive file pointer and the
+   enable_logging state. */
+static char *logfile;
+static FILE *logfp;
+static bool enable_logging;
 
 
 class MapiGPGMEImpl : public MapiGPGME
@@ -86,7 +89,7 @@ public:
     this->passCache = new HashTable ();
     op_init ();
     prepareLogging ();
-    logDebug ("constructor null\r\n");
+    logDebug ("MapiGPGME.constructor: ready\n");
   }
 
   MapiGPGMEImpl (LPMESSAGE msg)
@@ -97,26 +100,21 @@ public:
     this->passCache = new HashTable ();
     op_init ();
     prepareLogging ();
-    logDebug ("constructor %p\r\n", msg);
+    logDebug ("MapiGPGME.constructor: ready (msg=%p)\n", msg);
   }
   
   ~MapiGPGMEImpl ()
   {
     unsigned int i=0;
 
-    logDebug ("destructor %p\r\n", msg);
+    logDebug ("MapiGPGME.destructor: called\n");
     op_deinit ();
     if (defaultKey)
       {
        delete_buf (defaultKey);
        defaultKey = NULL;
       }
-    if (logfile) 
-      {
-       delete_buf (logfile);
-       logfile = NULL;
-      }
-    logDebug ("hash entries %d\r\n", passCache->size ());
+    logDebug ("hash entries %d\n", passCache->size ());
     for (i = 0; i < passCache->size (); i++) 
       {
        cache_item_t t = (cache_item_t)passCache->get (i);
@@ -152,16 +150,18 @@ public:
   int __stdcall doCmdFile(int action, const char *in, const char *out);
 
   const char* __stdcall getLogFile (void) { return logfile; }
-  void __stdcall setLogFile (const char *logfile)
+  void __stdcall setLogFile (const char *name)
   { 
-    if (this->logfile) 
+    lock_log ();
+    if (logfp)
       {
-        delete []this->logfile;
-        this->logfile = NULL;
+        fclose (logfp);
+        logfp = NULL;
       }
-    this->logfile = new char [strlen (logfile)+1];
-    if (this->logfile != NULL)
-      strcpy (this->logfile, logfile);
+    
+    xfree (logfile);
+    logfile = name? xstrdup (name) : NULL;
+    unlock_log ();
   }
 
   int __stdcall getStorePasswdTime (void)
@@ -236,12 +236,12 @@ public:
 
   void __stdcall setEnableLogging (bool val)
   {
-    this->enableLogging = val;
+    enable_logging = val;
   }
 
   bool __stdcall getEnableLogging (void)
   {
-    return this->enableLogging;
+    return enable_logging;
   }
 
   int __stdcall readOptions (void);
@@ -303,6 +303,7 @@ public:
   outlgpg_type_t __stdcall getMessageType (const char *body);
 
   void __stdcall logDebug (const char *fmt, ...);
+  void __stdcall logDebug (const char *fmt, va_list a);
     
   void __stdcall clearPassphrase (void) 
   {
@@ -315,25 +316,46 @@ private:
   HWND       parent;
   char       *defaultKey;
   HashTable   *passCache;
-  LPMESSAGE   msg;
+  LPMESSAGE   msg;    /* The message we are working on.  Note, that
+                         this is a shallow copy <-- FIXME: What are
+                         the exact semantics of owenership. */
   LPMAPITABLE attachTable;
   LPSRowSet   attachRows;
   void       *recipSet;
-  bool        enableLogging;
 
   /* Options */
-  char    *logfile;
   int    nstorePasswd;  /* Time in seconds the passphrase is stored. */
   bool    doEncrypt;
   bool    doSign;
   bool    encryptDefault;
   bool    saveDecryptedAtt; /* Save decrypted attachments. */
   bool    autoSignAtt;     /* Sign all outgoing attachments. */
-  int      encFormat;      /* Encryption format for attachments. */
+  int    encFormat;        /* Encryption format for attachments. */
 
   void displayError (HWND root, const char *title);
-  void prepareLogging (void);
-  void clearObject (void);
+  void prepareLogging (void)
+  {
+    char *val = NULL;
+    
+    load_extension_value ("logFile", &val);
+    if (val && *val != '\"' && *val)
+      {
+        setLogFile (val);
+        setEnableLogging (true);
+      }
+    xfree (val);       
+  }
+
+  void clearObject (void)
+  {
+    this->attachRows = NULL;
+    this->attachTable = NULL;
+    this->defaultKey = NULL;
+    this->recipSet = NULL;
+    this->parent = NULL;
+    this->msg = NULL;
+  }
+
   void clearConfig (void)
   {
     nstorePasswd = 0;
@@ -343,7 +365,6 @@ private:
     saveDecryptedAtt = false;
     autoSignAtt = false;
     encFormat = DEFAULT_ATTACHMENT_FORMAT;
-    enableLogging = false;
   }
 
   HWND findMessageWindow (HWND parent);
@@ -354,10 +375,8 @@ private:
   bool isHtmlBody (const char *body);
   bool isHtmlMessage (void);
   char *getBody (bool isHtml);
-  char *addHtmlLineEndings (char *newBody);
     
   void cleanupTempFiles ();
-  int countRecipients (char **recipients);
   char **getRecipients (bool isRootMsg);
   void freeRecipients (char **recipients);
   void freeUnknownKeys (char **unknown, int n);
@@ -392,64 +411,63 @@ private:
 
 /* Create an instance of the MapiGPGME class. MSG may be NULL. */
 MapiGPGME *
-_CreateMapiGPGME (LPMESSAGE msg)
-{
-  return new MapiGPGMEImpl (msg);
-}
-MapiGPGME *
 CreateMapiGPGME (LPMESSAGE msg)
 {
   return new MapiGPGMEImpl (msg);
 }
 
 
-
-void 
-MapiGPGMEImpl::logDebug (const char *fmt, ...)
+static void
+do_log (const char *fmt, va_list a)
 {
-    FILE * logfp;
-    va_list a;
-
-    if (enableLogging == false || this->logfile == NULL)
-       return;
+  if (enable_logging == false || !logfile)
+    return;
 
-    logfp = fopen (this->logfile, "a+b");
-    if (logfp == NULL)
-       return;
-    va_start (a, fmt);
-    vfprintf (logfp, fmt, a);
-    va_end (a);
-    fclose (logfp);
+  if (!logfp)
+    {
+      lock_log ();
+      if (!logfp)
+        logfp = fopen (logfile, "a+");
+      unlock_log ();
+    }
+  if (!logfp)
+    return;
+  fprintf (logfp, "%lu/", (unsigned long)GetCurrentThreadId ());
+  vfprintf (logfp, fmt, a);
+  fflush (logfp);
 }
 
 
-void
-MapiGPGMEImpl::clearObject (void)
+void 
+log_debug (const char *fmt, ...)
 {
-    this->attachRows = NULL;
-    this->attachTable = NULL;
-    this->defaultKey = NULL;
-    this->logfile = NULL;
-    this->recipSet = NULL;
-    this->parent = NULL;
-    this->msg = NULL;
+  va_list a;
+  
+  va_start (a, fmt);
+  do_log (fmt, a);
+  va_end (a);
 }
 
 
-void
-MapiGPGMEImpl::prepareLogging (void)
+void 
+MapiGPGMEImpl::logDebug (const char *fmt, ...)
 {
-    char *val = NULL;
+  va_list a;
+  
+  va_start (a, fmt);
+  do_log (fmt, a);
+  va_end (a);
+}
 
-    load_extension_value ("logFile", &val);
-    if (val != NULL && *val != '"' && *val != 0) {
-       setLogFile (val);
-       setEnableLogging (true);
-       xfree (val);    
-    }
+
+void 
+MapiGPGMEImpl::logDebug (const char *fmt, va_list a)
+{
+  do_log (fmt, a);
 }
 
 
+
 void 
 MapiGPGMEImpl::cleanupTempFiles (void)
 {
@@ -468,7 +486,7 @@ MapiGPGMEImpl::cleanupTempFiles (void)
     do {
        char *p = (char *)xcalloc (1, strlen (tmp) + strlen (fnd.cFileName) +2);
        sprintf (p, "%s%s", tmp, fnd.cFileName);
-       logDebug ("delete tmp %s\r\n", p);
+       logDebug ("delete tmp %s\n", p);
        DeleteFile (p);
        xfree (p);
     } while (FindNextFile (hd, &fnd) == TRUE);
@@ -482,7 +500,7 @@ MapiGPGMEImpl::setRTFBody (char *body)
     setMessageAccess (MAPI_ACCESS_MODIFY);
     HWND rtf = findMessageWindow (parent);
     if (rtf != NULL) {
-       logDebug ("setRTFBody: window handle %p\r\n", rtf);
+       logDebug ("setRTFBody: window handle %p\n", rtf);
        SetWindowText (rtf, body);
        return TRUE;
     }
@@ -499,16 +517,17 @@ MapiGPGMEImpl::setBody (char *body, bool isHtml)
     int rc = TRUE;
     
     if (body == NULL) {
-       logDebug ("setBody with empty buffer\r\n");
+       logDebug ("MapiGPGME.setBody: called with empty buffer\n");
        return FALSE;
     }
+    logDebug ("MapiGPGME.setBody: body is `%s'\n", body);
     rtfSync (body);
     sProp.ulPropTag = isHtml? PR_BODY_HTML : PR_BODY;
     sProp.Value.lpszA = body;
     hr = HrSetOneProp (msg, &sProp);
     if (FAILED (hr))
        rc = FALSE;
-    logDebug ("setBody (html=%d) rc=%d '%s'\r\n", rc, isHtml, body);
+    logDebug ("MapiGPGME.setBody: (html=%d) rc=%d\n", isHtml, rc);
     return rc;
 }
 
@@ -551,10 +570,15 @@ MapiGPGMEImpl::isHtmlBody (const char *body)
 }
 
 
+/* Check whether a message is a HTMl message. */
 bool
 MapiGPGMEImpl::isHtmlMessage (void)
 {
     char *body = getBody (true);
+
+    /* We assume that getBody won't return a non-empry string if it is
+       a HTML message.  FIXME: This is a pretty ineffective test as it
+       needless allocates memory. */
     if (body != NULL && strlen (body) > 1) {
        delete_buf (body);
        return true;
@@ -565,6 +589,10 @@ MapiGPGMEImpl::isHtmlMessage (void)
 }
 
 
+/* Return a copy of the body content of current message.  PR_BODY_HTML
+   is used internally when called with ISHTML as true; PR_BODY
+   otherwise.  On success a new char object is retruned and the caller
+   is responsible for deleting it. On failure NULL is returned. */
 char* 
 MapiGPGMEImpl::getBody (bool isHtml)
 {
@@ -604,8 +632,9 @@ MapiGPGMEImpl::freeKeyArray (void **key)
 }
 
 
-int 
-MapiGPGMEImpl::countRecipients (char **recipients)
+/* Return the number of recipients in the array RECIPIENTS. */
+static int 
+count_recipients (char **recipients)
 {
   int i;
   
@@ -615,6 +644,11 @@ MapiGPGMEImpl::countRecipients (char **recipients)
 }
 
 
+/* Return an array of strings with the recipients of the message. On
+   success a new array is returned containing allocated strings for
+   each recipients.  Teh end of the array is marked by NULL.  Caller
+   is responsible for releasing the array.  On failure NULL is
+   returned.  */
 char** 
 MapiGPGMEImpl::getRecipients (bool isRootMsg)
 {
@@ -641,12 +675,12 @@ MapiGPGMEImpl::getRecipients (bool isRootMsg)
            rset[j] = new char[strlen (s)+1];
            fail_if_null (rset[j]);
            strcpy (rset[j], s);
-           logDebug ( "rset %d: %s\r\n", j, rset[j]);
+           logDebug ( "rset %d: %s\n", j, rset[j]);
        }
        rset[j] = NULL;
-       if (NULL != lpRecipientTable)
+       if (lpRecipientTable)
            lpRecipientTable->Release();
-       if (NULL != lpRecipientRows)
+       if (lpRecipientRows)
            FreeProws(lpRecipientRows); 
     }
 
@@ -681,7 +715,11 @@ MapiGPGMEImpl::freeRecipients (char **recipients)
 const char*
 MapiGPGMEImpl::getPassphrase (const char *keyid)
 {
-    cache_item_t item = (cache_item_t)passCache->get(keyid);
+    cache_item_t item;
+
+    logDebug ("MapiGPGME.getPassphrase: enter\n");
+    item = (cache_item_t)passCache->get(keyid);
+    logDebug ("MapiGPGME.getPassphrase: leave (result=%p)\n", item);
     if (item != NULL)
        return item->pass;
     return NULL;
@@ -691,18 +729,24 @@ MapiGPGMEImpl::getPassphrase (const char *keyid)
 void
 MapiGPGMEImpl::storePassphrase (void *itm)
 {
-    cache_item_t item = (cache_item_t)itm;
-    cache_item_t old;
+    cache_item_t item, old;
+
+    logDebug ("MapiGPGME.storePassphrase: enter\n");
+    item = (cache_item_t)itm;
     old = (cache_item_t)passCache->get(item->keyid);
     if (old != NULL)
        cache_item_free (old);
     passCache->put (item->keyid+8, item);
-    logDebug ( "put keyid %s = '%s'\r\n", item->keyid+8, "***");
+    logDebug ("MapiGPGME.storePassphrase: keyid 0x%s\n",
+              item->keyid+8); /* FIXME: is the +8 save? */
+    logDebug ("MapiGPGME.storePassphrase: leave \n");
 }
 
 
-char*
-MapiGPGMEImpl::addHtmlLineEndings (char *newBody)
+/* FIXME: This is an ineffective implementation which wastes way too
+   much memory. */
+static char *
+add_html_line_endings (char *newBody)
 {
     char *p;
     char *snew = (char*)xcalloc (1, 2*strlen (newBody));
@@ -710,7 +754,7 @@ MapiGPGMEImpl::addHtmlLineEndings (char *newBody)
     p = strtok ((char *)newBody, "\n");
     while (p != NULL) {
        strcat (snew, p);
-       strcat (snew, "\r\n");
+       strcat (snew, "\n");
        strcat (snew, "&nbsp;<br>");
        p = strtok (NULL, "\n");
     }
@@ -738,11 +782,11 @@ MapiGPGMEImpl::encrypt (void)
        return 0;
     }
 
-    logDebug ("encrypt\r\n");
+    logDebug ("encrypt\n");
     int n = op_lookup_keys (recipients, &keys, &unknown, &all);
-    logDebug ("fnd %d need %d (%p)\r\n", n, all, unknown);
-    if (n != countRecipients (recipients)) {
-       logDebug ("recipient_dialog_box2\r\n");
+    logDebug ("fnd %d need %d (%p)\n", n, all, unknown);
+    if (n != count_recipients (recipients)) {
+       logDebug ("recipient_dialog_box2\n");
        recipient_dialog_box2 (keys, unknown, all, &keys2, &opts);
        xfree (keys);
        keys = keys2;
@@ -758,7 +802,7 @@ MapiGPGMEImpl::encrypt (void)
        MessageBox (NULL, op_strerror (err), "GPG Encryption", MB_ICONERROR|MB_OK);
     else {
        if (isHtml) {
-           char *p = addHtmlLineEndings (newBody);
+           char *p = add_html_line_endings (newBody);
            setBody (p, true);
            xfree (p);
        }
@@ -770,7 +814,7 @@ MapiGPGMEImpl::encrypt (void)
     freeRecipients (recipients);
     freeUnknownKeys (unknown, n);
     if (!err && hasAttachments ()) {
-       logDebug ("encrypt attachments\r\n");
+       logDebug ("encrypt attachments\n");
        recipSet = (void *)keys;
        encryptAttachments (parent);
     }
@@ -780,8 +824,13 @@ MapiGPGMEImpl::encrypt (void)
 
 
 /* XXX: I would prefer to use MapiGPGME::passphraseCallback, but member 
-        functions have an incompatible calling convention. */
-int 
+        functions have an incompatible calling convention. -ts
+    
+        Obviously they need to pass the THIS pointer.  Mixing this
+        with the gpgme convention (where OPAQUE may be viewed as the
+        THIS) is not possible. -wk
+*/
+gpgme_error_t 
 passphraseCallback (void *opaque, const char *uid_hint, 
                    const char *passphrase_info,
                    int last_was_bad, int fd)
@@ -792,17 +841,19 @@ passphraseCallback (void *opaque, const char *uid_hint,
     DWORD nwritten = 0;
     int i=0;
 
+    log_debug ("MapiGPGME.passphraseCallback: enter\n");
     while (uid_hint && *uid_hint != ' ')
        keyid[i++] = *uid_hint++;
     keyid[i] = '\0';
     
     passwd = ctx->getPassphrase (keyid+8);
-    /*logDebug ( "get keyid %s = '%s'\r\n", keyid+8, "***");*/
+    /*logDebug ( "get keyid %s = '%s'\n", keyid+8, "***");*/
     if (passwd != NULL) {
        WriteFile ((HANDLE)fd, passwd, strlen (passwd), &nwritten, NULL);
        WriteFile ((HANDLE)fd, "\n", 1, &nwritten, NULL);
     }
 
+    log_debug ("MapiGPGME.passphraseCallback: leave\n");
     return 0;
 }
 
@@ -817,14 +868,19 @@ MapiGPGMEImpl::decrypt (void)
     bool isHtml = isHtmlMessage ();
     int err;
 
+    logDebug ("MapiGPGME.decrypt: enter\n");
+
     id = getMessageType (body);
     if (id == GPG_TYPE_CLEARSIG) {
        delete_buf (body);
+        logDebug ("MapiGPGME.decrypt: leave (passing on to verify)\n");
        return verify ();
     }
     else if (id == GPG_TYPE_NONE && !hasAttach) {
-       MessageBox (NULL, "No valid OpenPGP data found.", "GPG Decryption", MB_ICONERROR|MB_OK);
+       MessageBox (NULL, "No valid OpenPGP data found.",
+                    "GPG Decryption", MB_ICONERROR|MB_OK);
        delete_buf (body);
+        logDebug ("MapiGPGME.decrypt: leave (no OpenPGP data)\n");
        return 0;
     }
 
@@ -850,7 +906,7 @@ MapiGPGMEImpl::decrypt (void)
        /* Also set PR_BODY but do not use 'SaveChanges' to make it permanently.
           This way the user can reply with the plaintext but the ciphertext is
           still stored. */
-       logDebug ("decrypt isHtml=%d\r\n", isHtmlBody (newBody));
+       logDebug ("decrypt isHtml=%d\n", isHtmlBody (newBody));
        setRTFBody (newBody);
        /* XXX: find a way to handle text/html message in a better way! */
        if (isHtmlBody (newBody)) {
@@ -860,7 +916,7 @@ MapiGPGMEImpl::decrypt (void)
                            "Do you want to save the decrypted message?";
            int id = MessageBox (NULL, s, "GPG Decryption", MB_YESNO|MB_ICONWARNING);
            if (id == IDYES) {
-               logDebug ("decrypt: save plaintext message.\r\n");
+               logDebug ("decrypt: save plaintext message.\n");
                setBody (newBody, true);
                msg->SaveChanges (FORCE_SAVE);
            }
@@ -870,15 +926,17 @@ MapiGPGMEImpl::decrypt (void)
     }
 
     if (hasAttach) {
-       logDebug ("decrypt attachments\r\n");
+       logDebug ("decrypt attachments\n");
        decryptAttachments (parent);
     }
     delete_buf (body);
     xfree (newBody);
+    logDebug ("MapiGPGME.decrypt: leave (rc=%d)\n", err);
     return err;
 }
 
 
+/* Sign the current message. Returns 0 on success. */
 int
 MapiGPGMEImpl::sign (void)
 {
@@ -887,11 +945,17 @@ MapiGPGMEImpl::sign (void)
     int hasAttach = hasAttachments ();
     int err = 0;
 
+    logDebug ("MapiGPGME.sign: enter\n");
+
+    /* We don't sign an empty body - a signature on a zero length
+       string is pretty much useless. */
     if (body == NULL || strlen (body) == 0) {
-       if (body != NULL)
+       if (body)
            delete_buf (body);
+        logDebug ("MapiGPGME.sign: leave (empty message)\n");
        return 0;
     }
+
     err = op_sign_start (body, &newBody);
     if (err)
        MessageBox (NULL, op_strerror (err), "GPG Sign", MB_ICONERROR|MB_OK);
@@ -903,6 +967,7 @@ MapiGPGMEImpl::sign (void)
 
     delete_buf (body);
     xfree (newBody);
+    logDebug ("MapiGPGME.sign: leave (rc=%d)\n", err);
     return err;
 }
 
@@ -939,7 +1004,7 @@ MapiGPGMEImpl::getMessageType (const char *body)
 int
 MapiGPGMEImpl::doCmdFile(int action, const char *in, const char *out)
 {
-    logDebug ( "doCmdFile action=%d in=%s out=%s\r\n", action, in, out);
+    logDebug ( "doCmdFile action=%d in=%s out=%s\n", action, in, out);
     if (ATT_SIGN (action) && ATT_ENCR (action))
        return !op_sign_encrypt_file (recipSet, in, out);
     if (ATT_SIGN (action) && !ATT_ENCR (action))
@@ -964,10 +1029,14 @@ MapiGPGMEImpl::doCmdAttach (int action)
 }
 
 
+/* Man processing entry point.  Perform encryption or/and signing
+   depending on the flags DOENCRYPT and DOSIGN.  It works on the
+   message already set into the instance variable MSG.  Returns 0 on
+   success or an error code. */
 int
 MapiGPGMEImpl::doCmd (int doEncrypt, int doSign)
 {
-    logDebug ( "doCmd doEncrypt=%d doSign=%d\r\n", doEncrypt, doSign);
+    logDebug ("MapiGPGME.doCmd doEncrypt=%d doSign=%d\n", doEncrypt, doSign);
     if (doEncrypt && doSign)
        return signEncrypt ();
     if (doEncrypt && !doSign)
@@ -997,15 +1066,18 @@ keyid_from_key (gpgme_key_t k)
     return "????????";
 }
 
-
+/* Print information on the keys in KEYS and LOCUSR. */
 static void 
-log_key_info (MapiGPGME *g, gpgme_key_t *keys, gpgme_key_t locusr)
+log_key_info (MapiGPGME *g, const char *prefix,
+              gpgme_key_t *keys, gpgme_key_t locusr)
 {
     if (locusr)
-       g->logDebug ("locusr:%s:%s\r\n", 
-                    userid_from_key (locusr), keyid_from_key (locusr));
+      g->logDebug ("MapiGPGME.%s: signer: 0x%s %s\n", prefix,
+                   keyid_from_key (locusr), userid_from_key (locusr));
+    
     else
-       g->logDebug ( "locusr:null\r\n");
+      g->logDebug ("MapiGPGME.%s: no signer\n", prefix);
+    
     gpgme_key_t n;
     int i;
 
@@ -1013,11 +1085,13 @@ log_key_info (MapiGPGME *g, gpgme_key_t *keys, gpgme_key_t locusr)
        return;
     i=0;
     for (n=keys[0]; keys[i] != NULL; i++)
-       g->logDebug ("recp:%d:%s:%s\r\n", 
-                     i, userid_from_key (keys[i]), keyid_from_key (keys[i]));
+      g->logDebug ("MapiGPGME.%s: recp.%d 0x%s %s\n", prefix,
+                   i, keyid_from_key (keys[i]), userid_from_key (keys[i]));
 }
            
 
+/* Perform a sign+encrypt operation using the data already store in
+   the instance variables. Return 0 on success. */
 int
 MapiGPGMEImpl::signEncrypt (void)
 {
@@ -1028,34 +1102,50 @@ MapiGPGMEImpl::signEncrypt (void)
     char **unknown = NULL;
     gpgme_key_t locusr=NULL, *keys = NULL, *keys2 =NULL;
 
+    logDebug ("MapiGPGME.signEncrypt: enter\n");
+    
+    /* Check for trivial case: We don't encrypt or sign an empty
+       message. */
     if (body == NULL || strlen (body) == 0) {
        freeRecipients (recipients);
-       if (body != NULL)
+       if (body)
            delete_buf (body);
+        logDebug ("MapiGPGME.signEncrypt: leave (empty message)\n");
        return 0;
     }
+
+    /* Pop up a dialog box to ask for the signer of the message. */
     if (signer_dialog_box (&locusr, NULL) == -1) {
        freeRecipients (recipients);
        delete_buf (body);
+        logDebug ("MapiGPGME.signEncrypt: leave (dialog failed)\n");
        return 0;
     }
-    logDebug ("locusr keyid:%s\r\n", keyid_from_key (locusr));
+    logDebug ("MapiGPGME.signEncrypt: using signer's keyid %s\n",
+              keyid_from_key (locusr));
 
+    /* Now lookup the keys of all recipients. */
     size_t all;
     int n = op_lookup_keys (recipients, &keys, &unknown, &all);
-    if (n != countRecipients (recipients)) {
+    if (n != count_recipients (recipients)) {
+      /* FIXME: The implementation is not correct: op_lookup_keys
+         returns the number of missing keys but we compare against the
+         total number of keys; thus the box would pop up even when all
+         have been found. */
        recipient_dialog_box2 (keys, unknown, all, &keys2, NULL);
        xfree (keys);
        keys = keys2;
     }
 
-    log_key_info (this, keys, locusr);
+    log_key_info (this, "signEncrypt", keys, locusr);
+    /* FIXME: Remove the cast and use proper types. */
     int err = op_sign_encrypt ((void *)keys, (void*)locusr, body, &newBody);
     if (err)
-       MessageBox (NULL, op_strerror (err), "GPG Sign Encrypt", MB_ICONERROR|MB_OK);
+       MessageBox (NULL, op_strerror (err),
+                    "GPG Sign Encrypt", MB_ICONERROR|MB_OK);
     else {
        if (isHtml) {
-           char *p = addHtmlLineEndings (newBody);
+           char *p = add_html_line_endings (newBody);
            setBody (p, true);
            xfree (p);
        }
@@ -1067,13 +1157,16 @@ MapiGPGMEImpl::signEncrypt (void)
     xfree (newBody);
     freeUnknownKeys (unknown, n);
     if (!err && hasAttachments ()) {
-       logDebug ( "encrypt attachments");
+       logDebug ("MapiGPGME.signEncrypt: have attachments\n");
+
+        /** WORK(wk) **/
        recipSet = (void *)keys;
        encryptAttachments (parent);
     }
     freeKeyArray ((void **)keys);
     gpgme_key_release (locusr);
     freeRecipients (recipients);
+    logDebug ("MapiGPGME.signEncrypt: leave (rc=%d)\n", err);
     return err;
 }
 
@@ -1084,6 +1177,8 @@ MapiGPGMEImpl::verify (void)
     char *body = getBody (false);
     char *newBody = NULL;
     
+    logDebug ("MapiGPGME.verify: enter\n");
+
     int err = op_verify_start (body, &newBody);
     if (err)
        MessageBox (NULL, op_strerror (err), "GPG Verify", MB_ICONERROR|MB_OK);
@@ -1092,6 +1187,7 @@ MapiGPGMEImpl::verify (void)
 
     delete_buf (body);
     xfree (newBody);
+    logDebug ("MapiGPGME.verify: leave (rc=%d)\n", err);
     return err;
 }
 
@@ -1116,11 +1212,12 @@ MapiGPGMEImpl::getDefaultKey (void)
 }
 
 
+/* Store the message MSG we want to work on in our object. */
 void 
 MapiGPGMEImpl::setMessage (LPMESSAGE msg)
 {
     this->msg = msg;
-    logDebug ( "setMessage %p\r\n", msg);
+    logDebug ("MapiGPGME.setMessage %p\n", msg);
 }
 
 
@@ -1155,7 +1252,7 @@ MapiGPGMEImpl::findMessageWindow (HWND parent)
            return rtf;
        child = GetNextWindow (child, GW_HWNDNEXT);     
     }
-    /*logDebug ("no message window found.\r\n");*/
+    /*logDebug ("no message window found.\n");*/
     return NULL;
 }
 
@@ -1176,7 +1273,7 @@ MapiGPGMEImpl::streamFromFile (const char *file, LPATTACH att)
                           STGM_READ, (char*)file, NULL, &from);
     if (!SUCCEEDED (hr)) {
        to->Release ();
-       logDebug ( "streamFromFile %s failed.\r\n", file);
+       logDebug ( "streamFromFile %s failed.\n", file);
        return FALSE;
     }
     from->Stat (&statInfo, STATFLAG_NONAME);
@@ -1184,7 +1281,7 @@ MapiGPGMEImpl::streamFromFile (const char *file, LPATTACH att)
     to->Commit (0);
     to->Release ();
     from->Release ();
-    logDebug ( "streamFromFile %s succeeded\r\n", file);
+    logDebug ( "streamFromFile %s succeeded\n", file);
     return TRUE;
 }
 
@@ -1206,7 +1303,7 @@ MapiGPGMEImpl::streamOnFile (const char *file, LPATTACH att)
                           NULL, &to);
     if (!SUCCEEDED (hr)) {
        from->Release ();
-       logDebug ( "streamOnFile %s failed with %s\r\n", file, 
+       logDebug ( "streamOnFile %s failed with %s\n", file, 
                    hr == MAPI_E_NO_ACCESS? 
                    "no access" : hr == MAPI_E_NOT_FOUND? "not found" : "unknown");
        return FALSE;
@@ -1216,7 +1313,7 @@ MapiGPGMEImpl::streamOnFile (const char *file, LPATTACH att)
     to->Commit (0);
     to->Release ();
     from->Release ();
-    logDebug ( "streamOnFile %s succeeded\r\n", file);
+    logDebug ( "streamOnFile %s succeeded\n", file);
     return TRUE;
 }
 
@@ -1364,7 +1461,7 @@ MapiGPGMEImpl::checkAttachmentExtension (const char *ext)
        return false;
     if (*ext == '.')
        ext++;
-    logDebug ( "checkAttachmentExtension: %s\r\n", ext);
+    logDebug ( "checkAttachmentExtension: %s\n", ext);
     if (stricmp (ext, "gpg") == 0 ||
        stricmp (ext, "pgp") == 0 ||
        stricmp (ext, "asc") == 0)
@@ -1420,7 +1517,7 @@ MapiGPGMEImpl::setXHeader (const char *name, const char *val)
 //     mnid[0].Kind.lpwstrName = A2W (name);
     hr = msg->GetIDsFromNames (1, (LPMAPINAMEID*)mnid, MAPI_CREATE, &pProps);
     if (FAILED (hr)) {
-       logDebug ("set X-Header failed.\r\n");
+       logDebug ("set X-Header failed.\n");
        return false;
     }
     
@@ -1428,11 +1525,11 @@ MapiGPGMEImpl::setXHeader (const char *name, const char *val)
     pv.Value.lpszA = (char *)val;
     hr = HrSetOneProp(msg, &pv);       
     if (!SUCCEEDED (hr)) {
-       logDebug ("set X-Header failed.\r\n");
+       logDebug ("set X-Header failed.\n");
        return false;
     }
 
-    logDebug ("set X-Header succeeded.\r\n");
+    logDebug ("set X-Header succeeded.\n");
     return true;
 }
 
@@ -1542,7 +1639,7 @@ MapiGPGMEImpl::signAttachment (const char *datfile)
        err = op_sign_file_next (passphraseCallback, this, OP_SIG_DETACH, datfile, sigfile);
 
     if (streamFromFile (sigfile, newatt)) {
-       logDebug ("signAttachment: commit changes.\r\n");
+       logDebug ("signAttachment: commit changes.\n");
        newatt->SaveChanges (FORCE_SAVE);
     }
     releaseAttachment (newatt);
@@ -1596,18 +1693,18 @@ MapiGPGMEImpl::processAttachment (LPATTACH *attm, HWND hwnd,
 
        tmp = getAttachFilename (att);
        inname =  generateTempname (tmp);
-       logDebug ("enc inname: '%s'\r\n", inname);
+       logDebug ("enc inname: '%s'\n", inname);
        if (action != GPG_ATTACH_DECRYPT) {
            char *tmp2 = (char *)xcalloc (1, strlen (inname) 
                                             + strlen (ATT_PREFIX) + 4 + 1);
            sprintf (tmp2, "%s"ATT_PREFIX".%s", tmp, getPGPExtension (action));
            outname = generateTempname (tmp2);
            xfree (tmp2);
-           logDebug ( "enc outname: '%s'\r\n", outname);
+           logDebug ( "enc outname: '%s'\n", outname);
        }
        else {
            if (checkAttachmentExtension (strrchr (tmp, '.')) == false) {
-               logDebug ( "%s: no pgp extension found.\r\n", tmp);
+               logDebug ( "%s: no pgp extension found.\n", tmp);
                xfree (tmp);
                xfree (inname);
                return TRUE;
@@ -1617,7 +1714,7 @@ MapiGPGMEImpl::processAttachment (LPATTACH *attm, HWND hwnd,
            tmp2[strlen (tmp2) - 4] = '\0';
            outname = generateTempname (tmp2);
            xfree (tmp2);
-           logDebug ("dec outname: '%s'\r\n", outname);
+           logDebug ("dec outname: '%s'\n", outname);
        }
        success = FALSE;
        /* if we are in sign-only mode, just create a detached signature
@@ -1626,7 +1723,7 @@ MapiGPGMEImpl::processAttachment (LPATTACH *attm, HWND hwnd,
            if (doCmdFile (action, inname, outname))
                success = TRUE;
            else
-               logDebug ( "doCmdFile failed\r\n");
+               logDebug ( "doCmdFile failed\n");
        }
        if ((action == GPG_ATTACH_ENCRYPT || action == GPG_ATTACH_SIGN) 
            && autoSignAtt)
@@ -1647,13 +1744,13 @@ MapiGPGMEImpl::processAttachment (LPATTACH *attm, HWND hwnd,
            setAttachFilename (newatt, outname, false);
 
            if (streamFromFile (outname, newatt)) {
-               logDebug ( "commit changes.\r\n");          
+               logDebug ( "commit changes.\n");            
                newatt->SaveChanges (FORCE_SAVE);
            }
        }
        else if (success && action == GPG_ATTACH_DECRYPT) {
            success = saveDecryptedAttachment (NULL, outname);
-           logDebug ("saveDecryptedAttachment ec=%d\r\n", success);
+           logDebug ("saveDecryptedAttachment ec=%d\n", success);
        }
        DeleteFile (outname);
        xfree (outname);
@@ -1680,16 +1777,15 @@ MapiGPGMEImpl::decryptAttachments (HWND hwnd)
     if (!getAttachments ())
        return FALSE;
     n = countAttachments ();
-    logDebug ( "dec: mail has %d attachments\r\n", n);
+    logDebug ( "dec: mail has %d attachments\n", n);
     if (!n) {
        freeAttachments ();
        return TRUE;
     }
     for (int i=0; i < n; i++) {
        LPATTACH amsg = openAttachment (i);
-       if (!amsg)
-           continue;
-       processAttachment (&amsg, hwnd, i, GPG_ATTACH_DECRYPT);
+       if (amsg)
+          processAttachment (&amsg, hwnd, i, GPG_ATTACH_DECRYPT);
     }
     freeAttachments ();
     return 0;
@@ -1699,10 +1795,13 @@ MapiGPGMEImpl::decryptAttachments (HWND hwnd)
 int
 MapiGPGMEImpl::signAttachments (HWND hwnd)
 {
-    if (!getAttachments ())
+    if (!getAttachments ()) {
+        logDebug ("MapiGPGME.signAttachments: getAttachments failed\n");
        return FALSE;
+    }
+    
     int n = countAttachments ();
-    logDebug ("sig: mail has %d attachments\r\n", n);
+    logDebug ("MapiGPGME.signAttachments: mail has %d attachments\n", n);
     if (!n) {
        freeAttachments ();
        return TRUE;
@@ -1727,7 +1826,7 @@ MapiGPGMEImpl::encryptAttachments (HWND hwnd)
     if (!getAttachments ())
        return FALSE;
     n = countAttachments ();
-    logDebug ("enc: mail has %d attachments\r\n", n);
+    logDebug ("enc: mail has %d attachments\n", n);
     if (!n) {
        freeAttachments ();
        return TRUE;
@@ -1779,7 +1878,7 @@ MapiGPGMEImpl::saveDecryptedAttachment (HWND root, const char *srcname)
     ofn.lpstrFilter = filter;
 
     if (GetSaveFileName (&ofn)) {
-       logDebug ("copy %s -> %s\r\n", srcname, fname);
+       logDebug ("copy %s -> %s\n", srcname, fname);
        return CopyFile (srcname, fname, FALSE) == 0? false : true;
     }
     return true;
@@ -1834,8 +1933,9 @@ MapiGPGMEImpl::readOptions (void)
     xfree (val); val = NULL;
 
     load_extension_value ("logFile", &val);
-    if (val == NULL ||*val == '"' || *val == 0)
-       logfile = NULL;
+    if (val == NULL ||*val == '"' || *val == 0) {
+        setLogFile (NULL);
+    }
     else {
        setLogFile (val);
        setEnableLogging (true);
@@ -1928,7 +2028,7 @@ MapiGPGMEImpl::attachPublicKey (const char *keyid)
     /* XXX: set proper RFC3156 MIME types. */
 
     if (streamFromFile (keyfile, newatt)) {
-       logDebug ("attachPublicKey: commit changes.\r\n");
+       logDebug ("attachPublicKey: commit changes.\n");
        newatt->SaveChanges (FORCE_SAVE);
     }
     releaseAttachment (newatt);
index 514cd13..74b4d00 100644 (file)
@@ -114,12 +114,16 @@ public:
           m->destroy();
         }
     }
+
+  /* Fixme: Move this. */
+  virtual void __stdcall logDebug (const char *fmt, va_list a) = 0;
 };
 
 
 extern "C" {
 
 MapiGPGME * __stdcall CreateMapiGPGME (LPMESSAGE msg);
+
 }
 
 #endif /*MAPI_GPGME_H*/
index 152bbee..457fa79 100644 (file)
@@ -229,8 +229,7 @@ fail:
 
 
 int
-op_sign_file_next (int (*pass_cb)(void *, const char*, const char*, int, int),
-                  void *pass_cb_value,
+op_sign_file_next (gpgme_passphrase_cb_t pass_cb, void *pass_cb_value,
                   int mode, const char *infile, const char *outfile)
 {
     gpgme_data_t in=NULL;
@@ -565,16 +564,23 @@ leave:
     return err;
 }
 
+
 int
 op_sign_start (const char *inbuf, char **outbuf)
 {
     gpgme_key_t locusr = NULL;
     int err;
 
+    log_debug ("engine-gpgme.op_sign_start: enter\n");
     err = signer_dialog_box (&locusr, NULL);
-    if (err == -1) /* Cancel */
+    if (err == -1) { /* Cancel */
+        log_debug ("engine-gpgme.op_sign_start: leave (canceled)\n");
        return 0;
-    return op_sign ((void*)locusr, inbuf, outbuf);
+    }
+    err = op_sign ((void*)locusr, inbuf, outbuf);
+    log_debug ("engine-gpgme.op_sign_start: leave (rc=%d (%s))\n",
+               err, gpg_strerror (err));
+    return err;
 }
 
 
@@ -586,11 +592,12 @@ op_sign (void *locusr, const char *inbuf, char **outbuf)
     gpgme_ctx_t ctx;
     struct decrypt_key_s *hd;
 
+    log_debug ("engine-gpgme.op_sign: enter\n");
     *outbuf = NULL;
     op_init ();
     err = gpgme_new (&ctx);
-    if (err)
-       return err;
+    if (err) 
+        goto really_leave;
 
     hd = (struct decrypt_key_s *)xcalloc (1, sizeof *hd);
     hd->flags = 0x01;
@@ -614,18 +621,21 @@ op_sign (void *locusr, const char *inbuf, char **outbuf)
        out = NULL;
     }
 
-leave:
+  leave:
+    err = 0; /* fixme: the orginal code didn't returned an error.  Correct?*/
     free_decrypt_key (hd);
     gpgme_release (ctx);
     gpgme_data_release (in);
     gpgme_data_release (out);
-    return 0;
+  really_leave:
+    log_debug ("engine-gpgme.op_sign: leave (rc=%d (%s))\n",
+               err, gpg_strerror (err));
+    return err;
 }
 
 
 int
-op_decrypt (int (*pass_cb)(void *, const char*, const char*, int, int),
-           void *pass_cb_value,
+op_decrypt (gpgme_passphrase_cb_t pass_cb, void *pass_cb_value,
            const char *inbuf, char **outbuf)
 {
     /* XXX: violates the information hiding principle */
@@ -721,8 +731,7 @@ op_decrypt_start (const char *inbuf, char **outbuf)
 }
 
 int
-op_decrypt_next (int (*pass_cb)(void *, const char*, const char*, int, int),
-                void *pass_cb_value,
+op_decrypt_next (gpgme_passphrase_cb_t pass_cb, void *pass_cb_value,
                 const char *inbuf, char **outbuf)
 {
     return op_decrypt (pass_cb, pass_cb_value, inbuf, outbuf);
@@ -772,26 +781,35 @@ leave:
 }
 
 
-/* Try to find a key for each item in @id. If one ore more items were
-   not found, it is added to @unknown at the same position.
-   @n is the total amount of items to find. */
+/* Try to find a key for each item in array NAMES. If one ore more
+   items were not found, they are stored as malloced strings to the
+   newly allocated array UNKNOWN at the corresponding position.  Found
+   keys are stored in the newly allocated array KEYS. If N is not NULL
+   the total number of items will be stored at that address.  Note,
+   that both UNKNOWN may have NULL entries inbetween. The fucntion
+   returns the nuber of keys not found. Caller needs to releade KEYS
+   and UNKNOWN. 
+
+   FIXME: The calling convetion is far to complicated.  Needs to be revised.
+
+*/
 int 
-op_lookup_keys (char **id, gpgme_key_t **keys, char ***unknown, size_t *n)
+op_lookup_keys (char **names, gpgme_key_t **keys, char ***unknown, size_t *n)
 {
     int i, pos=0;
     gpgme_key_t k;
 
-    for (i=0; id[i] != NULL; i++)
+    for (i=0; names[i]; i++)
        ;
     if (n)
        *n = i;
     *unknown = (char **)xcalloc (i+1, sizeof (char*));
     *keys = (gpgme_key_t *)xcalloc (i+1, sizeof (gpgme_key_t));
-    for (i=0; id[i] != NULL; i++) {
+    for (i=0; names[i]; i++) {
        /*k = find_gpg_email(id[i]);*/
-       k = get_gpg_key (id[i]);
+       k = get_gpg_key (names[i]);
        if (!k)
-           (*unknown)[pos++] = xstrdup (id[i]);
+           (*unknown)[pos++] = xstrdup (names[i]);
        else
            (*keys)[i] = k;
     }
index 90d2c8a..2f0e576 100644 (file)
@@ -23,6 +23,9 @@
 
 #ifdef __cplusplus
 extern "C" {
+#if 0
+}
+#endif
 #endif
 
 typedef enum {
@@ -56,14 +59,12 @@ int op_sign (void *locusr, const char *inbuf, char **outbuf);
 int op_sign_file (int mode, const char *infile, const char *outfile);
 int op_sign_file_ext (int mode, const char *infile, const char *outfile,
                      cache_item_t *ret_itm);
-int op_sign_file_next (int (*pass_cb)(void *, const char*, const char*, int, int),
-                      void *pass_cb_value,
+int op_sign_file_next (gpgme_passphrase_cb_t pass_cb, void *pass_cb_value,
                       int mode, const char *infile, const char *outfile);
 
 int op_decrypt_file (const char *infile, const char *outfile);
-int op_decrypt_next (int (*pass_cb)(void *, const char*, const char*, int, int),
-                    void *pass_cb_value,
-                    const char *inbuf, char **outbuf);
+int op_decrypt_next (gpgme_passphrase_cb_t pass_cb, void *pass_cb_value,
+                     const char *inbuf, char **outbuf);
 int op_decrypt_start (const char *inbuf, char **outbuf);
 int op_decrypt_start_ext (const char *inbuf, char **outbuf, cache_item_t *ret_itm);
 
index f153d53..7eaec39 100644 (file)
@@ -78,6 +78,10 @@ void cache_item_free (cache_item_t itm);
 
 HRESULT w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e);
 
+/*-- MapiGPGME.cpp --*/
+void log_debug (const char *fmt, ...);
+
+
 /*-- recipient-dialog.c --*/
 int recipient_dialog_box(gpgme_key_t **ret_rset, int *ret_opts);
 int recipient_dialog_box2 (gpgme_key_t *fnd, char **unknown, size_t n,
@@ -85,7 +89,7 @@ int recipient_dialog_box2 (gpgme_key_t *fnd, char **unknown, size_t n,
 
 /*-- passphrase-dialog.c --*/
 int signer_dialog_box (gpgme_key_t *r_key, char **r_passwd);
-int passphrase_callback_box (void *opaque, const char *uid_hint, 
+gpgme_error_t passphrase_callback_box (void *opaque, const char *uid_hint, 
                             const char *pass_info,
                             int prev_was_bad, int fd);
 void free_decrypt_key (struct decrypt_key_s * ctx);
index a280be3..834367d 100644 (file)
@@ -5,7 +5,7 @@ LIBRARY libgpgmedlgs.dll
 
 
 EXPORTS
-       CreateMapiGPGME@4
+       CreateMapiGPGME = CreateMapiGPGME@4
 
 
 
index 07f5c0f..965ac2d 100644 (file)
@@ -153,6 +153,7 @@ decrypt_key_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
 
     switch (msg) {
     case WM_INITDIALOG:
+        log_debug ("decrypt_key_dlg_proc: WM_INITDIALOG\n");
        dec = (struct decrypt_key_s *)lparam;
        if (dec && dec->use_as_cb) {
            dec->opts = 0;
@@ -180,15 +181,18 @@ decrypt_key_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
        return FALSE;
 
     case WM_DESTROY:
+        log_debug ("decrypt_key_dlg_proc: WM_DESTROY\n");
        hide_state = 1;
        break;
 
     case WM_SYSCOMMAND:
+        log_debug ("decrypt_key_dlg_proc: WM_SYSCOMMAND\n");
        if (wparam == SC_CLOSE)
            EndDialog (dlg, TRUE);
        break;
 
     case WM_COMMAND:
+        log_debug ("decrypt_key_dlg_proc: WM_COMMAND\n");
        switch (HIWORD (wparam)) {
        case BN_CLICKED:
            if ((int)LOWORD (wparam) == IDC_DEC_HIDE) {
@@ -346,7 +350,7 @@ signer_dialog_box (gpgme_key_t *r_key, char **r_passwd)
 
 /* GPGME passphrase callback function. It starts the decryption dialog
    to request the passphrase from the user. */
-int
+gpgme_error_t
 passphrase_callback_box (void *opaque, const char *uid_hint, 
                         const char *pass_info,
                         int prev_was_bad, int fd)
@@ -354,12 +358,16 @@ passphrase_callback_box (void *opaque, const char *uid_hint,
     struct decrypt_key_s *hd = (struct decrypt_key_s *)opaque;
     DWORD nwritten = 0;
 
+    log_debug ("passphrase_callback_box: enter (uh=`%s',pi=`%s')\n", 
+               uid_hint?uid_hint:"(null)", pass_info?pass_info:"(null)");
     if (hd->opts & OPT_FLAG_CANCEL) {
        WriteFile ((HANDLE)fd, "\n", 1, &nwritten, NULL);
        CloseHandle ((HANDLE)fd);
+        log_debug ("passphrase_callback_box: leave (due to cancel flag)\n");
        return -1;
     }
     if (prev_was_bad) {
+        log_debug ("passphrase_callback_box: last passphrase was bad\n");
        xfree (hd->pass);
        hd->pass = NULL;
     }
@@ -367,6 +375,7 @@ passphrase_callback_box (void *opaque, const char *uid_hint,
     if (hd && uid_hint && !hd->pass) {
        const char * s = uid_hint;
        size_t i=0;
+        int rc;
        
        while (s && *s != ' ')
            hd->keyid[i++] = *s++;
@@ -381,19 +390,35 @@ passphrase_callback_box (void *opaque, const char *uid_hint,
        hd->last_was_bad = prev_was_bad? 1: 0;
        hd->use_as_cb = 1;
        if (hd->flags & 0x01)
-           DialogBoxParam (glob_hinst, (LPCSTR)IDD_DEC, GetDesktopWindow (),
+           rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_DEC, GetDesktopWindow (),
                            decrypt_key_dlg_proc, (LPARAM)hd);
        else
-           DialogBoxParam (glob_hinst, (LPCTSTR)IDD_DEC_EXT, GetDesktopWindow (),
+           rc = DialogBoxParam (glob_hinst, (LPCTSTR)IDD_DEC_EXT, GetDesktopWindow (),
                            decrypt_key_ext_dlg_proc, 
                            (LPARAM)hd);
+        if (rc <= 0) {
+            char buf[256];
+    
+            FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError (), 
+                           MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), 
+                           buf, sizeof (buf)-1, NULL);
+            
+            log_debug ("passphrase_callback_box: dialog failed rc=%d (%s)\n",
+                       rc, buf);
+        }
     }
+    else 
+        log_debug ("passphrase_callback_box: hd=%p hd->pass=`%s'\n",
+                   hd, hd && hd->pass? hd->pass: "(null)");
+        
     if (hd->pass != NULL) {
+        log_debug ("passphrase_callback_box: sending passphrase ...\n");
        WriteFile ((HANDLE)fd, hd->pass, strlen (hd->pass), &nwritten, NULL);
        WriteFile ((HANDLE)fd, "\n", 1, &nwritten, NULL);
     }
     else
        WriteFile((HANDLE)fd, "\n", 1, &nwritten, NULL);
+    log_debug ("passphrase_callback_box: leave\n");
     return 0;
 }