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]

Reply via email to