amassari 2005/01/14 02:37:44 Modified: c/src/xercesc/dom/deprecated DOMParser.cpp EntityImpl.cpp EntityImpl.hpp EntityReferenceImpl.cpp Log: When entity reference creation was on, the document created by the parser was leaked (jira# 490) Revision Changes Path 1.35 +6 -9 xml-xerces/c/src/xercesc/dom/deprecated/DOMParser.cpp Index: DOMParser.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/deprecated/DOMParser.cpp,v retrieving revision 1.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- DOMParser.cpp 7 Jan 2005 14:38:22 -0000 1.34 +++ DOMParser.cpp 14 Jan 2005 10:37:08 -0000 1.35 @@ -682,11 +682,15 @@ } -void DOMParser::endEntityReference(const XMLEntityDecl& /*entDecl*/) +void DOMParser::endEntityReference(const XMLEntityDecl& entDecl) { if (fCreateEntityReferenceNodes == true) { if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) { + // stick the parsed content of this entity reference into the entity definition node + EntityImpl* entity = (EntityImpl*)fDocumentType->entities->getNamedItem(entDecl.getName()); + entity->setEntityRef((EntityReferenceImpl*)fCurrentParent.fImpl); + ((DOM_EntityReference&)fCurrentParent).fImpl->setReadOnly(true, true); } fCurrentParent = fNodeStack->pop(); @@ -868,13 +872,6 @@ fNodeStack->push(fCurrentParent); fCurrentParent = er; fCurrentNode = er; - - // this entityRef needs to be stored in Entity map too. - // We'd decide later whether the entity nodes should be created by a - // separated method in parser or not. For now just stick it in if - // the ref nodes are created - EntityImpl* entity = (EntityImpl*)fDocumentType->entities->getNamedItem(entName); - entity->setEntityRef((EntityReferenceImpl*)er.fImpl); } } 1.6 +20 -73 xml-xerces/c/src/xercesc/dom/deprecated/EntityImpl.cpp Index: EntityImpl.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/deprecated/EntityImpl.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- EntityImpl.cpp 8 Sep 2004 13:55:43 -0000 1.5 +++ EntityImpl.cpp 14 Jan 2005 10:37:15 -0000 1.6 @@ -27,13 +27,11 @@ EntityImpl::EntityImpl(DocumentImpl *ownerDoc, const DOMString &eName) - : ParentNode(ownerDoc), - refEntity(0) - + : ParentNode(ownerDoc) { name = eName.clone(); setReadOnly(true, true); -}; +} EntityImpl::EntityImpl(const EntityImpl &other, bool deep) @@ -46,126 +44,75 @@ systemId = other.systemId.clone(); notationName = other.notationName.clone(); - RefCountedImpl::removeRef(refEntity); - refEntity = other.refEntity; - RefCountedImpl::addRef(other.refEntity); - setReadOnly(true, true); -}; +} EntityImpl::~EntityImpl() { -}; +} NodeImpl *EntityImpl::cloneNode(bool deep) { return new (getOwnerDocument()->getMemoryManager()) EntityImpl(*this, deep); -}; +} DOMString EntityImpl::getNodeName() { return name; -}; +} short EntityImpl::getNodeType() { return DOM_Node::ENTITY_NODE; -}; +} DOMString EntityImpl::getNotationName() { return notationName; -}; +} DOMString EntityImpl::getPublicId() { return publicId; -}; +} DOMString EntityImpl::getSystemId() { return systemId; -}; +} void EntityImpl::setNotationName(const DOMString &arg) { notationName = arg; -}; +} void EntityImpl::setPublicId(const DOMString &arg) { publicId = arg; -}; +} void EntityImpl::setSystemId(const DOMString &arg) { systemId = arg; -}; - -void EntityImpl::setEntityRef(EntityReferenceImpl* other) -{ - RefCountedImpl::removeRef(refEntity); - refEntity = other; - RefCountedImpl::addRef(other); -} - -EntityReferenceImpl* EntityImpl::getEntityRef() const -{ - return refEntity; } -void EntityImpl::cloneEntityRefTree() +void EntityImpl::setEntityRef(EntityReferenceImpl* refEntity) { - //lazily clone the entityRef tree to this entity - if (firstChild != 0) - return; + if (firstChild != 0) + return; - if (!refEntity) - return; + if (!refEntity) + return; - setReadOnly(false, true); + setReadOnly(false, true); this->cloneChildren(*refEntity); - setReadOnly(true, true); -} - -NodeImpl * EntityImpl::getFirstChild() -{ - cloneEntityRefTree(); - return firstChild; -}; - -NodeImpl* EntityImpl::getLastChild() -{ - cloneEntityRefTree(); - return lastChild(); -} - -NodeListImpl* EntityImpl::getChildNodes() -{ - cloneEntityRefTree(); - return this; - -} - -bool EntityImpl::hasChildNodes() -{ - cloneEntityRefTree(); - return firstChild!=null; -} - -NodeImpl* EntityImpl::item(unsigned int index) -{ - cloneEntityRefTree(); - ChildNode *node = firstChild; - for(unsigned int i=0; i<index && node!=null; ++i) - node = node->nextSibling; - return node; + setReadOnly(true, true); } XERCES_CPP_NAMESPACE_END 1.6 +3 -14 xml-xerces/c/src/xercesc/dom/deprecated/EntityImpl.hpp Index: EntityImpl.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/deprecated/EntityImpl.hpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- EntityImpl.hpp 8 Sep 2004 13:55:43 -0000 1.5 +++ EntityImpl.hpp 14 Jan 2005 10:37:30 -0000 1.6 @@ -44,10 +44,9 @@ DOMString systemId; DOMString notationName; - EntityReferenceImpl* refEntity; - void cloneEntityRefTree(); + void setEntityRef(EntityReferenceImpl*); - friend class DOMParser; + friend class DOMParser; public: EntityImpl(DocumentImpl*, const DOMString &eName); @@ -63,16 +62,6 @@ virtual void setNotationName(const DOMString &arg); virtual void setPublicId(const DOMString &arg); virtual void setSystemId(const DOMString &arg); - - virtual NodeImpl* getFirstChild(); - virtual NodeImpl* getLastChild(); - virtual NodeListImpl* getChildNodes(); - virtual bool hasChildNodes(); - virtual NodeImpl* item(unsigned int index); - - //DOM Level 2 additions. Non standard functions - virtual void setEntityRef(EntityReferenceImpl*); - virtual EntityReferenceImpl* getEntityRef() const; }; XERCES_CPP_NAMESPACE_END 1.6 +2 -4 xml-xerces/c/src/xercesc/dom/deprecated/EntityReferenceImpl.cpp Index: EntityReferenceImpl.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/deprecated/EntityReferenceImpl.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- EntityReferenceImpl.cpp 8 Sep 2004 13:55:43 -0000 1.5 +++ EntityReferenceImpl.cpp 14 Jan 2005 10:37:42 -0000 1.6 @@ -96,9 +96,7 @@ if (ownerDoc->getDoctype()->getEntities()) { EntityImpl* entity = (EntityImpl*)ownerDoc->getDoctype()->getEntities()->getNamedItem(entityName); if (entity) { - EntityReferenceImpl* refEntity = entity->getEntityRef(); - if (refEntity) - cloneChildren(*refEntity); + cloneChildren(*entity); } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]