summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2011-09-01 13:43:35 +0100
committerAndras Timar <atimar@suse.com>2011-09-07 11:27:13 +0200
commit53714706ae6c8dad65e7dfed124c065fea1e10f9 (patch)
tree28a063866eea954147a2422f4cfac5c85dda6281
parent05e819b26a47089f56c1084302d4afcff3f66de7 (diff)
Resolves: fdo#37195 CreateProcessServiceFactory can't happen before sync
If CreateProcessServiceFactory is called, then common.rdb of "Users/YOU/AppData/Roaming/LibreOffice/3/user/extensions/bundled/registry/ com.sun.star.comp.deployment.component.PackageRegistryBackend/common.rdb" is opened mmapped On a new start of an LibreOffice which wants to synchronize new config over an old config, then it will want do a copy of "install/share/prereg/bundled/registry/ com.sun.star.comp.deployment.component.PackageRegistryBackend/common.rdb" over "Users/YOU/AppData/Roaming/LibreOffice/3/user/extensions/bundled/registry/ com.sun.star.comp.deployment.component.PackageRegistryBackend/common.rdb" which will fail on windows with error 1224, i.e. ERROR_USER_MAPPED_FILE That aborts the copy_bundled_recursive copy, leaving an old config pointing to the old location of dictionaries. So for windows at least, CreateProcessServiceFactory shouldn't happen before copy_bundled_recursive. Signed-off-by: Andras Timar <atimar@suse.com>
-rw-r--r--desktop/inc/app.hxx4
-rw-r--r--desktop/source/app/app.cxx17
-rw-r--r--desktop/source/app/sofficemain.cxx1
3 files changed, 17 insertions, 5 deletions
diff --git a/desktop/inc/app.hxx b/desktop/inc/app.hxx
index 7f9a7efde4..e13283d788 100644
--- a/desktop/inc/app.hxx
+++ b/desktop/inc/app.hxx
@@ -139,11 +139,11 @@ class Desktop : public Application
void SetSplashScreenText( const ::rtl::OUString& rText );
void SetSplashScreenProgress( sal_Int32 );
- void CreateProcessServiceFactory();
+ static void ensureProcessServiceFactory();
private:
// Bootstrap methods
- ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > CreateApplicationServiceManager();
+ static ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > CreateApplicationServiceManager();
void RegisterServices( ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xSMgr );
void DeregisterServices();
diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index 873588d757..1a8fb2fc02 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -322,7 +322,10 @@ CommandLineArgs* Desktop::GetCommandLineArgs()
{
::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
if ( !pArgs )
+ {
+ ensureProcessServiceFactory();
pArgs = new CommandLineArgs;
+ }
}
return pArgs;
@@ -711,8 +714,15 @@ void Desktop::Init()
copy_bundled_recursive( aPreregBundledPath, aUserPath, +1 );
}
}
-
+
// We need to have service factory before going further.
+ // We need to have service factory before going further, but see fdo#37195.
+ // Doing this will mmap common.rdb, making it not overwritable on windows,
+ // so this can't happen before the synchronization above. Lets rework this
+ // so that the above is called *from* ensureProcessServiceFactory or
+ // something to enforce this gotcha
+ ensureProcessServiceFactory();
+
if( !::comphelper::getProcessServiceFactory().is())
{
OSL_FAIL("Service factory should have been crated in soffice_main().");
@@ -764,8 +774,11 @@ void Desktop::InitFinished()
// GetCommandLineArgs() requires this code to work, otherwise it will abort, and
// on Unix command line args needs to be checked before Desktop::Init()
-void Desktop::CreateProcessServiceFactory()
+void Desktop::ensureProcessServiceFactory()
{
+ if( ::comphelper::getProcessServiceFactory().is())
+ return;
+
Reference < XMultiServiceFactory > rSMgr = CreateApplicationServiceManager();
if( rSMgr.is() )
{
diff --git a/desktop/source/app/sofficemain.cxx b/desktop/source/app/sofficemain.cxx
index 1e640c58ae..214fcdfdc2 100644
--- a/desktop/source/app/sofficemain.cxx
+++ b/desktop/source/app/sofficemain.cxx
@@ -49,7 +49,6 @@ extern "C" int soffice_main()
desktop::Desktop aDesktop;
// This string is used during initialization of the Gtk+ VCL module
aDesktop.SetAppName( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("soffice")) );
- aDesktop.CreateProcessServiceFactory();
#ifdef UNX
// handle --version and --help already here, otherwise they would be handled
// after VCL initialization that might fail if $DISPLAY is not set