Added translation framework and translated a few strings.
[gpgol.git] / src / gpgmsg.cpp
index 4b79752..b4edf31 100644 (file)
@@ -43,7 +43,7 @@ static const char oid_mimetag[] =
 
 
 #define TRACEPOINT() do { log_debug ("%s:%s:%d: tracepoint\n", \
-                                       __FILE__, __func__, __LINE__); \
+                                       SRCNAME, __func__, __LINE__); \
                         } while (0)
 
 /* Constants to describe the PGP armor types. */
@@ -64,6 +64,8 @@ struct attach_info
 {
   int end_of_table;  /* True if this is the last plus one entry of the
                         table. */
+  int invalid;       /* Invalid table entry - usally ignored. */
+   
   int is_encrypted;  /* This is an encrypted attchment. */
   int is_signed;     /* This is a signed attachment. */
   unsigned int sig_pos; /* For signed attachments the index of the
@@ -167,19 +169,19 @@ public:
 
   openpgp_t getMessageType (void);
   bool hasAttachments (void);
-  const char *getOrigText (void);
+  const char *getOrigText (bool want_html);
   const char *GpgMsgImpl::getDisplayText (void);
   const char *getPlainText (void);
 
   int decrypt (HWND hwnd);
   int sign (HWND hwnd);
-  int encrypt (HWND hwnd)
+  int encrypt (HWND hwnd, bool want_html)
   {
-    return encrypt_and_sign (hwnd, false);
+    return encrypt_and_sign (hwnd, want_html, false);
   }
-  int signEncrypt (HWND hwnd)
+  int signEncrypt (HWND hwnd, bool want_html)
   {
-    return encrypt_and_sign (hwnd, true);
+    return encrypt_and_sign (hwnd, want_html, true);
   }
   int attachPublicKey (const char *keyid);
 
@@ -216,11 +218,11 @@ private:
     LPSRowSet   rows;     /* The retrieved set of rows from the table. */
   } attach;
   
-  void loadBody (void);
+  void loadBody (bool want_html);
   bool isPgpmimeVersionPart (int pos);
   void writeAttestation (void);
   attach_info_t gatherAttachmentInfo (void);
-  int encrypt_and_sign (HWND hwnd, bool sign);
+  int encrypt_and_sign (HWND hwnd, bool want_html, bool sign);
 };
 
 
@@ -249,17 +251,15 @@ free_key_array (gpgme_key_t *keys)
     }
 }
 
-/* Release an array of strings with recipient names. */
+/* Release an array of strings. */
 static void
-free_recipient_array (char **recipients)
+free_string_array (char **strings)
 {
-  int i;
-
-  if (recipients)
+  if (strings)
     {
-      for (i=0; recipients[i]; i++) 
-       xfree (recipients[i]);  
-      xfree (recipients);
+      for (int i=0; strings[i]; i++) 
+       xfree (strings[i]);     
+      xfree (strings);
     }
 }
 
@@ -280,13 +280,23 @@ release_attach_info (attach_info_t table)
 }
 
 
-/* Return the number of recipients in the array RECIPIENTS. */
-static int 
-count_recipients (char **recipients)
+/* Return the number of strings in the array STRINGS. */
+static size_t
+count_strings (char **strings)
 {
-  int i;
+  size_t i;
+  
+  for (i=0; strings[i]; i++)
+    ;
+  return i;
+}
+
+static size_t
+count_keys (gpgme_key_t *keys)
+{
+  size_t i;
   
-  for (i=0; recipients[i] != NULL; i++)
+  for (i=0; keys[i]; i++)
     ;
   return i;
 }
@@ -356,7 +366,7 @@ text_from_attach_info (attach_info_t table, const char *format,
 /* Load the body and make it available as an UTF8 string in the
    instance variable BODY.  */
 void
-GpgMsgImpl::loadBody (void)
+GpgMsgImpl::loadBody (bool want_html)
 {
   HRESULT hr;
   LPSPropValue lpspvFEID = NULL;
@@ -368,7 +378,8 @@ GpgMsgImpl::loadBody (void)
   if (body || !message)
     return;
 
-  hr = HrGetOneProp ((LPMAPIPROP)message, PR_BODY, &lpspvFEID);
+  hr = HrGetOneProp ((LPMAPIPROP)message,
+                     want_html? PR_BODY_HTML : PR_BODY, &lpspvFEID);
   if (SUCCEEDED (hr))
     { /* Message is small enough to be retrieved this way. */
       switch ( PROP_TYPE (lpspvFEID->ulPropTag) )
@@ -392,19 +403,28 @@ GpgMsgImpl::loadBody (void)
     }
   else /* Message is large; Use a stream to read it. */
     {
-      hr = message->OpenProperty (PR_BODY, &IID_IStream,
-                                  0, 0, (LPUNKNOWN*)&stream);
+      hr = message->OpenProperty (want_html? PR_BODY_HTML : PR_BODY,
+                                  &IID_IStream, 0, 0, (LPUNKNOWN*)&stream);
       if ( hr != S_OK )
         {
           log_debug ("%s:%s: OpenProperty failed: hr=%#lx",
-                     __FILE__, __func__, hr);
+                     SRCNAME, __func__, hr);
+          if (want_html)
+            {
+              log_debug ("%s:%s: trying to read it from the OOM\n",
+                         SRCNAME, __func__);
+              body = get_outlook_property (exchange_cb, "HTMLBody");
+              if (body)
+                goto ready;
+            }
+          
           return;
         }
       
       hr = stream->Stat (&statInfo, STATFLAG_NONAME);
       if ( hr != S_OK )
         {
-          log_debug ("%s:%s: Stat failed: hr=%#lx", __FILE__, __func__, hr);
+          log_debug ("%s:%s: Stat failed: hr=%#lx", SRCNAME, __func__, hr);
           stream->Release ();
           return;
         }
@@ -417,7 +437,7 @@ GpgMsgImpl::loadBody (void)
       hr = stream->Read (body, (size_t)statInfo.cbSize.QuadPart, &nread);
       if ( hr != S_OK )
         {
-          log_debug ("%s:%s: Read failed: hr=%#lx", __FILE__, __func__, hr);
+          log_debug ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr);
           xfree (body);
           body = NULL;
           stream->Release ();
@@ -427,7 +447,7 @@ GpgMsgImpl::loadBody (void)
       body[nread+1] = 0;
       if (nread != statInfo.cbSize.QuadPart)
         {
-          log_debug ("%s:%s: not enough bytes returned\n", __FILE__, __func__);
+          log_debug ("%s:%s: not enough bytes returned\n", SRCNAME, __func__);
           xfree (body);
           body = NULL;
           stream->Release ();
@@ -449,9 +469,10 @@ GpgMsgImpl::loadBody (void)
       }
     }
 
+ ready:
   if (body)
     log_debug ("%s:%s: loaded body `%s' at %p\n",
-               __FILE__, __func__, body, body);
+               SRCNAME, __func__, body, body);
   
 
 //   prop.ulPropTag = PR_ACCESS;
@@ -459,7 +480,7 @@ GpgMsgImpl::loadBody (void)
 //   hr = HrSetOneProp (message, &prop);
 //   if (FAILED (hr))
 //     log_debug ("%s:%s: updating message access to 0x%08lx failed: hr=%#lx",
-//                    __FILE__, __func__, prop.Value.l, hr);
+//                    SRCNAME, __func__, prop.Value.l, hr);
 }
 
 
@@ -477,7 +498,7 @@ get_subject (LPMESSAGE obj)
   if (FAILED (hr))
     {
       log_error ("%s:%s: error getting the subject: hr=%#lx",
-                 __FILE__, __func__, hr);
+                 SRCNAME, __func__, hr);
       return NULL; 
     }
   switch ( PROP_TYPE (propval->ulPropTag) )
@@ -485,7 +506,7 @@ get_subject (LPMESSAGE obj)
     case PT_UNICODE:
       name = wchar_to_utf8 (propval->Value.lpszW);
       if (!name)
-        log_debug ("%s:%s: error converting to utf8\n", __FILE__, __func__);
+        log_debug ("%s:%s: error converting to utf8\n", SRCNAME, __func__);
       break;
       
     case PT_STRING8:
