dbaccess/Library_dba.mk | 1 dbaccess/source/core/api/querycontainer.cxx | 72 +++++++------- dbaccess/source/core/dataaccess/connection.cxx | 2 dbaccess/source/core/inc/ContainerListener.hxx | 80 ---------------- dbaccess/source/core/inc/querycontainer.hxx | 20 ++-- dbaccess/source/core/misc/ContainerListener.cxx | 119 ------------------------ 6 files changed, 51 insertions(+), 243 deletions(-)
New commits: commit c9db5e6f083aea2622559efcb9fcccef7926fd16 Author: Stephan Bergmann <[email protected]> Date: Fri Aug 16 14:57:24 2013 +0200 Do not use this ptr in ctor ...offload to init() instead and wrap ctor in create(). That removes the need for refcount fiddling and additional OContainerListener class. Which in turn removes code using dynamic_cast on UNO interface classes, which my claim at <http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20130812/ 086127.html> "ubsan: check type_info equality via strcmp" that "there should not be uses of dynamic_cast involving [UNO] classes in the LibreOffice code base" made me wonder about... Change-Id: I5d72650f6bf081f971f7bd6bb65f4e58a342f791 diff --git a/dbaccess/Library_dba.mk b/dbaccess/Library_dba.mk index 08d13df..27d2e99 100644 --- a/dbaccess/Library_dba.mk +++ b/dbaccess/Library_dba.mk @@ -115,7 +115,6 @@ $(eval $(call gb_Library_add_exception_objects,dba,\ dbaccess/source/core/dataaccess/myucp_resultset \ dbaccess/source/core/dataaccess/SharedConnection \ dbaccess/source/core/misc/apitools \ - dbaccess/source/core/misc/ContainerListener \ dbaccess/source/core/misc/ContainerMediator \ dbaccess/source/core/misc/DatabaseDataProvider \ dbaccess/source/core/misc/dsntypes \ diff --git a/dbaccess/source/core/api/querycontainer.cxx b/dbaccess/source/core/api/querycontainer.cxx index 7e0e05e..fc5ccfc 100644 --- a/dbaccess/source/core/api/querycontainer.cxx +++ b/dbaccess/source/core/api/querycontainer.cxx @@ -22,7 +22,6 @@ #include "dbastrings.hrc" #include "query.hxx" #include "objectnameapproval.hxx" -#include "ContainerListener.hxx" #include "veto.hxx" #include <com/sun/star/beans/XPropertySet.hpp> @@ -75,32 +74,41 @@ OQueryContainer::OQueryContainer( ,m_xConnection(_rxConn) { DBG_CTOR(OQueryContainer, NULL); +} - increment(m_refCount); +void OQueryContainer::init() +{ + Reference< XContainer > xContainer( m_xCommandDefinitions, UNO_QUERY_THROW ); + xContainer->addContainerListener( this ); + + Reference< XContainerApproveBroadcaster > xContainerApprove( m_xCommandDefinitions, UNO_QUERY_THROW ); + xContainerApprove->addContainerApproveListener( this ); + + // fill my structures + ODefinitionContainer_Impl& rDefinitions( getDefinitions() ); + Sequence< OUString > sDefinitionNames = m_xCommandDefinitions->getElementNames(); + const OUString* pDefinitionName = sDefinitionNames.getConstArray(); + const OUString* pEnd = pDefinitionName + sDefinitionNames.getLength(); + for ( ; pDefinitionName != pEnd; ++pDefinitionName ) { - m_pCommandsListener = new OContainerListener( *this, m_aMutex ); - m_pCommandsListener->acquire(); - - Reference< XContainer > xContainer( m_xCommandDefinitions, UNO_QUERY_THROW ); - xContainer->addContainerListener( m_pCommandsListener ); - - Reference< XContainerApproveBroadcaster > xContainerApprove( m_xCommandDefinitions, UNO_QUERY_THROW ); - xContainerApprove->addContainerApproveListener( m_pCommandsListener ); - - // fill my structures - ODefinitionContainer_Impl& rDefinitions( getDefinitions() ); - Sequence< OUString > sDefinitionNames = m_xCommandDefinitions->getElementNames(); - const OUString* pDefinitionName = sDefinitionNames.getConstArray(); - const OUString* pEnd = pDefinitionName + sDefinitionNames.getLength(); - for ( ; pDefinitionName != pEnd; ++pDefinitionName ) - { - rDefinitions.insert( *pDefinitionName, TContentPtr() ); - m_aDocuments.push_back(m_aDocumentMap.insert(Documents::value_type(*pDefinitionName,Documents::mapped_type())).first); - } + rDefinitions.insert( *pDefinitionName, TContentPtr() ); + m_aDocuments.push_back(m_aDocumentMap.insert(Documents::value_type(*pDefinitionName,Documents::mapped_type())).first); } - decrement(m_refCount); - setElementApproval( PContainerApprove( new ObjectNameApproval( _rxConn, ObjectNameApproval::TypeQuery ) ) ); + setElementApproval( PContainerApprove( new ObjectNameApproval( m_xConnection, ObjectNameApproval::TypeQuery ) ) ); +} + +rtl::Reference<OQueryContainer> OQueryContainer::create( + const Reference< XNameContainer >& _rxCommandDefinitions + , const Reference< XConnection >& _rxConn + , const Reference< XComponentContext >& _rxORB, + ::dbtools::IWarningsContainer* _pWarnings) +{ + rtl::Reference<OQueryContainer> c( + new OQueryContainer( + _rxCommandDefinitions, _rxConn, _rxORB, _pWarnings)); + c->init(); + return c; } OQueryContainer::~OQueryContainer() @@ -122,17 +130,10 @@ void OQueryContainer::disposing() // already disposed return; - if ( m_pCommandsListener ) - { - Reference< XContainer > xContainer( m_xCommandDefinitions, UNO_QUERY ); - xContainer->removeContainerListener( m_pCommandsListener ); - Reference< XContainerApproveBroadcaster > xContainerApprove( m_xCommandDefinitions, UNO_QUERY ); - xContainerApprove->removeContainerApproveListener( m_pCommandsListener ); - - m_pCommandsListener->dispose(); - m_pCommandsListener->release(); - m_pCommandsListener = NULL; - } + Reference< XContainer > xContainer( m_xCommandDefinitions, UNO_QUERY ); + xContainer->removeContainerListener( this ); + Reference< XContainerApproveBroadcaster > xContainerApprove( m_xCommandDefinitions, UNO_QUERY ); + xContainerApprove->removeContainerApproveListener( this ); m_xCommandDefinitions = NULL; m_xConnection = NULL; @@ -345,7 +346,8 @@ Reference< XContent > OQueryContainer::implCreateWrapper(const Reference< XConte Reference< XContent > xReturn; if ( xContainer .is() ) { - xReturn = new OQueryContainer( xContainer, m_xConnection, m_aContext, m_pWarnings ); + xReturn = create( xContainer, m_xConnection, m_aContext, m_pWarnings ). + get(); } else { diff --git a/dbaccess/source/core/dataaccess/connection.cxx b/dbaccess/source/core/dataaccess/connection.cxx index 5ab0029..3675c83 100644 --- a/dbaccess/source/core/dataaccess/connection.cxx +++ b/dbaccess/source/core/dataaccess/connection.cxx @@ -319,7 +319,7 @@ OConnection::OConnection(ODatabaseSource& _rDB try { - m_xQueries = new OQueryContainer(Reference< XNameContainer >(_rDB.getQueryDefinitions(), UNO_QUERY), this, _rxORB, &m_aWarnings); + m_xQueries = OQueryContainer::create(Reference< XNameContainer >(_rDB.getQueryDefinitions(), UNO_QUERY), this, _rxORB, &m_aWarnings).get(); sal_Bool bCase = sal_True; Reference<XDatabaseMetaData> xMeta; diff --git a/dbaccess/source/core/inc/ContainerListener.hxx b/dbaccess/source/core/inc/ContainerListener.hxx deleted file mode 100644 index b910b20..0000000 --- a/dbaccess/source/core/inc/ContainerListener.hxx +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ -#ifndef DBA_CONTAINERLISTENER_HXX -#define DBA_CONTAINERLISTENER_HXX - -#include <cppuhelper/implbase2.hxx> -#include <com/sun/star/container/XContainerListener.hpp> -#include <com/sun/star/container/XContainerApproveListener.hpp> - -#include <cppuhelper/weak.hxx> - -namespace dbaccess -{ - - //========================================================================== - //= OContainerListener - //========================================================================== - typedef ::cppu::WeakImplHelper2 < ::com::sun::star::container::XContainerListener - , ::com::sun::star::container::XContainerApproveListener - > OContainerListener_BASE; - - /** is helper class to avoid a cycle in refcount - */ - class OContainerListener : public OContainerListener_BASE - { - ::osl::Mutex& m_rMutex; - OWeakObject& m_rDestination; - bool m_bDisposed; - - public: - OContainerListener( OWeakObject& _rDestination, ::osl::Mutex& _rMutex ) - :m_rMutex( _rMutex ) - ,m_rDestination( _rDestination ) - ,m_bDisposed( false ) - { - } - - // XContainerApproveListener - virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XVeto > SAL_CALL approveInsertElement( const ::com::sun::star::container::ContainerEvent& Event ) throw (::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XVeto > SAL_CALL approveReplaceElement( const ::com::sun::star::container::ContainerEvent& Event ) throw (::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XVeto > SAL_CALL approveRemoveElement( const ::com::sun::star::container::ContainerEvent& Event ) throw (::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); - - // XContainerListener - virtual void SAL_CALL elementInserted( const ::com::sun::star::container::ContainerEvent& Event ) throw(::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL elementRemoved( const ::com::sun::star::container::ContainerEvent& Event ) throw(::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL elementReplaced( const ::com::sun::star::container::ContainerEvent& Event ) throw(::com::sun::star::uno::RuntimeException); - - // XEventListener - virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException); - - void SAL_CALL dispose() - { - m_bDisposed = true; - } - - protected: - virtual ~OContainerListener(); - }; - -} // namespace dbaccess - -#endif // DBA_CONTAINERLISTENER_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/dbaccess/source/core/inc/querycontainer.hxx b/dbaccess/source/core/inc/querycontainer.hxx index ff89cb4..0dd74c0 100644 --- a/dbaccess/source/core/inc/querycontainer.hxx +++ b/dbaccess/source/core/inc/querycontainer.hxx @@ -62,11 +62,10 @@ namespace dbaccess //========================================================================== //= OQueryContainer //========================================================================== - class OContainerListener; class OQueryContainer : public ODefinitionContainer , public OQueryContainer_Base { - protected: + private: ::dbtools::IWarningsContainer* m_pWarnings; ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > m_xCommandDefinitions; @@ -76,8 +75,6 @@ namespace dbaccess enum AGGREGATE_ACTION { NONE, INSERTING, FLUSHING }; AGGREGATE_ACTION m_eDoingCurrently; - OContainerListener* m_pCommandsListener; - /** a class which automatically resets m_eDoingCurrently in it's destructor */ class OAutoActionReset; // just for the following friend declaration @@ -97,7 +94,7 @@ namespace dbaccess // helper virtual void SAL_CALL disposing(); virtual ~OQueryContainer(); - public: + /** ctor of the container. The parent has to support the <type scope="com::sun::star::sdbc">XConnection</type> interface.<BR> @@ -116,6 +113,16 @@ namespace dbaccess ::dbtools::IWarningsContainer* _pWarnings ); + void init(); + + public: + static rtl::Reference<OQueryContainer> create( + const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& _rxCommandDefinitions, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConn, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxORB, + ::dbtools::IWarningsContainer* _pWarnings + ); + DECLARE_XINTERFACE( ) DECLARE_XTYPEPROVIDER( ) DECLARE_SERVICE_INFO(); @@ -150,11 +157,10 @@ namespace dbaccess // ::com::sun::star::container::XNameAccess virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getElementNames( ) throw(::com::sun::star::uno::RuntimeException); - protected: + private: // OContentHelper overridables virtual OUString determineContentType() const; - private: // helper /** create a query object wrapping a CommandDefinition given by name. To retrieve the object, the CommandDescription container will be asked for the given name.<BR> diff --git a/dbaccess/source/core/misc/ContainerListener.cxx b/dbaccess/source/core/misc/ContainerListener.cxx deleted file mode 100644 index 66c5126..0000000 --- a/dbaccess/source/core/misc/ContainerListener.cxx +++ /dev/null @@ -1,119 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - - -#include "ContainerListener.hxx" - -//........................................................................ -namespace dbaccess -{ -//........................................................................ - - using ::com::sun::star::container::ContainerEvent; - using ::com::sun::star::lang::WrappedTargetException; - using ::com::sun::star::uno::RuntimeException; - using ::com::sun::star::container::XContainerApproveListener; - using ::com::sun::star::container::XContainerListener; - using ::com::sun::star::lang::EventObject; - using ::com::sun::star::util::XVeto; - using ::com::sun::star::uno::Reference; - - //==================================================================== - //= OContainerListener - //==================================================================== - //-------------------------------------------------------------------- - OContainerListener::~OContainerListener() - { - } - - //-------------------------------------------------------------------- - Reference< XVeto > SAL_CALL OContainerListener::approveInsertElement( const ContainerEvent& _Event ) throw (WrappedTargetException, RuntimeException) - { - ::osl::MutexGuard aGuard( m_rMutex ); - if ( m_bDisposed ) - return NULL; - - return dynamic_cast< XContainerApproveListener& >( m_rDestination ).approveInsertElement( _Event ); - } - - //-------------------------------------------------------------------- - Reference< XVeto > SAL_CALL OContainerListener::approveReplaceElement( const ContainerEvent& _Event ) throw (WrappedTargetException, RuntimeException) - { - ::osl::MutexGuard aGuard( m_rMutex ); - if ( m_bDisposed ) - return NULL; - - return dynamic_cast< XContainerApproveListener& >( m_rDestination ).approveReplaceElement( _Event ); - } - - //-------------------------------------------------------------------- - Reference< XVeto > SAL_CALL OContainerListener::approveRemoveElement( const ContainerEvent& _Event ) throw (WrappedTargetException, RuntimeException) - { - ::osl::MutexGuard aGuard( m_rMutex ); - if ( m_bDisposed ) - return NULL; - - return dynamic_cast< XContainerApproveListener& >( m_rDestination ).approveRemoveElement( _Event ); - } - - //-------------------------------------------------------------------- - void SAL_CALL OContainerListener::elementInserted( const ContainerEvent& _Event ) throw(RuntimeException) - { - ::osl::MutexGuard aGuard( m_rMutex ); - if ( m_bDisposed ) - return; - - dynamic_cast< XContainerListener& >( m_rDestination ).elementInserted( _Event ); - } - - //-------------------------------------------------------------------- - void SAL_CALL OContainerListener::elementRemoved( const ContainerEvent& _Event ) throw(RuntimeException) - { - ::osl::MutexGuard aGuard( m_rMutex ); - if ( m_bDisposed ) - return; - - dynamic_cast< XContainerListener& >( m_rDestination ).elementRemoved( _Event ); - } - - //-------------------------------------------------------------------- - void SAL_CALL OContainerListener::elementReplaced( const ContainerEvent& _Event ) throw(RuntimeException) - { - ::osl::MutexGuard aGuard( m_rMutex ); - if ( m_bDisposed ) - return; - - dynamic_cast< XContainerListener& >( m_rDestination ).elementReplaced( _Event ); - } - - //-------------------------------------------------------------------- - void SAL_CALL OContainerListener::disposing( const EventObject& _Source ) throw(RuntimeException) - { - ::osl::MutexGuard aGuard( m_rMutex ); - if ( m_bDisposed ) - return; - - dynamic_cast< XContainerListener& >( m_rDestination ).disposing( _Source ); - } - -//........................................................................ -} // namespace dbaccess -//........................................................................ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
