diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2013-02-05 13:03:31 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2013-02-05 13:08:22 +0100 |
commit | 2a31dd4025eff8d09ab207f31bacc0a5b8c36bd9 (patch) | |
tree | 253b26f3afdf28fb9b4917b25721e33487fa826e | |
parent | 3c71fa1e5ee6cd83f713c65a372006bc3aef0953 (diff) |
Cleanly remove components from rdb again that fail during live insertion
Such failure happens e.g. for components that bring along duplicate UNO
implementation names, and if they ever got added to an rdb, LO would afterwards
refuse to start forever.
Change-Id: Ia62ac496547a45f5a72fdc81543f15a417c09687
-rw-r--r-- | desktop/source/deployment/registry/component/dp_component.cxx | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/desktop/source/deployment/registry/component/dp_component.cxx b/desktop/source/deployment/registry/component/dp_component.cxx index 42a09cbc7fe4..0704e9243327 100644 --- a/desktop/source/deployment/registry/component/dp_component.cxx +++ b/desktop/source/deployment/registry/component/dp_component.cxx @@ -1409,12 +1409,13 @@ void BackendImpl::ComponentPackageImpl::processPackage_( css::uno::UNO_QUERY_THROW); } } - css::uno::Reference< css::registry::XImplementationRegistration>( + css::uno::Reference< css::registry::XImplementationRegistration> impreg( context->getServiceManager()->createInstanceWithContext( "com.sun.star.registry.ImplementationRegistration", context), - css::uno::UNO_QUERY_THROW)->registerImplementation( - m_loader, url, getRDB()); + css::uno::UNO_QUERY_THROW); + css::uno::Reference< css::registry::XSimpleRegistry > rdb(getRDB()); + impreg->registerImplementation(m_loader, url, rdb); // Only write to unorc after successful registration; it may fail if // there is no suitable java if (m_loader == "com.sun.star.loader.Java2" && !jarManifestHeaderPresent(url, "UNO-Type-Path", xCmdEnv)) @@ -1425,7 +1426,20 @@ void BackendImpl::ComponentPackageImpl::processPackage_( std::vector< css::uno::Reference< css::uno::XInterface > > factories; getComponentInfo(&data, startup ? 0 : &factories, context); if (!startup) { - componentLiveInsertion(data, factories); + try { + componentLiveInsertion(data, factories); + } catch (css::uno::Exception & e) { + SAL_INFO( + "desktop.deployment", "caught Exception " << e.Message); + try { + impreg->revokeImplementation(url, rdb); + } catch (css::uno::RuntimeException & e2) { + SAL_WARN( + "desktop.deployment", + "ignored RuntimeException " << e2.Message); + } + throw; + } } m_registered = REG_REGISTERED; that->addDataToDb(url, data); |