@@ -494,7 +515,7 @@ get_subject (LPMESSAGE obj)
       
     default:
       log_debug ("%s:%s: proptag=%#lx not supported\n",
-                 __FILE__, __func__, propval->ulPropTag);
+                 SRCNAME, __func__, propval->ulPropTag);
       name = NULL;
       break;
     }
@@ -532,7 +553,7 @@ set_subject (LPMESSAGE obj, const char *string)
   if (hr != S_OK)
     {
       log_debug ("%s:%s: HrSetOneProp failed: hr=%#lx\n",
-                 __FILE__, __func__, hr); 
+                 SRCNAME, __func__, hr); 
       return gpg_error (GPG_ERR_GENERAL);
     }
   return 0;
@@ -546,7 +567,7 @@ GpgMsgImpl::getMessageType (void)
 {
   const char *s;
   
-  loadBody ();
+  loadBody (false);
   
   if (!body || !(s = strstr (body, "BEGIN PGP ")))
     return OPENPGP_NONE;
@@ -570,9 +591,9 @@ GpgMsgImpl::getMessageType (void)
 /* Return the body text as received or composed.  This is guaranteed
    to never return NULL.  */
 const char *
-GpgMsgImpl::getOrigText ()
+GpgMsgImpl::getOrigText (bool want_html)
 {
-  loadBody ();
+  loadBody (want_html);
   
   return body? body : "";
 }
@@ -583,7 +604,7 @@ GpgMsgImpl::getOrigText ()
 const char *
 GpgMsgImpl::getDisplayText (void)
 {
-  loadBody ();
+  loadBody (false);
 
   if (body_plain)
     return body_plain;
@@ -617,7 +638,7 @@ GpgMsgImpl::getRecipients ()
   if (FAILED (hr)) 
     {
       log_debug_w32 (-1, "%s:%s: GetRecipientTable failed",
-                     __FILE__, __func__);
+                     SRCNAME, __func__);
       return NULL;
     }
 
@@ -625,7 +646,7 @@ GpgMsgImpl::getRecipients ()
                        NULL, NULL, 0L, &lpRecipientRows);
   if (FAILED (hr)) 
     {
-      log_debug_w32 (-1, "%s:%s: GHrQueryAllRows failed", __FILE__, __func__);
+      log_debug_w32 (-1, "%s:%s: GHrQueryAllRows failed", SRCNAME, __func__);
       if (lpRecipientTable)
         lpRecipientTable->Release();
       return NULL;
@@ -649,7 +670,7 @@ GpgMsgImpl::getRecipients ()
             j++;
           else
             log_debug ("%s:%s: error converting recipient to utf8\n",
-                       __FILE__, __func__);
+                       SRCNAME, __func__);
           break;
       
         case PT_STRING8: /* Assume Ascii. */
@@ -658,7 +679,7 @@ GpgMsgImpl::getRecipients ()
           
         default:
           log_debug ("%s:%s: proptag=0x%08lx not supported\n",
-                     __FILE__, __func__, row->ulPropTag);
+                     SRCNAME, __func__, row->ulPropTag);
           break;
         }
     }
@@ -670,9 +691,9 @@ GpgMsgImpl::getRecipients ()
     FreeProws(lpRecipientRows);        
   
   log_debug ("%s:%s: got %d recipients:\n",
-             __FILE__, __func__, j);
+             SRCNAME, __func__, j);
   for (i=0; rset[i]; i++)
-    log_debug ("%s:%s: \t`%s'\n", __FILE__, __func__, rset[i]);
+    log_debug ("%s:%s: \t`%s'\n", SRCNAME, __func__, rset[i]);
 
   return rset;
 }
@@ -698,7 +719,7 @@ GpgMsgImpl::writeAttestation (void)
   if (hr != S_OK)
     {
       log_error ("%s:%s: can't create attachment: hr=%#lx\n",
-                 __FILE__, __func__, hr); 
+                 SRCNAME, __func__, hr); 
       goto leave;
     }
           
@@ -708,7 +729,7 @@ GpgMsgImpl::writeAttestation (void)
   if (hr != S_OK)
     {
       log_error ("%s:%s: can't set attach method: hr=%#lx\n",
-                 __FILE__, __func__, hr); 
+                 SRCNAME, __func__, hr); 
       goto leave;
     }
   
@@ -721,7 +742,7 @@ GpgMsgImpl::writeAttestation (void)
   if (hr != S_OK)
     {
       log_error ("%s:%s: can't set attach filename: hr=%#lx\n",
-                 __FILE__, __func__, hr); 
+                 SRCNAME, __func__, hr); 
       goto leave;
     }
 
@@ -732,7 +753,7 @@ GpgMsgImpl::writeAttestation (void)
   if (hr != S_OK)
     {
       log_error ("%s:%s: can't set attach filename: hr=%#lx\n",
-                 __FILE__, __func__, hr); 
+                 SRCNAME, __func__, hr); 
       goto leave;
     }
 
@@ -743,7 +764,7 @@ GpgMsgImpl::writeAttestation (void)
   if (hr != S_OK)
     {
       log_error ("%s:%s: can't set attach tag: hr=%#lx\n",
-                 __FILE__, __func__, hr); 
+                 SRCNAME, __func__, hr); 
       goto leave;
     }
 
@@ -753,7 +774,7 @@ GpgMsgImpl::writeAttestation (void)
   if (hr != S_OK)
     {
       log_error ("%s:%s: can't set attach mime tag: hr=%#lx\n",
-                 __FILE__, __func__, hr); 
+                 SRCNAME, __func__, hr); 
       goto leave;
     }
 
@@ -762,7 +783,7 @@ GpgMsgImpl::writeAttestation (void)
   if (FAILED (hr)) 
     {
       log_error ("%s:%s: can't create output stream: hr=%#lx\n",
-                 __FILE__, __func__, hr); 
+                 SRCNAME, __func__, hr); 
       goto leave;
     }
   
@@ -771,7 +792,7 @@ GpgMsgImpl::writeAttestation (void)
       || !(buffer = gpgme_data_release_and_get_mem (attestation, NULL)))
     {
       attestation = NULL;
-      log_error ("%s:%s: gpgme_data_write failed\n", __FILE__, __func__); 
+      log_error ("%s:%s: gpgme_data_write failed\n", SRCNAME, __func__); 
       goto leave;
     }
   attestation = NULL;
@@ -780,8 +801,9 @@ GpgMsgImpl::writeAttestation (void)
   hr = S_OK;
   if (!*buffer)
     {
-      p = _("[No attestation computed (e.g. messages was not signed)");
-      hr = to->Write (p, strlen (p), &nwritten);
+      const char *s = _("[No attestation computed "
+                        "(e.g. messages was not signed)");
+      hr = to->Write (s, strlen (s), &nwritten);
     }
   else
     {
@@ -796,7 +818,7 @@ GpgMsgImpl::writeAttestation (void)
     }
   if (hr != S_OK)
     {
-      log_debug ("%s:%s: Write failed: hr=%#lx", __FILE__, __func__, hr);
+      log_debug ("%s:%s: Write failed: hr=%#lx", SRCNAME, __func__, hr);
       goto leave;
     }
       
@@ -809,14 +831,14 @@ GpgMsgImpl::writeAttestation (void)
   if (hr != S_OK)
     {
       log_error ("%s:%s: SaveChanges(attachment) failed: hr=%#lx\n",
-                 __FILE__, __func__, hr); 
+                 SRCNAME, __func__, hr); 
       goto leave;
     }
   hr = message->SaveChanges (KEEP_OPEN_READWRITE|FORCE_SAVE);
   if (hr != S_OK)
     {
       log_error ("%s:%s: SaveChanges(message) failed: hr=%#lx\n",
-                 __FILE__, __func__, hr); 
+                 SRCNAME, __func__, hr); 
       goto leave;
     }
 
@@ -829,7 +851,7 @@ GpgMsgImpl::writeAttestation (void)
     }
   if (newatt)
     newatt->Release ();
-  xfree (buffer);
+  gpgme_free (buffer);
 }
 
 
