diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2012-04-19 15:00:34 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2012-04-19 15:13:47 +0200 |
commit | 61d78aca81f08ac3a0f9eb65799d04d56fbad312 (patch) | |
tree | 179434516a3d3afb080eed80b14fc613ba70a42e /stoc | |
parent | 4707ee3212f410c3576dc663151aef5d01a123fc (diff) |
Allow OServiceManagerWrapper to wrap all service manager implementations
...not just OServiceManager. (This is a prerequisite to replace the
defaultBootstrap_initialComponentContext() implementation with a more performant
component context/service manager combo.)
The only reason for the restriction to OServiceManager apparently was the
additional createContentEnumeration overload with an XComponentContext
parameter. It /looks/ to me like this is not really necessary, that it should
always be OK to instantiate implementation factories with this service manager
and its component context, instead of a component context (and its default
service manager) passed into a method call. This would mean that the code could
be simplified further, needing a component context passed into a method only to
pass along to a new instance created via
createInstanceWith[ArgumentsAnd]Context, but then again I'm not 100% sure and
better leave it at that...
This also means that XUnoTunnel is gone from OServiceManager and XInitialization
is gone from OServiceManagerWrapper.
Diffstat (limited to 'stoc')
-rw-r--r-- | stoc/source/servicemanager/servicemanager.cxx | 155 |
1 files changed, 40 insertions, 115 deletions
diff --git a/stoc/source/servicemanager/servicemanager.cxx b/stoc/source/servicemanager/servicemanager.cxx index 8cc4fbac3d61..55ee0d9e4ef2 100644 --- a/stoc/source/servicemanager/servicemanager.cxx +++ b/stoc/source/servicemanager/servicemanager.cxx @@ -40,15 +40,14 @@ #include <cppuhelper/component.hxx> #include <cppuhelper/factory.hxx> #include <cppuhelper/implbase1.hxx> -#include <cppuhelper/typeprovider.hxx> #include <cppuhelper/implementationentry.hxx> #include <rtl/unload.h> #include <cppuhelper/component_context.hxx> #include <cppuhelper/bootstrap.hxx> -#include <cppuhelper/compbase8.hxx> +#include <cppuhelper/compbase6.hxx> +#include <cppuhelper/compbase7.hxx> -#include <com/sun/star/lang/XUnoTunnel.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/lang/XMultiComponentFactory.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> @@ -136,21 +135,6 @@ OUString regsmgr_getImplementationName() namespace stoc_smgr { -static Sequence< sal_Int8 > smgr_getImplementationId() -{ - static OImplementationId * s_pId = 0; - if (! s_pId) - { - MutexGuard aGuard( Mutex::getGlobalMutex() ); - if (! s_pId) - { - static OImplementationId s_aId; - s_pId = &s_aId; - } - } - return s_pId->getImplementationId(); -} - static Sequence< OUString > retrieveAsciiValueList( const Reference< XSimpleRegistry > &xReg, const OUString &keyName ) @@ -466,9 +450,9 @@ struct OServiceManagerMutex extern "C" void SAL_CALL smgrUnloadingListener(void* id); -typedef WeakComponentImplHelper8< +typedef WeakComponentImplHelper7< lang::XMultiServiceFactory, lang::XMultiComponentFactory, lang::XServiceInfo, - lang::XInitialization, lang::XUnoTunnel, + lang::XInitialization, container::XSet, container::XContentEnumerationAccess, beans::XPropertySet > t_OServiceManager_impl; @@ -482,10 +466,6 @@ public: OServiceManager( Reference< XComponentContext > const & xContext ); virtual ~OServiceManager(); - // XUnoTunnel - sal_Int64 SAL_CALL getSomething( Sequence< sal_Int8 > const & id ) - throw (RuntimeException); - // XInitialization void SAL_CALL initialize( Sequence< Any > const & args ) throw (Exception); @@ -533,9 +513,6 @@ public: // XContentEnumerationAccess //Sequence< OUString > getAvailableServiceNames() throw( (Exception) ); virtual Reference<XEnumeration > SAL_CALL createContentEnumeration(const OUString& aServiceName) throw(::com::sun::star::uno::RuntimeException); - virtual Reference<XEnumeration > SAL_CALL createContentEnumeration( - const OUString& aServiceName, Reference< XComponentContext > const & xContext ) - throw(::com::sun::star::uno::RuntimeException); // XComponent virtual void SAL_CALL dispose() throw(::com::sun::star::uno::RuntimeException); @@ -616,13 +593,18 @@ inline void OServiceManager::check_undisposed() const //################################################################################################## //################################################################################################## -class OServiceManagerWrapper : public OServiceManagerMutex, public t_OServiceManager_impl +typedef WeakComponentImplHelper6< + lang::XMultiServiceFactory, lang::XMultiComponentFactory, lang::XServiceInfo, + container::XSet, container::XContentEnumerationAccess, + beans::XPropertySet > t_OServiceManagerWrapper_impl; + +class OServiceManagerWrapper : public OServiceManagerMutex, public t_OServiceManagerWrapper_impl { Reference< XComponentContext > m_xContext; - OServiceManager * m_root; - inline OServiceManager * getRoot() SAL_THROW( (RuntimeException) ) + Reference< XMultiComponentFactory > m_root; + inline Reference< XMultiComponentFactory > getRoot() SAL_THROW( (RuntimeException) ) { - if (! m_root) + if (! m_root.is()) { throw lang::DisposedException( OUSTR("service manager instance has already been disposed!"), @@ -640,21 +622,13 @@ public: SAL_THROW( (RuntimeException) ); virtual ~OServiceManagerWrapper() SAL_THROW(()); - // XUnoTunnel - sal_Int64 SAL_CALL getSomething( Sequence< sal_Int8 > const & id ) throw (RuntimeException) - { return getRoot()->getSomething( id ); } - - // XInitialization - void SAL_CALL initialize( Sequence< Any > const & args ) throw (Exception) - { getRoot()->initialize( args ); } - // XServiceInfo virtual OUString SAL_CALL getImplementationName() throw (RuntimeException) - { return getRoot()->getImplementationName(); } + { return Reference< XServiceInfo >(getRoot(), UNO_QUERY_THROW)->getImplementationName(); } virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw (RuntimeException) - { return getRoot()->supportsService( ServiceName ); } + { return Reference< XServiceInfo >(getRoot(), UNO_QUERY_THROW)->supportsService( ServiceName ); } virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw (RuntimeException) - { return getRoot()->getSupportedServiceNames(); } + { return Reference< XServiceInfo >(getRoot(), UNO_QUERY_THROW)->getSupportedServiceNames(); } // XMultiComponentFactory virtual Reference< XInterface > SAL_CALL createInstanceWithContext( @@ -680,30 +654,30 @@ public: // XElementAccess virtual Type SAL_CALL getElementType() throw (RuntimeException) - { return getRoot()->getElementType(); } + { return Reference< XElementAccess >(getRoot(), UNO_QUERY_THROW)->getElementType(); } virtual sal_Bool SAL_CALL hasElements() throw (RuntimeException) - { return getRoot()->hasElements(); } + { return Reference< XElementAccess >(getRoot(), UNO_QUERY_THROW)->hasElements(); } // XEnumerationAccess virtual Reference<XEnumeration > SAL_CALL createEnumeration() throw (RuntimeException) - { return getRoot()->createEnumeration(); } + { return Reference< XEnumerationAccess >(getRoot(), UNO_QUERY_THROW)->createEnumeration(); } // XSet virtual sal_Bool SAL_CALL has( const Any & Element ) throw (RuntimeException) - { return getRoot()->has( Element ); } + { return Reference< XSet >(getRoot(), UNO_QUERY_THROW)->has( Element ); } virtual void SAL_CALL insert( const Any & Element ) throw (lang::IllegalArgumentException, container::ElementExistException, RuntimeException) - { getRoot()->insert( Element ); } + { Reference< XSet >(getRoot(), UNO_QUERY_THROW)->insert( Element ); } virtual void SAL_CALL remove( const Any & Element ) throw (lang::IllegalArgumentException, container::NoSuchElementException, RuntimeException) - { getRoot()->remove( Element ); } + { Reference< XSet >(getRoot(), UNO_QUERY_THROW)->remove( Element ); } // XContentEnumerationAccess //Sequence< OUString > getAvailableServiceNames() throw( (Exception) ); virtual Reference<XEnumeration > SAL_CALL createContentEnumeration(const OUString& aServiceName) throw (RuntimeException) - { return getRoot()->createContentEnumeration( aServiceName, m_xContext ); } + { return Reference< XContentEnumerationAccess >(getRoot(), UNO_QUERY_THROW)->createContentEnumeration( aServiceName ); } // XPropertySet Reference<XPropertySetInfo > SAL_CALL getPropertySetInfo() throw (RuntimeException) - { return getRoot()->getPropertySetInfo(); } + { return Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->getPropertySetInfo(); } void SAL_CALL setPropertyValue(const OUString& PropertyName, const Any& aValue) throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, RuntimeException); @@ -712,16 +686,16 @@ public: void SAL_CALL addPropertyChangeListener(const OUString& PropertyName, const Reference<XPropertyChangeListener >& aListener) throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException) - { getRoot()->addPropertyChangeListener( PropertyName, aListener ); } + { Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->addPropertyChangeListener( PropertyName, aListener ); } void SAL_CALL removePropertyChangeListener(const OUString& PropertyName, const Reference<XPropertyChangeListener >& aListener) throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException) - { getRoot()->removePropertyChangeListener( PropertyName, aListener ); } + { Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->removePropertyChangeListener( PropertyName, aListener ); } void SAL_CALL addVetoableChangeListener(const OUString& PropertyName, const Reference<XVetoableChangeListener >& aListener) throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException) - { getRoot()->addVetoableChangeListener( PropertyName, aListener ); } + { Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->addVetoableChangeListener( PropertyName, aListener ); } void SAL_CALL removeVetoableChangeListener(const OUString& PropertyName, const Reference<XVetoableChangeListener >& aListener) throw (beans::UnknownPropertyException, lang::WrappedTargetException, RuntimeException) - { getRoot()->removeVetoableChangeListener( PropertyName, aListener ); } + { Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->removeVetoableChangeListener( PropertyName, aListener ); } }; //__________________________________________________________________________________________________ void SAL_CALL OServiceManagerWrapper::setPropertyValue( @@ -746,7 +720,7 @@ void SAL_CALL OServiceManagerWrapper::setPropertyValue( } else { - getRoot()->setPropertyValue( PropertyName, aValue ); + Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->setPropertyValue( PropertyName, aValue ); } } //__________________________________________________________________________________________________ @@ -764,7 +738,7 @@ Any SAL_CALL OServiceManagerWrapper::getPropertyValue( } else { - return getRoot()->getPropertyValue( PropertyName ); + return Reference< XPropertySet >(getRoot(), UNO_QUERY_THROW)->getPropertyValue( PropertyName ); } } //__________________________________________________________________________________________________ @@ -772,51 +746,28 @@ void OServiceManagerWrapper::disposing() { m_xContext.clear(); - if (m_root) - { // no m_root->dispose(), because every context disposes its service manager... - m_root->release(); - m_root = 0; - } + m_root.clear(); } //__________________________________________________________________________________________________ OServiceManagerWrapper::~OServiceManagerWrapper() SAL_THROW(()) { - if (m_root) - { - m_root->release(); - m_root = 0; - } - g_moduleCount.modCnt.release( &g_moduleCount.modCnt ); } //__________________________________________________________________________________________________ OServiceManagerWrapper::OServiceManagerWrapper( Reference< XComponentContext > const & xContext ) SAL_THROW( (RuntimeException) ) - : t_OServiceManager_impl( m_mutex ) + : t_OServiceManagerWrapper_impl( m_mutex ) , m_xContext( xContext ) - , m_root( 0 ) + , m_root( xContext->getServiceManager() ) { g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt ); - Reference< XUnoTunnel > xTunnel( m_xContext->getServiceManager(), UNO_QUERY ); - OSL_ASSERT( xTunnel.is() ); - if (xTunnel.is()) - { - m_root = reinterpret_cast< OServiceManager * >( - xTunnel->getSomething( smgr_getImplementationId() ) ); - OSL_ASSERT( m_root ); - if (m_root) - { - m_root->acquire(); - } - } - - if (! m_root) + if (! m_root.is()) { throw RuntimeException( - OUString( RTL_CONSTASCII_USTRINGPARAM("can only wrap OServiceManager instances!") ), + OUString( RTL_CONSTASCII_USTRINGPARAM("no service manager to wrap") ), Reference< XInterface >() ); } } @@ -825,17 +776,6 @@ OServiceManagerWrapper::OServiceManagerWrapper( //################################################################################################## //################################################################################################## -// XUnoTunnel -sal_Int64 OServiceManager::getSomething( Sequence< sal_Int8 > const & id ) - throw (RuntimeException) -{ - check_undisposed(); - if (id == smgr_getImplementationId()) - return reinterpret_cast< sal_Int64 >(this); - else - return 0; -} - /** * Create a ServiceManager */ @@ -1389,23 +1329,17 @@ Sequence< Reference< XInterface > > OServiceManager::queryServiceFactories( // XContentEnumerationAccess Reference<XEnumeration > OServiceManager::createContentEnumeration( - const OUString& aServiceName, Reference< XComponentContext > const & xContext ) + const OUString& aServiceName ) throw(::com::sun::star::uno::RuntimeException) { check_undisposed(); Sequence< Reference< XInterface > > factories( - OServiceManager::queryServiceFactories( aServiceName, xContext ) ); + OServiceManager::queryServiceFactories( aServiceName, m_xContext ) ); if (factories.getLength()) return new ServiceEnumeration_Impl( factories ); else return Reference< XEnumeration >(); } -Reference<XEnumeration > OServiceManager::createContentEnumeration( - const OUString& aServiceName ) - throw(::com::sun::star::uno::RuntimeException) -{ - return createContentEnumeration( aServiceName, m_xContext ); -} // XEnumeration Reference<XEnumeration > OServiceManager::createEnumeration() throw(::com::sun::star::uno::RuntimeException) @@ -1625,9 +1559,6 @@ public: // XContentEnumerationAccess //Sequence< OUString > getAvailableServiceNames() throw( (Exception) ); Reference<XEnumeration > SAL_CALL createContentEnumeration(const OUString& aServiceName) throw(::com::sun::star::uno::RuntimeException); - virtual Reference<XEnumeration > SAL_CALL createContentEnumeration( - const OUString& aServiceName, Reference< XComponentContext > const & xContext ) - throw(::com::sun::star::uno::RuntimeException); // XComponent void SAL_CALL dispose() throw(::com::sun::star::uno::RuntimeException); @@ -1883,7 +1814,7 @@ Sequence< Reference< XInterface > > ORegistryServiceManager::queryServiceFactori // XContentEnumerationAccess Reference<XEnumeration > ORegistryServiceManager::createContentEnumeration( - const OUString& aServiceName, Reference< XComponentContext > const & xContext ) + const OUString& aServiceName ) throw(::com::sun::star::uno::RuntimeException) { check_undisposed(); @@ -1898,17 +1829,11 @@ Reference<XEnumeration > ORegistryServiceManager::createContentEnumeration( aImplName = aImpls.getConstArray()[i]; if ( !haveFactoryWithThisImplementation(aImplName) ) { - loadWithImplementationName( aImplName, xContext ); + loadWithImplementationName( aImplName, m_xContext ); } } // call the superclass to enumerate all contents - return OServiceManager::createContentEnumeration( aServiceName, xContext ); -} -Reference<XEnumeration > ORegistryServiceManager::createContentEnumeration( - const OUString& aServiceName ) - throw(::com::sun::star::uno::RuntimeException) -{ - return createContentEnumeration( aServiceName, m_xContext ); + return OServiceManager::createContentEnumeration( aServiceName ); } // OServiceManager |