|
 |
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 |
|