Author: scantor Date: Wed Jul 5 18:52:15 2017 New Revision: 1800911 URL: http://svn.apache.org/viewvc?rev=1800911&view=rev Log: XERCESC-2088 - Fix undefined casting behavior in DOM
Added: xerces/c/trunk/src/xercesc/dom/impl/DOMNodeBase.hpp Modified: xerces/c/trunk/ (props changed) xerces/c/trunk/samples/ (props changed) xerces/c/trunk/samples/src/XInclude/ (props changed) xerces/c/trunk/src/CMakeLists.txt xerces/c/trunk/src/Makefile.am xerces/c/trunk/src/xercesc/dom/impl/DOMAttrImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMAttrImpl.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMCasts.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMChildNode.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMCommentImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMCommentImpl.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentFragmentImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentFragmentImpl.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentTypeImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentTypeImpl.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMEntityImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMEntityImpl.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMNodeImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMNodeImpl.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMNotationImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMNotationImpl.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMParentNode.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMParentNode.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMProcessingInstructionImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMProcessingInstructionImpl.hpp xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.cpp xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.hpp xerces/c/trunk/src/xercesc/util/NetAccessors/ (props changed) xerces/c/trunk/tests/ (props changed) xerces/c/trunk/tests/src/XSTSHarness/ (props changed) Propchange: xerces/c/trunk/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Wed Jul 5 18:52:15 2017 @@ -18,3 +18,4 @@ xerces-c.pc .cproject .vscode .settings +test-results.log Propchange: xerces/c/trunk/samples/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Wed Jul 5 18:52:15 2017 @@ -15,4 +15,5 @@ SAXPrint SCMPrint SEnumVal StdInParse +XInclude Makefile.in Propchange: xerces/c/trunk/samples/src/XInclude/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Wed Jul 5 18:52:15 2017 @@ -1 +1 @@ -.deps +.* Modified: xerces/c/trunk/src/CMakeLists.txt URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/CMakeLists.txt?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/CMakeLists.txt (original) +++ xerces/c/trunk/src/CMakeLists.txt Wed Jul 5 18:52:15 2017 @@ -148,6 +148,7 @@ set(domimpl_headers xercesc/dom/impl/DOMImplementationListImpl.hpp xercesc/dom/impl/DOMLocatorImpl.hpp xercesc/dom/impl/DOMNamedNodeMapImpl.hpp + xercesc/dom/impl/DOMNodeBase.hpp xercesc/dom/impl/DOMNodeIDMap.hpp xercesc/dom/impl/DOMNodeImpl.hpp xercesc/dom/impl/DOMNodeIteratorImpl.hpp Modified: xerces/c/trunk/src/Makefile.am URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/Makefile.am?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/Makefile.am (original) +++ xerces/c/trunk/src/Makefile.am Wed Jul 5 18:52:15 2017 @@ -296,6 +296,7 @@ domimpl_headers = \ xercesc/dom/impl/DOMImplementationListImpl.hpp \ xercesc/dom/impl/DOMLocatorImpl.hpp \ xercesc/dom/impl/DOMNamedNodeMapImpl.hpp \ + xercesc/dom/impl/DOMNodeBase.hpp \ xercesc/dom/impl/DOMNodeIDMap.hpp \ xercesc/dom/impl/DOMNodeImpl.hpp \ xercesc/dom/impl/DOMNodeIteratorImpl.hpp \ Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMAttrImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMAttrImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMAttrImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMAttrImpl.cpp Wed Jul 5 18:52:15 2017 @@ -31,7 +31,7 @@ XERCES_CPP_NAMESPACE_BEGIN DOMAttrImpl::DOMAttrImpl(DOMDocument *ownerDoc, const XMLCh *aName) - : fNode(ownerDoc), fParent (ownerDoc), fSchemaType(0) + : fNode(this, ownerDoc), fParent(this, ownerDoc), fSchemaType(0) { DOMDocumentImpl *docImpl = (DOMDocumentImpl *)ownerDoc; fName = docImpl->getPooledString(aName); @@ -40,8 +40,8 @@ DOMAttrImpl::DOMAttrImpl(DOMDocument *ow DOMAttrImpl::DOMAttrImpl(const DOMAttrImpl &other, bool /*deep*/) : DOMAttr(other) - , fNode(other.fNode) - , fParent (other.fParent) + , fNode(this, other.fNode) + , fParent(this, other.fParent) , fName(other.fName) , fSchemaType(other.fSchemaType) { @@ -359,4 +359,8 @@ void* DOMAttrImpl::getFeature(const XMLC bool DOMAttrImpl::isDefaultNamespace(const XMLCh* namespaceURI) const {return fNode.isDefaultNamespace(namespaceURI); } const XMLCh* DOMAttrImpl::lookupNamespaceURI(const XMLCh* prefix) const {return fNode.lookupNamespaceURI(prefix); } +// Macro-in implementation accessors. +DOMNODEIMPL_IMPL(DOMAttrImpl); +DOMPARENTIMPL_IMPL(DOMAttrImpl); + XERCES_CPP_NAMESPACE_END Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMAttrImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMAttrImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMAttrImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMAttrImpl.hpp Wed Jul 5 18:52:15 2017 @@ -33,6 +33,7 @@ #include <xercesc/util/XercesDefs.hpp> +#include "DOMNodeBase.hpp" #include "DOMParentNode.hpp" #include "DOMNodeImpl.hpp" #include "DOMDocumentImpl.hpp" @@ -45,7 +46,7 @@ XERCES_CPP_NAMESPACE_BEGIN class DOMElementImpl; class DOMTypeInfoImpl; -class CDOM_EXPORT DOMAttrImpl: public DOMAttr { +class CDOM_EXPORT DOMAttrImpl: public DOMAttr, public HasDOMNodeImpl, public HasDOMParentImpl { public: DOMNodeImpl fNode; @@ -64,6 +65,10 @@ public: // Add all functions that are pure virtual in DOMNODE DOMNODE_FUNCTIONS; + // Add accessors for implementation bits. + DOMNODEIMPL_DECL; + DOMPARENTIMPL_DECL; + public: virtual const XMLCh * getName() const; virtual bool getSpecified() const; Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.cpp Wed Jul 5 18:52:15 2017 @@ -32,24 +32,22 @@ XERCES_CPP_NAMESPACE_BEGIN -DOMCDATASectionImpl::DOMCDATASectionImpl(DOMDocument *ownerDoc, - const XMLCh *dat) - : fNode(ownerDoc), fCharacterData(ownerDoc, dat) +DOMCDATASectionImpl::DOMCDATASectionImpl(DOMDocument *ownerDoc, const XMLCh *dat) + : fNode(this, ownerDoc), fCharacterData(ownerDoc, dat) { fNode.setIsLeafNode(true); } -DOMCDATASectionImpl:: -DOMCDATASectionImpl(DOMDocument *ownerDoc, const XMLCh* data, XMLSize_t n) - : fNode(ownerDoc), fCharacterData(ownerDoc, data, n) +DOMCDATASectionImpl::DOMCDATASectionImpl(DOMDocument *ownerDoc, const XMLCh* data, XMLSize_t n) + : fNode(this, ownerDoc), fCharacterData(ownerDoc, data, n) { fNode.setIsLeafNode(true); } DOMCDATASectionImpl::DOMCDATASectionImpl(const DOMCDATASectionImpl &other, bool /*deep*/) : DOMCDATASection(other), - fNode(*castToNodeImpl(&other)), - fChild(*castToChildImpl(&other)), + fNode(this, other.fNode), + fChild(other.fChild), fCharacterData(other.fCharacterData) { // revisit. Something nees to make "deep" work. @@ -318,4 +316,8 @@ void DOMCDATASectionImpl::release() void DOMCDATASectionImpl::setData(const XMLCh *data) {fCharacterData.setData(this, data);} void DOMCDATASectionImpl::setNodeValue(const XMLCh *nodeValue) {fCharacterData.setNodeValue (this, nodeValue); } +// Macro-in implementation accessors. +DOMNODEIMPL_IMPL(DOMCDATASectionImpl); +DOMCHILDIMPL_IMPL(DOMCDATASectionImpl); + XERCES_CPP_NAMESPACE_END Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMCDATASectionImpl.hpp Wed Jul 5 18:52:15 2017 @@ -34,6 +34,7 @@ #include <xercesc/util/XercesDefs.hpp> #include <xercesc/dom/DOMCDATASection.hpp> +#include "DOMNodeBase.hpp" #include "DOMNodeImpl.hpp" #include "DOMChildNode.hpp" #include "DOMParentNode.hpp" @@ -42,7 +43,7 @@ XERCES_CPP_NAMESPACE_BEGIN -class CDOM_EXPORT DOMCDATASectionImpl: public DOMCDATASection { +class CDOM_EXPORT DOMCDATASectionImpl: public DOMCDATASection, public HasDOMNodeImpl, public HasDOMChildImpl { protected: DOMNodeImpl fNode; DOMChildNode fChild; @@ -71,6 +72,10 @@ public: // Declare all of the functions from DOMNode. DOMNODE_FUNCTIONS; + // Add accessors for implementation bits. + DOMNODEIMPL_DECL; + DOMCHILDIMPL_DECL; + public: // Functions introduced by DOMCharacterData virtual const XMLCh* getData() const; Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMCasts.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMCasts.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMCasts.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMCasts.hpp Wed Jul 5 18:52:15 2017 @@ -33,120 +33,75 @@ // // Define inline casting functions to convert from -// (DOMNode *) to DOMParentNode or DOMChildNode *. +// (DOMNode*) to the embedded instances of DOMNodeImpl, +// DOMParentNode, and DOMChildNode. // -// This requires knowledge of the structure of the fields of -// for all node types. There are three categories - +// Each type of embedded object corresponds to a HasXXX virtual +// interface class that a given DOM implementation class will +// support to expose its embedded object(s) to other implementation +// classes. // -// Nodetypes that can have children and can be a child themselves. -// e.g. Elements -// -// Object -// DOMNodeImpl fNode; -// DOMParentNode fParent; -// DOMChildNode fChild; -// ... // other fields, depending on node type. -// -// Nodetypes that can not have children, e.g. TEXT -// -// Object -// DOMNodeImpl fNode; -// DOMChildNode fChild; -// ... // other fields, depending on node type -// -// Nodetypes that can not be a child of other nodes, but that can -// have children (are a parent) e.g. ATTR -// Object -// DOMNodeImpl fNode; -// DOMParentNode fParent -// ... // other fields, depending on node type -// -// The casting functions make these assumptions: -// 1. The cast is possible. Using code will not attempt to -// cast to something that does not exist, such as the child -// part of an ATTR -// -// 2. The nodes belong to this implementation. -// -// Some of the casts use the LEAFNODE flag in the common fNode part to -// determine whether an fParent field exists, and thus the -// position of the fChild part within the node. -// -// These functions also cast off const. It was either do that, or make -// a second overloaded set that took and returned const arguements. -// - -// -// Note that using offsetof, or taking the offset of an object member at -// a 0 address, is now undefined in C++. And gcc now warns about this behavior. -// This is because doing do so is unreliable for some types of objects. -// See: http://gcc.gnu.org/ml/gcc/2004-06/msg00227.html -// : http://gcc.gnu.org/ml/gcc-bugs/2000-03/msg00805.html -// The casting code below works around gcc's warnings by using a dummy -// pointer, which the compiler cannot tell is null. The defeats the warning, -// but also masks the potential problem. -// The gcc option -Wno-invalid-offsetof may also be used to turn off this warning. +// This replaces the previous implementation that relied upon unsafe +// casts and member offsets that rely on unspecified behavior in C++, +// with a hopefully small cost in memory and performance. // +#include <xercesc/dom/DOMException.hpp> +#include "DOMNodeBase.hpp" #include "DOMElementImpl.hpp" #include "DOMTextImpl.hpp" XERCES_CPP_NAMESPACE_BEGIN -static inline DOMNodeImpl *castToNodeImpl(const DOMNode *p) +static inline const DOMNodeImpl *castToNodeImpl(const DOMNode *p) { - // Note: hairy cast which is used for all node types, not just - // DOMElementImpl. - DOMElementImpl *pE = const_cast<DOMElementImpl *>(static_cast<const DOMElementImpl *>(p)); - return &(pE->fNode); + const HasDOMNodeImpl* pE = dynamic_cast<const HasDOMNodeImpl*>(p); + if (!pE || !pE->getNodeImpl()) { + throw DOMException(DOMException::INVALID_STATE_ERR, 0, XMLPlatformUtils::fgMemoryManager); + } + return pE->getNodeImpl(); } - -static inline DOMParentNode *castToParentImpl(const DOMNode *p) { - // Note: hairy cast which is used for all node types, not just - // DOMElementImpl. - DOMElementImpl *pE = const_cast<DOMElementImpl *>(static_cast<const DOMElementImpl *>(p)); - return &(pE->fParent); +static inline DOMNodeImpl *castToNodeImpl(DOMNode *p) +{ + HasDOMNodeImpl *pE = dynamic_cast<HasDOMNodeImpl*>(p); + if (!pE || !pE->getNodeImpl()) { + throw DOMException(DOMException::INVALID_STATE_ERR, 0, XMLPlatformUtils::fgMemoryManager); + } + return pE->getNodeImpl(); } - -static inline DOMChildNode *castToChildImpl(const DOMNode *p) { - // Note: hairy cast which is used for all node types, not just - // DOMElementImpl. - DOMElementImpl *pE = const_cast<DOMElementImpl *>(static_cast<const DOMElementImpl *>(p)); - if (pE->fNode.isLeafNode()) { - // Note: hairy cast which is used for all leaf node types, not just - // DOMTextImpl. - DOMTextImpl *pT = const_cast<DOMTextImpl *>(static_cast<const DOMTextImpl *>(p)); - return &(pT->fChild); +static inline const DOMParentNode *castToParentImpl(const DOMNode *p) { + const HasDOMParentImpl *pE = dynamic_cast<const HasDOMParentImpl*>(p); + if (!pE || !pE->getParentNodeImpl()) { + throw DOMException(DOMException::INVALID_STATE_ERR, 0, XMLPlatformUtils::fgMemoryManager); } - return &(pE->fChild); + return pE->getParentNodeImpl(); } - -static inline DOMNode *castToNode(const DOMParentNode *p ) { - DOMElementImpl* dummy = 0; - XMLSize_t parentOffset = (char *)&(dummy->fParent) - (char *)dummy; - char *retPtr = (char *)p - parentOffset; - return reinterpret_cast<DOMNode *>(retPtr); +static inline DOMParentNode *castToParentImpl(DOMNode *p) { + HasDOMParentImpl *pE = dynamic_cast<HasDOMParentImpl*>(p); + if (!pE || !pE->getParentNodeImpl()) { + throw DOMException(DOMException::INVALID_STATE_ERR, 0, XMLPlatformUtils::fgMemoryManager); + } + return pE->getParentNodeImpl(); } -static inline DOMNode *castToNode(const DOMNodeImpl *p) { - DOMElementImpl* dummy = 0; - XMLSize_t nodeImplOffset = (char *)&(dummy->fNode) - (char *)dummy; - char *retPtr = (char *)p - nodeImplOffset; - return reinterpret_cast<DOMNode *>(retPtr); +static inline const DOMChildNode *castToChildImpl(const DOMNode *p) { + const HasDOMChildImpl *pE = dynamic_cast<const HasDOMChildImpl*>(p); + if (!pE || !pE->getChildNodeImpl()) { + throw DOMException(DOMException::INVALID_STATE_ERR, 0, XMLPlatformUtils::fgMemoryManager); + } + return pE->getChildNodeImpl(); } - -static inline DOMNodeImpl *castToNodeImpl(const DOMParentNode *p) -{ - DOMElementImpl* dummy = 0; - XMLSize_t nodeImplOffset = (char *)&(dummy->fNode) - (char *)dummy; - XMLSize_t parentOffset = (char *)&(dummy->fParent) - (char *)dummy; - char *retPtr = (char *)p - parentOffset + nodeImplOffset; - return reinterpret_cast<DOMNodeImpl *>(retPtr); +static inline DOMChildNode *castToChildImpl(DOMNode *p) { + HasDOMChildImpl *pE = dynamic_cast<HasDOMChildImpl*>(p); + if (!pE || !pE->getChildNodeImpl()) { + throw DOMException(DOMException::INVALID_STATE_ERR, 0, XMLPlatformUtils::fgMemoryManager); + } + return pE->getChildNodeImpl(); } XERCES_CPP_NAMESPACE_END Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMChildNode.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMChildNode.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMChildNode.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMChildNode.cpp Wed Jul 5 18:52:15 2017 @@ -64,7 +64,7 @@ DOMNode * DOMChildNode::getParentNode(co { // if we have an owner, ownerNode is our parent, otherwise it's // our ownerDocument and we don't have a parent - DOMNodeImpl *thisNodeImpl = castToNodeImpl(thisNode); + const DOMNodeImpl *thisNodeImpl = castToNodeImpl(thisNode); return thisNodeImpl->isOwned() ? thisNodeImpl->fOwnerNode : 0; } Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMCommentImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMCommentImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMCommentImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMCommentImpl.cpp Wed Jul 5 18:52:15 2017 @@ -32,7 +32,7 @@ XERCES_CPP_NAMESPACE_BEGIN DOMCommentImpl::DOMCommentImpl(DOMDocument *ownerDoc, const XMLCh *dat) - : fNode(ownerDoc), fCharacterData(ownerDoc, dat) + : fNode(this, ownerDoc), fCharacterData(ownerDoc, dat) { fNode.setIsLeafNode(true); } @@ -40,7 +40,7 @@ DOMCommentImpl::DOMCommentImpl(DOMDocume DOMCommentImpl::DOMCommentImpl(const DOMCommentImpl &other, bool) - : fNode(other.fNode), + : fNode(this, other.fNode), fChild(other.fChild), fCharacterData(other.fCharacterData) { @@ -186,4 +186,8 @@ DOMComment *DOMCommentImpl::splitText(XM void DOMCommentImpl::setData(const XMLCh *data) {fCharacterData.setData(this, data);} void DOMCommentImpl::setNodeValue(const XMLCh *nodeValue) {fCharacterData.setNodeValue (this, nodeValue); } +// Macro-in implementation accessors. +DOMNODEIMPL_IMPL(DOMCommentImpl); +DOMCHILDIMPL_IMPL(DOMCommentImpl); + XERCES_CPP_NAMESPACE_END Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMCommentImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMCommentImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMCommentImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMCommentImpl.hpp Wed Jul 5 18:52:15 2017 @@ -35,6 +35,7 @@ #include <xercesc/util/XercesDefs.hpp> #include <xercesc/dom/DOMComment.hpp> +#include "DOMNodeBase.hpp" #include "DOMNodeImpl.hpp" #include "DOMChildNode.hpp" #include "DOMCharacterDataImpl.hpp" @@ -42,7 +43,7 @@ XERCES_CPP_NAMESPACE_BEGIN -class CDOM_EXPORT DOMCommentImpl: public DOMComment { +class CDOM_EXPORT DOMCommentImpl: public DOMComment, public HasDOMNodeImpl, public HasDOMChildImpl { public: DOMNodeImpl fNode; DOMChildNode fChild; @@ -57,6 +58,10 @@ public: // Declare all of the functions from DOMNode. DOMNODE_FUNCTIONS; + // Add accessors for implementation bits. + DOMNODEIMPL_DECL; + DOMCHILDIMPL_DECL; + public: // Functions from DOMCharacterData virtual void appendData(const XMLCh *data); Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentFragmentImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentFragmentImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentFragmentImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentFragmentImpl.cpp Wed Jul 5 18:52:15 2017 @@ -29,14 +29,14 @@ XERCES_CPP_NAMESPACE_BEGIN DOMDocumentFragmentImpl::DOMDocumentFragmentImpl(DOMDocument *masterDoc) - : fNode(masterDoc), fParent(masterDoc) + : fNode(this, masterDoc), fParent(this, masterDoc) { } DOMDocumentFragmentImpl::DOMDocumentFragmentImpl(const DOMDocumentFragmentImpl &other, bool deep) - : fNode(other.fNode), fParent(other.fParent) + : fNode(this, other.fNode), fParent(this, other.fParent) { if (deep) castToParentImpl(this)->cloneChildren(&other); @@ -134,4 +134,8 @@ void DOMDocumentFragmentImpl::release() const XMLCh* DOMDocumentFragmentImpl::lookupNamespaceURI(const XMLCh* prefix) const {return fNode.lookupNamespaceURI(prefix); } void* DOMDocumentFragmentImpl::getFeature(const XMLCh* feature, const XMLCh* version) const {return fNode.getFeature(feature, version); } +// Macro-in implementation accessors. +DOMNODEIMPL_IMPL(DOMDocumentFragmentImpl); +DOMPARENTIMPL_IMPL(DOMDocumentFragmentImpl); + XERCES_CPP_NAMESPACE_END Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentFragmentImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentFragmentImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentFragmentImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentFragmentImpl.hpp Wed Jul 5 18:52:15 2017 @@ -33,13 +33,15 @@ #include <xercesc/util/XercesDefs.hpp> #include <xercesc/dom/DOMDocumentFragment.hpp> +#include "DOMNodeBase.hpp" #include "DOMParentNode.hpp" #include "DOMNodeImpl.hpp" XERCES_CPP_NAMESPACE_BEGIN -class CDOM_EXPORT DOMDocumentFragmentImpl: public DOMDocumentFragment { +class CDOM_EXPORT DOMDocumentFragmentImpl: public DOMDocumentFragment, + public HasDOMNodeImpl, public HasDOMParentImpl { protected: DOMNodeImpl fNode; DOMParentNode fParent; @@ -61,6 +63,10 @@ public: public: // Declare all of the functions from DOMNode. DOMNODE_FUNCTIONS; + + // Add accessors for implementation bits. + DOMNODEIMPL_DECL; + DOMPARENTIMPL_DECL; }; XERCES_CPP_NAMESPACE_END Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp Wed Jul 5 18:52:15 2017 @@ -79,8 +79,8 @@ void XMLInitializer::initializeDOMHeap ( // allocate. // DOMDocumentImpl::DOMDocumentImpl(DOMImplementation* domImpl, MemoryManager* const manager) - : fNode(this), - fParent(this), + : fNode(this, this), + fParent(this, this), fNodeIDMap(0), fInputEncoding(0), fXmlEncoding(0), @@ -122,8 +122,8 @@ DOMDocumentImpl::DOMDocumentImpl(const X DOMDocumentType *doctype, DOMImplementation* domImpl, MemoryManager* const manager) - : fNode(this), - fParent(this), + : fNode(this, this), + fParent(this, this), fNodeIDMap(0), fInputEncoding(0), fXmlEncoding(0), @@ -709,7 +709,7 @@ void DOMDocumentImpl::removeRange(DOMRan ????? It feels like there must be a more efficient solution, but for the life of me I can't think what it would be. */ -bool DOMDocumentImpl::isKidOK(DOMNode *parent, DOMNode *child) +bool DOMDocumentImpl::isKidOK(const DOMNode *parent, const DOMNode *child) { static int kidOK[14]; @@ -797,6 +797,9 @@ int DOMDocumentImpl::changes const XMLCh* DOMDocumentImpl::lookupNamespaceURI(const XMLCh* prefix) const {return fNode.lookupNamespaceURI(prefix); } +// Macro-in implementation accessors. +DOMNODEIMPL_IMPL(DOMDocumentImpl); +DOMPARENTIMPL_IMPL(DOMDocumentImpl); //----------------------------------------------------------------------- Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.hpp Wed Jul 5 18:52:15 2017 @@ -40,6 +40,7 @@ #include <xercesc/dom/DOMDocument.hpp> #include <xercesc/dom/DOMUserDataHandler.hpp> #include <xercesc/dom/DOMMemoryManager.hpp> +#include "DOMNodeBase.hpp" #include "DOMNodeImpl.hpp" #include "DOMStringPool.hpp" #include "DOMParentNode.hpp" @@ -79,7 +80,8 @@ typedef RefVectorOf<DOMNodeIteratorImpl> typedef KeyRefPair<void, DOMUserDataHandler> DOMUserDataRecord; typedef RefStackOf<DOMNode> DOMNodePtr; -class CDOM_EXPORT DOMDocumentImpl: public XMemory, public DOMMemoryManager, public DOMDocument { +class CDOM_EXPORT DOMDocumentImpl: public XMemory, public DOMMemoryManager, public DOMDocument, + public HasDOMNodeImpl, public HasDOMParentImpl { public: // ----------------------------------------------------------------------- // data @@ -103,6 +105,10 @@ public: // Add all functions that are pure virtual in DOMNODE DOMNODE_FUNCTIONS; + // Add accessors for implementation bits. + DOMNODEIMPL_DECL; + DOMPARENTIMPL_DECL; + public: // Add all functions that are pure virtual in DOMDocument virtual DOMAttr* createAttribute(const XMLCh *name); @@ -251,7 +257,7 @@ public: //Return the index > 0 of ':' in the given qualified name qName="prefix:localName". //Return 0 if there is no ':', or -1 if qName is malformed such as ":abcd". static int indexofQualifiedName(const XMLCh * qName); - static bool isKidOK(DOMNode *parent, DOMNode *child); + static bool isKidOK(const DOMNode *parent, const DOMNode *child); inline DOMNodeIDMap* getNodeIDMap() {return fNodeIDMap;}; Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentTypeImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentTypeImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentTypeImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentTypeImpl.cpp Wed Jul 5 18:52:15 2017 @@ -60,8 +60,8 @@ void XMLInitializer::terminateDOMDocumen DOMDocumentTypeImpl::DOMDocumentTypeImpl(DOMDocument *ownerDoc, const XMLCh *dtName, bool heap) - : fNode(ownerDoc), - fParent(ownerDoc), + : fNode(this, ownerDoc), + fParent(this, ownerDoc), fName(0), fEntities(0), fNotations(0), @@ -97,8 +97,8 @@ DOMDocumentTypeImpl::DOMDocumentTypeImpl const XMLCh *pubId, const XMLCh *sysId, bool heap) - : fNode(ownerDoc), - fParent(ownerDoc), + : fNode(this, ownerDoc), + fParent(this, ownerDoc), fName(0), fEntities(0), fNotations(0), @@ -169,8 +169,8 @@ DOMDocumentTypeImpl::DOMDocumentTypeImpl DOMDocumentTypeImpl::DOMDocumentTypeImpl(const DOMDocumentTypeImpl &other, bool heap, bool deep) - : fNode(other.fNode), - fParent(other.fParent), + : fNode(this, other.fNode), + fParent(this, other.fParent), fChild(other.fChild), fName(0), fEntities(0), @@ -440,6 +440,11 @@ void DOMDocumentTypeImpl::release() bool DOMDocumentTypeImpl::isDefaultNamespace(const XMLCh* namespaceURI) const {return fNode.isDefaultNamespace(namespaceURI); } const XMLCh* DOMDocumentTypeImpl::lookupNamespaceURI(const XMLCh* prefix) const {return fNode.lookupNamespaceURI(prefix); } +// Macro-in implementation accessors. +DOMNODEIMPL_IMPL(DOMDocumentTypeImpl); +DOMPARENTIMPL_IMPL(DOMDocumentTypeImpl); +DOMCHILDIMPL_IMPL(DOMDocumentTypeImpl); + bool DOMDocumentTypeImpl::isEqualNode(const DOMNode* arg) const { Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentTypeImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentTypeImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentTypeImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentTypeImpl.hpp Wed Jul 5 18:52:15 2017 @@ -35,6 +35,7 @@ #include <xercesc/util/XercesDefs.hpp> #include <xercesc/dom/DOMDocumentType.hpp> +#include "DOMNodeBase.hpp" #include "DOMNodeImpl.hpp" #include "DOMChildNode.hpp" #include "DOMParentNode.hpp" @@ -44,7 +45,8 @@ XERCES_CPP_NAMESPACE_BEGIN class DOMNamedNodeMapImpl; -class CDOM_EXPORT DOMDocumentTypeImpl: public DOMDocumentType { +class CDOM_EXPORT DOMDocumentTypeImpl: public DOMDocumentType, + public HasDOMNodeImpl, public HasDOMParentImpl, public HasDOMChildImpl { protected: DOMNodeImpl fNode; DOMParentNode fParent; @@ -81,6 +83,11 @@ public: // Declare all of the functions from DOMNode. DOMNODE_FUNCTIONS; + // Add accessors for implementation bits. + DOMNODEIMPL_DECL; + DOMPARENTIMPL_DECL; + DOMCHILDIMPL_DECL; + public: virtual void setOwnerDocument(DOMDocument *doc); virtual DOMNamedNodeMap * getEntities() const; Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp Wed Jul 5 18:52:15 2017 @@ -43,7 +43,7 @@ XERCES_CPP_NAMESPACE_BEGIN class DOMAttr; DOMElementImpl::DOMElementImpl(DOMDocument *ownerDoc, const XMLCh *eName) - : fNode(ownerDoc), fParent(ownerDoc), fAttributes(0), fDefaultAttributes(0) + : fNode(this, ownerDoc), fParent(this, ownerDoc), fAttributes(0), fDefaultAttributes(0) { DOMDocumentImpl *docImpl = (DOMDocumentImpl *)ownerDoc; fName = docImpl->getPooledString(eName); @@ -60,8 +60,8 @@ DOMElementImpl::DOMElementImpl(DOMDocume DOMElementImpl::DOMElementImpl(const DOMElementImpl &other, bool deep) : DOMElement(other), - fNode (other.fParent.fOwnerDocument), - fParent (other.fParent.fOwnerDocument), + fNode(this, other.fParent.fOwnerDocument), + fParent(this, other.fParent.fOwnerDocument), fAttributes(0), fDefaultAttributes(0) { @@ -579,7 +579,10 @@ const XMLCh* DOMElementImpl::getBaseURI( const XMLCh* DOMElementImpl::lookupNamespaceURI(const XMLCh* prefix) const {return fNode.lookupNamespaceURI(prefix); } void* DOMElementImpl::getFeature(const XMLCh* feature, const XMLCh* version) const {return fNode.getFeature(feature, version); } - +// Macro-in implementation accessors. +DOMNODEIMPL_IMPL(DOMElementImpl); +DOMPARENTIMPL_IMPL(DOMElementImpl); +DOMCHILDIMPL_IMPL(DOMElementImpl); bool DOMElementImpl::isEqualNode(const DOMNode* arg) const { Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.hpp Wed Jul 5 18:52:15 2017 @@ -36,6 +36,7 @@ #include <xercesc/util/XMLString.hpp> #include <xercesc/dom/DOMElement.hpp> +#include "DOMNodeBase.hpp" #include "DOMChildNode.hpp" #include "DOMNodeImpl.hpp" #include "DOMParentNode.hpp" @@ -52,7 +53,8 @@ class DOMDocument; -class CDOM_EXPORT DOMElementImpl: public DOMElement { +class CDOM_EXPORT DOMElementImpl: public DOMElement, + public HasDOMNodeImpl, public HasDOMParentImpl, public HasDOMChildImpl { public: DOMNodeImpl fNode; DOMParentNode fParent; @@ -71,6 +73,11 @@ public: // Declare functions from DOMNode. They all must be implemented by this class DOMNODE_FUNCTIONS; + // Add accessors for implementation bits. + DOMNODEIMPL_DECL; + DOMPARENTIMPL_DECL; + DOMCHILDIMPL_DECL; + public: // Functions introduced on Element... virtual const XMLCh* getAttribute(const XMLCh *name) const; Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMEntityImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMEntityImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMEntityImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMEntityImpl.cpp Wed Jul 5 18:52:15 2017 @@ -28,8 +28,8 @@ XERCES_CPP_NAMESPACE_BEGIN DOMEntityImpl::DOMEntityImpl(DOMDocument *ownerDoc, const XMLCh *eName) - : fNode(ownerDoc), - fParent(ownerDoc), + : fNode(this, ownerDoc), + fParent(this, ownerDoc), fPublicId(0), fSystemId(0), fNotationName(0), @@ -47,8 +47,8 @@ DOMEntityImpl::DOMEntityImpl(DOMDocument DOMEntityImpl::DOMEntityImpl(const DOMEntityImpl &other, bool deep) : DOMEntity(other), - fNode(other.fNode), - fParent(other.fParent), + fNode(this, other.fNode), + fParent(this, other.fParent), fName(other.fName), fPublicId(other.fPublicId), fSystemId(other.fSystemId), @@ -263,6 +263,9 @@ void DOMEntityImpl::release() const XMLCh* DOMEntityImpl::lookupNamespaceURI(const XMLCh* prefix) const {return fNode.lookupNamespaceURI(prefix); } void* DOMEntityImpl::getFeature(const XMLCh* feature, const XMLCh* version) const {return fNode.getFeature(feature, version); } +// Macro-in implementation accessors. +DOMNODEIMPL_IMPL(DOMEntityImpl); +DOMPARENTIMPL_IMPL(DOMEntityImpl); //Introduced in DOM Level 3 const XMLCh* DOMEntityImpl::getInputEncoding() const { Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMEntityImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMEntityImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMEntityImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMEntityImpl.hpp Wed Jul 5 18:52:15 2017 @@ -32,6 +32,7 @@ // #include <xercesc/util/XercesDefs.hpp> +#include "DOMNodeBase.hpp" #include "DOMNodeImpl.hpp" #include "DOMParentNode.hpp" #include <xercesc/dom/DOMEntity.hpp> @@ -41,7 +42,7 @@ XERCES_CPP_NAMESPACE_BEGIN class DOMEntityReference; -class CDOM_EXPORT DOMEntityImpl: public DOMEntity { +class CDOM_EXPORT DOMEntityImpl: public DOMEntity, public HasDOMNodeImpl, public HasDOMParentImpl { protected: DOMNodeImpl fNode; DOMParentNode fParent; @@ -73,6 +74,10 @@ public: // Declare all of the functions from DOMNode. DOMNODE_FUNCTIONS; + // Add accessors for implementation bits. + DOMNODEIMPL_DECL; + DOMPARENTIMPL_DECL; + public: virtual const XMLCh * getPublicId() const; virtual const XMLCh * getSystemId() const; Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp Wed Jul 5 18:52:15 2017 @@ -32,7 +32,7 @@ XERCES_CPP_NAMESPACE_BEGIN DOMEntityReferenceImpl::DOMEntityReferenceImpl(DOMDocument *ownerDoc, const XMLCh *entityName) - : fNode(ownerDoc), fParent(ownerDoc), fBaseURI(0) + : fNode(this, ownerDoc), fParent(this, ownerDoc), fBaseURI(0) { fName = ((DOMDocumentImpl*)fParent.fOwnerDocument)->getPooledString(entityName); // EntityReference behaves as a read-only node, since its contents @@ -61,7 +61,7 @@ DOMEntityReferenceImpl::DOMEntityReferen DOMEntityReferenceImpl::DOMEntityReferenceImpl(DOMDocument *ownerDoc, const XMLCh *entityName, bool cloneChild) - : fNode(ownerDoc), fParent(ownerDoc), fBaseURI(0) + : fNode(this, ownerDoc), fParent(this, ownerDoc), fBaseURI(0) { fName = ((DOMDocumentImpl*)fParent.fOwnerDocument)->getPooledString(entityName); // EntityReference behaves as a read-only node, since its contents @@ -88,11 +88,10 @@ DOMEntityReferenceImpl::DOMEntityReferen fNode.setReadOnly(true, true); } -DOMEntityReferenceImpl::DOMEntityReferenceImpl(const DOMEntityReferenceImpl &other, - bool deep) +DOMEntityReferenceImpl::DOMEntityReferenceImpl(const DOMEntityReferenceImpl &other, bool deep) : DOMEntityReference(other), - fNode(other.fNode), - fParent(other.fParent), + fNode(this, other.fNode), + fParent(this, other.fParent), fChild(other.fChild), fName(other.fName), fBaseURI(other.fBaseURI) @@ -220,4 +219,9 @@ const XMLCh* DOMEntityReferenceImpl::get const XMLCh* DOMEntityReferenceImpl::lookupNamespaceURI(const XMLCh* prefix) const {return fNode.lookupNamespaceURI(prefix); } void* DOMEntityReferenceImpl::getFeature(const XMLCh* feature, const XMLCh* version) const {return fNode.getFeature(feature, version); } +// Macro-in implementation accessors. +DOMNODEIMPL_IMPL(DOMEntityReferenceImpl); +DOMPARENTIMPL_IMPL(DOMEntityReferenceImpl); +DOMCHILDIMPL_IMPL(DOMEntityReferenceImpl); + XERCES_CPP_NAMESPACE_END Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp Wed Jul 5 18:52:15 2017 @@ -33,7 +33,7 @@ #include <xercesc/util/XercesDefs.hpp> #include <xercesc/dom/DOMEntityReference.hpp> - +#include "DOMNodeBase.hpp" #include "DOMParentNode.hpp" #include "DOMChildNode.hpp" #include "DOMNodeImpl.hpp" @@ -41,7 +41,8 @@ XERCES_CPP_NAMESPACE_BEGIN -class CDOM_EXPORT DOMEntityReferenceImpl: public DOMEntityReference +class CDOM_EXPORT DOMEntityReferenceImpl: public DOMEntityReference, + public HasDOMNodeImpl, public HasDOMParentImpl, public HasDOMChildImpl { protected: DOMNodeImpl fNode; @@ -62,6 +63,11 @@ public: public: // Declare all of the functions from DOMNode. DOMNODE_FUNCTIONS; + + // Add accessors for implementation bits. + DOMNODEIMPL_DECL; + DOMPARENTIMPL_DECL; + DOMCHILDIMPL_DECL; public: virtual void setReadOnly(bool readOnly,bool deep); Added: xerces/c/trunk/src/xercesc/dom/impl/DOMNodeBase.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMNodeBase.hpp?rev=1800911&view=auto ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMNodeBase.hpp (added) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMNodeBase.hpp Wed Jul 5 18:52:15 2017 @@ -0,0 +1,244 @@ +/* + * 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. + */ + +/* + * $Id:$ + */ + +#if !defined(XERCESC_INCLUDE_GUARD_DOMNODEBASE_HPP) +#define XERCESC_INCLUDE_GUARD_DOMNODEBASE_HPP + +#include <xercesc/util/XercesDefs.hpp> + +XERCES_CPP_NAMESPACE_BEGIN + + +class DOMNodeImpl; +class DOMParentNode; +class DOMChildNode; + +// +// This file is part of the internal implementation of the C++ XML DOM. +// It should NOT be included or used directly by application programs. +// +// Applications should include the file <xercesc/dom/DOM.hpp> for the entire +// DOM API, or xercesc/dom/DOM*.hpp for individual DOM classes, where the class +// name is substituded for the *. +// + +/** + * Virtual base class with accessors for shared characteristics of DOM implementation + * types, this is a workaround for the current class design that allows the various + * implementation classes to punch into the internals of each others members without + * using unsafe casts that depend on object layout. + */ +class CDOM_EXPORT HasDOMNodeImpl { +protected: + // ----------------------------------------------------------------------- + // Hidden constructor + // ----------------------------------------------------------------------- + /** @name Hidden constructors */ + //@{ + HasDOMNodeImpl() {} + //@} + +private: + // ----------------------------------------------------------------------- + // Unimplemented constructors and operators + // ----------------------------------------------------------------------- + /** @name Unimplemented operators */ + //@{ + HasDOMNodeImpl & operator= (const HasDOMNodeImpl &); + //@} + +public: + // ----------------------------------------------------------------------- + // All constructors are hidden, just the destructor is available + // ----------------------------------------------------------------------- + /** @name Destructor */ + //@{ + /** + * Destructor + * + */ + virtual ~HasDOMNodeImpl() {}; + //@} + + // ----------------------------------------------------------------------- + // Virtual HasDOMNodeImpl interface + // ----------------------------------------------------------------------- + //@{ + // ----------------------------------------------------------------------- + // Getter methods + // ----------------------------------------------------------------------- + + /** + * Gets the embedded <code>DOMNodeImpl</code> member. + */ + virtual DOMNodeImpl *getNodeImpl() = 0; + + /** + * Gets the embedded <code>DOMNodeImpl</code> member. + */ + virtual const DOMNodeImpl *getNodeImpl() const = 0; + //@} +}; + +/** + * Virtual base class with accessors for shared characteristics of DOM implementation + * types, this is a workaround for the current class design that allows the various + * implementation classes to punch into the internals of each others members without + * using unsafe casts that depend on object layout. + */ +class CDOM_EXPORT HasDOMParentImpl { +protected: + // ----------------------------------------------------------------------- + // Hidden constructor + // ----------------------------------------------------------------------- + /** @name Hidden constructors */ + //@{ + HasDOMParentImpl() {} + //@} + +private: + // ----------------------------------------------------------------------- + // Unimplemented constructors and operators + // ----------------------------------------------------------------------- + /** @name Unimplemented operators */ + //@{ + HasDOMParentImpl & operator= (const HasDOMParentImpl &); + //@} + +public: + // ----------------------------------------------------------------------- + // All constructors are hidden, just the destructor is available + // ----------------------------------------------------------------------- + /** @name Destructor */ + //@{ + /** + * Destructor + * + */ + virtual ~HasDOMParentImpl() {}; + //@} + + // ----------------------------------------------------------------------- + // Virtual HasDOMParentImpl interface + // ----------------------------------------------------------------------- + //@{ + // ----------------------------------------------------------------------- + // Getter methods + // ----------------------------------------------------------------------- + + /** + * Gets the embedded <code>DOMParentNode</code> member. + */ + virtual DOMParentNode *getParentNodeImpl() = 0; + + /** + * Gets the embedded <code>DOMParentNode</code> member. + */ + virtual const DOMParentNode *getParentNodeImpl() const = 0; + //@} +}; + +/** + * Virtual base class with accessors for shared characteristics of DOM implementation + * types, this is a workaround for the current class design that allows the various + * implementation classes to punch into the internals of each others members without + * using unsafe casts that depend on object layout. + */ +class CDOM_EXPORT HasDOMChildImpl { +protected: + // ----------------------------------------------------------------------- + // Hidden constructor + // ----------------------------------------------------------------------- + /** @name Hidden constructors */ + //@{ + HasDOMChildImpl() {} + //@} + +private: + // ----------------------------------------------------------------------- + // Unimplemented constructors and operators + // ----------------------------------------------------------------------- + /** @name Unimplemented operators */ + //@{ + HasDOMChildImpl & operator= (const HasDOMChildImpl &); + //@} + +public: + // ----------------------------------------------------------------------- + // All constructors are hidden, just the destructor is available + // ----------------------------------------------------------------------- + /** @name Destructor */ + //@{ + /** + * Destructor + * + */ + virtual ~HasDOMChildImpl() {}; + //@} + + // ----------------------------------------------------------------------- + // Virtual HasDOMChildImpl interface + // ----------------------------------------------------------------------- + //@{ + // ----------------------------------------------------------------------- + // Getter methods + // ----------------------------------------------------------------------- + + /** + * Gets the embedded <code>DOMChildNode</code> member. + */ + virtual DOMChildNode *getChildNodeImpl() = 0; + + /** + * Gets the embedded <code>DOMChildNode</code> member. + */ + virtual const DOMChildNode *getChildNodeImpl() const = 0; + //@} +}; + +#define DOMNODEIMPL_DECL \ + virtual DOMNodeImpl* getNodeImpl(); \ + virtual const DOMNodeImpl* getNodeImpl() const; + +#define DOMNODEIMPL_IMPL(classname) \ + DOMNodeImpl* classname::getNodeImpl() {return &fNode;} \ + const DOMNodeImpl* classname::getNodeImpl() const {return &fNode;} + +#define DOMPARENTIMPL_DECL \ + virtual DOMParentNode* getParentNodeImpl(); \ + virtual const DOMParentNode* getParentNodeImpl() const; + +#define DOMPARENTIMPL_IMPL(classname) \ + DOMParentNode* classname::getParentNodeImpl() {return &fParent;} \ + const DOMParentNode* classname::getParentNodeImpl() const {return &fParent;} + +#define DOMCHILDIMPL_DECL \ + virtual DOMChildNode* getChildNodeImpl(); \ + virtual const DOMChildNode* getChildNodeImpl() const; + +#define DOMCHILDIMPL_IMPL(classname) \ + DOMChildNode* classname::getChildNodeImpl() {return &fChild;} \ + const DOMChildNode* classname::getChildNodeImpl() const {return &fChild;} + + +XERCES_CPP_NAMESPACE_END + +#endif Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMNodeImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMNodeImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMNodeImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMNodeImpl.cpp Wed Jul 5 18:52:15 2017 @@ -76,17 +76,26 @@ void XMLInitializer::terminateDOMNodeLis // ----------------------------------------------------------------------- // DOMNodeImpl Functions // ----------------------------------------------------------------------- -DOMNodeImpl::DOMNodeImpl(DOMNode *ownerNode) -: fOwnerNode(ownerNode) +DOMNodeImpl::DOMNodeImpl(DOMNode* containingNode, DOMNode *ownerNode) +: fContainingNode(containingNode), fOwnerNode(ownerNode) { + if (!fContainingNode) { + throw DOMException(DOMException::INVALID_STATE_ERR, 0, GetDOMNodeMemoryManager); + } + this->flags = 0; // as long as we do not have any owner, fOwnerNode is our ownerDocument } // This only makes a shallow copy, cloneChildren must also be called for a // deep clone -DOMNodeImpl::DOMNodeImpl(const DOMNodeImpl &other) +DOMNodeImpl::DOMNodeImpl(DOMNode* containingNode, const DOMNodeImpl &other) + : fContainingNode(containingNode) { + if (!fContainingNode) { + throw DOMException(DOMException::INVALID_STATE_ERR, 0, GetDOMNodeMemoryManager); + } + this->flags = other.flags; this->isReadOnly(false); @@ -100,6 +109,13 @@ DOMNodeImpl::DOMNodeImpl(const DOMNodeIm DOMNodeImpl::~DOMNodeImpl() { } +DOMNode* DOMNodeImpl::getContainingNode() { + return fContainingNode; +} + +const DOMNode* DOMNodeImpl::getContainingNode() const { + return fContainingNode; +} DOMNode * DOMNodeImpl::appendChild(DOMNode *) { @@ -151,8 +167,9 @@ DOMDocument *DOMNodeImpl::getOwnerDocume { if (!this->isLeafNode()) { - DOMElementImpl *ep = (DOMElementImpl *)castToNode(this); - return ep->fParent.fOwnerDocument; + const DOMNode *ep = getContainingNode(); + const DOMParentNode* parent = castToParentImpl(getContainingNode()); + return parent ? parent->fOwnerDocument : 0; } // Leaf node types - those that cannot have children, like Text. @@ -236,7 +253,7 @@ void DOMNodeImpl::setReadOnly(bool readO this->isReadOnly(readOnl); if (deep) { - for (DOMNode *mykid = castToNode(this)->getFirstChild(); + for (DOMNode *mykid = getContainingNode()->getFirstChild(); mykid != 0; mykid = mykid->getNextSibling()) { @@ -364,7 +381,7 @@ void DOMNodeImpl::callUserDataHandlers(D bool DOMNodeImpl::isSameNode(const DOMNode* other) const { - return (castToNode(this) == other); + return (getContainingNode() == other); } bool DOMNodeImpl::isEqualNode(const DOMNode* arg) const @@ -376,7 +393,7 @@ bool DOMNodeImpl::isEqualNode(const DOMN return true; } - DOMNode* thisNode = castToNode(this); + const DOMNode* thisNode = getContainingNode(); if (arg->getNodeType() != thisNode->getNodeType()) { return false; @@ -413,7 +430,7 @@ const XMLCh* DOMNodeImpl::lookupPrefix(c return 0; } - DOMNode *thisNode = castToNode(this); + const DOMNode *thisNode = getContainingNode(); short type = thisNode->getNodeType(); @@ -462,7 +479,7 @@ DOMNode* DOMNodeImpl::getElementAncestor const XMLCh* DOMNodeImpl::lookupPrefix(const XMLCh* const namespaceURI, DOMElement *originalElement) const { - DOMNode *thisNode = castToNode(this); + const DOMNode *thisNode = getContainingNode(); const XMLCh* ns = thisNode->getNamespaceURI(); // REVISIT: if no prefix is available is it null or empty string, or @@ -510,7 +527,7 @@ const XMLCh* DOMNodeImpl::lookupPrefix(c } const XMLCh* DOMNodeImpl::lookupNamespaceURI(const XMLCh* specifiedPrefix) const { - DOMNode *thisNode = castToNode(this); + const DOMNode *thisNode = getContainingNode(); short type = thisNode->getNodeType(); switch (type) { @@ -575,7 +592,7 @@ const XMLCh* DOMNodeImpl::lookupNamespac return 0; } default:{ - DOMNode *ancestor = getElementAncestor(castToNode(this)); + DOMNode *ancestor = getElementAncestor(getContainingNode()); if (ancestor != 0) { return ancestor->lookupNamespaceURI(specifiedPrefix); } @@ -586,7 +603,7 @@ const XMLCh* DOMNodeImpl::lookupNamespac const XMLCh* DOMNodeImpl::getBaseURI() const{ - DOMNode *thisNode = castToNode(this); + const DOMNode *thisNode = getContainingNode(); DOMNode* parent = thisNode->getParentNode(); if (parent) return parent->getBaseURI(); @@ -608,8 +625,8 @@ const DOMNode* DOMNodeImpl::getTreePar return 0; } -short DOMNodeImpl::compareDocumentPosition(const DOMNode* other) const { - DOMNode* thisNode = castToNode(this); +short DOMNodeImpl::compareDocumentPosition(const DOMNode* other) const { + const DOMNode* thisNode = getContainingNode(); // If the two nodes being compared are the same node, then no flags are set on the return. if (thisNode == other) @@ -639,7 +656,7 @@ short DOMNodeImpl::compareDoc // its attribute node and its child node, which both follow it. const DOMNode* tmpNode; - const DOMNode* myRoot = castToNode(this); + const DOMNode* myRoot = getContainingNode(); int myDepth=0; while((tmpNode=getTreeParentNode(myRoot))!=0) { @@ -676,7 +693,7 @@ short DOMNodeImpl::compareDoc // are or contain the corresponding nodes being compared. // if the two depths are different, go to the same one - myRoot = castToNode(this); + myRoot = getContainingNode(); hisRoot = other; if (myDepth > hisDepth) { for (int i= 0 ; i < myDepth - hisDepth; i++) @@ -829,7 +846,7 @@ const XMLCh* DOMNodeImpl::getTextCont if (pzBuffer) *pzBuffer = 0; - DOMNode *thisNode = castToNode(this); + const DOMNode *thisNode = getContainingNode(); switch (thisNode->getNodeType()) { @@ -907,8 +924,8 @@ const XMLCh* DOMNodeImpl::getTextCont } -void DOMNodeImpl::setTextContent(const XMLCh* textContent){ - DOMNode *thisNode = castToNode(this); +void DOMNodeImpl::setTextContent(const XMLCh* textContent) { + DOMNode *thisNode = getContainingNode(); switch (thisNode->getNodeType()) { case DOMNode::ELEMENT_NODE: @@ -957,8 +974,8 @@ void DOMNodeImpl::setTextContent(const X } -bool DOMNodeImpl::isDefaultNamespace(const XMLCh* namespaceURI) const{ - DOMNode *thisNode = castToNode(this); +bool DOMNodeImpl::isDefaultNamespace(const XMLCh* namespaceURI) const { + const DOMNode *thisNode = getContainingNode(); short type = thisNode->getNodeType(); switch (type) { case DOMNode::ELEMENT_NODE: { Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMNodeImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMNodeImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMNodeImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMNodeImpl.hpp Wed Jul 5 18:52:15 2017 @@ -65,6 +65,7 @@ class CDOM_EXPORT DOMNodeImpl { public: // data + DOMNode *fContainingNode; // the impl object that we're contained by DOMNode *fOwnerNode; // typically the parent but not always! unsigned short flags; @@ -85,10 +86,18 @@ public: public: - DOMNodeImpl(DOMNode *ownerDocument); - DOMNodeImpl(const DOMNodeImpl &other); + DOMNodeImpl(DOMNode* containingNode, DOMNode *ownerDocument); + DOMNodeImpl(DOMNode* containingNode, const DOMNodeImpl &other); ~DOMNodeImpl(); +private: + // Make sure this can't be called to corrupt the containing node ptr. + DOMNodeImpl(const DOMNodeImpl &other); + + DOMNode* getContainingNode(); + const DOMNode* getContainingNode() const; + +public: DOMNode * appendChild(DOMNode *newChild); DOMNamedNodeMap * getAttributes() const; DOMNodeList * getChildNodes() const; Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMNotationImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMNotationImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMNotationImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMNotationImpl.cpp Wed Jul 5 18:52:15 2017 @@ -27,7 +27,7 @@ XERCES_CPP_NAMESPACE_BEGIN DOMNotationImpl::DOMNotationImpl(DOMDocument *ownerDoc, const XMLCh *nName) - : fNode(ownerDoc), fName(0), fPublicId(0), fSystemId(0), fBaseURI(0) + : fNode(this, ownerDoc), fName(0), fPublicId(0), fSystemId(0), fBaseURI(0) { fNode.setIsLeafNode(true); fName = ((DOMDocumentImpl *)ownerDoc)->getPooledString(nName); @@ -35,7 +35,7 @@ DOMNotationImpl::DOMNotationImpl(DOMDocu DOMNotationImpl::DOMNotationImpl(const DOMNotationImpl &other, bool /*deep*/) : DOMNotation(other), - fNode(other.fNode), + fNode(this, other.fNode), fName(other.fName), fPublicId(other.fPublicId), fSystemId(other.fSystemId), @@ -175,5 +175,8 @@ const XMLCh* DOMNotationImpl::getBaseURI const XMLCh* DOMNotationImpl::lookupNamespaceURI(const XMLCh* prefix) const {return fNode.lookupNamespaceURI(prefix); } void* DOMNotationImpl::getFeature(const XMLCh* feature, const XMLCh* version) const {return fNode.getFeature(feature, version); } +// Macro-in implementation accessors. +DOMNODEIMPL_IMPL(DOMNotationImpl); + XERCES_CPP_NAMESPACE_END Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMNotationImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMNotationImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMNotationImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMNotationImpl.hpp Wed Jul 5 18:52:15 2017 @@ -36,13 +36,13 @@ XERCES_CPP_NAMESPACE_BEGIN - +#include "DOMNodeBase.hpp" #include "DOMNodeImpl.hpp" class DOMDocument; -class CDOM_EXPORT DOMNotationImpl: public DOMNotation { +class CDOM_EXPORT DOMNotationImpl: public DOMNotation, public HasDOMNodeImpl { public: DOMNodeImpl fNode; @@ -61,6 +61,9 @@ public: // Declare all of the functions from DOMNode. DOMNODE_FUNCTIONS; + // Add accessors for implementation bits. + DOMNODEIMPL_DECL; + public: // // The Public Identifier for this Notation. If no public identifier Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMParentNode.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMParentNode.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMParentNode.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMParentNode.cpp Wed Jul 5 18:52:15 2017 @@ -31,22 +31,49 @@ XERCES_CPP_NAMESPACE_BEGIN -DOMParentNode::DOMParentNode(DOMDocument *ownerDoc) - : fOwnerDocument(ownerDoc), fFirstChild(0), fChildNodeList(this) +DOMParentNode::DOMParentNode(DOMNode* containingNode, DOMDocument *ownerDoc) + : fContainingNode(containingNode), fOwnerDocument(ownerDoc), fFirstChild(0), fChildNodeList(this) { + if (!fContainingNode) { + throw DOMException(DOMException::INVALID_STATE_ERR, 0, GetDOMNodeMemoryManager); + } } // This only makes a shallow copy, cloneChildren must also be called for a // deep clone -DOMParentNode::DOMParentNode(const DOMParentNode &other) : - fChildNodeList(this) +DOMParentNode::DOMParentNode(DOMNode* containingNode, const DOMParentNode &other) : + fContainingNode(containingNode), fChildNodeList(this) { + if (!fContainingNode) { + throw DOMException(DOMException::INVALID_STATE_ERR, 0, GetDOMNodeMemoryManager); + } + this->fOwnerDocument = other.fOwnerDocument; // Need to break the association w/ original kids this->fFirstChild = 0; } +DOMParentNode::~DOMParentNode() { + +} + +DOMNode* DOMParentNode::getContainingNode() { + return fContainingNode; +} + +const DOMNode* DOMParentNode::getContainingNode() const { + return fContainingNode; +} + +const DOMNodeImpl* DOMParentNode::getContainingNodeImpl() const { + const HasDOMNodeImpl* p = dynamic_cast<const HasDOMNodeImpl*>(getContainingNode()); + if (!p || !p->getNodeImpl()) { + throw DOMException(DOMException::INVALID_STATE_ERR, 0, GetDOMNodeMemoryManager); + } + return p->getNodeImpl(); +} + void DOMParentNode::changed() { ((DOMDocumentImpl*)fOwnerDocument)->changed(); @@ -141,7 +168,7 @@ DOMNode *DOMParentNode::insertBefore(DOM if(newChild==NULL) throw DOMException(DOMException::HIERARCHY_REQUEST_ERR,0, GetDOMParentNodeMemoryManager); - DOMNodeImpl *thisNodeImpl = castToNodeImpl(this); + const DOMNodeImpl *thisNodeImpl = getContainingNodeImpl(); if (thisNodeImpl->isReadOnly()) throw DOMException(DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, GetDOMParentNodeMemoryManager); @@ -152,7 +179,7 @@ DOMNode *DOMParentNode::insertBefore(DOM //only need to do this if the node has children if(newChild->hasChildNodes()) { bool treeSafe=true; - for(DOMNode *a=castToNode(this)->getParentNode(); + for(DOMNode *a=getContainingNode()->getParentNode(); treeSafe && a!=0; a=a->getParentNode()) treeSafe=(newChild!=a); @@ -161,7 +188,7 @@ DOMNode *DOMParentNode::insertBefore(DOM } // refChild must in fact be a child of this node (or 0) - if (refChild!=0 && refChild->getParentNode() != castToNode(this)) + if (refChild!=0 && refChild->getParentNode() != getContainingNode()) throw DOMException(DOMException::NOT_FOUND_ERR,0, GetDOMParentNodeMemoryManager); // if the new node has to be placed before itself, we don't have to do anything @@ -192,14 +219,14 @@ DOMNode *DOMParentNode::insertBefore(DOM kid!=0; kid=kid->getNextSibling()) { - if (!DOMDocumentImpl::isKidOK(castToNode(this), kid)) + if (!DOMDocumentImpl::isKidOK(getContainingNode(), kid)) throw DOMException(DOMException::HIERARCHY_REQUEST_ERR,0, GetDOMParentNodeMemoryManager); } while(newChild->hasChildNodes()) // Move - castToNode(this)->insertBefore(newChild->getFirstChild(),refChild); + getContainingNode()->insertBefore(newChild->getFirstChild(),refChild); } - else if (!DOMDocumentImpl::isKidOK(castToNode(this), newChild)) + else if (!DOMDocumentImpl::isKidOK(getContainingNode(), newChild)) throw DOMException(DOMException::HIERARCHY_REQUEST_ERR,0, GetDOMParentNodeMemoryManager); else @@ -209,7 +236,7 @@ DOMNode *DOMParentNode::insertBefore(DOM oldparent->removeChild(newChild); // Attach up - castToNodeImpl(newChild)->fOwnerNode = castToNode(this); + castToNodeImpl(newChild)->fOwnerNode = getContainingNode(); castToNodeImpl(newChild)->isOwned(true); // Attach before and after @@ -271,11 +298,11 @@ DOMNode *DOMParentNode::insertBefore(DOM DOMNode *DOMParentNode::removeChild(DOMNode *oldChild) { - if (castToNodeImpl(this)->isReadOnly()) + if (getContainingNodeImpl()->isReadOnly()) throw DOMException( DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, GetDOMParentNodeMemoryManager); - if (oldChild == 0 || oldChild->getParentNode() != castToNode(this)) + if (oldChild == 0 || oldChild->getParentNode() != getContainingNode()) throw DOMException(DOMException::NOT_FOUND_ERR, 0, GetDOMParentNodeMemoryManager); if (fOwnerDocument != 0) { @@ -364,7 +391,7 @@ DOMNode * DOMParentNode::appendChildFast // // Attach up - castToNodeImpl(newChild)->fOwnerNode = castToNode(this); + castToNodeImpl(newChild)->fOwnerNode = getContainingNode(); castToNodeImpl(newChild)->isOwned(true); // Attach before and after @@ -427,10 +454,10 @@ void DOMParentNode::normalize() bool DOMParentNode::isEqualNode(const DOMNode* arg) const { - if (arg && castToNodeImpl(this)->isSameNode(arg)) + if (arg && getContainingNodeImpl()->isSameNode(arg)) return true; - if (arg && castToNodeImpl(this)->isEqualNode(arg)) + if (arg && getContainingNodeImpl()->isEqualNode(arg)) { DOMNode *kid, *argKid; for (kid = fFirstChild, argKid = arg->getFirstChild(); Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMParentNode.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMParentNode.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMParentNode.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMParentNode.hpp Wed Jul 5 18:52:15 2017 @@ -55,14 +55,25 @@ class DOMNodeList; class CDOM_EXPORT DOMParentNode { public: + DOMNode *fContainingNode; // the impl object that we're contained by DOMDocument *fOwnerDocument; // Document this node belongs to DOMNode *fFirstChild; DOMNodeListImpl fChildNodeList; // for GetChildNodes() public: - DOMParentNode(DOMDocument *ownerDocument); + DOMParentNode(DOMNode* containingNode, DOMDocument *ownerDocument); + DOMParentNode(DOMNode* containingNode, const DOMParentNode &other); + ~DOMParentNode(); + +private: + // Make sure this can't be called to corrupt the containing node ptr. DOMParentNode(const DOMParentNode &other); + DOMNode* getContainingNode(); + const DOMNode* getContainingNode() const; + const DOMNodeImpl* getContainingNodeImpl() const; + +public: DOMDocument * getOwnerDocument() const; void setOwnerDocument(DOMDocument* doc); Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMProcessingInstructionImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMProcessingInstructionImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMProcessingInstructionImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMProcessingInstructionImpl.cpp Wed Jul 5 18:52:15 2017 @@ -33,7 +33,7 @@ XERCES_CPP_NAMESPACE_BEGIN DOMProcessingInstructionImpl::DOMProcessingInstructionImpl(DOMDocument *ownerDoc, const XMLCh *targt, const XMLCh *dat) - : fNode(ownerDoc), fCharacterData(ownerDoc, dat), fBaseURI(0) + : fNode(this, ownerDoc), fCharacterData(ownerDoc, dat), fBaseURI(0) { fNode.setIsLeafNode(true); this->fTarget = ((DOMDocumentImpl *)ownerDoc)->cloneString(targt); @@ -44,7 +44,7 @@ DOMProcessingInstructionImpl::DOMProcess const DOMProcessingInstructionImpl &other, bool /*deep*/) : DOMProcessingInstruction(other), - fNode(other.fNode), + fNode(this, other.fNode), fChild(other.fChild), fCharacterData(other.fCharacterData), fTarget(other.fTarget), @@ -198,6 +198,10 @@ DOMProcessingInstruction *DOMProcessingI const XMLCh* DOMProcessingInstructionImpl::lookupNamespaceURI(const XMLCh* prefix) const {return fNode.lookupNamespaceURI(prefix); } void* DOMProcessingInstructionImpl::getFeature(const XMLCh* feature, const XMLCh* version) const {return fNode.getFeature(feature, version); } +// Macro-in implementation accessors. +DOMNODEIMPL_IMPL(DOMProcessingInstructionImpl); +DOMCHILDIMPL_IMPL(DOMProcessingInstructionImpl); + // // Delegation of CharacerData functions. // Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMProcessingInstructionImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMProcessingInstructionImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMProcessingInstructionImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMProcessingInstructionImpl.hpp Wed Jul 5 18:52:15 2017 @@ -34,6 +34,7 @@ #include <xercesc/util/XercesDefs.hpp> #include <xercesc/dom/DOMProcessingInstruction.hpp> +#include "DOMNodeBase.hpp" #include "DOMCharacterDataImpl.hpp" #include "DOMNodeImpl.hpp" #include "DOMChildNode.hpp" @@ -44,7 +45,8 @@ XERCES_CPP_NAMESPACE_BEGIN class DocumentImpl; -class CDOM_EXPORT DOMProcessingInstructionImpl: public DOMProcessingInstruction { +class CDOM_EXPORT DOMProcessingInstructionImpl: public DOMProcessingInstruction, + public HasDOMNodeImpl, public HasDOMChildImpl { protected: DOMNodeImpl fNode; DOMChildNode fChild; @@ -66,6 +68,10 @@ public: // Declare all of the functions from DOMNode. DOMNODE_FUNCTIONS; + // Add accessors for implementation bits. + DOMNODEIMPL_DECL; + DOMCHILDIMPL_DECL; + public: virtual const XMLCh *getData() const; virtual const XMLCh *getTarget() const; Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.cpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.cpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.cpp Wed Jul 5 18:52:15 2017 @@ -44,21 +44,21 @@ XERCES_CPP_NAMESPACE_BEGIN class DOMDocument; DOMTextImpl::DOMTextImpl(DOMDocument *ownerDoc, const XMLCh *dat) - : fNode(ownerDoc), fCharacterData(ownerDoc, dat) + : fNode(this, ownerDoc), fCharacterData(ownerDoc, dat) { fNode.setIsLeafNode(true); } DOMTextImpl:: DOMTextImpl(DOMDocument *ownerDoc, const XMLCh* dat, XMLSize_t n) - : fNode(ownerDoc), fCharacterData(ownerDoc, dat, n) + : fNode(this, ownerDoc), fCharacterData(ownerDoc, dat, n) { fNode.setIsLeafNode(true); } DOMTextImpl::DOMTextImpl(const DOMTextImpl &other, bool) : DOMText(other) - , fNode(other.fNode) + , fNode(this, other.fNode) , fCharacterData(other.fCharacterData) { fNode.setIsLeafNode(true); @@ -306,6 +306,10 @@ void DOMTextImpl::release() void* DOMTextImpl::getFeature(const XMLCh* feature, const XMLCh* version) const {return fNode.getFeature(feature, version); } +// Macro-in implementation accessors. +DOMNODEIMPL_IMPL(DOMTextImpl); +DOMCHILDIMPL_IMPL(DOMTextImpl); + // // Delegation of CharacerData functions. Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.hpp?rev=1800911&r1=1800910&r2=1800911&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.hpp (original) +++ xerces/c/trunk/src/xercesc/dom/impl/DOMTextImpl.hpp Wed Jul 5 18:52:15 2017 @@ -35,7 +35,7 @@ #include <xercesc/util/XercesDefs.hpp> #include <xercesc/dom/DOMText.hpp> - +#include "DOMNodeBase.hpp" #include "DOMChildNode.hpp" #include "DOMNodeImpl.hpp" #include "DOMCharacterDataImpl.hpp" @@ -43,7 +43,7 @@ XERCES_CPP_NAMESPACE_BEGIN -class CDOM_EXPORT DOMTextImpl: public DOMText { +class CDOM_EXPORT DOMTextImpl: public DOMText, public HasDOMNodeImpl, public HasDOMChildImpl { public: DOMNodeImpl fNode; DOMChildNode fChild; @@ -68,6 +68,10 @@ public: // Declare the functions coming from DOMNode. DOMNODE_FUNCTIONS; + // Add accessors for implementation bits. + DOMNODEIMPL_DECL; + DOMCHILDIMPL_DECL; + public: // All of the functions coming from DOMCharacterData virtual const XMLCh* getData() const; Propchange: xerces/c/trunk/src/xercesc/util/NetAccessors/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Wed Jul 5 18:52:15 2017 @@ -1 +1 @@ -.deps +.* Propchange: xerces/c/trunk/tests/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Wed Jul 5 18:52:15 2017 @@ -2,13 +2,18 @@ Makefile DOMTest DOMMemTest +DOMTraversalTest +DOMTypeInfoTest +MemHandlerTest Normalizer EncodingTest InitTermTest NetAccessorTest RangeTest +ThreadTest TypeInfo Traversal XSerializerTest XSValueTest +XSTSHarness Makefile.in Propchange: xerces/c/trunk/tests/src/XSTSHarness/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Wed Jul 5 18:52:15 2017 @@ -1 +1 @@ -.deps +.* --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@xerces.apache.org For additional commands, e-mail: commits-h...@xerces.apache.org