summaryrefslogtreecommitdiff
path: root/configmgr/source
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2015-10-21 13:47:03 +0200
committerStephan Bergmann <sbergman@redhat.com>2015-10-21 13:59:50 +0200
commitc20f48abc6a2662fec12cb7588c69ff8e3a5d7c7 (patch)
treebf961589051eb72add2e7d8a9336ef848110de45 /configmgr/source
parent1b5766f7c29f28349d8970e6437c8ab1ba994825 (diff)
configmgr/dconf: Simplify Fleet Commander write-back mode
* Get rid of different dconf trees for reading and writing again; the one single tree is /org/libreoffice/registry/. * Trigger the special write-back mode when a file $SYSUSERCONFIG/libreoffice/dconfwrite is present; then, ignore the default user:!... entry in CONFIGURATION_LAYERS (i.e., don't use the UserInstallation's registrymodifications.xcu) and instead write changes back to the dconf tree. Change-Id: I6b4d7251851da3fe7abbc9dcb080d57b278de96b
Diffstat (limited to 'configmgr/source')
-rw-r--r--configmgr/source/components.cxx29
-rw-r--r--configmgr/source/dconf.cxx14
-rw-r--r--configmgr/source/dconf.hxx2
3 files changed, 31 insertions, 14 deletions
diff --git a/configmgr/source/components.cxx b/configmgr/source/components.cxx
index 90349886b4d4..c1aec0702788 100644
--- a/configmgr/source/components.cxx
+++ b/configmgr/source/components.cxx
@@ -537,9 +537,9 @@ Components::Components(
} else if (type == "dconf") {
if (url == "!") {
modificationTarget_ = ModificationTarget::Dconf;
- dconf::readLayer(data_, Data::NO_LAYER, false);
+ dconf::readLayer(data_, Data::NO_LAYER);
} else if (url == "*") {
- dconf::readLayer(data_, layer, true);
+ dconf::readLayer(data_, layer);
} else {
throw css::uno::RuntimeException(
"CONFIGURATION_LAYERS: unknown \"dconf\" kind \"" + url
@@ -579,11 +579,30 @@ Components::Components(
throw css::uno::RuntimeException(
"CONFIGURATION_LAYERS: empty \"user\" URL");
}
+ bool ignore = false;
+#if ENABLE_DCONF
if (write) {
- modificationTarget_ = ModificationTarget::File;
- modificationFileUrl_ = url;
+ OUString token(
+ expand("${SYSUSERCONFIG}/libreoffice/dconfwrite"));
+ osl::DirectoryItem it;
+ osl::FileBase::RC e = osl::DirectoryItem::get(token, it);
+ ignore = e == osl::FileBase::E_None;
+ SAL_INFO(
+ "configmgr",
+ "dconf write (<" << token << "> " << +e << "): "
+ << int(ignore));
+ if (ignore) {
+ modificationTarget_ = ModificationTarget::Dconf;
+ }
+ }
+#endif
+ if (!ignore) {
+ if (write) {
+ modificationTarget_ = ModificationTarget::File;
+ modificationFileUrl_ = url;
+ }
+ parseModificationLayer(write ? Data::NO_LAYER : layer, url);
}
- parseModificationLayer(write ? Data::NO_LAYER : layer, url);
++layer; //TODO: overflow
} else {
throw css::uno::RuntimeException(
diff --git a/configmgr/source/dconf.cxx b/configmgr/source/dconf.cxx
index 192eb8bba24f..cc307e47a845 100644
--- a/configmgr/source/dconf.cxx
+++ b/configmgr/source/dconf.cxx
@@ -39,8 +39,7 @@ extern "C" {
//
// * The node hierarchy (starting at component nodes with names like
// "org.openoffice.Setup") maps to dconf paths underneath
-// "/org/libreoffice/registry/system/" resp.
-// "/org/libreoffice/registry/user/".
+// "/org/libreoffice/registry/".
//
// * Component, group, set, and localized property nodes map to dconf dirs,
// while property and localized value nodes map to dconf keys.
@@ -217,9 +216,8 @@ private:
DConfChangeset * changeset_;
};
-OString getRoot(bool system) {
- return "/org/libreoffice/registry/"
- + (system ? OStringLiteral("system") : OStringLiteral("user"));
+OString getRoot() {
+ return "/org/libreoffice/registry";
}
bool decode(OUString * string, bool slash) {
@@ -1550,7 +1548,7 @@ bool addModifications(
}
-void readLayer(Data & data, int layer, bool system) {
+void readLayer(Data & data, int layer) {
GObjectHolder<DConfClient> client(dconf_client_new());
if (client.get() == nullptr) {
SAL_WARN("configmgr.dconf", "dconf_client_new failed");
@@ -1558,7 +1556,7 @@ void readLayer(Data & data, int layer, bool system) {
}
readDir(
data, layer, rtl::Reference<Node>(), data.getComponents(), client,
- getRoot(system) + "/");
+ getRoot() + "/");
}
void writeModifications(Components & components, Data & data) {
@@ -1573,7 +1571,7 @@ void writeModifications(Components & components, Data & data) {
}
for (auto const & i: data.modifications.getRoot().children) {
if (!addModifications(
- components, cs, getRoot(false), rtl::Reference<Node>(), i.first,
+ components, cs, getRoot(), rtl::Reference<Node>(), i.first,
data.getComponents().findNode(Data::NO_LAYER, i.first),
i.second))
{
diff --git a/configmgr/source/dconf.hxx b/configmgr/source/dconf.hxx
index 1086c77a3dd4..f7f59703754c 100644
--- a/configmgr/source/dconf.hxx
+++ b/configmgr/source/dconf.hxx
@@ -19,7 +19,7 @@ namespace configmgr {
namespace configmgr { namespace dconf {
-void readLayer(Data & data, int layer, bool system);
+void readLayer(Data & data, int layer);
void writeModifications(Components & components, Data & data);