Add tracing support for important code
authorAndre Heinecke <aheinecke@intevation.de>
Mon, 24 Sep 2018 16:18:11 +0000 (18:18 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Mon, 24 Sep 2018 16:18:11 +0000 (18:18 +0200)
src/addressbook.cpp,
src/application-events.cpp,
src/cryptcontroller.cpp,
src/debug.h,
src/folder-events.cpp,
src/mail.cpp,
src/mailitem-events.cpp,
src/mapihelp.cpp,
src/mimedataprovider.cpp,
src/oomhelp.cpp,
src/parsecontroller.cpp,
src/rfc2047parse.c,
src/w32-gettext.h,
src/windowmessages.cpp: Add tracing support.

--
If DBG_TRACE is enabled this will trace function calls
and returns. As we don't really have a debugger this
can be important to understand differences in different
scenarios.

Big performance impact when enabled. Huge logs will be
created and the commit has a regression risk due to
lines like:

if (foo)
  return X;

Where we now need:

if (foo)
  {
    TRETURN X;
  }

I hope I caught all this with my regular expressions and
manual review but this patch is very large,..

14 files changed:
src/addressbook.cpp
src/application-events.cpp
src/cryptcontroller.cpp
src/debug.h
src/folder-events.cpp
src/mail.cpp
src/mailitem-events.cpp
src/mapihelp.cpp
src/mimedataprovider.cpp
src/oomhelp.cpp
src/parsecontroller.cpp
src/rfc2047parse.c
src/w32-gettext.h
src/windowmessages.cpp

index abb0288..6c0f4d4 100644 (file)
@@ -41,6 +41,7 @@ typedef struct
 static DWORD WINAPI
 open_keyadder (LPVOID arg)
 {
+  TSTART;
   auto adder_args = std::unique_ptr<keyadder_args_t> ((keyadder_args_t*) arg);
 
   std::vector<std::string> args;
@@ -50,7 +51,7 @@ open_keyadder (LPVOID arg)
   if (!gpg4win_dir)
     {
       TRACEPOINT;
-      return -1;
+      TRETURN -1;
     }
   const auto keyadder = std::string (gpg4win_dir) + "\\bin\\gpgolkeyadder.exe";
   args.push_back (keyadder);
@@ -66,7 +67,7 @@ open_keyadder (LPVOID arg)
     {
       // can't happen
       TRACEPOINT;
-      return -1;
+      TRETURN -1;
     }
 
   GpgME::Data mystdin (adder_args->data.c_str(), adder_args->data.size(),
@@ -90,7 +91,7 @@ open_keyadder (LPVOID arg)
     {
       log_error ("%s:%s: Err code: %i asString: %s",
                  SRCNAME, __func__, err.code(), err.asString());
-      return 0;
+      TRETURN 0;
     }
 
   auto newKey = mystdout.toString ();
@@ -100,7 +101,7 @@ open_keyadder (LPVOID arg)
   if (newKey.empty())
     {
       log_debug ("%s:%s: keyadder canceled.", SRCNAME, __func__);
-      return 0;
+      TRETURN 0;
     }
   if (newKey == "empty")
     {
@@ -115,16 +116,17 @@ open_keyadder (LPVOID arg)
   cb_args.contact = adder_args->contact;
 
   do_in_ui_thread (CONFIG_KEY_DONE, (void*) &cb_args);
-  return 0;
+  TRETURN 0;
 }
 
 void
 Addressbook::update_key_o (void *callback_args)
 {
+  TSTART;
   if (!callback_args)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
   callback_args_t *cb_args = static_cast<callback_args_t *> (callback_args);
   LPDISPATCH contact = cb_args->contact.get();
@@ -133,14 +135,14 @@ Addressbook::update_key_o (void *callback_args)
   if (!user_props)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   LPDISPATCH pgp_key = find_or_add_text_prop (user_props, "OpenPGP Key");
   if (!pgp_key)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
   put_oom_string (pgp_key, "Value", cb_args->data);
 
@@ -148,23 +150,24 @@ Addressbook::update_key_o (void *callback_args)
              SRCNAME, __func__);
 
   gpgol_release (pgp_key);
-  return;
+  TRETURN;
 }
 
 void
 Addressbook::edit_key_o (LPDISPATCH contact)
 {
+  TSTART;
   if (!contact)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   LPDISPATCH user_props = get_oom_object (contact, "UserProperties");
   if (!user_props)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   auto pgp_key = MAKE_SHARED (
@@ -174,14 +177,14 @@ Addressbook::edit_key_o (LPDISPATCH contact)
   if (!pgp_key)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   char *key_data = get_oom_string (pgp_key.get(), "Value");
   if (!key_data)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   char *name = get_oom_string (contact, "Subject");
@@ -209,7 +212,7 @@ Addressbook::edit_key_o (LPDISPATCH contact)
   xfree (name);
   xfree (key_data);
 
-  return;
+  TRETURN;
 }
 
 static std::set <std::string> s_checked_entries;
@@ -220,23 +223,24 @@ static std::set <std::string> s_checked_entries;
 void
 Addressbook::check_o (Mail *mail)
 {
+  TSTART;
   if (!mail)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
   LPDISPATCH mailitem = mail->item ();
   if (!mailitem)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
   auto recipients_obj = MAKE_SHARED (get_oom_object (mailitem, "Recipients"));
 
   if (!recipients_obj)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   bool err = false;
@@ -295,4 +299,5 @@ Addressbook::check_o (Mail *mail)
       xfree (key_data);
       gpgol_release (pgp_key);
     }
+  TRETURN;
 }
index d882e50..82b1b34 100644 (file)
@@ -69,6 +69,7 @@ EVENT_SINK_INVOKE(ApplicationEvents)
     {
       case ItemLoad:
         {
+          TSTART;
           LPDISPATCH mailItem;
           /* The mailItem should be the first argument */
           if (!parms || parms->cArgs != 1 ||
@@ -76,7 +77,7 @@ EVENT_SINK_INVOKE(ApplicationEvents)
             {
               log_error ("%s:%s: ItemLoad with unexpected Arguments.",
                          SRCNAME, __func__);
-              break;
+              TBREAK;
             }
 
           log_debug ("%s:%s: ItemLoad event. Getting object.",
@@ -87,18 +88,19 @@ EVENT_SINK_INVOKE(ApplicationEvents)
             {
               log_debug ("%s:%s: ItemLoad event without mailitem.",
                          SRCNAME, __func__);
-              break;
+              TBREAK;
             }
           log_debug ("%s:%s: Creating mail object for item: %p",
                      SRCNAME, __func__, mailItem);
           new Mail (mailItem);
           do_in_ui_thread_async (INVALIDATE_LAST_MAIL, nullptr);
-          break;
+          TBREAK;
         }
       case Quit:
         {
+          TSTART;
           log_debug ("%s:%s: Quit event", SRCNAME, __func__);
-          break;
+          TBREAK;
         }
       default:
         log_oom ("%s:%s: Unhandled Event: %lx \n",
index 6a85fc3..e54560d 100644 (file)
 static int
 sink_data_write (sink_t sink, const void *data, size_t datalen)
 {
+  TSTART;
   GpgME::Data *d = static_cast<GpgME::Data *>(sink->cb_data);
   d->write (data, datalen);
-  return 0;
+  TRETURN 0;
 }
 
 static int
@@ -66,22 +67,27 @@ CryptController::CryptController (Mail *mail, bool encrypt, bool sign,
     m_crypto_success (false),
     m_proto (proto)
 {
+  TSTART;
   memdbg_ctor ("CryptController");
   log_debug ("%s:%s: CryptController ctor for %p encrypt %i sign %i inline %i.",
              SRCNAME, __func__, mail, encrypt, sign, mail->getDoPGPInline ());
   m_recipient_addrs = mail->getCachedRecipients ();
+  TRETURN;
 }
 
 CryptController::~CryptController()
 {
+  TSTART;
   memdbg_dtor ("CryptController");
   log_debug ("%s:%s:%p",
              SRCNAME, __func__, m_mail);
+  TRETURN;
 }
 
 int
 CryptController::collect_data ()
 {
+  TSTART;
   /* Get the attachment info and the body.  We need to do this before
      creating the engine's filter because sending the cancel to
      the engine with nothing for the engine to process.  Will result
@@ -117,7 +123,7 @@ CryptController::collect_data ()
       gpgol_release (message);
       mapi_release_attach_table (att_table);
       xfree (body);
-      return -1;
+      TRETURN -1;
     }
 
   bool do_inline = m_mail->getDoPGPInline ();
@@ -160,7 +166,7 @@ CryptController::collect_data ()
                  SRCNAME, __func__);
       gpgol_release (message);
       mapi_release_attach_table (att_table);
-      return -1;
+      TRETURN -1;
     }
 
   /* Message is no longer needed */
@@ -170,13 +176,14 @@ CryptController::collect_data ()
 
   /* Set the input buffer to start. */
   m_input.seek (0, SEEK_SET);
-  return 0;
+  TRETURN 0;
 }
 
 int
 CryptController::lookup_fingerprints (const std::string &sigFpr,
                                       const std::vector<std::string> recpFprs)
 {
+  TSTART;
   auto ctx = std::shared_ptr<GpgME::Context> (GpgME::Context::createForProtocol (m_proto));
 
   if (!ctx)
@@ -186,7 +193,7 @@ CryptController::lookup_fingerprints (const std::string &sigFpr,
                  m_proto == GpgME::CMS ? "smime" :
                  m_proto == GpgME::OpenPGP ? "openpgp" :
                  "unknown");
-      return -1;
+      TRETURN -1;
     }
 
   ctx->setKeyListMode (GpgME::Local);
@@ -200,7 +207,7 @@ CryptController::lookup_fingerprints (const std::string &sigFpr,
                      m_proto == GpgME::CMS ? "smime" :
                      m_proto == GpgME::OpenPGP ? "openpgp" :
                      "unknown");
-          return -1;
+          TRETURN -1;
       }
       // reset context
       ctx = std::shared_ptr<GpgME::Context> (GpgME::Context::createForProtocol (m_proto));
@@ -208,7 +215,7 @@ CryptController::lookup_fingerprints (const std::string &sigFpr,
   }
 
   if (!recpFprs.size()) {
-      return 0;
+     TRETURN 0;
   }
 
   // Convert recipient fingerprints
@@ -220,7 +227,7 @@ CryptController::lookup_fingerprints (const std::string &sigFpr,
       log_error ("%s:%s: failed to start recipient keylisting",
                  SRCNAME, __func__);
       release_cArray (cRecps);
-      return -1;
+      TRETURN -1;
   }
 
   do {
@@ -231,13 +238,14 @@ CryptController::lookup_fingerprints (const std::string &sigFpr,
 
   release_cArray (cRecps);
 
-  return 0;
+  TRETURN 0;
 }
 
 
 int
 CryptController::parse_output (GpgME::Data &resolverOutput)
 {
+  TSTART;
   // Todo: Use Data::toString
   std::istringstream ss(resolverOutput.toString());
   std::string line;
@@ -251,13 +259,13 @@ CryptController::parse_output (GpgME::Data &resolverOutput)
         {
           log_debug ("%s:%s: resolver canceled",
                      SRCNAME, __func__);
-          return -2;
+          TRETURN -2;
         }
       if (line == "unencrypted")
         {
           log_debug ("%s:%s: FIXME resolver wants unencrypted",
                      SRCNAME, __func__);
-          return -1;
+          TRETURN -1;
         }
       std::istringstream lss (line);
 
@@ -304,10 +312,10 @@ CryptController::parse_output (GpgME::Data &resolverOutput)
                  SRCNAME, __func__);
       gpgol_message_box (m_mail->getWindow (), _("No recipients for encryption selected."),
                          _("GpgOL"), MB_OK);
-      return -2;
+      TRETURN -2;
     }
 
-  return lookup_fingerprints (sigFpr, recpFprs);
+  TRETURN lookup_fingerprints (sigFpr, recpFprs);
 }
 
 static bool
@@ -317,6 +325,7 @@ resolve_through_protocol (const GpgME::Protocol &proto, bool sign,
                           std::vector<GpgME::Key> &r_keys,
                           GpgME::Key &r_sig)
 {
+  TSTART;
   bool sig_ok = true;
   bool enc_ok = true;
 
@@ -332,12 +341,13 @@ resolve_through_protocol (const GpgME::Protocol &proto, bool sign,
       r_sig = cache->getSigningKey (sender.c_str (), proto);
       sig_ok = !r_sig.isNull();
     }
-  return sig_ok && enc_ok;
+  TRETURN sig_ok && enc_ok;
 }
 
 int
 CryptController::resolve_keys_cached()
 {
+  TSTART;
   // Prepare variables
   const auto cached_sender = m_mail->getSender ();
   auto recps = m_recipient_addrs;
@@ -392,7 +402,7 @@ CryptController::resolve_keys_cached()
       m_recipients.clear();
       m_signer_key = GpgME::Key();
       m_proto = GpgME::UnknownProtocol;
-      return 1;
+      TRETURN 1;
     }
 
   if (!m_recipients.empty())
@@ -410,12 +420,13 @@ CryptController::resolve_keys_cached()
                  SRCNAME, __func__, anonstr (m_signer_key.primaryFingerprint ()),
                  to_cstr (m_signer_key.protocol()));
     }
-  return 0;
+  TRETURN 0;
 }
 
 int
 CryptController::resolve_keys ()
 {
+  TSTART;
   m_recipients.clear();
 
   if (!m_recipient_addrs.size())
@@ -432,7 +443,7 @@ CryptController::resolve_keys ()
                          buf,
                          _("GpgOL"), MB_OK);
       xfree(buf);
-      return -1;
+      TRETURN -1;
     }
 
   if (opt.autoresolve && !resolve_keys_cached ())
@@ -440,7 +451,7 @@ CryptController::resolve_keys ()
       log_debug ("%s:%s: resolved keys through the cache",
                  SRCNAME, __func__);
       start_crypto_overlay();
-      return 0;
+      TRETURN 0;
     }
 
   std::vector<std::string> args;
@@ -450,7 +461,7 @@ CryptController::resolve_keys ()
   if (!gpg4win_dir)
     {
       TRACEPOINT;
-      return -1;
+      TRETURN -1;
     }
   const auto resolver = std::string (gpg4win_dir) + "\\bin\\resolver.exe";
   args.push_back (resolver);
@@ -528,7 +539,7 @@ CryptController::resolve_keys ()
     {
       // can't happen
       TRACEPOINT;
-      return -1;
+      TRETURN -1;
     }
 
 
@@ -574,15 +585,16 @@ CryptController::resolve_keys ()
                  SRCNAME, __func__);
       log_data ("Resolver stdout:\n'%s'", mystdout.toString ().c_str ());
       log_data ("Resolver stderr:\n'%s'", mystderr.toString ().c_str ());
-      return -1;
+      TRETURN -1;
     }
 
-  return ret;
+  TRETURN ret;
 }
 
 int
 CryptController::do_crypto (GpgME::Error &err)
 {
+  TSTART;
   log_debug ("%s:%s",
              SRCNAME, __func__);
 
@@ -595,12 +607,12 @@ CryptController::do_crypto (GpgME::Error &err)
       //error
       log_debug ("%s:%s: Failure to resolve keys.",
                  SRCNAME, __func__);
-      return -1;
+      TRETURN -1;
     }
   if (ret == -2)
     {
       // Cancel
-      return -2;
+      TRETURN -2;
     }
   bool do_inline = m_mail->getDoPGPInline ();
 
@@ -622,7 +634,7 @@ CryptController::do_crypto (GpgME::Error &err)
       gpgol_message_box (m_mail->getWindow (),
                          "Failure to create context.",
                          utf8_gettext ("GpgOL"), MB_OK);
-      return -1;
+      TRETURN -1;
     }
   if (!m_signer_key.isNull())
     {
@@ -648,7 +660,7 @@ CryptController::do_crypto (GpgME::Error &err)
                      SRCNAME, __func__, result_pair.first.error().asString(),
                      result_pair.second.error().asString());
           err = err1 ? err1 : err2;
-          return -1;
+          TRETURN -1;
         }
 
       if (err1.isCanceled() || err2.isCanceled())
@@ -656,7 +668,7 @@ CryptController::do_crypto (GpgME::Error &err)
           err = err1.isCanceled() ? err1 : err2;
           log_debug ("%s:%s: User cancled",
                      SRCNAME, __func__);
-          return -2;
+          TRETURN -2;
         }
     }
   else if (m_encrypt && m_sign)
@@ -669,13 +681,13 @@ CryptController::do_crypto (GpgME::Error &err)
         {
           log_error ("%s:%s: Signing error %s.",
                      SRCNAME, __func__, sigResult.error().asString());
-          return -1;
+          TRETURN -1;
         }
       if (err.isCanceled())
         {
           log_debug ("%s:%s: User cancled",
                      SRCNAME, __func__);
-          return -2;
+          TRETURN -2;
         }
       parse_micalg (sigResult);
 
@@ -696,7 +708,7 @@ CryptController::do_crypto (GpgME::Error &err)
                               m_output, m_input, m_micalg.c_str ()))
         {
           TRACEPOINT;
-          return -1;
+          TRETURN -1;
         }
 
       // Now we have the multipart throw away the rest.
@@ -711,13 +723,13 @@ CryptController::do_crypto (GpgME::Error &err)
         {
           log_error ("%s:%s: Encryption error %s.",
                      SRCNAME, __func__, err.asString());
-          return -1;
+          TRETURN -1;
         }
       if (err.isCanceled())
         {
           log_debug ("%s:%s: User cancled",
                      SRCNAME, __func__);
-          return -2;
+          TRETURN -2;
         }
       // Now we have encrypted output just treat it like encrypted.
     }
@@ -731,13 +743,13 @@ CryptController::do_crypto (GpgME::Error &err)
         {
           log_error ("%s:%s: Encryption error %s.",
                      SRCNAME, __func__, err.asString());
-          return -1;
+          TRETURN -1;
         }
       if (err.isCanceled())
         {
           log_debug ("%s:%s: User cancled",
                      SRCNAME, __func__);
-          return -2;
+          TRETURN -2;
         }
     }
   else if (m_sign)
@@ -750,13 +762,13 @@ CryptController::do_crypto (GpgME::Error &err)
         {
           log_error ("%s:%s: Signing error %s.",
                      SRCNAME, __func__, err.asString());
-          return -1;
+          TRETURN -1;
         }
       if (err.isCanceled())
         {
           log_debug ("%s:%s: User cancled",
                      SRCNAME, __func__);
-          return -2;
+          TRETURN -2;
         }
       parse_micalg (result);
     }
@@ -772,15 +784,16 @@ CryptController::do_crypto (GpgME::Error &err)
              SRCNAME, __func__);
   m_crypto_success = true;
 
-  return 0;
+  TRETURN 0;
 }
 
 static int
 write_data (sink_t sink, GpgME::Data &data)
 {
+  TSTART;
   if (!sink || !sink->writefnc)
     {
-      return -1;
+      TRETURN -1;
     }
 
   char buf[4096];
@@ -791,7 +804,7 @@ write_data (sink_t sink, GpgME::Data &data)
       sink->writefnc (sink, buf, nread);
     }
 
-  return 0;
+  TRETURN 0;
 }
 
 int
@@ -800,6 +813,7 @@ create_sign_attach (sink_t sink, protocol_t protocol,
                     GpgME::Data &signedData,
                     const char *micalg)
 {
+  TSTART;
   char boundary[BOUNDARYSIZE+1];
   char top_header[BOUNDARYSIZE+200];
   int rc = 0;
@@ -813,28 +827,28 @@ create_sign_attach (sink_t sink, protocol_t protocol,
   if ((rc = write_string (sink, top_header)))
     {
       TRACEPOINT;
-      return rc;
+      TRETURN rc;
     }
 
   /* Write the boundary so that it is not included in the hashing.  */
   if ((rc = write_boundary (sink, boundary, 0)))
     {
       TRACEPOINT;
-      return rc;
+      TRETURN rc;
     }
 
   /* Write the signed mime structure */
   if ((rc = write_data (sink, signedData)))
     {
       TRACEPOINT;
-      return rc;
+      TRETURN rc;
     }
 
   /* Write the signature attachment */
   if ((rc = write_boundary (sink, boundary, 0)))
     {
       TRACEPOINT;
-      return rc;
+      TRETURN rc;
     }
 
   if (protocol == PROTOCOL_OPENPGP)
@@ -859,13 +873,13 @@ create_sign_attach (sink_t sink, protocol_t protocol,
   if (rc)
     {
       TRACEPOINT;
-      return rc;
+      TRETURN rc;
     }
 
   if ((rc = write_string (sink, "\r\n")))
     {
       TRACEPOINT;
-      return rc;
+      TRETURN rc;
     }
 
   // Write the signature data
@@ -875,30 +889,30 @@ create_sign_attach (sink_t sink, protocol_t protocol,
       if ((rc = write_b64 (sink, (const void *) sigStr.c_str (), sigStr.size())))
         {
           TRACEPOINT;
-          return rc;
+          TRETURN rc;
         }
     }
   else if ((rc = write_data (sink, signature)))
     {
       TRACEPOINT;
-      return rc;
+      TRETURN rc;
     }
 
   // Add an extra linefeed with should not harm.
   if ((rc = write_string (sink, "\r\n")))
     {
       TRACEPOINT;
-      return rc;
+      TRETURN rc;
     }
 
   /* Write the final boundary.  */
   if ((rc = write_boundary (sink, boundary, 1)))
     {
       TRACEPOINT;
-      return rc;
+      TRETURN rc;
     }
 
-  return rc;
+  TRETURN rc;
 }
 
 static int
@@ -906,6 +920,7 @@ create_encrypt_attach (sink_t sink, protocol_t protocol,
                        GpgME::Data &encryptedData,
                        int exchange_major_version)
 {
+  TSTART;
   char boundary[BOUNDARYSIZE+1];
   int rc = create_top_encryption_header (sink, protocol, boundary,
                                          false, exchange_major_version);
@@ -914,7 +929,7 @@ create_encrypt_attach (sink_t sink, protocol_t protocol,
     {
       log_error ("%s:%s: Failed to create top header.",
                  SRCNAME, __func__);
-      return rc;
+      TRETURN rc;
     }
 
   if (protocol == PROTOCOL_OPENPGP ||
@@ -934,7 +949,7 @@ create_encrypt_attach (sink_t sink, protocol_t protocol,
     {
       log_error ("%s:%s: Failed to create top header.",
                  SRCNAME, __func__);
-      return rc;
+      TRETURN rc;
     }
 
   /* Write the final boundary (for OpenPGP) and finish the attachment.  */
@@ -943,12 +958,13 @@ create_encrypt_attach (sink_t sink, protocol_t protocol,
       log_error ("%s:%s: Failed to write boundary.",
                  SRCNAME, __func__);
     }
-  return rc;
+  TRETURN rc;
 }
 
 int
 CryptController::update_mail_mapi ()
 {
+  TSTART;
   log_debug ("%s:%s", SRCNAME, __func__);
 
   LPMESSAGE message = get_oom_base_message (m_mail->item());
@@ -956,7 +972,7 @@ CryptController::update_mail_mapi ()
     {
       log_error ("%s:%s: Failed to obtain message.",
                  SRCNAME, __func__);
-      return -1;
+      TRETURN -1;
     }
 
   if (m_mail->getDoPGPInline ())
@@ -974,7 +990,7 @@ CryptController::update_mail_mapi ()
                      SRCNAME, __func__);
         }
 
-      return 0;
+      TRETURN 0;
     }
 
   mapi_attach_item_t *att_table = mapi_create_attach_table (message, 0);
@@ -1011,7 +1027,7 @@ CryptController::update_mail_mapi ()
       log_error ("%s:%s: Failed to create moss attach.",
                  SRCNAME, __func__);
       gpgol_release (message);
-      return -1;
+      TRETURN -1;
     }
 
   protocol_t protocol = m_proto == GpgME::CMS ?
@@ -1062,16 +1078,17 @@ CryptController::update_mail_mapi ()
   gpgol_release (attach);
   gpgol_release (message);
 
-  return rc;
+  TRETURN rc;
 }
 
 std::string
 CryptController::get_inline_data ()
 {
+  TSTART;
   std::string ret;
   if (!m_mail->getDoPGPInline ())
     {
-      return ret;
+      TRETURN ret;
     }
   m_output.seek (0, SEEK_SET);
   char buf[4096];
@@ -1080,29 +1097,30 @@ CryptController::get_inline_data ()
     {
       ret += std::string (buf, nread);
     }
-  return ret;
+  TRETURN ret;
 }
 
 void
 CryptController::parse_micalg (const GpgME::SigningResult &result)
 {
+  TSTART;
   if (result.isNull())
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
   const auto signature = result.createdSignature(0);
   if (signature.isNull())
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   const char *hashAlg = signature.hashAlgorithmAsString ();
   if (!hashAlg)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
   if (m_proto == GpgME::OpenPGP)
     {
@@ -1116,11 +1134,13 @@ CryptController::parse_micalg (const GpgME::SigningResult &result)
 
   log_debug ("%s:%s: micalg is: '%s'.",
              SRCNAME, __func__, m_micalg.c_str ());
+  TRETURN;
 }
 
 void
 CryptController::start_crypto_overlay ()
 {
+  TSTART;
   auto wid = m_mail->getWindow ();
 
   std::string text;
@@ -1134,4 +1154,5 @@ CryptController::start_crypto_overlay ()
       text = _("Signing...");
     }
   m_overlay = std::unique_ptr<Overlay> (new Overlay (wid, text));
+  TRETURN;
 }
index 94d421d..62ce37b 100644 (file)
@@ -55,7 +55,7 @@ extern "C" {
 #define DBG_DATA           (DBG_MIME_PARSER | DBG_MIME_DATA)
 #define DBG_OOM_VAL        (1<<9) // 512 Unified as DBG_OOM
 #define DBG_OOM_EXTRA      (1<<10)// 1024 Unified as DBG_OOM
-#define DBG_SUPERTRACE     (1<<11)// 2048 Very verbose tracing.
+#define DBG_TRACE          (1<<11)// 2048 Very verbose tracing.
 #define DBG_OOM            (DBG_OOM_VAL | DBG_OOM_EXTRA)
 
 #define debug_oom        ((opt.enable_debug & DBG_OOM) || \
@@ -81,6 +81,9 @@ const char *anonstr (const char *data);
 #define log_memory(format, ...) if ((opt.enable_debug & DBG_MEMORY)) \
   log_debug("DBG_MEM/" format, ##__VA_ARGS__)
 
+#define log_trace(format, ...) if ((opt.enable_debug & DBG_TRACE)) \
+  log_debug("TRACE/" format, ##__VA_ARGS__)
+
 #define gpgol_release(X) \
 { \
   if (X && opt.enable_debug & DBG_MEMORY) \
@@ -98,14 +101,17 @@ const char *anonstr (const char *data);
 const char *log_srcname (const char *s);
 #define SRCNAME log_srcname (__FILE__)
 
-#define TRACEPOINT log_debug ("%s:%s:%d: tracepoint\n", \
+#define STRANGEPOINT log_debug ("%s:%s:%d:_trace_", \
+                           SRCNAME, __func__, __LINE__);
+#define TRACEPOINT log_trace ("%s:%s:%d", \
                               SRCNAME, __func__, __LINE__);
-#define TSTART if (opt.enable_debug & DBG_SUPERTRACE) \
-                    log_debug ("%s:%s: enter\n", SRCNAME, __func__);
-#define TRETURN(X) if (opt.enable_debug & DBG_SUPERTRACE) \
-                        log_debug ("%s:%s:%d: return\n", SRCNAME, __func__, \
-                                   __LINE__); \
-                   return X
+#define TSTART log_trace ("%s:%s:%d enter", SRCNAME, __func__, __LINE__);
+#define TRETURN log_trace ("%s:%s:%d: return", SRCNAME, __func__, \
+                           __LINE__); \
+                   return
+#define TBREAK log_trace ("%s:%s:%d: break", SRCNAME, __func__, \
+                           __LINE__); \
+                   break
 
 
 const char *get_log_file (void);
index 5becba2..d9e7c13 100644 (file)
@@ -49,6 +49,7 @@ EVENT_SINK_INVOKE(FolderEvents)
     {
       case BeforeItemMove:
         {
+          TSTART;
           log_oom ("%s:%s: Item Move in folder: %p",
                          SRCNAME, __func__, this);
 
@@ -65,14 +66,14 @@ EVENT_SINK_INVOKE(FolderEvents)
             {
               log_error ("%s:%s: Invalid args.",
                          SRCNAME, __func__);
-              break;
+              TBREAK;
             }
 
           if (!parms->rgvarg[1].pdispVal)
             {
               log_oom ("%s:%s: Passing delete",
                              SRCNAME, __func__);
-              break;
+              TBREAK;
             }
 
           LPDISPATCH mailitem = parms->rgvarg[2].pdispVal;
@@ -83,7 +84,7 @@ EVENT_SINK_INVOKE(FolderEvents)
               log_debug ("%s:%s: move is not about a mailitem.",
                          SRCNAME, __func__);
               xfree (name);
-              break;
+              TBREAK;
             }
           xfree (name);
 
@@ -97,7 +98,7 @@ EVENT_SINK_INVOKE(FolderEvents)
                 {
                   log_debug ("%s:%s: Failed to get uid for %p",
                              SRCNAME, __func__, mailitem);
-                  break;
+                  TBREAK;
                 }
             }
 
@@ -107,7 +108,7 @@ EVENT_SINK_INVOKE(FolderEvents)
             {
               log_error ("%s:%s: Failed to find mail for uuid",
                          SRCNAME, __func__);
-              break;
+              TBREAK;
             }
           if (mail->isCryptoMail ())
             {
@@ -119,7 +120,7 @@ EVENT_SINK_INVOKE(FolderEvents)
                 {
                   log_error ("%s:%s: Failed to close.",
                              SRCNAME, __func__);
-                  break;
+                  TBREAK;
                 }
             }
         }
index 00c41fd..56adebf 100644 (file)
@@ -106,11 +106,12 @@ Mail::Mail (LPDISPATCH mailitem) :
     m_is_about_to_be_moved(false),
     m_locate_in_progress(false)
 {
+  TSTART;
   if (getMailForItem (mailitem))
     {
       log_error ("Mail object for item: %p already exists. Bug.",
                  mailitem);
-      return;
+      TRETURN;
     }
 
   m_event_sink = install_MailItemEvents_sink (mailitem);
@@ -121,13 +122,14 @@ Mail::Mail (LPDISPATCH mailitem) :
       log_error ("%s:%s: Failed to install MailItemEvents sink.",
                  SRCNAME, __func__);
       gpgol_release(mailitem);
-      return;
+      TRETURN;
     }
   gpgrt_lock_lock (&mail_map_lock);
   s_mail_map.insert (std::pair<LPDISPATCH, Mail *> (mailitem, this));
   gpgrt_lock_unlock (&mail_map_lock);
   s_last_mail = this;
   memdbg_ctor ("Mail");
+  TRETURN;
 }
 
 GPGRT_LOCK_DEFINE(dtor_lock);
