Blame SOURCES/0001-rhbz-1213173-connectivity-Calc-driver-prevent-docume.patch

ebc4bd
From 9954f77b2ecd2591a904dac23aee5e8395334180 Mon Sep 17 00:00:00 2001
ebc4bd
From: Michael Stahl <mstahl@redhat.com>
ebc4bd
Date: Wed, 29 Apr 2015 15:49:46 +0200
ebc4bd
Subject: [PATCH] rhbz#1213173: connectivity: Calc driver: prevent document
ebc4bd
 being disposed
ebc4bd
MIME-Version: 1.0
ebc4bd
Content-Type: text/plain; charset=UTF-8
ebc4bd
Content-Transfer-Encoding: 8bit
ebc4bd
ebc4bd
... by adding a XCloseListener that vetoes any attempt to close it.
ebc4bd
ebc4bd
The Calc document can be opened by the user in the UI and closed again.
ebc4bd
ebc4bd
(cherry picked from commit 7368b6ca3f61e750765f42e97d0a00e10fcac516)
ebc4bd
ebc4bd
Conflicts:
ebc4bd
	unotools/source/misc/closeveto.cxx
ebc4bd
ebc4bd
Change-Id: Ied427b67274d925c911e516c0a50a4c0b2b18db9
ebc4bd
Reviewed-on: https://gerrit.libreoffice.org/15567
ebc4bd
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
ebc4bd
Tested-by: Caolán McNamara <caolanm@redhat.com>
ebc4bd
(cherry picked from commit e8777783db81279a6b0e9cc7b308f10719bd8a7b)
ebc4bd
---
ebc4bd
 connectivity/source/drivers/calc/CConnection.cxx | 10 ++++++++--
ebc4bd
 connectivity/source/inc/calc/CConnection.hxx     | 10 +++++++---
ebc4bd
 include/unotools/closeveto.hxx                   |  3 ++-
ebc4bd
 unotools/source/misc/closeveto.cxx               | 17 +++++++++--------
ebc4bd
 4 files changed, 26 insertions(+), 14 deletions(-)
ebc4bd
ebc4bd
diff --git a/connectivity/source/drivers/calc/CConnection.cxx b/connectivity/source/drivers/calc/CConnection.cxx
ebc4bd
index b81a585..731c4a3 100644
ebc4bd
--- a/connectivity/source/drivers/calc/CConnection.cxx
ebc4bd
+++ b/connectivity/source/drivers/calc/CConnection.cxx
ebc4bd
@@ -31,6 +31,7 @@
ebc4bd
 #include "calc/CPreparedStatement.hxx"
ebc4bd
 #include "calc/CStatement.hxx"
ebc4bd
 #include <unotools/pathoptions.hxx>
ebc4bd
+#include <unotools/closeveto.hxx>
ebc4bd
 #include <connectivity/dbexception.hxx>
ebc4bd
 #include <cppuhelper/exc_hlp.hxx>
ebc4bd
 #include <comphelper/processfactory.hxx>
ebc4bd
@@ -165,13 +166,17 @@ Reference< XSpreadsheetDocument> OCalcConnection::acquireDoc()
ebc4bd
         ::dbtools::throwGenericSQLException( sError, *this, aErrorDetails );
ebc4bd
     }
ebc4bd
     osl_atomic_increment(&m_nDocCount);
ebc4bd
+    m_pCloseListener.reset(new utl::CloseVeto(m_xDoc, true));
ebc4bd
     return m_xDoc;
ebc4bd
 }
ebc4bd
 
ebc4bd
 void OCalcConnection::releaseDoc()
ebc4bd
 {
ebc4bd
     if ( osl_atomic_decrement(&m_nDocCount) == 0 )
ebc4bd
-        ::comphelper::disposeComponent( m_xDoc );
ebc4bd
+    {
ebc4bd
+        m_pCloseListener.reset(); // dispose m_xDoc
ebc4bd
+        m_xDoc.clear();
ebc4bd
+    }
ebc4bd
 }
ebc4bd
 
ebc4bd
 void OCalcConnection::disposing()
ebc4bd
@@ -179,7 +184,8 @@ void OCalcConnection::disposing()
ebc4bd
     ::osl::MutexGuard aGuard(m_aMutex);
ebc4bd
 
ebc4bd
     m_nDocCount = 0;
ebc4bd
-    ::comphelper::disposeComponent( m_xDoc );
ebc4bd
+    m_pCloseListener.reset(); // dispose m_xDoc
ebc4bd
+    m_xDoc.clear();
ebc4bd
 
ebc4bd
     OConnection::disposing();
ebc4bd
 }
ebc4bd
diff --git a/connectivity/source/inc/calc/CConnection.hxx b/connectivity/source/inc/calc/CConnection.hxx
ebc4bd
index b66d892..14e8580 100644
ebc4bd
--- a/connectivity/source/inc/calc/CConnection.hxx
ebc4bd
+++ b/connectivity/source/inc/calc/CConnection.hxx
ebc4bd
@@ -23,9 +23,11 @@
ebc4bd
 #include "file/FConnection.hxx"