@@ -839,7 +861,7 @@ GpgMsgImpl::writeAttestation (void)
 int 
 GpgMsgImpl::decrypt (HWND hwnd)
 {
-  log_debug ("%s:%s: enter\n", __FILE__, __func__);
+  log_debug ("%s:%s: enter\n", SRCNAME, __func__);
   openpgp_t mtype;
   char *plaintext = NULL;
   attach_info_t table = NULL;
@@ -869,7 +891,7 @@ GpgMsgImpl::decrypt (HWND hwnd)
     }
   log_debug ("%s:%s: message has %u attachments with "
              "%u signed and %d encrypted\n",
-             __FILE__, __func__, n_attach, n_signed, n_encrypted);
+             SRCNAME, __func__, n_attach, n_signed, n_encrypted);
   if (mtype == OPENPGP_NONE && !n_encrypted && !n_signed) 
     {
       /* Because we usually work around the OL object model, it can't
@@ -895,15 +917,15 @@ GpgMsgImpl::decrypt (HWND hwnd)
         {
           xfree (body_plain);
           body_plain = xstrdup (s);
-          update_display (hwnd, this, exchange_cb);
+          update_display (hwnd, this, exchange_cb, is_html_body (s));
           msgcache_unref (refhandle);
-          log_debug ("%s:%s: leave (already decrypted)\n", __FILE__, __func__);
+          log_debug ("%s:%s: leave (already decrypted)\n", SRCNAME, __func__);
         }
       else
         {
           MessageBox (hwnd, "No valid OpenPGP data found.",
                       "GPG Decryption", MB_ICONWARNING|MB_OK);
-          log_debug ("%s:%s: leave (no OpenPGP data)\n", __FILE__, __func__);
+          log_debug ("%s:%s: leave (no OpenPGP data)\n", SRCNAME, __func__);
         }
       
       release_attach_info (table);
@@ -918,7 +940,7 @@ GpgMsgImpl::decrypt (HWND hwnd)
       if (attestation)
         gpgme_data_release (attestation);
       log_debug ("%s:%s: we already have an attestation\n",
-                 __FILE__, __func__);
+                 SRCNAME, __func__);
     }
   else if (!attestation && !opt.compat.no_attestation)
     gpgme_data_new (&attestation);
@@ -935,10 +957,10 @@ GpgMsgImpl::decrypt (HWND hwnd)
       if (FAILED (hr))
         {
           log_error ("%s:%s: can't open PGP/MIME attachment 2: hr=%#lx",
-                     __FILE__, __func__, hr);
+                     SRCNAME, __func__, hr);
           MessageBox (hwnd, "Problem decrypting PGP/MIME message",
                       "GPG Decryption", MB_ICONERROR|MB_OK);
-          log_debug ("%s:%s: leave (PGP/MIME problem)\n", __FILE__, __func__);
+          log_debug ("%s:%s: leave (PGP/MIME problem)\n", SRCNAME, __func__);
           release_attach_info (table);
           return gpg_error (GPG_ERR_GENERAL);
         }
@@ -947,10 +969,10 @@ GpgMsgImpl::decrypt (HWND hwnd)
       if (method != ATTACH_BY_VALUE)
         {
           log_error ("%s:%s: unsupported method %d for PGP/MIME attachment 2",
-                     __FILE__, __func__, method);
+                     SRCNAME, __func__, method);
           MessageBox (hwnd, "Problem decrypting PGP/MIME message",
                       "GPG Decryption", MB_ICONERROR|MB_OK);
-          log_debug ("%s:%s: leave (bad PGP/MIME method)\n",__FILE__,__func__);
+          log_debug ("%s:%s: leave (bad PGP/MIME method)\n",SRCNAME,__func__);
           att->Release ();
           release_attach_info (table);
           return gpg_error (GPG_ERR_GENERAL);
@@ -961,16 +983,17 @@ GpgMsgImpl::decrypt (HWND hwnd)
       if (FAILED (hr))
         {
           log_error ("%s:%s: can't open data of attachment 2: hr=%#lx",
-                     __FILE__, __func__, hr);
+                     SRCNAME, __func__, hr);
           MessageBox (hwnd, "Problem decrypting PGP/MIME message",
                       "GPG Decryption", MB_ICONERROR|MB_OK);
-          log_debug ("%s:%s: leave (OpenProperty failed)\n",__FILE__,__func__);
+          log_debug ("%s:%s: leave (OpenProperty failed)\n",SRCNAME,__func__);
           att->Release ();
           release_attach_info (table);
           return gpg_error (GPG_ERR_GENERAL);
         }
 
-      err = pgpmime_decrypt (from, opt.passwd_ttl, &plaintext, attestation);
+      err = pgpmime_decrypt (from, opt.passwd_ttl, &plaintext, attestation,
+                             hwnd);
       
       from->Release ();
       att->Release ();
@@ -978,9 +1001,9 @@ GpgMsgImpl::decrypt (HWND hwnd)
         pgpmime_succeeded = 1;
     }
   else if (mtype == OPENPGP_CLEARSIG)
-    err = op_verify (getOrigText (), NULL, NULL, attestation);
-  else if (*getOrigText())
-    err = op_decrypt (getOrigText (), &plaintext, opt.passwd_ttl,
+    err = op_verify (getOrigText (false), NULL, NULL, attestation);
+  else if (*getOrigText(false))
+    err = op_decrypt (getOrigText (false), &plaintext, opt.passwd_ttl,
                       NULL, attestation);
   else
     err = gpg_error (GPG_ERR_NO_DATA);
@@ -1002,7 +1025,7 @@ GpgMsgImpl::decrypt (HWND hwnd)
       log_debug ("decrypt isHtml=%d\n", is_html);
 
       /* Do we really need to set the body?  update_display below
-         should be sufficient.  The problem witgh this is that we have
+         should be sufficient.  The problem with this is that we did
          changes in the MAPI and OL will later ask whether to save
          them.  The original reason for this kludge was to get the
          plaintext into the reply (by setting the property without
@@ -1011,7 +1034,7 @@ GpgMsgImpl::decrypt (HWND hwnd)
          we will disable it but add a compatibility flag to re-enable
          it. */
       if (opt.compat.old_reply_hack)
-        set_message_body (message, plaintext);
+        set_message_body (message, plaintext, is_html);
 
       xfree (body_plain);
       body_plain = plaintext;
@@ -1025,11 +1048,11 @@ GpgMsgImpl::decrypt (HWND hwnd)
           hr = message->SaveChanges (KEEP_OPEN_READWRITE|FORCE_SAVE);
           if (FAILED (hr))
             log_debug ("%s:%s: SaveChanges failed: hr=%#lx",
-                       __FILE__, __func__, hr);
-          update_display (hwnd, this, exchange_cb);
+                       SRCNAME, __func__, hr);
+          update_display (hwnd, this, exchange_cb, is_html);
           
         }
-      else if (!silent && update_display (hwnd, this, exchange_cb)) 
+      else if (!silent && update_display (hwnd, this, exchange_cb, is_html)) 
         {
           const char s[] = 
             "The message text cannot be displayed.\n"
@@ -1046,7 +1069,7 @@ GpgMsgImpl::decrypt (HWND hwnd)
               hr = message->SaveChanges (KEEP_OPEN_READWRITE|FORCE_SAVE);
               if (FAILED (hr))
                 log_debug ("%s:%s: SaveChanges failed: hr=%#lx",
-                           __FILE__, __func__, hr);
+                           SRCNAME, __func__, hr);
             }
        }
     }
@@ -1105,7 +1128,7 @@ GpgMsgImpl::decrypt (HWND hwnd)
   writeAttestation ();
 
   release_attach_info (table);
-  log_debug ("%s:%s: leave (rc=%d)\n", __FILE__, __func__, err);
+  log_debug ("%s:%s: leave (rc=%d)\n", SRCNAME, __func__, err);
   return err;
 }
 
