summaryrefslogtreecommitdiff
path: root/configmgr
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2011-10-31 16:51:35 +0100
committerStephan Bergmann <sbergman@redhat.com>2011-10-31 16:51:35 +0100
commita334403eb22f3d812549b5ce9b390fecdee9be31 (patch)
treebadbed131a228b1a8cbbfb50cde979884f0a2919 /configmgr
parent983360d3bed84981650adfb30e2759bf6fa30e61 (diff)
Cleaned up configmgr initialization.
Added CONFIGURATION_LAYERS bootstrap variable. Removed OOO_CONFIG_REGISTRY[_EXTRA]_DIR bootstrap variables.
Diffstat (limited to 'configmgr')
-rw-r--r--configmgr/source/components.cxx213
-rw-r--r--configmgr/source/components.hxx7
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_;
};