You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by tn...@apache.org on 2003/01/16 20:10:41 UTC

cvs commit: xml-xerces/c/src/xercesc/dom/impl DOMDocumentImpl.cpp DOMDocumentImpl.hpp DOMNodeIteratorImpl.cpp DOMNodeIteratorImpl.hpp DOMParentNode.cpp

tng         2003/01/16 11:10:41

  Modified:    c/src/xercesc/dom/impl DOMDocumentImpl.cpp
                        DOMDocumentImpl.hpp DOMNodeIteratorImpl.cpp
                        DOMNodeIteratorImpl.hpp DOMParentNode.cpp
  Log:
  DOM Fix: iterator should be updated when a node is removed from the dom tree
  
  Revision  Changes    Path
  1.29      +44 -2     xml-xerces/c/src/xercesc/dom/impl/DOMDocumentImpl.cpp
  
  Index: DOMDocumentImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMDocumentImpl.cpp,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- DOMDocumentImpl.cpp	20 Dec 2002 22:10:58 -0000	1.28
  +++ DOMDocumentImpl.cpp	16 Jan 2003 19:10:41 -0000	1.29
  @@ -118,6 +118,7 @@
         fNamePool(0),
         fNodeIDMap(0),
         fRanges(0),
  +      fNodeIterators(0),
         fChanges(0),
         fNodeListPool(0),
         fActualEncoding(0),
  @@ -148,6 +149,7 @@
         fNamePool(0),
         fNodeIDMap(0),
         fRanges(0),
  +      fNodeIterators(0),
         fChanges(0),
         fNodeListPool(0),
         fActualEncoding(0),
  @@ -207,6 +209,9 @@
       if (fRanges)
           fRanges->cleanup();
   
  +    if (fNodeIterators)
  +        fNodeIterators->cleanup();
  +
       if (fUserDataTable)
           fUserDataTable->cleanup();
   
  @@ -386,12 +391,49 @@
   DOMNodeIterator* DOMDocumentImpl::createNodeIterator (
             DOMNode *root, unsigned long whatToShow, DOMNodeFilter* filter, bool entityReferenceExpansion)
   {
  -    return new (this) DOMNodeIteratorImpl(root, whatToShow, filter, entityReferenceExpansion);
  +    if (!root) {
  +        throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
  +        return 0;
  +    }
  +
  +    DOMNodeIteratorImpl* nodeIterator = new (this) DOMNodeIteratorImpl(this, root, whatToShow, filter, entityReferenceExpansion);
  +
  +    if (fNodeIterators == 0L) {
  +        fNodeIterators = new (this) NodeIterators(1, false);
  +    }
  +    fNodeIterators->addElement(nodeIterator);
  +
  +    return nodeIterator;
   }
   
   
  +NodeIterators* DOMDocumentImpl::getNodeIterators() const
  +{
  +    return fNodeIterators;
  +}
  +
  +void DOMDocumentImpl::removeNodeIterator(DOMNodeIteratorImpl* nodeIterator)
  +{
  +    if (fNodeIterators != 0) {
  +        XMLSize_t sz = fNodeIterators->size();
  +        if (sz !=0) {
  +            for (XMLSize_t i =0; i<sz; i++) {
  +                if (fNodeIterators->elementAt(i) == nodeIterator) {
  +                    fNodeIterators->removeElementAt(i);
  +                    break;
  +                }
  +            }
  +        }
  +    }
  +}
  +
   DOMTreeWalker* DOMDocumentImpl::createTreeWalker (DOMNode *root, unsigned long whatToShow, DOMNodeFilter* filter, bool entityReferenceExpansion)
   {
  +    if (!root) {
  +        throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
  +        return 0;
  +    }
  +
       return new (this) DOMTreeWalkerImpl(root, whatToShow, filter, entityReferenceExpansion);
   }
   
  
  
  
  1.14      +5 -1      xml-xerces/c/src/xercesc/dom/impl/DOMDocumentImpl.hpp
  
  Index: DOMDocumentImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMDocumentImpl.hpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- DOMDocumentImpl.hpp	20 Dec 2002 22:10:58 -0000	1.13
  +++ DOMDocumentImpl.hpp	16 Jan 2003 19:10:41 -0000	1.14
  @@ -112,6 +112,7 @@
   class DOMBuffer;
   
   typedef RefVectorOf<DOMRangeImpl>        Ranges;
  +typedef RefVectorOf<DOMNodeIteratorImpl>     NodeIterators;
   typedef KeyRefPair<void, DOMUserDataHandler> DOMUserDataRecord;
   typedef RefHashTableOf<DOMUserDataRecord> DOMNodeUserDataTable;
   typedef RefStackOf<DOMNode>               DOMNodePtr;
  @@ -190,7 +191,9 @@
   
       virtual DOMRange*            createRange();
       virtual Ranges*              getRanges() const;  //non-standard api
  +    virtual NodeIterators*       getNodeIterators() const;  //non-standard api
       virtual void                 removeRange(DOMRangeImpl* range); //non-standard api
  +    virtual void                 removeNodeIterator(DOMNodeIteratorImpl* nodeIterator); //non-standard api
   
   
       //
  @@ -367,6 +370,7 @@
       DOMStringPool*        fNamePool;
   
       Ranges*               fRanges;
  +    NodeIterators*        fNodeIterators;
   
       int                   fChanges;
       bool                  errorChecking;    // Bypass error checking.
  
  
  
  1.5       +20 -22    xml-xerces/c/src/xercesc/dom/impl/DOMNodeIteratorImpl.cpp
  
  Index: DOMNodeIteratorImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMNodeIteratorImpl.cpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- DOMNodeIteratorImpl.cpp	4 Nov 2002 15:07:34 -0000	1.4
  +++ DOMNodeIteratorImpl.cpp	16 Jan 2003 19:10:41 -0000	1.5
  @@ -75,25 +75,7 @@
   // Construction/Destruction
   //////////////////////////////////////////////////////////////////////
   
  -DOMNodeIteratorImpl::DOMNodeIteratorImpl ()
  -: fDetached(false),
  -    fNodeFilter(0)
  -{
  -}	
  -
  -DOMNodeIteratorImpl::~DOMNodeIteratorImpl ()
  -{
  -	fDetached = false;
  -}
  -
  -
  -void DOMNodeIteratorImpl::detach ()
  -{
  -	fDetached = true;
  -}
  -
  -
  -DOMNodeIteratorImpl::DOMNodeIteratorImpl (
  +DOMNodeIteratorImpl::DOMNodeIteratorImpl (DOMDocument* doc,
                                       DOMNode* root,
                                       unsigned long whatToShow,
                                       DOMNodeFilter* nodeFilter,
  @@ -104,7 +86,8 @@
       fWhatToShow(whatToShow),
       fNodeFilter(nodeFilter),
       fForward(true),
  -    fExpandEntityReferences(expandEntityRef)
  +    fExpandEntityReferences(expandEntityRef),
  +    fDocument(doc)
   {
   	
   }
  @@ -117,7 +100,8 @@
       fWhatToShow(toCopy.fWhatToShow),
       fNodeFilter(toCopy.fNodeFilter),
       fForward(toCopy.fForward),
  -    fExpandEntityReferences(toCopy.fExpandEntityReferences)
  +    fExpandEntityReferences(toCopy.fExpandEntityReferences),
  +    fDocument(toCopy.fDocument)
   {
   }
   
  @@ -130,8 +114,22 @@
       fForward                = other.fForward;
       fDetached               = other.fDetached;
       fExpandEntityReferences = other.fExpandEntityReferences;
  +    fDocument               = other.fDocument;
       return *this;
   }
  +
  +DOMNodeIteratorImpl::~DOMNodeIteratorImpl ()
  +{
  +	fDetached = false;
  +}
  +
  +
  +void DOMNodeIteratorImpl::detach ()
  +{
  +	fDetached = true;
  +   ((DOMDocumentImpl *)fDocument)->removeNodeIterator(this);
  +}
  +
   
   DOMNode* DOMNodeIteratorImpl::getRoot() {
       return fRoot;
  
  
  
  1.4       +6 -5      xml-xerces/c/src/xercesc/dom/impl/DOMNodeIteratorImpl.hpp
  
  Index: DOMNodeIteratorImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMNodeIteratorImpl.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DOMNodeIteratorImpl.hpp	4 Nov 2002 15:07:34 -0000	1.3
  +++ DOMNodeIteratorImpl.hpp	16 Jan 2003 19:10:41 -0000	1.4
  @@ -88,6 +88,9 @@
           // The root.
           DOMNode* fRoot;
   
  +        // The Document used to create this iterator
  +        DOMDocument* fDocument;
  +
           // The whatToShow mask.
           unsigned long fWhatToShow;
   
  @@ -120,12 +123,10 @@
           //  </pre>
           bool fForward;
   
  -    protected:
  -        DOMNodeIteratorImpl ();
  -
       public:
           virtual ~DOMNodeIteratorImpl ();
           DOMNodeIteratorImpl (
  +            DOMDocument* fDocument,
               DOMNode* root,
               unsigned long whatToShow,
               DOMNodeFilter* nodeFilter,
  @@ -145,12 +146,12 @@
           virtual void detach ();
   
           virtual void release();
  +        void removeNode (DOMNode* node);
   
       private:
           DOMNode* matchNodeOrParent (DOMNode* node);
           DOMNode* nextNode (DOMNode* node, bool visitChildren);
           DOMNode* previousNode (DOMNode* node);
  -        void removeNode (DOMNode* node);
           bool acceptNode (DOMNode* node);
   
   };
  
  
  
  1.11      +15 -2     xml-xerces/c/src/xercesc/dom/impl/DOMParentNode.cpp
  
  Index: DOMParentNode.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMParentNode.cpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- DOMParentNode.cpp	4 Nov 2002 15:07:34 -0000	1.10
  +++ DOMParentNode.cpp	16 Jan 2003 19:10:41 -0000	1.11
  @@ -65,6 +65,7 @@
   #include "DOMDocumentImpl.hpp"
   #include "DOMNodeListImpl.hpp"
   #include "DOMRangeImpl.hpp"
  +#include "DOMNodeIteratorImpl.hpp"
   #include "DOMParentNode.hpp"
   #include "DOMCasts.hpp"
   
  @@ -310,8 +311,20 @@
       if (oldChild != 0 && oldChild->getParentNode() != castToNode(this))
           throw DOMException(DOMException::NOT_FOUND_ERR, 0);
   
  -    //fix other ranges for change before deleting the node
       if (this->getOwnerDocument() !=  0  ) {
  +        //notify iterators
  +        NodeIterators* nodeIterators = ((DOMDocumentImpl *)this->getOwnerDocument())->getNodeIterators();
  +        if (nodeIterators != 0) {
  +            XMLSize_t sz = nodeIterators->size();
  +            if (sz != 0) {
  +                for (XMLSize_t i =0; i<sz; i++) {
  +                    if (nodeIterators->elementAt(i) != 0)
  +                        nodeIterators->elementAt(i)->removeNode(oldChild);
  +                }
  +            }
  +        }
  +
  +        //fix other ranges for change before deleting the node
           Ranges* ranges = ((DOMDocumentImpl *)this->getOwnerDocument())->getRanges();
           if (ranges != 0) {
               XMLSize_t sz = ranges->size();
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org