Unify COM Release and add debugging
authorAndre Heinecke <aheinecke@intevation.de>
Mon, 15 Aug 2016 10:14:51 +0000 (12:14 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Mon, 15 Aug 2016 10:14:51 +0000 (12:14 +0200)
* src/util.h (gpgol_release): New. Adds debugging for
debug_oom_extra.
* src/attached-file-events.cpp,
src/attachment.cpp,
src/attic.c,
src/display.cpp,
src/eventsink.h,
src/explorers.cpp,
src/ext-commands.cpp,
src/inspectors.cpp,
src/item-events.cpp,
src/mailitem-events.cpp,
src/mailitem.cpp,
src/mapihelp.cpp,
src/message-events.cpp,
src/message.cpp,
src/mlang-charset.cpp,
src/olflange.cpp,
src/oomhelp.cpp,
src/oomhelp.h,
src/revert.cpp,
src/ribbon-callbacks.cpp: Use gpgol_release.

--
This may help analyse rare crashes in case we have made an
error with refcounting / releasing somewhere.

21 files changed:
src/attached-file-events.cpp
src/attachment.cpp
src/attic.c
src/display.cpp
src/eventsink.h
src/explorers.cpp
src/ext-commands.cpp
src/inspectors.cpp
src/item-events.cpp
src/mailitem-events.cpp
src/mailitem.cpp
src/mapihelp.cpp
src/message-events.cpp
src/message.cpp
src/mlang-charset.cpp
src/olflange.cpp
src/oomhelp.cpp
src/oomhelp.h
src/revert.cpp
src/ribbon-callbacks.cpp
src/util.h

index 6ae4f0b..94b99a3 100644 (file)
@@ -202,7 +202,7 @@ GpgolAttachedFileEvents::OnWritePattToSzFile
   if (hr)
     {
       log_debug ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr);
-      stream->Release ();
+      gpgol_release (stream);
       symenc_close (symenc);
       return E_ABORT;
     }
@@ -214,14 +214,14 @@ GpgolAttachedFileEvents::OnWritePattToSzFile
                     "Please use the decrypt/verify button to decrypt the\n"
                     "entire message again.  Then open this attachment."),
                   "GpgOL", MB_ICONERROR|MB_OK);
-      stream->Release ();
+      gpgol_release (stream);
       symenc_close (symenc);
       return E_ABORT;
     }
 
   rc = decrypt_and_write_file (stream, file, symenc);
 
-  stream->Release ();
+  gpgol_release (stream);
   symenc_close (symenc);
   return rc;
 }
index 0ccf2d9..6f31510 100644 (file)
@@ -298,7 +298,7 @@ do_crypt (LPDISPATCH mailitem, bool protect)
         {
           log_debug ("%s:%s: Failed to get MapiObject of attachment: %p",
                      SRCNAME, __func__, attachment);
-          attachment->Release ();
+          gpgol_release (attachment);
           continue;
         }
 
@@ -310,13 +310,13 @@ do_crypt (LPDISPATCH mailitem, bool protect)
             {
               log_error ("%s:%s: Error: Session crypto failed.",
                          SRCNAME, __func__);
-              mapi_attachment->Release ();
-              attachment->Release ();
+              gpgol_release (mapi_attachment);
+              gpgol_release (attachment);
               goto done;
             }
         }
-      mapi_attachment->Release ();
-      attachment->Release ();
+      gpgol_release (mapi_attachment);
+      gpgol_release (attachment);
     }
   err = 0;
 
index 1218eaa..4c30f9a 100644 (file)
@@ -31,7 +31,7 @@ is_preview_pane_visible (LPEXCHEXTCALLBACK eecb)
   hr = pDisp->Invoke (dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
                       DISPATCH_METHOD, &dispparams,
                       &rVariant, NULL, NULL);
