Made debugging configurable.
authorWerner Koch <wk@gnupg.org>
Fri, 4 Jan 2008 10:42:18 +0000 (10:42 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 4 Jan 2008 10:42:18 +0000 (10:42 +0000)
Pass window handle to uiserver.
Allow UIserver to use SetForegroundWindow.

15 files changed:
doc/gpgol.texi
src/ChangeLog
src/common.h
src/engine-assuan.c
src/engine.c
src/engine.h
src/ext-commands.cpp
src/item-events.cpp
src/main.c
src/message-events.cpp
src/message.cpp
src/message.h
src/mimemaker.c
src/mimemaker.h
src/mimeparser.c

index 8017901..0f8117f 100644 (file)
@@ -649,7 +649,21 @@ in quotes.
 
 @item HKCU\Software\GNU\GpgOL:enableDebug
 Setting this key to the string @code{1} enables a few extra features in
-the UI, useful only for debugging.
+the UI, useful only for debugging.  Setting it to values larger than 1
+make the log file output more verbose; these are actually bit flags
+according to the following table (which may change with any release):
+@table @code
+@item 2
+Tell what the Assuan I/O scheduler is doing.
+@item 4 
+Even more verbose Assuan I/O scheduler reporting. 
+@item 8
+Tell what the filter I/O system is doing.
+@item 16 
+Tell how the filter I/O locks the resources.
+@end table
+
+
 
 @itemx HKCU\Software\GNU\GpgOL:logFile
 If the value is not empty, GpgOL takes this as a log file and appends
index 318f9b7..aa0067d 100644 (file)
@@ -1,3 +1,28 @@
+2008-01-04  Werner Koch  <wk@g10code.com>
+
+       * engine-assuan.c (send_options): Call AllowSetForegroundWindow.
+
+       * main.c (read_options): Allo other values than 1 for enableDebug.
+       * common.h (DBG_IOWORKER, DBG_IOWORKER_EXTRA, DBG_FILTER) 
+       (DBG_FILTER): New.
+       * engine.c (debug_filter): Turn it into a macro.
+       (debug_filter_extra): New macro, used instead of checking the
+       value of debug_filter.
+       * engine-assuan.c (debug_ioworker, debug_ioworker_extra): new.
+       Use them all over the file to enable debugging.
+       * engine.c (engine_encrypt_start): Add arg HWND.
+       (engine_sign_start, engine_decrypt_start, engine_verify_start) 
+       (engine_start_keymanager): Ditto.
+
+       * mimemaker.c (mime_encrypt, mime_sign_encrypt, mime_sign) 
+       (do_mime_sign): Add arg HWND and pass it to the engine.
+       * mimeparser.c (mime_verify, mime_decrypt): Pass HWND.
+       * message.cpp (message_sign, sign_encrypt): Pass HWND.
+       (message_incoming_handler, message_verify, message_decrypt): Add
+       arg HWND and pass it on.
+       * message-events.cpp (OnRead): Pass HWND to message function.
+       * ext-commands.cpp (DoCommand):  Ditto.
+
 2008-01-03  Werner Koch  <wk@g10code.com>
 
        * mimemaker.c (mime_sign_encrypt): Fix result test of do_mime_sign.
index 1f921e4..8d731f7 100644 (file)
@@ -105,7 +105,9 @@ extern
 #endif
 struct 
 {
-  int enable_debug;         /* Enable extra debug options. */
+  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. */
@@ -141,7 +143,12 @@ struct b64_state_s
 };
 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        2
+#define DBG_IOWORKER_EXTRA  4
+#define DBG_FILTER          8
+#define DBG_FILTER_EXTRA   16 
 
 /*-- common.c --*/
 void set_global_hinstance (HINSTANCE hinst);
index 8351b37..f270b50 100644 (file)
@@ -1,5 +1,5 @@
 /* engine-assuan.c - Crypto engine using an Assuan server
- *     Copyright (C) 2007 g10 Code GmbH
+ *     Copyright (C) 2007, 2008 g10 Code GmbH
  *
  * This file is part of GpgOL.
  *
@@ -26,6 +26,7 @@
 #include <errno.h>
 #include <assert.h>
 #define WIN32_LEAN_AND_MEAN 
+#define WINVER 0x0500  /* Required for AllowSetForegroundWindow.  */
 #include <windows.h>
 
 #include <assuan.h>
                                        SRCNAME, __func__, __LINE__); \
                         } while (0)
 
+/* Debug macros.  */
+#define debug_ioworker        (opt.enable_debug & DBG_IOWORKER)
+#define debug_ioworker_extra  (opt.enable_debug & DBG_IOWORKER_EXTRA)
+
+
 /* How many times we will try to connect to a server after we have
    started him.  */
 #define FIREUP_RETRIES 10
@@ -272,9 +278,10 @@ create_io_pipe (HANDLE filedes[2], pid_t serverpid, int for_write)
 
   filedes[0] = r;
   filedes[1] = w;
-  log_debug ("%s:%s: new pipe created: r=%p%s w=%p%s",  SRCNAME, __func__,
-             r, for_write? " (server)":"",
-             w, !for_write?" (server)":"");
+  if (debug_ioworker)
+    log_debug ("%s:%s: new pipe created: r=%p%s w=%p%s",  SRCNAME, __func__,
+               r, for_write? " (server)":"",
+               w, !for_write?" (server)":"");
   return 0;
 }
 