@@ -1117,25 +1140,27 @@ GpgMsgImpl::decrypt (HWND hwnd)
 int
 GpgMsgImpl::sign (HWND hwnd)
 {
+  HRESULT hr;
   const char *plaintext;
   char *signedtext = NULL;
   int err = 0;
   gpgme_key_t sign_key = NULL;
+  SPropValue prop;
 
-  log_debug ("%s:%s: enter message=%p\n", __FILE__, __func__, message);
+  log_debug ("%s:%s: enter message=%p\n", SRCNAME, __func__, message);
   
   /* We don't sign an empty body - a signature on a zero length string
      is pretty much useless. */
-  if (!*(plaintext = getOrigText ()) && !hasAttachments ()) 
+  if (!*(plaintext = getOrigText (false)) && !hasAttachments ()) 
     {
-      log_debug ("%s:%s: leave (empty)", __FILE__, __func__);
+      log_debug ("%s:%s: leave (empty)", SRCNAME, __func__);
       return 0; 
     }
 
   /* Pop up a dialog box to ask for the signer of the message. */
-  if (signer_dialog_box (&sign_key, NULL) == -1)
+  if (signer_dialog_box (&sign_key, NULL, 0) == -1)
     {
-      log_debug ("%s.%s: leave (dialog failed)\n", __FILE__, __func__);
+      log_debug ("%s.%s: leave (dialog failed)\n", SRCNAME, __func__);
       return gpg_error (GPG_ERR_CANCELED);  
     }
 
@@ -1156,91 +1181,114 @@ GpgMsgImpl::sign (HWND hwnd)
       unsigned int n;
       
       n = getAttachments ();
-      log_debug ("%s:%s: message has %u attachments\n", __FILE__, __func__, n);
+      log_debug ("%s:%s: message has %u attachments\n", SRCNAME, __func__, n);
       for (unsigned int i=0; i < n; i++) 
         signAttachment (hwnd, i, sign_key, opt.passwd_ttl);
       /* FIXME: we should throw an error if signing of any attachment
          failed. */
     }
 
-  set_x_header (message, "Gpgol-Version", PACKAGE_VERSION);
+  set_x_header (message, "GPGOL-VERSION", PACKAGE_VERSION);
 
   /* Now that we successfully processed the attachments, we can save
-     the changes to the body.  For unknown reasons we need to set it
-     to empty first. */
+     the changes to the body.  */
   if (*plaintext)
     {
-      err = set_message_body (message, "");
-      if (!err)
-        err = set_message_body (message, signedtext);
+      err = set_message_body (message, signedtext, 0);
       if (err)
         goto leave;
-    }
 
+      /* In case we don't have attachments, Outlook will really insert
+         the following content type into the header.  We use this to
+         declare that the encrypted content of the message is utf-8
+         encoded. */
+      prop.ulPropTag=PR_CONTENT_TYPE_A;
+      prop.Value.lpszA="text/plain; charset=utf-8"; 
+      hr = HrSetOneProp (message, &prop);
+      if (hr != S_OK)
+        {
+          log_error ("%s:%s: can't set content type: hr=%#lx\n",
+                     SRCNAME, __func__, hr);
+        }
+    }
+  
+  hr = message->SaveChanges (KEEP_OPEN_READWRITE|FORCE_SAVE);
+  if (hr != S_OK)
+    {
+      log_error ("%s:%s: SaveChanges(message) failed: hr=%#lx\n",
+                 SRCNAME, __func__, hr); 
+      err = gpg_error (GPG_ERR_GENERAL);
+      goto leave;
+    }
 
  leave:
   xfree (signedtext);
   gpgme_key_release (sign_key);
-  log_debug ("%s:%s: leave (err=%s)\n", __FILE__, __func__, op_strerror (err));
+  log_debug ("%s:%s: leave (err=%s)\n", SRCNAME, __func__, op_strerror (err));
   return err;
 }
 
 
 \f
-/* Encrypt and optionally sign (if SIGN_FLAG is true) the entire message
-   including all attachments. Returns 0 on success. */
+/* Encrypt and optionally sign (if SIGN_FLAG is true) the entire
+   message including all attachments.  If WANT_HTML is true, the text
+   to encrypt will be taken from the html property. Returns 0 on
+   success. */
 int 
-GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
+GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool want_html, bool sign_flag)
 {
-  log_debug ("%s:%s: enter\n", __FILE__, __func__);
+  log_debug ("%s:%s: enter\n", SRCNAME, __func__);
   HRESULT hr;
   gpgme_key_t *keys = NULL;
   gpgme_key_t sign_key = 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;
+  size_t n_keys, n_unknown, n_recp;
+  SPropValue prop;
     
   
-  if (!*(plaintext = getOrigText ()) && !hasAttachments ()) 
+  if (!*(plaintext = getOrigText (want_html)) && !hasAttachments ()) 
     {
-      log_debug ("%s:%s: leave (empty)", __FILE__, __func__);
+      log_debug ("%s:%s: leave (empty)", SRCNAME, __func__);
       return 0; 
     }
 
   /* Pop up a dialog box to ask for the signer of the message. */
   if (sign_flag)
     {
-      if (signer_dialog_box (&sign_key, NULL) == -1)
+      if (signer_dialog_box (&sign_key, NULL, 1) == -1)
         {
-          log_debug ("%s.%s: leave (dialog failed)\n", __FILE__, __func__);
+          log_debug ("%s.%s: leave (dialog failed)\n", SRCNAME, __func__);
           return gpg_error (GPG_ERR_CANCELED);  
         }
     }
 
   /* Gather the keys for the recipients. */
   recipients = getRecipients ();
-  n_keys = op_lookup_keys (recipients, &keys, &unknown, &all);
+  if ( op_lookup_keys (recipients, &keys, &unknown) )
+    {
+      log_debug ("%s.%s: leave (lookup keys failed)\n", SRCNAME, __func__);
+      return gpg_error (GPG_ERR_GENERAL);  
+    }
+  n_recp = count_strings (recipients);
+  n_keys = count_keys (keys);
+  n_unknown = count_strings (unknown);
 
-  log_debug ("%s:%s: found %d recipients, need %d, unknown=%p\n",
-             __FILE__, __func__, n_keys, all, unknown);
   
-  if (n_keys != count_recipients (recipients))
+  log_debug ("%s:%s: found %d recipients, need %d, unknown=%d\n",
+             SRCNAME, __func__, (int)n_keys, (int)n_recp, (int)n_unknown);
+  
+  if (n_keys != n_recp)
     {
-      int opts = 0;
-      gpgme_key_t *keys2 = NULL;
+      unsigned int opts;
+      gpgme_key_t *keys2;
 
-      /* 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. */
-      log_debug ("%s:%s: calling recipient_dialog_box2", __FILE__, __func__);
-      recipient_dialog_box2 (keys, unknown, all, &keys2, &opts);
-      xfree (keys);
+      log_debug ("%s:%s: calling recipient_dialog_box2", SRCNAME, __func__);
+      opts = recipient_dialog_box2 (keys, unknown, &keys2);
+      free_key_array (keys);
       keys = keys2;
       if (opts & OPT_FLAG_CANCEL) 
         {
@@ -1250,22 +1298,21 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
     }
 
   if (sign_key)
-    log_debug ("%s:%s: signer: 0x%s %s\n",  __FILE__, __func__,
+    log_debug ("%s:%s: signer: 0x%s %s\n",  SRCNAME, __func__,
                keyid_from_key (sign_key), userid_from_key (sign_key));
   else
-    log_debug ("%s:%s: no signer\n", __FILE__, __func__);
+    log_debug ("%s:%s: no signer\n", SRCNAME, __func__);
   if (keys)
     {
       for (int i=0; keys[i] != NULL; i++)
-        log_debug ("%s.%s: recp.%d 0x%s %s\n", __FILE__, __func__,
+        log_debug ("%s.%s: recp.%d 0x%s %s\n", SRCNAME, __func__,
                    i, keyid_from_key (keys[i]), userid_from_key (keys[i]));
     }
 
   if (*plaintext)
     {
-      is_html = is_html_body (plaintext);
-
-      err = op_encrypt (plaintext, &ciphertext, keys, NULL, 0);
+      err = op_encrypt (plaintext, &ciphertext, 
+                        keys, sign_key, opt.passwd_ttl);
       if (err)
         {
           MessageBox (hwnd, op_strerror (err),
@@ -1273,7 +1320,7 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
           goto leave;
         }
 
-      if (is_html) 
+      if (want_html) 
         {
           char *tmp = add_html_line_endings (ciphertext);
           xfree (ciphertext);
@@ -1282,23 +1329,13 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
 
 //       {
 //         SPropValue prop;
-
 //         prop.ulPropTag=PR_MESSAGE_CLASS_A;
 //         prop.Value.lpszA="IPM.Note.OPENPGP";
 //         hr = HrSetOneProp (message, &prop);
 //         if (hr != S_OK)
 //           {
 //             log_error ("%s:%s: can't set message class: hr=%#lx\n",
-//                        __FILE__, __func__, hr); 
-//           }
-
-//         prop.ulPropTag=PR_CONTENT_TYPE_A;
-//         prop.Value.lpszA="application/encrypted;foo=bar;type=mytype";
-//         hr = HrSetOneProp (message, &prop);
-//         if (hr != S_OK)
-//           {
-//             log_error ("%s:%s: can't set content type: hr=%#lx\n",
-//                        __FILE__, __func__, hr); 
+//                        SRCNAME, __func__, hr); 
 //           }
 //       }
 
@@ -1309,7 +1346,7 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
       unsigned int n;
       
       n = getAttachments ();
-      log_debug ("%s:%s: message has %u attachments\n", __FILE__, __func__, n);
+      log_debug ("%s:%s: message has %u attachments\n", SRCNAME, __func__, n);
       for (unsigned int i=0; !err && i < n; i++) 
         err = encryptAttachment (hwnd, i, keys, NULL, 0);
       if (err)
@@ -1320,41 +1357,63 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
         }
     }
 
-  set_x_header (message, "Gpgol-Version", PACKAGE_VERSION);
+  set_x_header (message, "GPGOL-VERSION", PACKAGE_VERSION);
 
   /* Now that we successfully processed the attachments, we can save
-     the changes to the body.  For unknown reasons we need to set it
-     to empty first. */
+     the changes to the body.  */
   if (*plaintext)
     {
-      err = set_message_body (message, "");
-      if (!err)
-        err = set_message_body (message, ciphertext);
+      if (want_html)
+        {
+          /* We better update the body of the OOM too. */
+          if (put_outlook_property (exchange_cb, "Body", ciphertext))
+            log_error ("%s:%s: put OOM property Body failed\n",
+                       SRCNAME, __func__);
+          /* And set the format to plain text. */
+          if (put_outlook_property_int (exchange_cb, "BodyFormat", 1))
+            log_error ("%s:%s: put OOM property BodyFormat failed\n",
+                       SRCNAME, __func__);
+        }
+
+
+      err = set_message_body (message, ciphertext, want_html);
       if (err)
         goto leave;
-      hr = message->SaveChanges (KEEP_OPEN_READWRITE|FORCE_SAVE);
+
+      /* In case we don't have attachments, Outlook will really insert
+         the following content type into the header.  We use this to
+         declare that the encrypted content of the message is utf-8
+         encoded.  Note that we use plain/text even for HTML because
+         it is base64 encoded. */
+      prop.ulPropTag=PR_CONTENT_TYPE_A;
+      prop.Value.lpszA="text/plain; charset=utf-8"; 
+      hr = HrSetOneProp (message, &prop);
       if (hr != S_OK)
         {
-          log_error ("%s:%s: SaveChanges(message) failed: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
-          err = gpg_error (GPG_ERR_GENERAL);
-          goto leave;
+          log_error ("%s:%s: can't set content type: hr=%#lx\n",
+                     SRCNAME, __func__, hr);
         }
+
+    }
+  
+  hr = message->SaveChanges (KEEP_OPEN_READWRITE|FORCE_SAVE);
+  if (hr != S_OK)
+    {
+      log_error ("%s:%s: SaveChanges(message) failed: hr=%#lx\n",
+                 SRCNAME, __func__, hr); 
+      err = gpg_error (GPG_ERR_GENERAL);
+      goto leave;
     }
 
  leave:
   /* FIXME: What to do with already encrypted attachments if some of
      the encrypted (or other operations) failed? */
 
-  for (int i=0; i < n_keys; i++)
-    xfree (unknown[i]);
-  if (n_keys)
-    xfree (unknown);
-
   free_key_array (keys);
-  free_recipient_array (recipients);
+  free_string_array (recipients);
+  free_string_array (unknown);
   xfree (ciphertext);
-  log_debug ("%s:%s: leave (err=%s)\n", __FILE__, __func__, op_strerror (err));
+  log_debug ("%s:%s: leave (err=%s)\n", SRCNAME, __func__, op_strerror (err));
   return err;
 }
 
@@ -1426,7 +1485,7 @@ GpgMsgImpl::getAttachments (void)
       if (FAILED (hr))
         {
           log_debug ("%s:%s: GetAttachmentTable failed: hr=%#lx",
-                     __FILE__, __func__, hr);
+                     SRCNAME, __func__, hr);
           return 0;
         }
       
@@ -1435,7 +1494,7 @@ GpgMsgImpl::getAttachments (void)
       if (FAILED (hr))
         {
           log_debug ("%s:%s: HrQueryAllRows failed: hr=%#lx",
-                     __FILE__, __func__, hr);
+                     SRCNAME, __func__, hr);
           table->Release ();
           return 0;
         }
@@ -1461,7 +1520,7 @@ get_attach_method (LPATTACH obj)
   if (FAILED (hr))
     {
       log_error ("%s:%s: error getting attachment method: hr=%#lx",
-                 __FILE__, __func__, hr);
+                 SRCNAME, __func__, hr);
       return 0; 
     }
   /* We don't bother checking whether we really get a PT_LONG ulong
@@ -1473,7 +1532,7 @@ get_attach_method (LPATTACH obj)
 }
 
 
-/* Return the content-type of the attachment OBJ or NULL if it dow not
+/* Return the content-type of the attachment OBJ or NULL if it does not
    exists.  Caller must free. */
 static char *
 get_attach_mime_tag (LPATTACH obj)
@@ -1486,7 +1545,7 @@ get_attach_mime_tag (LPATTACH obj)
   if (FAILED (hr))
     {
       log_error ("%s:%s: error getting attachment's MIME tag: hr=%#lx",
-                 __FILE__, __func__, hr);
+                 SRCNAME, __func__, hr);
       return NULL; 
     }
   switch ( PROP_TYPE (propval->ulPropTag) )
@@ -1494,7 +1553,7 @@ get_attach_mime_tag (LPATTACH obj)
     case PT_UNICODE:
       name = wchar_to_utf8 (propval->Value.lpszW);
       if (!name)
-        log_debug ("%s:%s: error converting to utf8\n", __FILE__, __func__);
+        log_debug ("%s:%s: error converting to utf8\n", SRCNAME, __func__);
       break;
       
     case PT_STRING8:
@@ -1503,7 +1562,7 @@ get_attach_mime_tag (LPATTACH obj)
       
     default:
       log_debug ("%s:%s: proptag=%#lx not supported\n",
-                 __FILE__, __func__, propval->ulPropTag);
+                 SRCNAME, __func__, propval->ulPropTag);
       name = NULL;
       break;
     }
@@ -1526,7 +1585,7 @@ get_short_attach_data (LPATTACH obj)
   if (FAILED (hr))
     {
       log_error ("%s:%s: error getting attachment's data: hr=%#lx",
-                 __FILE__, __func__, hr);
+                 SRCNAME, __func__, hr);
       return NULL; 
     }
   switch ( PROP_TYPE (propval->ulPropTag) )
@@ -1541,7 +1600,7 @@ get_short_attach_data (LPATTACH obj)
       
     default:
       log_debug ("%s:%s: proptag=%#lx not supported\n",
-                 __FILE__, __func__, propval->ulPropTag);
+                 SRCNAME, __func__, propval->ulPropTag);
       data = NULL;
       break;
     }
@@ -1626,7 +1685,7 @@ set_x_header (LPMESSAGE msg, const char *name, const char *val)
   if (FAILED (hr)) 
     {
       log_error ("%s:%s: can't get mapping for header `%s': hr=%#lx\n",
-                 __FILE__, __func__, name, hr); 
+                 SRCNAME, __func__, name, hr); 
       return false;
     }
     
@@ -1636,7 +1695,7 @@ set_x_header (LPMESSAGE msg, const char *name, const char *val)
   if (hr != S_OK)
     {
       log_error ("%s:%s: can't set header `%s': hr=%#lx\n",
-                 __FILE__, __func__, name, hr); 
+                 SRCNAME, __func__, name, hr); 
       return false;
     }
   return true;
@@ -1662,7 +1721,7 @@ get_attach_filename (LPATTACH obj)
     hr = HrGetOneProp ((LPMAPIPROP)obj, PR_ATTACH_FILENAME, &propval);
   if (FAILED(hr))
     {
-      log_debug ("%s:%s: no filename property found", __FILE__, __func__);
+      log_debug ("%s:%s: no filename property found", SRCNAME, __func__);
       return NULL;
     }
 