-  pDisp->Release();
+  gpgol_release (pDisp);
   pDisp = NULL;
   if (hr == S_OK && rVariant.vt != VT_BOOL)
     {
@@ -84,7 +84,7 @@ show_preview_pane (LPEXCHEXTCALLBACK eecb, int visible)
   hr = pDisp->Invoke (dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
                       DISPATCH_METHOD, &dispparams,
                       NULL, NULL, NULL);
-  pDisp->Release();
+  gpgol_release (pDisp);
   pDisp = NULL;
   if (hr != S_OK)
     log_debug ("%s:%s: invoking ShowPane(%d) failed: %#lx",
index bd10921..ecba56a 100644 (file)
@@ -263,7 +263,7 @@ update_display (HWND hwnd, LPDISPATCH inspector, int is_sensitive,
               put_oom_string (item, "Body", "");
             }
           rc = put_oom_string (item, is_html? "HTMLBody":"Body", text);
-          item->Release ();
+          gpgol_release (item);
         }
       else
         rc = -1;
@@ -361,7 +361,7 @@ open_inspector (LPEXCHEXTCALLBACK peecb, LPMESSAGE message)
   if (!entryid)
     {
       log_error ("%s:%s: PR_ENTRYID missing\n",  SRCNAME, __func__);
-      session->Release ();
+      gpgol_release (session);
       return -1;
     }
   log_hexdump (entryid, entryidlen, "orig entryid=");
@@ -370,7 +370,7 @@ open_inspector (LPEXCHEXTCALLBACK peecb, LPMESSAGE message)
   if (!store_entryid)
     {
       log_error ("%s:%s: PR_STORE_ENTRYID missing\n",  SRCNAME, __func__);
-      session->Release ();
+      gpgol_release (session);
       xfree (entryid);
       return -1;
     }
@@ -379,7 +379,7 @@ open_inspector (LPEXCHEXTCALLBACK peecb, LPMESSAGE message)
   if (!parent_entryid)
     {
       log_error ("%s:%s: PR_PARENT_ENTRYID missing\n",  SRCNAME, __func__);
-      session->Release ();
+      gpgol_release (session);
       xfree (store_entryid);
       xfree (entryid);
       return -1;
@@ -393,7 +393,7 @@ open_inspector (LPEXCHEXTCALLBACK peecb, LPMESSAGE message)
     {
       log_error ("%s:%s: OpenMsgStore failed: hr=%#lx\n", 
                  SRCNAME, __func__, hr);
-      session->Release ();
+      gpgol_release (session);
       xfree (parent_entryid);
       xfree (store_entryid);
       xfree (entryid);
@@ -408,11 +408,11 @@ open_inspector (LPEXCHEXTCALLBACK peecb, LPMESSAGE message)
     {
       log_error ("%s:%s: OpenEntry failed: hr=%#lx\n", 
                  SRCNAME, __func__, hr);
-      session->Release ();
+      gpgol_release (session);
       xfree (parent_entryid);
       xfree (store_entryid);
       xfree (entryid);
-      mdb->Release ();
+      gpgol_release (mdb);
       return -1;
     }
   log_debug ("%s:%s: mdb::OpenEntry succeeded type=%lx\n", 
@@ -426,12 +426,12 @@ open_inspector (LPEXCHEXTCALLBACK peecb, LPMESSAGE message)
     {
       log_error ("%s:%s: OpenEntry[folder] failed: hr=%#lx\n", 
                  SRCNAME, __func__, hr);
-      session->Release ();
+      gpgol_release (session);
       xfree (parent_entryid);
       xfree (store_entryid);
       xfree (entryid);
-      mdb->Release ();
-      mfolder->Release ();
+      gpgol_release (mdb);
+      gpgol_release (mfolder);
       return -1;
     }
   log_debug ("%s:%s: mdb::OpenEntry[message] succeeded type=%lx\n", 
@@ -443,18 +443,18 @@ open_inspector (LPEXCHEXTCALLBACK peecb, LPMESSAGE message)
     {
       log_error ("%s:%s: PrepareForm failed: hr=%#lx\n", 
                  SRCNAME, __func__, hr);
-      session->Release ();
+      gpgol_release (session);
       xfree (parent_entryid);
       xfree (store_entryid);
       xfree (entryid);
-      mdb->Release ();
-      mfolder->Release ();
-      message2->Release ();
+      gpgol_release (mdb);
+      gpgol_release (mfolder);
+      gpgol_release (message2);
       return -1;
     }
 
   /* Message2 is now represented by TOKEN; we need to release it.  */
-  message2->Release(); message2 = NULL;
+  gpgol_release (message2); message2 = NULL;
 
   hr = session->ShowForm (0,
                           mdb, mfolder,
@@ -466,12 +466,12 @@ open_inspector (LPEXCHEXTCALLBACK peecb, LPMESSAGE message)
   log_debug ("%s:%s: ShowForm result: hr=%#lx\n", 
              SRCNAME, __func__, hr);
   
-  session->Release ();
+  gpgol_release (session);
   xfree (parent_entryid);
   xfree (store_entryid);
   xfree (entryid);
-  mdb->Release ();
-  mfolder->Release ();
+  gpgol_release (mdb);
+  gpgol_release (mfolder);
   return FAILED(hr)? -1:0;
 }
 
index 26aaad8..3eb900c 100644 (file)
@@ -96,7 +96,7 @@ STDMETHODIMP subcls::Invoke (DISPID dispid, REFIID riid, LCID lcid,      \
   if (m_pCP)                                                             \
     m_pCP->Unadvise(m_cookie);                                           \
   if (m_object)                                                          \
-    m_object->Release();                                                 \
+    gpgol_release (m_object);                                                 \
 }                                                                        \
 /* End of macro EVENT_SINK_DTOR_DEFAULT_CODE.  */
 
@@ -179,18 +179,18 @@ LPDISPATCH install_ ## subcls ## _sink (LPDISPATCH object)               \
     {                                                                    \
       log_error ("%s:%s:%s: ConnectionPoint not found: hr=%#lx",         \
                  SRCNAME,#subcls,  __func__, hr);                        \
-      pCPC->Release ();                                                  \
+      gpgol_release (pCPC);                                                  \
       return NULL;                                                       \
     }                                                                    \
   sink = new subcls; /* Note: Advise does another AddRef.  */            \
   hr = pCP->Advise ((LPUNKNOWN)sink, &cookie);                           \
-  pCPC->Release ();                                                      \
+  gpgol_release (pCPC);                                                      \
   if (hr != S_OK)                                                        \
     {                                                                    \
       log_error ("%s:%s:%s: Advice failed: hr=%#lx",                     \
                  SRCNAME, #subcls, __func__, hr);                        \
-      pCP->Release ();                                                   \
-      sink->Release ();                                                  \
+      gpgol_release (pCP);                                                   \
+      gpgol_release (sink);                                                  \
       return NULL;                                                       \
     }                                                                    \
   if (debug_oom)                                                         \
@@ -226,7 +226,7 @@ void detach_ ## subcls ## _sink (LPDISPATCH obj)                         \
       if (debug_oom_extra)                                               \
         log_debug ("%s:%s:%s: Releasing connt point",                    \
                    SRCNAME, #subcls, __func__);                          \
-      sink->m_pCP->Release ();                                           \
+      gpgol_release (sink->m_pCP);                                           \
       sink->m_pCP = NULL;                                                \
     }                                                                    \
   if (sink->m_object)                                                    \
@@ -234,10 +234,10 @@ void detach_ ## subcls ## _sink (LPDISPATCH obj)                         \
       if (debug_oom_extra)                                               \
         log_debug ("%s:%s:%s: Releasing actual object",                  \
                    SRCNAME, #subcls, __func__);                          \
-      sink->m_object->Release ();                                        \
+      gpgol_release (sink->m_object);                                        \
       sink->m_object = NULL;                                             \
     }                                                                    \
-  sink->Release ();                                                      \
+  gpgol_release (sink);                                                      \
 }                                                                        \
 /* End of macro END_EVENT_SINK.  */
 
index 388fdff..68193bb 100644 (file)
@@ -95,11 +95,11 @@ add_explorer_controls (LPOOMEXPLORER explorer)
       return;
     }
   button = get_oom_control_bytag (obj, "GpgOL_Start_Key_Manager");
-  obj->Release ();
+  gpgol_release (obj);
   obj = NULL;
   if (button)
     {
-      button->Release ();
+      gpgol_release (button);
       log_debug ("%s:%s: Leave (Controls are already added)",
                  SRCNAME, __func__);
       return;
@@ -128,7 +128,7 @@ add_explorer_controls (LPOOMEXPLORER explorer)
           
           install_GpgolCommandBarButtonEvents_sink (button);
           /* Fixme:  Save the returned object for an Unadvice.  */
-          button->Release ();
+          gpgol_release (button);
         }
 
       button = add_oom_button (controls);
@@ -141,10 +141,10 @@ add_explorer_controls (LPOOMEXPLORER explorer)
           
           install_GpgolCommandBarButtonEvents_sink (button);
           /* Fixme:  Save the returned object for an Unadvice.  */
-          button->Release ();
+          gpgol_release (button);
         }
 
-      controls->Release ();
+      gpgol_release (controls);
       controls = NULL;
     }
 
@@ -169,9 +169,9 @@ add_explorer_controls (LPOOMEXPLORER explorer)
           
           install_GpgolCommandBarButtonEvents_sink (button);
           /* Fixme:  store the event sink object somewhere.  */
-          button->Release ();
+          gpgol_release (button);
         }
-      controls->Release ();
+      gpgol_release (controls);
     }
   
   log_debug ("%s:%s: Leave", SRCNAME, __func__);
@@ -217,7 +217,7 @@ run_explorer_revert_folder (LPDISPATCH button)
           if (obj)
             {
               gpgol_folder_revert (obj);
-              obj->Release ();
+              gpgol_release (obj);
             }
         }
     }
