diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2011-10-31 16:51:35 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2011-10-31 16:51:35 +0100 |
commit | a334403eb22f3d812549b5ce9b390fecdee9be31 (patch) | |
tree | badbed131a228b1a8cbbfb50cde979884f0a2919 /configmgr/source | |
parent | 983360d3bed84981650adfb30e2759bf6fa30e61 (diff) |
Cleaned up configmgr initialization.
Added CONFIGURATION_LAYERS bootstrap variable.
Removed OOO_CONFIG_REGISTRY[_EXTRA]_DIR bootstrap variables.
Diffstat (limited to 'configmgr/source')
-rw-r--r-- | configmgr/source/components.cxx | 213 | ||||
-rw-r--r-- | configmgr/source/components.hxx | 7 |
2 files changed, 119 insertions, 101 deletions
diff --git a/configmgr/source/components.cxx b/configmgr/source/components.cxx index 3724b16075f0..456bdfc27d1a 100644 --- a/configmgr/source/components.cxx +++ b/configmgr/source/components.cxx @@ -304,12 +304,12 @@ bool Components::hasModifications() const void Components::writeModifications() { - if (!hasModifications()) + if (!hasModifications() || modificationFileUrl_.isEmpty()) return; if (!writeThread_.is()) { writeThread_ = new WriteThread( - &writeThread_, *this, getModificationFileUrl(), data_); + &writeThread_, *this, modificationFileUrl_, data_); writeThread_->create(); } } @@ -329,8 +329,9 @@ void Components::flushModifications() { void Components::insertExtensionXcsFile( bool shared, rtl::OUString const & fileUri) { + int layer = getExtensionLayer(shared); try { - parseXcsFile(fileUri, shared ? 9 : 13, data_, 0, 0, 0); + parseXcsFile(fileUri, layer, data_, 0, 0, 0); } catch (css::container::NoSuchElementException & e) { throw css::uno::RuntimeException( (rtl::OUString( @@ -345,7 +346,7 @@ void Components::insertExtensionXcuFile( bool shared, rtl::OUString const & fileUri, Modifications * modifications) { OSL_ASSERT(modifications != 0); - int layer = shared ? 10 : 14; + int layer = getExtensionLayer(shared) + 1; Additions * adds = data_.addExtensionXcuAdditions(fileUri, layer); try { parseXcuFile(fileUri, layer, data_, 0, modifications, adds); @@ -506,96 +507,108 @@ css::beans::Optional< css::uno::Any > Components::getExternalValue( Components::Components( css::uno::Reference< css::uno::XComponentContext > const & context): - context_(context) + context_(context), sharedExtensionLayer_(-1), userExtensionLayer_(-1) { - lock_ = lock(); - OSL_ASSERT(context.is()); - - // Check if we are being used for in-tree unit tests ... - rtl::OUString aUnitTestDir; - if (rtl::Bootstrap::get( rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM("OOO_CONFIG_REGISTRY_DIR") ), aUnitTestDir)) - { - parseXcsXcuLayer( 0, aUnitTestDir ); - // next is required for the (somewhat strange) filter configuration - parseModuleLayer( 2, aUnitTestDir + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/spool"))); - // allow a directory to be specified to allow extra configuration to be stored - // for example to place a registrymodifications.xcu to override some configuration - rtl::OUString extra; - if (rtl::Bootstrap::get( + lock_ = lock(); + rtl::OUString conf( + expand( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM("${CONFIGURATION_LAYERS}")))); + RTL_LOGFILE_TRACE("configmgr : begin parsing"); + int layer = 0; + for (sal_Int32 i = 0;;) { + while (i != conf.getLength() && conf[i] == ' ') { + ++i; + } + if (i == conf.getLength()) { + break; + } + if (!modificationFileUrl_.isEmpty()) { + throw css::uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( - "OOO_CONFIG_REGISTRY_EXTRA_DIR")), - extra)) + "CONFIGURATION_LAYERS: \"user\" followed by further" + " layers")), + css::uno::Reference< css::uno::XInterface >()); + } + sal_Int32 c = i; + for (;; ++c) { + if (c == conf.getLength() || conf[c] == ' ') { + throw css::uno::RuntimeException( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "CONFIGURATION_LAYERS: missing \":\"")), + css::uno::Reference< css::uno::XInterface >()); + } + if (conf[c] == ':') { + break; + } + } + sal_Int32 n = conf.indexOf(' ', c + 1); + if (n == -1) { + n = conf.getLength(); + } + rtl::OUString type(conf.copy(i, c - i)); + rtl::OUString url(expand(conf.copy(c + 1, n - c - 1))); + if (type.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("xcsxcu"))) { + parseXcsXcuLayer(layer, url); + layer += 2; //TODO: overflow + } else if (type.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("bundledext"))) { - parseXcsXcuLayer(3, extra); + parseXcsXcuIniLayer(layer, url, false); + layer += 2; //TODO: overflow + } else if (type.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("sharedext"))) { + if (sharedExtensionLayer_ != -1) { + throw css::uno::RuntimeException( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "CONFIGURATION_LAYERS: multiple \"sharedext\"" + " layers")), + css::uno::Reference< css::uno::XInterface >()); + } + sharedExtensionLayer_ = layer; + parseXcsXcuIniLayer(layer, url, true); + layer += 2; //TODO: overflow + } else if (type.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("userext"))) { + if (userExtensionLayer_ != -1) { + throw css::uno::RuntimeException( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "CONFIGURATION_LAYERS: multiple \"userext\"" + " layers")), + css::uno::Reference< css::uno::XInterface >()); + } + userExtensionLayer_ = layer; + parseXcsXcuIniLayer(layer, url, true); + layer += 2; //TODO: overflow + } else if (type.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("module"))) { + parseModuleLayer(layer, url); + ++layer; //TODO: overflow + } else if (type.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("res"))) { + parseResLayer(layer, url); + ++layer; //TODO: overflow + } else if (type.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("user"))) { + if (url.isEmpty()) { + throw css::uno::RuntimeException( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "CONFIGURATION_LAYERS: empty \"user\" URL")), + css::uno::Reference< css::uno::XInterface >()); + } + modificationFileUrl_ = url; + parseModificationLayer(url); + } else { + throw css::uno::RuntimeException( + (rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "CONFIGURATION_LAYERS: unknown layer type \"")) + + type + + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\""))), + css::uno::Reference< css::uno::XInterface >()); } - return; + i = n; } - - RTL_LOGFILE_TRACE("configmgr : begin parsing"); - - parseXcsXcuLayer( - 0, - expand( - rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( - "$BRAND_BASE_DIR/share/registry")))); - parseModuleLayer( - 2, - expand( - rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( - "$BRAND_BASE_DIR/share/registry/modules")))); - parseResLayer( - 3, - expand( - rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( - "$BRAND_BASE_DIR/share/registry")))); - parseXcsXcuIniLayer( - 4, - expand( - rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( - "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE("uno") - ":BUNDLED_EXTENSIONS_USER}/registry/" - "com.sun.star.comp.deployment.configuration." - "PackageRegistryBackend/configmgr.ini"))), - false); - parseXcsXcuIniLayer( - 6, - expand( - rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( - "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE("uno") - ":SHARED_EXTENSIONS_USER}/registry/" - "com.sun.star.comp.deployment.configuration." - "PackageRegistryBackend/configmgr.ini"))), - true); - parseXcsXcuLayer( - 8, - expand( - rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( - "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE("uno") - ":UNO_USER_PACKAGES_CACHE}/registry/" - "com.sun.star.comp.deployment.configuration." - "PackageRegistryBackend/registry")))); - // can be dropped once old UserInstallation format can no longer exist - // (probably OOo 4) - parseXcsXcuIniLayer( - 10, - expand( - rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( - "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE("uno") - ":UNO_USER_PACKAGES_CACHE}/registry/" - "com.sun.star.comp.deployment.configuration." - "PackageRegistryBackend/configmgr.ini"))), - true); - parseModificationLayer(); RTL_LOGFILE_TRACE("configmgr : end parsing"); } @@ -858,19 +871,9 @@ void Components::parseResLayer(int layer, rtl::OUString const & url) { &parseXcuFile, resUrl, false); } -rtl::OUString Components::getModificationFileUrl() const { - return expand( - rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( - "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE("bootstrap") - ":UserInstallation}/user/registrymodifications.xcu"))); -} - -void Components::parseModificationLayer() { +void Components::parseModificationLayer(rtl::OUString const & url) { try { - parseFileLeniently( - &parseXcuFile, getModificationFileUrl(), Data::NO_LAYER, data_, 0, - 0, 0); + parseFileLeniently(&parseXcuFile, url, Data::NO_LAYER, data_, 0, 0, 0); } catch (css::container::NoSuchElementException &) { OSL_TRACE( "configmgr user registrymodifications.xcu does not (yet) exist"); @@ -889,6 +892,18 @@ void Components::parseModificationLayer() { } } +int Components::getExtensionLayer(bool shared) { + int layer = shared ? sharedExtensionLayer_ : userExtensionLayer_; + if (layer == -1) { + throw css::uno::RuntimeException( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "insert extension xcs/xcu file into undefined layer")), + css::uno::Reference< css::uno::XInterface >()); + } + return layer; +} + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/configmgr/source/components.hxx b/configmgr/source/components.hxx index 26af3fbdecea..bc4c5d0b9513 100644 --- a/configmgr/source/components.hxx +++ b/configmgr/source/components.hxx @@ -155,9 +155,9 @@ private: void parseResLayer(int layer, rtl::OUString const & url); - rtl::OUString getModificationFileUrl() const; + void parseModificationLayer(rtl::OUString const & url); - void parseModificationLayer(); + int getExtensionLayer(bool shared); typedef std::set< RootAccess * > WeakRootSet; @@ -176,6 +176,9 @@ private: WeakRootSet roots_; ExternalServices externalServices_; rtl::Reference< WriteThread > writeThread_; + int sharedExtensionLayer_; + int userExtensionLayer_; + rtl::OUString modificationFileUrl_; boost::shared_ptr<osl::Mutex> lock_; }; |