@@ -136,18 +138,23 @@ GPGRT_LOCK_DEFINE(dtor_lock);
 void
 Mail::lockDelete ()
 {
+  TSTART;
   gpgrt_lock_lock (&dtor_lock);
+  TRETURN;
 }
 
 // static
 void
 Mail::unlockDelete ()
 {
+  TSTART;
   gpgrt_lock_unlock (&dtor_lock);
+  TRETURN;
 }
 
 Mail::~Mail()
 {
+  TSTART;
   /* This should fix a race condition where the mail is
      deleted before the parser is accessed in the decrypt
      thread. The shared_ptr of the parser then ensures
@@ -209,15 +216,17 @@ Mail::~Mail()
   gpgrt_lock_unlock (&dtor_lock);
   log_oom ("%s:%s: returning",
                  SRCNAME, __func__);
+  TRETURN;
 }
 
 //static
 Mail *
 Mail::getMailForItem (LPDISPATCH mailitem)
 {
+  TSTART;
   if (!mailitem)
     {
-      return NULL;
+      TRETURN NULL;
     }
   std::map<LPDISPATCH, Mail *>::iterator it;
   gpgrt_lock_lock (&mail_map_lock);
@@ -225,33 +234,35 @@ Mail::getMailForItem (LPDISPATCH mailitem)
   gpgrt_lock_unlock (&mail_map_lock);
   if (it == s_mail_map.end())
     {
-      return NULL;
+      TRETURN NULL;
     }
-  return it->second;
+  TRETURN it->second;
 }
 
 //static
 Mail *
 Mail::getMailForUUID (const char *uuid)
 {
+  TSTART;
   if (!uuid)
     {
-      return NULL;
+      TRETURN NULL;
     }
   gpgrt_lock_lock (&uid_map_lock);
   auto it = s_uid_map.find(std::string(uuid));
   gpgrt_lock_unlock (&uid_map_lock);
   if (it == s_uid_map.end())
     {
-      return NULL;
+      TRETURN NULL;
     }
-  return it->second;
+  TRETURN it->second;
 }
 
 //static
 bool
 Mail::isValidPtr (const Mail *mail)
 {
+  TSTART;
   gpgrt_lock_lock (&mail_map_lock);
   auto it = s_mail_map.begin();
   while (it != s_mail_map.end())
@@ -259,23 +270,24 @@ Mail::isValidPtr (const Mail *mail)
       if (it->second == mail)
         {
           gpgrt_lock_unlock (&mail_map_lock);
-          return true;
+          TRETURN true;
         }
       ++it;
     }
   gpgrt_lock_unlock (&mail_map_lock);
-  return false;
+  TRETURN false;
 }
 
 int
 Mail::preProcessMessage_m ()
 {
+  TSTART;
   LPMESSAGE message = get_oom_base_message (m_mailitem);
   if (!message)
     {
       log_error ("%s:%s: Failed to get base message.",
                  SRCNAME, __func__);
-      return 0;
+      TRETURN 0;
     }
   log_oom ("%s:%s: GetBaseMessage OK for %p.",
                  SRCNAME, __func__, m_mailitem);
@@ -291,7 +303,7 @@ Mail::preProcessMessage_m ()
   if (m_type == MSGTYPE_UNKNOWN)
     {
       gpgol_release (message);
-      return 0;
+      TRETURN 0;
     }
 
   /* Create moss attachments here so that they are properly
@@ -305,19 +317,20 @@ Mail::preProcessMessage_m ()
     }
 
   gpgol_release (message);
-  return 0;
+  TRETURN 0;
 }
 
 static LPDISPATCH
 get_attachment_o (LPDISPATCH mailitem, int pos)
 {
+  TSTART;
   LPDISPATCH attachment;
   LPDISPATCH attachments = get_oom_object (mailitem, "Attachments");
   if (!attachments)
     {
       log_debug ("%s:%s: Failed to get attachments.",
                  SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
 
   std::string item_str;
@@ -327,7 +340,7 @@ get_attachment_o (LPDISPATCH mailitem, int pos)
       log_debug ("%s:%s: Invalid attachment count: %i.",
                  SRCNAME, __func__, count);
       gpgol_release (attachments);
-      return NULL;
+      TRETURN NULL;
     }
   if (pos > 0)
     {
@@ -340,7 +353,7 @@ get_attachment_o (LPDISPATCH mailitem, int pos)
   attachment = get_oom_object (attachments, item_str.c_str());
   gpgol_release (attachments);
 
-  return attachment;
+  TRETURN attachment;
 }
 
 /** Helper to check that all attachments are hidden, to be
@@ -348,18 +361,19 @@ get_attachment_o (LPDISPATCH mailitem, int pos)
 int
 Mail::checkAttachments_o () const
 {
+  TSTART;
   LPDISPATCH attachments = get_oom_object (m_mailitem, "Attachments");
   if (!attachments)
     {
       log_debug ("%s:%s: Failed to get attachments.",
                  SRCNAME, __func__);
-      return 1;
+      TRETURN 1;
     }
   int count = get_oom_int (attachments, "Count");
   if (!count)
     {
       gpgol_release (attachments);
-      return 0;
+      TRETURN 0;
     }
 
   std::string message;
@@ -382,7 +396,7 @@ Mail::checkAttachments_o () const
   else
     {
       gpgol_release (attachments);
-      return 0;
+      TRETURN 0;
     }
 
   bool foundOne = false;
@@ -425,18 +439,19 @@ Mail::checkAttachments_o () const
       xfree (wmsg);
       xfree (wtitle);
     }
-  return 0;
+  TRETURN 0;
 }
 
 /** Get the cipherstream of the mailitem. */
 static LPSTREAM
 get_attachment_stream_o (LPDISPATCH mailitem, int pos)
 {
+  TSTART;
   if (!pos)
     {
       log_debug ("%s:%s: Called with zero pos.",
                  SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
   LPDISPATCH attachment = get_attachment_o (mailitem, pos);
   LPSTREAM stream = NULL;
@@ -454,7 +469,7 @@ get_attachment_stream_o (LPDISPATCH mailitem, int pos)
         {
           log_debug ("%s:%s: Failed to get MAPI Interface.",
                      SRCNAME, __func__);
-          return NULL;
+          TRETURN NULL;
         }
       hr = gpgol_openProperty (message, PR_BODY_A, &IID_IStream, 0, 0,
                                (LPUNKNOWN*)&stream);
@@ -463,9 +478,9 @@ get_attachment_stream_o (LPDISPATCH mailitem, int pos)
         {
           log_debug ("%s:%s: OpenProperty failed: hr=%#lx",
                      SRCNAME, __func__, hr);
-          return NULL;
+          TRETURN NULL;
         }
-      return stream;
+      TRETURN stream;
     }
 
   LPATTACH mapi_attachment = NULL;
@@ -477,7 +492,7 @@ get_attachment_stream_o (LPDISPATCH mailitem, int pos)
     {
       log_debug ("%s:%s: Failed to get MapiObject of attachment: %p",
                  SRCNAME, __func__, attachment);
-      return NULL;
+      TRETURN NULL;
     }
   if (FAILED (gpgol_openProperty (mapi_attachment, PR_ATTACH_DATA_BIN,
                                   &IID_IStream, 0, MAPI_MODIFY,
@@ -488,7 +503,7 @@ get_attachment_stream_o (LPDISPATCH mailitem, int pos)
       gpgol_release (mapi_attachment);
     }
   gpgol_release (mapi_attachment);
-  return stream;
+  TRETURN stream;
 }
 
 #if 0
@@ -500,6 +515,7 @@ safearrays and how this probably should work.
 static int
 copy_data_property(LPDISPATCH target, std::shared_ptr<Attachment> attach)
 {
+  TSTART;
   VARIANT var;
   VariantInit (&var);
 
@@ -510,7 +526,7 @@ copy_data_property(LPDISPATCH target, std::shared_ptr<Attachment> attach)
   if (!size)
     {
       TRACEPOINT;
-      return 1;
+      TRETURN 1;
     }
 
   if (!get_pa_variant (target, PR_ATTACH_DATA_BIN_DASL, &var))
@@ -536,7 +552,7 @@ copy_data_property(LPDISPATCH target, std::shared_ptr<Attachment> attach)
     {
       TRACEPOINT;
       VariantClear(&var);
-      return 1;
+      TRETURN 1;
     }
 
   void *buffer = NULL;
@@ -545,7 +561,7 @@ copy_data_property(LPDISPATCH target, std::shared_ptr<Attachment> attach)
     {
       TRACEPOINT;
       VariantClear(&var);
-      return 1;
+      TRETURN 1;
     }
 
   /* Copy data to it */
@@ -555,7 +571,7 @@ copy_data_property(LPDISPATCH target, std::shared_ptr<Attachment> attach)
     {
       TRACEPOINT;
       VariantClear(&var);
-      return 1;
+      TRETURN 1;
     }
 
   /*/ Unlock the variant data */
@@ -563,24 +579,25 @@ copy_data_property(LPDISPATCH target, std::shared_ptr<Attachment> attach)
     {
       TRACEPOINT;
       VariantClear(&var);
-      return 1;
+      TRETURN 1;
     }
 
   if (set_pa_variant (target, PR_ATTACH_DATA_BIN_DASL, &var))
     {
       TRACEPOINT;
       VariantClear(&var);
-      return 1;
+      TRETURN 1;
     }
 
   VariantClear(&var);
-  return 0;
+  TRETURN 0;
 }
 #endif
 
 static int
 copy_attachment_to_file (std::shared_ptr<Attachment> att, HANDLE hFile)
 {
+  TSTART;
   char copybuf[COPYBUFSIZE];
   size_t nread;
 
@@ -610,16 +627,16 @@ copy_attachment_to_file (std::shared_ptr<Attachment> att, HANDLE hFile)
         {
           log_error ("%s:%s: Failed to write in tmp attachment.",
                      SRCNAME, __func__);
-          return 1;
+          TRETURN 1;
         }
       if (nread != nwritten)
         {
           log_error ("%s:%s: Write truncated.",
                      SRCNAME, __func__);
-          return 1;
+          TRETURN 1;
         }
     }
-  return 0;
+  TRETURN 0;
 }
 
 /** Sets some meta data on the last attachment added. The meta
@@ -627,12 +644,13 @@ copy_attachment_to_file (std::shared_ptr<Attachment> att, HANDLE hFile)
 static int
 fixup_last_attachment_o (LPDISPATCH mail, std::shared_ptr<Attachment> attachment)
 {
+  TSTART;
   /* Currently we only set content id */
   if (attachment->get_content_id ().empty())
     {
       log_debug ("%s:%s: Content id not found.",
                  SRCNAME, __func__);
-      return 0;
+      TRETURN 0;
     }
 
   LPDISPATCH attach = get_attachment_o (mail, -1);
@@ -640,13 +658,13 @@ fixup_last_attachment_o (LPDISPATCH mail, std::shared_ptr<Attachment> attachment
     {
       log_error ("%s:%s: No attachment.",
                  SRCNAME, __func__);
-      return 1;
+      TRETURN 1;
     }
   int ret = put_pa_string (attach,
                            PR_ATTACH_CONTENT_ID_DASL,
                            attachment->get_content_id ().c_str());
   gpgol_release (attach);
-  return ret;
+  TRETURN ret;
 }
 
 /** Helper to update the attachments of a mail object in oom.
@@ -655,6 +673,7 @@ static int
 add_attachments_o(LPDISPATCH mail,
                 std::vector<std::shared_ptr<Attachment> > attachments)
 {
+  TSTART;
   bool anyError = false;
   for (auto att: attachments)
     {
@@ -717,7 +736,7 @@ add_attachments_o(LPDISPATCH mail,
           anyError = true;
         }
     }
-  return anyError;
+  TRETURN anyError;
 }
 
 GPGRT_LOCK_DEFINE(parser_lock);
@@ -725,6 +744,7 @@ GPGRT_LOCK_DEFINE(parser_lock);
 static DWORD WINAPI
 do_parsing (LPVOID arg)
 {
+  TSTART;
   gpgrt_lock_lock (&dtor_lock);
   /* We lock with mail dtors so we can be sure the mail->parser
      call is valid. */
@@ -734,7 +754,7 @@ do_parsing (LPVOID arg)
       log_debug ("%s:%s: canceling parsing for: %p already deleted",
                  SRCNAME, __func__, arg);
       gpgrt_lock_unlock (&dtor_lock);
-      return 0;
+      TRETURN 0;
     }
 
   blockInv ();
@@ -759,7 +779,7 @@ do_parsing (LPVOID arg)
                  SRCNAME, __func__, arg);
       gpgrt_lock_unlock (&parser_lock);
       unblockInv();
-      return 0;
+      TRETURN 0;
     }
 
   if (!parser)
@@ -768,13 +788,13 @@ do_parsing (LPVOID arg)
                  SRCNAME, __func__, arg);
       gpgrt_lock_unlock (&parser_lock);
       unblockInv();
-      return -1;
+      TRETURN -1;
     }
   parser->parse();
   do_in_ui_thread (PARSING_DONE, arg);
   gpgrt_lock_unlock (&parser_lock);
   unblockInv();
-  return 0;
+  TRETURN 0;
 }
 
 /* How encryption is done:
@@ -851,6 +871,7 @@ do_parsing (LPVOID arg)
 static DWORD WINAPI
 do_crypt (LPVOID arg)
 {
+  TSTART;
   gpgrt_lock_lock (&dtor_lock);
   /* We lock with mail dtors so we can be sure the mail->parser
      call is valid. */
@@ -860,7 +881,7 @@ do_crypt (LPVOID arg)
       log_debug ("%s:%s: canceling crypt for: %p already deleted",
                  SRCNAME, __func__, arg);
       gpgrt_lock_unlock (&dtor_lock);
-      return 0;
+      TRETURN 0;
     }
   if (mail->cryptState () != Mail::NeedsActualCrypt)
     {
@@ -868,7 +889,7 @@ do_crypt (LPVOID arg)
                  SRCNAME, __func__, mail->cryptState ());
       mail->setWindowEnabled_o (true);
       gpgrt_lock_unlock (&dtor_lock);
-      return -1;
+      TRETURN -1;
     }
 
   /* This takes a shared ptr of crypter. So the crypter is
@@ -882,7 +903,7 @@ do_crypt (LPVOID arg)
                  SRCNAME, __func__, arg);
       gpgrt_lock_unlock (&parser_lock);
       mail->setWindowEnabled_o (true);
-      return -1;
+      TRETURN -1;
     }
 
   GpgME::Error err;
@@ -894,7 +915,7 @@ do_crypt (LPVOID arg)
       log_debug ("%s:%s: aborting crypt for: %p already deleted",
                  SRCNAME, __func__, arg);
       gpgrt_lock_unlock (&dtor_lock);
-      return 0;
+      TRETURN 0;
     }
 
   mail->setWindowEnabled_o (true);
@@ -927,7 +948,7 @@ do_crypt (LPVOID arg)
       mail->resetCrypter ();
       crypter = nullptr;
       gpgrt_lock_unlock (&dtor_lock);
-      return rc;
+      TRETURN rc;
     }
 
   if (!mail->isAsyncCryptDisabled ())
@@ -967,35 +988,37 @@ do_crypt (LPVOID arg)
   do_in_ui_thread_async (BRING_TO_FRONT, nullptr, 250);
   log_debug ("%s:%s: crypto thread for %p finished",
              SRCNAME, __func__, arg);
-  return 0;
+  TRETURN 0;
 }
 
 bool
 Mail::isCryptoMail () const
 {
+  TSTART;
   if (m_type == MSGTYPE_UNKNOWN || m_type == MSGTYPE_GPGOL ||
       m_type == MSGTYPE_SMIME)
     {
       /* Not a message for us. */
-      return false;
+      TRETURN false;
     }
-  return true;
+  TRETURN true;
 }
 
 int
 Mail::decryptVerify_o ()
 {
+  TSTART;
   if (!isCryptoMail ())
     {
       log_debug ("%s:%s: Decrypt Verify for non crypto mail: %p.",
                  SRCNAME, __func__, m_mailitem);
-      return 0;
+      TRETURN 0;
     }
   if (m_needs_wipe)
     {
       log_error ("%s:%s: Decrypt verify called for msg that needs wipe: %p",
                  SRCNAME, __func__, m_mailitem);
-      return 1;
+      TRETURN 1;
     }
   setUUID_o ();
   m_processed = true;
@@ -1022,7 +1045,7 @@ Mail::decryptVerify_o ()
     {
       log_error ("%s:%s: Failed to format placeholder.",
                  SRCNAME, __func__);
-      return 1;
+      TRETURN 1;
     }
 
   if (opt.prefer_html)
@@ -1031,7 +1054,7 @@ Mail::decryptVerify_o ()
       if (!tmp)
         {
           TRACEPOINT;
-          return 1;
+          TRETURN 1;
         }
       m_orig_body = tmp;
       xfree (tmp);
@@ -1047,7 +1070,7 @@ Mail::decryptVerify_o ()
       if (!tmp)
         {
           TRACEPOINT;
-          return 1;
+          TRETURN 1;
         }
       m_orig_body = tmp;
       xfree (tmp);
@@ -1066,14 +1089,14 @@ Mail::decryptVerify_o ()
   if (m_type == MSGTYPE_GPGOL_WKS_CONFIRMATION)
     {
       WKSHelper::instance ()->handle_confirmation_read (this, cipherstream);
-      return 0;
+      TRETURN 0;
     }
 
   if (!cipherstream)
     {
       log_debug ("%s:%s: Failed to get cipherstream.",
                  SRCNAME, __func__);
-      return 1;
+      TRETURN 1;
     }
 
   m_parser = std::shared_ptr <ParseController> (new ParseController (cipherstream, m_type));
@@ -1092,26 +1115,29 @@ Mail::decryptVerify_o ()
     }
   CloseHandle (parser_thread);
 
-  return 0;
+  TRETURN 0;
 }
 
 void find_and_replace(std::string& source, const std::string &find,
                       const std::string &replace)
 {
+  TSTART;
   for(std::string::size_type i = 0; (i = source.find(find, i)) != std::string::npos;)
     {
       source.replace(i, find.length(), replace);
       i += replace.length();
     }
+  TRETURN;
 }
 
 void
 Mail::updateBody_o ()
 {
+  TSTART;
   if (!m_parser)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   const auto error = m_parser->get_formatted_error ();
@@ -1146,7 +1172,7 @@ Mail::updateBody_o ()
                          SRCNAME, __func__, error.c_str ());
             }
         }
-      return;
+      TRETURN;
     }
   if (m_verify_result.error())
     {
@@ -1168,7 +1194,7 @@ Mail::updateBody_o ()
                          SRCNAME, __func__);
             }
         }
-      return;
+      TRETURN;
     }
   // No need to carry body anymore
   m_orig_body = std::string();
@@ -1205,7 +1231,7 @@ Mail::updateBody_o ()
                          SRCNAME, __func__);
             }
 
-          return;
+          TRETURN;
         }
       else if (!body.empty())
         {
@@ -1278,7 +1304,7 @@ Mail::updateBody_o ()
                 }
               else
                 {
-                  return;
+                  TRETURN;
                 }
             }
         }
@@ -1324,7 +1350,7 @@ Mail::updateBody_o ()
       log_error ("%s:%s: Failed to modify body of item.",
                  SRCNAME, __func__);
     }
-  return;
+  TRETURN;
 }
 
 static int parsed_count;
@@ -1332,6 +1358,7 @@ static int parsed_count;
 void
 Mail::parsing_done()
 {
+  TSTART;
   TRACEPOINT;
   log_oom ("Mail %p Parsing done for parser num %i: %p",
                  this, parsed_count++, m_parser.get());
@@ -1356,7 +1383,7 @@ Mail::parsing_done()
          */
       log_error ("%s:%s: No parser obj. For mail: %p",
                  SRCNAME, __func__, this);
-      return;
+      TRETURN;
     }
   /* Store the results. */
   m_decrypt_result = m_parser->decrypt_result ();
@@ -1431,29 +1458,30 @@ Mail::parsing_done()
   CloseHandle(CreateThread (NULL, 0, delayed_invalidate_ui, (LPVOID) 300, 0,
                             NULL));
   TRACEPOINT;
-  return;
+  TRETURN;
 }
 
 int
 Mail::encryptSignStart_o ()
 {
+  TSTART;
   if (m_crypt_state != NeedsActualCrypt)
     {
       log_debug ("%s:%s: invalid state %i",
                  SRCNAME, __func__, m_crypt_state);
-      return -1;
+      TRETURN -1;
     }
   int flags = 0;
   if (!needs_crypto_m ())
     {
-      return 0;
+      TRETURN 0;
     }
   LPMESSAGE message = get_oom_base_message (m_mailitem);
   if (!message)
     {
       log_error ("%s:%s: Failed to get base message.",
                  SRCNAME, __func__);
-      return -1;
+      TRETURN -1;
     }
   flags = get_gpgol_draft_info_flags (message);
   gpgol_release (message);
@@ -1482,7 +1510,7 @@ Mail::encryptSignStart_o ()
                        MB_ICONINFORMATION|MB_OK);
           xfree (msg);
           xfree (w_title);
-          return -1;
+          TRETURN -1;
         }
     }
 
@@ -1501,7 +1529,7 @@ Mail::encryptSignStart_o ()
       log_error ("%s:%s: Crypter for mail %p failed to collect data.",
                  SRCNAME, __func__, this);
       setWindowEnabled_o (true);
-      return -1;
+      TRETURN -1;
     }
 
   if (!m_async_crypt_disabled)
@@ -1514,31 +1542,33 @@ Mail::encryptSignStart_o ()
     {
       do_crypt (this);
     }
-  return 0;
+  TRETURN 0;
 }
 
 int
 Mail::needs_crypto_m () const
 {
+  TSTART;
   LPMESSAGE message = get_oom_message (m_mailitem);
   int ret;
   if (!message)
     {
       log_error ("%s:%s: Failed to get message.",
                  SRCNAME, __func__);
-      return false;
+      TRETURN false;
     }
   ret = get_gpgol_draft_info_flags (message);
   gpgol_release(message);
-  return ret;
+  TRETURN ret;
 }
 
 int
 Mail::wipe_o (bool force)
 {
+  TSTART;
   if (!m_needs_wipe && !force)
     {
-      return 0;
+      TRETURN 0;
     }
   log_debug ("%s:%s: Removing plaintext from mailitem: %p.",
              SRCNAME, __func__, m_mailitem);
@@ -1550,21 +1580,22 @@ Mail::wipe_o (bool force)
         {
           log_debug ("%s:%s: Failed to wipe mailitem: %p.",
                      SRCNAME, __func__, m_mailitem);
-          return -1;
+          TRETURN -1;
         }
-      return -1;
+      TRETURN -1;
     }
   else
     {
       put_oom_string (m_mailitem, "Body", "");
     }
   m_needs_wipe = false;
-  return 0;
+  TRETURN 0;
 }
 
 int
 Mail::updateOOMData_o ()
 {
+  TSTART;
   char *buf = nullptr;
   log_debug ("%s:%s", SRCNAME, __func__);
 
@@ -1634,30 +1665,33 @@ Mail::updateOOMData_o ()
     {
       log_debug ("%s:%s: All fallbacks failed.",
                  SRCNAME, __func__);
-      return -1;
+      TRETURN -1;
     }
   m_sender = buf;
   xfree (buf);
-  return 0;
+  TRETURN 0;
 }
 
 std::string
 Mail::getSender_o ()
 {
+  TSTART;
   if (m_sender.empty())
     updateOOMData_o ();
-  return m_sender;
+  TRETURN m_sender;
 }
 
 std::string
 Mail::getSender () const
 {
-  return m_sender;
+  TSTART;
+  TRETURN m_sender;
 }
 
 int
 Mail::closeAllMails_o ()
 {
+  TSTART;
   int err = 0;
 
   /* Detach Folder sinks */
@@ -1700,11 +1734,12 @@ Mail::closeAllMails_o ()
             }
         }
     }
-  return err;
+  TRETURN err;
 }
 int
 Mail::revertAllMails_o ()
 {
+  TSTART;
   int err = 0;
   std::map<LPDISPATCH, Mail *>::iterator it;
   gpgrt_lock_lock (&mail_map_lock);
@@ -1726,12 +1761,13 @@ Mail::revertAllMails_o ()
         }
     }
   gpgrt_lock_unlock (&mail_map_lock);
-  return err;
+  TRETURN err;
 }
 
 int
 Mail::wipeAllMails_o ()
 {
+  TSTART;
   int err = 0;
   std::map<LPDISPATCH, Mail *>::iterator it;
   gpgrt_lock_lock (&mail_map_lock);
@@ -1744,16 +1780,17 @@ Mail::wipeAllMails_o ()
         }
     }
   gpgrt_lock_unlock (&mail_map_lock);
-  return err;
+  TRETURN err;
 }
 
 int
 Mail::revert_o ()
 {
+  TSTART;
   int err = 0;
   if (!m_processed)
     {
-      return 0;
+      TRETURN 0;
     }
 
   m_disable_att_remove_warning = true;
@@ -1763,24 +1800,25 @@ Mail::revert_o ()
     {
       log_error ("%s:%s: Message revert failed falling back to wipe.",
                  SRCNAME, __func__);
-      return wipe_o ();
+      TRETURN wipe_o ();
     }
   /* We need to reprocess the mail next time around. */
   m_processed = false;
   m_needs_wipe = false;
   m_disable_att_remove_warning = false;
-  return 0;
+  TRETURN 0;
 }
 
 bool
 Mail::isSMIME_m ()
 {
+  TSTART;
   msgtype_t msgtype;
   LPMESSAGE message;
 
   if (m_is_smime_checked)
     {
-      return m_is_smime;
+      TRETURN m_is_smime;
     }
 
   message = get_oom_message (m_mailitem);
@@ -1789,7 +1827,7 @@ Mail::isSMIME_m ()
     {
       log_error ("%s:%s: No message?",
                  SRCNAME, __func__);
-      return false;
+      TRETURN false;
     }
 
   msgtype = mapi_get_message_type (message);
@@ -1817,35 +1855,41 @@ Mail::isSMIME_m ()
     }
   gpgol_release (message);
   m_is_smime_checked  = true;
-  return m_is_smime;
+  TRETURN m_is_smime;
 }
 
 static std::string
 get_string_o (LPDISPATCH item, const char *str)
 {
+  TSTART;
   char *buf = get_oom_string (item, str);
   if (!buf)
-    return std::string();
+    {
+      TRETURN std::string();
+    }
   std::string ret = buf;
   xfree (buf);
-  return ret;
+  TRETURN ret;
 }
 
 std::string
 Mail::getSubject_o () const
 {
-  return get_string_o (m_mailitem, "Subject");
+  TSTART;
+  TRETURN get_string_o (m_mailitem, "Subject");
 }
 
 std::string
 Mail::getBody_o () const
 {
-  return get_string_o (m_mailitem, "Body");
+  TSTART;
+  TRETURN get_string_o (m_mailitem, "Body");
 }
 
 std::vector<std::string>
 Mail::getRecipients_o () const
 {
+  TSTART;
   LPDISPATCH recipients = get_oom_object (m_mailitem, "Recipients");
   if (!recipients)
     {
@@ -1863,12 +1907,13 @@ Mail::getRecipients_o () const
 
     }
 
-  return ret;
+  TRETURN ret;
 }
 
 int
 Mail::closeInspector_o (Mail *mail)
 {
+  TSTART;
   LPDISPATCH inspector = get_oom_object (mail->item(), "GetInspector");
   HRESULT hr;
   DISPID dispid;
@@ -1876,7 +1921,7 @@ Mail::closeInspector_o (Mail *mail)
     {
       log_debug ("%s:%s: No inspector.",
                  SRCNAME, __func__);
-      return -1;
+      TRETURN -1;
     }
 
   dispid = lookup_oom_dispid (inspector, "Close");
@@ -1899,17 +1944,18 @@ Mail::closeInspector_o (Mail *mail)
           log_debug ("%s:%s: Failed to close inspector: %#lx",
                      SRCNAME, __func__, hr);
           gpgol_release (inspector);
-          return -1;
+          TRETURN -1;
         }
     }
   gpgol_release (inspector);
-  return 0;
+  TRETURN 0;
 }
 
 /* static */
 int
 Mail::close (Mail *mail)
 {
+  TSTART;
   VARIANT aVariant[1];
   DISPPARAMS dispparams;
 
@@ -1925,38 +1971,42 @@ Mail::close (Mail *mail)
   int rc = invoke_oom_method_with_parms (mail->item(), "Close",
                                        NULL, &dispparams);
 
-  log_oom ("%s:%s: Returned from close",
+  log_oom ("%s:%s: returned from close",
                  SRCNAME, __func__);
-  return rc;
+  TRETURN rc;
 }
 
 void
 Mail::setCloseTriggered (bool value)
 {
+  TSTART;
   m_close_triggered = value;
+  TRETURN;
 }
 
 bool
 Mail::getCloseTriggered () const
 {
-  return m_close_triggered;
+  TSTART;
+  TRETURN m_close_triggered;
 }
 
 static const UserID
 get_uid_for_sender (const Key &k, const char *sender)
 {
+  TSTART;
   UserID ret;
 
   if (!sender)
     {
-      return ret;
+      TRETURN ret;
     }
 
   if (!k.numUserIDs())
     {
       log_debug ("%s:%s: Key without uids",
                  SRCNAME, __func__);
-      return ret;
+      TRETURN ret;
     }
 
   for (const auto uid: k.userIDs())
@@ -1983,32 +2033,33 @@ get_uid_for_sender (const Key &k, const char *sender)
           ret = uid;
         }
     }
-  return ret;
+  TRETURN ret;
 }
 
 void
 Mail::updateSigstate ()
 {
+  TSTART;
   std::string sender = getSender ();
 
   if (sender.empty())
     {
       log_error ("%s:%s:%i", SRCNAME, __func__, __LINE__);
-      return;
+      TRETURN;
     }
 
   if (m_verify_result.isNull())
     {
       log_debug ("%s:%s: No verify result.",
                  SRCNAME, __func__);
-      return;
+      TRETURN;
     }
 
   if (m_verify_result.error())
     {
       log_debug ("%s:%s: verify error.",
                  SRCNAME, __func__);
-      return;
+      TRETURN;
     }
 
   for (const auto sig: m_verify_result.signatures())
@@ -2065,28 +2116,31 @@ Mail::updateSigstate ()
                  SRCNAME, __func__, m_uid.validity(), m_uid.origin());
       m_sig = sig;
       m_is_valid = true;
-      return;
+      TRETURN;
     }
 
   log_debug ("%s:%s: No signature with enough trust. Using first",
              SRCNAME, __func__);
   m_sig = m_verify_result.signature(0);
-  return;
+  TRETURN;
 }
 
 bool
 Mail::isValidSig () const
 {
-   return m_is_valid;
+  TSTART;
+  TRETURN m_is_valid;
 }
 
 void
 Mail::removeCategories_o ()
 {
+  TSTART;
   const char *decCategory = _("GpgOL: Encrypted Message");
   const char *verifyCategory = _("GpgOL: Trusted Sender Address");
   remove_category (m_mailitem, decCategory);
   remove_category (m_mailitem, verifyCategory);
+  TRETURN;
 }
 
 /* Now for some tasty hack: Outlook sometimes does
@@ -2101,6 +2155,7 @@ Mail::removeCategories_o ()
 static void
 resize_active_window ()
 {
+  TSTART;
   HWND wnd = get_active_hwnd ();
   static std::vector<HWND> resized_windows;
   if(std::find(resized_windows.begin(), resized_windows.end(), wnd) != resized_windows.end()) {
@@ -2108,19 +2163,19 @@ resize_active_window ()
          need to do this once per view of the explorer. So for now this might
          break but we reduce the flicker. A better solution would be to find
          the current view and track that. */
-      return;
+      TRETURN;
   }
 
   if (!wnd)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
   RECT oldpos;
   if (!GetWindowRect (wnd, &oldpos))
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   if (!SetWindowPos (wnd, nullptr,
@@ -2136,7 +2191,7 @@ resize_active_window ()
                      (int)oldpos.bottom - oldpos.top, 0))
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   if (!SetWindowPos (wnd, nullptr,
@@ -2146,14 +2201,16 @@ resize_active_window ()
                      (int)oldpos.bottom - oldpos.top, 0))
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
   resized_windows.push_back(wnd);
+  TRETURN;
 }
 
 void
 Mail::updateCategories_o ()
 {
+  TSTART;
   const char *decCategory = _("GpgOL: Encrypted Message");
   const char *verifyCategory = _("GpgOL: Trusted Sender Address");
   if (isValidSig ())
@@ -2178,24 +2235,27 @@ Mail::updateCategories_o ()
 
   resize_active_window();
 
-  return;
+  TRETURN;
 }
 
 bool
 Mail::isSigned () const
 {
-  return m_verify_result.numSignatures() > 0;
+  TSTART;
+  TRETURN m_verify_result.numSignatures() > 0;
 }
 
 bool
 Mail::isEncrypted () const
 {
-  return !m_decrypt_result.isNull();
+  TSTART;
+  TRETURN !m_decrypt_result.isNull();
 }
 
 int
 Mail::setUUID_o ()
 {
+  TSTART;
   char *uuid;
   if (!m_uuid.empty())
     {
@@ -2219,7 +2279,7 @@ Mail::setUUID_o ()
     {
       log_debug ("%s:%s: Failed to get/set uuid for %p",
                  SRCNAME, __func__, m_mailitem);
-      return -1;
+      TRETURN -1;
     }
   if (m_uuid.empty())
     {
@@ -2255,12 +2315,12 @@ Mail::setUUID_o ()
                  m_uuid.c_str());
     }
   xfree (uuid);
-  return 0;
+  TRETURN 0;
 }
 