index 0411cf0..82f978f 100644 (file)
@@ -119,7 +119,7 @@ get_inspector (LPEXCHEXTCALLBACK eecb, HWND hwnd)
         {
           /* This should be MailItem; use the getInspector method.  */
           inspector = get_oom_object (obj, "GetInspector");
-          obj->Release ();
+          gpgol_release (obj);
         }
     }
   return inspector;
@@ -144,7 +144,7 @@ get_crypto_flags (LPEXCHEXTCALLBACK eecb, HWND hwnd,
   else
     {
       rc = get_inspector_composer_flags (inspector, r_sign, r_encrypt);
-      inspector->Release ();
+      gpgol_release (inspector);
     }
   return rc;
 }
@@ -161,7 +161,7 @@ set_crypto_flags (LPEXCHEXTCALLBACK eecb, HWND hwnd, bool sign, bool encrypt)
   else
     {
       set_inspector_composer_flags (inspector, sign, encrypt);
-      inspector->Release ();
+      gpgol_release (inspector);
     }
 }
 
@@ -256,7 +256,7 @@ GpgolExtCommands::InstallCommands (
                   msgcache_unref (refhandle);
                   xfree (key);
                 }
-              obj->Release ();
+              gpgol_release (obj);
             }
         }
       
@@ -345,7 +345,7 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
           hr = pDisp->Invoke (dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
                               DISPATCH_METHOD, &dispparams,
                               NULL, NULL, NULL);
-          pDisp->Release();
+          gpgol_release (pDisp);
           pDisp = NULL;
           if (hr == S_OK)
             {
@@ -360,7 +360,7 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
       else
         {
           if (pDisp)
-            pDisp->Release ();
+            gpgol_release (pDisp);
           log_debug ("%s:%s: invoking Close failed: no Close method)",
                      SRCNAME, __func__);
         }
index 729a7e9..631839b 100644 (file)
@@ -250,7 +250,7 @@ find_ole_window (LPOOMINSPECTOR inspector)
                  SRCNAME, __func__, hr);
       hwnd = NULL;
     }
-  olewndw->Release ();
+  gpgol_release (olewndw);
   log_debug ("%s:%s: inspector %p has hwnd=%p",
              SRCNAME, __func__, inspector, hwnd);
   return hwnd;
@@ -324,18 +324,18 @@ deregister_inspector (LPGPGOLINSPECTOREVENTS sink)
       if (ol->sink)
         {
           detach_GpgolCommandBarButtonEvents_sink (ol->sink);
-          ol->sink->Release ();
+          gpgol_release (ol->sink);
         }
       if (ol->button)
         {
           del_oom_button (ol->button);
-          ol->button->Release ();
+          gpgol_release (ol->button);
         }
       xfree (ol);
     }
 
-  r->inspector->Release ();
-  r->eventsink->Release ();
+  gpgol_release (r->inspector);
+  gpgol_release (r->eventsink);
 
   xfree (r);
 }
@@ -462,9 +462,9 @@ GpgolInspectorsEvents::NewInspector (LPOOMINSPECTOR inspector)
   if (obj)
     {
       register_inspector ((LPGPGOLINSPECTOREVENTS)obj, inspector);
-      obj->Release ();
+      gpgol_release (obj);
     }
-  inspector->Release ();
+  gpgol_release (inspector);
   return S_OK;
 }
 
@@ -517,13 +517,13 @@ GpgolInspectorEvents::Activate (void)
         {
           // LPDISPATCH obj2 = install_GpgolItemEvents_sink (obj);
           // if (obj2)
-          //   obj2->Release ();
-          obj->Release ();
+          //   gpgol_release (obj2);
+          gpgol_release (obj);
         }
     }
   
   update_crypto_info (inspector);
-  inspector->Release ();
+  gpgol_release (inspector);
 }
 
 
@@ -550,7 +550,7 @@ is_inspector_in_composer_mode (LPDISPATCH inspector)
          the class is 43.  */
       in_composer = (!get_oom_bool (obj, "Sent") 
                      && get_oom_int (obj, "Class") == 43);
-      obj->Release ();
+      gpgol_release (obj);
     }
   else
     in_composer = false;
@@ -576,7 +576,7 @@ get_inspector_composer_flags (LPDISPATCH inspector,
   else
     {
       *r_sign = get_oom_int (button, "State") == msoButtonDown;
-      button->Release ();
+      gpgol_release (button);
     }
 
   button = get_button (inspector, "GpgOL_Inspector_Encrypt");
@@ -588,7 +588,7 @@ get_inspector_composer_flags (LPDISPATCH inspector,
   else
     {
       *r_encrypt = get_oom_int (button, "State") == msoButtonDown;
-      button->Release ();
+      gpgol_release (button);
     }
   
   if (!rc)
@@ -614,7 +614,7 @@ set_one_button (LPDISPATCH inspector, const char *tag, bool down)
     {
       if (put_oom_int (button, "State", down? msoButtonDown : msoButtonUp))
         rc = -1;
-      button->Release ();
+      gpgol_release (button);
     }
   return rc;
 }
@@ -710,7 +710,7 @@ add_inspector_controls (LPOOMINSPECTOR inspector)
               move_to_button_list (&buttonlist, obj, button, tag);
             }
           
-          controls->Release ();
+          gpgol_release (controls);
         }
     }
   
@@ -770,7 +770,7 @@ add_inspector_controls (LPOOMINSPECTOR inspector)
           move_to_button_list (&buttonlist, obj, button, tag);
         }
 
-      controls->Release ();
+      gpgol_release (controls);
     }
 
 
@@ -824,7 +824,7 @@ add_inspector_controls (LPOOMINSPECTOR inspector)
           move_to_button_list (&buttonlist, obj, button, tag);
         }
 
-      controls->Release ();
+      gpgol_release (controls);
     }
 
 
@@ -844,9 +844,9 @@ add_inspector_controls (LPOOMINSPECTOR inspector)
         {
           ol2 = ol->next;
           if (ol->sink)
-            ol->sink->Release ();
+            gpgol_release (ol->sink);
           if (ol->button)
-            ol->button->Release ();
+            gpgol_release (ol->button);
           xfree (ol);
         }
     }
@@ -892,9 +892,9 @@ update_crypto_info (LPDISPATCH inspector)
                   log_error ("%s:%s: error getting IMESSAGE: hr=%#lx",
                              SRCNAME, __func__, hr);
                 }
-              unknown->Release ();
+              gpgol_release (unknown);
             }
-          obj->Release ();
+          gpgol_release (obj);
         }
       if (message)
         {
@@ -938,7 +938,7 @@ update_crypto_info (LPDISPATCH inspector)
               iconrc = IDB_DECRYPT_16;
             }
           