@@ -445,20 +452,21 @@ send_options (assuan_context_t ctx, void *hwnd, pid_t *r_pid)
   char numbuf[50];
 
   *r_pid = (pid_t)(-1);
-  if (hwnd)
+  err = assuan_transact (ctx, "GETINFO pid", getinfo_pid_cb, r_pid,
+                         NULL, NULL, NULL, NULL);
+  if (!err && *r_pid == (pid_t)(-1))
     {
-      snprintf (numbuf, sizeof numbuf, "%lx", (unsigned long)hwnd);
-      err = send_one_option (ctx, "window-id", numbuf);
+      log_debug ("%s:%s: server did not return a PID", SRCNAME, __func__);
+      err = gpg_error (GPG_ERR_ASSUAN_SERVER_FAULT);
     }
-  if (!err)
+
+  if (*r_pid != (pid_t)(-1) && !AllowSetForegroundWindow (*r_pid))
+    log_error_w32 (-1, "AllowSetForegroundWindow(%u) failed", *r_pid);
+
+  if (!err && hwnd)
     {
-      err = assuan_transact (ctx, "GETINFO pid", getinfo_pid_cb, r_pid,
-                             NULL, NULL, NULL, NULL);
-      if (!err && *r_pid == (pid_t)(-1))
-        {
-          log_debug ("%s:%s: server did not return a PID", SRCNAME, __func__);
-          err = gpg_error (GPG_ERR_ASSUAN_SERVER_FAULT);
-        }
+      snprintf (numbuf, sizeof numbuf, "%lx", (unsigned long)hwnd);
+      err = send_one_option (ctx, "window-id", numbuf);
     }
 
   return err;
@@ -696,8 +704,11 @@ worker_start_read (work_item_t item)
               item->got_error = 1;
             }
           else
-            log_debug ("%s:%s: [%s:%p] wrote %d bytes to callback", 
-                       SRCNAME, __func__, item->name, item->hd, nwritten);
+            {
+              if (debug_ioworker)
+                log_debug ("%s:%s: [%s:%p] wrote %d bytes to callback", 
+                           SRCNAME, __func__, item->name, item->hd, nwritten);
+            }
         }
       retval = 1;
     }
@@ -707,16 +718,18 @@ worker_start_read (work_item_t item)
 
       if (syserr == ERROR_IO_PENDING)
         {
-          log_debug ("%s:%s: [%s:%p] io(read) pending",
-                     SRCNAME, __func__, item->name, item->hd);
+          if (debug_ioworker)
+            log_debug ("%s:%s: [%s:%p] io(read) pending",
+                       SRCNAME, __func__, item->name, item->hd);
           item->io_pending = sizeof item->buffer;
           retval = 1;
         }
       else if (syserr == ERROR_HANDLE_EOF || syserr == ERROR_BROKEN_PIPE)
         {
-          log_debug ("%s:%s: [%s:%p] EOF%s seen",
-                     SRCNAME, __func__, item->name, item->hd,
-                     syserr == ERROR_BROKEN_PIPE? " (broken pipe)":"");
+          if (debug_ioworker)
+            log_debug ("%s:%s: [%s:%p] EOF%s seen",
+                       SRCNAME, __func__, item->name, item->hd,
+                       syserr == ERROR_BROKEN_PIPE? " (broken pipe)":"");
           item->got_ready = 1;
         }
       else
@@ -757,8 +770,11 @@ worker_check_read (work_item_t item, DWORD nbytes)
           item->got_error = 1;
         }
       else
-        log_debug ("%s:%s: [%s:%p] wrote %d bytes to callback",
-                   SRCNAME, __func__, item->name, item->hd, nwritten);
+        {
+          if (debug_ioworker)
+            log_debug ("%s:%s: [%s:%p] wrote %d bytes to callback",
+                       SRCNAME, __func__, item->name, item->hd, nwritten);
+        }
     }
 }
 
@@ -795,8 +811,9 @@ worker_start_write (work_item_t item)
     }
   else if (!nread)
     {
-      log_debug ("%s:%s: [%s:%p] EOF received from callback",
-                 SRCNAME, __func__, item->name, item->hd);
+      if (debug_ioworker)
+        log_debug ("%s:%s: [%s:%p] EOF received from callback",
+                   SRCNAME, __func__, item->name, item->hd);
       item->got_ready = 1;
       retval = 1;
     }
@@ -811,8 +828,11 @@ worker_start_write (work_item_t item)
               item->got_error = 1;
             }
           else
-            log_debug ("%s:%s: [%s:%p] wrote %lu bytes", 
-                       SRCNAME, __func__, item->name, item->hd, nbytes);
+            {
+              if (debug_ioworker)
+                log_debug ("%s:%s: [%s:%p] wrote %lu bytes", 
+                           SRCNAME, __func__, item->name, item->hd, nbytes);
+            }
           retval = 1;
         }
       else 
@@ -821,8 +841,9 @@ worker_start_write (work_item_t item)
 
           if (syserr == ERROR_IO_PENDING)
             {
-              log_debug ("%s:%s: [%s:%p] io(write) pending (%d bytes)",
-                         SRCNAME, __func__, item->name, item->hd, nread);
+              if (debug_ioworker)
+                log_debug ("%s:%s: [%s:%p] io(write) pending (%d bytes)",
+                           SRCNAME, __func__, item->name, item->hd, nread);
               item->io_pending = nread;
               retval = 1;
             }
@@ -852,8 +873,11 @@ worker_check_write (work_item_t item, DWORD nbytes)
       item->got_error = 1;
     }
   else