-/* Returns 2 if the userid is ultimately trusted.
+/* TRETURNs 2 if the userid is ultimately trusted.
 
-   Returns 1 if the userid is fully trusted but has
+   TRETURNs 1 if the userid is fully trusted but has
    a signature by a key for which we have a secret
    and which is ultimately trusted. (Direct trust)
 
@@ -2268,13 +2328,14 @@ Mail::setUUID_o ()
 static int
 level_4_check (const UserID &uid)
 {
+  TSTART;
   if (uid.isNull())
     {
-      return 0;
+      TRETURN 0;
     }
   if (uid.validity () == UserID::Validity::Ultimate)
     {
-      return 2;
+      TRETURN 2;
     }
   if (uid.validity () == UserID::Validity::Full)
     {
@@ -2331,48 +2392,49 @@ level_4_check (const UserID &uid)
                                  SRCNAME, __func__, anonstr (signer_uid_str),
                                  anonstr (sig_uid_str),
                                  anonstr (secKeyID));
-                      return 1;
+                      TRETURN 1;
                     }
                 }
             }
         }
     }
-  return 0;
+  TRETURN 0;
 }
 
 std::string
 Mail::getCryptoSummary () const
 {
+  TSTART;
   const int level = get_signature_level ();
 
   bool enc = isEncrypted ();
   if (level == 4 && enc)
     {
-      return _("Security Level 4");
+      TRETURN _("Security Level 4");
     }
   if (level == 4)
     {
-      return _("Trust Level 4");
+      TRETURN _("Trust Level 4");
     }
   if (level == 3 && enc)
     {
-      return _("Security Level 3");
+      TRETURN _("Security Level 3");
     }
   if (level == 3)
     {
-      return _("Trust Level 3");
+      TRETURN _("Trust Level 3");
     }
   if (level == 2 && enc)
     {
-      return _("Security Level 2");
+      TRETURN _("Security Level 2");
     }
   if (level == 2)
     {
-      return _("Trust Level 2");
+      TRETURN _("Trust Level 2");
     }
   if (enc)
     {
-      return _("Encrypted");
+      TRETURN _("Encrypted");
     }
   if (isSigned ())
     {
@@ -2381,37 +2443,39 @@ Mail::getCryptoSummary () const
          could have signed this. So we avoid the label
          "signed" here as this word already implies some
          security. */
-      return _("Insecure");
+      TRETURN _("Insecure");
     }
-  return _("Insecure");
+  TRETURN _("Insecure");
 }
 
 std::string
 Mail::getCryptoOneLine () const
 {
+  TSTART;
   bool sig = isSigned ();
   bool enc = isEncrypted ();
   if (sig || enc)
     {
       if (sig && enc)
         {
-          return _("Signed and encrypted message");
+          TRETURN _("Signed and encrypted message");
         }
       else if (sig)
         {
-          return _("Signed message");
+          TRETURN _("Signed message");
         }
       else if (enc)
         {
-          return _("Encrypted message");
+          TRETURN _("Encrypted message");
         }
     }
-  return _("Insecure message");
+  TRETURN _("Insecure message");
 }
 
 std::string
 Mail::getCryptoDetails_o ()
 {
+  TSTART;
   std::string message;
 
   /* No signature with keys but error */
@@ -2423,12 +2487,12 @@ Mail::getCryptoDetails_o ()
       message += _("The message was signed but the verification failed with:");
       message += "\n";
       message += m_verify_result.error().asString();
-      return message;
+      TRETURN message;
     }
   /* No crypo, what are we doing here? */
   if (!isEncrypted () && !isSigned ())
     {
-      return _("You cannot be sure who sent, "
+      TRETURN _("You cannot be sure who sent, "
                "modified and read the message in transit.");
     }
   /* Handle encrypt only */
@@ -2448,7 +2512,7 @@ Mail::getCryptoDetails_o ()
       message += "\n\n";
       message += _("You cannot be sure who sent the message because "
                    "it is not signed.");
-      return message;
+      TRETURN message;
     }
 
   bool keyFound = true;
@@ -2485,7 +2549,7 @@ Mail::getCryptoDetails_o ()
         {
           log_error ("%s:%s:%i BUG: Invalid sigstate.",
                      SRCNAME, __func__, __LINE__);
-          return message;
+          TRETURN message;
         }
     }
   else if (level == 3 && isOpenPGP)
@@ -2701,72 +2765,76 @@ Mail::getCryptoDetails_o ()
       message +=  isOpenPGP ? _("Click here to search the key on the configured keyserver.") :
                               _("Click here to search the certificate on the configured X509 keyserver.");
     }
-  return message;
+  TRETURN message;
 }
 
 int
 Mail::get_signature_level () const
 {
+  TSTART;
   if (!m_is_signed)
     {
-      return 0;
+      TRETURN 0;
     }
 
   if (m_uid.isNull ())
     {
       /* No m_uid matches our sender. */
-      return 0;
+      TRETURN 0;
     }
 
   if (m_is_valid && (m_uid.validity () == UserID::Validity::Ultimate ||
       (m_uid.validity () == UserID::Validity::Full &&
       level_4_check (m_uid))) && (!in_de_vs_mode () || m_sig.isDeVs()))
     {
-      return 4;
+      TRETURN 4;
     }
   if (m_is_valid && m_uid.validity () == UserID::Validity::Full &&
       (!in_de_vs_mode () || m_sig.isDeVs()))
     {
-      return 3;
+      TRETURN 3;
     }
   if (m_is_valid)
     {
-      return 2;
+      TRETURN 2;
     }
   if (m_sig.validity() == Signature::Validity::Marginal)
     {
-      return 1;
+      TRETURN 1;
     }
   if (m_sig.summary() & Signature::Summary::TofuConflict ||
       m_uid.tofuInfo().validity() == TofuInfo::Conflict)
     {
-      return 0;
+      TRETURN 0;
     }
-  return 0;
+  TRETURN 0;
 }
 
 int
 Mail::getCryptoIconID () const
 {
+  TSTART;
   int level = get_signature_level ();
   int offset = isEncrypted () ? ENCRYPT_ICON_OFFSET : 0;
-  return IDI_LEVEL_0 + level + offset;
+  TRETURN IDI_LEVEL_0 + level + offset;
 }
 
 const char*
 Mail::getSigFpr () const
 {
+  TSTART;
   if (!m_is_signed || m_sig.isNull())
     {
-      return nullptr;
+      TRETURN nullptr;
     }
-  return m_sig.fingerprint();
+  TRETURN m_sig.fingerprint();
 }
 
 /** Try to locate the keys for all recipients */
 void
 Mail::locateKeys_o ()
 {
+  TSTART;
   if (m_locate_in_progress)
     {
       /** XXX
@@ -2791,7 +2859,7 @@ Mail::locateKeys_o ()
         */
       log_debug ("%s:%s: Locate for %p already in progress.",
                  SRCNAME, __func__, this);
-      return;
+      TRETURN;
     }
   m_locate_in_progress = true;
 
@@ -2809,74 +2877,86 @@ Mail::locateKeys_o ()
   autosecureCheck ();
 
   m_locate_in_progress = false;
+  TRETURN;
 }
 
 bool
 Mail::isHTMLAlternative () const
 {
-  return m_is_html_alternative;
+  TSTART;
+  TRETURN m_is_html_alternative;
 }
 
 char *
 Mail::takeCachedHTMLBody ()
 {
+  TSTART;
   char *ret = m_cached_html_body;
   m_cached_html_body = nullptr;
-  return ret;
+  TRETURN ret;
 }
 
 char *
 Mail::takeCachedPlainBody ()
 {
+  TSTART;
   char *ret = m_cached_plain_body;
   m_cached_plain_body = nullptr;
-  return ret;
+  TRETURN ret;
 }
 
 int
 Mail::getCryptoFlags () const
 {
-  return m_crypto_flags;
+  TSTART;
+  TRETURN m_crypto_flags;
 }
 
 void
 Mail::setNeedsEncrypt (bool value)
 {
+  TSTART;
   m_needs_encrypt = value;
+  TRETURN;
 }
 
 bool
 Mail::getNeedsEncrypt () const
 {
-  return m_needs_encrypt;
+  TSTART;
+  TRETURN m_needs_encrypt;
 }
 
 std::vector<std::string>
 Mail::getCachedRecipients ()
 {
-  return m_cached_recipients;
+  TSTART;
+  TRETURN m_cached_recipients;
 }
 
 void
 Mail::appendToInlineBody (const std::string &data)
 {
+  TSTART;
   m_inline_body += data;
+  TRETURN;
 }
 
 int
 Mail::inlineBodyToBody_o ()
 {
+  TSTART;
   if (!m_crypter)
     {
       log_error ("%s:%s: No crypter.",
                  SRCNAME, __func__);
-      return -1;
+      TRETURN -1;
     }
 
   const auto body = m_crypter->get_inline_data ();
   if (body.empty())
     {
-      return 0;
+      TRETURN 0;
     }
 
   /* For inline we always work with UTF-8 */
@@ -2884,19 +2964,20 @@ Mail::inlineBodyToBody_o ()
 
   int ret = put_oom_string (m_mailitem, "Body",
                             body.c_str ());
-  return ret;
+  TRETURN ret;
 }
 
 void
 Mail::updateCryptMAPI_m ()
 {
+  TSTART;
   log_debug ("%s:%s: Update crypt mapi",
              SRCNAME, __func__);
   if (m_crypt_state != NeedsUpdateInMAPI)
     {
       log_debug ("%s:%s: invalid state %i",
                  SRCNAME, __func__, m_crypt_state);
-      return;
+      TRETURN;
     }
   if (!m_crypter)
     {
@@ -2913,7 +2994,7 @@ Mail::updateCryptMAPI_m ()
           log_error ("%s:%s: No crypter.",
                      SRCNAME, __func__);
           m_crypt_state = NoCryptMail;
-          return;
+          TRETURN;
         }
     }
 
@@ -2934,6 +3015,7 @@ Mail::updateCryptMAPI_m ()
       // We don't need the crypter anymore.
       resetCrypter ();
     }
+  TRETURN;
 }
 
 /** Checks in OOM if the body is either
@@ -2943,6 +3025,7 @@ Mail::updateCryptMAPI_m ()
 static std::pair<bool, bool>
 has_crypt_or_empty_body_oom (Mail *mail)
 {
+  TSTART;
   auto body = mail->getBody_o ();
   std::pair<bool, bool> ret;
   ret.first = false;
@@ -2951,7 +3034,7 @@ has_crypt_or_empty_body_oom (Mail *mail)
   if (body.size() > 10 && !strncmp (body.c_str(), "-----BEGIN", 10))
     {
       ret.first = true;
-      return ret;
+      TRETURN ret;
     }
   if (!body.size())
     {
@@ -2962,12 +3045,13 @@ has_crypt_or_empty_body_oom (Mail *mail)
       log_data ("%s:%s: Body found in %p : \"%s\"",
                        SRCNAME, __func__, mail, body.c_str ());
     }
-  return ret;
+  TRETURN ret;
 }
 
 void
 Mail::updateCryptOOM_o ()
 {
+  TSTART;
   log_debug ("%s:%s: Update crypt oom for %p",
              SRCNAME, __func__, this);
   if (m_crypt_state != NeedsUpdateInOOM)
@@ -2975,7 +3059,7 @@ Mail::updateCryptOOM_o ()
       log_debug ("%s:%s: invalid state %i",
                  SRCNAME, __func__, m_crypt_state);
       resetCrypter ();
-      return;
+      TRETURN;
     }
 
   if (getDoPGPInline ())
@@ -2986,7 +3070,7 @@ Mail::updateCryptOOM_o ()
                      SRCNAME, __func__, this);
           gpgol_bug (get_active_hwnd(), ERR_INLINE_BODY_TO_BODY);
           m_crypt_state = NoCryptMail;
-          return;
+          TRETURN;
         }
     }
 
@@ -3017,7 +3101,7 @@ Mail::updateCryptOOM_o ()
       log_debug ("%s:%s: Looks like inline body. You can pass %p.",
                  SRCNAME, __func__, this);
       m_crypt_state = WantsSendInline;
-      return;
+      TRETURN;
     }
 
   // We are in MIME land. Wipe the body.
@@ -3036,15 +3120,16 @@ Mail::updateCryptOOM_o ()
       xfree (msg);
       xfree (title);
       m_crypt_state = NoCryptMail;
-      return;
+      TRETURN;
     }
   m_crypt_state = NeedsSecondAfterWrite;
-  return;
+  TRETURN;
 }
 
 void
 Mail::setWindowEnabled_o (bool value)
 {
+  TSTART;
   if (!value)
     {
       m_window = get_active_hwnd ();
@@ -3053,17 +3138,19 @@ Mail::setWindowEnabled_o (bool value)
              SRCNAME, __func__, m_window, value);
 
   EnableWindow (m_window, value ? TRUE : FALSE);
+  TRETURN;
 }
 
 bool
 Mail::check_inline_response ()
 {
+  TSTART;
   /* Async sending is known to cause instabilities. So we keep
      a hidden option to disable it. */
   if (opt.sync_enc)
     {
       m_async_crypt_disabled = true;
-      return m_async_crypt_disabled;
+      TRETURN m_async_crypt_disabled;
     }
 
   m_async_crypt_disabled = false;
@@ -3117,7 +3204,7 @@ Mail::check_inline_response ()
           log_debug ("%s:%s: Detected attachments. "
                      "Disabling async crypt due to T4131.",
                      SRCNAME, __func__);
-          return m_async_crypt_disabled;
+          TRETURN m_async_crypt_disabled;
         }
    }
 
@@ -3125,7 +3212,7 @@ Mail::check_inline_response ()
   if (!app)
     {
       TRACEPOINT;
-      return false;
+      TRETURN false;
     }
 
   LPDISPATCH explorer = get_oom_object (app, "ActiveExplorer");
@@ -3133,7 +3220,7 @@ Mail::check_inline_response ()
   if (!explorer)
     {
       TRACEPOINT;
-      return false;
+      TRETURN false;
     }
 
   LPDISPATCH inlineResponse = get_oom_object (explorer, "ActiveInlineResponse");
@@ -3141,7 +3228,7 @@ Mail::check_inline_response ()
 
   if (!inlineResponse)
     {
-      return false;
+      TRETURN false;
     }
 
   // We have inline response
@@ -3160,31 +3247,35 @@ Mail::check_inline_response ()
     }
   xfree (inlineSubject);
 
-  return m_async_crypt_disabled;
+  TRETURN m_async_crypt_disabled;
 }
 
 // static
 Mail *
 Mail::getLastMail ()
 {
+  TSTART;
   if (!s_last_mail || !isValidPtr (s_last_mail))
     {
       s_last_mail = nullptr;
     }
-  return s_last_mail;
+  TRETURN s_last_mail;
 }
 
 // static
 void
 Mail::clearLastMail ()
 {
+  TSTART;
   s_last_mail = nullptr;
+  TRETURN;
 }
 
 // static
 void
 Mail::locateAllCryptoRecipients_o ()
 {
+  TSTART;
   gpgrt_lock_lock (&mail_map_lock);
   std::map<LPDISPATCH, Mail *>::iterator it;
   for (it = s_mail_map.begin(); it != s_mail_map.end(); ++it)
@@ -3195,17 +3286,19 @@ Mail::locateAllCryptoRecipients_o ()
         }
     }
   gpgrt_lock_unlock (&mail_map_lock);
+  TRETURN;
 }
 
 int
 Mail::removeAllAttachments_o ()
 {
+  TSTART;
   int ret = 0;
   LPDISPATCH attachments = get_oom_object (m_mailitem, "Attachments");
   if (!attachments)
     {
       TRACEPOINT;
-      return 0;
+      TRETURN 0;
     }
   int count = get_oom_int (attachments, "Count");
   LPDISPATCH to_delete[count];
@@ -3239,17 +3332,18 @@ Mail::removeAllAttachments_o ()
         }
       gpgol_release (attachment);
     }
-  return ret;
+  TRETURN ret;
 }
 
 int
 Mail::removeOurAttachments_o ()
 {
+  TSTART;
   LPDISPATCH attachments = get_oom_object (m_mailitem, "Attachments");
   if (!attachments)
     {
       TRACEPOINT;
-      return 0;
+      TRETURN 0;
     }
   int count = get_oom_int (attachments, "Count");
   LPDISPATCH to_delete[count];
@@ -3299,7 +3393,7 @@ Mail::removeOurAttachments_o ()
         }
       gpgol_release (attachment);
     }
-  return ret;
+  TRETURN ret;
 }
 
 /* We are very verbose because if we fail it might mean
@@ -3307,20 +3401,21 @@ Mail::removeOurAttachments_o ()
 bool
 Mail::hasCryptedOrEmptyBody_o ()
 {
+  TSTART;
   const auto pair = has_crypt_or_empty_body_oom (this);
 
   if (pair.first /* encrypted marker */)
     {
       log_debug ("%s:%s: Crypt Marker detected in OOM body. Return true %p.",
                  SRCNAME, __func__, this);
-      return true;
+      TRETURN true;
     }
 
   if (!pair.second)
     {
       log_debug ("%s:%s: Unexpected content detected. Return false %p.",
                  SRCNAME, __func__, this);
-      return false;
+      TRETURN false;
     }
 
   // Pair second == true (is empty) can happen on OOM error.
@@ -3331,7 +3426,7 @@ Mail::hasCryptedOrEmptyBody_o ()
         {
           gpgol_release (message);
         }
-      return true;
+      TRETURN true;
     }
 
   size_t r_nbytes = 0;
@@ -3344,7 +3439,7 @@ Mail::hasCryptedOrEmptyBody_o ()
       xfree (mapi_body);
       log_debug ("%s:%s: MAPI error or empty message. Return true. %p.",
                  SRCNAME, __func__, this);
-      return true;
+      TRETURN true;
     }
   if (r_nbytes > 10 && !strncmp (mapi_body, "-----BEGIN", 10))
     {
@@ -3352,7 +3447,7 @@ Mail::hasCryptedOrEmptyBody_o ()
       log_debug ("%s:%s: MAPI Crypt marker detected. Return true. %p.",
                  SRCNAME, __func__, this);
       xfree (mapi_body);
-      return true;
+      TRETURN true;
     }
 
   xfree (mapi_body);
@@ -3360,20 +3455,22 @@ Mail::hasCryptedOrEmptyBody_o ()
   log_debug ("%s:%s: Found mapi body. Return false. %p.",
              SRCNAME, __func__, this);
 
-  return false;
+  TRETURN false;
 }
 
 std::string
 Mail::getVerificationResultDump ()
 {
+  TSTART;
   std::stringstream ss;
   ss << m_verify_result;
-  return ss.str();
+  TRETURN ss.str();
 }
 
 void
 Mail::setBlockStatus_m ()
 {
+  TSTART;
   SPropValue prop;
 
   LPMESSAGE message = get_oom_base_message (m_mailitem);
@@ -3389,24 +3486,29 @@ Mail::setBlockStatus_m ()
     }
 
   gpgol_release (message);
-  return;
+  TRETURN;
 }
 
 void
 Mail::setBlockHTML (bool value)
 {
+  TSTART;
   m_block_html = value;
+  TRETURN;
 }
 
 void
 Mail::incrementLocateCount ()
 {
+  TSTART;
   m_locate_count++;
+  TRETURN;
 }
 
 void
 Mail::decrementLocateCount ()
 {
+  TSTART;
   m_locate_count--;
 
   if (m_locate_count < 0)
@@ -3419,15 +3521,17 @@ Mail::decrementLocateCount ()
     {
       autosecureCheck ();
     }
+  TRETURN;
 }
 
 void
 Mail::autosecureCheck ()
 {
+  TSTART;
   if (!opt.autosecure || !opt.autoresolve || m_manual_crypto_opts ||
       m_locate_count)
     {
-      return;
+      TRETURN;
     }
   bool ret = KeyCache::instance()->isMailResolvable (this);
 
@@ -3440,19 +3544,20 @@ Mail::autosecureCheck ()
    * the ui thread. */
   do_in_ui_thread (ret ? DO_AUTO_SECURE : DONT_AUTO_SECURE,
                    this);
-  return;
+  TRETURN;
 }
 
 void
 Mail::setDoAutosecure_m (bool value)
 {
+  TSTART;
   TRACEPOINT;
   LPMESSAGE msg = get_oom_base_message (m_mailitem);
 
   if (!msg)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
   /* We need to set a uuid so that autosecure can
      be disabled manually */
@@ -3473,24 +3578,26 @@ Mail::setDoAutosecure_m (bool value)
       m_first_autosecure_check = false;
       m_manual_crypto_opts = true;
       gpgol_release (msg);
-      return;
+      TRETURN;
     }
   m_first_autosecure_check = false;
   set_gpgol_draft_info_flags (msg, value ? 3 : opt.sign_default ? 2 : 0);
   gpgol_release (msg);
   gpgoladdin_invalidate_ui();
+  TRETURN;
 }
 
 void
 Mail::installFolderEventHandler_o()
 {
+  TSTART;
   TRACEPOINT;
   LPDISPATCH folder = get_oom_object (m_mailitem, "Parent");
 
   if (!folder)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   char *objName = get_object_name (folder);
@@ -3500,7 +3607,7 @@ Mail::installFolderEventHandler_o()
                  SRCNAME, __func__, m_mailitem);
       xfree (objName);
       gpgol_release (folder);
-      return;
+      TRETURN;
     }
   xfree (objName);
 
@@ -3515,7 +3622,7 @@ Mail::installFolderEventHandler_o()
       log_error ("%s:%s: Mail %p parent has no folder path.",
                  SRCNAME, __func__, m_mailitem);
       gpgol_release (folder);
-      return;
+      TRETURN;
     }
 
   std::string strPath (path);
@@ -3531,16 +3638,18 @@ Mail::installFolderEventHandler_o()
 
   /* Folder already registered */
   gpgol_release (folder);
+  TRETURN;
 }
 
 void
 Mail::refCurrentItem()
 {
+  TSTART;
   if (m_currentItemRef)
     {
       log_debug ("%s:%s: Current item multi ref. Bug?",
                  SRCNAME, __func__);
-      return;
+      TRETURN;
     }
   /* This prevents a crash in Outlook 2013 when sending a mail as it
    * would unload too early.
@@ -3548,14 +3657,16 @@ Mail::refCurrentItem()
    * As it didn't crash when the mail was opened in Outlook Spy this
    * mimics that the mail is inspected somewhere else. */
   m_currentItemRef = get_oom_object (m_mailitem, "GetInspector.CurrentItem");
+  TRETURN;
 }
 
 void
 Mail::releaseCurrentItem()
 {
+  TSTART;
   if (!m_currentItemRef)
     {
-      return;
+      TRETURN;
     }
   log_oom ("%s:%s: releasing CurrentItem ref %p",
                  SRCNAME, __func__, m_currentItemRef);
@@ -3563,4 +3674,5 @@ Mail::releaseCurrentItem()
   m_currentItemRef = nullptr;
   /* This can cause our destruction */
   gpgol_release (tmp);
+  TRETURN;
 }
index af4f6b3..31acc40 100644 (file)
@@ -126,6 +126,7 @@ do_delayed_locate (LPVOID arg)
 EVENT_SINK_INVOKE(MailItemEvents)
 {
   USE_INVOKE_ARGS
+  TSTART;
   if (!m_mail)
     {
       m_mail = Mail::getMailForItem (m_object);
@@ -133,7 +134,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
         {
           log_error ("%s:%s: mail event without mail object known. Bug.",
                      SRCNAME, __func__);
-          return S_OK;
+          TRETURN S_OK;
         }
     }
 
@@ -147,14 +148,14 @@ EVENT_SINK_INVOKE(MailItemEvents)
           int draft_flags = 0;
           if (!opt.encrypt_default && !opt.sign_default)
             {
-              return S_OK;
+              TRETURN S_OK;
             }
           LPMESSAGE message = get_oom_base_message (m_object);
           if (!message)
             {
               log_error ("%s:%s: Failed to get message.",
                          SRCNAME, __func__);
-              break;
+              TBREAK;
             }
           if (opt.encrypt_default)
             {
@@ -166,7 +167,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
             }
           set_gpgol_draft_info_flags (message, draft_flags);
           gpgol_release (message);
-          break;
+          TBREAK;
         }
       case BeforeRead:
         {
@@ -177,7 +178,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
               log_error ("%s:%s: Pre process message failed.",
                          SRCNAME, __func__);
             }
-          break;
+          TBREAK;
         }
       case Read:
         {
@@ -190,14 +191,14 @@ EVENT_SINK_INVOKE(MailItemEvents)
               /* Ensure that no wrong sigstatus is shown */
               CloseHandle(CreateThread (NULL, 0, delayed_invalidate_ui, (LPVOID) 300, 0,
                                         NULL));
-              break;
+              TBREAK;
             }
           if (m_mail->setUUID_o ())
             {
               log_debug ("%s:%s: Failed to set uuid.",
                          SRCNAME, __func__);
               delete m_mail; /* deletes this, too */
-              return S_OK;
+              TRETURN S_OK;
             }
           if (m_mail->decryptVerify_o ())
             {
@@ -213,7 +214,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
                          SRCNAME, __func__);
               m_mail->setNeedsSave (true);
             }
-          break;
+          TBREAK;
         }
       case PropertyChange:
         {
@@ -223,7 +224,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
             {
               log_error ("%s:%s: Unexpected params.",
                          SRCNAME, __func__);
-              break;
+              TBREAK;
             }
           const wchar_t *prop_name = parms->rgvarg[0].bstrVal;
           if (!m_mail->isCryptoMail ())
@@ -231,7 +232,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
               if (m_mail->hasOverrideMimeData())
                 {
                   /* This is a mail created by us. Ignore propchanges. */
-                  break;
+                  TBREAK;
                 }
               if (!wcscmp (prop_name, L"To") /* ||
                   !wcscmp (prop_name, L"BCC") ||
@@ -251,7 +252,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
                       CloseHandle(thread);
                     }
                 }
-              break;
+              TBREAK;
             }
           for (const wchar_t **cur = prop_blacklist; *cur; cur++)
             {
@@ -259,7 +260,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
                 {
                   log_oom ("%s:%s: Message %p propchange: %ls discarded.",
                            SRCNAME, __func__, m_object, prop_name);
-                  return S_OK;
+                  TRETURN S_OK;
                 }
             }
           log_oom ("%s:%s: Message %p propchange: %ls.",
@@ -272,12 +273,12 @@ EVENT_SINK_INVOKE(MailItemEvents)
                 {
                   log_debug ("%s:%s: Ignoring SendUsingAccount change for sent %p ",
                              SRCNAME, __func__, m_object);
-                  return S_OK;
+                  TRETURN S_OK;
                 }
               log_debug ("%s:%s: Message %p looks like send again.",
                         SRCNAME, __func__, m_object);
               m_mail->setIsSendAgain (true);
-              return S_OK;
+              TRETURN S_OK;
             }
 
           /* We have tried several scenarios to handle propery changes.
@@ -300,7 +301,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
              the mail was not read by us. */
           if (propchangeWarnShown)
             {
-              return S_OK;
+              TRETURN S_OK;
             }
 
           wchar_t *title = utf8_to_wchar (_("Sorry, that's not possible, yet"));
@@ -319,14 +320,14 @@ EVENT_SINK_INVOKE(MailItemEvents)
           xfree (msg);
           xfree (title);
           propchangeWarnShown = true;
-          return S_OK;
+          TRETURN S_OK;
         }
       case CustomPropertyChange:
         {
           log_oom ("%s:%s: CustomPropertyChange : %p",
                          SRCNAME, __func__, m_mail);
           /* TODO */
-          break;
+          TBREAK;
         }
       case Send:
         {
@@ -351,14 +352,14 @@ EVENT_SINK_INVOKE(MailItemEvents)
             {
              log_debug ("%s:%s: No crypto neccessary. Passing send for %p obj %p",
                         SRCNAME, __func__, m_mail, m_object);
-             break;
+             TBREAK;
             }
 
           if (parms->cArgs != 1 || parms->rgvarg[0].vt != (VT_BOOL | VT_BYREF))
            {
              log_debug ("%s:%s: Uncancellable send event.",
                         SRCNAME, __func__);
-             break;
+             TBREAK;
            }
 
           if (m_mail->cryptState () == Mail::NoCryptMail &&
@@ -394,7 +395,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
                   // the encryption. We cancel send for our asyncness.
                   // Cancel send
                   *(parms->rgvarg[0].pboolVal) = VARIANT_TRUE;
-                  break;
+                  TBREAK;
                 }
               else
                 {
@@ -405,7 +406,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
                                  "Crypto failed or canceled.",
                                  SRCNAME, __func__, m_object, m_mail);
                       *(parms->rgvarg[0].pboolVal) = VARIANT_TRUE;
-                      break;
+                      TBREAK;
                     }
                   // For inline response we can't trigger send programatically
                   // so we do the encryption in sync.
@@ -425,7 +426,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
                       gpgol_bug (m_mail->getWindow (),
                                  ERR_INLINE_BODY_INV_STATE);
                       *(parms->rgvarg[0].pboolVal) = VARIANT_TRUE;
-                      break;
+                      TBREAK;
                     }
                 }
             }
@@ -441,12 +442,12 @@ EVENT_SINK_INVOKE(MailItemEvents)
                              ERR_WANTS_SEND_INLINE_BODY);
                   m_mail->setCryptState (Mail::NoCryptMail);
                   *(parms->rgvarg[0].pboolVal) = VARIANT_TRUE;
-                  break;
+                  TBREAK;
                 }
               log_debug ("%s:%s: Passing send event for no-mime message %p.",
                          SRCNAME, __func__, m_object);
               WKSHelper::instance()->allow_notify (1000);
-              break;
+              TBREAK;
             }
 
           if (m_mail->cryptState () == Mail::WantsSendMIME)
@@ -473,7 +474,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
                              SRCNAME, __func__, m_object, m_mail);
                   m_mail->setCryptState (Mail::NoCryptMail);
                   *(parms->rgvarg[0].pboolVal) = VARIANT_TRUE;
-                  break;
+                  TBREAK;
 #else
                   log_debug ("%s:%s: Message %p mail %p - "
                              "not encrypted or not empty body detected - MIME.",
@@ -504,7 +505,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
                   log_error ("%s:%s: HrGetOneProp() failed: hr=%#lx\n",
                              SRCNAME, __func__, hr);
                   gpgol_release (message);
-                  break;
+                  TBREAK;
                 }
               if (propval->Value.lpszA && !strstr (propval->Value.lpszA, "GpgOL"))
                 {
@@ -535,12 +536,12 @@ EVENT_SINK_INVOKE(MailItemEvents)
               MAPIFreeBuffer (propval);
               if (*(parms->rgvarg[0].pboolVal) == VARIANT_TRUE)
                 {
-                  break;
+                  TBREAK;
                 }
               log_debug ("%s:%s: Passing send event for mime-encrypted message %p.",
                          SRCNAME, __func__, m_object);
               WKSHelper::instance()->allow_notify (1000);
-              break;
+              TBREAK;
             }
           else
             {
@@ -549,7 +550,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
                          SRCNAME, __func__, m_object);
               *(parms->rgvarg[0].pboolVal) = VARIANT_TRUE;
             }
-          return S_OK;
+          TRETURN S_OK;
         }
       case Write:
         {
@@ -565,14 +566,14 @@ EVENT_SINK_INVOKE(MailItemEvents)
              /* This happens in the weird case */
              log_debug ("%s:%s: Uncancellable write event.",
                         SRCNAME, __func__);
-             break;
+             TBREAK;
            }
 
           if (m_mail->isAboutToBeMoved())
             {
               log_debug ("%s:%s: Mail is about to be moved. Passing write for %p",
                          SRCNAME, __func__, m_mail);
-              break;
+              TBREAK;
             }
 
           if (m_mail->isCryptoMail () && !m_mail->needsSave ())
@@ -617,7 +618,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
                       // Mail::clearLastMail ();
 
                       do_in_ui_thread_async (REVERT_MAIL, m_mail);
-                      return S_OK;
+                      TRETURN S_OK;
                     }
                 }
               /* We cancel the write event to stop outlook from excessively
@@ -629,7 +630,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
               *(parms->rgvarg[0].pboolVal) = VARIANT_TRUE;
               log_debug ("%s:%s: Canceling write event.",
                          SRCNAME, __func__);
-              return S_OK;
+              TRETURN S_OK;
             }
 
           if (m_mail->isCryptoMail () && m_mail->needsSave () &&
@@ -667,7 +668,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
           log_debug ("%s:%s: Passing write event.",
                      SRCNAME, __func__);
           m_mail->setNeedsSave (false);
-          break;
+          TBREAK;
         }
       case AfterWrite:
         {
@@ -683,15 +684,15 @@ EVENT_SINK_INVOKE(MailItemEvents)
                              SRCNAME, __func__);
                   m_mail->setCryptState (Mail::NoCryptMail);
                 }
-              return S_OK;
+              TRETURN S_OK;
             }
           if (m_mail->cryptState () == Mail::NeedsSecondAfterWrite)
             {
               m_mail->setCryptState (Mail::NeedsUpdateInMAPI);
               m_mail->updateCryptMAPI_m ();
-              return S_OK;
+              TRETURN S_OK;
             }
-          break;
+          TBREAK;
         }
       case Close:
         {
@@ -712,13 +713,13 @@ EVENT_SINK_INVOKE(MailItemEvents)
                   /* This happens in the weird case */
                   log_debug ("%s:%s: Uncancellable close event.",
                              SRCNAME, __func__);