-          message->Release ();
+          gpgol_release (message);
         }
     }
 
@@ -946,7 +946,7 @@ update_crypto_info (LPDISPATCH inspector)
   if (iconrc != -1)
     put_oom_icon (button, iconrc, 16);
   put_oom_bool (button, "Visible", (iconrc != -1));
-  button->Release ();
+  gpgol_release (button);
 }
 
 
@@ -982,14 +982,14 @@ get_message_from_button (unsigned long instid, LPDISPATCH *r_inspector)
                   log_error ("%s:%s: error getting IMESSAGE: hr=%#lx",
                              SRCNAME, __func__, hr);
                 }
-              unknown->Release ();
+              gpgol_release (unknown);
             }
-          obj->Release ();
+          gpgol_release (obj);
         }
       if (r_inspector)
         *r_inspector = inspector;
       else
-        inspector->Release ();
+        gpgol_release (inspector);
     }
   return message;
 }
@@ -1028,7 +1028,7 @@ toggle_button (LPDISPATCH button, const char *tag, int instid)
   
   log_debug ("%s:%s: setting `%s' state to %d", SRCNAME, __func__, tag2, state);
   set_one_button (inspector, tag2, state);
-  inspector->Release ();
+  gpgol_release (inspector);
 }
 
 
@@ -1059,12 +1059,12 @@ proc_inspector_button_click (LPDISPATCH button, const char *tag, int instid)
         {
           if (message_incoming_handler (message, hwnd, true))
             message_display_handler (message, inspector, hwnd);
-          message->Release ();
+          gpgol_release (message);
         }
       if (inspector)
         {
           update_crypto_info (inspector);
-          inspector->Release ();
+          gpgol_release (inspector);
         }
     }
   else if (!tagcmp (tag, "GpgOL_Inspector_Debug-0"))
@@ -1075,7 +1075,7 @@ proc_inspector_button_click (LPDISPATCH button, const char *tag, int instid)
       if (message)
         {
           message_show_info (message, hwnd);
-          message->Release ();
+          gpgol_release (message);
         }
     }
   else if (!tagcmp (tag, "GpgOL_Inspector_Debug-1"))
@@ -1092,7 +1092,7 @@ proc_inspector_button_click (LPDISPATCH button, const char *tag, int instid)
         {
           /* We sync here. */
           mapi_change_message_class (message, 1);
-          message->Release ();
+          gpgol_release (message);
         }
     }
   else if (!tagcmp (tag, "GpgOL_Inspector_Debug-3"))
@@ -1106,7 +1106,7 @@ proc_inspector_button_click (LPDISPATCH button, const char *tag, int instid)
                                          KEEP_OPEN_READWRITE|FORCE_SAVE);
           log_debug ("%s:%s: gpgol_message_revert returns %d\n", 
                      SRCNAME, __func__, rc);
-          message->Release ();
+          gpgol_release (message);
         }
     }
 
index 36305f0..7e1aa39 100644 (file)
@@ -155,9 +155,9 @@ GpgolItemEvents::OnOpenComplete (LPEXCHEXTCALLBACK eecb, ULONG flags)
             m_wasencrypted = true;
         }
       if (message)
-        message->Release ();
+        gpgol_release (message);
       if (mdb)
-        mdb->Release ();
+        gpgol_release (mdb);
     }
   
   return S_FALSE;
index b376c53..5101610 100644 (file)
@@ -90,7 +90,7 @@ MailItemEvents::~MailItemEvents()
   if (m_pCP)
     m_pCP->Unadvise(m_cookie);
   if (m_object)
-    m_object->Release();
+    gpgol_release (m_object);
 }
 
 static DWORD WINAPI
index b1ad383..817d238 100644 (file)
@@ -182,7 +182,7 @@ GpgolItemEvents::Write (PBOOL cancel_default)
               log_error ("%s:%s: error getting IMESSAGE: hr=%#lx",
                          SRCNAME, __func__, hr);
             }
-          unknown->Release ();
+          gpgol_release (unknown);
         }
 
       if (!message)
index 25ef089..64fe721 100644 (file)
@@ -491,7 +491,7 @@ mapi_get_body (LPMESSAGE message, size_t *r_nbytes)
       if (hr)
         {
           log_debug ("%s:%s: Stat failed: hr=%#lx", SRCNAME, __func__, hr);
-          stream->Release ();
+          gpgol_release (stream);
           return NULL;
         }
       
@@ -504,7 +504,7 @@ mapi_get_body (LPMESSAGE message, size_t *r_nbytes)
         {
           log_debug ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr);
           xfree (body);
-          stream->Release ();
+          gpgol_release (stream);
           return NULL;
         }
       body[nread] = 0;
@@ -513,10 +513,10 @@ mapi_get_body (LPMESSAGE message, size_t *r_nbytes)
         {
           log_debug ("%s:%s: not enough bytes returned\n", SRCNAME, __func__);
           xfree (body);
-          stream->Release ();
+          gpgol_release (stream);
           return NULL;
         }
-      stream->Release ();
+      gpgol_release (stream);
       
       {
         char *tmp;
@@ -591,7 +591,7 @@ get_msgcls_from_pgp_lines (LPMESSAGE message)
   if (hr)
     {
       log_debug ("%s:%s: Stat failed: hr=%#lx", SRCNAME, __func__, hr);
-      stream->Release ();
+      gpgol_release (stream);
       return NULL;
     }
   
@@ -606,7 +606,7 @@ get_msgcls_from_pgp_lines (LPMESSAGE message)
     {
       log_debug ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr);
       xfree (body);
-      stream->Release ();
+      gpgol_release (stream);
       return NULL;
     }
   body[nread] = 0;
@@ -616,10 +616,10 @@ get_msgcls_from_pgp_lines (LPMESSAGE message)
       log_debug ("%s:%s: not enough bytes returned\n", SRCNAME, __func__);
       
       xfree (body);
-      stream->Release ();
+      gpgol_release (stream);
       return NULL;
     }
-  stream->Release ();
+  gpgol_release (stream);
 
   if (!is_binary)
     {
@@ -717,14 +717,14 @@ is_really_cms_encrypted (LPMESSAGE message)
     {
       log_debug ("%s:%s: HrQueryAllRows failed: hr=%#lx",
                  SRCNAME, __func__, hr);
-      mapitable->Release ();
+      gpgol_release (mapitable);
       return -1;
     }
   n_attach = mapirows->cRows > 0? mapirows->cRows : 0;
   if (n_attach != 1)
     {
       FreeProws (mapirows);
-      mapitable->Release ();
+      gpgol_release (mapitable);
       log_debug ("%s:%s: not just one attachment", SRCNAME, __func__);
       return -1;
     }
@@ -805,11 +805,11 @@ is_really_cms_encrypted (LPMESSAGE message)
   
  leave:
   if (stream)
-    stream->Release ();
+    gpgol_release (stream);
   if (att)
-    att->Release ();
+    gpgol_release (att);
   FreeProws (mapirows);
-  mapitable->Release ();
+  gpgol_release (mapitable);
   return result;
 }
 