ebc4bd
 #include <com/sun/star/uno/DeploymentException.hpp>
ebc4bd
 
ebc4bd
-namespace com { namespace sun { namespace star { namespace sheet {
ebc4bd
-    class XSpreadsheetDocument;
ebc4bd
-} } } }
ebc4bd
+namespace com { namespace sun { namespace star {
ebc4bd
+    namespace sheet { class XSpreadsheetDocument; }
ebc4bd
+} } }
ebc4bd
+
ebc4bd
+namespace utl { class CloseVeto; }
ebc4bd
 
ebc4bd
 
ebc4bd
 namespace connectivity
ebc4bd
@@ -37,6 +39,8 @@ namespace connectivity
ebc4bd
         {
ebc4bd
             // the spreadsheet document:
ebc4bd
             ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheetDocument > m_xDoc;
ebc4bd
+            /// close listener that vetoes so nobody disposes m_xDoc
ebc4bd
+            ::std::unique_ptr< ::utl::CloseVeto> m_pCloseListener;
ebc4bd
             OUString m_sPassword;
ebc4bd
             OUString m_aFileName;
ebc4bd
             oslInterlockedCount m_nDocCount;
ebc4bd
diff --git a/include/unotools/closeveto.hxx b/include/unotools/closeveto.hxx
ebc4bd
index 9beb0b5..9ed27a7 100644
ebc4bd
--- a/include/unotools/closeveto.hxx
ebc4bd
+++ b/include/unotools/closeveto.hxx
ebc4bd
@@ -41,7 +41,8 @@ namespace utl
ebc4bd
     class UNOTOOLS_DLLPUBLIC CloseVeto
ebc4bd
     {
ebc4bd
     public:
ebc4bd
-        CloseVeto( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& i_closeable );
ebc4bd
+        CloseVeto( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& i_closeable,
ebc4bd
+                bool bHasOwnership = false);
ebc4bd
         ~CloseVeto();
ebc4bd
 
ebc4bd
     private:
ebc4bd
diff --git a/unotools/source/misc/closeveto.cxx b/unotools/source/misc/closeveto.cxx
ebc4bd
index 4044fa7..9ecf82e 100644
ebc4bd
--- a/unotools/source/misc/closeveto.cxx
ebc4bd
+++ b/unotools/source/misc/closeveto.cxx
ebc4bd
@@ -51,8 +51,8 @@ namespace utl
ebc4bd
     class CloseListener_Impl : public CloseListener_Base
ebc4bd
     {
ebc4bd
     public:
ebc4bd
-        CloseListener_Impl()
ebc4bd
-            :m_bHasOwnership( false )
ebc4bd
+        CloseListener_Impl(bool const bHasOwnership)
ebc4bd
+            : m_bHasOwnership(bHasOwnership)
ebc4bd
         {
ebc4bd
         }
ebc4bd
 
ebc4bd
@@ -107,12 +107,13 @@ namespace utl
ebc4bd
     namespace
ebc4bd
     {
ebc4bd
 
ebc4bd
-        void lcl_init( CloseVeto_Data& i_data, const Reference< XInterface >& i_closeable )
ebc4bd
+        void lcl_init( CloseVeto_Data& i_data, const Reference< XInterface >& i_closeable,
ebc4bd
+                bool const hasOwnership)
ebc4bd
         {
ebc4bd
             i_data.xCloseable.set( i_closeable, UNO_QUERY );
ebc4bd
             ENSURE_OR_RETURN_VOID( i_data.xCloseable.is(), "CloseVeto: the component is not closeable!" );
ebc4bd
 
ebc4bd
-            i_data.pListener = new CloseListener_Impl;
ebc4bd
+            i_data.pListener = new CloseListener_Impl(hasOwnership);
ebc4bd
             i_data.xCloseable->addCloseListener( i_data.pListener.get() );
ebc4bd
         }
ebc4bd
 
ebc4bd
@@ -138,11 +139,11 @@ namespace utl
ebc4bd
     }
ebc4bd
 
ebc4bd
     //= CloseVeto
ebc4bd
-
ebc4bd
-    CloseVeto::CloseVeto( const Reference< XInterface >& i_closeable )
ebc4bd
-        :m_pData( new CloseVeto_Data )
ebc4bd
+    CloseVeto::CloseVeto(const Reference< XInterface >& i_closeable,
ebc4bd
+            bool const hasOwnership)
ebc4bd
+        : m_pData(new CloseVeto_Data)
ebc4bd
     {
ebc4bd
-        lcl_init( *m_pData, i_closeable );
ebc4bd
+        lcl_init(*m_pData, i_closeable, hasOwnership);
ebc4bd
     }
ebc4bd
 
ebc4bd
     CloseVeto::~CloseVeto()
ebc4bd
-- 
ebc4bd
2.1.0
ebc4bd