-                  break;
+                  TBREAK;
                 }
               if (m_mail->getCloseTriggered ())
                 {
                   /* Our close with discard changes, pass through */
                   m_mail->setCloseTriggered (false);
-                  return S_OK;
+                  TRETURN S_OK;
                 }
               *(parms->rgvarg[0].pboolVal) = VARIANT_TRUE;
               log_oom ("%s:%s: Canceling close event.",
@@ -729,7 +730,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
                              SRCNAME, __func__);
                 }
             }
-          return S_OK;
+          TRETURN S_OK;
         }
       case Unload:
         {
@@ -741,7 +742,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
           log_oom ("%s:%s: deletion done",
                          SRCNAME, __func__);
           memdbg_dump ();
-          return S_OK;
+          TRETURN S_OK;
         }
       /* Fallthrough */
       case ReplyAll:
@@ -796,7 +797,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
           if (!is_crypto_mail)
             {
               /* Replys to non crypto mails do not interest us anymore. */
-              break;
+              TBREAK;
             }
 
           Mail *last_mail = Mail::getLastMail ();
@@ -871,12 +872,12 @@ EVENT_SINK_INVOKE(MailItemEvents)
                          SRCNAME, __func__, m_mail);
           if (!opt.reply_crypt)
             {
-              break;
+              TBREAK;
             }
           int crypto_flags = 0;
           if (!(crypto_flags = m_mail->getCryptoFlags ()))
             {
-              break;
+              TBREAK;
             }
           if (parms->cArgs != 2 || parms->rgvarg[1].vt != (VT_DISPATCH) ||
               parms->rgvarg[0].vt != (VT_BOOL | VT_BYREF))
@@ -885,18 +886,18 @@ EVENT_SINK_INVOKE(MailItemEvents)
               log_debug ("%s:%s: Unexpected args %i %x %x named: %i",
                          SRCNAME, __func__, parms->cArgs, parms->rgvarg[0].vt, parms->rgvarg[1].vt,
                          parms->cNamedArgs);
-              break;
+              TBREAK;
             }
           LPMESSAGE msg = get_oom_base_message (parms->rgvarg[1].pdispVal);
           if (!msg)
             {
               log_debug ("%s:%s: Failed to get base message",
                          SRCNAME, __func__);
-              break;
+              TBREAK;
             }
           set_gpgol_draft_info_flags (msg, crypto_flags);
           gpgol_release (msg);
-          break;
+          TBREAK;
         }
       case AttachmentRemove:
         {
@@ -905,7 +906,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
           if (!m_mail->isCryptoMail () || attachRemoveWarnShown ||
               m_mail->attachmentRemoveWarningDisabled ())
             {
-              return S_OK;
+              TRETURN S_OK;
             }
           gpgol_message_box (get_active_hwnd (),
                              _("Attachments are part of the crypto message.\nThey "
@@ -913,13 +914,13 @@ EVENT_SINK_INVOKE(MailItemEvents)
                                "time this message is opened."),
                              _("Sorry, that's not possible, yet"), MB_OK);
           attachRemoveWarnShown = true;
-          return S_OK;
+          TRETURN S_OK;
         }
 
       default:
         log_oom ("%s:%s: Message:%p Unhandled Event: %lx \n",
                        SRCNAME, __func__, m_object, dispid);
     }
-  return S_OK;
+  TRETURN S_OK;
 }
 END_EVENT_SINK(MailItemEvents, IID_MailItemEvents)
index 0ee9619..43d701b 100644 (file)
@@ -53,6 +53,7 @@ static char *get_attach_mime_tag (LPATTACH obj);
 void
 log_mapi_property (LPMESSAGE message, ULONG prop, const char *propname)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   size_t keylen;
@@ -60,14 +61,16 @@ log_mapi_property (LPMESSAGE message, ULONG prop, const char *propname)
   char *buf;
 
   if (!message)
-    return; /* No message: Nop. */
+    {
+      TRETURN; /* No message: Nop. */
+    }
 
   hr = HrGetOneProp ((LPMAPIPROP)message, prop, &propval);
   if (FAILED (hr))
     {
       log_debug ("%s:%s: HrGetOneProp(%s) failed: hr=%#lx\n",
                  SRCNAME, __func__, propname, hr);
-      return;
+      TRETURN;
     }
     
   switch ( PROP_TYPE (propval->ulPropTag) )
@@ -99,9 +102,10 @@ log_mapi_property (LPMESSAGE message, ULONG prop, const char *propname)
       log_debug ("%s:%s: HrGetOneProp(%s) property type %lu not supported\n",
                  SRCNAME, __func__, propname,
                  PROP_TYPE (propval->ulPropTag) );
-      return;
+      TRETURN;
     }
   MAPIFreeBuffer (propval);
+  TRETURN;
 }
 
 
@@ -109,6 +113,7 @@ log_mapi_property (LPMESSAGE message, ULONG prop, const char *propname)
 static ULONG 
 create_gpgol_tag (LPMESSAGE message, const wchar_t *name, const char *func)
 {
+  TSTART;
   HRESULT hr;
   LPSPropTagArray proparr = NULL;
   MAPINAMEID mnid, *pmnid;
@@ -138,7 +143,7 @@ create_gpgol_tag (LPMESSAGE message, const wchar_t *name, const char *func)
   if (proparr)
     MAPIFreeBuffer (proparr);
     
-  return result;
+  TRETURN result;
 }
 
 
@@ -146,10 +151,13 @@ create_gpgol_tag (LPMESSAGE message, const wchar_t *name, const char *func)
 int 
 get_gpgolmsgclass_tag (LPMESSAGE message, ULONG *r_tag)
 {
+  TSTART;
   if (!(*r_tag = create_gpgol_tag (message, L"GpgOL Msg Class", __func__)))
-    return -1;
+    {
+      TRETURN -1;
+    }
   *r_tag |= PT_STRING8;
-  return 0;
+  TRETURN 0;
 }
 
 /* Return the property tag for GpgOL Old Msg Class.  The Old Msg Class
@@ -158,10 +166,13 @@ get_gpgolmsgclass_tag (LPMESSAGE message, ULONG *r_tag)
 int 
 get_gpgololdmsgclass_tag (LPMESSAGE message, ULONG *r_tag)
 {
+  TSTART;
   if (!(*r_tag = create_gpgol_tag (message, L"GpgOL Old Msg Class", __func__)))
-    return -1;
+    {
+      TRETURN -1;
+    }
   *r_tag |= PT_STRING8;
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -169,10 +180,13 @@ get_gpgololdmsgclass_tag (LPMESSAGE message, ULONG *r_tag)
 int 
 get_gpgolattachtype_tag (LPMESSAGE message, ULONG *r_tag)
 {
+  TSTART;
   if (!(*r_tag = create_gpgol_tag (message, L"GpgOL Attach Type", __func__)))
-    return -1;
+    {
+      TRETURN -1;
+    }
   *r_tag |= PT_LONG;
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -180,10 +194,13 @@ get_gpgolattachtype_tag (LPMESSAGE message, ULONG *r_tag)
 int 
 get_gpgolsigstatus_tag (LPMESSAGE message, ULONG *r_tag)
 {
+  TSTART;
   if (!(*r_tag = create_gpgol_tag (message, L"GpgOL Sig Status", __func__)))
-    return -1;
+    {
+      TRETURN -1;
+    }
   *r_tag |= PT_STRING8;
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -191,20 +208,26 @@ get_gpgolsigstatus_tag (LPMESSAGE message, ULONG *r_tag)
 int 
 get_gpgolprotectiv_tag (LPMESSAGE message, ULONG *r_tag)
 {
+  TSTART;
   if (!(*r_tag = create_gpgol_tag (message, L"GpgOL Protect IV", __func__)))
-    return -1;
+    {
+      TRETURN -1;
+    }
   *r_tag |= PT_BINARY;
-  return 0;
+  TRETURN 0;
 }
 
 /* Return the property tag for GpgOL Last Decrypted. */
 int 
 get_gpgollastdecrypted_tag (LPMESSAGE message, ULONG *r_tag)
 {
+  TSTART;
   if (!(*r_tag = create_gpgol_tag (message, L"GpgOL Last Decrypted",__func__)))
-    return -1;
+    {
+      TRETURN -1;
+    }
   *r_tag |= PT_BINARY;
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -212,10 +235,13 @@ get_gpgollastdecrypted_tag (LPMESSAGE message, ULONG *r_tag)
 int 
 get_gpgolmimeinfo_tag (LPMESSAGE message, ULONG *r_tag)
 {
+  TSTART;
   if (!(*r_tag = create_gpgol_tag (message, L"GpgOL MIME Info", __func__)))
-    return -1;
+    {
+      TRETURN -1;
+    }
   *r_tag |= PT_STRING8;
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -223,10 +249,13 @@ get_gpgolmimeinfo_tag (LPMESSAGE message, ULONG *r_tag)
 int 
 get_gpgolcharset_tag (LPMESSAGE message, ULONG *r_tag)
 {
+  TSTART;
   if (!(*r_tag = create_gpgol_tag (message, L"GpgOL Charset", __func__)))
-    return -1;
+    {
+      TRETURN -1;
+    }
   *r_tag |= PT_STRING8;
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -234,10 +263,13 @@ get_gpgolcharset_tag (LPMESSAGE message, ULONG *r_tag)
 int 
 get_gpgoldraftinfo_tag (LPMESSAGE message, ULONG *r_tag)
 {
+  TSTART;
   if (!(*r_tag = create_gpgol_tag (message, L"GpgOL Draft Info", __func__)))
-    return -1;
+    {
+      TRETURN -1;
+    }
   *r_tag |= PT_STRING8;
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -247,6 +279,7 @@ get_gpgoldraftinfo_tag (LPMESSAGE message, ULONG *r_tag)
 int
 get_internetcharsetbody_tag (LPMESSAGE message, ULONG *r_tag)
 {
+  TSTART;
   HRESULT hr;
   LPSPropTagArray proparr = NULL;
   MAPINAMEID mnid, *pmnid;     
@@ -279,35 +312,39 @@ get_internetcharsetbody_tag (LPMESSAGE message, ULONG *r_tag)
   if (proparr)
     MAPIFreeBuffer (proparr);
   
-  return result;
+  TRETURN result;
 }
 
 /* Return the property tag for GpgOL UUID Info.  */
 static int
 get_gpgoluid_tag (LPMESSAGE message, ULONG *r_tag)
 {
+  TSTART;
   if (!(*r_tag = create_gpgol_tag (message, L"GpgOL UID", __func__)))
-    return -1;
+    {
+      TRETURN -1;
+    }
   *r_tag |= PT_UNICODE;
-  return 0;
+  TRETURN 0;
 }
 
 char *
 mapi_get_uid (LPMESSAGE msg)
 {
+  TSTART;
   /* If the UUID is not in OOM maybe we find it in mapi. */
   if (!msg)
     {
       log_error ("%s:%s: Called without message",
                  SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
   ULONG tag;
   if (get_gpgoluid_tag (msg, &tag))
     {
       log_debug ("%s:%s: Failed to get tag for '%p'",
                  SRCNAME, __func__, msg);
-      return NULL;
+      TRETURN NULL;
     }
   LPSPropValue propval = NULL;
   HRESULT hr = HrGetOneProp ((LPMAPIPROP)msg, tag, &propval);
@@ -315,7 +352,7 @@ mapi_get_uid (LPMESSAGE msg)
     {
       log_debug ("%s:%s: Failed to get prop for '%p'",
                  SRCNAME, __func__, msg);
-      return NULL;
+      TRETURN NULL;
     }
   char *ret = NULL;
   if (PROP_TYPE (propval->ulPropTag) == PT_UNICODE)
@@ -331,7 +368,7 @@ mapi_get_uid (LPMESSAGE msg)
                  SRCNAME, __func__, msg);
     }
   MAPIFreeBuffer (propval);
-  return ret;
+  TRETURN ret;
 }
 
 
@@ -342,6 +379,7 @@ int
 mapi_do_save_changes (LPMESSAGE message, ULONG flags, int only_del_body,
                       const char *dbg_file, const char *dbg_func)
 {
+  TSTART;
   HRESULT hr;
   SPropTagArray proparray;
   int any = 0;
@@ -385,11 +423,11 @@ mapi_do_save_changes (LPMESSAGE message, ULONG flags, int only_del_body,
           log_error ("%s:%s: SaveChanges(%lu) failed: hr=%#lx\n",
                      log_srcname (dbg_file), dbg_func,
                      (unsigned long)flags, hr); 
-          return -1;
+          TRETURN -1;
         }
     }
   
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -408,7 +446,9 @@ mapi_set_header (LPMESSAGE msg, const char *name, const char *val)
   int result;
 
   if (!msg)
-    return -1;
+    {
+      TRETURN -1;
+    }
 
   memset (&mnid, 0, sizeof mnid);
   mnid.lpguid = &guid;
@@ -442,7 +482,7 @@ mapi_set_header (LPMESSAGE msg, const char *name, const char *val)
   if (pProps)
     MAPIFreeBuffer (pProps);
 
-  return result;
+  TRETURN result;
 }
 
 
@@ -451,20 +491,23 @@ mapi_set_header (LPMESSAGE msg, const char *name, const char *val)
 std::string
 mapi_get_header (LPMESSAGE message)
 {
+  TSTART;
   HRESULT hr;
   LPSTREAM stream;
   ULONG bRead;
   std::string ret;
 
   if (!message)
-    return ret;
+    {
+      TRETURN ret;
+    }
 
   hr = gpgol_openProperty (message, PR_TRANSPORT_MESSAGE_HEADERS_A, &IID_IStream, 0, 0,
                               (LPUNKNOWN*)&stream);
   if (hr)
     {
       log_debug ("%s:%s: OpenProperty failed: hr=%#lx", SRCNAME, __func__, hr);
-      return ret;
+      TRETURN ret;
     }
 
   char buf[8192];
@@ -479,22 +522,25 @@ mapi_get_header (LPMESSAGE message)
       ret += std::string (buf, bRead);
     }
   gpgol_release (stream);
-  return ret;
+  TRETURN ret;
 }
 
 
 /* Return the body as a new IStream object.  Returns NULL on failure.
-   The stream returns the body as an ASCII stream (Use mapi_get_body
+   The stream Returns the body as an ASCII stream (Use mapi_get_body
    for an UTF-8 value).  */
 LPSTREAM
 mapi_get_body_as_stream (LPMESSAGE message)
 {
+  TSTART;
   HRESULT hr;
   ULONG tag;
   LPSTREAM stream;
 
   if (!message)
-    return NULL;
+    {
+      TRETURN NULL;
+    }
 
   if (!get_internetcharsetbody_tag (message, &tag) )
     {
@@ -504,7 +550,9 @@ mapi_get_body_as_stream (LPMESSAGE message)
       hr = gpgol_openProperty (message, tag, &IID_IStream, 0, 0,
                                   (LPUNKNOWN*)&stream);
       if (!hr)
-        return stream;
+        {
+          TRETURN stream;
+        }
 
       log_debug ("%s:%s: OpenProperty tag=%lx failed: hr=%#lx",
                  SRCNAME, __func__, tag, hr);
@@ -519,10 +567,10 @@ mapi_get_body_as_stream (LPMESSAGE message)
   if (hr)
     {
       log_debug ("%s:%s: OpenProperty failed: hr=%#lx", SRCNAME, __func__, hr);
-      return NULL;
+      TRETURN NULL;
     }
 
-  return stream;
+  TRETURN stream;
 }
 
 
@@ -534,6 +582,7 @@ mapi_get_body_as_stream (LPMESSAGE message)
 char *
 mapi_get_body (LPMESSAGE message, size_t *r_nbytes)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue lpspvFEID = NULL;
   LPSTREAM stream;
@@ -573,7 +622,7 @@ mapi_get_body (LPMESSAGE message, size_t *r_nbytes)
         {
           log_debug ("%s:%s: OpenProperty failed: hr=%#lx",
                      SRCNAME, __func__, hr);
-          return NULL;
+          TRETURN NULL;
         }
       
       hr = stream->Stat (&statInfo, STATFLAG_NONAME);
@@ -581,7 +630,7 @@ mapi_get_body (LPMESSAGE message, size_t *r_nbytes)
         {
           log_debug ("%s:%s: Stat failed: hr=%#lx", SRCNAME, __func__, hr);
           gpgol_release (stream);
-          return NULL;
+          TRETURN NULL;
         }
       
       /* Fixme: We might want to read only the first 1k to decide
@@ -594,7 +643,7 @@ mapi_get_body (LPMESSAGE message, size_t *r_nbytes)
           log_debug ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr);
           xfree (body);
           gpgol_release (stream);
-          return NULL;
+          TRETURN NULL;
         }
       body[nread] = 0;
       body[nread+1] = 0;
@@ -603,7 +652,7 @@ mapi_get_body (LPMESSAGE message, size_t *r_nbytes)
           log_debug ("%s:%s: not enough bytes returned\n", SRCNAME, __func__);
           xfree (body);
           gpgol_release (stream);
-          return NULL;
+          TRETURN NULL;
         }
       gpgol_release (stream);
       
@@ -622,7 +671,7 @@ mapi_get_body (LPMESSAGE message, size_t *r_nbytes)
 
   if (r_nbytes)
     *r_nbytes = strlen (body);
-  return body;
+  TRETURN body;
 }
 
 
@@ -636,6 +685,7 @@ mapi_get_body (LPMESSAGE message, size_t *r_nbytes)
 static char *
 get_msgcls_from_pgp_lines (LPMESSAGE message, bool *r_nobody = nullptr)
 {
+  TSTART;
   HRESULT hr;
   LPSTREAM stream;
   STATSTG statInfo;
@@ -666,7 +716,7 @@ get_msgcls_from_pgp_lines (LPMESSAGE message, bool *r_nobody = nullptr)
             {
               *r_nobody = true;
             }
-          return NULL;
+          TRETURN NULL;
         }
       else
         {
@@ -679,7 +729,7 @@ get_msgcls_from_pgp_lines (LPMESSAGE message, bool *r_nobody = nullptr)
     {
       log_debug ("%s:%s: Stat failed: hr=%#lx", SRCNAME, __func__, hr);
       gpgol_release (stream);
-      return NULL;
+      TRETURN NULL;
     }
 
   /* We read only the first 1k to decide whether this is actually an
@@ -694,7 +744,7 @@ get_msgcls_from_pgp_lines (LPMESSAGE message, bool *r_nobody = nullptr)
       log_debug ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr);
       xfree (body);
       gpgol_release (stream);
-      return NULL;
+      TRETURN NULL;
     }
   body[nread] = 0;
   body[nread+1] = 0;
@@ -704,7 +754,7 @@ get_msgcls_from_pgp_lines (LPMESSAGE message, bool *r_nobody = nullptr)
 
       xfree (body);
       gpgol_release (stream);
-      return NULL;
+      TRETURN NULL;
     }
   gpgol_release (stream);
 
@@ -755,7 +805,7 @@ get_msgcls_from_pgp_lines (LPMESSAGE message, bool *r_nobody = nullptr)
 
 
   xfree (body);
-  return msgcls;
+  TRETURN msgcls;
 }
 
 
@@ -804,7 +854,7 @@ is_really_cms_encrypted (LPMESSAGE message)
     {
       log_debug ("%s:%s: GetAttachmentTable failed: hr=%#lx",
                  SRCNAME, __func__, hr);
-      return -1;
+      TRETURN -1;
     }
       
   hr = HrQueryAllRows (mapitable, (LPSPropTagArray)&propAttNum,
@@ -814,7 +864,7 @@ is_really_cms_encrypted (LPMESSAGE message)
       log_debug ("%s:%s: HrQueryAllRows failed: hr=%#lx",
                  SRCNAME, __func__, hr);
       gpgol_release (mapitable);
-      return -1;
+      TRETURN -1;
     }
   n_attach = mapirows->cRows > 0? mapirows->cRows : 0;
   if (n_attach != 1)
@@ -822,7 +872,7 @@ is_really_cms_encrypted (LPMESSAGE message)
       FreeProws (mapirows);
       gpgol_release (mapitable);
       log_debug ("%s:%s: not just one attachment", SRCNAME, __func__);
-      return -1;
+      TRETURN -1;
     }
   pos = 0;
 
@@ -907,7 +957,7 @@ is_really_cms_encrypted (LPMESSAGE message)
     gpgol_release (att);
   FreeProws (mapirows);
   gpgol_release (mapitable);
-  return result;
+  TRETURN result;
 }
 
 
@@ -930,7 +980,7 @@ get_first_attach_mime_tag (LPMESSAGE message)
     {
       log_debug ("%s:%s: GetAttachmentTable failed: hr=%#lx",
                  SRCNAME, __func__, hr);
-      return NULL;
+      TRETURN NULL;
     }
       
   hr = HrQueryAllRows (mapitable, (LPSPropTagArray)&propAttNum,
@@ -940,7 +990,7 @@ get_first_attach_mime_tag (LPMESSAGE message)
       log_debug ("%s:%s: HrQueryAllRows failed: hr=%#lx",
                  SRCNAME, __func__, hr);
       gpgol_release (mapitable);
-      return NULL;
+      TRETURN NULL;
     }
   n_attach = mapirows->cRows > 0? mapirows->cRows : 0;
   if (n_attach < 1)
@@ -948,7 +998,7 @@ get_first_attach_mime_tag (LPMESSAGE message)
       FreeProws (mapirows);
       gpgol_release (mapitable);
       log_debug ("%s:%s: less then one attachment", SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
   pos = 0;
 
@@ -988,7 +1038,7 @@ get_first_attach_mime_tag (LPMESSAGE message)
     gpgol_release (att);
   FreeProws (mapirows);
   gpgol_release (mapitable);
-  return result;
+  TRETURN result;
 }
 
 
@@ -997,11 +1047,12 @@ get_first_attach_mime_tag (LPMESSAGE message)
 static char *
 get_msgcls_from_first_attachment (LPMESSAGE message)
 {
+  TSTART;
   char *ret = nullptr;
   char *attach_mime = get_first_attach_mime_tag (message);
   if (!attach_mime)
     {
-      return nullptr;
+      TRETURN nullptr;
     }
   if (!strcmp (attach_mime, "application/pgp-encrypted"))
     {
@@ -1013,7 +1064,7 @@ get_msgcls_from_first_attachment (LPMESSAGE message)
       ret = xstrdup ("IPM.Note.GpgOL.MultipartSigned");
       xfree (attach_mime);
     }
-  return ret;
+  TRETURN ret;
 }
 
 /* Helper for mapi_change_message_class.  Returns the new message
@@ -1026,6 +1077,7 @@ get_msgcls_from_first_attachment (LPMESSAGE message)
 static char *
 change_message_class_ipm_note (LPMESSAGE message)
 {
+  TSTART;
   char *newvalue = NULL;
   char *ct, *proto;
 
@@ -1095,7 +1147,7 @@ change_message_class_ipm_note (LPMESSAGE message)
 
   xfree (ct);
 
-  return newvalue;
+  TRETURN newvalue;
 }
 
 /* Helper for mapi_change_message_class.  Returns the new message
@@ -1107,6 +1159,7 @@ change_message_class_ipm_note (LPMESSAGE message)
 static char *
 change_message_class_ipm_note_smime (LPMESSAGE message)
 {
+  TSTART;
   char *newvalue = NULL;
   char *ct, *proto, *smtype;
   
@@ -1128,7 +1181,7 @@ change_message_class_ipm_note_smime (LPMESSAGE message)
             {
               xfree (ct);
               xfree (proto);
-              return nullptr;
+              TRETURN nullptr;
             }
           if (!strcmp (attach_mime, "multipart/signed"))
             {
@@ -1197,7 +1250,7 @@ change_message_class_ipm_note_smime (LPMESSAGE message)
   if (!newvalue && opt.enable_smime)
     newvalue = xstrdup ("IPM.Note.GpgOL");
 
-  return newvalue;
+  TRETURN newvalue;
 }
 
 /* Helper for mapi_change_message_class.  Returns the new message
@@ -1210,6 +1263,7 @@ change_message_class_ipm_note_smime (LPMESSAGE message)
 static char *
 change_message_class_ipm_note_smime_multipartsigned (LPMESSAGE message)
 {
+  TSTART;
   char *newvalue = NULL;
   char *ct, *proto;
 
@@ -1235,7 +1289,7 @@ change_message_class_ipm_note_smime_multipartsigned (LPMESSAGE message)
             {
               xfree (ct);
               xfree (proto);
-              return nullptr;
+              TRETURN nullptr;
             }
           if (!strcmp (attach_mime, "multipart/signed"))
             {
@@ -1249,7 +1303,7 @@ change_message_class_ipm_note_smime_multipartsigned (LPMESSAGE message)
   else
     log_debug ("%s:%s: message has no content type", SRCNAME, __func__);
   
-  return newvalue;
+  TRETURN newvalue;
 }
 
 /* Helper for mapi_change_message_class.  Returns the new message
@@ -1262,6 +1316,7 @@ change_message_class_ipm_note_smime_multipartsigned (LPMESSAGE message)
 static char *
 change_message_class_ipm_note_secure_cex (LPMESSAGE message, int is_cexenc)
 {
+  TSTART;
   char *newvalue = NULL;
   char *ct, *smtype, *proto;
   
@@ -1359,54 +1414,74 @@ change_message_class_ipm_note_secure_cex (LPMESSAGE message, int is_cexenc)
   if (!newvalue)
     newvalue = xstrdup ("IPM.Note.GpgOL");
 
-  return newvalue;
+  TRETURN newvalue;
 }
 
 static msgtype_t
 string_to_type (const char *s)
 {
+  TSTART;
   if (!s || strlen (s) < 14)
     {
-      return MSGTYPE_UNKNOWN;
+      TRETURN MSGTYPE_UNKNOWN;
     }
   if (!strncmp (s, "IPM.Note.GpgOL", 14) && (!s[14] || s[14] =='.'))
     {
       s += 14;
       if (!*s)
-        return MSGTYPE_GPGOL;
+        {
+          TRETURN MSGTYPE_GPGOL;
+        }
       else if (!strcmp (s, ".MultipartSigned"))
-        return MSGTYPE_GPGOL_MULTIPART_SIGNED;
+        {
+          TRETURN MSGTYPE_GPGOL_MULTIPART_SIGNED;
+        }
       else if (!strcmp (s, ".MultipartEncrypted"))
-        return MSGTYPE_GPGOL_MULTIPART_ENCRYPTED;
+        {
+          TRETURN MSGTYPE_GPGOL_MULTIPART_ENCRYPTED;
+        }
       else if (!strcmp (s, ".OpaqueSigned"))
-        return MSGTYPE_GPGOL_OPAQUE_SIGNED;
+        {
+          TRETURN MSGTYPE_GPGOL_OPAQUE_SIGNED;
+        }
       else if (!strcmp (s, ".OpaqueEncrypted"))
-        return MSGTYPE_GPGOL_OPAQUE_ENCRYPTED;
+        {
+          TRETURN MSGTYPE_GPGOL_OPAQUE_ENCRYPTED;
+        }
       else if (!strcmp (s, ".ClearSigned"))
-        return MSGTYPE_GPGOL_CLEAR_SIGNED;
+        {
+          TRETURN MSGTYPE_GPGOL_CLEAR_SIGNED;
+        }
       else if (!strcmp (s, ".PGPMessage"))
-        return MSGTYPE_GPGOL_PGP_MESSAGE;
+        {
+          TRETURN MSGTYPE_GPGOL_PGP_MESSAGE;
+        }
       else if (!strcmp (s, ".WKSConfirmation"))
-        return MSGTYPE_GPGOL_WKS_CONFIRMATION;
+        {
+          TRETURN MSGTYPE_GPGOL_WKS_CONFIRMATION;
+        }
       else
         log_debug ("%s:%s: message class `%s' not supported",
                    SRCNAME, __func__, s-14);
     }
   else if (!strncmp (s, "IPM.Note.SMIME", 14) && (!s[14] || s[14] =='.'))
-    return MSGTYPE_SMIME;
-  return MSGTYPE_UNKNOWN;
+    {
+      TRETURN MSGTYPE_SMIME;
+    }
+  TRETURN MSGTYPE_UNKNOWN;
 }
 
 
 /* This function checks whether MESSAGE requires processing by us and
    adjusts the message class to our own.  By passing true for
    SYNC_OVERRIDE the actual MAPI message class will be updated to our
-   own message class overide.  Return true if the message was
+   own message class overide.  TRETURN true if the message was
    changed. */
 int
 mapi_change_message_class (LPMESSAGE message, int sync_override,
                            msgtype_t *r_type)
 {
+  TSTART;
   HRESULT hr;
   ULONG tag;
   SPropValue prop;
@@ -1416,10 +1491,14 @@ mapi_change_message_class (LPMESSAGE message, int sync_override,
   int have_override = 0;
 
   if (!message)
-    return 0; /* No message: Nop. */
+    {
+      TRETURN 0; /* No message: Nop. */
+    }
 
   if (get_gpgolmsgclass_tag (message, &tag) )
-    return 0; /* Ooops. */
+    {
+      TRETURN 0; /* Ooops. */
+    }
 
   hr = HrGetOneProp ((LPMAPIPROP)message, tag, &propval);
   if (FAILED (hr))
@@ -1429,7 +1508,7 @@ mapi_change_message_class (LPMESSAGE message, int sync_override,
         {
           log_error ("%s:%s: HrGetOneProp() failed: hr=%#lx\n",
                      SRCNAME, __func__, hr);
-          return 0;
+          TRETURN 0;
         }
     }
   else
@@ -1576,7 +1655,7 @@ mapi_change_message_class (LPMESSAGE message, int sync_override,
                   log_error ("%s:%s: can't save old message class: hr=%#lx\n",
                              SRCNAME, __func__, hr);
                   MAPIFreeBuffer (propval);
-                  return 0;
+                  TRETURN 0;
                 }
               need_save = 1;
             }
@@ -1594,7 +1673,7 @@ mapi_change_message_class (LPMESSAGE message, int sync_override,
           log_error ("%s:%s: can't set message class: hr=%#lx\n",
                      SRCNAME, __func__, hr);
           MAPIFreeBuffer (propval);
-          return 0;
+          TRETURN 0;
         }
       need_save = 1;
     }
@@ -1604,10 +1683,12 @@ mapi_change_message_class (LPMESSAGE message, int sync_override,
   if (need_save)
     {
       if (mapi_save_changes (message, KEEP_OPEN_READWRITE|FORCE_SAVE))
-        return 0;
+        {
+          TRETURN 0;
+        }
     }
 
-  return 1;
+  TRETURN 1;
 }
 
 
@@ -1617,19 +1698,22 @@ mapi_change_message_class (LPMESSAGE message, int sync_override,
 char *
 mapi_get_message_class (LPMESSAGE message)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   char *retstr;
 
   if (!message)
-    return xstrdup ("[No message]");
+    {
+      TRETURN xstrdup ("[No message]");
+    }
   
   hr = HrGetOneProp ((LPMAPIPROP)message, PR_MESSAGE_CLASS_A, &propval);
   if (FAILED (hr))
     {
       log_error ("%s:%s: HrGetOneProp() failed: hr=%#lx\n",
                  SRCNAME, __func__, hr);
-      return xstrdup (hr == MAPI_E_NOT_FOUND?
+      TRETURN xstrdup (hr == MAPI_E_NOT_FOUND?
                         "[No message class property]":
                         "[Error getting message class property]");
     }
@@ -1640,7 +1724,7 @@ mapi_get_message_class (LPMESSAGE message)
     retstr = xstrdup ("[Invalid message class property]");
     
   MAPIFreeBuffer (propval);
-  return retstr;
+  TRETURN retstr;
 }
 
 /* Return the old message class.  This function returns NULL if no old
@@ -1649,23 +1733,28 @@ mapi_get_message_class (LPMESSAGE message)
 char *
 mapi_get_old_message_class (LPMESSAGE message)
 {
+  TSTART;
   HRESULT hr;
   ULONG tag;
   LPSPropValue propval = NULL;
   char *retstr;
 
   if (!message)
-    return NULL;
+    {
+      TRETURN NULL;
+    }
   
   if (get_gpgololdmsgclass_tag (message, &tag))
-    return NULL;
+    {
+      TRETURN NULL;
+    }
 
   hr = HrGetOneProp ((LPMAPIPROP)message, tag, &propval);
   if (FAILED (hr))
     {
       log_error ("%s:%s: HrGetOneProp() failed: hr=%#lx\n",
                  SRCNAME, __func__, hr);
-      return NULL;
+      TRETURN NULL;
     }
 
   if ( PROP_TYPE (propval->ulPropTag) == PT_STRING8 )
@@ -1674,7 +1763,7 @@ mapi_get_old_message_class (LPMESSAGE message)
     retstr = NULL;
     
   MAPIFreeBuffer (propval);
-  return retstr;
+  TRETURN retstr;
 }
 
 
@@ -1685,28 +1774,31 @@ mapi_get_old_message_class (LPMESSAGE message)
 char *
 mapi_get_sender (LPMESSAGE message)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   char *buf;
   char *p0, *p;
   
   if (!message)
-    return NULL; /* No message: Nop. */
+    {
+      TRETURN NULL; /* No message: Nop. */
+    }
 
   hr = HrGetOneProp ((LPMAPIPROP)message, PR_PRIMARY_SEND_ACCT, &propval);
   if (FAILED (hr))
     {
       log_debug ("%s:%s: HrGetOneProp failed: hr=%#lx\n",
                  SRCNAME, __func__, hr);
-      return NULL;
+      TRETURN NULL;
     }
     
   if (PROP_TYPE (propval->ulPropTag) != PT_UNICODE) 
     {
-      log_debug ("%s:%s: HrGetOneProp returns invalid type %lu\n",
+      log_debug ("%s:%s: HrGetOneProp Returns invalid type %lu\n",
                  SRCNAME, __func__, PROP_TYPE (propval->ulPropTag) );
       MAPIFreeBuffer (propval);
-      return NULL;
+      TRETURN NULL;
     }
   
   buf = wchar_to_utf8 (propval->Value.lpszW);
@@ -1714,7 +1806,7 @@ mapi_get_sender (LPMESSAGE message)
   if (!buf)
     {
       log_error ("%s:%s: error converting to utf8\n", SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
   /* The PR_PRIMARY_SEND_ACCT property seems to be divided into fields
      using Ctrl-A as delimiter.  The first field looks like the ascii
@@ -1727,7 +1819,7 @@ mapi_get_sender (LPMESSAGE message)
       log_error ("%s:%s: unknown format of the value `%s'\n",
                  SRCNAME, __func__, anonstr (buf));
       xfree (buf);
-      return NULL;
+      TRETURN NULL;
     }
   for (p0=buf, p++; *p && *p != '\x01';)
     *p0++ = *p++;
@@ -1757,12 +1849,13 @@ mapi_get_sender (LPMESSAGE message)
       
     }
   log_debug ("%s:%s: address is `%s'\n", SRCNAME, __func__, anonstr (buf));
-  return buf;
+  TRETURN buf;
 }
 
 static char *
 resolve_ex_from_address (LPMESSAGE message)
 {
+  TSTART;
   HRESULT hr;
   char *sender_entryid;
   size_t entryidlen;
@@ -1775,7 +1868,7 @@ resolve_ex_from_address (LPMESSAGE message)
   if (g_ol_version_major < 14)
     {
       log_debug ("%s:%s: Not implemented for Ol < 14", SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
 
   sender_entryid = mapi_get_binary_prop (message, PR_SENDER_ENTRYID,
@@ -1783,7 +1876,7 @@ resolve_ex_from_address (LPMESSAGE message)
   if (!sender_entryid)
     {
       log_error ("%s:%s: Error: %i", SRCNAME, __func__, __LINE__);
-      return NULL;
+      TRETURN NULL;
     }
 
   session = get_oom_mapi_session ();
@@ -1792,7 +1885,7 @@ resolve_ex_from_address (LPMESSAGE message)
     {
       log_error ("%s:%s: Error: %i", SRCNAME, __func__, __LINE__);
       xfree (sender_entryid);
-      return NULL;
+      TRETURN NULL;
     }
 
   hr = session->OpenEntry (entryidlen,  (LPENTRYID)sender_entryid,
@@ -1813,34 +1906,35 @@ resolve_ex_from_address (LPMESSAGE message)
   if (FAILED (hr))
     {
       log_error ("%s:%s: Error: %i", SRCNAME, __func__, __LINE__);
-      return NULL;
+      TRETURN NULL;
     }
 
   hr = HrGetOneProp ((LPMAPIPROP)user, PR_SMTP_ADDRESS_W, &propval);
   if (FAILED (hr))
     {
       log_error ("%s:%s: Error: %i", SRCNAME, __func__, __LINE__);
-      return NULL;
+      TRETURN NULL;
     }
 
   if (PROP_TYPE (propval->ulPropTag) != PT_UNICODE)
     {
-      log_debug ("%s:%s: HrGetOneProp returns invalid type %lu\n",
+      log_debug ("%s:%s: HrGetOneProp Returns invalid type %lu\n",
                  SRCNAME, __func__, PROP_TYPE (propval->ulPropTag) );
       MAPIFreeBuffer (propval);
-      return NULL;
+      TRETURN NULL;
     }
   buf = wchar_to_utf8 (propval->Value.lpszW);
   MAPIFreeBuffer (propval);
 
-  return buf;
+  TRETURN buf;
 }
 
 /* Return the from address of the message as a malloced UTF-8 string.
-   Returns NULL if that address is not available.  */
+   returns NULL if that address is not available.  */
 char *
 mapi_get_from_address (LPMESSAGE message)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   char *buf;
@@ -1849,7 +1943,9 @@ mapi_get_from_address (LPMESSAGE message)
                         PR_SENDER_EMAIL_ADDRESS_W};
 
   if (!message)
-    return xstrdup ("[no message]"); /* Ooops.  */
+    {
+      TRETURN xstrdup ("[no message]"); /* Ooops.  */
+    }
 
   for (int i = 0; i < 3; i++)
     {
@@ -1869,15 +1965,15 @@ mapi_get_from_address (LPMESSAGE message)
     {
       log_debug ("%s:%s: HrGetOneProp failed: hr=%#lx\n",
                  SRCNAME, __func__, hr);
-      return NULL;
+      TRETURN NULL;
     }
 
   if (PROP_TYPE (propval->ulPropTag) != PT_UNICODE) 
     {
-      log_debug ("%s:%s: HrGetOneProp returns invalid type %lu\n",
+      log_debug ("%s:%s: HrGetOneProp Returns invalid type %lu\n",
                  SRCNAME, __func__, PROP_TYPE (propval->ulPropTag) );
       MAPIFreeBuffer (propval);
-      return NULL;
+      TRETURN NULL;
     }
   
   buf = wchar_to_utf8 (propval->Value.lpszW);
@@ -1885,7 +1981,7 @@ mapi_get_from_address (LPMESSAGE message)
   if (!buf)
     {
       log_error ("%s:%s: error converting to utf8\n", SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
 
   if (strstr (buf, "/o="))
@@ -1900,40 +1996,43 @@ mapi_get_from_address (LPMESSAGE message)
       if (buf2)
         {
           xfree (buf);
-          return buf2;
+          TRETURN buf2;
         }
     }
 
-  return buf;
+  TRETURN buf;
 }
 
 
 /* Return the subject of the message as a malloced UTF-8 string.
-   Returns a replacement string if a subject is missing.  */
+   returns a replacement string if a subject is missing.  */
 char *
 mapi_get_subject (LPMESSAGE message)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   char *buf;
   
   if (!message)
-    return xstrdup ("[no message]"); /* Ooops.  */
+    {
+      TRETURN xstrdup ("[no message]"); /* Ooops.  */
+    }
 
   hr = HrGetOneProp ((LPMAPIPROP)message, PR_SUBJECT_W, &propval);
   if (FAILED (hr))
     {
       log_debug ("%s:%s: HrGetOneProp failed: hr=%#lx\n",
                  SRCNAME, __func__, hr);
-      return xstrdup (_("[no subject]"));
+      TRETURN xstrdup (_("[no subject]"));
     }
     
   if (PROP_TYPE (propval->ulPropTag) != PT_UNICODE) 
     {
-      log_debug ("%s:%s: HrGetOneProp returns invalid type %lu\n",
+      log_debug ("%s:%s: HrGetOneProp Returns invalid type %lu\n",
                  SRCNAME, __func__, PROP_TYPE (propval->ulPropTag) );
       MAPIFreeBuffer (propval);
-      return xstrdup (_("[no subject]"));
+      TRETURN xstrdup (_("[no subject]"));
     }
   
   buf = wchar_to_utf8 (propval->Value.lpszW);
@@ -1941,10 +2040,10 @@ mapi_get_subject (LPMESSAGE message)
   if (!buf)
     {
       log_error ("%s:%s: error converting to utf8\n", SRCNAME, __func__);
-      return xstrdup (_("[no subject]"));
+      TRETURN xstrdup (_("[no subject]"));
     }
 
-  return buf;
+  TRETURN buf;
 }
 
 
@@ -1956,16 +2055,21 @@ mapi_get_subject (LPMESSAGE message)
 msgtype_t
 mapi_get_message_type (LPMESSAGE message)
 {
+  TSTART;
   HRESULT hr;
   ULONG tag;
   LPSPropValue propval = NULL;
   msgtype_t msgtype = MSGTYPE_UNKNOWN;
 
   if (!message)
-    return msgtype; 
+    {
+      TRETURN msgtype;
+    }
 
   if (get_gpgolmsgclass_tag (message, &tag) )
-    return msgtype; /* Ooops */
+    {
+      TRETURN msgtype; /* Ooops */
+    }
 
   hr = HrGetOneProp ((LPMAPIPROP)message, tag, &propval);
   if (FAILED (hr))
@@ -1975,7 +2079,7 @@ mapi_get_message_type (LPMESSAGE message)
         {
           log_error ("%s:%s: HrGetOneProp(PR_MESSAGE_CLASS) failed: hr=%#lx\n",
                      SRCNAME, __func__, hr);
-          return msgtype;
+          TRETURN msgtype;
         }
     }
   else
@@ -1986,7 +2090,7 @@ mapi_get_message_type (LPMESSAGE message)
       msgtype = string_to_type (propval->Value.lpszA);
     }
   MAPIFreeBuffer (propval);
-  return msgtype;
+  TRETURN msgtype;
 }
 
 
@@ -1995,6 +2099,7 @@ mapi_get_message_type (LPMESSAGE message)
 int
 mapi_to_mime (LPMESSAGE message, const char *filename)
 {
+  TSTART;
   HRESULT hr;
   LPCONVERTERSESSION session;
   LPSTREAM stream;
@@ -2005,7 +2110,7 @@ mapi_to_mime (LPMESSAGE message, const char *filename)
     {
       log_error ("%s:%s: can't create new IConverterSession object: hr=%#lx",
                  SRCNAME, __func__, hr);
-      return -1;
+      TRETURN -1;
     }
 
 
@@ -2038,7 +2143,7 @@ mapi_to_mime (LPMESSAGE message, const char *filename)
     }
 
   gpgol_release (session);
-  return hr;
+  TRETURN hr;
 }
 
 
@@ -2047,6 +2152,7 @@ mapi_to_mime (LPMESSAGE message, const char *filename)
 char *
 mapi_get_binary_prop (LPMESSAGE message, ULONG proptype, size_t *r_nbytes)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   char *data;
@@ -2057,7 +2163,7 @@ mapi_get_binary_prop (LPMESSAGE message, ULONG proptype, size_t *r_nbytes)
     {
       log_error ("%s:%s: error getting property %#lx: hr=%#lx",
                  SRCNAME, __func__, proptype, hr);
-      return NULL; 
+      TRETURN NULL;
     }
   switch ( PROP_TYPE (propval->ulPropTag) )
     {
@@ -2077,14 +2183,15 @@ mapi_get_binary_prop (LPMESSAGE message, ULONG proptype, size_t *r_nbytes)
       break;
     }
   MAPIFreeBuffer (propval);
-  return data;
+  TRETURN data;
 }
 
 /* Return an integer property at R_VALUE.  On error the function
-   returns -1 and sets R_VALUE to 0, on success 0 is returned.  */
+   Returns -1 and sets R_VALUE to 0, on success 0 is returned.  */
 int
 mapi_get_int_prop (LPMAPIPROP object, ULONG proptype, LONG *r_value)
 {
+  TSTART;
   int rc = -1;
   HRESULT hr;
   LPSPropValue propval = NULL;
@@ -2095,7 +2202,7 @@ mapi_get_int_prop (LPMAPIPROP object, ULONG proptype, LONG *r_value)
     {
       log_error ("%s:%s: error getting property %#lx: hr=%#lx",
                  SRCNAME, __func__, proptype, hr);
-      return -1; 
+      TRETURN -1;
     }
   switch ( PROP_TYPE (propval->ulPropTag) )
     {
@@ -2111,15 +2218,16 @@ mapi_get_int_prop (LPMAPIPROP object, ULONG proptype, LONG *r_value)
       break;
     }
   MAPIFreeBuffer (propval);
-  return rc;
+  TRETURN rc;
 }
 
 
 /* Return the attachment method for attachment OBJ.  In case of error
-   we return 0 which happens not to be defined.  */
+   we TRETURN 0 which happens not to be defined.  */
 static int
 get_attach_method (LPATTACH obj)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   int method ;
@@ -2129,14 +2237,14 @@ get_attach_method (LPATTACH obj)
     {
       log_error ("%s:%s: error getting attachment method: hr=%#lx",
                  SRCNAME, __func__, hr);
-      return 0; 
+      TRETURN 0;
     }
   /* We don't bother checking whether we really get a PT_LONG ulong
      back; if not the system is seriously damaged and we can't do
      further harm by returning a possible random value.  */
   method = propval->Value.l;
   MAPIFreeBuffer (propval);
-  return method;
+  TRETURN method;
 }
 
 
@@ -2150,6 +2258,7 @@ get_attach_method (LPATTACH obj)
 static char *
 get_attach_filename (LPATTACH obj)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval;
   char *name = NULL;
@@ -2160,7 +2269,7 @@ get_attach_filename (LPATTACH obj)
   if (FAILED(hr))
     {
       log_debug ("%s:%s: no filename property found", SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
 
   switch ( PROP_TYPE (propval->ulPropTag) )
@@ -2182,7 +2291,7 @@ get_attach_filename (LPATTACH obj)
       break;
     }
   MAPIFreeBuffer (propval);
-  return name;
+  TRETURN name;
 }
 
 /* Return the content-id of the attachment OBJ or NULL if it does
@@ -2190,6 +2299,7 @@ get_attach_filename (LPATTACH obj)
 static char *
 get_attach_content_id (LPATTACH obj)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   char *name;
@@ -2200,7 +2310,7 @@ get_attach_content_id (LPATTACH obj)
       if (hr != MAPI_E_NOT_FOUND)
         log_error ("%s:%s: error getting attachment's MIME tag: hr=%#lx",
                    SRCNAME, __func__, hr);
-      return NULL;
+      TRETURN NULL;
     }
   switch ( PROP_TYPE (propval->ulPropTag) )
     {
@@ -2221,7 +2331,7 @@ get_attach_content_id (LPATTACH obj)
       break;
     }
   MAPIFreeBuffer (propval);
-  return name;
+  TRETURN name;
 }
 
 /* Return the content-type of the attachment OBJ or NULL if it does
@@ -2229,6 +2339,7 @@ get_attach_content_id (LPATTACH obj)
 static char *
 get_attach_mime_tag (LPATTACH obj)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   char *name;
@@ -2239,7 +2350,7 @@ get_attach_mime_tag (LPATTACH obj)
       if (hr != MAPI_E_NOT_FOUND)
         log_error ("%s:%s: error getting attachment's MIME tag: hr=%#lx",
                    SRCNAME, __func__, hr);
-      return NULL; 
+      TRETURN NULL;
     }
   switch ( PROP_TYPE (propval->ulPropTag) )
     {
@@ -2260,7 +2371,7 @@ get_attach_mime_tag (LPATTACH obj)
       break;
     }
   MAPIFreeBuffer (propval);
-  return name;
+  TRETURN name;
 }
 
 
@@ -2269,6 +2380,7 @@ get_attach_mime_tag (LPATTACH obj)
 attachtype_t
 get_gpgolattachtype (LPATTACH obj, ULONG tag)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   attachtype_t retval;
@@ -2279,17 +2391,17 @@ get_gpgolattachtype (LPATTACH obj, ULONG tag)
       if (hr != MAPI_E_NOT_FOUND)
         log_error ("%s:%s: error getting GpgOL Attach Type: hr=%#lx",
                    SRCNAME, __func__, hr);
-      return ATTACHTYPE_UNKNOWN; 
+      TRETURN ATTACHTYPE_UNKNOWN;
     }
   retval = (attachtype_t)propval->Value.l;
   MAPIFreeBuffer (propval);
-  return retval;
+  TRETURN retval;
 }
 
 
-/* Gather information about attachments and return a new table of
+/* Gather information about attachments and TRETURN a new table of
    attachments.  Caller must release the returned table.s The routine
-   will return NULL in case of an error or if no attachments are
+   will TRETURN NULL in case of an error or if no attachments are
    available.  With FAST set only some information gets collected. */
 mapi_attach_item_t *
 mapi_create_attach_table (LPMESSAGE message, int fast)
@@ -2303,7 +2415,9 @@ mapi_create_attach_table (LPMESSAGE message, int fast)
   ULONG moss_tag;
 
   if (get_gpgolattachtype_tag (message, &moss_tag) )
-    return NULL;
+    {
+      TRETURN NULL;
+    }
 
   /* Open the attachment table.  */
   hr = message->GetAttachmentTable (0, &mapitable);
@@ -2312,7 +2426,7 @@ mapi_create_attach_table (LPMESSAGE message, int fast)
     {
       log_debug ("%s:%s: GetAttachmentTable failed: hr=%#lx",
                  SRCNAME, __func__, hr);
-      return NULL;
+      TRETURN NULL;
     }
       
   hr = HrQueryAllRows (mapitable, (LPSPropTagArray)&propAttNum,
@@ -2322,7 +2436,7 @@ mapi_create_attach_table (LPMESSAGE message, int fast)
       log_debug ("%s:%s: HrQueryAllRows failed: hr=%#lx",
                  SRCNAME, __func__, hr);
       gpgol_release (mapitable);
-      return NULL;
+      TRETURN NULL;
     }
   n_attach = mapirows->cRows > 0? mapirows->cRows : 0;
 
@@ -2332,7 +2446,7 @@ mapi_create_attach_table (LPMESSAGE message, int fast)
     {
       FreeProws (mapirows);
       gpgol_release (mapitable);
-      return NULL;
+      TRETURN NULL;
     }
 
   /* Allocate our own table.  */
@@ -2409,7 +2523,7 @@ mapi_create_attach_table (LPMESSAGE message, int fast)
         }
     }
 
-  return table;
+  TRETURN table;
 }
 
 