@@ -842,14 +842,14 @@ get_first_attach_mime_tag (LPMESSAGE message)
     {
       log_debug ("%s:%s: HrQueryAllRows failed: hr=%#lx",
                  SRCNAME, __func__, hr);
-      mapitable->Release ();
+      gpgol_release (mapitable);
       return NULL;
     }
   n_attach = mapirows->cRows > 0? mapirows->cRows : 0;
   if (n_attach != 1)
     {
       FreeProws (mapirows);
-      mapitable->Release ();
+      gpgol_release (mapitable);
       log_debug ("%s:%s: not just one attachment", SRCNAME, __func__);
       return NULL;
     }
@@ -887,9 +887,9 @@ get_first_attach_mime_tag (LPMESSAGE message)
   
  leave:
   if (att)
-    att->Release ();
+    gpgol_release (att);
   FreeProws (mapirows);
-  mapitable->Release ();
+  gpgol_release (mapitable);
   return result;
 }
 
@@ -1789,10 +1789,10 @@ mapi_to_mime (LPMESSAGE message, const char *filename)
           hr = 0;
         }
 
-      stream->Release ();
+      gpgol_release (stream);
     }
 
-  session->Release ();
+  gpgol_release (session);
   return hr;
 }
 
@@ -2037,7 +2037,7 @@ mapi_create_attach_table (LPMESSAGE message, int fast)
     {
       log_debug ("%s:%s: HrQueryAllRows failed: hr=%#lx",
                  SRCNAME, __func__, hr);
-      mapitable->Release ();
+      gpgol_release (mapitable);
       return NULL;
     }
   n_attach = mapirows->cRows > 0? mapirows->cRows : 0;
@@ -2047,7 +2047,7 @@ mapi_create_attach_table (LPMESSAGE message, int fast)
   if (!n_attach)
     {
       FreeProws (mapirows);
-      mapitable->Release ();
+      gpgol_release (mapitable);
       return NULL;
     }
 
@@ -2098,7 +2098,7 @@ mapi_create_attach_table (LPMESSAGE message, int fast)
             }
         }
       table[pos].attach_type = get_gpgolattachtype (att, moss_tag);
-      att->Release ();
+      gpgol_release (att);
     }
   table[0].private_mapitable = mapitable;
   FreeProws (mapirows);
@@ -2139,7 +2139,7 @@ mapi_release_attach_table (mapi_attach_item_t *table)
 
   mapitable = (LPMAPITABLE)table[0].private_mapitable;
   if (mapitable)
-    mapitable->Release ();
+    gpgol_release (mapitable);
   for (pos=0; !table[pos].end_of_table; pos++)
     {
       xfree (table[pos].filename);
@@ -2177,7 +2177,7 @@ mapi_get_attach_as_stream (LPMESSAGE message, mapi_attach_item_t *item,
   if (item->method != ATTACH_BY_VALUE)
     {
       log_error ("%s:%s: attachment: method not supported", SRCNAME, __func__);
-      att->Release ();
+      gpgol_release (att);
       return NULL;
     }
 
@@ -2187,14 +2187,14 @@ 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);
-      att->Release ();
+      gpgol_release (att);
       return NULL;
     }
 
   if (r_attach)
     *r_attach = att;
   else
-    att->Release ();
+    gpgol_release (att);
 
   return stream;
 }
@@ -2251,7 +2251,7 @@ attach_to_buffer (LPATTACH att, size_t *r_nbytes, int unprotect,
   if ( hr != S_OK )
     {
       log_error ("%s:%s: Stat failed: hr=%#lx", SRCNAME, __func__, hr);
-      stream->Release ();
+      gpgol_release (stream);
       return NULL;
     }
       
@@ -2263,7 +2263,7 @@ attach_to_buffer (LPATTACH att, size_t *r_nbytes, int unprotect,
     {
       log_error ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr);
       xfree (buffer);
-      stream->Release ();
+      gpgol_release (stream);
       return NULL;
     }
   if (nread != statInfo.cbSize.QuadPart)
@@ -2272,7 +2272,7 @@ attach_to_buffer (LPATTACH att, size_t *r_nbytes, int unprotect,
       xfree (buffer);
       buffer = NULL;
     }
-  stream->Release ();
+  gpgol_release (stream);
 
   if (buffer && symenc)
     {
@@ -2331,12 +2331,12 @@ mapi_get_attach (LPMESSAGE message, int unprotect,
   if (item->method != ATTACH_BY_VALUE)
     {
       log_error ("%s:%s: attachment: method not supported", SRCNAME, __func__);
-      att->Release ();
+      gpgol_release (att);
       return NULL;
     }
 
   buffer = attach_to_buffer (att, r_nbytes, unprotect, NULL);
-  att->Release ();
+  gpgol_release (att);
 
   return buffer;
 }
@@ -2396,7 +2396,7 @@ mapi_mark_moss_attach (LPMESSAGE message, mapi_attach_item_t *item)
   retval = 0;
     
  leave:
-  att->Release ();
+  gpgol_release (att);
   return retval;
 }
 
@@ -3089,14 +3089,14 @@ mapi_get_gpgol_body_attachment (LPMESSAGE message,
     {
       log_debug ("%s:%s: HrQueryAllRows failed: hr=%#lx",
                  SRCNAME, __func__, hr);
-      mapitable->Release ();
+      gpgol_release (mapitable);
       return -1;
     }
   n_attach = mapirows->cRows > 0? mapirows->cRows : 0;
   if (!n_attach)
     {
       FreeProws (mapirows);
-      mapitable->Release ();
+      gpgol_release (mapitable);
       log_debug ("%s:%s: No attachments at all", SRCNAME, __func__);
       return -1;
     }
@@ -3162,15 +3162,15 @@ mapi_get_gpgol_body_attachment (LPMESSAGE message,
                   body = charset;
                 }
             }
-          att->Release ();
+          gpgol_release (att);
           if (r_ishtml)
             *r_ishtml = (bodytype == 2);
           break;
         }
-      att->Release ();
+      gpgol_release (att);
     }
   FreeProws (mapirows);
