summaryrefslogtreecommitdiff
path: root/cppuhelper
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2016-02-25 15:33:22 +0100
committerTor Lillqvist <tml@collabora.com>2016-02-26 12:37:04 +0000
commit79c11bb56ecf9f99250387ee59559f7472028f05 (patch)
treeb086c549f676d7c8d987d31025ccdbcdddfe20a8 /cppuhelper
parentd0b09f41efe938e94a84e783c9ff5742edcbfba8 (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.cxx23
-rw-r--r--cppuhelper/source/gcc3.map5
-rw-r--r--cppuhelper/source/servicemanager.cxx239
-rw-r--r--cppuhelper/source/servicemanager.hxx17
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_;
};