@@ -2417,11 +2531,14 @@ mapi_create_attach_table (LPMESSAGE message, int fast)
 void
 mapi_release_attach_table (mapi_attach_item_t *table)
 {
+  TSTART;
   unsigned int pos;
   LPMAPITABLE mapitable;
 
   if (!table)
-    return;
+    {
+      TRETURN;
+    }
 
   mapitable = (LPMAPITABLE)table[0].private_mapitable;
   if (mapitable)
@@ -2433,6 +2550,7 @@ mapi_release_attach_table (mapi_attach_item_t *table)
       xfree (table[pos].content_id);
     }
   xfree (table);
+  TRETURN;
 }
 
 
@@ -2444,6 +2562,7 @@ LPSTREAM
 mapi_get_attach_as_stream (LPMESSAGE message, mapi_attach_item_t *item,
                            LPATTACH *r_attach)
 {
+  TSTART;
   HRESULT hr;
   LPATTACH att;
   LPSTREAM stream;
@@ -2452,7 +2571,9 @@ mapi_get_attach_as_stream (LPMESSAGE message, mapi_attach_item_t *item,
     *r_attach = NULL;
 
   if (!item || item->end_of_table || item->mapipos == -1)
-    return NULL;
+    {
+      TRETURN NULL;
+    }
 
   hr = message->OpenAttach (item->mapipos, NULL, MAPI_BEST_ACCESS, &att);
   memdbg_addRef (att);
@@ -2460,13 +2581,13 @@ mapi_get_attach_as_stream (LPMESSAGE message, mapi_attach_item_t *item,
     {
       log_error ("%s:%s: can't open attachment at %d: hr=%#lx",
                  SRCNAME, __func__, item->mapipos, hr);
-      return NULL;
+      TRETURN NULL;
     }
   if (item->method != ATTACH_BY_VALUE)
     {
       log_error ("%s:%s: attachment: method not supported", SRCNAME, __func__);
       gpgol_release (att);
-      return NULL;
+      TRETURN NULL;
     }
 
   hr = gpgol_openProperty (att, PR_ATTACH_DATA_BIN, &IID_IStream,
@@ -2476,7 +2597,7 @@ mapi_get_attach_as_stream (LPMESSAGE message, mapi_attach_item_t *item,
       log_error ("%s:%s: can't open data stream of attachment: hr=%#lx",
                  SRCNAME, __func__, hr);
       gpgol_release (att);
-      return NULL;
+      TRETURN NULL;
     }
 
   if (r_attach)
@@ -2484,7 +2605,7 @@ mapi_get_attach_as_stream (LPMESSAGE message, mapi_attach_item_t *item,
   else
     gpgol_release (att);
 
-  return stream;
+  TRETURN stream;
 }
 
 
@@ -2492,11 +2613,12 @@ mapi_get_attach_as_stream (LPMESSAGE message, mapi_attach_item_t *item,
    R_NBYTES is not NULL the number of bytes will get stored there.
    ATT must have an attachment method of ATTACH_BY_VALUE.  Returns
    NULL on error.  If UNPROTECT is set and the appropriate crypto
-   attribute is available, the function returns the unprotected
+   attribute is available, the function Returns the unprotected
    version of the atatchment. */
 static char *
 attach_to_buffer (LPATTACH att, size_t *r_nbytes)
 {
+  TSTART;
   HRESULT hr;
   LPSTREAM stream;
   STATSTG statInfo;
@@ -2509,7 +2631,7 @@ attach_to_buffer (LPATTACH att, size_t *r_nbytes)
     {
       log_error ("%s:%s: can't open data stream of attachment: hr=%#lx",
                  SRCNAME, __func__, hr);
-      return NULL;
+      TRETURN NULL;
     }
 
   hr = stream->Stat (&statInfo, STATFLAG_NONAME);
@@ -2517,7 +2639,7 @@ attach_to_buffer (LPATTACH att, size_t *r_nbytes)
     {
       log_error ("%s:%s: Stat failed: hr=%#lx", SRCNAME, __func__, hr);
       gpgol_release (stream);
-      return NULL;
+      TRETURN NULL;
     }
 
   /* Allocate one byte more so that we can terminate the string.  */
@@ -2529,7 +2651,7 @@ attach_to_buffer (LPATTACH att, size_t *r_nbytes)
       log_error ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr);
       xfree (buffer);
       gpgol_release (stream);
-      return NULL;
+      TRETURN NULL;
     }
   if (nread != statInfo.cbSize.QuadPart)
     {
@@ -2545,7 +2667,7 @@ attach_to_buffer (LPATTACH att, size_t *r_nbytes)
 
   if (r_nbytes)
     *r_nbytes = nread;
-  return buffer;
+  TRETURN buffer;
 }
 
 
@@ -2557,12 +2679,15 @@ char *
 mapi_get_attach (LPMESSAGE message,
                  mapi_attach_item_t *item, size_t *r_nbytes)
 {
+  TSTART;
   HRESULT hr;
   LPATTACH att;
   char *buffer;
 
   if (!item || item->end_of_table || item->mapipos == -1)
-    return NULL;
+    {
+      TRETURN NULL;
+    }
 
   hr = message->OpenAttach (item->mapipos, NULL, MAPI_BEST_ACCESS, &att);
   memdbg_addRef (att);
@@ -2570,19 +2695,19 @@ mapi_get_attach (LPMESSAGE message,
     {
       log_error ("%s:%s: can't open attachment at %d: hr=%#lx",
                  SRCNAME, __func__, item->mapipos, hr);
-      return NULL;
+      TRETURN NULL;
     }
   if (item->method != ATTACH_BY_VALUE)
     {
       log_error ("%s:%s: attachment: method not supported", SRCNAME, __func__);
       gpgol_release (att);
-      return NULL;
+      TRETURN NULL;
     }
 
   buffer = attach_to_buffer (att, r_nbytes);
   gpgol_release (att);
 
-  return buffer;
+  TRETURN buffer;
 }
 
 
@@ -2591,13 +2716,16 @@ mapi_get_attach (LPMESSAGE message,
 int 
 mapi_mark_moss_attach (LPMESSAGE message, mapi_attach_item_t *item)
 {
+  TSTART;
   int retval = -1;
   HRESULT hr;
   LPATTACH att;
   SPropValue prop;
 
   if (!item || item->end_of_table || item->mapipos == -1)
-    return -1;
+    {
+      TRETURN -1;
+    }
 
   log_debug ("%s:%s: Marking %i as MOSS attachment",
              SRCNAME, __func__, item->mapipos);
@@ -2608,7 +2736,7 @@ mapi_mark_moss_attach (LPMESSAGE message, mapi_attach_item_t *item)
     {
       log_error ("%s:%s: can't open attachment at %d: hr=%#lx",
                  SRCNAME, __func__, item->mapipos, hr);
-      return -1;
+      TRETURN -1;
     }
 
   if (get_gpgolattachtype_tag (message, &prop.ulPropTag) )
@@ -2619,7 +2747,7 @@ mapi_mark_moss_attach (LPMESSAGE message, mapi_attach_item_t *item)
     {
       log_error ("%s:%s: can't set %s property: hr=%#lx\n",
                  SRCNAME, __func__, "GpgOL Attach Type", hr); 
-      return false;
+      TRETURN false;
     }
 
   prop.ulPropTag = PR_ATTACHMENT_HIDDEN;
@@ -2645,7 +2773,7 @@ mapi_mark_moss_attach (LPMESSAGE message, mapi_attach_item_t *item)
     
  leave:
   gpgol_release (att);
-  return retval;
+  TRETURN retval;
 }
 
 
@@ -2654,6 +2782,7 @@ mapi_mark_moss_attach (LPMESSAGE message, mapi_attach_item_t *item)
 int 
 mapi_set_attach_hidden (LPATTACH attach)
 {
+  TSTART;
   int retval = -1;
   HRESULT hr;
   LPSPropValue propval;
@@ -2663,7 +2792,7 @@ mapi_set_attach_hidden (LPATTACH attach)
   if (SUCCEEDED (hr) 
       && PROP_TYPE (propval->ulPropTag) == PT_BOOLEAN
       && propval->Value.b)
-    return 0;/* Already set to hidden. */
+    TRETURN 0;/* Already set to hidden. */
 
   prop.ulPropTag = PR_ATTACHMENT_HIDDEN;
   prop.Value.b = TRUE;
@@ -2686,7 +2815,7 @@ mapi_set_attach_hidden (LPATTACH attach)
   retval = 0;
     
  leave:
-  return retval;
+  TRETURN retval;
 }
 
 
@@ -2694,19 +2823,22 @@ mapi_set_attach_hidden (LPATTACH attach)
 int
 mapi_test_attach_hidden (LPATTACH attach)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   int result = 0;
   
   hr = HrGetOneProp ((LPMAPIPROP)attach, PR_ATTACHMENT_HIDDEN, &propval);
   if (FAILED (hr))
-    return result; /* No.  */  
+    {
+      TRETURN result; /* No.  */
+    }
   
   if (PROP_TYPE (propval->ulPropTag) == PT_BOOLEAN && propval->Value.b)
     result = 1; /* Yes.  */
 
   MAPIFreeBuffer (propval);
-  return result;
+  TRETURN result;
 }
 
 
@@ -2716,23 +2848,28 @@ mapi_test_attach_hidden (LPATTACH attach)
 int
 mapi_has_sig_status (LPMESSAGE msg)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   ULONG tag;
   int yes;
 
   if (get_gpgolsigstatus_tag (msg, &tag) )
-    return 0; /* Error:  Assume No.  */
+    {
+      TRETURN 0; /* Error:  Assume No.  */
+    }
   hr = HrGetOneProp ((LPMAPIPROP)msg, tag, &propval);
   if (FAILED (hr))
-    return 0; /* No.  */  
+    {
+      TRETURN 0; /* No.  */
+    }
   if (PROP_TYPE (propval->ulPropTag) == PT_STRING8)
     yes = 1;
   else
     yes = 0;
 
   MAPIFreeBuffer (propval);
-  return yes;
+  TRETURN yes;
 }
 
 
@@ -2741,18 +2878,23 @@ mapi_has_sig_status (LPMESSAGE msg)
 int
 mapi_test_sig_status (LPMESSAGE msg)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   ULONG tag;
   int yes;
 
   if (get_gpgolsigstatus_tag (msg, &tag) )
-    return 0; /* Error:  Assume No.  */
+    {
+      TRETURN 0; /* Error:  Assume No.  */
+    }
   hr = HrGetOneProp ((LPMAPIPROP)msg, tag, &propval);
   if (FAILED (hr))
-    return 0; /* No.  */  
+    {
+      TRETURN 0; /* No.  */
+    }
 
-  /* We return False if we have an unknown signature status (?) or the
+  /* We TRETURN False if we have an unknown signature status (?) or the
      message has been sent by us and not yet checked (@).  */
   if (PROP_TYPE (propval->ulPropTag) == PT_STRING8)
     yes = !(propval->Value.lpszA && (!strcmp (propval->Value.lpszA, "?")
@@ -2761,7 +2903,7 @@ mapi_test_sig_status (LPMESSAGE msg)
     yes = 0;
 
   MAPIFreeBuffer (propval);
-  return yes;
+  TRETURN yes;
 }
 
 
@@ -2770,23 +2912,28 @@ mapi_test_sig_status (LPMESSAGE msg)
 char *
 mapi_get_sig_status (LPMESSAGE msg)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   ULONG tag;
   char *retstr;
 
   if (get_gpgolsigstatus_tag (msg, &tag) )
-    return xstrdup ("[Error getting tag for sig status]");
+    {
+      TRETURN xstrdup ("[Error getting tag for sig status]");
+    }
   hr = HrGetOneProp ((LPMAPIPROP)msg, tag, &propval);
   if (FAILED (hr))
-    return xstrdup ("");
+    {
+      TRETURN xstrdup ("");
+    }
   if (PROP_TYPE (propval->ulPropTag) == PT_STRING8)
     retstr = xstrdup (propval->Value.lpszA);
   else
     retstr = xstrdup ("[Sig status has an invalid type]");
 
   MAPIFreeBuffer (propval);
-  return retstr;
+  TRETURN retstr;
 }
 
 
@@ -2806,11 +2953,14 @@ mapi_get_sig_status (LPMESSAGE msg)
 int 
 mapi_set_sig_status (LPMESSAGE message, const char *status_string)
 {
+  TSTART;
   HRESULT hr;
   SPropValue prop;
 
   if (get_gpgolsigstatus_tag (message, &prop.ulPropTag) )
-    return -1;
+    {
+      TRETURN -1;
+    }
   prop.Value.lpszA = xstrdup (status_string);
   hr = HrSetOneProp (message, &prop);  
   xfree (prop.Value.lpszA);
@@ -2818,10 +2968,10 @@ mapi_set_sig_status (LPMESSAGE message, const char *status_string)
     {
       log_error ("%s:%s: can't set %s property: hr=%#lx\n",
                  SRCNAME, __func__, "GpgOL Sig Status", hr); 
-      return -1;
+      TRETURN -1;
     }
 
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -2835,11 +2985,14 @@ mapi_set_sig_status (LPMESSAGE message, const char *status_string)
 int 
 mapi_set_gpgol_msg_class (LPMESSAGE message, const char *name)
 {
+  TSTART;
   HRESULT hr;
   SPropValue prop;
 
   if (get_gpgolmsgclass_tag (message, &prop.ulPropTag) )
-    return -1;
+    {
+      TRETURN -1;
+    }
   prop.Value.lpszA = xstrdup (name);
   hr = HrSetOneProp (message, &prop);  
   xfree (prop.Value.lpszA);
@@ -2847,10 +3000,10 @@ mapi_set_gpgol_msg_class (LPMESSAGE message, const char *name)
     {
       log_error ("%s:%s: can't set %s property: hr=%#lx\n",
                  SRCNAME, __func__, "GpgOL Msg Class", hr); 
-      return -1;
+      TRETURN -1;
     }
 
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -2860,16 +3013,21 @@ mapi_set_gpgol_msg_class (LPMESSAGE message, const char *name)
 char *
 mapi_get_gpgol_charset (LPMESSAGE obj)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   ULONG tag;
   char *retstr;
 
   if (get_gpgolcharset_tag (obj, &tag) )
-    return NULL; /* Error.  */
+    {
+      TRETURN NULL; /* Error.  */
+    }
   hr = HrGetOneProp ((LPMAPIPROP)obj, tag, &propval);
   if (FAILED (hr))
-    return NULL;
+    {
+      TRETURN NULL;
+    }
   if (PROP_TYPE (propval->ulPropTag) == PT_STRING8)
     {
       if (!strcmp (propval->Value.lpszA, "utf-8"))
@@ -2881,7 +3039,7 @@ mapi_get_gpgol_charset (LPMESSAGE obj)
     retstr = NULL;
 
   MAPIFreeBuffer (propval);
-  return retstr;
+  TRETURN retstr;
 }
 
 
@@ -2890,6 +3048,7 @@ mapi_get_gpgol_charset (LPMESSAGE obj)
 int 
 mapi_set_gpgol_charset (LPMESSAGE obj, const char *charset)
 {
+  TSTART;
   HRESULT hr;
   SPropValue prop;
   char *p;
@@ -2898,7 +3057,9 @@ mapi_set_gpgol_charset (LPMESSAGE obj, const char *charset)
      characters.  The latter is required to make sure that
      HrSetOneProp will always work.  */
   if (get_gpgolcharset_tag (obj, &prop.ulPropTag) )
-    return -1;
+    {
+      TRETURN -1;
+    }
   prop.Value.lpszA = xstrdup (charset);
   for (p=prop.Value.lpszA; *p; p++)
     *p = tolower (*(unsigned char*)p);
@@ -2910,10 +3071,10 @@ mapi_set_gpgol_charset (LPMESSAGE obj, const char *charset)
     {
       log_error ("%s:%s: can't set %s property: hr=%#lx\n",
                  SRCNAME, __func__, "GpgOL Charset", hr); 
-      return -1;
+      TRETURN -1;
     }
 
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -2923,23 +3084,28 @@ mapi_set_gpgol_charset (LPMESSAGE obj, const char *charset)
 char *
 mapi_get_gpgol_draft_info (LPMESSAGE msg)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   ULONG tag;
   char *retstr;
 
   if (get_gpgoldraftinfo_tag (msg, &tag) )
-    return NULL;
+    {
+      TRETURN NULL;
+    }
   hr = HrGetOneProp ((LPMAPIPROP)msg, tag, &propval);
   if (FAILED (hr))
-    return NULL;
+    {
+      TRETURN NULL;
+    }
   if (PROP_TYPE (propval->ulPropTag) == PT_STRING8)
     retstr = xstrdup (propval->Value.lpszA);
   else
     retstr = NULL;
 
   MAPIFreeBuffer (propval);
-  return retstr;
+  TRETURN retstr;
 }
 
 
@@ -2962,12 +3128,15 @@ mapi_get_gpgol_draft_info (LPMESSAGE msg)
 int 
 mapi_set_gpgol_draft_info (LPMESSAGE message, const char *string)
 {
+  TSTART;
   HRESULT hr;
   SPropValue prop;
   SPropTagArray proparray;
 
   if (get_gpgoldraftinfo_tag (message, &prop.ulPropTag) )
-    return -1;
+    {
+      TRETURN -1;
+    }
   if (string)
     {
       prop.Value.lpszA = xstrdup (string);
@@ -2985,10 +3154,10 @@ mapi_set_gpgol_draft_info (LPMESSAGE message, const char *string)
       log_error ("%s:%s: can't %s %s property: hr=%#lx\n",
                  SRCNAME, __func__, string?"set":"delete",
                  "GpgOL Draft Info", hr); 
-      return -1;
+      TRETURN -1;
     }
 
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -2997,23 +3166,28 @@ mapi_set_gpgol_draft_info (LPMESSAGE message, const char *string)
 char *
 mapi_get_mime_info (LPMESSAGE msg)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   ULONG tag;
   char *retstr;
 
   if (get_gpgolmimeinfo_tag (msg, &tag) )
-    return xstrdup ("[Error getting tag for MIME info]");
+    {
+      TRETURN xstrdup ("[Error getting tag for MIME info]");
+    }
   hr = HrGetOneProp ((LPMAPIPROP)msg, tag, &propval);
   if (FAILED (hr))
-    return xstrdup ("");
+    {
+      TRETURN xstrdup ("");
+    }
   if (PROP_TYPE (propval->ulPropTag) == PT_STRING8)
     retstr = xstrdup (propval->Value.lpszA);
   else
     retstr = xstrdup ("[MIME info has an invalid type]");
 
   MAPIFreeBuffer (propval);
-  return retstr;
+  TRETURN retstr;
 }
 
 
@@ -3027,11 +3201,12 @@ mapi_get_mime_info (LPMESSAGE msg)
 int
 get_gpgol_draft_info_flags (LPMESSAGE message)
 {
+  TSTART;
   char *buf = mapi_get_gpgol_draft_info (message);
   int ret = 0;
   if (!buf)
     {
-      return 0;
+      TRETURN 0;
     }
   if (buf[0] == 'E')
     {
@@ -3042,7 +3217,7 @@ get_gpgol_draft_info_flags (LPMESSAGE message)
       ret |= 2;
     }
   xfree (buf);
-  return ret;
+  TRETURN ret;
 }
 
 /* Sets the draft info flags. Protocol is always Auto.
@@ -3052,13 +3227,14 @@ get_gpgol_draft_info_flags (LPMESSAGE message)
 int
 set_gpgol_draft_info_flags (LPMESSAGE message, int flags)
 {
+  TSTART;
   char buf[4];
   buf[3] = '\0';
   buf[2] = 'A'; /* Protocol */
   buf[1] = flags & 2 ? 'S' : 's';
   buf[0] = flags & 1 ? 'E' : 'e';
 
-  return mapi_set_gpgol_draft_info (message, buf);
+  TRETURN mapi_set_gpgol_draft_info (message, buf);
 }
 
 
@@ -3067,13 +3243,16 @@ static int
 get_message_content_type_cb (void *dummy_arg,
                              rfc822parse_event_t event, rfc822parse_t msg)
 {
+  TSTART;
   (void)dummy_arg;
   (void)msg;
 
   if (event == RFC822PARSE_T2BODY)
-    return 42; /* Hack to stop the parsing after having read the
-                  outer headers. */
-  return 0;
+    {
+      TRETURN 42; /* Hack to stop the parsing after having read the
+                     outer headers. */
+    }
+  TRETURN 0;
 }
 
 
@@ -3087,6 +3266,7 @@ char *
 mapi_get_message_content_type (LPMESSAGE message,
                                char **r_protocol, char **r_smtype)
 {
+  TSTART;
   rfc822parse_t msg;
   const char *header_lines, *s;
   rfc822parse_field_t ctx;
@@ -3104,7 +3284,7 @@ mapi_get_message_content_type (LPMESSAGE message,
     {
       log_error ("%s:%s: rfc822parse_open failed",
                  SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
 
   const std::string hdrStr = mapi_get_header (message);
@@ -3114,7 +3294,7 @@ mapi_get_message_content_type (LPMESSAGE message,
       log_error ("%s:%s: failed to get headers",
                  SRCNAME, __func__);
       rfc822parse_close (msg);
-      return NULL;
+      TRETURN NULL;
     }
 
   header_lines = hdrStr.c_str();
@@ -3131,7 +3311,7 @@ mapi_get_message_content_type (LPMESSAGE message,
                      SRCNAME, __func__);
           retstr = xstrdup ("wks.confirmation.mail");
           rfc822parse_close (msg);
-          return retstr;
+          TRETURN retstr;
         }
 
       rfc822parse_insert (msg, (const unsigned char*)header_lines, length);
@@ -3166,7 +3346,7 @@ mapi_get_message_content_type (LPMESSAGE message,
     }
 
   rfc822parse_close (msg);
-  return retstr;
+  TRETURN retstr;
 }
 
 
@@ -3175,30 +3355,36 @@ mapi_get_message_content_type (LPMESSAGE message,
 int
 mapi_has_last_decrypted (LPMESSAGE message)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval = NULL;
   ULONG tag;
   int yes = 0;
   
   if (get_gpgollastdecrypted_tag (message, &tag) )
-    return 0; /* No.  */
+    {
+      TRETURN 0; /* No.  */
+    }
   hr = HrGetOneProp ((LPMAPIPROP)message, tag, &propval);
   if (FAILED (hr))
-    return 0; /* No.  */  
+    {
+      TRETURN 0; /* No.  */
+    }
   
   if (PROP_TYPE (propval->ulPropTag) == PT_BINARY)
     yes = 1;
 
   MAPIFreeBuffer (propval);
-  return yes;
+  TRETURN yes;
 }
 
 
 /* Helper to check whether the file name of OBJ is "smime.p7m".
-   Returns on true if so.  */
+   returns on true if so.  */
 static int
 has_smime_filename (LPATTACH obj)
 {
+  TSTART;
   HRESULT hr;
   LPSPropValue propval;
   int yes = 0;
@@ -3208,7 +3394,9 @@ has_smime_filename (LPATTACH obj)
     {
       hr = HrGetOneProp ((LPMAPIPROP)obj, PR_ATTACH_LONG_FILENAME, &propval);
       if (FAILED(hr))
-        return 0;
+        {
+          TRETURN 0;
+        }
     }
 
   if ( PROP_TYPE (propval->ulPropTag) == PT_UNICODE)
@@ -3222,7 +3410,7 @@ has_smime_filename (LPATTACH obj)
         yes = 1;
     }
   MAPIFreeBuffer (propval);
-  return yes;
+  TRETURN yes;
 }
 
 
@@ -3230,6 +3418,7 @@ has_smime_filename (LPATTACH obj)
 int
 mapi_body_to_attachment (LPMESSAGE message)
 {
+  TSTART;
   HRESULT hr;
   LPSTREAM instream;
   ULONG newpos;
@@ -3241,7 +3430,9 @@ mapi_body_to_attachment (LPMESSAGE message)
 
   instream = mapi_get_body_as_stream (message);
   if (!instream)
-    return -1;
+    {
+      TRETURN -1;
+    }
 
   log_debug ("%s:%s: Creating MOSS body attachment",
              SRCNAME, __func__);
@@ -3356,17 +3547,18 @@ mapi_body_to_attachment (LPMESSAGE message)
   if (newatt)
     gpgol_release (newatt);
   gpgol_release (instream);
-  return hr? -1:0;
+  TRETURN hr? -1:0;
 }
 
 int
 mapi_mark_or_create_moss_attach (LPMESSAGE message, msgtype_t msgtype)
 {
+  TSTART;
   int i;
   if (msgtype == MSGTYPE_UNKNOWN ||
       msgtype == MSGTYPE_GPGOL)
     {
-      return 0;
+      TRETURN 0;
     }
 
   /* First check if we already have one marked. */
@@ -3405,7 +3597,7 @@ mapi_mark_or_create_moss_attach (LPMESSAGE message, msgtype_t msgtype)
         {
           log_error ("%s:%s: can't open attachment at %d",
                      SRCNAME, __func__, item->mapipos);
-          return -1;
+          TRETURN -1;
         }
       memdbg_addRef (att);
       if (!mapi_test_attach_hidden (att))
@@ -3414,8 +3606,10 @@ mapi_mark_or_create_moss_attach (LPMESSAGE message, msgtype_t msgtype)
         }
       gpgol_release (att);
       if (part2)
-        return part2;
-      return part1;
+        {
+          TRETURN part2;
+        }
+      TRETURN part1;
     }
 
   if (msgtype == MSGTYPE_GPGOL_CLEAR_SIGNED ||
@@ -3427,20 +3621,20 @@ mapi_mark_or_create_moss_attach (LPMESSAGE message, msgtype_t msgtype)
         {
           log_error ("%s:%s: Failed to create body attachment.",
                      SRCNAME, __func__);
-          return 0;
+          TRETURN 0;
         }
       log_debug ("%s:%s: Created body attachment. Repeating lookup.",
                  SRCNAME, __func__);
       /* The position of the MOSS attach might change depending on
          the attachment count of the mail. So repeat the check to get
          the right position. */
-      return mapi_mark_or_create_moss_attach (message, msgtype);
+      TRETURN mapi_mark_or_create_moss_attach (message, msgtype);
     }
   if (!table)
     {
       log_debug ("%s:%s: Neither pgp inline nor an attachment table.",
                  SRCNAME, __func__);
-      return 0;
+      TRETURN 0;
     }
 
   /* MIME Mails check for S/MIME first. */
@@ -3458,7 +3652,7 @@ mapi_mark_or_create_moss_attach (LPMESSAGE message, msgtype_t msgtype)
     {
       mapi_mark_moss_attach (message, table + i);
       mapi_release_attach_table (table);
-      return i + 1;
+      TRETURN i + 1;
     }
 
   /* PGP/MIME or S/MIME stuff.  */
@@ -3491,7 +3685,7 @@ mapi_mark_or_create_moss_attach (LPMESSAGE message, msgtype_t msgtype)
           mapi_mark_moss_attach (message, table+part1_idx);
           mapi_mark_moss_attach (message, table+part2_idx);
           mapi_release_attach_table (table);
-          return 2;
+          TRETURN 2;
         }
     }
 
@@ -3505,9 +3699,9 @@ mapi_mark_or_create_moss_attach (LPMESSAGE message, msgtype_t msgtype)
          we have a mean to find it again (see above).  */
       mapi_mark_moss_attach (message, table + 0);
       mapi_release_attach_table (table);
-      return 1;
+      TRETURN 1;
     }
 
    mapi_release_attach_table (table);
-   return 0; /* No original attachment - this should not happen.  */
+   TRETURN 0; /* No original attachment - this should not happen.  */
 }
index 16eb230..9f57f17 100644 (file)
@@ -132,30 +132,37 @@ debug_message_event (rfc822parse_event_t event)
   log_data ("%s: rfc822 event %s\n", SRCNAME, s);
 }
 