-  mapitable->Release ();
+  gpgol_release (mapitable);
   if (!found)
     {
       log_error ("%s:%s: no suitable body attachment found", SRCNAME,__func__);
@@ -3219,14 +3219,14 @@ mapi_delete_gpgol_body_attachment (LPMESSAGE message)
     {
       log_debug ("%s:%s: HrQueryAllRows failed: hr=%#lx",
                  SRCNAME, __func__, hr);
-      mapitable->Release ();
+      gpgol_release (mapitable);
       return 0;
     }
   n_attach = mapirows->cRows > 0? mapirows->cRows : 0;
   if (!n_attach)
     {
       FreeProws (mapirows);
-      mapitable->Release ();
+      gpgol_release (mapitable);
       return 0; /* No Attachments.  */
     }
 
@@ -3256,7 +3256,7 @@ mapi_delete_gpgol_body_attachment (LPMESSAGE message)
       if (has_gpgol_body_name (att)
           && get_gpgolattachtype (att, moss_tag) == ATTACHTYPE_FROMMOSS)
         {
-          att->Release ();
+          gpgol_release (att);
           hr = message->DeleteAttach (mapirows->aRow[pos].lpProps[0].Value.l,
                                       0, NULL, 0);
           if (hr)
@@ -3271,10 +3271,10 @@ mapi_delete_gpgol_body_attachment (LPMESSAGE message)
             }
           break;
         }
-      att->Release ();
+      gpgol_release (att);
     }
   FreeProws (mapirows);
-  mapitable->Release ();
+  gpgol_release (mapitable);
   return found;
 }
 
@@ -3354,12 +3354,12 @@ mapi_attachment_to_body (LPMESSAGE message, mapi_attach_item_t *item)
     {
       if (result)
         outstream->Revert ();
-      outstream->Release ();
+      gpgol_release (outstream);
     }
   if (instream)
-    instream->Release ();
+    gpgol_release (instream);
   if (att)
-    att->Release ();
+    gpgol_release (att);
   return result;
 }
 
index fe6e72e..41af63a 100644 (file)
@@ -109,7 +109,7 @@ get_crypto_flags (HWND hwnd, bool *r_sign, bool *r_encrypt)
   else
     {
       rc = get_inspector_composer_flags (inspector, r_sign, r_encrypt);
-      inspector->Release ();
+      gpgol_release (inspector);
     }
   return rc;
 }
@@ -218,17 +218,17 @@ GpgolMessageEvents::OnReadComplete (LPEXCHEXTCALLBACK eecb, ULONG flags)
                   if (opt.enable_debug & DBG_OOM)
                     log_debug ("%s:%s: %p->GetInspector returned %p",
                                SRCNAME, __func__, obj, inspector);
-                  obj->Release ();
+                  gpgol_release (obj);
                 }
             }
           message_display_handler (message, inspector, hwnd);
           if (inspector)
-            inspector->Release ();
+            gpgol_release (inspector);
         }
       if (message)
-        message->Release ();
+        gpgol_release (message);
       if (mdb)
-        mdb->Release ();
+        gpgol_release (mdb);
     }
   
 
@@ -265,7 +265,7 @@ GpgolMessageEvents::OnWrite (LPEXCHEXTCALLBACK eecb)
       else
         {
           bodyfmt = get_oom_int (obj, "BodyFormat");
-          obj->Release ();
+          gpgol_release (obj);
         }
 
       if (bodyfmt == 1)
index 3adc7ed..6fe6747 100644 (file)
@@ -563,7 +563,7 @@ message_verify (LPMESSAGE message, msgtype_t msgtype, int force, HWND hwnd)
         return -1;
       
       inbuf = pgp_mime_from_clearsigned (rawstream, &inbuflen);
-      rawstream->Release ();
+      gpgol_release (rawstream);
       if (!inbuf)
         return -1;
       protocol = PROTOCOL_OPENPGP;
@@ -654,7 +654,7 @@ message_verify (LPMESSAGE message, msgtype_t msgtype, int force, HWND hwnd)
       MessageBox (NULL, buf, "GpgOL", MB_ICONINFORMATION|MB_OK);
     }
   if (opaquestream)
-    opaquestream->Release ();
+    gpgol_release (opaquestream);
   xfree (inbuf);
                     
   if (err)
@@ -778,7 +778,7 @@ pgp_body_to_attachment (LPMESSAGE message)
                  SRCNAME, __func__, hr);
       goto leave;
     }
-  outstream->Release ();
+  gpgol_release (outstream);
   outstream = NULL;
   hr = newatt->SaveChanges (0);
   if (hr)
@@ -787,7 +787,7 @@ pgp_body_to_attachment (LPMESSAGE message)
                  SRCNAME, __func__, hr); 
       goto leave;
     }
-  newatt->Release ();
+  gpgol_release (newatt);
   newatt = NULL;
   hr = mapi_save_changes (message, KEEP_OPEN_READWRITE);
 
@@ -795,11 +795,11 @@ pgp_body_to_attachment (LPMESSAGE message)
   if (outstream)
     {
       outstream->Revert ();
-      outstream->Release ();
+      gpgol_release (outstream);
     }
   if (newatt)
-    newatt->Release ();
-  instream->Release ();
+    gpgol_release (newatt);
+  gpgol_release (instream);
   return hr? -1:0;
 }
 
@@ -1090,13 +1090,13 @@ message_decrypt (LPMESSAGE message, msgtype_t msgtype, int force, HWND hwnd)
         }
       
     }
-  cipherstream->Release ();
+  gpgol_release (cipherstream);
   retval = 0;
 
 
  leave:
   if (saved_attach)
-    saved_attach->Release ();
+    gpgol_release (saved_attach);
   mapi_release_attach_table (table);
   return retval;
 }
@@ -1139,7 +1139,7 @@ get_recipients (LPMESSAGE message)
     {
       log_debug_w32 (-1, "%s:%s: HrQueryAllRows failed", SRCNAME, __func__);
       if (lpRecipientTable)
-        lpRecipientTable->Release();
+        gpgol_release (lpRecipientTable);
       return NULL;
     }
 
@@ -1185,7 +1185,7 @@ get_recipients (LPMESSAGE message)
     }
 
   if (lpRecipientTable)
-    lpRecipientTable->Release();
+    gpgol_release (lpRecipientTable);
   if (lpRecipientRows)
     FreeProws(lpRecipientRows);        
   
