diff options
Diffstat (limited to 'configmgr/source/api2/provider.cxx')
-rw-r--r-- | configmgr/source/api2/provider.cxx | 120 |
1 files changed, 82 insertions, 38 deletions
diff --git a/configmgr/source/api2/provider.cxx b/configmgr/source/api2/provider.cxx index 31a406b6a1..ae5181be73 100644 --- a/configmgr/source/api2/provider.cxx +++ b/configmgr/source/api2/provider.cxx @@ -2,9 +2,9 @@ * * $RCSfile: provider.cxx,v $ * - * $Revision: 1.12 $ + * $Revision: 1.13 $ * - * last change: $Author: jb $ $Date: 2002-12-06 13:08:29 $ + * last change: $Author: hr $ $Date: 2003-03-19 16:18:36 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -68,9 +68,6 @@ #include "bootstrap.hxx" #endif -#ifndef CONFIGMGR_CMTREEMODEL_HXX -#include "cmtreemodel.hxx" -#endif #ifndef _OSL_MUTEX_HXX_ #include <osl/mutex.hxx> #endif @@ -117,9 +114,12 @@ namespace configmgr virtual void SAL_CALL disposing(com::sun::star::lang::EventObject const& rEvt) throw() { - CFG_TRACE_INFO("Service Manager disposed, disposing the provider"); - if (m_pProvider) - m_pProvider->disposing(rEvt); + CFG_TRACE_INFO("Service Manager or context disposed, disposing the provider"); + if (OProvider* pProvider = m_pProvider) + { + m_pProvider = NULL; + pProvider->disposing(rEvt); + } } }; @@ -127,28 +127,85 @@ namespace configmgr //= OProvider //============================================================================= //----------------------------------------------------------------------------- - OProvider::OProvider(const uno::Reference< lang::XMultiServiceFactory >& _xServiceFactory, ServiceImplementationInfo const* pInfo) + OProvider::OProvider(CreationContext const & xContext, ServiceImplementationInfo const* pInfo) :ServiceComponentImpl(pInfo) ,OPropertyContainer(ServiceComponentImpl::rBHelper) - ,m_xServiceFactory(_xServiceFactory) + ,m_xContext(xContext) { - m_xDisposeListener = new OProviderDisposingListener(this); - uno::Reference<com::sun::star::lang::XComponent> xComponent(m_xServiceFactory, uno::UNO_QUERY); - if (xComponent.is()) - xComponent->addEventListener(m_xDisposeListener); + OSL_ENSURE(m_xContext.is(), "Creating a provider without a context"); + attachToContext(); } //----------------------------------------------------------------------------- OProvider::~OProvider() + { + discardContext(releaseContext()); + } + + //----------------------------------------------------------------------------- + void OProvider::attachToContext() + { + ::osl::MutexGuard aGuard(ServiceComponentImpl::rBHelper.rMutex); + OSL_ASSERT(!m_xDisposeListener.is()); + if (m_xContext.is()) + { + uno::Reference< lang::XComponent > xContextComp(m_xContext, uno::UNO_QUERY); + uno::Reference< lang::XComponent > xServiceMgrComp(m_xContext->getServiceManager(), uno::UNO_QUERY); + + m_xDisposeListener = new OProviderDisposingListener(this); + + if (xContextComp.is()) xContextComp ->addEventListener(m_xDisposeListener); + if (xServiceMgrComp.is()) xServiceMgrComp->addEventListener(m_xDisposeListener); + + OSL_ENSURE(xServiceMgrComp.is() || xContextComp.is(), + "Provider cannot detect shutdown -> no XComponent found"); + } + } + + //----------------------------------------------------------------------------- + uno::Reference< lang::XComponent > OProvider::releaseContext() { - if (m_xDisposeListener.is() && m_xServiceFactory.is()) + ::osl::MutexGuard aGuard(ServiceComponentImpl::rBHelper.rMutex); + + uno::Reference< lang::XComponent > xContextComp(m_xContext, uno::UNO_QUERY); + if (m_xDisposeListener.is() && m_xContext.is()) { - uno::Reference<com::sun::star::lang::XComponent> xComponent(m_xServiceFactory, uno::UNO_QUERY); - if (xComponent.is()) - xComponent->removeEventListener(m_xDisposeListener); + uno::Reference< lang::XComponent > xServiceMgrComp(m_xContext->getServiceManager(), uno::UNO_QUERY); + + if (xContextComp.is()) + { + try { xContextComp ->removeEventListener(m_xDisposeListener); } + catch (uno::Exception & ) {} + } + + if (xServiceMgrComp.is()) + { + try { xServiceMgrComp->removeEventListener(m_xDisposeListener); } + catch (uno::Exception & ) {} + } } + m_xDisposeListener = NULL; + m_xContext = NULL; + + return xContextComp; } + //----------------------------------------------------------------------------- + void OProvider::discardContext(uno::Reference< lang::XComponent > const & xContext) + { + if (xContext.is()) + { + uno::Reference< uno::XComponentContext > xCC(xContext,uno::UNO_QUERY); + OSL_ASSERT(xCC.is()); + + if (BootstrapContext::isWrapper(xCC)) + { + try { xContext->dispose(); } + catch (uno::Exception & ) {} + } + } + } + //----------------------------------------------------------------------------- // XTypeProvider //----------------------------------------------------------------------------- uno::Sequence< uno::Type > SAL_CALL OProvider::getTypes( ) throw(uno::RuntimeException) @@ -174,7 +231,7 @@ namespace configmgr } //----------------------------------------------------------------------------- - void OProvider::implConnect(OProviderImpl& _rFreshProviderImpl, const ConnectionSettings& _rSettings) throw(uno::Exception) + void OProvider::implConnect(OProviderImpl& _rFreshProviderImpl, const ContextReader& _rSettings) throw(uno::Exception) { if (!_rFreshProviderImpl.initSession(_rSettings)) throw uno::Exception(::rtl::OUString::createFromAscii("Could not connect to the configuration. Please check your settings."), THISREF() ); @@ -182,33 +239,20 @@ namespace configmgr //----------------------------------------------------------------------------- void SAL_CALL OProvider::disposing(com::sun::star::lang::EventObject const& rEvt) throw() - { - { - ::osl::MutexGuard aGuard(ServiceComponentImpl::rBHelper.rMutex); - m_xDisposeListener = NULL; - m_xServiceFactory = NULL; - } - dispose(); + { + releaseContext(); + this->dispose(); } //----------------------------------------------------------------------------- void SAL_CALL OProvider::disposing() { - { - ::osl::MutexGuard aGuard(ServiceComponentImpl::rBHelper.rMutex); - if (m_xDisposeListener.is() && m_xServiceFactory.is()) - { - uno::Reference<com::sun::star::lang::XComponent> xComponent(m_xServiceFactory, uno::UNO_QUERY); - if (xComponent.is()) - xComponent->removeEventListener(m_xDisposeListener); - } - - m_xServiceFactory = NULL; - m_xDisposeListener = NULL; - } + uno::Reference< lang::XComponent > xComp = releaseContext(); ServiceComponentImpl::disposing(); OPropertyContainer::disposing(); + + discardContext( xComp ); } /* // com::sun::star::lang::XUnoTunnel |