Re-work cppu::preInitBootstrap()

In the preinit stage, the preInitBootstrap is called to load
implementations for each service registered by the service manager.

All service requests are: initial Component Context and the process
service factory is set.

However, some services require that VCL is properly initialized.

Change-Id: Ib116e3da172b860f2df4d672f6181b5de0b7e6b2
This commit is contained in:
Henry Castro 2015-09-07 17:17:22 -04:00 committed by Tor Lillqvist
parent 6b41b89cc5
commit 8d7f29a933
4 changed files with 28 additions and 13 deletions

View File

@ -109,18 +109,25 @@ cppu::defaultBootstrap_InitialComponentContext()
}
void
cppu::preInitBootstrap()
cppu::preInitBootstrap(css::uno::Reference< css::uno::XComponentContext > const & xContext)
{
rtl::OUString iniUri(getUnoIniUri());
rtl::Bootstrap bs(iniUri);
if (bs.getHandle() == nullptr)
throw css::uno::DeploymentException("Cannot open uno ini " + iniUri);
if (!xContext.is())
throw css::uno::DeploymentException("preInit: XComponentContext is not created");
// create the service manager
rtl::Reference< cppuhelper::ServiceManager > aManager(new cppuhelper::ServiceManager);
// read rdb files
aManager->init(getBootstrapVariable(bs, "UNO_SERVICES"));
aManager->loadAllImplementations();
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: */

View File

@ -439,5 +439,5 @@ GLIBCXX_3.4 {
PRIVATE_1.0 { # LibO 5.2
global:
_ZN4cppu16preInitBootstrapEv;
_ZN4cppu16preInitBootstrapERKN3com3sun4star3uno9ReferenceINS3_17XComponentContextEEE;
};

View File

@ -1914,7 +1914,7 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char
{
InitVCL();
// pre-load all component libraries.
cppu::preInitBootstrap();
cppu::preInitBootstrap(xContext);
// Release Solar Mutex, lo_startmain thread should acquire it.
Application::ReleaseSolarMutex();
}

View File

@ -17,8 +17,16 @@ namespace cppu
#if defined LIBO_INTERNAL_ONLY
/** Preload all shared library components with service manager upon
information from bootstrap variables.
This function tries to find its parameters via these bootstrap variables:
- UNO_SERVICES -- a space separated list of file urls of service rdbs
*/
CPPUHELPER_DLLPUBLIC void SAL_CALL
preInitBootstrap();
preInitBootstrap(css::uno::Reference< css::uno::XComponentContext > const & xContext);
#endif // LIBO_INTERNAL_ONLY