index 3c71d1d..128a428 100644 (file)
@@ -19,7 +19,8 @@
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "util.h"
+#include "config.h"
+#include "common.h"
 #define INITGUID
 #include <initguid.h>
 DEFINE_GUID (IID_IMultiLanguage, 0x275c23e1,0x3747,0x11d0,0x9f,
@@ -56,7 +57,7 @@ char *ansi_charset_to_utf8 (const char *charset, char *input,
     {
       log_error ("%s:%s: Inlen too long. Bug.",
                  SRCNAME, __func__);
-      multilang->Release();
+      gpgol_release (multilang);
       return NULL;
     }
 
@@ -71,7 +72,7 @@ char *ansi_charset_to_utf8 (const char *charset, char *input,
     {
       log_error ("%s:%s: Failed to find charset for: %s",
                  SRCNAME, __func__, charset);
-      multilang->Release ();
+      gpgol_release (multilang);
       return NULL;
     }
   enc = (mime_info.uiInternetEncoding == 0) ? mime_info.uiCodePage :
@@ -84,14 +85,14 @@ char *ansi_charset_to_utf8 (const char *charset, char *input,
     {
       log_error ("%s:%s: Failed conversion.",
                  SRCNAME, __func__);
-      multilang->Release ();
+      gpgol_release (multilang);
       return NULL;
   }
   buf = (wchar_t*) xmalloc(sizeof(wchar_t) * (wlen + 1));
 
   err = multilang->ConvertStringToUnicode(&mode, enc, input, &uinlen,
                                           buf, &wlen);
-  multilang->Release ();
+  gpgol_release (multilang);
   if (FAILED (err))
     {
       log_error ("%s:%s: Failed conversion 2.",
index 3850d06..1020da0 100644 (file)
@@ -571,7 +571,7 @@ GpgolExt::~GpgolExt (void)
              SRCNAME, __func__, ext_context_name (m_lContext));
 
 //   if (m_pOutlookExtItemEvents)
-//     m_pOutlookExtItemEvents->Release ();
+//     gpgol_release (m_pOutlookExtItemEvents);
 
   if (m_lContext == EECONTEXT_SESSION || !m_lContext)
     {
@@ -687,9 +687,9 @@ GpgolExt::Install(LPEXCHEXTCALLBACK pEECB, ULONG lContext, ULONG lFlags)
             {
               olversion = get_oom_string (disp, "Version");
               g_ol_version_major = atoi (olversion);
-              disp->Release ();
+              gpgol_release (disp);
             }
-          obj->Release ();
+          gpgol_release (obj);
         }
     }
   pEECB->GetVersion (&lBuildVersion, EECBGV_GETBUILDVERSION);
@@ -897,7 +897,7 @@ install_sinks (LPEXCHEXTCALLBACK eecb)
         {
           install_GpgolExplorersEvents_sink (disp);
           /* Fixme: Register the event sink object somewhere.  */
-          disp->Release ();
+          gpgol_release (disp);
         }
 
       /* It seems that when installing this sink the first explorer
@@ -910,7 +910,7 @@ install_sinks (LPEXCHEXTCALLBACK eecb)
       else
         {
           add_explorer_controls ((LPOOMEXPLORER)disp);
-          disp->Release ();
+          gpgol_release (disp);
         }
 
       disp = get_oom_object ((LPDISPATCH)rootobj, "Application.Inspectors");
@@ -920,10 +920,10 @@ install_sinks (LPEXCHEXTCALLBACK eecb)
         {
           install_GpgolInspectorsEvents_sink (disp);
           /* Fixme: Register the event sink object somewhere.  */
-          disp->Release ();
+          gpgol_release (disp);
         }
 
-      rootobj->Release ();
+      gpgol_release (rootobj);
     }
 
   log_debug ("%s:%s: Leave", SRCNAME, __func__);
@@ -951,9 +951,9 @@ get_eecb_object (LPEXCHEXTCALLBACK eecb)
           hr = pObj->QueryInterface (IID_IDispatch, (LPVOID*)&pDisp);
           if (hr == S_OK && pDisp)
             result = pDisp;
-          pObj->Release ();
+          gpgol_release (pObj);
         }
-      pCb->Release ();
+      gpgol_release (pCb);
     }
   return result;
 }
index e4cb7a4..3191c91 100644 (file)
@@ -71,9 +71,9 @@ get_object_name (LPUNKNOWN obj)
 
  leave:
   if (tinfo)
-    tinfo->Release ();
+    gpgol_release (tinfo);
   if (disp)
-    disp->Release ();
+    gpgol_release (disp);
 
   return name;
 }
@@ -161,12 +161,12 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
 
       if (pDisp)
         {
-          pDisp->Release ();
+          gpgol_release (pDisp);
           pDisp = NULL;
         }
       pObj->QueryInterface (IID_IDispatch, (LPVOID*)&pDisp);
       if (pObj != pStart)
-        pObj->Release ();
+        gpgol_release (pObj);
       pObj = NULL;
       if (!pDisp)
         return NULL;  /* The object has no IDispatch interface.  */
@@ -184,7 +184,7 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
         dot = strchr (fullname, '.');
         if (dot == fullname)
           {
-            pDisp->Release ();
+            gpgol_release (pDisp);
             return NULL;  /* Empty name part: error.  */
           }
         else if (dot)
@@ -232,7 +232,7 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
                 }
               if (!parmstr)
                 {
-                  pDisp->Release ();
+                  gpgol_release (pDisp);
                   return NULL; /* Error:  Out of memory.  */
                 }
               n_parms = 1;
@@ -248,7 +248,7 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
         {
           if (parmstr)
             SysFreeString (parmstr);
-          pDisp->Release ();
+          gpgol_release (pDisp);
           return NULL;  /* Name not found.  */
         }
 
@@ -293,7 +293,7 @@ get_oom_object (LPDISPATCH pStart, const char *fullname)
           VariantClear (&vtResult);
           if (parmstr)
             SysFreeString (parmstr);
-          pDisp->Release ();
+          gpgol_release (pDisp);
           return NULL;  /* Invoke failed.  */
         }
 
@@ -690,7 +690,7 @@ get_oom_control_bytag (LPDISPATCH pDisp, const char *tag)
   if (hr == S_OK && rVariant.vt == VT_DISPATCH && rVariant.pdispVal)
     {
       rVariant.pdispVal->QueryInterface (IID_IDispatch, (LPVOID*)&result);
-      rVariant.pdispVal->Release ();
+      gpgol_release (rVariant.pdispVal);
       if (!result)
         log_debug ("%s:%s: Object with tag `%s' has no dispatch intf.",
                    SRCNAME, __func__, tag);
@@ -1170,7 +1170,7 @@ get_oom_base_message_from_mapi (LPDISPATCH mapi_message)
   log_oom_extra("%s:%s: About to call GetBaseMessage.",
                 SRCNAME, __func__);
   hr = secureMessage->GetBaseMessage (&message);
-  secureMessage->Release ();
+  gpgol_release (secureMessage);
   if (hr != S_OK)
     {
       log_error_w32 (hr, "Failed to GetBaseMessage.");
@@ -1192,7 +1192,7 @@ get_oom_base_message (LPDISPATCH mailitem)
       return NULL;
     }
   ret = get_oom_base_message_from_mapi ((LPDISPATCH)mapi_message);
-  mapi_message->Release ();
+  gpgol_release (mapi_message);
   return ret;
 }
 
@@ -1245,7 +1245,7 @@ get_oom_mapi_session ()
       return NULL;
     }
   mapiobj = get_oom_iunknown (oom_session, "MAPIOBJECT");