-    log_debug ("%s:%s: [%s:%p] write finished (%lu bytes)", 
-               SRCNAME, __func__, item->name, item->hd, nbytes);
+    {
+      if (debug_ioworker)
+        log_debug ("%s:%s: [%s:%p] write finished (%lu bytes)", 
+                   SRCNAME, __func__, item->name, item->hd, nbytes);
+    }
 }
 
 
@@ -896,8 +920,9 @@ async_worker_thread (void *dummy)
           assert (item->data);
           if (hdarraylen == DIM (hdarray))
             {
-              log_debug ("%s:%s: [%s:%p] wait array full - ignored for now",
-                         SRCNAME, __func__, item->name, item->hd);
+              if (debug_ioworker)
+                log_debug ("%s:%s: [%s:%p] wait array full - ignored for now",
+                           SRCNAME, __func__, item->name, item->hd);
               continue;
             }
           
@@ -919,8 +944,11 @@ async_worker_thread (void *dummy)
       LeaveCriticalSection (&work_queue_lock);
 
       if (any_ready)
-        log_debug ("%s:%s: %d items in queue; skipping wait", 
-                   SRCNAME, __func__, count);
+        {
+          if (debug_ioworker_extra)
+            log_debug ("%s:%s: %d items in queue; skipping wait", 
+                       SRCNAME, __func__, count);
+        }
       else
         {
           /* First process any window messages of this thread.  Do
@@ -940,13 +968,16 @@ async_worker_thread (void *dummy)
 /*               } */
 /*           } */
 
-          log_debug ("%s:%s: %d items in queue; waiting for %d items:",
-                     SRCNAME, __func__, count, hdarraylen-1);
-          for (item = work_queue; item; item = item->next)
+          if (debug_ioworker_extra)
             {
-              if (item->waiting)
-                log_debug ("%s:%s: [%s:%p]",
-                           SRCNAME, __func__, item->name, item->hd);
+              log_debug ("%s:%s: %d items in queue; waiting for %d items:",
+                         SRCNAME, __func__, count, hdarraylen-1);
+              for (item = work_queue; item; item = item->next)
+                {
+                  if (item->waiting)
+                    log_debug ("%s:%s: [%s:%p]",
+                               SRCNAME, __func__, item->name, item->hd);
+                }
             }
           n = WaitForMultipleObjects (hdarraylen, hdarray, FALSE, INFINITE);
 /*           n = MsgWaitForMultipleObjects (hdarraylen, hdarray, FALSE, */
@@ -984,7 +1015,8 @@ async_worker_thread (void *dummy)
 
       /* Handle completion status.  */
       EnterCriticalSection (&work_queue_lock);
-/*       log_debug ("%s:%s: checking completion states", SRCNAME, __func__); */
+      if (debug_ioworker_extra)
+        log_debug ("%s:%s: checking completion states", SRCNAME, __func__);
       for (item = work_queue; item; item = item->next)
         {
           if (!item->io_pending)
@@ -1005,8 +1037,9 @@ async_worker_thread (void *dummy)
               else if (!item->writing && syserr == ERROR_HANDLE_EOF)
                 {
                   /* Got EOF.  */
-                  log_debug ("%s:%s: [%s:%p] EOF received",
-                             SRCNAME, __func__, item->name, item->hd);
+                  if (debug_ioworker)
+                    log_debug ("%s:%s: [%s:%p] EOF received",
+                               SRCNAME, __func__, item->name, item->hd);
                   item->io_pending = 0;
                   item->got_ready = 1;
                 }
@@ -1033,7 +1066,8 @@ async_worker_thread (void *dummy)
       Sleep (0);
 
       EnterCriticalSection (&work_queue_lock);
-/*       log_debug ("%s:%s: cleaning up work queue", SRCNAME, __func__); */
+      if (debug_ioworker_extra)
+        log_debug ("%s:%s: cleaning up work queue", SRCNAME, __func__); 
       for (item = work_queue; item; item = item->next)
         {
           if (item->used && (item->got_ready || item->got_error))
@@ -1058,17 +1092,19 @@ async_worker_thread (void *dummy)
                           break;
                       if (itm2)
                         {
-                          log_debug ("%s:%s: [%s:%p] delaying closure due to "
-                                     "[%s/%p]", SRCNAME, __func__,
-                                     item->name, item->hd, 
-                                     itm2->name, itm2->hd);
+                          if (debug_ioworker)
+                            log_debug ("%s:%s: [%s:%p] delaying closure "
+                                       "due to [%s/%p]", SRCNAME, __func__,
+                                       item->name, item->hd, 
+                                       itm2->name, itm2->hd);
                           item->delayed_ready = 1;
                           break; 
                         }
                     }
                   item->delayed_ready = 0;
-                  log_debug ("%s:%s: [%s:%p] invoking closure",
-                             SRCNAME,__func__, item->name, item->hd);
+                  if (debug_ioworker)
+                    log_debug ("%s:%s: [%s:%p] invoking closure",
+                               SRCNAME,__func__, item->name, item->hd);
                   
                   item->cld->closure (item->cld);
                   xfree (item->cld);
@@ -1100,8 +1136,9 @@ engine_assuan_cancel (void *cancel_data)
 static void
 finalize_handler (work_item_t item)
 {
-  log_debug ("%s:%s: [%s:%p] closing handle", 
-             SRCNAME, __func__, item->name, item->hd);
+  if (debug_ioworker)
+    log_debug ("%s:%s: [%s:%p] closing handle", 
+               SRCNAME, __func__, item->name, item->hd);
   CloseHandle (item->hd);
   item->hd = INVALID_HANDLE_VALUE;
 }
@@ -1110,7 +1147,9 @@ finalize_handler (work_item_t item)
 static void
 noclose_finalize_handler (work_item_t item)
 {
-  log_debug ("%s:%s: [%s:%p] called", SRCNAME, __func__, item->name, item->hd);
+  if (debug_ioworker)
+    log_debug ("%s:%s: [%s:%p] called",
+               SRCNAME, __func__, item->name, item->hd);
   item->hd = INVALID_HANDLE_VALUE;
 }
 
@@ -1153,8 +1192,10 @@ enqueue_callback (const char *name, assuan_context_t ctx,
   item->aborting = 0;
   item->finalize = fin_handler;
   memset (&item->ov, 0, sizeof item->ov);
-  log_debug ("%s:%s: [%s:%p] created%s",
-             SRCNAME, __func__, item->name, item->hd, created?"":" (reusing)");
+  if (debug_ioworker)
+    log_debug ("%s:%s: [%s:%p] created%s",
+               SRCNAME, __func__, item->name, item->hd,
+               created?"":" (reusing)");
   LeaveCriticalSection (&work_queue_lock);
 }
 
@@ -1170,8 +1211,9 @@ destroy_command (ULONG cmdid)
   for (item = work_queue; item; item = item->next)
     if (item->used && item->cmdid == cmdid && !item->wait_on_success)
       {
-        log_debug ("%s:%s: [%s:%p] cmdid=%lu registered for destroy",
-                   SRCNAME, __func__, item->name, item->hd, item->cmdid);
+        if (debug_ioworker)
+          log_debug ("%s:%s: [%s:%p] cmdid=%lu registered for destroy",
+                     SRCNAME, __func__, item->name, item->hd, item->cmdid);
         /* First send an I/O cancel in case the the last
            GetOverlappedResult returned only a partial result.  This
            works because we are always running within the
@@ -1192,7 +1234,8 @@ status_handler (closure_data_t cld, const char *line)
   gpg_error_t err;
   int retval = 0;
 
-  log_debug ("%s:%s: cld %p, line `%s'", SRCNAME, __func__, cld, line);
+  if (debug_ioworker)
+    log_debug ("%s:%s: cld %p, line `%s'", SRCNAME, __func__, cld, line);
 
   if (*line == '#' || !*line)
     ;
index fb535b7..1a9a788 100644 (file)
@@ -1,5 +1,5 @@
 /* engine.c - Crypto engine dispatcher
- *     Copyright (C) 2007 g10 Code GmbH
+ *     Copyright (C) 2007, 2008 g10 Code GmbH
  *
  * This file is part of GpgOL.
  *
@@ -41,7 +41,8 @@
                                        SRCNAME, __func__, __LINE__); \
                         } while (0)
 
-static int debug_filter = 0;
+#define debug_filter        (opt.enable_debug & DBG_FILTER)
+#define debug_filter_extra  (opt.enable_debug & DBG_FILTER_EXTRA)
 
 /* This variable indicates whether the assuan engine is used.  */
 static int use_assuan;
@@ -104,7 +105,7 @@ static void
 take_in_lock (engine_filter_t filter, const char *func)
 {
   EnterCriticalSection (&filter->in.lock);
-  if (debug_filter > 1)
+  if (debug_filter_extra)
     log_debug ("%s:%s: in.lock taken\n", SRCNAME, func);
 }
 
@@ -112,7 +113,7 @@ static void
 release_in_lock (engine_filter_t filter, const char *func)
 {
   LeaveCriticalSection (&filter->in.lock);
-  if (debug_filter > 1)
+  if (debug_filter_extra)
     log_debug ("%s:%s: in.lock released\n", SRCNAME, func);
 }
 
@@ -120,7 +121,7 @@ static void
 take_out_lock (engine_filter_t filter, const char *func)
 {
   EnterCriticalSection (&filter->out.lock);
-  if (debug_filter > 1)
+  if (debug_filter_extra)
     log_debug ("%s:%s: out.lock taken\n", SRCNAME, func);
 }
 
@@ -128,7 +129,7 @@ static void
 release_out_lock (engine_filter_t filter, const char *func)
 {
   LeaveCriticalSection (&filter->out.lock);
-  if (debug_filter > 1)
+  if (debug_filter_extra)
     log_debug ("%s:%s: out.lock released\n", SRCNAME, func);
 }
 
@@ -224,7 +225,7 @@ filter_gpgme_read_cb (void *handle, void *buffer, size_t size)
       if (filter->in.nonblock)
         {
           errno = EAGAIN;
-          if (debug_filter > 1)
+          if (debug_filter_extra)
             log_debug ("%s:%s: leave; result=EAGAIN\n", SRCNAME, __func__);
           SwitchToThread ();
           return -1;
@@ -281,7 +282,7 @@ filter_gpgme_write_cb (void *handle, const void *buffer, size_t size)
       if (filter->out.nonblock)
         {
           errno = EAGAIN;
-          if (debug_filter > 1)
+          if (debug_filter_extra)
             log_debug ("%s:%s: leave; result=EAGAIN\n", SRCNAME, __func__);
           return -1;
         }
@@ -585,7 +586,7 @@ engine_wait (engine_filter_t filter)
           filter->out.length -= nbytes;
           if (filter->out.length)
             {
-              if (debug_filter > 1)
+              if (debug_filter_extra)
                 log_debug ("%s:%s: still %d pending bytes for outfnc\n",
                            SRCNAME, __func__, filter->out.length);
               more = 1;
@@ -662,7 +663,7 @@ engine_cancel (engine_filter_t filter)
    or engine_cancel.  On return the protocol to be used is stored at
    R_PROTOCOL. */
 int
-engine_encrypt_start (engine_filter_t filter,
+engine_encrypt_start (engine_filter_t filter, HWND hwnd,
                       protocol_t req_protocol, char **recipients,
                       protocol_t *r_protocol)
 {
@@ -673,13 +674,13 @@ engine_encrypt_start (engine_filter_t filter,
   if (filter->use_assuan)
     {
       err = op_assuan_encrypt (req_protocol, filter->indata, filter->outdata,
-                               filter, NULL, recipients, &used_protocol);
+                               filter, hwnd, recipients, &used_protocol);
       if (!err)
         *r_protocol = used_protocol;
     }
   else
     err = op_gpgme_encrypt (req_protocol, filter->indata, filter->outdata,
-                            filter, NULL, recipients);
+                            filter, hwnd, recipients);
       
   return err;
 }
@@ -692,16 +693,16 @@ engine_encrypt_start (engine_filter_t filter,
    the filter object lasts until the final engine_wait or
    engine_cancel.  */
 int
-engine_sign_start (engine_filter_t filter, protocol_t protocol)
+engine_sign_start (engine_filter_t filter, HWND hwnd, protocol_t protocol)
 {
   gpg_error_t err;
 
   if (filter->use_assuan)
     err = op_assuan_sign (protocol, filter->indata, filter->outdata,
-                         filter, NULL);
+                         filter, hwnd);
   else
     err = op_gpgme_sign (protocol, filter->indata, filter->outdata,
-                         filter, NULL);
+                         filter, hwnd);
   return err;
 }
 
@@ -713,17 +714,17 @@ engine_sign_start (engine_filter_t filter, protocol_t protocol)
    the filter object lasts until the final engine_wait or
    engine_cancel.  */
 int
-engine_decrypt_start (engine_filter_t filter, protocol_t protocol,
+engine_decrypt_start (engine_filter_t filter, HWND hwnd, protocol_t protocol,
                       int with_verify)
 {
   gpg_error_t err;
 
   if (filter->use_assuan)
     err = op_assuan_decrypt (protocol, filter->indata, filter->outdata,
-                            filter, NULL, with_verify);
+                            filter, hwnd, with_verify);
   else
     err = op_gpgme_decrypt (protocol, filter->indata, filter->outdata,
-                            filter, NULL, with_verify);
+                            filter, hwnd, with_verify);
   return err;
 }
 
@@ -736,7 +737,7 @@ engine_decrypt_start (engine_filter_t filter, protocol_t protocol,
    used through this function.  However, the lifetime of the filter
    object lasts until the final engine_wait or engine_cancel.  */
 int
-engine_verify_start (engine_filter_t filter, const char *signature,
+engine_verify_start (engine_filter_t filter, HWND hwnd, const char *signature,
                      protocol_t protocol)
 {
   gpg_error_t err;
@@ -749,19 +750,19 @@ engine_verify_start (engine_filter_t filter, const char *signature,
     }
 
   if (filter->use_assuan)
-    err = op_assuan_verify (protocol, filter->indata, signature, filter, NULL);
+    err = op_assuan_verify (protocol, filter->indata, signature, filter, hwnd);
   else
-    err = op_gpgme_verify (protocol, filter->indata, signature, filter, NULL);
+    err = op_gpgme_verify (protocol, filter->indata, signature, filter, hwnd);
   return err;
 }
 
 
 /* Fire up the key manager.  Returns 0 on success.  */
 int
-engine_start_keymanager (void)
+engine_start_keymanager (HWND hwnd)
 {
   if (use_assuan)
-    return op_assuan_start_keymanager (NULL);
+    return op_assuan_start_keymanager (hwnd);
   else
     return gpg_error (GPG_ERR_NOT_SUPPORTED);
 }
index 93e85b3..a831206 100644 (file)
@@ -62,16 +62,16 @@ int engine_create_filter (engine_filter_t *r_filter,
 int engine_wait (engine_filter_t filter);
 void engine_cancel (engine_filter_t filter);
 
-int engine_encrypt_start (engine_filter_t filter, 
+int engine_encrypt_start (engine_filter_t filter, HWND hwnd,
                           protocol_t req_protocol, char **recipients,
                           protocol_t *r_protocol);
-int engine_sign_start (engine_filter_t filter, protocol_t protocol);
-int engine_decrypt_start (engine_filter_t filter, protocol_t protocol,
-                          int with_verify);
-int engine_verify_start (engine_filter_t filter, const char *signature,
-                         protocol_t protocol);
+int engine_sign_start (engine_filter_t filter, HWND hwnd, protocol_t protocol);
+int engine_decrypt_start (engine_filter_t filter, HWND hwnd,
+                          protocol_t protocol, int with_verify);
+int engine_verify_start (engine_filter_t filter, HWND hwnd,
+                         const char *signature, protocol_t protocol);
 
-int engine_start_keymanager (void);
+int engine_start_keymanager (HWND hwnd);
 
 
 
index 54adbed..119069c 100644 (file)
@@ -1,5 +1,5 @@
 /* ext-commands.cpp - Subclass impl of IExchExtCommands
- *     Copyright (C) 2004, 2005, 2007 g10 Code GmbH
+ *     Copyright (C) 2004, 2005, 2007, 2008 g10 Code GmbH
  * 
  * This file is part of GpgOL.
  * 
@@ -586,7 +586,7 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
       hr = eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
       if (SUCCEEDED (hr))
         {
-          message_decrypt (message, m_pExchExt->getMsgtype (eecb), 1);
+          message_decrypt (message, m_pExchExt->getMsgtype (eecb), 1, hwnd);
           message_display_handler (eecb, hwnd);
        }
       ul_release (message, __func__, __LINE__);
@@ -599,7 +599,7 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
       hr = eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
       if (SUCCEEDED (hr))
         {
-          message_verify (message, m_pExchExt->getMsgtype (eecb), 1);
+          message_verify (message, m_pExchExt->getMsgtype (eecb), 1, hwnd);
        }
       else
         log_debug_w32 (hr, "%s:%s: CmdCheckSig failed", SRCNAME, __func__);
@@ -666,7 +666,7 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
            && m_lContext == EECONTEXT_VIEWER)
     {
       log_debug ("%s:%s: command KeyManager called\n", SRCNAME, __func__);
-      if (engine_start_keymanager ())
+      if (engine_start_keymanager (hwnd))
         if (start_key_manager ())
           MessageBox (NULL, _("Could not start certificate manager"),
                       _("GpgOL"), MB_ICONERROR|MB_OK);
index 5eaa5c4..7e83061 100644 (file)
@@ -100,12 +100,13 @@ GpgolItemEvents::OnOpen (LPEXCHEXTCALLBACK eecb)
 {
   LPMDB mdb = NULL;
   LPMESSAGE message = NULL;
+  HWND hwnd = NULL;
   
   log_debug ("%s:%s: received\n", SRCNAME, __func__);
 
   m_wasencrypted = false;
   eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
-  if (message_incoming_handler (message, m_pExchExt->getMsgtype (eecb)))
+  if (message_incoming_handler (message, m_pExchExt->getMsgtype (eecb), hwnd))
     m_processed = TRUE;
   ul_release (message);
   ul_release (mdb);
index 63765f5..80c1925 100644 (file)
@@ -509,7 +509,7 @@ read_options (void)
   char *val = NULL;
  
   load_extension_value ("enableDebug", &val);
-  opt.enable_debug = val == NULL || *val != '1' ? 0 : 1;
+  opt.enable_debug = val? atoi (val) : 0;
   xfree (val); val = NULL;
 
   load_extension_value ("enableSmime", &val);
index cd5028a..69f7d10 100644 (file)
@@ -1,5 +1,5 @@
 /* message-events.cpp - Subclass impl of IExchExtMessageEvents
- *     Copyright (C) 2004, 2005, 2007 g10 Code GmbH
+ *     Copyright (C) 2004, 2005, 2007, 2008 g10 Code GmbH
  * 
  * This file is part of GpgOL.
  * 
@@ -111,8 +111,13 @@ GpgolMessageEvents::OnRead (LPEXCHEXTCALLBACK eecb)
   m_wasencrypted = false;
   if (1 /*opt.preview_decrypt*/)
     {
+      HWND hwnd = NULL;
+
+      if (FAILED (eecb->GetWindow (&hwnd)))
+        hwnd = NULL;
       eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
-      if (message_incoming_handler (message, m_pExchExt->getMsgtype (eecb)))
+      if (message_incoming_handler (message, m_pExchExt->getMsgtype (eecb),
+                                    hwnd))
         m_processed = true;
       ul_release (message, __func__, __LINE__);
       ul_release (mdb, __func__, __LINE__);
index a6eae5d..b5acce5 100644 (file)
@@ -53,7 +53,7 @@ ul_release (LPVOID punk, const char *func)
 /* A helper function used by OnRead and OnOpen to dispatch the
    message.  Returns true if the message has been processed.  */
 bool
-message_incoming_handler (LPMESSAGE message, msgtype_t msgtype)
+message_incoming_handler (LPMESSAGE message,msgtype_t msgtype, HWND hwnd)
 {
   bool retval = false;
 
@@ -89,36 +89,36 @@ message_incoming_handler (LPMESSAGE message, msgtype_t msgtype)
       log_debug ("%s:%s: processing multipart signed message\n", 
                  SRCNAME, __func__);
       retval = true;
-      message_verify (message, msgtype, 0);
+      message_verify (message, msgtype, 0, hwnd);
       break;
     case MSGTYPE_GPGOL_MULTIPART_ENCRYPTED:
       log_debug ("%s:%s: processing multipart encrypted message\n",
                  SRCNAME, __func__);
       retval = true;
-      message_decrypt (message, msgtype, 0);
+      message_decrypt (message, msgtype, 0, hwnd);
       break;
     case MSGTYPE_GPGOL_OPAQUE_SIGNED:
       log_debug ("%s:%s: processing opaque signed message\n", 
                  SRCNAME, __func__);
       retval = true;
-      message_verify (message, msgtype, 0);
+      message_verify (message, msgtype, 0, hwnd);
       break;
     case MSGTYPE_GPGOL_CLEAR_SIGNED:
       log_debug ("%s:%s: processing clear signed pgp message\n", 
                  SRCNAME, __func__);
       retval = true;
-      message_verify (message, msgtype, 0);
+      message_verify (message, msgtype, 0, hwnd);
       break;
     case MSGTYPE_GPGOL_OPAQUE_ENCRYPTED:
       log_debug ("%s:%s: processing opaque encrypted message\n",
                  SRCNAME, __func__);
       retval = true;
-      message_decrypt (message, msgtype, 0);
+      message_decrypt (message, msgtype, 0, hwnd);
       break;
     case MSGTYPE_GPGOL_PGP_MESSAGE:
       log_debug ("%s:%s: processing pgp message\n", SRCNAME, __func__);
       retval = true;
-      message_decrypt (message, msgtype, 0);
+      message_decrypt (message, msgtype, 0, hwnd);
       break;
     }
 
@@ -441,7 +441,7 @@ pgp_mime_from_clearsigned (LPSTREAM input, size_t *outputlen)
    what to do.  With FORCE set the verification is done regardlessless
    of a cached signature result. */
 int
-message_verify (LPMESSAGE message, msgtype_t msgtype, int force)
+message_verify (LPMESSAGE message, msgtype_t msgtype, int force, HWND hwnd)
 {
   mapi_attach_item_t *table = NULL;
   int moss_idx = -1;
@@ -533,7 +533,7 @@ message_verify (LPMESSAGE message, msgtype_t msgtype, int force)
         }
     }
 
-  err = mime_verify (protocol, inbuf, inbuflen, message, 0, 0);
+  err = mime_verify (protocol, inbuf, inbuflen, message, hwnd, 0);
   log_debug ("mime_verify returned %d", err);
   if (err)
     {
@@ -562,7 +562,7 @@ message_verify (LPMESSAGE message, msgtype_t msgtype, int force)
    function can decide what to do.  With FORCE set the decryption is
    done regardless whether it has already been done.  */
 int
-message_decrypt (LPMESSAGE message, msgtype_t msgtype, int force)
+message_decrypt (LPMESSAGE message, msgtype_t msgtype, int force, HWND hwnd)
 {
   mapi_attach_item_t *table = NULL;
   int part2_idx;
@@ -710,7 +710,7 @@ message_decrypt (LPMESSAGE message, msgtype_t msgtype, int force)
         goto leave; /* Problem getting the attachment.  */
     }
 
-  err = mime_decrypt (protocol, cipherstream, message, 0, 0);
+  err = mime_decrypt (protocol, cipherstream, message, hwnd, 0);
   log_debug ("mime_decrypt returned %d (%s)", err, gpg_strerror (err));
   if (err)
     {
@@ -842,9 +842,9 @@ sign_encrypt (LPMESSAGE message, protocol_t protocol, HWND hwnd, int signflag)
   else
     {
       if (signflag)
-        err = mime_sign_encrypt (message, protocol, recipients);
+        err = mime_sign_encrypt (message, hwnd, protocol, recipients);
       else
-        err = mime_encrypt (message, protocol, recipients);
+        err = mime_encrypt (message, hwnd, protocol, recipients);
       if (err)
         {
           char buf[200];
@@ -865,7 +865,7 @@ message_sign (LPMESSAGE message, protocol_t protocol, HWND hwnd)
 {
   gpg_error_t err;
 
-  err = mime_sign (message, protocol);
+  err = mime_sign (message, hwnd, protocol);
   if (err)
     {
       char buf[200];
index 28426c9..a4f482d 100644 (file)
 #define MESSAGE_H
 
 
-bool message_incoming_handler (LPMESSAGE message, msgtype_t msgtype);
+bool message_incoming_handler (LPMESSAGE message, msgtype_t msgtype,
+                               HWND hwnd);
 bool message_display_handler (LPEXCHEXTCALLBACK eecb, HWND hwnd);
 void message_wipe_body_cruft (LPEXCHEXTCALLBACK eecb);
 void message_show_info (LPMESSAGE message, HWND hwnd);
 
 
-int message_verify (LPMESSAGE message, msgtype_t msgtype, int force);
-int message_decrypt (LPMESSAGE message, msgtype_t msgtype, int force);
-
+int message_verify (LPMESSAGE message, msgtype_t msgtype, int force,
+                    HWND hwnd);
+int message_decrypt (LPMESSAGE message, msgtype_t msgtype, int force, 
+                     HWND hwnd);
 int message_sign (LPMESSAGE message, protocol_t protocol, HWND hwnd);
 int message_encrypt (LPMESSAGE message, protocol_t protocol, HWND hwnd);
 int message_sign_encrypt (LPMESSAGE message, protocol_t protocol, HWND hwnd);
index def5048..44afcec 100644 (file)
@@ -1135,7 +1135,7 @@ create_top_signing_header (char *buffer, size_t buflen, protocol_t protocol,
    TMPSINK is set not atcghment will be created but the output
    written to that sink.  */
 static int 
-do_mime_sign (LPMESSAGE message, protocol_t protocol, 
+do_mime_sign (LPMESSAGE message, HWND hwnd, protocol_t protocol, 
               mapi_attach_item_t **r_att_table, sink_t tmpsink)
 {
   int result = -1;
@@ -1179,7 +1179,7 @@ do_mime_sign (LPMESSAGE message, protocol_t protocol,
   /* Prepare the signing.  */
   if (engine_create_filter (&filter, collect_signature, &sigbuffer))
     goto failure;
-  if (engine_sign_start (filter, protocol))
+  if (engine_sign_start (filter, hwnd, protocol))
     goto failure;
 
   /* Get the attachment info and the body.  */
@@ -1358,12 +1358,12 @@ do_mime_sign (LPMESSAGE message, protocol_t protocol,
    keep the original message intact but there is no 100% guarantee for
    it. */
 int 
-mime_sign (LPMESSAGE message, protocol_t protocol)
+mime_sign (LPMESSAGE message, HWND hwnd, protocol_t protocol)
 {
   int result = -1;
   mapi_attach_item_t *att_table;
 
-  if (!do_mime_sign (message, protocol, &att_table, 0))
+  if (!do_mime_sign (message, hwnd, protocol, &att_table, 0))
     {
       if (!finalize_message (message, att_table))
         result = 0;
@@ -1544,7 +1544,8 @@ create_top_encryption_header (sink_t sink, protocol_t protocol, char *boundary)
 
 /* Encrypt the MESSAGE.  */
 int 
-mime_encrypt (LPMESSAGE message, protocol_t protocol, char **recipients)
+mime_encrypt (LPMESSAGE message, HWND hwnd, 
+              protocol_t protocol, char **recipients)
 {
   int result = -1;
   int rc;
@@ -1572,7 +1573,7 @@ mime_encrypt (LPMESSAGE message, protocol_t protocol, char **recipients)
      will fail early. */
   if (engine_create_filter (&filter, write_buffer_for_cb, sink))
     goto failure;
-  if (engine_encrypt_start (filter, protocol, recipients, &protocol))
+  if (engine_encrypt_start (filter, hwnd, protocol, recipients, &protocol))
     goto failure;
 
   protocol = check_protocol (protocol);
@@ -1666,7 +1667,8 @@ mime_encrypt (LPMESSAGE message, protocol_t protocol, char **recipients)
 \f
 /* Sign and Encrypt the MESSAGE.  */
 int 
-mime_sign_encrypt (LPMESSAGE message, protocol_t protocol, char **recipients)
+mime_sign_encrypt (LPMESSAGE message, HWND hwnd, 
+                   protocol_t protocol, char **recipients)
 {
   int result = -1;
   int rc = 0;
@@ -1712,7 +1714,8 @@ mime_sign_encrypt (LPMESSAGE message, protocol_t protocol, char **recipients)
      will fail early. */
   if (engine_create_filter (&filter, write_buffer_for_cb, sink))
     goto failure;
-  if ((rc=engine_encrypt_start (filter, protocol, recipients, &protocol)))
+  if ((rc=engine_encrypt_start (filter, hwnd, 
+                                protocol, recipients, &protocol)))
     goto failure;
 
   protocol = check_protocol (protocol);
@@ -1724,7 +1727,7 @@ mime_sign_encrypt (LPMESSAGE message, protocol_t protocol, char **recipients)
      encryption in streaming mode while running the encryption because
      we need to fix up that ugly micalg parameter after having created
      the signature.  */
-  if (do_mime_sign (message, protocol, &att_table, tmpsink))
+  if (do_mime_sign (message, hwnd, protocol, &att_table, tmpsink))
     goto failure;
 
   /* Write the top header.  */
index 28b69fd..3c79e5a 100644 (file)
@@ -1,5 +1,5 @@
 /* mimemaker.h - Construct MIME from MAPI
- *     Copyright (C) 2007 g10 Code GmbH
+ *     Copyright (C) 2007, 2008 g10 Code GmbH
  *
  * This file is part of GpgOL.
  * 
@@ -26,10 +26,11 @@ extern "C" {
 #endif
 #endif
 
-int mime_sign (LPMESSAGE message, protocol_t protocol);
-int mime_encrypt (LPMESSAGE message, protocol_t protocol, char **recipients);
-int mime_sign_encrypt (LPMESSAGE message, protocol_t protocol, 
-                       char **recipients);
+int mime_sign (LPMESSAGE message, HWND hwnd, protocol_t protocol);
+int mime_encrypt (LPMESSAGE message, HWND hwnd,
+                  protocol_t protocol, char **recipients);
+int mime_sign_encrypt (LPMESSAGE message, HWND hwnd,
+                       protocol_t protocol, char **recipients);
 
 
 #ifdef __cplusplus
index 1c62d44..c03fc0f 100644 (file)
@@ -1,5 +1,5 @@
 /* mimeparser.c - Parse multipart MIME message
- *     Copyright (C) 2005, 2007 g10 Code GmbH
+ *     Copyright (C) 2005, 2007, 2008 g10 Code GmbH
  *
  * This file is part of GpgOL.
  * 
@@ -1058,7 +1058,7 @@ mime_verify (protocol_t protocol, const char *message, size_t messagelen,
       
       if ((err=engine_create_filter (&filter, NULL, NULL)))
         goto leave;
-      if ((err=engine_verify_start (filter, signature, ctx->protocol)))
+      if ((err=engine_verify_start (filter, hwnd, signature, ctx->protocol)))
         goto leave;
 
       /* Filter the data.  */
@@ -1157,7 +1157,7 @@ mime_decrypt (protocol_t protocol, LPSTREAM instream, LPMESSAGE mapi_message,
 /*       title = native_to_utf8 (_("[Encrypted PGP/MIME message]")); */
   if ((err=engine_create_filter (&filter, plaintext_handler, ctx)))
     goto leave;
-  if ((err=engine_decrypt_start (filter, protocol, !preview_mode)))
+  if ((err=engine_decrypt_start (filter, hwnd, protocol, !preview_mode)))
     goto leave;