-/* Returns true if the BER encoded data in BUFFER is CMS signed data.
+/* returns true if the BER encoded data in BUFFER is CMS signed data.
    LENGTH gives the length of the buffer, for correct detection LENGTH
    should be at least about 24 bytes.  */
 #if 0
 static int
 is_cms_signed_data (const char *buffer, size_t length)
 {
+  TSTART;
   const char *p = buffer;
   size_t n = length;
   tlvinfo_t ti;
 
   if (parse_tlv (&p, &n, &ti))
-    return 0;
+    {
+      TRETURN 0;
+    }
   if (!(ti.cls == ASN1_CLASS_UNIVERSAL && ti.tag == ASN1_TAG_SEQUENCE
         && ti.is_cons) )
-    return 0;
+    TRETURN 0;
   if (parse_tlv (&p, &n, &ti))
-    return 0;
+    {
+      TRETURN 0;
+    }
   if (!(ti.cls == ASN1_CLASS_UNIVERSAL && ti.tag == ASN1_TAG_OBJECT_ID
         && !ti.is_cons && ti.length) || ti.length > n)
-    return 0;
+    TRETURN 0;
   if (ti.length == 9 && !memcmp (p, "\x2A\x86\x48\x86\xF7\x0D\x01\x07\x02", 9))
-    return 1;
-  return 0;
+    {
+      TRETURN 1;
+    }
+  TRETURN 0;
 }
 #endif
 
@@ -170,6 +177,7 @@ is_cms_signed_data (const char *buffer, size_t length)
 static int
 t2body (MimeDataProvider *provider, rfc822parse_t msg)
 {
+  TSTART;
   rfc822parse_field_t field;
   mime_context_t ctx = provider->mime_context ();
   const char *ctmain, *ctsub;
@@ -410,13 +418,14 @@ t2body (MimeDataProvider *provider, rfc822parse_t msg)
                        SRCNAME, __func__);
     }
 
-  return 0;
+  TRETURN 0;
 }
 
 static int
 message_cb (void *opaque, rfc822parse_event_t event,
             rfc822parse_t msg)
 {
+  TSTART;
   int retval = 0;
 
   MimeDataProvider *provider = static_cast<MimeDataProvider*> (opaque);
@@ -481,7 +490,7 @@ message_cb (void *opaque, rfc822parse_event_t event,
       break;
     }
 
-  return retval;
+  TRETURN retval;
 }
 
 MimeDataProvider::MimeDataProvider(bool no_headers) :
@@ -489,16 +498,19 @@ MimeDataProvider::MimeDataProvider(bool no_headers) :
   m_has_html_body(false),
   m_collect_everything(no_headers)
 {
+  TSTART;
   memdbg_ctor ("MimeDataProvider");
   m_mime_ctx = (mime_context_t) xcalloc (1, sizeof *m_mime_ctx);
   m_mime_ctx->msg = rfc822parse_open (message_cb, this);
   m_mime_ctx->mimestruct_tail = &m_mime_ctx->mimestruct;
+  TRETURN;
 }
 
 #ifdef HAVE_W32_SYSTEM
 MimeDataProvider::MimeDataProvider(LPSTREAM stream, bool no_headers):
   MimeDataProvider(no_headers)
 {
+  TSTART;
   if (stream)
     {
       stream->AddRef ();
@@ -507,25 +519,29 @@ MimeDataProvider::MimeDataProvider(LPSTREAM stream, bool no_headers):
   else
     {
       log_error ("%s:%s called without stream ", SRCNAME, __func__);
-      return;
+      TRETURN;
     }
   log_data ("%s:%s Collecting data.", SRCNAME, __func__);
   collect_data (stream);
   log_data ("%s:%s Data collected.", SRCNAME, __func__);
   gpgol_release (stream);
+  TRETURN;
 }
 #endif
 
 MimeDataProvider::MimeDataProvider(FILE *stream, bool no_headers):
   MimeDataProvider(no_headers)
 {
+  TSTART;
   log_data ("%s:%s Collecting data from file.", SRCNAME, __func__);
   collect_data (stream);
   log_data ("%s:%s Data collected.", SRCNAME, __func__);
+  TRETURN;
 }
 
 MimeDataProvider::~MimeDataProvider()
 {
+  TSTART;
   memdbg_dtor ("MimeDataProvider");
   log_debug ("%s:%s", SRCNAME, __func__);
   while (m_mime_ctx->mimestruct)
@@ -544,12 +560,14 @@ MimeDataProvider::~MimeDataProvider()
     {
       delete m_signature;
     }
+  TRETURN;
 }
 
 bool
 MimeDataProvider::isSupported(GpgME::DataProvider::Operation op) const
 {
-  return op == GpgME::DataProvider::Read ||
+  TSTART;
+  TRETURN op == GpgME::DataProvider::Read ||
          op == GpgME::DataProvider::Seek ||
          op == GpgME::DataProvider::Write ||
          op == GpgME::DataProvider::Release;
@@ -558,6 +576,7 @@ MimeDataProvider::isSupported(GpgME::DataProvider::Operation op) const
 ssize_t
 MimeDataProvider::read(void *buffer, size_t size)
 {
+  TSTART;
   log_data ("%s:%s: Reading: " SIZE_T_FORMAT "Bytes",
                  SRCNAME, __func__, size);
   ssize_t bRead = m_crypto_data.read (buffer, size);
@@ -577,15 +596,16 @@ MimeDataProvider::read(void *buffer, size_t size)
                            string_to_hex (buf).c_str ());
         }
     }
-  return bRead;
+  TRETURN bRead;
 }
 
 /* Split some raw data into lines and handle them accordingly.
-   returns the amount of bytes not taken from the input buffer.
+   Returns the amount of bytes not taken from the input buffer.
 */
 size_t
 MimeDataProvider::collect_input_lines(const char *input, size_t insize)
 {
+  TSTART;
   char linebuf[LINEBUFSIZE];
   const char *s = input;
   size_t pos = 0;
@@ -601,7 +621,7 @@ MimeDataProvider::collect_input_lines(const char *input, size_t insize)
           log_error ("%s:%s: rfc822 parser failed: line too long\n",
                      SRCNAME, __func__);
           GpgME::Error::setSystemError (GPG_ERR_EIO);
-          return not_taken;
+          TRETURN not_taken;
         }
       if (*s != '\n')
         linebuf[pos++] = *s;
@@ -623,7 +643,7 @@ MimeDataProvider::collect_input_lines(const char *input, size_t insize)
             {
               log_error ("%s:%s: rfc822 parser failed: %s\n",
                          SRCNAME, __func__, strerror (errno));
-              return not_taken;
+              TRETURN not_taken;
             }
 
           /* Check if the first line of the body is actually
@@ -769,16 +789,17 @@ MimeDataProvider::collect_input_lines(const char *input, size_t insize)
           pos = 0;
         }
     }
-  return not_taken;
+  TRETURN not_taken;
 }
 
 #ifdef HAVE_W32_SYSTEM
 void
 MimeDataProvider::collect_data(LPSTREAM stream)
 {
+  TSTART;
   if (!stream)
     {
-      return;
+      TRETURN;
     }
   HRESULT hr;
   char buf[BUFSIZE];
@@ -910,15 +931,17 @@ MimeDataProvider::collect_data(LPSTREAM stream)
           m_crypto_data.write (line.c_str (), line.size ());
         }
     }
+  TRETURN;
 }
 #endif
 
 void
 MimeDataProvider::collect_data(FILE *stream)
 {
+  TSTART;
   if (!stream)
     {
-      return;
+      TRETURN;
     }
   char buf[BUFSIZE];
   size_t bRead;
@@ -946,16 +969,18 @@ MimeDataProvider::collect_data(FILE *stream)
           log_error ("%s:%s: Collect failed to consume anything.\n"
                      "Buffer too small?",
                      SRCNAME, __func__);
-          return;
+          TRETURN;
         }
       log_data ("%s:%s: Consumed: " SIZE_T_FORMAT " bytes",
                        SRCNAME, __func__, m_rawbuf.size() - not_taken);
       m_rawbuf.erase (0, m_rawbuf.size() - not_taken);
     }
+  TRETURN;
 }
 
 ssize_t MimeDataProvider::write(const void *buffer, size_t bufSize)
 {
+  TSTART;
   if (m_collect_everything)
     {
       /* Writing with collect everything one means that we are outputprovider.
@@ -963,7 +988,7 @@ ssize_t MimeDataProvider::write(const void *buffer, size_t bufSize)
       log_data ("%s:%s: Using complete input as body " SIZE_T_FORMAT " bytes.",
                        SRCNAME, __func__, bufSize);
       m_body += std::string ((const char *) buffer, bufSize);
-      return bufSize;
+      TRETURN bufSize;
     }
   m_rawbuf += std::string ((const char*)buffer, bufSize);
   size_t not_taken = collect_input_lines (m_rawbuf.c_str(),
@@ -974,29 +999,32 @@ ssize_t MimeDataProvider::write(const void *buffer, size_t bufSize)
       log_error ("%s:%s: Write failed to consume anything.\n"
                  "Buffer too small? or no newlines in text?",
                  SRCNAME, __func__);
-      return bufSize;
+      TRETURN bufSize;
     }
   log_data ("%s:%s: Write Consumed: " SIZE_T_FORMAT " bytes",
                    SRCNAME, __func__, m_rawbuf.size() - not_taken);
   m_rawbuf.erase (0, m_rawbuf.size() - not_taken);
-  return bufSize;
+  TRETURN bufSize;
 }
 
 off_t
 MimeDataProvider::seek(off_t offset, int whence)
 {
-  return m_crypto_data.seek (offset, whence);
+  TSTART;
+  TRETURN m_crypto_data.seek (offset, whence);
 }
 
 GpgME::Data *
 MimeDataProvider::signature() const
 {
-  return m_signature;
+  TSTART;
+  TRETURN m_signature;
 }
 
 std::shared_ptr<Attachment>
 MimeDataProvider::create_attachment()
 {
+  TSTART;
   log_data ("%s:%s: Creating attachment.",
                    SRCNAME, __func__);
 
@@ -1026,12 +1054,13 @@ MimeDataProvider::create_attachment()
     }
   m_attachments.push_back (attach);
 
-  return attach;
+  TRETURN attach;
   /* TODO handle encoding */
 }
 
 void MimeDataProvider::finalize ()
 {
+  TSTART;
   if (m_rawbuf.size ())
     {
       m_rawbuf += "\r\n";
@@ -1044,24 +1073,29 @@ void MimeDataProvider::finalize ()
                      SRCNAME, __func__);
         }
     }
+  TRETURN;
 }
 
 const std::string &MimeDataProvider::get_body ()
 {
-  return m_body;
+  TSTART;
+  TRETURN m_body;
 }
 
 const std::string &MimeDataProvider::get_html_body ()
 {
-  return m_html_body;
+  TSTART;
+  TRETURN m_html_body;
 }
 
 const std::string &MimeDataProvider::get_html_charset() const
 {
-  return m_html_charset;
+  TSTART;
+  TRETURN m_html_charset;
 }
 
 const std::string &MimeDataProvider::get_body_charset() const
 {
-  return m_body_charset;
+  TSTART;
+  TRETURN m_body_charset;
 }
index f7d7bc5..851b7ba 100644 (file)
 HRESULT
 gpgol_queryInterface (LPUNKNOWN pObj, REFIID riid, LPVOID FAR *ppvObj)
 {
+  TSTART;
   HRESULT ret = pObj->QueryInterface (riid, ppvObj);
   if ((opt.enable_debug & DBG_OOM_EXTRA) && *ppvObj)
     {
       memdbg_addRef (*ppvObj);
     }
-  return ret;
+  TRETURN ret;
 }
 
 HRESULT
@@ -50,6 +51,7 @@ gpgol_openProperty (LPMAPIPROP obj, ULONG ulPropTag, LPCIID lpiid,
                     ULONG ulInterfaceOptions, ULONG ulFlags,
                     LPUNKNOWN FAR * lppUnk)
 {
+  TSTART;
   HRESULT ret = obj->OpenProperty (ulPropTag, lpiid,
                                    ulInterfaceOptions, ulFlags,
                                    lppUnk);
@@ -59,13 +61,14 @@ gpgol_openProperty (LPMAPIPROP obj, ULONG ulPropTag, LPCIID lpiid,
       log_debug ("%s:%s: OpenProperty on %p prop %lx result %p",
                  SRCNAME, __func__, obj,  ulPropTag, *lppUnk);
     }
-  return ret;
+  TRETURN ret;
 }
 /* Return a malloced string with the utf-8 encoded name of the object
    or NULL if not available.  */
 char *
 get_object_name (LPUNKNOWN obj)
 {
+  TSTART;
   HRESULT hr;
   LPDISPATCH disp = NULL;
   LPTYPEINFO tinfo = NULL;
@@ -105,7 +108,7 @@ get_object_name (LPUNKNOWN obj)
   if (disp)
     disp->Release ();
 
-  return name;
+  TRETURN name;
 }
 
 
@@ -114,16 +117,21 @@ get_object_name (LPUNKNOWN obj)
 DISPID
 lookup_oom_dispid (LPDISPATCH pDisp, const char *name)
 {
+  TSTART;
   HRESULT hr;
   DISPID dispid;
   wchar_t *wname;
 
   if (!pDisp || !name)
-    return DISPID_UNKNOWN; /* Error: Invalid arg.  */
+    {
+      TRETURN DISPID_UNKNOWN; /* Error: Invalid arg.  */
+    }
 
   wname = utf8_to_wchar (name);
   if (!wname)
-    return DISPID_UNKNOWN;/* Error:  Out of memory.  */
+    {
+      TRETURN DISPID_UNKNOWN;/* Error:  Out of memory.  */
+    }
 
   hr = pDisp->GetIDsOfNames (IID_NULL, &wname, 1, 
                              LOCALE_SYSTEM_DEFAULT, &dispid);
@@ -134,15 +142,16 @@ lookup_oom_dispid (LPDISPATCH pDisp, const char *name)
   if (hr != S_OK)
     dispid = DISPID_UNKNOWN;
 
-  return dispid;
+  TRETURN dispid;
 }
 
 static void
 init_excepinfo (EXCEPINFO *err)
 {
+  TSTART;
   if (!err)
     {
-      return;
+      TRETURN;
     }
   err->wCode = 0;
   err->wReserved = 0;
@@ -186,6 +195,7 @@ dump_excepinfo (EXCEPINFO err)
 LPDISPATCH
 get_oom_object (LPDISPATCH pStart, const char *fullname)
 {
+  TSTART;
   HRESULT hr;
   LPDISPATCH pObj = pStart;
   LPDISPATCH pDisp = NULL;
@@ -221,14 +231,16 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
           log_error ("%s:%s Object does not support IDispatch",
                      SRCNAME, __func__);
           gpgol_release (pObj);
-          return NULL;
+          TRETURN NULL;
         }
       /* Confirmed through testing that the retval needs a release */
       if (pObj != pStart)
         gpgol_release (pObj);
       pObj = NULL;
       if (!pDisp)
-        return NULL;  /* The object has no IDispatch interface.  */
+        {
+          TRETURN NULL;  /* The object has no IDispatch interface.  */
+        }
       if (!*fullname)
         {
           if ((opt.enable_debug & DBG_MEMORY))
@@ -238,7 +250,7 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
               log_oom ("%s:%s:         got %p with %i refs",
                        SRCNAME, __func__, pDisp, ref);
             }
-          return pDisp; /* Ready.  */
+          TRETURN pDisp; /* Ready.  */
         }
       
       /* Break out the next name part.  */
@@ -250,7 +262,7 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
         if (dot == fullname)
           {
             gpgol_release (pDisp);
-            return NULL;  /* Empty name part: error.  */
+            TRETURN NULL;  /* Empty name part: error.  */
           }
         else if (dot)
           n = dot - fullname;
@@ -298,7 +310,7 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
               if (!parmstr)
                 {
                   gpgol_release (pDisp);
-                  return NULL; /* Error:  Out of memory.  */
+                  TRETURN NULL; /* Error:  Out of memory.  */
                 }
               n_parms = 1;
             }
@@ -314,7 +326,7 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
           if (parmstr)
             SysFreeString (parmstr);
           gpgol_release (pDisp);
-          return NULL;  /* Name not found.  */
+          TRETURN NULL;  /* Name not found.  */
         }
 
       /* Invoke the method.  */
@@ -357,7 +369,7 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
           dump_excepinfo (execpinfo);
           VariantClear (&vtResult);
           gpgol_release (pDisp);
-          return NULL;  /* Invoke failed.  */
+          TRETURN NULL;  /* Invoke failed.  */
         }
 
       pObj = vtResult.pdispVal;
@@ -365,7 +377,7 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
     }
   gpgol_release (pDisp);
   log_debug ("%s:%s: no object", SRCNAME, __func__);
-  return NULL;
+  TRETURN NULL;
 }
 
 
