Add InspectorEvents experiment
authorAndre Heinecke <aheinecke@intevation.de>
Thu, 8 Nov 2018 14:42:25 +0000 (15:42 +0100)
committerAndre Heinecke <aheinecke@intevation.de>
Thu, 8 Nov 2018 14:42:25 +0000 (15:42 +0100)
--
This commit is just an experiment to check the order
of events when closing.

src/Makefile.am
src/eventsinks.h
src/inspector-events.cpp [new file with mode: 0644]
src/mail.cpp
src/mail.h
src/oomhelp.h

index 369ce6d..dd8cbdf 100644 (file)
@@ -49,6 +49,7 @@ gpgol_SOURCES = \
     gpgoladdin.cpp gpgoladdin.h \
     gpgol.def \
     gpgol-ids.h \
+    inspector-events.cpp \
     keycache.cpp keycache.h \
     mail.h mail.cpp \
     mailitem-events.cpp \
index 1508a62..dc62122 100644 (file)
@@ -32,4 +32,6 @@ LPDISPATCH install_ExplorersEvents_sink (LPDISPATCH obj);
 void detach_ExplorersEvents_sink (LPDISPATCH obj);
 LPDISPATCH install_FolderEvents_sink (LPDISPATCH obj);
 void detach_FolderEvents_sink (LPDISPATCH obj);
+LPDISPATCH install_InspectorEvents_sink (LPDISPATCH obj);
+void detach_InspectorEvents_sink (LPDISPATCH obj);
 #endif // EVENTSINKS_H
diff --git a/src/inspector-events.cpp b/src/inspector-events.cpp
new file mode 100644 (file)
index 0000000..dbf684b
--- /dev/null
@@ -0,0 +1,113 @@
+/* inspector-events.cpp - Event handling for an inspector.
+ * Copyright (C) 2018 Intevation GmBH
+ *
+ * This file is part of GpgOL.
+ *
+ * GpgOL is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * GpgOL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* The event handler classes defined in this file follow the
+   general pattern that they implment the IDispatch interface
+   through the eventsink macros and handle event invocations
+   in their invoke methods.
+*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "eventsink.h"
+#include "ocidl.h"
+#include "common.h"
+#include "oomhelp.h"
+#include "mail.h"
+
+/* Folder Events */
+BEGIN_EVENT_SINK(InspectorEvents, IDispatch)
+EVENT_SINK_DEFAULT_CTOR(InspectorEvents)
+EVENT_SINK_DEFAULT_DTOR(InspectorEvents)
+typedef enum
+  {
+    Activate = 0xF001,
+    AttachmentSelectionChange = 0xFC79,
+    BeforeMaximize = 0xFA11,
+    BeforeMinimize = 0xFA12,
+    BeforeMove = 0xFA13,
+    BeforeSize = 0xFA14,
+    Close = 0xF008,
+    Deactivate = 0xF006,
+    PageChange = 0xFBF4,
+  } InspectorEvent;
+
+EVENT_SINK_INVOKE(InspectorEvents)
+{
+  USE_INVOKE_ARGS
+  switch(dispid)
+    {
+      case Close:
+        {
+          TSTART;
+          log_oom ("%s:%s Close event in inspector %p",
+                   SRCNAME, __func__, this);
+          /* Get the mail object belonging to us */
+          auto mailitem = MAKE_SHARED (get_oom_object (m_object, "CurrentItem"));
+
+          if (!mailitem)
+            {
+              STRANGEPOINT;
+              TBREAK;
+            }
+
+          char *uid = get_unique_id (mailitem.get (), 0, nullptr);
+          mailitem = nullptr;
+          if (!uid)
+            {
+              log_debug ("%s:%s: Failed to find uid for %p \n",
+                         SRCNAME, __func__, mailitem);
+              TBREAK;
+            }
+          auto mail = Mail::getMailForUUID (uid);
+          xfree (uid);
+
+          if (!mail)
+            {
+              STRANGEPOINT;
+              TBREAK;
+            }
+
+          if (!mail->isCryptoMail())
+            {
+              STRANGEPOINT;
+              TBREAK;
+            }
+
+          if (mail->getCloseTriggered ())
+            {
+              log_debug ("%s:%s: Passing our close for item %p",
+                         SRCNAME, __func__, mail);
+              TBREAK;
+            }
+          mail->setCloseTriggered (true);
+          Mail::closeInspector_o (mail);
+          Mail::close (mail);
+        }
+      default:
+        break;
+#if 1
+        log_oom ("%s:%s: Unhandled Event: %lx \n",
+                       SRCNAME, __func__, dispid);
+#endif
+    }
+  return S_OK;
+}
+END_EVENT_SINK(InspectorEvents, IID_InspectorEvents)
index eafa3ef..e1d8214 100644 (file)
@@ -108,7 +108,8 @@ Mail::Mail (LPDISPATCH mailitem) :
     m_locate_count(0),
     m_is_about_to_be_moved(false),
     m_locate_in_progress(false),
-    m_is_junk(false)
+    m_is_junk(false),
+    m_inspector_events(nullptr)
 {
   TSTART;
   if (getMailForItem (mailitem))
@@ -220,6 +221,12 @@ Mail::~Mail()
   m_parser = nullptr;
   m_crypter = nullptr;
 
+  if (m_inspector_events)
+    {
+      log_oom ("%s:%s: Detaching inspector event handler",
+               SRCNAME, __func__);
+      detach_InspectorEvents_sink (m_inspector_events);
+    }
   releaseCurrentItem();
   gpgol_unlock (&dtor_lock);
   log_oom ("%s:%s: returning",
@@ -1094,6 +1101,17 @@ Mail::decryptVerify_o ()
       TRETURN 1;
     }
 
+  auto inspector = get_oom_object (m_mailitem, "GetInspector");
+  if (!inspector)
+    {
+      STRANGEPOINT;
+    }
+  else
+    {
+      m_inspector_events = install_InspectorEvents_sink (inspector);
+      gpgol_release (inspector);
+    }
+
   setUUID_o ();
   m_processed = true;
 
index 170770c..cbbb59a 100644 (file)
@@ -655,5 +655,6 @@ private:
   std::string m_store_id; /* Store id for categories */
   std::string m_verify_category; /* The category string for the verify result */
   bool m_is_junk; /* Mail is in the junk folder */
+  LPDISPATCH m_inspector_events; /* Inspector event sink */
 };
 #endif // MAIL_H
index 762f578..5c8865b 100644 (file)
@@ -77,6 +77,9 @@ DEFINE_GUID(IID_ExplorersEvents, 0x00063078, 0x0000, 0x0000,
             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
 DEFINE_GUID(IID_MailItemEvents, 0x0006302B, 0x0000, 0x0000,
             0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
+DEFINE_GUID(IID_InspectorEvents, 0x0006302A, 0x0000, 0x0000,
+            0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
+
 DEFINE_GUID(IID_MailItem, 0x00063034, 0x0000, 0x0000,
             0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
 DEFINE_GUID(IID_IMAPISecureMessage, 0x253cc320, 0xeab6, 0x11d0,