From 2a31dd4025eff8d09ab207f31bacc0a5b8c36bd9 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Tue, 5 Feb 2013 13:03:31 +0100 Subject: 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 --- .../deployment/registry/component/dp_component.cxx | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'desktop') 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); -- cgit