@@ -373,6 +385,7 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
 static int
 put_picture_or_mask (LPDISPATCH pDisp, int resource, int size, int is_mask)
 {
+  TSTART;
   HRESULT hr;
   PICTDESC pdesc;
   LPDISPATCH pPict;
@@ -399,7 +412,7 @@ put_picture_or_mask (LPDISPATCH pDisp, int resource, int size, int is_mask)
     {
       log_error_w32 (-1, "%s:%s: LoadImage(%d) failed\n", 
                      SRCNAME, __func__, resource);
-      return -1;
+      TRETURN -1;
     }
 
   /* Wrap the image into an OLE object.  */
@@ -409,7 +422,7 @@ put_picture_or_mask (LPDISPATCH pDisp, int resource, int size, int is_mask)
     {
       log_error ("%s:%s: OleCreatePictureIndirect failed: hr=%#lx\n",
                  SRCNAME, __func__, hr);
-      return -1;
+      TRETURN -1;
     }
         
   /* Store to the Picture or Mask property of the CommandBarButton.  */
@@ -427,9 +440,9 @@ put_picture_or_mask (LPDISPATCH pDisp, int resource, int size, int is_mask)
   if (hr != S_OK)
     {
       log_debug ("%s:%s: Putting icon failed: %#lx", SRCNAME, __func__, hr);
-      return -1;
+      TRETURN -1;
     }
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -439,6 +452,7 @@ put_picture_or_mask (LPDISPATCH pDisp, int resource, int size, int is_mask)
 int
 put_oom_icon (LPDISPATCH pDisp, int resource_id, int size)
 {
+  TSTART;
   int rc;
 
   /* This code is only relevant for Outlook < 2010.
@@ -450,7 +464,7 @@ put_oom_icon (LPDISPATCH pDisp, int resource_id, int size)
   if (!rc)
     rc = put_picture_or_mask (pDisp, resource_id + 1, size, 1);
 
-  return rc;
+  TRETURN rc;
 }
 
 
@@ -458,6 +472,7 @@ put_oom_icon (LPDISPATCH pDisp, int resource_id, int size)
 int
 put_oom_bool (LPDISPATCH pDisp, const char *name, int value)
 {
+  TSTART;
   HRESULT hr;
   DISPID dispid_put = DISPID_PROPERTYPUT;
   DISPID dispid;
@@ -466,7 +481,9 @@ put_oom_bool (LPDISPATCH pDisp, const char *name, int value)
 
   dispid = lookup_oom_dispid (pDisp, name);
   if (dispid == DISPID_UNKNOWN)
-    return -1;
+    {
+      TRETURN -1;
+    }
 
   dispparams.rgvarg = aVariant;
   dispparams.rgvarg[0].vt = VT_BOOL;
@@ -481,9 +498,9 @@ put_oom_bool (LPDISPATCH pDisp, const char *name, int value)
     {
       log_debug ("%s:%s: Putting '%s' failed: %#lx", 
                  SRCNAME, __func__, name, hr);
-      return -1;
+      TRETURN -1;
     }
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -491,6 +508,7 @@ put_oom_bool (LPDISPATCH pDisp, const char *name, int value)
 int
 put_oom_int (LPDISPATCH pDisp, const char *name, int value)
 {
+  TSTART;
   HRESULT hr;
   DISPID dispid_put = DISPID_PROPERTYPUT;
   DISPID dispid;
@@ -499,7 +517,9 @@ put_oom_int (LPDISPATCH pDisp, const char *name, int value)
 
   dispid = lookup_oom_dispid (pDisp, name);
   if (dispid == DISPID_UNKNOWN)
-    return -1;
+    {
+      TRETURN -1;
+    }
 
   dispparams.rgvarg = aVariant;
   dispparams.rgvarg[0].vt = VT_INT;
@@ -514,9 +534,9 @@ put_oom_int (LPDISPATCH pDisp, const char *name, int value)
     {
       log_debug ("%s:%s: Putting '%s' failed: %#lx", 
                  SRCNAME, __func__, name, hr);
-      return -1;
+      TRETURN -1;
     }
-  return 0;
+  TRETURN 0;
 }
 
 
@@ -524,6 +544,7 @@ put_oom_int (LPDISPATCH pDisp, const char *name, int value)
 int
 put_oom_string (LPDISPATCH pDisp, const char *name, const char *string)
 {
+  TSTART;
   HRESULT hr;
   DISPID dispid_put = DISPID_PROPERTYPUT;
   DISPID dispid;
@@ -535,7 +556,9 @@ put_oom_string (LPDISPATCH pDisp, const char *name, const char *string)
   init_excepinfo (&execpinfo);
   dispid = lookup_oom_dispid (pDisp, name);
   if (dispid == DISPID_UNKNOWN)
-    return -1;
+    {
+      TRETURN -1;
+    }
 
   {
     wchar_t *tmp = utf8_to_wchar (string);
@@ -544,7 +567,7 @@ put_oom_string (LPDISPATCH pDisp, const char *name, const char *string)
     if (!bstring)
       {
         log_error_w32 (-1, "%s:%s: SysAllocString failed", SRCNAME, __func__);
-        return -1;
+        TRETURN -1;
       }
   }
 
@@ -563,15 +586,16 @@ put_oom_string (LPDISPATCH pDisp, const char *name, const char *string)
       log_debug ("%s:%s: Putting '%s' failed: %#lx", 
                  SRCNAME, __func__, name, hr);
       dump_excepinfo (execpinfo);
-      return -1;
+      TRETURN -1;
     }
-  return 0;
+  TRETURN 0;
 }
 
 /* Set the property NAME to DISP.  */
 int
 put_oom_disp (LPDISPATCH pDisp, const char *name, LPDISPATCH disp)
 {
+  TSTART;
   HRESULT hr;
   DISPID dispid_put = DISPID_PROPERTYPUT;
   DISPID dispid;
@@ -582,7 +606,9 @@ put_oom_disp (LPDISPATCH pDisp, const char *name, LPDISPATCH disp)
   init_excepinfo (&execpinfo);
   dispid = lookup_oom_dispid (pDisp, name);
   if (dispid == DISPID_UNKNOWN)
-    return -1;
+    {
+      TRETURN -1;
+    }
 
   dispparams.rgvarg = aVariant;
   dispparams.rgvarg[0].vt = VT_DISPATCH;
@@ -598,9 +624,9 @@ put_oom_disp (LPDISPATCH pDisp, const char *name, LPDISPATCH disp)
       log_debug ("%s:%s: Putting '%s' failed: %#lx",
                  SRCNAME, __func__, name, hr);
       dump_excepinfo (execpinfo);
-      return -1;
+      TRETURN -1;
     }
-  return 0;
+  TRETURN 0;
 }
 
 /* Get the boolean property NAME of the object PDISP.  Returns False if
@@ -608,6 +634,7 @@ put_oom_disp (LPDISPATCH pDisp, const char *name, LPDISPATCH disp)
 int
 get_oom_bool (LPDISPATCH pDisp, const char *name)
 {
+  TSTART;
   HRESULT hr;      
   int result = 0;
   DISPID dispid;
@@ -633,7 +660,7 @@ get_oom_bool (LPDISPATCH pDisp, const char *name)
       VariantClear (&rVariant);
     }
 
-  return result;
+  TRETURN result;
 }
 
 
@@ -642,6 +669,7 @@ get_oom_bool (LPDISPATCH pDisp, const char *name)
 int
 get_oom_int (LPDISPATCH pDisp, const char *name)
 {
+  TSTART;
   HRESULT hr;      
   int result = 0;
   DISPID dispid;
@@ -667,7 +695,7 @@ get_oom_int (LPDISPATCH pDisp, const char *name)
       VariantClear (&rVariant);
     }
 
-  return result;
+  TRETURN result;
 }
 
 
@@ -676,6 +704,7 @@ get_oom_int (LPDISPATCH pDisp, const char *name)
 char *
 get_oom_string (LPDISPATCH pDisp, const char *name)
 {
+  TSTART;
   HRESULT hr;      
   char *result = NULL;
   DISPID dispid;
@@ -701,7 +730,7 @@ get_oom_string (LPDISPATCH pDisp, const char *name)
       VariantClear (&rVariant);
     }
 
-  return result;
+  TRETURN result;
 }
 
 
@@ -710,6 +739,7 @@ get_oom_string (LPDISPATCH pDisp, const char *name)
 LPUNKNOWN
 get_oom_iunknown (LPDISPATCH pDisp, const char *name)
 {
+  TSTART;
   HRESULT hr;      
   DISPID dispid;
   
@@ -732,13 +762,13 @@ get_oom_iunknown (LPDISPATCH pDisp, const char *name)
       else
         {
           memdbg_addRef (rVariant.punkVal);
-          return rVariant.punkVal;
+          TRETURN rVariant.punkVal;
         }
 
       VariantClear (&rVariant);
     }
 
-  return NULL;
+  TRETURN NULL;
 }
 
 
@@ -748,6 +778,7 @@ get_oom_iunknown (LPDISPATCH pDisp, const char *name)
 LPDISPATCH
 get_oom_control_bytag (LPDISPATCH pDisp, const char *tag)
 {
+  TSTART;
   HRESULT hr;      
   DISPID dispid;
   DISPPARAMS dispparams;
@@ -761,7 +792,7 @@ get_oom_control_bytag (LPDISPATCH pDisp, const char *tag)
     {
       log_debug ("%s:%s: Object %p has no FindControl method",
                  SRCNAME, __func__, pDisp);
-      return NULL;
+      TRETURN NULL;
     }
 
   {
@@ -771,7 +802,7 @@ get_oom_control_bytag (LPDISPATCH pDisp, const char *tag)
     if (!bstring)
       {
         log_error_w32 (-1, "%s:%s: SysAllocString failed", SRCNAME, __func__);
-        return NULL;
+        TRETURN NULL;
       }
   }
   dispparams.rgvarg = aVariant;
@@ -806,7 +837,7 @@ get_oom_control_bytag (LPDISPATCH pDisp, const char *tag)
       VariantClear (&rVariant);
     }
 
-  return result;
+  TRETURN result;
 }
 
 
@@ -815,6 +846,7 @@ get_oom_control_bytag (LPDISPATCH pDisp, const char *tag)
 LPDISPATCH
 add_oom_button (LPDISPATCH pObj)
 {
+  TSTART;
   HRESULT hr;      
   DISPID dispid;
   DISPPARAMS dispparams;
@@ -845,9 +877,9 @@ add_oom_button (LPDISPATCH pObj)
       log_error ("%s:%s: Adding Control failed: %#lx - vt=%d",
                  SRCNAME, __func__, hr, rVariant.vt);
       VariantClear (&rVariant);
-      return NULL;
+      TRETURN NULL;
     }
-  return rVariant.pdispVal;
+  TRETURN rVariant.pdispVal;
 }
 
 
@@ -856,6 +888,7 @@ add_oom_button (LPDISPATCH pObj)
 void
 del_oom_button (LPDISPATCH pObj)
 {
+  TSTART;
   HRESULT hr;      
   DISPID dispid;
   DISPPARAMS dispparams;
@@ -874,12 +907,14 @@ del_oom_button (LPDISPATCH pObj)
   if (hr != S_OK)
     log_error ("%s:%s: Deleting Control failed: %#lx",
                SRCNAME, __func__, hr);
+  TRETURN;
 }
 
 /* Gets the current contexts HWND. Returns NULL on error */
 HWND
 get_oom_context_window (LPDISPATCH context)
 {
+  TSTART;
   LPOLEWINDOW actExplorer;
   HWND ret = NULL;
   actExplorer = (LPOLEWINDOW) get_oom_object(context,
@@ -892,12 +927,13 @@ get_oom_context_window (LPDISPATCH context)
                  SRCNAME, __func__);
     }
   gpgol_release (actExplorer);
-  return ret;
+  TRETURN ret;
 }
 
 int
 put_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *value)
 {
+  TSTART;
   LPDISPATCH propertyAccessor;
   VARIANT cVariant[2];
   VARIANT rVariant;
@@ -919,7 +955,7 @@ put_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *value)
     {
       log_error ("%s:%s: Failed to look up property accessor.",
                  SRCNAME, __func__);
-      return -1;
+      TRETURN -1;
     }
 
   dispid = lookup_oom_dispid (propertyAccessor, "SetProperty");
@@ -928,7 +964,7 @@ put_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *value)
   {
     log_error ("%s:%s: could not find SetProperty DISPID",
                SRCNAME, __func__);
-    return -1;
+    TRETURN -1;
   }
 
   /* Prepare the parameter */
@@ -942,7 +978,7 @@ put_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *value)
     {
       log_error ("%s:%s: Falied to copy value.",
                  SRCNAME, __func__);
-      return -1;
+      TRETURN -1;
     }
 
   /* Variant 1 is the DASL as found out by experiments. */
@@ -969,15 +1005,16 @@ put_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *value)
                  (unsigned int)argErr);
       VariantClear (&rVariant);
       dump_excepinfo (execpinfo);
-      return -1;
+      TRETURN -1;
     }
   VariantClear (&rVariant);
-  return 0;
+  TRETURN 0;
 }
 
 int
 put_pa_string (LPDISPATCH pDisp, const char *dasl_id, const char *value)
 {
+  TSTART;
   wchar_t *w_value = utf8_to_wchar (value);
   BSTR b_value = SysAllocString(w_value);
   xfree (w_value);
@@ -987,19 +1024,20 @@ put_pa_string (LPDISPATCH pDisp, const char *dasl_id, const char *value)
   var.bstrVal = b_value;
   int ret = put_pa_variant (pDisp, dasl_id, &var);
   VariantClear (&var);
-  return ret;
+  TRETURN ret;
 }
 
 int
 put_pa_int (LPDISPATCH pDisp, const char *dasl_id, int value)
 {
+  TSTART;
   VARIANT var;
   VariantInit (&var);
   var.vt = VT_INT;
   var.intVal = value;
   int ret = put_pa_variant (pDisp, dasl_id, &var);
   VariantClear (&var);
-  return ret;
+  TRETURN ret;
 }
 
 /* Get a MAPI property through OOM using the PropertyAccessor
@@ -1009,6 +1047,7 @@ put_pa_int (LPDISPATCH pDisp, const char *dasl_id, int value)
  */
 int get_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *rVariant)
 {
+  TSTART;
   LPDISPATCH propertyAccessor;
   VARIANT cVariant[1];
   DISPID dispid;
@@ -1028,7 +1067,7 @@ int get_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *rVariant)
     {
       log_error ("%s:%s: Failed to look up property accessor.",
                  SRCNAME, __func__);
-      return -1;
+      TRETURN -1;
     }
 
   dispid = lookup_oom_dispid (propertyAccessor, "GetProperty");
@@ -1037,7 +1076,7 @@ int get_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *rVariant)
   {
     log_error ("%s:%s: could not find GetProperty DISPID",
                SRCNAME, __func__);
-    return -1;
+    TRETURN -1;
   }
 
   /* Prepare the parameter */
@@ -1069,22 +1108,23 @@ int get_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *rVariant)
                  (unsigned int)argErr);
       dump_excepinfo (execpinfo);
       VariantClear (rVariant);
-      return -1;
+      TRETURN -1;
     }
-  return 0;
+  TRETURN 0;
 }
 
 /* Get a property string by using the PropertyAccessor of pDisp
- * returns NULL on error or a newly allocated result. */
+ * Returns NULL on error or a newly allocated result. */
 char *
 get_pa_string (LPDISPATCH pDisp, const char *property)
 {
+  TSTART;
   VARIANT rVariant;
   char *result = NULL;
 
   if (get_pa_variant (pDisp, property, &rVariant))
     {
-      return NULL;
+      TRETURN NULL;
     }
 
   if (rVariant.vt == VT_BSTR && rVariant.bstrVal)
@@ -1104,7 +1144,7 @@ get_pa_string (LPDISPATCH pDisp, const char *property)
         {
           log_error ("%s:%s: Error: %i", SRCNAME, __func__, __LINE__);
           VariantClear (&rVariant);
-          return NULL;
+          TRETURN NULL;
         }
 
       result = (char *)xmalloc (uBound - lBound + 1);
@@ -1120,36 +1160,38 @@ get_pa_string (LPDISPATCH pDisp, const char *property)
 
   VariantClear (&rVariant);
 
-  return result;
+  TRETURN result;
 }
 
 int
 get_pa_int (LPDISPATCH pDisp, const char *property, int *rInt)
 {
+  TSTART;
   VARIANT rVariant;
 
   if (get_pa_variant (pDisp, property, &rVariant))
     {
-      return -1;
+      TRETURN -1;
     }
 
   if (rVariant.vt != VT_I4)
     {
       log_debug ("%s:%s: Property `%s' is not a int (vt=%d)",
                  SRCNAME, __func__, property, rVariant.vt);
-      return -1;
+      TRETURN -1;
     }
 
   *rInt = rVariant.lVal;
 
   VariantClear (&rVariant);
-  return 0;
+  TRETURN 0;
 }
 
 /* Helper for exchange address lookup. */
 static char *
 get_recipient_addr_entry_fallbacks_ex (LPDISPATCH addr_entry)
 {
+  TSTART;
   /* Maybe check for type here? We are pretty sure that we are exchange */
 
   /* According to MSDN Message Boards the PR_EMS_AB_PROXY_ADDRESSES_DASL
@@ -1165,7 +1207,7 @@ get_recipient_addr_entry_fallbacks_ex (LPDISPATCH addr_entry)
         {
           ret += 5;
         }
-      return ret;
+      TRETURN ret;
     }
   else
     {
@@ -1178,7 +1220,7 @@ get_recipient_addr_entry_fallbacks_ex (LPDISPATCH addr_entry)
     {
       log_debug ("%s:%s: Failed to find ExchangeUser",
                  SRCNAME, __func__);
-      return nullptr;
+      TRETURN nullptr;
     }
 
   ret = get_oom_string (ex_user, "PrimarySmtpAddress");
@@ -1187,18 +1229,19 @@ get_recipient_addr_entry_fallbacks_ex (LPDISPATCH addr_entry)
     {
       log_debug ("%s:%s: Found recipient through exchange user primary smtp address: %s",
                  SRCNAME, __func__, anonstr (ret));
-      return ret;
+      TRETURN ret;
     }
-  return nullptr;
+  TRETURN nullptr;
 }
 
 /* Helper for additional fallbacks in recipient lookup */
 static char *
 get_recipient_addr_fallbacks (LPDISPATCH recipient)
 {
+  TSTART;
   if (!recipient)
     {
-      return nullptr;
+      TRETURN nullptr;
     }
   LPDISPATCH addr_entry = get_oom_object (recipient, "AddressEntry");
 
@@ -1206,24 +1249,25 @@ get_recipient_addr_fallbacks (LPDISPATCH recipient)
     {
       log_debug ("%s:%s: Failed to find AddressEntry",
                  SRCNAME, __func__);
-      return nullptr;
+      TRETURN nullptr;
     }
 
   char *ret = get_recipient_addr_entry_fallbacks_ex (addr_entry);
 
   gpgol_release (addr_entry);
 
-  return ret;
+  TRETURN ret;
 }
 
 /* Try to resolve a recipient group and add it to the recipients vector.
 
-   returns true on success.
+   Returns true on success.
 */
 static bool
 try_resolve_group (LPDISPATCH addrEntry,
                    std::vector<std::pair<std::string, shared_disp_t> > &ret)
 {
+  TSTART;
   /* Get the name for debugging */
   std::string name;
   char *cname = get_oom_string (addrEntry, "Name");
@@ -1239,7 +1283,7 @@ try_resolve_group (LPDISPATCH addrEntry,
     {
       log_data ("%s:%s: type of %s is %i",
                        SRCNAME, __func__, anonstr (name.c_str()), type);
-      return false;
+      TRETURN false;
     }
 
   LPDISPATCH members = get_oom_object (addrEntry, "Members");
@@ -1248,7 +1292,7 @@ try_resolve_group (LPDISPATCH addrEntry,
   if (!members)
     {
       TRACEPOINT;
-      return false;
+      TRETURN false;
     }
 
   int count = get_oom_int (members, "Count");
@@ -1257,7 +1301,7 @@ try_resolve_group (LPDISPATCH addrEntry,
     {
       TRACEPOINT;
       gpgol_release (members);
-      return false;
+      TRETURN false;
     }
 
   bool foundOne = false;
@@ -1332,7 +1376,7 @@ try_resolve_group (LPDISPATCH addrEntry,
                  SRCNAME, __func__,
                  anonstr (name.c_str()));
     }
-  return foundOne;
+  TRETURN foundOne;
 }
 
 /* Get the recipient mbox addresses with the addrEntry
@@ -1340,13 +1384,14 @@ try_resolve_group (LPDISPATCH addrEntry,
 std::vector<std::pair<std::string, shared_disp_t> >
 get_oom_recipients_with_addrEntry (LPDISPATCH recipients, bool *r_err)
 {
+  TSTART;
   int recipientsCnt = get_oom_int (recipients, "Count");
   std::vector<std::pair<std::string, shared_disp_t> > ret;
   int i;
 
   if (!recipientsCnt)
     {
-      return ret;
+      TRETURN ret;
     }
 
   /* Get the recipients */
@@ -1416,19 +1461,20 @@ get_oom_recipients_with_addrEntry (LPDISPATCH recipients, bool *r_err)
           *r_err = true;
         }
     }
-  return ret;
+  TRETURN ret;
 }
 
 /* Gets the resolved smtp addresses of the recpients. */
 std::vector<std::string>
 get_oom_recipients (LPDISPATCH recipients, bool *r_err)
 {
+  TSTART;
   std::vector<std::string> ret;
   for (const auto pair: get_oom_recipients_with_addrEntry (recipients, r_err))
     {
       ret.push_back (pair.first);
     }
-  return ret;
+  TRETURN ret;
 }
 
 /* Add an attachment to the outlook dispatcher disp
@@ -1439,6 +1485,7 @@ int
 add_oom_attachment (LPDISPATCH disp, const wchar_t* inFileW,
                     const wchar_t* displayName)
 {
+  TSTART;
   LPDISPATCH attachments = get_oom_object (disp, "Attachments");
 
   DISPID dispid;
@@ -1458,7 +1505,7 @@ add_oom_attachment (LPDISPATCH disp, const wchar_t* inFileW,
   {
     log_error ("%s:%s: could not find attachment dispatcher",
                SRCNAME, __func__);
-    return -1;
+    TRETURN -1;
   }
 
   if (inFileW)
@@ -1506,25 +1553,31 @@ add_oom_attachment (LPDISPATCH disp, const wchar_t* inFileW,
   VariantClear (&vtResult);
   gpgol_release (attachments);
 
-  return hr == S_OK ? 0 : -1;
+  TRETURN hr == S_OK ? 0 : -1;
 }
 
 LPDISPATCH
 get_object_by_id (LPDISPATCH pDisp, REFIID id)
 {
+  TSTART;
   LPDISPATCH disp = NULL;
 
   if (!pDisp)
-    return NULL;
+    {
+      TRETURN NULL;
+    }
 
   if (gpgol_queryInterface(pDisp, id, (void **)&disp) != S_OK)
-    return NULL;
-  return disp;
+    {
+      TRETURN NULL;
+    }
+  TRETURN disp;
 }
 
 LPDISPATCH
 get_strong_reference (LPDISPATCH mail)
 {
+  TSTART;
   VARIANT var;
   VariantInit (&var);
   DISPPARAMS args;
@@ -1554,25 +1607,27 @@ get_strong_reference (LPDISPATCH mail)
                  SRCNAME, __func__);
     }
   VariantClear (&var);
-  return ret;
+  TRETURN ret;
 }
 
 LPMESSAGE
 get_oom_message (LPDISPATCH mailitem)
 {
+  TSTART;
   LPUNKNOWN mapi_obj = get_oom_iunknown (mailitem, "MapiObject");
   if (!mapi_obj)
     {
       log_error ("%s:%s: Failed to obtain MAPI Message.",
                  SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
-  return (LPMESSAGE) mapi_obj;
+  TRETURN (LPMESSAGE) mapi_obj;
 }
 
 static LPMESSAGE
 get_oom_base_message_from_mapi (LPDISPATCH mapi_message)
 {
+  TSTART;
   HRESULT hr;
   LPDISPATCH secureItem = NULL;
   LPMESSAGE message = NULL;
@@ -1584,7 +1639,7 @@ get_oom_base_message_from_mapi (LPDISPATCH mapi_message)
     {
       log_error ("%s:%s: Failed to obtain SecureItem.",
                  SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
 
   secureMessage = (LPMAPISECUREMESSAGE) secureItem;
@@ -1600,26 +1655,27 @@ get_oom_base_message_from_mapi (LPDISPATCH mapi_message)
   if (hr != S_OK)
     {
       log_error_w32 (hr, "Failed to GetBaseMessage.");
-      return NULL;
+      TRETURN NULL;
     }
 
-  return message;
+  TRETURN message;
 }
 
 LPMESSAGE
 get_oom_base_message (LPDISPATCH mailitem)
 {
+  TSTART;
   LPMESSAGE mapi_message = get_oom_message (mailitem);
   LPMESSAGE ret = NULL;
   if (!mapi_message)
     {
       log_error ("%s:%s: Failed to obtain mapi_message.",
                  SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
   ret = get_oom_base_message_from_mapi ((LPDISPATCH)mapi_message);
   gpgol_release (mapi_message);
-  return ret;
+  TRETURN ret;
 }
 
 static int
@@ -1627,6 +1683,7 @@ invoke_oom_method_with_parms_type (LPDISPATCH pDisp, const char *name,
                                    VARIANT *rVariant, DISPPARAMS *params,
                                    int type)
 {
+  TSTART;
   HRESULT hr;
   DISPID dispid;
 
@@ -1645,30 +1702,33 @@ invoke_oom_method_with_parms_type (LPDISPATCH pDisp, const char *name,
           log_debug ("%s:%s: Method '%s' invokation failed: %#lx",
                      SRCNAME, __func__, name, hr);
           dump_excepinfo (execpinfo);
-          return -1;
+          TRETURN -1;
         }
     }
 
-  return 0;
+  TRETURN 0;
 }
 
 int
 invoke_oom_method_with_parms (LPDISPATCH pDisp, const char *name,
                               VARIANT *rVariant, DISPPARAMS *params)
 {
-  return invoke_oom_method_with_parms_type (pDisp, name, rVariant, params,
+  TSTART;
+  TRETURN invoke_oom_method_with_parms_type (pDisp, name, rVariant, params,
                                             DISPATCH_METHOD);
 }
 
 int
 invoke_oom_method (LPDISPATCH pDisp, const char *name, VARIANT *rVariant)
 {
-  return invoke_oom_method_with_parms (pDisp, name, rVariant, NULL);
+  TSTART;
+  TRETURN invoke_oom_method_with_parms (pDisp, name, rVariant, NULL);
 }
 
 LPMAPISESSION
 get_oom_mapi_session ()
 {
+  TSTART;
   LPDISPATCH application = GpgolAddin::get_instance ()->get_application ();
   LPDISPATCH oom_session = NULL;
   LPMAPISESSION session = NULL;
@@ -1678,14 +1738,14 @@ get_oom_mapi_session ()
   if (!application)
     {
       log_debug ("%s:%s: Not implemented for Ol < 14", SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
 
   oom_session = get_oom_object (application, "Session");
   if (!oom_session)
     {
       log_error ("%s:%s: session object not found", SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
   mapiobj = get_oom_iunknown (oom_session, "MAPIOBJECT");
   gpgol_release (oom_session);
@@ -1693,7 +1753,7 @@ get_oom_mapi_session ()
   if (!mapiobj)
     {
       log_error ("%s:%s: error getting Session.MAPIOBJECT", SRCNAME, __func__);
-      return NULL;
+      TRETURN NULL;
     }
   session = NULL;
   hr = gpgol_queryInterface (mapiobj, IID_IMAPISession, (void**)&session);
@@ -1702,14 +1762,15 @@ get_oom_mapi_session ()
     {
       log_error ("%s:%s: error getting IMAPISession: hr=%#lx",
                  SRCNAME, __func__, hr);
-      return NULL;
+      TRETURN NULL;
     }
-  return session;
+  TRETURN session;
 }
 
 static int
 create_category (LPDISPATCH categories, const char *category, int color)
 {
+  TSTART;
   VARIANT cVariant[3];
   VARIANT rVariant;
   DISPID dispid;
@@ -1725,7 +1786,7 @@ create_category (LPDISPATCH categories, const char *category, int color)
   if (!categories || !category)
     {
       TRACEPOINT;
-      return 1;
+      TRETURN 1;
     }
 
   dispid = lookup_oom_dispid (categories, "Add");
@@ -1733,7 +1794,7 @@ create_category (LPDISPATCH categories, const char *category, int color)
   {
     log_error ("%s:%s: could not find Add DISPID",
                SRCNAME, __func__);
-    return -1;
+    TRETURN -1;
   }
 
   /* Do the string dance */
@@ -1777,21 +1838,22 @@ create_category (LPDISPATCH categories, const char *category, int color)
                  (unsigned int)argErr);
       dump_excepinfo (execpinfo);
       VariantClear (&rVariant);
-      return -1;
+      TRETURN -1;
     }
   VariantClear (&rVariant);
   log_oom ("%s:%s: Created category '%s'",
              SRCNAME, __func__, category);
-  return 0;
+  TRETURN 0;
 }
 
 void
 ensure_category_exists (LPDISPATCH application, const char *category, int color)
 {
+  TSTART;
   if (!application || !category)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   log_oom ("Ensure category exists called for %s, %i", category, color);
@@ -1801,7 +1863,7 @@ ensure_category_exists (LPDISPATCH application, const char *category, int color)
     {
       log_error ("%s:%s: No stores found.",
                  SRCNAME, __func__);
-      return;
+      TRETURN;
     }
   auto store_count = get_oom_int (stores, "Count");
 
@@ -1864,23 +1926,25 @@ ensure_category_exists (LPDISPATCH application, const char *category, int color)
       gpgol_release (categories);
     }
   gpgol_release (stores);
+  TRETURN;
 }
 
 int
 add_category (LPDISPATCH mail, const char *category)
 {
+  TSTART;
   char *tmp = get_oom_string (mail, "Categories");
   if (!tmp)
     {
       TRACEPOINT;
-      return 1;
+      TRETURN 1;
     }
 
   if (strstr (tmp, category))
     {
       log_oom ("%s:%s: category '%s' already added.",
                SRCNAME, __func__, category);
-      return 0;
+      TRETURN 0;
     }
 
   std::string newstr (tmp);
@@ -1891,17 +1955,18 @@ add_category (LPDISPATCH mail, const char *category)
     }
   newstr += category;
 
-  return put_oom_string (mail, "Categories", newstr.c_str ());
+  TRETURN put_oom_string (mail, "Categories", newstr.c_str ());
 }
 
 int
 remove_category (LPDISPATCH mail, const char *category)
 {
+  TSTART;
   char *tmp = get_oom_string (mail, "Categories");
   if (!tmp)
     {
       TRACEPOINT;
-      return 1;
+      TRETURN 1;
     }
   std::string newstr (tmp);
   xfree (tmp);
@@ -1913,7 +1978,7 @@ remove_category (LPDISPATCH mail, const char *category)
     {
       log_oom ("%s:%s: category '%s' not found.",
                SRCNAME, __func__, category);
-      return 0;
+      TRETURN 0;
     }
 
   size_t len = cat.size();
@@ -1925,12 +1990,13 @@ remove_category (LPDISPATCH mail, const char *category)
   log_oom ("%s:%s: removing category '%s'",
            SRCNAME, __func__, category);
 
-  return put_oom_string (mail, "Categories", newstr.c_str ());
+  TRETURN put_oom_string (mail, "Categories", newstr.c_str ());
 }
 
 static char *
 generate_uid ()
 {
+  TSTART;
   UUID uuid;
   UuidCreate (&uuid);
 
@@ -1940,15 +2006,16 @@ generate_uid ()
   char *ret = xstrdup ((char*)str);
   RpcStringFreeA (&str);
 
-  return ret;
+  TRETURN ret;
 }
 
 char *
 get_unique_id (LPDISPATCH mail, int create, const char *uuid)
 {
+  TSTART;
   if (!mail)
     {
-      return NULL;
+      TRETURN NULL;
     }
 
   /* Get the User Properties. */
@@ -1959,13 +2026,13 @@ get_unique_id (LPDISPATCH mail, int create, const char *uuid)
         {
           log_debug ("%s:%s: No uuid found in oom for '%p'",
                      SRCNAME, __func__, mail);
-          return NULL;
+          TRETURN NULL;
         }
       else
         {
           log_debug ("%s:%s: Found uid '%s' for '%p'",
                      SRCNAME, __func__, uid, mail);
-          return uid;
+          TRETURN uid;
         }
     }
   char *newuid;
@@ -1984,24 +2051,25 @@ get_unique_id (LPDISPATCH mail, int create, const char *uuid)
       log_debug ("%s:%s: failed to set uid '%s' for '%p'",
                  SRCNAME, __func__, newuid, mail);
       xfree (newuid);
-      return NULL;
+      TRETURN NULL;
     }
 
 
   log_debug ("%s:%s: '%p' has now the uid: '%s' ",
              SRCNAME, __func__, mail, newuid);
-  return newuid;
+  TRETURN newuid;
 }
 
 HWND
 get_active_hwnd ()
 {
+  TSTART;
   LPDISPATCH app = GpgolAddin::get_instance ()->get_application ();
 
   if (!app)
     {
       TRACEPOINT;
-      return nullptr;
+      TRETURN nullptr;
     }
 
   LPDISPATCH activeWindow = get_oom_object (app, "ActiveWindow");
@@ -2014,7 +2082,7 @@ get_active_hwnd ()
           if (!activeWindow)
             {
               TRACEPOINT;
-              return nullptr;
+              TRETURN nullptr;
             }
         }
     }
@@ -2025,7 +2093,7 @@ get_active_hwnd ()
   if (!caption)
     {
       TRACEPOINT;
-      return nullptr;
+      TRETURN nullptr;
     }
   /* Might not be completly true for multiple explorers
      on the same folder but good enugh. */
@@ -2033,18 +2101,19 @@ get_active_hwnd ()
                             caption);
   xfree (caption);
 
