From 59500ddeacd4045d9d5af29ce30d4713a1d879bf Mon Sep 17 00:00:00 2001 From: Tinny Ng <tng@apache.org> Date: Thu, 4 Jul 2002 15:34:42 +0000 Subject: [PATCH] DOM L3: add DOMDocument::renameNode git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@173940 13f79535-47bb-0310-9956-ffa450edef68 --- src/xercesc/dom/impl/DOMAttrMapImpl.cpp | 117 ++++++++++++++++++------ src/xercesc/dom/impl/DOMAttrMapImpl.hpp | 24 ++--- 2 files changed, 101 insertions(+), 40 deletions(-) diff --git a/src/xercesc/dom/impl/DOMAttrMapImpl.cpp b/src/xercesc/dom/impl/DOMAttrMapImpl.cpp index 40f1eaeda..3ded9df81 100644 --- a/src/xercesc/dom/impl/DOMAttrMapImpl.cpp +++ b/src/xercesc/dom/impl/DOMAttrMapImpl.cpp @@ -60,6 +60,7 @@ */ #include "DOMAttrMapImpl.hpp" +#include "DOMAttrImpl.hpp" #include "DOMNamedNodeMapImpl.hpp" #include "DOMNodeImpl.hpp" #include "DOMElementImpl.hpp" @@ -101,40 +102,100 @@ DOMAttrMapImpl *DOMAttrMapImpl::cloneAttrMap(DOMNode *ownerNode_p) DOMNode *DOMAttrMapImpl::removeNamedItem(const XMLCh *name) { - DOMNode* removed = DOMNamedNodeMapImpl::removeNamedItem(name); + DOMNode* removed = DOMNamedNodeMapImpl::removeNamedItem(name); - // Replace it if it had a default value - // (DOM spec level 1 - Element Interface) - if (hasDefaults() && (removed != 0)) - { - DOMAttrMapImpl* defAttrs = ((DOMElementImpl*)fOwnerNode)->getDefaultAttributes(); - DOMAttr* attr = (DOMAttr*)(defAttrs->getNamedItem(name)); - if (attr != 0) - { - DOMAttr* newAttr = (DOMAttr*)attr->cloneNode(true); - setNamedItem(newAttr); - } - } + // Replace it if it had a default value + // (DOM spec level 1 - Element Interface) + if (hasDefaults() && (removed != 0)) + { + DOMAttrMapImpl* defAttrs = ((DOMElementImpl*)fOwnerNode)->getDefaultAttributes(); + DOMAttr* attr = (DOMAttr*)(defAttrs->getNamedItem(name)); + if (attr != 0) + { + DOMAttr* newAttr = (DOMAttr*)attr->cloneNode(true); + setNamedItem(newAttr); + } + } - return removed; + return removed; } DOMNode *DOMAttrMapImpl::removeNamedItemNS(const XMLCh *namespaceURI, const XMLCh *localName) { - DOMNode* removed = DOMNamedNodeMapImpl::removeNamedItemNS(namespaceURI, localName); + DOMNode* removed = DOMNamedNodeMapImpl::removeNamedItemNS(namespaceURI, localName); - // Replace it if it had a default value - // (DOM spec level 2 - Element Interface) - if (hasDefaults() && (removed != 0)) - { - DOMAttrMapImpl* defAttrs = ((DOMElementImpl*)fOwnerNode)->getDefaultAttributes(); - DOMAttr* attr = (DOMAttr*)(defAttrs->getNamedItemNS(namespaceURI, localName)); - if (attr != 0) - { - DOMAttr* newAttr = (DOMAttr*)attr->cloneNode(true); - setNamedItem(newAttr); - } - } + // Replace it if it had a default value + // (DOM spec level 2 - Element Interface) + + if (hasDefaults() && (removed != 0)) + { + DOMAttrMapImpl* defAttrs = ((DOMElementImpl*)fOwnerNode)->getDefaultAttributes(); + DOMAttr* attr = (DOMAttr*)(defAttrs->getNamedItemNS(namespaceURI, localName)); + if (attr != 0) + { + DOMAttr* newAttr = (DOMAttr*)attr->cloneNode(true); + setNamedItemNS(newAttr); + } + } - return removed; + return removed; } + +/** + * Get this AttributeMap in sync with the given "defaults" map. + * @param defaults The default attributes map to sync with. + */ +void DOMAttrMapImpl::reconcileDefaultAttributes(const DOMAttrMapImpl* defaults) { + + // remove any existing default + XMLSize_t nsize = getLength(); + for (XMLSSize_t i = nsize - 1; i >= 0; i--) { + DOMAttr* attr = (DOMAttr*)item(i); + if (!attr->getSpecified()) { + removeNamedItemAt(i); + } + } + + hasDefaults(false); + + // add the new defaults + if (defaults) { + hasDefaults(true); + + if (nsize == 0) { + cloneContent(defaults); + } + else { + XMLSize_t dsize = defaults->getLength(); + for (XMLSize_t n = 0; n < dsize; n++) { + DOMAttr* attr = (DOMAttr*)defaults->item(n); + + DOMAttr* newAttr = (DOMAttr*)attr->cloneNode(true); + setNamedItemNS(newAttr); + DOMAttrImpl* newAttrImpl = (DOMAttrImpl*) newAttr; + newAttrImpl->setSpecified(false); + } + } + } +} // reconcileDefaults() + + +/** + * Move specified attributes from the given map to this one + */ +void DOMAttrMapImpl::moveSpecifiedAttributes(DOMAttrMapImpl* srcmap) { + XMLSize_t nsize = srcmap->getLength(); + + for (XMLSSize_t i = nsize - 1; i >= 0; i--) { + DOMAttr* attr = (DOMAttr*)srcmap->item(i); + if (attr->getSpecified()) { + srcmap->removeNamedItemAt(i); + } + + if (attr->getLocalName()) + setNamedItemNS(attr); + else + setNamedItem(attr); + } +} // moveSpecifiedAttributes(AttributeMap):void + diff --git a/src/xercesc/dom/impl/DOMAttrMapImpl.hpp b/src/xercesc/dom/impl/DOMAttrMapImpl.hpp index a50e3ff47..98a2eebbb 100644 --- a/src/xercesc/dom/impl/DOMAttrMapImpl.hpp +++ b/src/xercesc/dom/impl/DOMAttrMapImpl.hpp @@ -80,24 +80,27 @@ class DOMNamedNodeMap; class CDOM_EXPORT DOMAttrMapImpl : public DOMNamedNodeMapImpl { private: - // bool attrDefaults; // revisit. Move up to the owning element level. + bool attrDefaults; public: - DOMAttrMapImpl(DOMNode *ownerNod); + DOMAttrMapImpl(DOMNode *ownerNod); // revisit. This "copy" constructor is used for cloning an Element with Attributes, // and for setting up default attributes. It's probably not right // for one or the other or both. - DOMAttrMapImpl(DOMNode *ownerNod, const DOMNamedNodeMapImpl *defaults); - DOMAttrMapImpl(); + DOMAttrMapImpl(DOMNode *ownerNod, const DOMNamedNodeMapImpl *defaults); + DOMAttrMapImpl(); virtual ~DOMAttrMapImpl(); - virtual DOMAttrMapImpl *cloneAttrMap(DOMNode *ownerNode); - virtual bool hasDefaults(); - virtual void hasDefaults(bool value); + virtual DOMAttrMapImpl *cloneAttrMap(DOMNode *ownerNode); + virtual bool hasDefaults(); + virtual void hasDefaults(bool value); virtual DOMNode *removeNamedItem(const XMLCh *name); virtual DOMNode *removeNamedItemNS(const XMLCh *namespaceURI, const XMLCh *localName); + + void reconcileDefaultAttributes(const DOMAttrMapImpl* defaults); + void moveSpecifiedAttributes(DOMAttrMapImpl* srcmap); }; // --------------------------------------------------------------------------- @@ -106,15 +109,12 @@ public: inline bool DOMAttrMapImpl::hasDefaults() { - // revisit. Put a flag on the element for this value. - // return attrDefaults; - return false; + return attrDefaults; } inline void DOMAttrMapImpl::hasDefaults(bool value) { - // revisit. Put a flag on the Element for this value. - // attrDefaults = value; + attrDefaults = value; } -- GitLab