diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2016-02-25 15:33:22 +0100 |
---|---|---|
committer | Tor Lillqvist <tml@collabora.com> | 2016-02-26 12:37:04 +0000 |
commit | 79c11bb56ecf9f99250387ee59559f7472028f05 (patch) | |
tree | b086c549f676d7c8d987d31025ccdbcdddfe20a8 /cppuhelper | |
parent | d0b09f41efe938e94a84e783c9ff5742edcbfba8 (diff) |
Use an XInitialization-based channel to request service mgr pre-init
...instead of private cppu::preInitBootstrap function
Change-Id: Id0e6fcf721b697c993e5acffaf7836452cfa9750
Reviewed-on: https://gerrit.libreoffice.org/22699
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Tor Lillqvist <tml@collabora.com>
Tested-by: Tor Lillqvist <tml@collabora.com>
Diffstat (limited to 'cppuhelper')
-rw-r--r-- | cppuhelper/source/defaultbootstrap.cxx | 23 | ||||
-rw-r--r-- | cppuhelper/source/gcc3.map | 5 | ||||
-rw-r--r-- | cppuhelper/source/servicemanager.cxx | 239 | ||||
-rw-r--r-- | cppuhelper/source/servicemanager.hxx | 17 |
4 files changed, 139 insertions, 145 deletions
diff --git a/cppuhelper/source/defaultbootstrap.cxx b/cppuhelper/source/defaultbootstrap.cxx index 9ff68e1cbae2..bede6b518af0 100644 --- a/cppuhelper/source/defaultbootstrap.cxx +++ b/cppuhelper/source/defaultbootstrap.cxx @@ -18,7 +18,6 @@ #include <com/sun/star/uno/XComponentContext.hpp> #include <com/sun/star/lang/XSingleComponentFactory.hpp> #include <cppuhelper/bootstrap.hxx> -#include <cppuhelper/detail/preinit.hxx> #include <cppuhelper/component_context.hxx> #include <rtl/bootstrap.hxx> #include <rtl/ref.hxx> @@ -108,26 +107,4 @@ cppu::defaultBootstrap_InitialComponentContext() return defaultBootstrap_InitialComponentContext(getUnoIniUri()); } -void -cppu::preInitBootstrap(css::uno::Reference< css::uno::XComponentContext > const & xContext) -{ - if (!xContext.is()) - throw css::uno::DeploymentException("preInit: XComponentContext is not created"); - - css::uno::Reference< css::uno::XInterface > xService; - xContext->getValueByName("/singletons/com.sun.star.lang.theServiceManager") >>= xService; - if (!xService.is()) - throw css::uno::DeploymentException("preInit: XMultiComponentFactory is not created"); - - rtl::Reference<cppuhelper::ServiceManager> aService(reinterpret_cast<cppuhelper::ServiceManager*>(xService.get())); - - // pre-requisites: - // In order to load implementations and invoke - // component factory it is required: - // 1) defaultBootstrap_InitialComponentContext() - // 2) comphelper::setProcessServiceFactory(xSFactory); - // 3) InitVCL() - aService->loadAllImplementations(); -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/cppuhelper/source/gcc3.map b/cppuhelper/source/gcc3.map index 658b3ca2b981..12c29834ab16 100644 --- a/cppuhelper/source/gcc3.map +++ b/cppuhelper/source/gcc3.map @@ -436,8 +436,3 @@ GLIBCXX_3.4 { _ZGVNSt7num_put*; _ZNSt7num_put*; _ZNSs4_Rep20_S_empty_rep_storageE; }; - -PRIVATE_1.0 { # LibO 5.2 - global: - _ZN4cppu16preInitBootstrapERKN3com3sun4star3uno9ReferenceINS3_17XComponentContextEEE; -}; diff --git a/cppuhelper/source/servicemanager.cxx b/cppuhelper/source/servicemanager.cxx index 0f709ef9190c..2c29bb62fffb 100644 --- a/cppuhelper/source/servicemanager.cxx +++ b/cppuhelper/source/servicemanager.cxx @@ -878,118 +878,6 @@ void cppuhelper::ServiceManager::loadImplementation( } } -void cppuhelper::ServiceManager::loadAllImplementations() -{ -#ifdef DISABLE_DYNLOADING - abort(); -#else - rtl::OUString aUri; - osl::MutexGuard g(rBHelper.rMutex); - css::uno::Environment aSourceEnv(css::uno::Environment::getCurrent()); - - // loop all implementations - for (Data::NamedImplementations::const_iterator iterator( - data_.namedImplementations.begin()); - iterator != data_.namedImplementations.end(); ++iterator) - { - try - { - // expand absolute URI implementation component library - aUri = cppu::bootstrap_expandUri(iterator->second->info->uri); - } - catch (css::lang::IllegalArgumentException& aError) - { - throw css::uno::DeploymentException( - "Cannot expand URI" + iterator->second->info->uri + ": " + aError.Message, - static_cast< cppu::OWeakObject * >(this)); - } - - if (iterator->second->info->loader == "com.sun.star.loader.SharedLibrary" && - iterator->second->status != Data::Implementation::STATUS_LOADED) - { - // load component library - osl::Module aModule(aUri, SAL_LOADMODULE_NOW | SAL_LOADMODULE_GLOBAL); - SAL_INFO("lok", "loaded component library " << aUri << ( aModule.is() ? " ok" : " no")); - - if (aModule.is() && - !iterator->second->info->environment.isEmpty()) - { - OUString aSymFactory; - oslGenericFunction fpFactory; - css::uno::Environment aTargetEnv; - css::uno::Reference<css::uno::XInterface> xFactory; - - if(iterator->second->info->constructor.isEmpty()) - { - // expand full name component factory symbol - if (iterator->second->info->prefix == "direct") - aSymFactory = iterator->second->info->name.replace('.', '_') + "_" COMPONENT_GETFACTORY; - else if (!iterator->second->info->prefix.isEmpty()) - aSymFactory = iterator->second->info->prefix + "_" COMPONENT_GETFACTORY; - else - aSymFactory = COMPONENT_GETFACTORY; - - // get function symbol component factory - fpFactory = aModule.getFunctionSymbol(aSymFactory); - if (fpFactory == nullptr) - { - throw css::loader::CannotActivateFactoryException( - ("no factory symbol \"" + aSymFactory + "\" in component library :" + aUri), - css::uno::Reference<css::uno::XInterface>()); - } - - aTargetEnv = cppuhelper::detail::getEnvironment(iterator->second->info->environment, iterator->second->info->name); - component_getFactoryFunc fpComponentFactory = reinterpret_cast<component_getFactoryFunc>(fpFactory); - - if (aSourceEnv.get() == aTargetEnv.get()) - { - // invoke function component factory - OString aImpl(rtl::OUStringToOString(iterator->second->info->name, RTL_TEXTENCODING_ASCII_US)); - xFactory.set(css::uno::Reference<css::uno::XInterface>(static_cast<css::uno::XInterface *>( - (*fpComponentFactory)(aImpl.getStr(), this, nullptr)), SAL_NO_ACQUIRE)); - } - } - else - { - // get function symbol component factory - fpFactory = aModule.getFunctionSymbol(iterator->second->info->constructor); - } - - css::uno::Reference<css::lang::XSingleComponentFactory> xSCFactory; - css::uno::Reference<css::lang::XSingleServiceFactory> xSSFactory; - - // query interface XSingleComponentFactory or XSingleServiceFactory - if (xFactory.is()) - { - xSCFactory.set(xFactory, css::uno::UNO_QUERY); - if (!xSCFactory.is()) - { - xSSFactory.set(xFactory, css::uno::UNO_QUERY); - if (!xSSFactory.is()) - { - throw css::uno::DeploymentException( - ("Implementation " + iterator->second->info->name - + " does not provide a constructor or factory"), - static_cast< cppu::OWeakObject * >(this)); - } - } - } - - if (!iterator->second->info->constructor.isEmpty() && fpFactory) - iterator->second->constructor = reinterpret_cast<ImplementationConstructorFn *>(fpFactory); - - iterator->second->factory1 = xSCFactory; - iterator->second->factory2 = xSSFactory; - iterator->second->status = Data::Implementation::STATUS_LOADED; - - } - // leak aModule - aModule.release(); - } - } -#endif -} - void cppuhelper::ServiceManager::disposing() { std::vector< css::uno::Reference<css::lang::XComponent> > sngls; std::vector< css::uno::Reference< css::lang::XComponent > > comps; @@ -1051,6 +939,22 @@ void cppuhelper::ServiceManager::disposing() { } } +void cppuhelper::ServiceManager::initialize( + css::uno::Sequence<css::uno::Any> const & aArguments) + throw (css::uno::Exception, css::uno::RuntimeException, std::exception) +{ + OUString arg; + if (aArguments.getLength() == 1 && (aArguments[0] >>= arg) + && arg == "preload") + { + preloadImplementations(); + } else { + throw css::lang::IllegalArgumentException( + "invalid ServiceManager::initialize argument", + css::uno::Reference<css::uno::XInterface>(), 0); + } +} + rtl::OUString cppuhelper::ServiceManager::getImplementationName() throw (css::uno::RuntimeException, std::exception) { @@ -1989,4 +1893,115 @@ cppuhelper::ServiceManager::findServiceImplementation( return impl; } +void cppuhelper::ServiceManager::preloadImplementations() { +#ifdef DISABLE_DYNLOADING + abort(); +#else + rtl::OUString aUri; + osl::MutexGuard g(rBHelper.rMutex); + css::uno::Environment aSourceEnv(css::uno::Environment::getCurrent()); + + // loop all implementations + for (Data::NamedImplementations::const_iterator iterator( + data_.namedImplementations.begin()); + iterator != data_.namedImplementations.end(); ++iterator) + { + try + { + // expand absolute URI implementation component library + aUri = cppu::bootstrap_expandUri(iterator->second->info->uri); + } + catch (css::lang::IllegalArgumentException& aError) + { + throw css::uno::DeploymentException( + "Cannot expand URI" + iterator->second->info->uri + ": " + aError.Message, + static_cast< cppu::OWeakObject * >(this)); + } + + if (iterator->second->info->loader == "com.sun.star.loader.SharedLibrary" && + iterator->second->status != Data::Implementation::STATUS_LOADED) + { + // load component library + osl::Module aModule(aUri, SAL_LOADMODULE_NOW | SAL_LOADMODULE_GLOBAL); + SAL_INFO("lok", "loaded component library " << aUri << ( aModule.is() ? " ok" : " no")); + + if (aModule.is() && + !iterator->second->info->environment.isEmpty()) + { + OUString aSymFactory; + oslGenericFunction fpFactory; + css::uno::Environment aTargetEnv; + css::uno::Reference<css::uno::XInterface> xFactory; + + if(iterator->second->info->constructor.isEmpty()) + { + // expand full name component factory symbol + if (iterator->second->info->prefix == "direct") + aSymFactory = iterator->second->info->name.replace('.', '_') + "_" COMPONENT_GETFACTORY; + else if (!iterator->second->info->prefix.isEmpty()) + aSymFactory = iterator->second->info->prefix + "_" COMPONENT_GETFACTORY; + else + aSymFactory = COMPONENT_GETFACTORY; + + // get function symbol component factory + fpFactory = aModule.getFunctionSymbol(aSymFactory); + if (fpFactory == nullptr) + { + throw css::loader::CannotActivateFactoryException( + ("no factory symbol \"" + aSymFactory + "\" in component library :" + aUri), + css::uno::Reference<css::uno::XInterface>()); + } + + aTargetEnv = cppuhelper::detail::getEnvironment(iterator->second->info->environment, iterator->second->info->name); + component_getFactoryFunc fpComponentFactory = reinterpret_cast<component_getFactoryFunc>(fpFactory); + + if (aSourceEnv.get() == aTargetEnv.get()) + { + // invoke function component factory + OString aImpl(rtl::OUStringToOString(iterator->second->info->name, RTL_TEXTENCODING_ASCII_US)); + xFactory.set(css::uno::Reference<css::uno::XInterface>(static_cast<css::uno::XInterface *>( + (*fpComponentFactory)(aImpl.getStr(), this, nullptr)), SAL_NO_ACQUIRE)); + } + } + else + { + // get function symbol component factory + fpFactory = aModule.getFunctionSymbol(iterator->second->info->constructor); + } + + css::uno::Reference<css::lang::XSingleComponentFactory> xSCFactory; + css::uno::Reference<css::lang::XSingleServiceFactory> xSSFactory; + + // query interface XSingleComponentFactory or XSingleServiceFactory + if (xFactory.is()) + { + xSCFactory.set(xFactory, css::uno::UNO_QUERY); + if (!xSCFactory.is()) + { + xSSFactory.set(xFactory, css::uno::UNO_QUERY); + if (!xSSFactory.is()) + { + throw css::uno::DeploymentException( + ("Implementation " + iterator->second->info->name + + " does not provide a constructor or factory"), + static_cast< cppu::OWeakObject * >(this)); + } + } + } + + if (!iterator->second->info->constructor.isEmpty() && fpFactory) + iterator->second->constructor = reinterpret_cast<ImplementationConstructorFn *>(fpFactory); + + iterator->second->factory1 = xSCFactory; + iterator->second->factory2 = xSSFactory; + iterator->second->status = Data::Implementation::STATUS_LOADED; + + } + // leak aModule + aModule.release(); + } + } +#endif +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/cppuhelper/source/servicemanager.hxx b/cppuhelper/source/servicemanager.hxx index 7e8f4e66e7e6..9a01006e8f27 100644 --- a/cppuhelper/source/servicemanager.hxx +++ b/cppuhelper/source/servicemanager.hxx @@ -23,6 +23,7 @@ #include <com/sun/star/container/XContentEnumerationAccess.hpp> #include <com/sun/star/container/XSet.hpp> #include <com/sun/star/lang/XEventListener.hpp> +#include <com/sun/star/lang/XInitialization.hpp> #include <com/sun/star/lang/XMultiComponentFactory.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> @@ -30,7 +31,7 @@ #include <com/sun/star/uno/XComponentContext.hpp> #include <com/sun/star/uno/Reference.hxx> #include <cppuhelper/basemutex.hxx> -#include <cppuhelper/compbase8.hxx> +#include <cppuhelper/compbase.hxx> #include <osl/mutex.hxx> #include <registry/registry.hxx> #include <rtl/ustring.hxx> @@ -50,11 +51,12 @@ typedef css::uno::XInterface * SAL_CALL ImplementationConstructorFn( } -typedef cppu::WeakComponentImplHelper8< +typedef cppu::WeakComponentImplHelper< css::lang::XServiceInfo, css::lang::XMultiServiceFactory, css::lang::XMultiComponentFactory, css::container::XSet, css::container::XContentEnumerationAccess, css::beans::XPropertySet, - css::beans::XPropertySetInfo, css::lang::XEventListener > + css::beans::XPropertySetInfo, css::lang::XEventListener, + css::lang::XInitialization> ServiceManagerBase; class ServiceManager: @@ -203,8 +205,6 @@ public: css::uno::Reference< css::uno::XComponentContext > const & context, std::shared_ptr< Data::Implementation > & implementation); - void loadAllImplementations(); - private: virtual ~ServiceManager(); @@ -333,6 +333,11 @@ private: virtual void SAL_CALL disposing(css::lang::EventObject const & Source) throw (css::uno::RuntimeException, std::exception) override; + virtual void SAL_CALL initialize( + css::uno::Sequence<css::uno::Any> const & aArguments) + throw (css::uno::Exception, css::uno::RuntimeException, std::exception) + override; + // needs to be called with rBHelper.rMutex locked: bool isDisposed() { return rBHelper.bDisposed || rBHelper.bInDispose; } @@ -377,6 +382,8 @@ private: css::uno::Reference< css::uno::XComponentContext > const & context, rtl::OUString const & specifier); + void preloadImplementations(); + css::uno::Reference< css::uno::XComponentContext > context_; Data data_; }; |