-  return hwnd;
+  TRETURN hwnd;
 }
 
 LPDISPATCH
 create_mail ()
 {
+  TSTART;
   LPDISPATCH app = GpgolAddin::get_instance ()->get_application ();
 
   if (!app)
     {
       TRACEPOINT;
-      return nullptr;
+      TRETURN nullptr;
    }
 
   VARIANT var;
@@ -2064,22 +2133,23 @@ create_mail ()
     {
       log_error ("%s:%s: Failed to create mailitem.",
                  SRCNAME, __func__);
-      return ret;
+      TRETURN ret;
     }
 
   ret = var.pdispVal;
-  return ret;
+  TRETURN ret;
 }
 
 LPDISPATCH
 get_account_for_mail (const char *mbox)
 {
+  TSTART;
   LPDISPATCH app = GpgolAddin::get_instance ()->get_application ();
 
   if (!app)
     {
       TRACEPOINT;
-      return nullptr;
+      TRETURN nullptr;
    }
 
   LPDISPATCH accounts = get_oom_object (app, "Session.Accounts");
@@ -2087,7 +2157,7 @@ get_account_for_mail (const char *mbox)
   if (!accounts)
     {
       TRACEPOINT;
-      return nullptr;
+      TRETURN nullptr;
     }
 
   int count = get_oom_int (accounts, "Count");
@@ -2114,7 +2184,7 @@ get_account_for_mail (const char *mbox)
         {
           gpgol_release (accounts);
           xfree (smtpAddr);
-          return account;
+          TRETURN account;
         }
       gpgol_release (account);
       xfree (smtpAddr);
@@ -2124,16 +2194,17 @@ get_account_for_mail (const char *mbox)
   log_error ("%s:%s: Failed to find account for '%s'.",
              SRCNAME, __func__, anonstr (mbox));
 
-  return nullptr;
+  TRETURN nullptr;
 }
 
 char *
 get_sender_SendUsingAccount (LPDISPATCH mailitem, bool *r_is_GSuite)
 {
+  TSTART;
   LPDISPATCH sender = get_oom_object (mailitem, "SendUsingAccount");
   if (!sender)
     {
-      return nullptr;
+      TRETURN nullptr;
     }
 
   char *buf = get_oom_string (sender, "SmtpAddress");
@@ -2149,26 +2220,27 @@ get_sender_SendUsingAccount (LPDISPATCH mailitem, bool *r_is_GSuite)
   if (buf && strlen (buf))
     {
       log_debug ("%s:%s: found sender", SRCNAME, __func__);
-      return buf;
+      TRETURN buf;
     }
   xfree (buf);
-  return nullptr;
+  TRETURN nullptr;
 }
 
 char *
 get_sender_Sender (LPDISPATCH mailitem)
 {
+  TSTART;
   LPDISPATCH sender = get_oom_object (mailitem, "Sender");
   if (!sender)
     {
-      return nullptr;
+      TRETURN nullptr;
     }
   char *buf = get_pa_string (sender, PR_SMTP_ADDRESS_DASL);
   gpgol_release (sender);
   if (buf && strlen (buf))
     {
       log_debug ("%s:%s Sender fallback 2", SRCNAME, __func__);
-      return buf;
+      TRETURN buf;
     }
   xfree (buf);
   /* We have a sender object but not yet an smtp address likely
@@ -2177,42 +2249,44 @@ get_sender_Sender (LPDISPATCH mailitem)
   if (buf && strlen (buf))
     {
       log_debug ("%s:%s Sender fallback 3", SRCNAME, __func__);
-      return buf;
+      TRETURN buf;
     }
   xfree (buf);
   buf = get_pa_string (mailitem, PR_TAG_RECEIVED_REPRESENTING_SMTP_ADDRESS);
   if (buf && strlen (buf))
     {
       log_debug ("%s:%s Sender fallback 4", SRCNAME, __func__);
-      return buf;
+      TRETURN buf;
     }
   xfree (buf);
-  return nullptr;
+  TRETURN nullptr;
 }
 
 char *
 get_sender_CurrentUser (LPDISPATCH mailitem)
 {
+  TSTART;
   LPDISPATCH sender = get_oom_object (mailitem,
                                       "Session.CurrentUser");
   if (!sender)
     {
-      return nullptr;
+      TRETURN nullptr;
     }
   char *buf = get_pa_string (sender, PR_SMTP_ADDRESS_DASL);
   gpgol_release (sender);
   if (buf && strlen (buf))
     {
       log_debug ("%s:%s Sender fallback 5", SRCNAME, __func__);
-      return buf;
+      TRETURN buf;
     }
   xfree (buf);
-  return nullptr;
+  TRETURN nullptr;
 }
 
 char *
 get_sender_SenderEMailAddress (LPDISPATCH mailitem)
 {
+  TSTART;
 
   char *type = get_oom_string (mailitem, "SenderEmailType");
   if (type && !strcmp ("SMTP", type))
@@ -2222,36 +2296,38 @@ get_sender_SenderEMailAddress (LPDISPATCH mailitem)
         {
           log_debug ("%s:%s: Sender found", SRCNAME, __func__);
           xfree (type);
-          return senderMail;
+          TRETURN senderMail;
         }
     }
   xfree (type);
-  return nullptr;
+  TRETURN nullptr;
 }
 
 char *
 get_sender_SentRepresentingAddress (LPDISPATCH mailitem)
 {
+  TSTART;
   char *buf = get_pa_string (mailitem,
                              PR_SENT_REPRESENTING_EMAIL_ADDRESS_W_DASL);
   if (buf && strlen (buf))
     {
       log_debug ("%s:%s Found sent representing address \"%s\"",
                  SRCNAME, __func__, buf);
-      return buf;
+      TRETURN buf;
     }
   xfree (buf);
-  return nullptr;
+  TRETURN nullptr;
 }
 
 char *
 get_inline_body ()
 {
+  TSTART;
   LPDISPATCH app = GpgolAddin::get_instance ()->get_application ();
   if (!app)
     {
       TRACEPOINT;
-      return nullptr;
+      TRETURN nullptr;
     }
 
   LPDISPATCH explorer = get_oom_object (app, "ActiveExplorer");
@@ -2259,7 +2335,7 @@ get_inline_body ()
   if (!explorer)
     {
       TRACEPOINT;
-      return nullptr;
+      TRETURN nullptr;
     }
 
   LPDISPATCH inlineResponse = get_oom_object (explorer, "ActiveInlineResponse");
@@ -2267,23 +2343,24 @@ get_inline_body ()
 
   if (!inlineResponse)
     {
-      return nullptr;
+      TRETURN nullptr;
     }
 
   char *body = get_oom_string (inlineResponse, "Body");
   gpgol_release (inlineResponse);
 
-  return body;
+  TRETURN body;
 }
 
 int
 get_ex_major_version_for_addr (const char *mbox)
 {
+  TSTART;
   LPDISPATCH account = get_account_for_mail (mbox);
   if (!account)
     {
       TRACEPOINT;
-      return -1;
+      TRETURN -1;
     }
 
   char *version_str = get_oom_string (account, "ExchangeMailboxServerVersion");
@@ -2291,29 +2368,30 @@ get_ex_major_version_for_addr (const char *mbox)
 
   if (!version_str)
     {
-      return -1;
+      TRETURN -1;
     }
   long int version = strtol (version_str, nullptr, 10);
   xfree (version_str);
 
-  return (int) version;
+  TRETURN (int) version;
 }
 
 int
 get_ol_ui_language ()
 {
+  TSTART;
   LPDISPATCH app = GpgolAddin::get_instance()->get_application();
   if (!app)
     {
       TRACEPOINT;
-      return 0;
+      TRETURN 0;
     }
 
   LPDISPATCH langSettings = get_oom_object (app, "LanguageSettings");
   if (!langSettings)
     {
       TRACEPOINT;
-      return 0;
+      TRETURN 0;
     }
 
   VARIANT var;
@@ -2335,29 +2413,30 @@ get_ol_ui_language ()
   if (ret)
     {
       TRACEPOINT;
-      return 0;
+      TRETURN 0;
     }
   if (var.vt != VT_INT && var.vt != VT_I4)
     {
       TRACEPOINT;
-      return 0;
+      TRETURN 0;
     }
 
   int result = var.intVal;
 
   VariantClear (&var);
-  return result;
+  TRETURN result;
 }
 
 void
 log_addins ()
 {
+  TSTART;
   LPDISPATCH app = GpgolAddin::get_instance ()->get_application ();
 
   if (!app)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
    }
 
   LPDISPATCH addins = get_oom_object (app, "COMAddins");
@@ -2365,7 +2444,7 @@ log_addins ()
   if (!addins)
     {
       TRACEPOINT;
-      return;
+      TRETURN;
     }
 
   std::string activeAddins;
@@ -2403,16 +2482,17 @@ log_addins ()
 
   log_debug ("%s:%s:Active Addins:\n%s", SRCNAME, __func__,
              activeAddins.c_str ());
-  return;
+  TRETURN;
 }
 
 bool
 is_preview_pane_visible (LPDISPATCH explorer)
 {
+  TSTART;
   if (!explorer)
     {
       TRACEPOINT;
-      return false;
+      TRETURN false;
     }
   VARIANT var;
   VariantInit (&var);
@@ -2429,24 +2509,25 @@ is_preview_pane_visible (LPDISPATCH explorer)
     {
       log_error ("%s:%s: Failed to check visibilty.",
                  SRCNAME, __func__);
-      return false;
+      TRETURN false;
     }
 
   if (var.vt != VT_BOOL)
     {
       TRACEPOINT;
-      return false;
+      TRETURN false;
     }
-  return !!var.boolVal;
+  TRETURN !!var.boolVal;
 }
 
 static LPDISPATCH
 add_user_prop (LPDISPATCH user_props, const char *name)
 {
+  TSTART;
   if (!user_props || !name)
     {
       TRACEPOINT;
-      return nullptr;
+      TRETURN nullptr;
     }
 
   wchar_t *w_name = utf8_to_wchar (name);
@@ -2491,28 +2572,29 @@ add_user_prop (LPDISPATCH user_props, const char *name)
     {
       log_oom ("%s:%s: Failed to add property %s.",
                SRCNAME, __func__, name);
-      return nullptr;
+      TRETURN nullptr;
     }
 
   if (var.vt != VT_DISPATCH)
     {
       TRACEPOINT;
-      return nullptr;
+      TRETURN nullptr;
     }
 
   LPDISPATCH ret = var.pdispVal;
   memdbg_addRef (ret);
 
-  return ret;
+  TRETURN ret;
 }
 
 LPDISPATCH
 find_user_prop (LPDISPATCH user_props, const char *name)
 {
+  TSTART;
   if (!user_props || !name)
     {
       TRACEPOINT;
-      return nullptr;
+      TRETURN nullptr;
     }
   VARIANT var;
   VariantInit (&var);
@@ -2543,40 +2625,40 @@ find_user_prop (LPDISPATCH user_props, const char *name)
     {
       log_oom ("%s:%s: Failed to find property %s.",
                SRCNAME, __func__, name);
-      return nullptr;
+      TRETURN nullptr;
     }
   if (var.vt != VT_DISPATCH)
     {
       TRACEPOINT;
-      return nullptr;
+      TRETURN nullptr;
     }
 
   LPDISPATCH ret = var.pdispVal;
   memdbg_addRef (ret);
 
-  return ret;
+  TRETURN ret;
 }
 
 LPDISPATCH
 find_or_add_text_prop (LPDISPATCH user_props, const char *name)
 {
-  TRACEPOINT;
+  TSTART;
   LPDISPATCH ret = find_user_prop (user_props, name);
 
-  TRACEPOINT;
   if (ret)
     {
-      return ret;
+      TRETURN ret;
     }
 
   ret = add_user_prop (user_props, name);
-  TRACEPOINT;
 
-  return ret;
+  TRETURN ret;
 }
 
 void
 release_disp (LPDISPATCH obj)
 {
+  TSTART;
   gpgol_release (obj);
+  TRETURN;
 }
index cfef007..1275020 100644 (file)
@@ -64,13 +64,15 @@ using namespace GpgME;
 static bool
 expect_no_headers (msgtype_t type)
 {
-  return type != MSGTYPE_GPGOL_MULTIPART_SIGNED;
+  TSTART;
+  TRETURN type != MSGTYPE_GPGOL_MULTIPART_SIGNED;
 }
 
 static bool
 expect_no_mime (msgtype_t type)
 {
-  return type == MSGTYPE_GPGOL_PGP_MESSAGE ||
+  TSTART;
+  TRETURN type == MSGTYPE_GPGOL_PGP_MESSAGE ||
          type == MSGTYPE_GPGOL_CLEAR_SIGNED;
 }
 
@@ -82,11 +84,13 @@ ParseController::ParseController(LPSTREAM instream, msgtype_t type):
     m_type (type),
     m_block_html (false)
 {
+  TSTART;
   memdbg_ctor ("ParseController");
   log_data ("%s:%s: Creating parser for stream: %p of type %i"
                    " expect no headers: %i expect no mime: %i",
                    SRCNAME, __func__, instream, type,
                    expect_no_headers (type), expect_no_mime (type));
+  TRETURN;
 }
 #endif
 
@@ -97,17 +101,21 @@ ParseController::ParseController(FILE *instream, msgtype_t type):
     m_type (type),
     m_block_html (false)
 {
+  TSTART;
   memdbg_ctor ("ParseController");
   log_data ("%s:%s: Creating parser for stream: %p of type %i",
                    SRCNAME, __func__, instream, type);
+  TRETURN;
 }
 
 ParseController::~ParseController()
 {
+  TSTART;
   log_debug ("%s:%s", SRCNAME, __func__);
   memdbg_dtor ("ParseController");
   delete m_inputprovider;
   delete m_outputprovider;
+  TRETURN;
 }
 
 static void
@@ -141,15 +149,17 @@ operation_for_type(msgtype_t type, bool *decrypt,
 static bool
 is_smime (Data &data)
 {
+  TSTART;
   data.seek (0, SEEK_SET);
   auto id = data.type();
   data.seek (0, SEEK_SET);
-  return id == Data::CMSSigned || id == Data::CMSEncrypted;
+  TRETURN id == Data::CMSSigned || id == Data::CMSEncrypted;
 }
 
 static std::string
 format_recipients(GpgME::DecryptionResult result, Protocol protocol)
 {
+  TSTART;
   std::string msg;
   for (const auto recipient: result.recipients())
     {
@@ -168,12 +178,13 @@ format_recipients(GpgME::DecryptionResult result, Protocol protocol)
       }
       msg += std::string("<br/>") + _("Unknown Key:") + " 0x" + recipient.keyID();
     }
-  return msg;
+  TRETURN msg;
 }
 
 static std::string
 format_error(GpgME::DecryptionResult result, Protocol protocol)
 {
+  TSTART;
   char *buf;
   bool no_sec = false;
   std::string msg;
@@ -226,23 +237,26 @@ format_error(GpgME::DecryptionResult result, Protocol protocol)
     {
       log_error ("%s:%s:Failed to Format error.",
                  SRCNAME, __func__);
-      return "Failed to Format error.";
+      TRETURN "Failed to Format error.";
     }
   msg = buf;
   memdbg_alloc (buf);
   xfree (buf);
-  return msg;
+  TRETURN msg;
 }
 
 void
 ParseController::setSender(const std::string &sender)
 {
+  TSTART;
   m_sender = sender;
+  TRETURN;
 }
 
 static bool
 is_valid_chksum(const GpgME::Signature &sig)
 {
+  TSTART;
   const auto sum = sig.summary();
   static unsigned int valid_mask = (unsigned int) (
       GpgME::Signature::Valid |
@@ -254,14 +268,14 @@ is_valid_chksum(const GpgME::Signature &sig)
       GpgME::Signature::CrlTooOld |
       GpgME::Signature::TofuConflict );
 
-  return sum & valid_mask;
+  TRETURN sum & valid_mask;
 }
 
 
 /* Note on stability:
 
    Experiments have shown that we can have a crash if parse
-   returns at time that is not good for the state of Outlook.
+   Returns at time that is not good for the state of Outlook.
 
    This happend in my test instance after a delay of > 1s < 3s
    with a < 1% chance :-/
@@ -273,6 +287,7 @@ is_valid_chksum(const GpgME::Signature &sig)
 void
 ParseController::parse()
 {
+  TSTART;
   // Wrap the input stream in an attachment / GpgME Data
   Protocol protocol;
   bool decrypt, verify;
@@ -322,7 +337,7 @@ ParseController::parse()
       memdbg_alloc (buf);
       m_error = buf;
       xfree (buf);
-      return;
+      TRETURN;
     }
 
   /* Maybe a different option for this ? */
@@ -530,71 +545,76 @@ ParseController::parse()
       m_outputprovider->finalize ();
     }
 
-  return;
+  TRETURN;
 }
 
 const std::string
 ParseController::get_html_body () const
 {
+  TSTART;
   if (m_outputprovider)
     {
-      return m_outputprovider->get_html_body ();
+      TRETURN m_outputprovider->get_html_body ();
     }
   else
     {
-      return std::string();
+      TRETURN std::string();
     }
 }
 
 const std::string
 ParseController::get_body () const
 {
+  TSTART;
   if (m_outputprovider)
     {
-      return m_outputprovider->get_body ();
+      TRETURN m_outputprovider->get_body ();
     }
   else
     {
-      return std::string();
+      TRETURN std::string();
     }
 }
 
 const std::string
 ParseController::get_body_charset() const
 {
+  TSTART;
   if (m_outputprovider)
     {
-      return m_outputprovider->get_body_charset();
+      TRETURN m_outputprovider->get_body_charset();
     }
   else
     {
-      return std::string();
+      TRETURN std::string();
     }
 }
 
 const std::string
 ParseController::get_html_charset() const
 {
+  TSTART;
   if (m_outputprovider)
     {
-      return m_outputprovider->get_html_charset();
+      TRETURN m_outputprovider->get_html_charset();
     }
   else
     {
-      return std::string();
+      TRETURN std::string();
     }
 }
 
 std::vector<std::shared_ptr<Attachment> >
 ParseController::get_attachments() const
 {
+  TSTART;
   if (m_outputprovider)
     {
-      return m_outputprovider->get_attachments();
+      TRETURN m_outputprovider->get_attachments();
     }
   else
     {
-      return std::vector<std::shared_ptr<Attachment> >();
+      TRETURN std::vector<std::shared_ptr<Attachment> >();
     }
 }
 
@@ -603,13 +623,14 @@ GPGRT_LOCK_DEFINE(keylist_lock);
 std::vector<Key>
 ParseController::get_ultimate_keys()
 {
+  TSTART;
   static bool s_keys_listed;
   static std::vector<Key> s_ultimate_keys;
   gpgrt_lock_lock (&keylist_lock);
   if (s_keys_listed)
     {
       gpgrt_lock_unlock (&keylist_lock);
-      return s_ultimate_keys;
+      TRETURN s_ultimate_keys;
     }
   log_debug ("%s:%s: Starting keylisting.",
              SRCNAME, __func__);
@@ -620,7 +641,7 @@ ParseController::get_ultimate_keys()
       log_error ("%s:%s: broken installation no ctx.",
                  SRCNAME, __func__);
       gpgrt_lock_unlock (&keylist_lock);
-      return s_ultimate_keys;
+      TRETURN s_ultimate_keys;
     }
   ctx->setKeyListMode (KeyListMode::Local);
   Error err;
@@ -630,7 +651,7 @@ ParseController::get_ultimate_keys()
       log_error ("%s:%s: Failed to start keylisting err: %i: %s",
                  SRCNAME, __func__, err.code (), err.asString());
       gpgrt_lock_unlock (&keylist_lock);
-      return s_ultimate_keys;
+      TRETURN s_ultimate_keys;
     }
   TRACEPOINT;
   while (!err)
@@ -667,5 +688,5 @@ ParseController::get_ultimate_keys()
 
   s_keys_listed = true;
   gpgrt_lock_unlock (&keylist_lock);
-  return s_ultimate_keys;
+  TRETURN s_ultimate_keys;
 }
index aef750e..fd8bd1b 100644 (file)
@@ -83,12 +83,13 @@ rfc2047_token_new (const char *text, size_t len)
 {
   rfc2047_token *token;
 
+  TSTART;
   token = xmalloc (sizeof (rfc2047_token));
   memset (token, 0, sizeof (rfc2047_token));
   token->length = len;
   token->text = text;
 
-  return token;
+  TRETURN token;
 }
 
 static rfc2047_token *
@@ -103,9 +104,12 @@ rfc2047_token_new_encoded_word (const char *word, size_t len)
   char encoding;
   size_t n;
 
+  TSTART;
   /* check that this could even be an encoded-word token */
   if (len < 7 || strncmp (word, "=?", 2) != 0 || strncmp (word + len - 2, "?=", 2) != 0)
-    return NULL;
+    {
+      TRETURN NULL;
+    }
 
   /* skip over '=?' */
   inptr = word + 2;
@@ -113,12 +117,14 @@ rfc2047_token_new_encoded_word (const char *word, size_t len)
 
   if (*tmpchar == '?' || *tmpchar == '*') {
       /* this would result in an empty charset */
-      return NULL;
+      TRETURN NULL;
   }
 
   /* skip to the end of the charset */
   if (!(inptr = memchr (inptr, '?', len - 2)) || inptr[2] != '?')
-    return NULL;
+    {
+      TRETURN NULL;
+    }
 
   /* copy the charset into a buffer */
   n = (size_t) (inptr - tmpchar);
@@ -143,7 +149,9 @@ rfc2047_token_new_encoded_word (const char *word, size_t len)
 
   /* make sure the first char after the encoding is another '?' */
   if (inptr[1] != '?')
-    return NULL;
+    {
+      TRETURN NULL;
+    }
 
   switch (*inptr++) {
     case 'B': case 'b':
@@ -153,7 +161,7 @@ rfc2047_token_new_encoded_word (const char *word, size_t len)
       encoding = 'Q';
       break;
     default:
-      return NULL;
+      TRETURN NULL;
   }
 
   /* the payload begins right after the '?' */
@@ -164,24 +172,28 @@ rfc2047_token_new_encoded_word (const char *word, size_t len)
 
   /* make sure that we don't have something like: =?iso-8859-1?Q?= */
   if (payload > inptr)
-    return NULL;
+    {
+      TRETURN NULL;
+    }
 
   token = rfc2047_token_new (payload, inptr - payload);
   token->charset = charset;
   token->encoding = encoding;
 
-  return token;
+  TRETURN token;
 }
 
 static void
 rfc2047_token_free (rfc2047_token * tok)
 {
+  TSTART;
   if (!tok)
     {
-      return;
+      TRETURN;
     }
   xfree (tok->charset);
   xfree (tok);
+  TRETURN;
 }
 
 static rfc2047_token *
@@ -195,6 +207,7 @@ tokenize_rfc2047_phrase (const char *in, size_t *len)
   bool ascii;
   size_t n;
 
+  TSTART;
   tail = (rfc2047_token *) &list;
   list.next = NULL;
   lwsp = NULL;
@@ -315,12 +328,13 @@ non_rfc2047:
 
   *len = (size_t) (inptr - in);
 
-  return list.next;
+  TRETURN list.next;
 }
 
 static void
 rfc2047_token_list_free (rfc2047_token * tokens)
 {
+  TSTART;
   rfc2047_token * cur = tokens;
   while (cur)
     {
@@ -328,6 +342,7 @@ rfc2047_token_list_free (rfc2047_token * tokens)
       rfc2047_token_free (cur);
       cur = next;
     }
+  TRETURN;
 }
 
 /* this decodes rfc2047's version of quoted-printable */
@@ -341,8 +356,11 @@ quoted_decode (const unsigned char *in, size_t len, unsigned char *out, int *sta
   unsigned int saved;
   int need;
 
+  TSTART;
   if (len == 0)
-    return 0;
+    {
+      TRETURN 0;
+    }
 
   inend = in + len;
   outptr = out;
@@ -421,7 +439,7 @@ decode:
   *state = need;
   *save = saved;
 
-  return (size_t) (outptr - out);
+  TRETURN (size_t) (outptr - out);
 }
 
 /**
@@ -447,6 +465,7 @@ g_mime_encoding_base64_decode_step (const unsigned char *inbuf, size_t inlen, un
   unsigned char c;
   int npad, n, i;
 
+  TSTART;
   inend = inbuf + inlen;
   outptr = outbuf;
   inptr = inbuf;
@@ -499,7 +518,7 @@ g_mime_encoding_base64_decode_step (const unsigned char *inbuf, size_t inlen, un
   *state = (npad << 8) | n;
   *save = n ? saved : 0;
 
-  return (outptr - outbuf);
+  TRETURN (outptr - outbuf);
 }
 
 static size_t
@@ -508,10 +527,15 @@ rfc2047_token_decode (rfc2047_token *token, unsigned char *outbuf, int *state, u
   const unsigned char *inbuf = (const unsigned char *) token->text;
   size_t len = token->length;
 
+  TSTART;
   if (token->encoding == 'B')
-    return g_mime_encoding_base64_decode_step (inbuf, len, outbuf, state, save);
+    {
+      TRETURN g_mime_encoding_base64_decode_step (inbuf, len, outbuf, state, save);
+    }
   else
-    return quoted_decode (inbuf, len, outbuf, state, save);
+    {
+      TRETURN quoted_decode (inbuf, len, outbuf, state, save);
+    }
 }
 
 static char *
@@ -528,6 +552,7 @@ rfc2047_decode_tokens (rfc2047_token *tokens, size_t buflen)
   int state;
   char *str;
 
+  TSTART;
   decoded = xmalloc (buflen + 1);
   memset (decoded, 0, buflen + 1);
   tmplen = 76;
@@ -613,7 +638,7 @@ rfc2047_decode_tokens (rfc2047_token *tokens, size_t buflen)
 
   xfree (outbuf);
 
-  return decoded;
+  TRETURN decoded;
 }
 
 
@@ -637,22 +662,26 @@ g_mime_utils_header_decode_phrase (const char *phrase)
   char *decoded;
   size_t len;
 
+  TSTART;
   tokens = tokenize_rfc2047_phrase (phrase, &len);
   decoded = rfc2047_decode_tokens (tokens, len);
   rfc2047_token_list_free (tokens);
 
-  return decoded;
+  TRETURN decoded;
 }
 
 /* Try to parse an rfc 2047 filename for attachment handling.
-   returns the parsed string. On errors the input string is just
+   Returns the parsed string. On errors the input string is just
    copied with strdup */
 char *
 rfc2047_parse (const char *input)
 {
   char *decoded;
+  TSTART;
   if (!input)
-    return xstrdup ("");
+    {
+      TRETURN xstrdup ("");
+    }
 
   log_data ("%s:%s: Input: \"%s\"",
             SRCNAME, __func__, input);
@@ -665,7 +694,7 @@ rfc2047_parse (const char *input)
   if (!decoded || !strlen (decoded))
     {
       xfree (decoded);
-      return xstrdup (input);
+      TRETURN xstrdup (input);
     }
-  return decoded;
+  TRETURN decoded;
 }
index 9608dc0..19a7763 100644 (file)
@@ -73,7 +73,7 @@ char *native_to_utf8 (const char *string);
 
 #define utf8_to_wchar(VAR1) ({wchar_t *retval; \
   retval = _utf8_to_wchar (VAR1); \
-  if ((opt.enable_debug & DBG_SUPERTRACE)) \
+  if ((opt.enable_debug & (DBG_TRACE & DBG_MEMORY))) \
   { \
     log_debug ("%s:%s:%i wchar_t alloc %p:%S", \
                SRCNAME, __func__, __LINE__, retval, retval); \
@@ -82,7 +82,7 @@ retval;})
 
 #define wchar_to_utf8(VAR1) ({char *retval; \
   retval = _wchar_to_utf8 (VAR1); \
-  if ((opt.enable_debug & DBG_SUPERTRACE)) \
+  if ((opt.enable_debug & (DBG_TRACE & DBG_MEMORY))) \
   { \
     log_debug ("%s:%s:%i char utf8 alloc %p:%s", \
                SRCNAME, __func__, __LINE__, retval, retval); \
index c6e585c..d20655b 100644 (file)
@@ -39,9 +39,11 @@ static int invalidation_blocked = 0;
 LONG_PTR WINAPI
 gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
+  TSTART;
 //  log_debug ("WMG: %x", (unsigned int) message);
   if (message == WM_USER + 42)
     {
+      TSTART;
       wm_ctx_t *ctx = (wm_ctx_t *) lParam;
       log_debug ("%s:%s: Recieved user msg: %i",
                  SRCNAME, __func__, ctx->wmsg_type);
@@ -54,10 +56,10 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                 {
                   log_debug ("%s:%s: Parsing done for mail which is gone.",
                              SRCNAME, __func__);
-                  break;
+                  TBREAK;
                 }
               mail->parsing_done();
-              break;
+              TBREAK;
             }
           case (RECIPIENT_ADDED):
             {
@@ -66,10 +68,10 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                 {
                   log_debug ("%s:%s: Recipient add for mail which is gone.",
                              SRCNAME, __func__);
-                  break;
+                  TBREAK;
                 }
               mail->locateKeys_o ();
-              break;
+              TBREAK;
             }
           case (REVERT_MAIL):
             {
@@ -78,7 +80,7 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                 {
                   log_debug ("%s:%s: Revert mail for mail which is gone.",
                              SRCNAME, __func__);
-                  break;
+                  TBREAK;
                 }
 
               mail->setNeedsSave (true);
@@ -97,7 +99,7 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
               mail->updateBody_o ();
               log_debug ("%s:%s: Revert mail done.",
                          SRCNAME, __func__);
-              break;
+              TBREAK;
             }
           case (INVALIDATE_UI):
             {
@@ -115,14 +117,14 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                              " Ignoring it",
                              SRCNAME, __func__);
                 }
-              break;
+              TBREAK;
             }
           case (INVALIDATE_LAST_MAIL):
             {
               log_debug ("%s:%s: clearing last mail",
                          SRCNAME, __func__);
               Mail::clearLastMail ();
-              break;
+              TBREAK;
             }
           case (CLOSE):
             {
@@ -131,7 +133,7 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                 {
                   log_debug ("%s:%s: Close for mail which is gone.",
                              SRCNAME, __func__);
-                  break;
+                  TBREAK;
                 }
               mail->refCurrentItem();
               Mail::closeInspector_o (mail);
@@ -140,7 +142,7 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
               log_debug ("%s:%s: Close finished.",
                          SRCNAME, __func__);
               mail->releaseCurrentItem();
-              break;
+              TBREAK;
             }
           case (CRYPTO_DONE):
             {
@@ -149,7 +151,7 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                 {
                   log_debug ("%s:%s: Crypto done for mail which is gone.",
                              SRCNAME, __func__);
-                  break;
+                  TBREAK;
                 }
               // modify the mail.
               if (mail->cryptState () == Mail::NeedsUpdateInOOM)
@@ -182,7 +184,7 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                     {
                       gpgol_bug (mail->getWindow (),
                                  ERR_GET_BASE_MSG_FAILED);
-                      break;
+                      TBREAK;
                     }
                   // It's important we use the _base_ message here.
                   mapi_save_changes (mail_message, FORCE_SAVE);
@@ -207,7 +209,7 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                 }
               log_debug ("%s:%s:  Send for %p completed.",
                          SRCNAME, __func__, mail);
-              break;
+              TBREAK;
             }
           case (BRING_TO_FRONT):
             {
@@ -223,13 +225,13 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                   log_debug ("%s:%s: No active window found for bring to front.",
                              SRCNAME, __func__);
                 }
-              break;
+              TBREAK;
             }
           case (WKS_NOTIFY):
             {
               WKSHelper::instance ()->notify ((const char *) ctx->data);
               xfree (ctx->data);
-              break;
+              TBREAK;
             }
           case (CLEAR_REPLY_FORWARD):
             {
@@ -238,11 +240,11 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                 {
                   log_debug ("%s:%s: Clear reply forward for mail which is gone.",
                              SRCNAME, __func__);
-                  break;
+                  TBREAK;
                 }
               mail->wipe_o (true);
               mail->removeAllAttachments_o ();
-              break;
+              TBREAK;
             }
           case (DO_AUTO_SECURE):
             {
@@ -251,10 +253,10 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                 {
                   log_debug ("%s:%s: DO_AUTO_SECURE for mail which is gone.",
                              SRCNAME, __func__);
-                  break;
+                  TBREAK;
                 }
               mail->setDoAutosecure_m (true);
-              break;
+              TBREAK;
             }
           case (DONT_AUTO_SECURE):
             {
@@ -263,10 +265,10 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                 {
                   log_debug ("%s:%s: DO_AUTO_SECURE for mail which is gone.",
                              SRCNAME, __func__);
-                  break;
+                  TBREAK;
                 }
               mail->setDoAutosecure_m (false);
-              break;
+              TBREAK;
             }
           case (CONFIG_KEY_DONE):
             {
@@ -274,13 +276,13 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                          SRCNAME, __func__);
 
               Addressbook::update_key_o (ctx->data);
-              break;
+              TBREAK;
             }
           default:
             log_debug ("%s:%s: Unknown msg %x",
                        SRCNAME, __func__, ctx->wmsg_type);
         }
-        return 0;
+        TRETURN 0;
     }
   return DefWindowProc(hWnd, message, wParam, lParam);
 }
@@ -288,11 +290,12 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 HWND
 create_responder_window ()
 {
+  TSTART;
   size_t cls_name_len = strlen(RESPONDER_CLASS_NAME) + 1;
   char cls_name[cls_name_len];
   if (g_responder_window)
     {
-      return g_responder_window;
+      TRETURN g_responder_window;
     }
   /* Create Window wants a mutable string as the first parameter */
   snprintf (cls_name, cls_name_len, "%s", RESPONDER_CLASS_NAME);
@@