@@ -1671,7 +1730,7 @@ get_attach_filename (LPATTACH obj)
     case PT_UNICODE:
       name = wchar_to_utf8 (propval->Value.lpszW);
       if (!name)
-        log_debug ("%s:%s: error converting to utf8\n", __FILE__, __func__);
+        log_debug ("%s:%s: error converting to utf8\n", SRCNAME, __func__);
       break;
       
     case PT_STRING8:
@@ -1680,7 +1739,7 @@ get_attach_filename (LPATTACH obj)
       
     default:
       log_debug ("%s:%s: proptag=%#lx not supported\n",
-                 __FILE__, __func__, propval->ulPropTag);
+                 SRCNAME, __func__, propval->ulPropTag);
       name = NULL;
       break;
     }
@@ -1690,40 +1749,6 @@ get_attach_filename (LPATTACH obj)
 
 
 
-
-/* Return a filename to be used for saving an attachment. Returns an
-   malloced string on success. HWND is the current Window and SRCNAME
-   the filename to be used as suggestion.  On error; i.e. cancel NULL
-   is returned. */
-static char *
-get_save_filename (HWND root, const char *srcname)
-                                    
-{
-  char filter[] = "All Files (*.*)\0*.*\0\0";
-  char fname[MAX_PATH+1];
-  OPENFILENAME ofn;
-
-  memset (fname, 0, sizeof (fname));
-  strncpy (fname, srcname, MAX_PATH-1);
-  fname[MAX_PATH] = 0;  
-  
-
-  memset (&ofn, 0, sizeof (ofn));
-  ofn.lStructSize = sizeof (ofn);
-  ofn.hwndOwner = root;
-  ofn.lpstrFile = fname;
-  ofn.nMaxFile = MAX_PATH;
-  ofn.lpstrFileTitle = NULL;
-  ofn.nMaxFileTitle = 0;
-  ofn.Flags |= OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
-  ofn.lpstrTitle = "GPG - Save decrypted attachment";
-  ofn.lpstrFilter = filter;
-
-  if (GetSaveFileName (&ofn))
-    return xstrdup (fname);
-  return NULL;
-}
-
 \f
 /* Read the attachment ATT and try to detect whether this is a PGP
    Armored message.  METHOD is the attach method of ATT.  Returns 0 if
@@ -1745,14 +1770,14 @@ get_pgp_armor_type (LPATTACH att, int method)
   if (FAILED (hr))
     {
       log_debug ("%s:%s: can't attachment data: hr=%#lx",
-                 __FILE__, __func__,  hr);
+                 SRCNAME, __func__,  hr);
       return ARMOR_NONE;
     }
 
   hr = stream->Read (buffer, sizeof buffer -1, &nread);
   if ( hr != S_OK )
     {
-      log_debug ("%s:%s: Read failed: hr=%#lx", __FILE__, __func__, hr);
+      log_debug ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr);
       stream->Release ();
       return ARMOR_NONE;
     }
@@ -1793,12 +1818,14 @@ GpgMsgImpl::gatherAttachmentInfo (void)
   attach_info_t table;
   unsigned int pos, n_attach;
   const char *s;
+  unsigned int attestation_count = 0;
+  unsigned int invalid_count = 0;
 
   is_pgpmime = false;
   has_attestation = false;
   n_attach = getAttachments ();
   log_debug ("%s:%s: message has %u attachments\n",
-             __FILE__, __func__, n_attach);
+             SRCNAME, __func__, n_attach);
   if (!n_attach)
       return NULL;
 
@@ -1811,7 +1838,9 @@ GpgMsgImpl::gatherAttachmentInfo (void)
       if (FAILED (hr))
         {
           log_error ("%s:%s: can't open attachment %d: hr=%#lx",
-                     __FILE__, __func__, pos, hr);
+                     SRCNAME, __func__, pos, hr);
+          table[pos].invalid = 1;
+          invalid_count++;
           continue;
         }
 
@@ -1840,7 +1869,10 @@ GpgMsgImpl::gatherAttachmentInfo (void)
           && !stricmp (table[pos].filename, "GPGol-Attestation.txt")
           && table[pos].content_type
           && !stricmp (table[pos].content_type, "text/plain"))
-        has_attestation = true;
+        {
+          has_attestation = true;
+          attestation_count++;
+        }
 
       att->Release ();
     }
@@ -1849,6 +1881,8 @@ GpgMsgImpl::gatherAttachmentInfo (void)
   /* Figure out whether there are encrypted attachments. */
   for (pos=0; !table[pos].end_of_table; pos++)
     {
+      if (table[pos].invalid)
+        continue;
       if (table[pos].armor_type == ARMOR_MESSAGE)
         table[pos].is_encrypted = 1;
       else if (table[pos].filename && (s = strrchr (table[pos].filename, '.'))
@@ -1873,6 +1907,8 @@ GpgMsgImpl::gatherAttachmentInfo (void)
   /* Figure out what attachments are signed. */
   for (pos=0; !table[pos].end_of_table; pos++)
     {
+      if (table[pos].invalid)
+        continue;
       if (table[pos].filename && (s = strrchr (table[pos].filename, '.'))
           &&  !stricmp (s, ".asc")
           && table[pos].content_type  
@@ -1884,13 +1920,18 @@ GpgMsgImpl::gatherAttachmentInfo (void)
              detached signature.  To correlate the data file and the
              signature we keep track of the POS. */
           for (unsigned int i=0; !table[i].end_of_table; i++)
-            if (i != pos && table[i].filename 
-                && strlen (table[i].filename) == len
-                && !strncmp (table[i].filename, table[pos].filename, len))
-              {
-                table[i].is_signed = 1;
-                table[i].sig_pos = pos;
-              }
+            {
+              if (table[i].invalid)
+                continue;
+              if (i != pos && table[i].filename 
+                  && strlen (table[i].filename) == len
+                  && !strncmp (table[i].filename, table[pos].filename, len))
+                {
+                  table[i].is_signed = 1;
+                  table[i].sig_pos = pos;
+                }
+            }
+          
         }
       else if (table[pos].content_type  
                && (!stricmp (table[pos].content_type, "application/pgp")
@@ -1899,9 +1940,11 @@ GpgMsgImpl::gatherAttachmentInfo (void)
         table[pos].is_signed = 1;
     }
 
-  log_debug ("%s:%s: attachment info:\n", __FILE__, __func__);
+  log_debug ("%s:%s: attachment info:\n", SRCNAME, __func__);
   for (pos=0; !table[pos].end_of_table; pos++)
     {
+      if (table[pos].invalid)
+        continue;
       log_debug ("\t%d %d %d %u %d `%s' `%s' `%s'\n",
                  pos, table[pos].is_encrypted,
                  table[pos].is_signed, table[pos].sig_pos,
@@ -1913,12 +1956,16 @@ GpgMsgImpl::gatherAttachmentInfo (void)
   /* Simple check whether this is PGP/MIME encrypted.  At least with
      OL2003 the content-type of the body is also correctly set but we
      don't make use of this as it is not clear whether this is true
-     for othyer storage providers. */
-  if (!opt.compat.no_pgpmime
-      && pos == 2 && table[0].content_type && table[1].content_type
-      && !stricmp (table[0].content_type, "application/pgp-encrypted")
-      && !stricmp (table[1].content_type, "application/octet-stream")
-      && isPgpmimeVersionPart (0))
+     for other storage providers.  We use a hack to ignore extra
+     attesttation attachments: Those are assumed to come after the
+     both PGP/MIME parts. */
+  if (opt.compat.no_pgpmime)
+    ;
+  else if (pos == 2 + attestation_count + invalid_count
+           && table[0].content_type && table[1].content_type
+           && !stricmp (table[0].content_type, "application/pgp-encrypted")
+           && !stricmp (table[1].content_type, "application/octet-stream")
+           && isPgpmimeVersionPart (0))
     {
       log_debug ("\tThis is a PGP/MIME encrypted message - table adjusted");
       table[0].is_encrypted = 0;
@@ -1932,9 +1979,9 @@ GpgMsgImpl::gatherAttachmentInfo (void)
 
 
 \f
-/* Verify the ATTachment at attachments and table position POS_DATA
-   agains the signature at position POS_SIG.  Display the status for
-   each signature. */
+/* Verify the attachment as recorded in TABLE and at table position
+   POS_DATA against the signature at position POS_SIG.  Display the
+   status for each signature. */
 void
 GpgMsgImpl::verifyAttachment (HWND hwnd, attach_info_t table,
                               unsigned int pos_data,
@@ -1947,7 +1994,7 @@ GpgMsgImpl::verifyAttachment (HWND hwnd, attach_info_t table,
   char *sig_data;
 
   log_debug ("%s:%s: verifying attachment %d/%d",
-             __FILE__, __func__, pos_data, pos_sig);
+             SRCNAME, __func__, pos_data, pos_sig);
 
   assert (table);
   assert (message);
@@ -1959,7 +2006,7 @@ GpgMsgImpl::verifyAttachment (HWND hwnd, attach_info_t table,
   if (FAILED (hr))
     {
       log_error ("%s:%s: can't open attachment %d (sig): hr=%#lx",
-                 __FILE__, __func__, pos_sig, hr);
+                 SRCNAME, __func__, pos_sig, hr);
       return;
     }
 
@@ -1968,7 +2015,7 @@ GpgMsgImpl::verifyAttachment (HWND hwnd, attach_info_t table,
   else
     {
       log_error ("%s:%s: attachment %d (sig): method %d not supported",
-                 __FILE__, __func__, pos_sig, table[pos_sig].method);
+                 SRCNAME, __func__, pos_sig, table[pos_sig].method);
       att->Release ();
       return;
     }
@@ -1982,7 +2029,7 @@ GpgMsgImpl::verifyAttachment (HWND hwnd, attach_info_t table,
   if (FAILED (hr))
     {
       log_error ("%s:%s: can't open attachment %d (data): hr=%#lx",
-                 __FILE__, __func__, pos_data, hr);
+                 SRCNAME, __func__, pos_data, hr);
       xfree (sig_data);
       return;
     }
@@ -1996,7 +2043,7 @@ GpgMsgImpl::verifyAttachment (HWND hwnd, attach_info_t table,
       if (FAILED (hr))
         {
           log_error ("%s:%s: can't open data of attachment %d: hr=%#lx",
-                     __FILE__, __func__, pos_data, hr);
+                     SRCNAME, __func__, pos_data, hr);
           goto leave;
         }
       err = op_verify_detached_sig (stream, sig_data,
@@ -2004,7 +2051,7 @@ GpgMsgImpl::verifyAttachment (HWND hwnd, attach_info_t table,
       if (err)
         {
           log_debug ("%s:%s: verify detached signature failed: %s",
-                     __FILE__, __func__, op_strerror (err)); 
+                     SRCNAME, __func__, op_strerror (err)); 
           MessageBox (hwnd, op_strerror (err),
                       "GPG Attachment Verification", MB_ICONERROR|MB_OK);
         }
@@ -2013,7 +2060,7 @@ GpgMsgImpl::verifyAttachment (HWND hwnd, attach_info_t table,
   else
     {
       log_error ("%s:%s: attachment %d (data): method %d not supported",
-                 __FILE__, __func__, pos_data, table[pos_data].method);
+                 SRCNAME, __func__, pos_data, table[pos_data].method);
     }
 
  leave:
@@ -2038,18 +2085,18 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
   char *outname = NULL;
   
 
-  log_debug ("%s:%s: processing attachment %d", __FILE__, __func__, pos);
+  log_debug ("%s:%s: processing attachment %d", SRCNAME, __func__, pos);
 
   /* Make sure that we can access the attachment table. */
   if (!message || !getAttachments ())
     {
-      log_debug ("%s:%s: no attachemnts at all", __FILE__, __func__);
+      log_debug ("%s:%s: no attachemnts at all", SRCNAME, __func__);
       return;
     }
 
   if (!save_plaintext)
     {
-      log_error ("%s:%s: save_plaintext not requested", __FILE__, __func__);
+      log_error ("%s:%s: save_plaintext not requested", SRCNAME, __func__);
       return;
     }
 
@@ -2057,7 +2104,7 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
   if (FAILED (hr))
     {
       log_debug ("%s:%s: can't open attachment %d: hr=%#lx",
-                 __FILE__, __func__, pos, hr);
+                 SRCNAME, __func__, pos, hr);
       return;
     }
 
@@ -2078,7 +2125,7 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
       if (FAILED (hr))
         {
           log_error ("%s:%s: can't open data obj of attachment %d: hr=%#lx",
-                     __FILE__, __func__, pos, hr);
+                     SRCNAME, __func__, pos, hr);
           goto leave;
         }
 
@@ -2101,7 +2148,7 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
       suggested_name = get_attach_filename (att);
       if (suggested_name)
         log_debug ("%s:%s: attachment %d, filename `%s'", 
-                   __FILE__, __func__, pos, suggested_name);
+                   SRCNAME, __func__, pos, suggested_name);
       /* Strip of know extensions or use a default name. */
       if (!suggested_name)
         {
@@ -2129,7 +2176,7 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
       if (FAILED (hr))
         {
           log_error ("%s:%s: can't open data of attachment %d: hr=%#lx",
-                     __FILE__, __func__, pos, hr);
+                     SRCNAME, __func__, pos, hr);
           goto leave;
         }
 
@@ -2143,7 +2190,7 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
           if (hr != S_OK)
             {
               log_error ("%s:%s: can't create attachment: hr=%#lx\n",
-                         __FILE__, __func__, hr); 
+                         SRCNAME, __func__, hr); 
               goto leave;
             }
           
@@ -2153,7 +2200,7 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
           if (hr != S_OK)
             {
               log_error ("%s:%s: can't set attach method: hr=%#lx\n",
-                         __FILE__, __func__, hr); 
+                         SRCNAME, __func__, hr); 
               goto leave;
             }
           
@@ -2163,11 +2210,11 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
           if (hr != S_OK)
             {
               log_error ("%s:%s: can't set attach filename: hr=%#lx\n",
-                         __FILE__, __func__, hr); 
+                         SRCNAME, __func__, hr); 
               goto leave;
             }
           log_debug ("%s:%s: setting filename of attachment %d/%ld to `%s'",
-                     __FILE__, __func__, pos, newpos, outname);
+                     SRCNAME, __func__, pos, newpos, outname);
           
 
           hr = newatt->OpenProperty (PR_ATTACH_DATA_BIN, &IID_IStream, 0,
@@ -2175,7 +2222,7 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
           if (FAILED (hr)) 
             {
               log_error ("%s:%s: can't create output stream: hr=%#lx\n",
-                         __FILE__, __func__, hr); 
+                         SRCNAME, __func__, hr); 
               goto leave;
             }
       
@@ -2183,7 +2230,7 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
           if (err)
             {
               log_debug ("%s:%s: decrypt stream failed: %s",
-                         __FILE__, __func__, op_strerror (err)); 
+                         SRCNAME, __func__, op_strerror (err)); 
               to->Revert ();
               to->Release ();
               from->Release ();
@@ -2200,7 +2247,7 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
           if (hr != S_OK)
             {
               log_error ("%s:%s: SaveChanges failed: hr=%#lx\n",
-                         __FILE__, __func__, hr); 
+                         SRCNAME, __func__, hr); 
               goto leave;
             }
 
@@ -2210,8 +2257,8 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
           att->Release ();
           att = NULL;
           if (message->DeleteAttach (pos, 0, NULL, 0) == S_OK)
-            log_error ("%s:%s: failed to delete attacghment %d: %s",
-                       __FILE__, __func__, pos, op_strerror (err)); 
+            log_error ("%s:%s: failed to delete attachment %d: %s",
+                       SRCNAME, __func__, pos, op_strerror (err)); 
           
         }
       else  /* Save attachment to a file. */
