You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by ar...@apache.org on 2025/01/19 21:30:19 UTC
(openoffice) 01/02: File and URL history elements disappear when cleared
This is an automated email from the ASF dual-hosted git repository.
ardovm pushed a commit to branch bug127942
in repository https://gitbox.apache.org/repos/asf/openoffice.git
commit afd9e31976a562115f55d066936663bde22b7456
Author: Arrigo Marchiori <ar...@yahoo.it>
AuthorDate: Sun Jan 19 22:16:04 2025 +0100
File and URL history elements disappear when cleared
Allow configuration elements to disappear by becoming "wiped"-type
nodes.
Intercept the removal of file and URL history elements and turn them into
"wiped" nodes.
---
main/configmgr/Library_configmgr.mk | 1 +
main/configmgr/source/access.cxx | 24 ++++++++-
main/configmgr/source/makefile.mk | 1 +
main/configmgr/source/node.hxx | 43 ++++++++++++++-
main/configmgr/source/wipednode.cxx | 64 +++++++++++++++++++++++
main/configmgr/source/{node.hxx => wipednode.hxx} | 63 ++++++++--------------
main/configmgr/source/writemodfile.cxx | 4 ++
7 files changed, 155 insertions(+), 45 deletions(-)
diff --git a/main/configmgr/Library_configmgr.mk b/main/configmgr/Library_configmgr.mk
index 87c334dcbb..d53588fd03 100644
--- a/main/configmgr/Library_configmgr.mk
+++ b/main/configmgr/Library_configmgr.mk
@@ -74,6 +74,7 @@ $(eval $(call gb_Library_add_exception_objects,configmgr,\
configmgr/source/type \
configmgr/source/update \
configmgr/source/valueparser \
+ configmgr/source/wipednode \
configmgr/source/writemodfile \
configmgr/source/xcdparser \
configmgr/source/xcsparser \
diff --git a/main/configmgr/source/access.cxx b/main/configmgr/source/access.cxx
index f7ec65c897..b06c0d12ae 100644
--- a/main/configmgr/source/access.cxx
+++ b/main/configmgr/source/access.cxx
@@ -101,6 +101,7 @@
#include "propertynode.hxx"
#include "rootaccess.hxx"
#include "setnode.hxx"
+#include "wipednode.hxx"
#include "type.hxx"
namespace configmgr {
@@ -480,7 +481,7 @@ void Access::initBroadcasterAndChanges(
i != modifications.children.end(); ++i)
{
rtl::Reference< ChildAccess > child(getChild(i->first));
- if (child.is()) {
+ if (child.is() && (child->getNode()->kind() != Node::KIND_WIPED)) {
switch (child->getNode()->kind()) {
case Node::KIND_LOCALIZED_PROPERTY:
if (!i->second.children.empty()) {
@@ -677,6 +678,8 @@ void Access::initBroadcasterAndChanges(
// listeners
}
break;
+ case Node::KIND_WIPED:
+ break; // Excluded above
}
} else {
switch (getNode()->kind()) {
@@ -1906,12 +1909,29 @@ void Access::removeByName(rtl::OUString const & aName)
aName, static_cast< cppu::OWeakObject * >(this));
}
}
+ // Elements of file/URL histories must not be marked as
+ // "removed": they must disappear
+ bool mustWipe = false;
+ ::rtl::Reference< Access > parent = getParentAccess();
+ if (parent.is()) {
+ const ::rtl::OUString parentName = parent->getName();
+ mustWipe =
+ ((parentName == ::rtl::OUString::createFromAscii("PickList")) ||
+ (parentName == ::rtl::OUString::createFromAscii("URLHistory"))) &&
+ (getName() == ::rtl::OUString::createFromAscii("ItemList"));
+ }
Modifications localMods;
localMods.add(child->getRelativePath());
// unbind() modifies the parent chain that markChildAsModified() walks,
// so order is important:
markChildAsModified(child); //TODO: must not throw
- child->unbind();
+ if (!mustWipe) {
+ // This will mark the element as "removed"
+ child->unbind();
+ } else {
+ // The element will disappear
+ child->setNode(new WipedNode(child->getNode()->getLayer()));
+ }
getNotificationRoot()->initBroadcaster(localMods.getRoot(), &bc);
}
bc.send();
diff --git a/main/configmgr/source/makefile.mk b/main/configmgr/source/makefile.mk
index ca118eb3e8..7ebadd69e0 100644
--- a/main/configmgr/source/makefile.mk
+++ b/main/configmgr/source/makefile.mk
@@ -57,6 +57,7 @@ SLOFILES = \
$(SLO)/type.obj \
$(SLO)/update.obj \
$(SLO)/valueparser.obj \
+ $(SLO)/wipednode.obj \
$(SLO)/writemodfile.obj \
$(SLO)/xcdparser.obj \
$(SLO)/xcsparser.obj \
diff --git a/main/configmgr/source/node.hxx b/main/configmgr/source/node.hxx
index 32dc26d070..5a03d15f78 100644
--- a/main/configmgr/source/node.hxx
+++ b/main/configmgr/source/node.hxx
@@ -35,11 +35,50 @@ namespace rtl { class OUString; }
namespace configmgr {
+/**
+ * Configuration element.
+ *
+ * This class represent either a "node" or a "property" in the words of the
+ * OpenOffice.org Registry Format (OOR).
+ */
class Node: public salhelper::SimpleReferenceObject {
public:
+ /// Identifies the type of configuration element.
enum Kind {
- KIND_PROPERTY, KIND_LOCALIZED_PROPERTY, KIND_LOCALIZED_VALUE,
- KIND_GROUP, KIND_SET };
+ /** Property (<prop> element)
+ *
+ * Identifies instances of PropertyNode.
+ */
+ KIND_PROPERTY,
+ /** Localized property (<prop> element)
+ *
+ * Identifies instances of LocalizedPropertyNode.
+ */
+ KIND_LOCALIZED_PROPERTY,
+ /**
+ * Value of a property (<value> element)
+ *
+ * Identifies instances of LocalizedValueNode.
+ */
+ KIND_LOCALIZED_VALUE,
+ /** Group node (<node> element)
+ *
+ * Identifies instances of GroupNode.
+ */
+ KIND_GROUP,
+ /** Set node (<node> element)
+ *
+ * Identifies instances of SetNode.
+ */
+ KIND_SET,
+ /** Node to be deleted.
+ *
+ * This type of element is not present in the OOR. It is used as a
+ * placeholder for a node that is about to disappear.
+ *
+ * Identifies instances of WipedNode.
+ */
+ KIND_WIPED };
virtual Kind kind() const = 0;
diff --git a/main/configmgr/source/wipednode.cxx b/main/configmgr/source/wipednode.cxx
new file mode 100644
index 0000000000..87c992f457
--- /dev/null
+++ b/main/configmgr/source/wipednode.cxx
@@ -0,0 +1,64 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+
+#include "precompiled_configmgr.hxx"
+#include "sal/config.h"
+
+#include "com/sun/star/beans/Optional.hpp"
+#include "com/sun/star/uno/Any.hxx"
+#include "osl/diagnose.h"
+#include "rtl/ref.hxx"
+#include "rtl/ustring.h"
+#include "rtl/ustring.hxx"
+
+#include "components.hxx"
+#include "node.hxx"
+#include "wipednode.hxx"
+
+namespace configmgr {
+
+namespace {
+
+namespace css = com::sun::star;
+
+}
+
+WipedNode::WipedNode(int layer):
+ Node(layer)
+{}
+
+rtl::Reference< Node > WipedNode::clone(bool) const {
+ return new WipedNode(*this);
+}
+
+WipedNode::WipedNode(WipedNode const & other):
+ Node(other)
+{}
+
+WipedNode::~WipedNode() {}
+
+Node::Kind WipedNode::kind() const {
+ return KIND_WIPED;
+}
+
+}
diff --git a/main/configmgr/source/node.hxx b/main/configmgr/source/wipednode.hxx
similarity index 55%
copy from main/configmgr/source/node.hxx
copy to main/configmgr/source/wipednode.hxx
index 32dc26d070..9386aec165 100644
--- a/main/configmgr/source/node.hxx
+++ b/main/configmgr/source/wipednode.hxx
@@ -1,5 +1,5 @@
/**************************************************************
- *
+ *
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
@@ -7,73 +7,54 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
- *
+ *
*************************************************************/
-#ifndef INCLUDED_CONFIGMGR_SOURCE_NODE_HXX
-#define INCLUDED_CONFIGMGR_SOURCE_NODE_HXX
+#ifndef INCLUDED_CONFIGMGR_SOURCE_WIPEDNODE_HXX
+#define INCLUDED_CONFIGMGR_SOURCE_WIPEDNODE_HXX
#include "sal/config.h"
#include "rtl/ref.hxx"
-#include "salhelper/simplereferenceobject.hxx"
-#include "nodemap.hxx"
+#include "node.hxx"
namespace rtl { class OUString; }
namespace configmgr {
-class Node: public salhelper::SimpleReferenceObject {
-public:
- enum Kind {
- KIND_PROPERTY, KIND_LOCALIZED_PROPERTY, KIND_LOCALIZED_VALUE,
- KIND_GROUP, KIND_SET };
-
- virtual Kind kind() const = 0;
-
- virtual rtl::Reference< Node > clone(bool keepTemplateName) const = 0;
-
- virtual NodeMap & getMembers();
-
- virtual rtl::OUString getTemplateName() const;
-
- virtual void setMandatory(int layer);
+class Components;
- virtual int getMandatory() const;
-
- void setLayer(int layer);
-
- int getLayer() const;
-
- void setFinalized(int layer);
-
- int getFinalized() const;
-
- rtl::Reference< Node > getMember(rtl::OUString const & name);
+/**
+ * A configuration element that is going to disappear.
+ *
+ * These objects are a placeholder for elements that are pending removal
+ * and must completely disappear from the configuration registry.
+ */
+class WipedNode: public Node {
+public:
+ WipedNode(int layer);
-protected:
- explicit Node(int layer);
+ virtual rtl::Reference< Node > clone(bool keepTemplateName) const;
- Node(const Node & other);
+private:
+ WipedNode(WipedNode const & other);
- virtual ~Node();
+ virtual ~WipedNode();
- virtual void clear();
+ virtual Kind kind() const;
- int layer_;
- int finalized_;
};
}
diff --git a/main/configmgr/source/writemodfile.cxx b/main/configmgr/source/writemodfile.cxx
index 113ac767b6..7bd8c64359 100644
--- a/main/configmgr/source/writemodfile.cxx
+++ b/main/configmgr/source/writemodfile.cxx
@@ -443,6 +443,8 @@ void writeNode(
}
writeData(handle, RTL_CONSTASCII_STRINGPARAM("</node>"));
break;
+ case Node::KIND_WIPED:
+ break; // Nothing to write
}
}
@@ -494,6 +496,8 @@ void writeModifications(
handle,
RTL_CONSTASCII_STRINGPARAM("\" oor:op=\"remove\"/>"));
break;
+ case Node::KIND_WIPED:
+ break; // Our parent was wiped, we should not exist
default:
OSL_ASSERT(false); // this cannot happen
break;