[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - extensions/Library_oleautobridge.mk extensions/source

Tor Lillqvist (via logerrit) logerrit at kemper.freedesktop.org
Fri Sep 20 13:14:57 UTC 2019


 extensions/Library_oleautobridge.mk |    1 
 extensions/source/ole/unoobjw.cxx   |   51 ++++++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+)

New commits:
commit af222266e3522820c873bd9700c4bf542fd6cb04
Author:     Tor Lillqvist <tml at collabora.com>
AuthorDate: Mon Jun 10 15:41:28 2019 +0300
Commit:     Tor Lillqvist <tml at collabora.com>
CommitDate: Fri Sep 20 15:14:09 2019 +0200

    Veto process exit while an OLE client is connected
    
    Change-Id: Iad9fc1742ae371a8a162edbc16998e9cb6895919
    Reviewed-on: https://gerrit.libreoffice.org/79245
    Reviewed-by: Tor Lillqvist <tml at collabora.com>
    Tested-by: Tor Lillqvist <tml at collabora.com>

diff --git a/extensions/Library_oleautobridge.mk b/extensions/Library_oleautobridge.mk
index ec59f715c504..6aaf5555e250 100644
--- a/extensions/Library_oleautobridge.mk
+++ b/extensions/Library_oleautobridge.mk
@@ -35,6 +35,7 @@ $(eval $(call gb_Library_use_libraries,oleautobridge,\
 	cppuhelper \
 	cppu \
 	sal \
+	tl \
 ))
 
 $(eval $(call gb_Library_use_system_win32_libs,oleautobridge,\
diff --git a/extensions/source/ole/unoobjw.cxx b/extensions/source/ole/unoobjw.cxx
index 402d1e777212..2ee61fd34ec2 100644
--- a/extensions/source/ole/unoobjw.cxx
+++ b/extensions/source/ole/unoobjw.cxx
@@ -57,8 +57,12 @@
 #include <salhelper/simplereferenceobject.hxx>
 #include <rtl/ustring.hxx>
 #include <sal/log.hxx>
+#include <tools/diagnose_ex.h>
 #include <com/sun/star/beans/MethodConcept.hpp>
 #include <com/sun/star/beans/PropertyConcept.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/frame/TerminationVetoException.hpp>
+#include <com/sun/star/frame/XTerminateListener.hpp>
 #include <com/sun/star/lang/NoSuchMethodException.hpp>
 #include <com/sun/star/script/CannotConvertException.hpp>
 #include <com/sun/star/script/FailReason.hpp>
@@ -110,6 +114,50 @@ static bool writeBackOutParameter(VARIANTARG* pDest, VARIANT* pSource);
 static bool writeBackOutParameter2( VARIANTARG* pDest, VARIANT* pSource);
 static HRESULT mapCannotConvertException(const CannotConvertException &e, unsigned int * puArgErr);
 
+class TerminationVetoer : public WeakImplHelper<css::frame::XTerminateListener>
+{
+public:
+    int mnCount;
+
+    TerminationVetoer()
+        : mnCount(0)
+    {
+        try
+        {
+            Reference< css::frame::XDesktop > xDesktop =
+                css::frame::Desktop::create( comphelper::getProcessComponentContext() );
+            xDesktop->addTerminateListener( this );
+        }
+        catch( const Exception& )
+        {
+            DBG_UNHANDLED_EXCEPTION("extensions.ole");
+        }
+    }
+
+    // XTerminateListener
+    void SAL_CALL queryTermination( const EventObject& ) override
+    {
+        // Always veto termination while an OLE object is active
+        if (mnCount > 0)
+        {
+            throw css::frame::TerminationVetoException();
+        }
+    }
+
+    void SAL_CALL notifyTermination( const EventObject& ) override
+    {
+        // ???
+    }
+
+    // XEventListener
+    void SAL_CALL disposing( const css::lang::EventObject& Source ) override
+    {
+        // ???
+    }
+};
+
+static TerminationVetoer aTerminationVetoer;
+
 /* Does not throw any exceptions.
    Param pInfo can be NULL.
  */
@@ -128,6 +176,7 @@ InterfaceOleWrapper::InterfaceOleWrapper( Reference<XMultiServiceFactory> const
         UnoConversionUtilities<InterfaceOleWrapper>( xFactory, unoWrapperClass, comWrapperClass),
         m_defaultValueType( 0)
 {
+    aTerminationVetoer.mnCount++;
 }
 
 InterfaceOleWrapper::~InterfaceOleWrapper()
@@ -137,6 +186,8 @@ InterfaceOleWrapper::~InterfaceOleWrapper()
     auto it = UnoObjToWrapperMap.find( reinterpret_cast<sal_uIntPtr>(m_xOrigin.get()));
     if(it != UnoObjToWrapperMap.end())
         UnoObjToWrapperMap.erase(it);
+
+    aTerminationVetoer.mnCount--;
 }
 
 STDMETHODIMP InterfaceOleWrapper::QueryInterface(REFIID riid, LPVOID FAR * ppv)


More information about the Libreoffice-commits mailing list