diff --git a/src/xercesc/dom/impl/DOMDocumentImpl.cpp b/src/xercesc/dom/impl/DOMDocumentImpl.cpp index c49f0edc509d4b8f50988e4171b41dbcbb35f58b..1a9e0b00bf450a97a59c50a1f0e5127700bf89b3 100644 --- a/src/xercesc/dom/impl/DOMDocumentImpl.cpp +++ b/src/xercesc/dom/impl/DOMDocumentImpl.cpp @@ -68,7 +68,7 @@ static const XMLSize_t kMaxSubAllocationSize = 0x1000; // Any request for more // fNode and fParent constructors used here can not // allocate. // -DOMDocumentImpl::DOMDocumentImpl(MemoryManager* const manager) +DOMDocumentImpl::DOMDocumentImpl(DOMImplementation* domImpl, MemoryManager* const manager) : fNode(this), fParent(this), fNodeIDMap(0), @@ -94,6 +94,7 @@ DOMDocumentImpl::DOMDocumentImpl(MemoryManager* const manager) fRanges(0), fNodeIterators(0), fMemoryManager(manager), + fDOMImplementation(domImpl), fChanges(0), errorChecking(true) { @@ -105,6 +106,7 @@ DOMDocumentImpl::DOMDocumentImpl(MemoryManager* const manager) DOMDocumentImpl::DOMDocumentImpl(const XMLCh *fNamespaceURI, const XMLCh *qualifiedName, DOMDocumentType *doctype, + DOMImplementation* domImpl, MemoryManager* const manager) : fNode(this), fParent(this), @@ -131,6 +133,7 @@ DOMDocumentImpl::DOMDocumentImpl(const XMLCh *fNamespaceURI, fRanges(0), fNodeIterators(0), fMemoryManager(manager), + fDOMImplementation(domImpl), fChanges(0), errorChecking(true) { @@ -211,7 +214,7 @@ DOMDocumentImpl::~DOMDocumentImpl() DOMNode *DOMDocumentImpl::cloneNode(bool deep) const { // Note: the cloned document node goes on the same heap we live in. - DOMDocumentImpl *newdoc = new (fMemoryManager) DOMDocumentImpl(fMemoryManager); + DOMDocumentImpl *newdoc = new (fMemoryManager) DOMDocumentImpl(fDOMImplementation, fMemoryManager); if(fXmlEncoding && *fXmlEncoding) newdoc->setXmlEncoding(fXmlEncoding); if(fXmlVersion && *fXmlVersion) @@ -474,8 +477,8 @@ DOMNodeList *DOMDocumentImpl::getElementsByTagName(const XMLCh *tagname) const DOMImplementation *DOMDocumentImpl::getImplementation() const { - // REVISIT: we should return the implementation that created us - return DOMImplementation::getImplementation(); + + return fDOMImplementation; } diff --git a/src/xercesc/dom/impl/DOMDocumentImpl.hpp b/src/xercesc/dom/impl/DOMDocumentImpl.hpp index 683e00fea38cb52681b05b922067302eea649bea..4512463f40399d65527217edf9c39fe88c36d189 100644 --- a/src/xercesc/dom/impl/DOMDocumentImpl.hpp +++ b/src/xercesc/dom/impl/DOMDocumentImpl.hpp @@ -89,10 +89,11 @@ public: DOMNodeIDMap* fNodeIDMap; // for use by GetElementsById(). public: - DOMDocumentImpl(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); + DOMDocumentImpl(DOMImplementation* domImpl, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); DOMDocumentImpl(const XMLCh* namespaceURI, //DOM Level 2 const XMLCh* qualifiedName, DOMDocumentType* doctype, + DOMImplementation* domImpl, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); virtual ~DOMDocumentImpl(); @@ -332,6 +333,7 @@ private: Ranges* fRanges; NodeIterators* fNodeIterators; MemoryManager* fMemoryManager; // configurable memory manager + DOMImplementation* fDOMImplementation; int fChanges; bool errorChecking; // Bypass error checking. diff --git a/src/xercesc/dom/impl/DOMImplementationImpl.cpp b/src/xercesc/dom/impl/DOMImplementationImpl.cpp index 71be1ca8ce3aec6d075fa5c7e87358f7828a3d2b..1c6d342e6a1734cdb316dd29f63416bffdc68f19 100644 --- a/src/xercesc/dom/impl/DOMImplementationImpl.cpp +++ b/src/xercesc/dom/impl/DOMImplementationImpl.cpp @@ -232,7 +232,7 @@ DOMDocument *DOMImplementationImpl::createDocument(const XMLCh *namespaceURI, const XMLCh *qualifiedName, DOMDocumentType *doctype, MemoryManager* const manager) { - return new (manager) DOMDocumentImpl(namespaceURI, qualifiedName, doctype, manager); + return new (manager) DOMDocumentImpl(namespaceURI, qualifiedName, doctype, this, manager); } @@ -244,7 +244,7 @@ void* DOMImplementationImpl::getFeature(const XMLCh*, const XMLCh*) const { // Non-standard extension DOMDocument *DOMImplementationImpl::createDocument(MemoryManager* const manager) { - return new (manager) DOMDocumentImpl(manager); + return new (manager) DOMDocumentImpl(this, manager); } //