@@ -2222,7 +2269,7 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
           if (FAILED (hr)) 
             {
               log_error ("%s:%s: can't create stream for `%s': hr=%#lx\n",
-                         __FILE__, __func__, outname, hr); 
+                         SRCNAME, __func__, outname, hr); 
               from->Release ();
               goto leave;
             }
@@ -2231,7 +2278,7 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
           if (err)
             {
               log_debug ("%s:%s: decrypt stream failed: %s",
-                         __FILE__, __func__, op_strerror (err)); 
+                         SRCNAME, __func__, op_strerror (err)); 
               to->Revert ();
               to->Release ();
               from->Release ();
@@ -2252,7 +2299,7 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext,
   else
     {
       log_error ("%s:%s: attachment %d: method %d not supported",
-                 __FILE__, __func__, pos, method);
+                 SRCNAME, __func__, pos, method);
     }
 
  leave:
@@ -2280,7 +2327,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
   /* Make sure that we can access the attachment table. */
   if (!message || !getAttachments ())
     {
-      log_debug ("%s:%s: no attachemnts at all", __FILE__, __func__);
+      log_debug ("%s:%s: no attachemnts at all", SRCNAME, __func__);
       return;
     }
 
@@ -2288,7 +2335,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
   if (FAILED (hr))
     {
       log_debug ("%s:%s: can't open attachment %d: hr=%#lx",
-                 __FILE__, __func__, pos, hr);
+                 SRCNAME, __func__, pos, hr);
       return;
     }
 