-  oom_session->Release ();
+  gpgol_release (oom_session);
 
   if (!mapiobj)
     {
@@ -1254,7 +1254,7 @@ get_oom_mapi_session ()
     }
   session = NULL;
   hr = mapiobj->QueryInterface (IID_IMAPISession, (void**)&session);
-  mapiobj->Release ();
+  gpgol_release (mapiobj);
   if (hr != S_OK || !session)
     {
       log_error ("%s:%s: error getting IMAPISession: hr=%#lx",
index 3c1ae51..b069b31 100644 (file)
@@ -25,9 +25,6 @@
 #include "mymapi.h"
 #include "myexchext.h"
 
-/* Helper to release dispatcher */
-#define RELDISP(dispatcher) if (dispatcher) dispatcher->Release()
-
 #define MSOCONTROLBUTTON    1
 #define MSOCONTROLEDIT      2
 #define MSOCONTROLDROPDOWN  3
index 103b325..7573e30 100644 (file)
@@ -146,7 +146,7 @@ message_revert (LPMESSAGE message)
             else
               result = 2;
 
-            att->Release ();
+            gpgol_release (att);
             att = NULL;
           }
         break;
@@ -639,7 +639,7 @@ gpgol_folder_revert (LPDISPATCH mapifolderobj)
     }
   folder = NULL;
   hr = unknown->QueryInterface (IID_IMAPIFolder, (void**)&folder);
-  unknown->Release ();
+  gpgol_release (unknown);
   if (hr != S_OK || !folder)
     {
       log_error ("%s:%s: error getting IMAPIFolder: hr=%#lx",
@@ -664,7 +664,7 @@ gpgol_folder_revert (LPDISPATCH mapifolderobj)
       return -1;
     }
   unknown = get_oom_iunknown (disp, "MAPIOBJECT");
-  disp->Release ();
+  gpgol_release (disp);
   if (!unknown)
     {
       log_error ("%s:%s: error getting Session.MAPIOBJECT", SRCNAME, __func__);
@@ -673,7 +673,7 @@ gpgol_folder_revert (LPDISPATCH mapifolderobj)
     }
   session = NULL;
   hr = unknown->QueryInterface (IID_IMAPISession, (void**)&session);
-  unknown->Release ();
+  gpgol_release (unknown);
   if (hr != S_OK || !session)
     {
       log_error ("%s:%s: error getting IMAPISession: hr=%#lx",
@@ -688,7 +688,7 @@ gpgol_folder_revert (LPDISPATCH mapifolderobj)
   if (!store_entryid)
     {
       log_error ("%s:%s: PR_STORE_ENTRYID missing\n",  SRCNAME, __func__);
-      session->Release ();
+      gpgol_release (session);
       ul_release (folder, __func__, __LINE__);
       return -1;
     }
@@ -701,7 +701,7 @@ gpgol_folder_revert (LPDISPATCH mapifolderobj)
     {
       log_error ("%s:%s: OpenMsgStore failed: hr=%#lx\n", 
                  SRCNAME, __func__, hr);
-      session->Release ();
+      gpgol_release (session);
       ul_release (folder, __func__, __LINE__);
       return -1;
     }
@@ -714,7 +714,7 @@ gpgol_folder_revert (LPDISPATCH mapifolderobj)
       log_error ("%s:%s: error getting contents table: hr=%#lx\n", 
                  SRCNAME, __func__, hr);
       ul_release (mdb, __func__, __LINE__);
-      session->Release ();
+      gpgol_release (session);
       ul_release (folder, __func__, __LINE__);
       return -1;
     }
@@ -725,9 +725,9 @@ gpgol_folder_revert (LPDISPATCH mapifolderobj)
     {
       log_error ("%s:%s: error setting contents table column: hr=%#lx\n", 
                  SRCNAME, __func__, hr);
-      contents->Release ();
+      gpgol_release (contents);
       ul_release (mdb, __func__, __LINE__);
-      session->Release ();
+      gpgol_release (session);
       ul_release (folder, __func__, __LINE__);
       return -1;
     }
@@ -776,7 +776,7 @@ gpgol_folder_revert (LPDISPATCH mapifolderobj)
             log_debug ("%s:%s: this row has now message object (type=%d)"
                        " - skipped\n",  SRCNAME, __func__, (int)mtype);
 
-          message->Release ();
+          gpgol_release (message);
         }
       FreeProws (rows);
       rows = NULL;
@@ -790,9 +790,9 @@ gpgol_folder_revert (LPDISPATCH mapifolderobj)
       rows = NULL;
     }
 
-  contents->Release ();
+  gpgol_release (contents);
   ul_release (mdb, __func__, __LINE__);
-  session->Release ();
+  gpgol_release (session);
   ul_release (folder, __func__, __LINE__);
   return 0;
 }
index 452aae6..0b547f4 100644 (file)
@@ -592,7 +592,7 @@ verify_mime (LPDISPATCH mailitem)
       return 0;
     }
   ret = message_incoming_handler (message, NULL, true /*force */);
-  message->Release ();
+  gpgol_release (message);
 
   return ret;
 }
@@ -902,7 +902,7 @@ do_reader_action (LPDISPATCH ctrl, int flags)
   xfree (senderAddr);
   xfree (subject);
   if (tmpstream)
-    tmpstream->Release();
+    gpgol_release (tmpstream);
 
   return S_OK;
 }
@@ -982,7 +982,7 @@ getIcon (int id, VARIANT* result)
           if (CreateStreamOnHGlobal (hBuffer, FALSE, &pStream) == S_OK)
             {
               pbitmap = Gdiplus::Bitmap::FromStream (pStream);
-              pStream->Release();
+              gpgol_release (pStream);
               if (!pbitmap || pbitmap->GetHBITMAP (0, &pdesc.bmp.hbitmap))
                 {
                   log_error ("%s:%s: failed to get PNG.",
index 6eccb35..b20f0bc 100644 (file)
@@ -97,14 +97,17 @@ void log_window_hierarchy (HWND window, const char *fmt,
 #define log_oom if (opt.enable_debug & DBG_OOM) log_debug
 #define log_oom_extra if (opt.enable_debug & DBG_OOM_EXTRA) log_debug
 #define gpgol_release(X) \
+{ \
   if (X && opt.enable_debug & DBG_OOM_EXTRA) \
     { \
-      log_debug ("Releasing: %p \n", X); \
       log_debug ("%s:%s: Object: %p released ref: %lu \n", \
                  SRCNAME, __func__, X, X->Release()); \
     } \
   else if (X) \
-    X->Release();
+    { \
+      X->Release(); \
+    } \
+}
 
 const char *log_srcname (const char *s);
 #define SRCNAME log_srcname (__FILE__)