DOMDocumentImpl.hpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:19k
源码类别:

词法分析

开发平台:

Visual C++

  1. #ifndef DOMDocumentImpl_HEADER_GUARD_
  2. #define DOMDocumentImpl_HEADER_GUARD_
  3. /*
  4.  * The Apache Software License, Version 1.1
  5.  *
  6.  * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
  7.  * reserved.
  8.  *
  9.  * Redistribution and use in source and binary forms, with or without
  10.  * modification, are permitted provided that the following conditions
  11.  * are met:
  12.  *
  13.  * 1. Redistributions of source code must retain the above copyright
  14.  *    notice, this list of conditions and the following disclaimer.
  15.  *
  16.  * 2. Redistributions in binary form must reproduce the above copyright
  17.  *    notice, this list of conditions and the following disclaimer in
  18.  *    the documentation and/or other materials provided with the
  19.  *    distribution.
  20.  *
  21.  * 3. The end-user documentation included with the redistribution,
  22.  *    if any, must include the following acknowledgment:
  23.  *       "This product includes software developed by the
  24.  *        Apache Software Foundation (http://www.apache.org/)."
  25.  *    Alternately, this acknowledgment may appear in the software itself,
  26.  *    if and wherever such third-party acknowledgments normally appear.
  27.  *
  28.  * 4. The names "Xerces" and "Apache Software Foundation" must
  29.  *    not be used to endorse or promote products derived from this
  30.  *    software without prior written permission. For written
  31.  *    permission, please contact apache@apache.org.
  32.  *
  33.  * 5. Products derived from this software may not be called "Apache",
  34.  *    nor may "Apache" appear in their name, without prior written
  35.  *    permission of the Apache Software Foundation.
  36.  *
  37.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  38.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  39.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  40.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  41.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  42.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  43.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  44.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  45.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  46.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  47.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  48.  * SUCH DAMAGE.
  49.  * ====================================================================
  50.  *
  51.  * This software consists of voluntary contributions made by many
  52.  * individuals on behalf of the Apache Software Foundation, and was
  53.  * originally based on software copyright (c) 2001, International
  54.  * Business Machines, Inc., http://www.ibm.com .  For more information
  55.  * on the Apache Software Foundation, please see
  56.  * <http://www.apache.org/>.
  57.  */
  58. /*
  59.  * $Id: DOMDocumentImpl.hpp,v 1.21 2003/05/23 03:37:14 knoaman Exp $
  60.  */
  61. //
  62. //  This file is part of the internal implementation of the C++ XML DOM.
  63. //  It should NOT be included or used directly by application programs.
  64. //
  65. //  Applications should include the file <xercesc/dom/DOM.hpp> for the entire
  66. //  DOM API, or xercesc/dom/DOM*.hpp for individual DOM classes, where the class
  67. //  name is substituded for the *.
  68. //
  69. #include <xercesc/util/RefArrayOf.hpp>
  70. #include <xercesc/util/RefStackOf.hpp>
  71. #include <xercesc/util/RefHashTableOf.hpp>
  72. #include <xercesc/util/KeyRefPair.hpp>
  73. #include <xercesc/dom/DOMDocument.hpp>
  74. #include <xercesc/dom/DOMUserDataHandler.hpp>
  75. #include "DOMNodeImpl.hpp"
  76. #include "DOMParentNode.hpp"
  77. #include "DOMDeepNodeListPool.hpp"
  78. XERCES_CPP_NAMESPACE_BEGIN
  79. class DOMAttrImpl;
  80. class DOMCDATASectionImpl;
  81. class DOMCommentImpl;
  82. class DOMConfiguration;
  83. class DOMDeepNodeListImpl;
  84. class DOMDocumentFragmentImpl;
  85. class DOMDocumentTypeImpl;
  86. class DOMElementImpl;
  87. class DOMEntityImpl;
  88. class DOMEntityReferenceImpl;
  89. class DOMNotationImpl;
  90. class DOMProcessingInstructionImpl;
  91. class DOMTextImpl;
  92. class DOMNodeIteratorImpl;
  93. class DOMNormalizer;
  94. class DOMTreeWalkerImpl;
  95. class DOMNodeFilter;
  96. class DOMNodeFilterImpl;
  97. class DOMImplementation;
  98. class DOMNodeIDMap;
  99. class DOMRangeImpl;
  100. class DOMStringPool;
  101. class DOMBuffer;
  102. class MemoryManager;
  103. typedef RefVectorOf<DOMRangeImpl>        Ranges;
  104. typedef RefVectorOf<DOMNodeIteratorImpl>     NodeIterators;
  105. typedef KeyRefPair<void, DOMUserDataHandler> DOMUserDataRecord;
  106. typedef RefHashTableOf<DOMUserDataRecord> DOMNodeUserDataTable;
  107. typedef RefStackOf<DOMNode>               DOMNodePtr;
  108. class CDOM_EXPORT DOMDocumentImpl: public XMemory, public DOMDocument {
  109. public:
  110.     // -----------------------------------------------------------------------
  111.     //  data types
  112.     // -----------------------------------------------------------------------
  113.     enum NodeObjectType {
  114.         ATTR_OBJECT                   = 0,
  115.         ATTR_NS_OBJECT                = 1,
  116.         CDATA_SECTION_OBJECT          = 2,
  117.         COMMENT_OBJECT                = 3,
  118.         DOCUMENT_FRAGMENT_OBJECT      = 4,
  119.         DOCUMENT_TYPE_OBJECT          = 5,
  120.         ELEMENT_OBJECT                = 6,
  121.         ELEMENT_NS_OBJECT             = 7,
  122.         ENTITY_OBJECT                 = 8,
  123.         ENTITY_REFERENCE_OBJECT       = 9,
  124.         NOTATION_OBJECT               = 10,
  125.         PROCESSING_INSTRUCTION_OBJECT = 11,
  126.         TEXT_OBJECT                   = 12
  127.     };
  128.     // -----------------------------------------------------------------------
  129.     //  data
  130.     // -----------------------------------------------------------------------
  131.     DOMNodeImpl           fNode;           // Implements common node functionality.
  132.     DOMParentNode         fParent;         // Implements common parent node functionality
  133.     DOMNodeIDMap*         fNodeIDMap;     // for use by GetElementsById().
  134. public:
  135.     DOMDocumentImpl(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
  136.     DOMDocumentImpl(const XMLCh*     namespaceURI,     //DOM Level 2
  137.                     const XMLCh*     qualifiedName,
  138.                     DOMDocumentType* doctype,
  139.                     MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
  140.     virtual ~DOMDocumentImpl();
  141.     void                         setDocumentType(DOMDocumentType *doctype);
  142.     // Add all functions that are pure virutal in DOMNODE
  143.     DOMNODE_FUNCTIONS;
  144.     // Add all functions that are pure virutal in DOMDocument
  145.     virtual DOMAttr*             createAttribute(const XMLCh *name);
  146.     virtual DOMCDATASection*     createCDATASection(const XMLCh *data);
  147.     virtual DOMComment*          createComment(const XMLCh *data);
  148.     virtual DOMDocumentFragment* createDocumentFragment();
  149.     virtual DOMDocumentType*     createDocumentType(const XMLCh *name);
  150.     virtual DOMDocumentType*     createDocumentType(const XMLCh *qName,
  151.                                                     const XMLCh *publicId,
  152.                                                     const XMLCh *systemId);
  153.     virtual DOMElement*          createElement(const XMLCh * tagName);
  154.     virtual DOMElement*          createElementNoCheck(const XMLCh *tagName);
  155.     virtual DOMEntity*           createEntity(const XMLCh * name);
  156.     virtual DOMEntityReference*  createEntityReference(const XMLCh * name);
  157.     virtual DOMNotation*         createNotation(const XMLCh * name);
  158.     virtual DOMProcessingInstruction* createProcessingInstruction(const XMLCh * target, const XMLCh * data);
  159.     virtual DOMText*             createTextNode(const XMLCh * data);
  160.     virtual DOMDocumentType*     getDoctype() const;
  161.     virtual DOMElement*          getDocumentElement() const;
  162.     virtual DOMNodeList*         getElementsByTagName(const XMLCh * tagname) const;
  163.     virtual DOMImplementation*   getImplementation() const;
  164.     bool                         isXMLName(const XMLCh * s);
  165.     virtual DOMNodeIterator*     createNodeIterator(DOMNode *root,
  166.                                                     unsigned long whatToShow,
  167.                                                     DOMNodeFilter* filter,
  168.                                                     bool entityReferenceExpansion);
  169.     virtual DOMTreeWalker*       createTreeWalker(DOMNode *root,
  170.                                                   unsigned long whatToShow,
  171.                                                   DOMNodeFilter* filter,
  172.                                                   bool entityReferenceExpansion);
  173.     virtual DOMRange*            createRange();
  174.     virtual Ranges*              getRanges() const;  //non-standard api
  175.     virtual NodeIterators*       getNodeIterators() const;  //non-standard api
  176.     virtual void                 removeRange(DOMRangeImpl* range); //non-standard api
  177.     virtual void                 removeNodeIterator(DOMNodeIteratorImpl* nodeIterator); //non-standard api
  178.     // Extension to be called by the Parser
  179.     DOMEntityReference*  createEntityReferenceByParser(const XMLCh * name);
  180.     //
  181.     // Functions to keep track of document mutations, so that node list chached
  182.     //   information can be invalidated.  One global changes counter per document.
  183.     //
  184.     virtual void                 changed();
  185.     virtual int                  changes() const;
  186.     /**
  187.      * Sets whether the DOM implementation performs error checking
  188.      * upon operations. Turning off error checking only affects
  189.      * the following DOM checks:
  190.      * <ul>
  191.      * <li>Checking strings to make sure that all characters are
  192.      *     legal XML characters
  193.      * <li>Hierarchy checking such as allowed children, checks for
  194.      *     cycles, etc.
  195.      * </ul>
  196.      * <p>
  197.      * Turning off error checking does <em>not</em> turn off the
  198.      * following checks:
  199.      * <ul>
  200.      * <li>Read only checks
  201.      * <li>Checks related to DOM events
  202.      * </ul>
  203.      */
  204.     inline void setErrorChecking(bool check) {
  205.         errorChecking = check;
  206.     }
  207.     /**
  208.      * Returns true if the DOM implementation performs error checking.
  209.      */
  210.     inline bool getErrorChecking() const {
  211.         return errorChecking;
  212.     }
  213.     //Introduced in DOM Level 2
  214.     virtual DOMNode*             importNode(DOMNode *source, bool deep);
  215.     virtual DOMElement*          createElementNS(const XMLCh *namespaceURI,
  216.                                                  const XMLCh *qualifiedName);
  217.     virtual DOMElement*          createElementNS(const XMLCh *namespaceURI,
  218.                                                  const XMLCh *qualifiedName,
  219.                                                  const XMLSSize_t lineNo,
  220.                                                  const XMLSSize_t columnNo);
  221.     virtual DOMAttr*             createAttributeNS(const XMLCh *namespaceURI,
  222.                                                    const XMLCh *qualifiedName);
  223.     virtual DOMNodeList*         getElementsByTagNameNS(const XMLCh *namespaceURI,
  224.                                                         const XMLCh *localName) const;
  225.     virtual DOMElement*          getElementById(const XMLCh *elementId) const;
  226.     //Introduced in DOM Level 3
  227.     virtual const XMLCh*         getActualEncoding() const;
  228.     virtual void                 setActualEncoding(const XMLCh* actualEncoding);
  229.     virtual const XMLCh*         getEncoding() const;
  230.     virtual void                 setEncoding(const XMLCh* encoding);
  231.     virtual bool                 getStandalone() const;
  232.     virtual void                 setStandalone(bool standalone);
  233.     virtual const XMLCh*         getVersion() const;
  234.     virtual void                 setVersion(const XMLCh* version);
  235.     virtual const XMLCh*         getDocumentURI() const;
  236.     virtual void                 setDocumentURI(const XMLCh* documentURI);
  237.     virtual bool                 getStrictErrorChecking() const;
  238.     virtual void                 setStrictErrorChecking(bool strictErrorChecking);
  239.     virtual DOMNode*             adoptNode(DOMNode* source);
  240.     virtual void                 normalizeDocument();
  241.     virtual DOMConfiguration*    getDOMConfiguration() const;
  242.     virtual void                 setDOMConfiguration(DOMConfiguration *config);
  243.     // helper functions to prevent storing userdata pointers on every node.
  244.     void*                        setUserData(DOMNodeImpl* n,
  245.                                             const XMLCh* key,
  246.                                             void* data,
  247.                                             DOMUserDataHandler* handler);
  248.     void*                        getUserData(const DOMNodeImpl* n,
  249.                                              const XMLCh* key) const;
  250.     void                         callUserDataHandlers(const DOMNodeImpl* n,
  251.                                                       DOMUserDataHandler::DOMOperationType operation,
  252.                                                       const DOMNode* src,
  253.                                                       const DOMNode* dst) const;
  254.     void                         transferUserData(DOMNodeImpl* n1, DOMNodeImpl* n2);
  255.     DOMNode*                     renameNode(DOMNode* n,
  256.                                             const XMLCh* namespaceURI,
  257.                                             const XMLCh* name);
  258.     //Return the index > 0 of ':' in the given qualified name qName="prefix:localName".
  259.     //Return 0 if there is no ':', or -1 if qName is malformed such as ":abcd".
  260.     static  int                  indexofQualifiedName(const XMLCh * qName);
  261.     static  bool                 isKidOK(DOMNode *parent, DOMNode *child);
  262.     inline DOMNodeIDMap*         getNodeIDMap() {return fNodeIDMap;};
  263.     //
  264.     // Memory Management Functions.  All memory is allocated by and owned by
  265.     //                               a document, and is not recovered until the
  266.     //                               document itself is deleted.
  267.     //
  268.     void*                        allocate(size_t amount);
  269.     void*                        allocate(size_t amount, NodeObjectType type);
  270.     XMLCh*                       cloneString(const XMLCh *src);
  271.     const XMLCh*                 getPooledString(const XMLCh *src);
  272.     void                         deleteHeap();
  273.     void                         release(DOMNode* object, NodeObjectType type);
  274.     void                         releaseDocNotifyUserData(DOMNode* object);
  275.     void                         releaseBuffer(DOMBuffer* buffer);
  276.     DOMBuffer*                   popBuffer();
  277.     MemoryManager*               getMemoryManager() const;
  278.     // Factory methods for getting/creating node lists.
  279.     // Because nothing is ever deleted, the implementation caches and recycles
  280.     //  previously used instances of DOMDeepNodeList
  281.     //
  282.     DOMNodeList*                 getDeepNodeList(const DOMNode *rootNode, const XMLCh *tagName);
  283.     DOMNodeList*                 getDeepNodeList(const DOMNode *rootNode,    //DOM Level 2
  284.                                                  const XMLCh *namespaceURI,
  285.                                                  const XMLCh *localName);
  286. private:
  287.     //Internal helper functions
  288.     virtual DOMNode*             importNode(DOMNode *source, bool deep, bool cloningNode);
  289. private:
  290.     // -----------------------------------------------------------------------
  291.     //  data
  292.     // -----------------------------------------------------------------------
  293.     // New data introduced in DOM Level 3
  294.     const XMLCh*          fActualEncoding;
  295.     const XMLCh*          fEncoding;
  296.     bool                  fStandalone;
  297.     const XMLCh*          fVersion;
  298.     const XMLCh*          fDocumentURI;
  299.     DOMConfiguration*     fDOMConfiguration;
  300.     
  301.     RefHashTableOf<DOMNodeUserDataTable>* fUserDataTable;
  302.     // Per-Document heap Variables.
  303.     //   The heap consists of one or more biggish blocks which are
  304.     //   sub-allocated for individual allocations of nodes, strings, etc.
  305.     //   The big blocks form a linked list, allowing them to be located for deletion.
  306.     //
  307.     //   There is no provision for deleting suballocated blocks, other than
  308.     //     deleting the entire heap when the document is deleted.
  309.     //
  310.     //   There is no header on individual sub-allocated blocks.
  311.     //   The header on big blocks consists only of a single back pointer to
  312.     //    the previously allocated big block (our linked list of big blocks)
  313.     //
  314.     //
  315.     //   revisit - this heap should be encapsulated into its own
  316.     //                  class, rather than hanging naked on Document.
  317.     //
  318.     void*                 fCurrentBlock;
  319.     char*                 fFreePtr;
  320.     XMLSize_t             fFreeBytesRemaining;
  321.     // To recycle the DOMNode pointer
  322.     RefArrayOf<DOMNodePtr>* fRecycleNodePtr;
  323.     // To recycle DOMBuffer pointer
  324.     RefStackOf<DOMBuffer>* fRecycleBufferPtr;
  325.     // Pool of DOMNodeList for getElementsByTagName
  326.     DOMDeepNodeListPool<DOMDeepNodeListImpl>* fNodeListPool;
  327.     // Other data
  328.     DOMDocumentType*      fDocType;
  329.     DOMElement*           fDocElement;
  330.     DOMStringPool*        fNamePool;
  331.     DOMNormalizer*        fNormalizer;
  332.     Ranges*               fRanges;
  333.     NodeIterators*        fNodeIterators;
  334.     MemoryManager*        fMemoryManager;   // configurable memory manager
  335.     int                   fChanges;
  336.     bool                  errorChecking;    // Bypass error checking.
  337. };
  338. inline MemoryManager* DOMDocumentImpl::getMemoryManager() const
  339. {
  340.     return fMemoryManager;
  341. }
  342. XERCES_CPP_NAMESPACE_END
  343. // ---------------------------------------------------------------------------
  344. //
  345. //  Operator new.  Global overloaded version, lets any object be allocated on
  346. //                 the heap owned by a document.
  347. //
  348. // ---------------------------------------------------------------------------
  349. inline void * operator new(size_t amt, XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc, XERCES_CPP_NAMESPACE_QUALIFIER DOMDocumentImpl::NodeObjectType type)
  350. {
  351.     // revist.  Probably should be a checked cast.
  352.     void *p = ((XERCES_CPP_NAMESPACE_QUALIFIER DOMDocumentImpl *)doc)->allocate(amt, type);
  353.     return p;
  354. }
  355. inline void * operator new(size_t amt, XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc)
  356. {
  357.     // revist.  Probably should be a checked cast.
  358.     void *p = ((XERCES_CPP_NAMESPACE_QUALIFIER DOMDocumentImpl *)doc)->allocate(amt);
  359.     return p;
  360. }
  361. // ---------------------------------------------------------------------------
  362. //  For DOM:
  363. //  Bypass compiler warning:
  364. //    no matching operator delete found; memory will not be freed if initialization throws an exception
  365. // ---------------------------------------------------------------------------
  366. #if _MSC_VER >= 1200 /* VC++ 6.0 */
  367. inline void operator delete(void* ptr, XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc)
  368. {
  369.     return;
  370. }
  371. inline void operator delete(void* ptr, XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc, XERCES_CPP_NAMESPACE_QUALIFIER DOMDocumentImpl::NodeObjectType type)
  372. {
  373.     return;
  374. }
  375. #endif
  376. #endif