@@ -2312,7 +2359,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
   if (method == ATTACH_EMBEDDED_MSG)
     {
       log_debug ("%s:%s: signing embedded attachments is not supported",
-                 __FILE__, __func__);
+                 SRCNAME, __func__);
     }
   else if (method == ATTACH_BY_VALUE)
     {
@@ -2324,7 +2371,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
       if (FAILED (hr))
         {
           log_error ("%s:%s: can't open data of attachment %d: hr=%#lx",
-                     __FILE__, __func__, pos, hr);
+                     SRCNAME, __func__, pos, hr);
           goto leave;
         }
 
@@ -2332,7 +2379,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
       if (hr != S_OK)
         {
           log_error ("%s:%s: can't create attachment: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           goto leave;
         }
 
@@ -2342,7 +2389,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
       if (hr != S_OK)
         {
           log_error ("%s:%s: can't set attach method: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           goto leave;
         }
       
@@ -2352,11 +2399,11 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
       if (hr != S_OK)
         {
           log_error ("%s:%s: can't set attach filename: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           goto leave;
         }
       log_debug ("%s:%s: setting filename of attachment %d/%ld to `%s'",
-                 __FILE__, __func__, pos, newpos, signame);
+                 SRCNAME, __func__, pos, newpos, signame);
 
       prop.ulPropTag = PR_ATTACH_EXTENSION_A;
       prop.Value.lpszA = ".pgpsig";   
@@ -2364,7 +2411,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
       if (hr != S_OK)
         {
           log_error ("%s:%s: can't set attach extension: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           goto leave;
         }
 
@@ -2375,7 +2422,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
       if (hr != S_OK)
         {
           log_error ("%s:%s: can't set attach tag: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           goto leave;
         }
 
@@ -2385,7 +2432,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
       if (hr != S_OK)
         {
           log_error ("%s:%s: can't set attach mime tag: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           goto leave;
         }
 
@@ -2394,7 +2441,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
       if (FAILED (hr)) 
         {
           log_error ("%s:%s: can't create output stream: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           goto leave;
         }
       
@@ -2402,7 +2449,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
       if (err)
         {
           log_debug ("%s:%s: sign stream failed: %s",
-                     __FILE__, __func__, op_strerror (err)); 
+                     SRCNAME, __func__, op_strerror (err)); 
           to->Revert ();
           MessageBox (hwnd, op_strerror (err),
                       "GPG Attachment Signing", MB_ICONERROR|MB_OK);
@@ -2418,7 +2465,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
       if (hr != S_OK)
         {
           log_error ("%s:%s: SaveChanges failed: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           goto leave;
         }
 
@@ -2426,7 +2473,7 @@ GpgMsgImpl::signAttachment (HWND hwnd, int pos, gpgme_key_t sign_key, int ttl)
   else
     {
       log_error ("%s:%s: attachment %d: method %d not supported",
-                 __FILE__, __func__, pos, method);
+                 SRCNAME, __func__, pos, method);
     }
 
  leave:
@@ -2461,7 +2508,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
   /* Make sure that we can access the attachment table. */
   if (!message || !getAttachments ())
     {
-      log_debug ("%s:%s: no attachemnts at all", __FILE__, __func__);
+      log_debug ("%s:%s: no attachemnts at all", SRCNAME, __func__);
       return 0;
     }
 
@@ -2469,7 +2516,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
   if (FAILED (hr))
     {
       log_debug ("%s:%s: can't open attachment %d: hr=%#lx",
-                 __FILE__, __func__, pos, hr);
+                 SRCNAME, __func__, pos, hr);
       err = gpg_error (GPG_ERR_GENERAL);
       return err;
     }
@@ -2494,7 +2541,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
   if (method == ATTACH_EMBEDDED_MSG)
     {
       log_debug ("%s:%s: encrypting embedded attachments is not supported",
-                 __FILE__, __func__);
+                 SRCNAME, __func__);
       err = gpg_error (GPG_ERR_NOT_SUPPORTED);
     }
   else if (method == ATTACH_BY_VALUE)
@@ -2507,7 +2554,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
       if (FAILED (hr))
         {
           log_error ("%s:%s: can't open data of attachment %d: hr=%#lx",
-                     __FILE__, __func__, pos, hr);
+                     SRCNAME, __func__, pos, hr);
           err = gpg_error (GPG_ERR_GENERAL);
           goto leave;
         }
@@ -2516,7 +2563,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
       if (hr != S_OK)
         {
           log_error ("%s:%s: can't create attachment: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           err = gpg_error (GPG_ERR_GENERAL);
           goto leave;
         }
@@ -2527,7 +2574,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
       if (hr != S_OK)
         {
           log_error ("%s:%s: can't set attach method: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           err = gpg_error (GPG_ERR_GENERAL);
           goto leave;
         }
@@ -2538,12 +2585,12 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
       if (hr != S_OK)
         {
           log_error ("%s:%s: can't set attach filename: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           err = gpg_error (GPG_ERR_GENERAL);
           goto leave;
         }
       log_debug ("%s:%s: setting filename of attachment %d/%ld to `%s'",
-                 __FILE__, __func__, pos, newpos, filename);
+                 SRCNAME, __func__, pos, newpos, filename);
 
       prop.ulPropTag = PR_ATTACH_EXTENSION_A;
       prop.Value.lpszA = ".pgpenc";   
@@ -2551,7 +2598,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
       if (hr != S_OK)
         {
           log_error ("%s:%s: can't set attach extension: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           err = gpg_error (GPG_ERR_GENERAL);
           goto leave;
         }
@@ -2563,7 +2610,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
       if (hr != S_OK)
         {
           log_error ("%s:%s: can't set attach tag: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           err = gpg_error (GPG_ERR_GENERAL);
           goto leave;
         }
@@ -2574,7 +2621,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
       if (hr != S_OK)
         {
           log_error ("%s:%s: can't set attach mime tag: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           err = gpg_error (GPG_ERR_GENERAL);
           goto leave;
         }
@@ -2584,7 +2631,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
       if (FAILED (hr)) 
         {
           log_error ("%s:%s: can't create output stream: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           err = gpg_error (GPG_ERR_GENERAL);
           goto leave;
         }
@@ -2593,7 +2640,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
       if (err)
         {
           log_debug ("%s:%s: encrypt stream failed: %s",
-                     __FILE__, __func__, op_strerror (err)); 
+                     SRCNAME, __func__, op_strerror (err)); 
           to->Revert ();
           MessageBox (hwnd, op_strerror (err),
                       "GPG Attachment Encryption", MB_ICONERROR|MB_OK);
@@ -2609,7 +2656,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
       if (hr != S_OK)
         {
           log_error ("%s:%s: SaveChanges failed: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           err = gpg_error (GPG_ERR_GENERAL);
           goto leave;
         }
@@ -2618,7 +2665,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
       if (hr != S_OK)
         {
           log_error ("%s:%s: DeleteAtatch failed: hr=%#lx\n",
-                     __FILE__, __func__, hr); 
+                     SRCNAME, __func__, hr); 
           err = gpg_error (GPG_ERR_GENERAL);
           goto leave;
         }
@@ -2627,7 +2674,7 @@ GpgMsgImpl::encryptAttachment (HWND hwnd, int pos, gpgme_key_t *keys,
   else
     {
       log_error ("%s:%s: attachment %d: method %d not supported",
-                 __FILE__, __func__, pos, method);
+                 SRCNAME, __func__, pos, method);
       err = gpg_error (GPG_ERR_NOT_SUPPORTED);
     }