Added translation framework and translated a few strings.
[gpgol.git] / src / gpgmsg.cpp
index e892586..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. */
@@ -169,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);
 
@@ -218,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);
 };
 
 
@@ -366,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;
@@ -378,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) )
@@ -402,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;
         }
@@ -427,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 ();
@@ -437,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 ();
@@ -459,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;
@@ -469,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);
 }
 
 
@@ -487,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) )
@@ -495,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:
@@ -504,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;
     }
@@ -542,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;
@@ -556,7 +567,7 @@ GpgMsgImpl::getMessageType (void)
 {
   const char *s;
   
-  loadBody ();
+  loadBody (false);
   
   if (!body || !(s = strstr (body, "BEGIN PGP ")))
     return OPENPGP_NONE;
@@ -580,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 : "";
 }
@@ -593,7 +604,7 @@ GpgMsgImpl::getOrigText ()
 const char *
 GpgMsgImpl::getDisplayText (void)
 {
-  loadBody ();
+  loadBody (false);
 
   if (body_plain)
     return body_plain;
@@ -627,7 +638,7 @@ GpgMsgImpl::getRecipients ()
   if (FAILED (hr)) 
     {
       log_debug_w32 (-1, "%s:%s: GetRecipientTable failed",
-                     __FILE__, __func__);
+                     SRCNAME, __func__);
       return NULL;
     }
 
@@ -635,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;
@@ -659,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. */
@@ -668,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;
         }
     }
@@ -680,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;
 }
@@ -708,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;
     }
           
@@ -718,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;
     }
   
@@ -731,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;
     }
 
@@ -742,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;
     }
 
@@ -753,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;
     }
 
@@ -763,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;
     }
 
@@ -772,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;
     }
   
@@ -781,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;
@@ -790,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
     {
@@ -806,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;
     }
       
@@ -819,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;
     }
 
@@ -839,7 +851,7 @@ GpgMsgImpl::writeAttestation (void)
     }
   if (newatt)
     newatt->Release ();
-  xfree (buffer);
+  gpgme_free (buffer);
 }
 
 
@@ -849,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;
@@ -879,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
@@ -905,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);
@@ -928,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);
@@ -945,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);
         }
@@ -957,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);
@@ -971,10 +983,10 @@ 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);
@@ -989,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);
@@ -1013,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
@@ -1022,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;
@@ -1036,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"
@@ -1057,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);
             }
        }
     }
@@ -1116,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;
 }
 
@@ -1128,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);  
     }
 
@@ -1167,95 +1181,112 @@ 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 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. */
-      TRACEPOINT();
   recipients = getRecipients ();
-      TRACEPOINT();
   if ( op_lookup_keys (recipients, &keys, &unknown) )
     {
-      log_debug ("%s.%s: leave (lookup keys failed)\n", __FILE__, __func__);
+      log_debug ("%s.%s: leave (lookup keys failed)\n", SRCNAME, __func__);
       return gpg_error (GPG_ERR_GENERAL);  
     }
-      TRACEPOINT();
   n_recp = count_strings (recipients);
   n_keys = count_keys (keys);
   n_unknown = count_strings (unknown);
-      TRACEPOINT();
+
   
   log_debug ("%s:%s: found %d recipients, need %d, unknown=%d\n",
-             __FILE__, __func__, (int)n_keys, (int)n_recp, (int)n_unknown);
+             SRCNAME, __func__, (int)n_keys, (int)n_recp, (int)n_unknown);
   
   if (n_keys != n_recp)
     {
       unsigned int opts;
       gpgme_key_t *keys2;
 
-      log_debug ("%s:%s: calling recipient_dialog_box2", __FILE__, __func__);
+      log_debug ("%s:%s: calling recipient_dialog_box2", SRCNAME, __func__);
       opts = recipient_dialog_box2 (keys, unknown, &keys2);
       free_key_array (keys);
       keys = keys2;
@@ -1267,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),
@@ -1290,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);
@@ -1299,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); 
 //           }
 //       }
 
@@ -1326,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)
@@ -1337,26 +1357,52 @@ 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:
@@ -1367,7 +1413,7 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
   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;
 }
 
@@ -1439,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;
         }
       
@@ -1448,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;
         }
@@ -1474,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
@@ -1499,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) )
@@ -1507,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:
@@ -1516,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;
     }
@@ -1539,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) )
@@ -1554,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;
     }
@@ -1639,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;
     }
     
@@ -1649,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;
@@ -1675,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;
     }
 
@@ -1684,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:
@@ -1693,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;
     }
@@ -1724,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;
     }
@@ -1779,7 +1825,7 @@ GpgMsgImpl::gatherAttachmentInfo (void)
   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;
 
@@ -1792,7 +1838,7 @@ 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;
@@ -1894,7 +1940,7 @@ 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)
@@ -1948,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);
@@ -1960,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;
     }
 
@@ -1969,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;
     }
@@ -1983,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;
     }
@@ -1997,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,
@@ -2005,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);
         }
@@ -2014,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:
@@ -2039,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;
     }
 
@@ -2058,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;
     }
 
@@ -2079,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;
         }
 
@@ -2102,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)
         {
@@ -2130,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;
         }
 
@@ -2144,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;
             }
           
@@ -2154,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;
             }
           
@@ -2164,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,
@@ -2176,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;
             }
       
@@ -2184,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 ();
@@ -2201,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;
             }
 
@@ -2211,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. */
@@ -2223,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;
             }
@@ -2232,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 ();
@@ -2253,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:
@@ -2281,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;
     }
 
@@ -2289,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;
     }
 
@@ -2313,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)
     {
@@ -2325,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;
         }
 
@@ -2333,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;
         }
 
@@ -2343,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;
         }
       
@@ -2353,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";   
@@ -2365,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;
         }
 
@@ -2376,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;
         }
 
@@ -2386,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;
         }
 
@@ -2395,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;
         }
       
@@ -2403,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);
@@ -2419,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;
         }
 
@@ -2427,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:
@@ -2462,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;
     }
 
@@ -2470,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;
     }
@@ -2495,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)
@@ -2508,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;
         }
@@ -2517,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;
         }
@@ -2528,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;
         }
@@ -2539,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";   
@@ -2552,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;
         }
@@ -2564,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;
         }
@@ -2575,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;
         }
@@ -2585,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;
         }
@@ -2594,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);
@@ -2610,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;
         }
@@ -2619,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;
         }
@@ -2628,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);
     }