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

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /**
  57. *  This file contains code to build the DOM tree. It registers a document
  58. *  handler with the scanner. In these handler methods, appropriate DOM nodes
  59. *  are created and added to the DOM tree.
  60. *
  61. * $Id: DOMParser.cpp,v 1.18 2003/05/22 02:26:50 knoaman Exp $
  62. *
  63. */
  64. // ---------------------------------------------------------------------------
  65. //  Includes
  66. // ---------------------------------------------------------------------------
  67. #include <xercesc/internal/XMLScannerResolver.hpp>
  68. #include <xercesc/sax/EntityResolver.hpp>
  69. #include <xercesc/util/XMLUniDefs.hpp>
  70. #include <xercesc/sax/ErrorHandler.hpp>
  71. #include <xercesc/sax/SAXParseException.hpp>
  72. #include <xercesc/framework/XMLNotationDecl.hpp>
  73. #include <xercesc/util/IOException.hpp>
  74. #include <xercesc/framework/XMLValidator.hpp>
  75. #include <xercesc/validators/common/GrammarResolver.hpp>
  76. #include "DOMParser.hpp"
  77. #include "ElementImpl.hpp"
  78. #include "AttrImpl.hpp"
  79. #include "AttrNSImpl.hpp"
  80. #include "TextImpl.hpp"
  81. #include "DocumentImpl.hpp"
  82. #include "DocumentTypeImpl.hpp"
  83. #include "EntityImpl.hpp"
  84. #include "NotationImpl.hpp"
  85. #include "NamedNodeMapImpl.hpp"
  86. #include "NodeIDMap.hpp"
  87. #include <xercesc/validators/common/ContentSpecNode.hpp>
  88. #include <xercesc/validators/DTD/DTDAttDefList.hpp>
  89. XERCES_CPP_NAMESPACE_BEGIN
  90. // ---------------------------------------------------------------------------
  91. //  DOMParser: Constructors and Destructor
  92. // ---------------------------------------------------------------------------
  93. DOMParser::DOMParser( XMLValidator* const  valToAdopt
  94.                     , MemoryManager* const manager) :
  95.     fToCreateXMLDeclTypeNode(false)
  96.     , fCreateEntityReferenceNodes(true)
  97.     , fIncludeIgnorableWhitespace(true)
  98.     , fParseInProgress(false)
  99.     , fWithinElement(false)
  100.     , fEntityResolver(0)
  101.     , fErrorHandler(0)
  102.     , fNodeStack(0)
  103.     , fScanner(0)
  104.     , fDocumentType(0)
  105.     , fGrammarResolver(0)
  106.     , fURIStringPool(0)
  107.     , fValidator(valToAdopt)
  108.     , fMemoryManager(manager)
  109. {
  110.     try
  111.     {
  112.         initialize();
  113.     }
  114.     catch(...)
  115.     {
  116.         cleanUp();
  117.         throw;
  118.     }
  119. }
  120. DOMParser::~DOMParser()
  121. {
  122.     cleanUp();
  123. }
  124. // ---------------------------------------------------------------------------
  125. //  DOMParser: Initialize/CleanUp methods
  126. // ---------------------------------------------------------------------------
  127. void DOMParser::initialize()
  128. {
  129.     // Create grammar resolver and URI string pool to pass to the scanner
  130.     fGrammarResolver = new (fMemoryManager) GrammarResolver(fMemoryManager);
  131.     fURIStringPool = new (fMemoryManager) XMLStringPool(109, fMemoryManager);
  132.     //  Create a scanner and tell it what validator to use. Then set us
  133.     //  as the document event handler so we can fill the DOM document.
  134.     fScanner = XMLScannerResolver::getDefaultScanner(fValidator, fMemoryManager);
  135.     fScanner->setDocHandler(this);
  136.     fScanner->setDocTypeHandler(this);
  137.     fScanner->setGrammarResolver(fGrammarResolver);
  138.     fScanner->setURIStringPool(fURIStringPool);
  139.     fNodeStack = new (fMemoryManager) ValueStackOf<DOM_Node>(64, fMemoryManager);
  140.     this->reset();
  141. }
  142. void DOMParser::cleanUp()
  143. {
  144.     delete fNodeStack;
  145.     delete fScanner;
  146.     delete fGrammarResolver;
  147.     delete fURIStringPool;
  148.     if (fValidator)
  149.         delete fValidator;
  150. }
  151. void DOMParser::reset()
  152. {
  153.     //
  154.     //  Note: DOM Documents are reference counted. Doing this assignment
  155.     //  will cause the old one to go away unless application code is also
  156.     //  holding a reference to it.
  157.     //
  158.     fDocument = DOM_Document::createDocument(fMemoryManager);
  159.     resetDocType();
  160.     fCurrentParent   = 0;
  161.     fCurrentNode     = 0;
  162.     fParseInProgress = false;
  163.     fWithinElement   = false;
  164.     fNodeStack->removeAllElements();
  165. };
  166. // ---------------------------------------------------------------------------
  167. //  DOMParser: Getter methods
  168. // ---------------------------------------------------------------------------
  169. const XMLValidator& DOMParser::getValidator() const
  170. {
  171.     return *fScanner->getValidator();
  172. }
  173. bool DOMParser::getDoNamespaces() const
  174. {
  175.     return fScanner->getDoNamespaces();
  176. }
  177. bool DOMParser::getExitOnFirstFatalError() const
  178. {
  179.     return fScanner->getExitOnFirstFatal();
  180. }
  181. bool DOMParser::getValidationConstraintFatal() const
  182. {
  183.     return fScanner->getValidationConstraintFatal();
  184. }
  185. DOMParser::ValSchemes DOMParser::getValidationScheme() const
  186. {
  187.     const XMLScanner::ValSchemes scheme = fScanner->getValidationScheme();
  188.     if (scheme == XMLScanner::Val_Always)
  189.         return Val_Always;
  190.     else if (scheme == XMLScanner::Val_Never)
  191.         return Val_Never;
  192.     return Val_Auto;
  193. }
  194. bool DOMParser::getDoSchema() const
  195. {
  196.     return fScanner->getDoSchema();
  197. }
  198. bool DOMParser::getValidationSchemaFullChecking() const
  199. {
  200.     return fScanner->getValidationSchemaFullChecking();
  201. }
  202. int DOMParser::getErrorCount() const
  203. {
  204.     return fScanner->getErrorCount();
  205. }
  206. XMLCh* DOMParser::getExternalSchemaLocation() const
  207. {
  208.     return fScanner->getExternalSchemaLocation();
  209. }
  210. XMLCh* DOMParser::getExternalNoNamespaceSchemaLocation() const
  211. {
  212.     return fScanner->getExternalNoNamespaceSchemaLocation();
  213. }
  214. bool DOMParser::isCachingGrammarFromParse() const
  215. {
  216.     return fScanner->isCachingGrammarFromParse();
  217. }
  218. bool DOMParser::isUsingCachedGrammarInParse() const
  219. {
  220.     return fScanner->isUsingCachedGrammarInParse();
  221. }
  222. Grammar* DOMParser::getGrammar(const XMLCh* const nameSpaceKey)
  223. {
  224.     return fGrammarResolver->getGrammar(nameSpaceKey);
  225. }
  226. Grammar* DOMParser::getRootGrammar()
  227. {
  228.     return fScanner->getRootGrammar();
  229. }
  230. const XMLCh* DOMParser::getURIText(unsigned int uriId) const
  231. {
  232.     return fScanner->getURIText(uriId);
  233. }
  234. bool DOMParser::getCalculateSrcOfs() const
  235. {
  236.     return fScanner->getCalculateSrcOfs();
  237. }
  238. bool DOMParser::getStandardUriConformant() const
  239. {
  240.     return fScanner->getStandardUriConformant();
  241. }
  242. unsigned int DOMParser::getSrcOffset() const
  243. {
  244.     return fScanner->getSrcOffset();
  245. }
  246. // ---------------------------------------------------------------------------
  247. //  DOMParser: Setter methods
  248. // ---------------------------------------------------------------------------
  249. void DOMParser::setDoNamespaces(const bool newState)
  250. {
  251.     fScanner->setDoNamespaces(newState);
  252. }
  253. void DOMParser::setErrorHandler(ErrorHandler* const handler)
  254. {
  255.     fErrorHandler = handler;
  256.     if (fErrorHandler) {
  257.         fScanner->setErrorReporter(this);
  258.         fScanner->setErrorHandler(fErrorHandler);
  259.     }
  260.     else {
  261.         fScanner->setErrorReporter(0);
  262.         fScanner->setErrorHandler(0);
  263.     }
  264. }
  265. void DOMParser::setEntityResolver(EntityResolver* const handler)
  266. {
  267.     fEntityResolver = handler;
  268.     if (fEntityResolver) {
  269.         fScanner->setEntityHandler(this);
  270.     }
  271.     else {
  272.         fScanner->setEntityHandler(0);
  273.     }
  274. }
  275. void DOMParser::setExitOnFirstFatalError(const bool newState)
  276. {
  277.     fScanner->setExitOnFirstFatal(newState);
  278. }
  279. void DOMParser::setValidationConstraintFatal(const bool newState)
  280. {
  281.     fScanner->setValidationConstraintFatal(newState);
  282. }
  283. void DOMParser::setValidationScheme(const ValSchemes newScheme)
  284. {
  285.     if (newScheme == Val_Never)
  286.         fScanner->setValidationScheme(XMLScanner::Val_Never);
  287.     else if (newScheme == Val_Always)
  288.         fScanner->setValidationScheme(XMLScanner::Val_Always);
  289.     else
  290.         fScanner->setValidationScheme(XMLScanner::Val_Auto);
  291. }
  292. void DOMParser::setDoSchema(const bool newState)
  293. {
  294.     fScanner->setDoSchema(newState);
  295. }
  296. void DOMParser::setValidationSchemaFullChecking(const bool schemaFullChecking)
  297. {
  298.     fScanner->setValidationSchemaFullChecking(schemaFullChecking);
  299. }
  300. void DOMParser::setExternalSchemaLocation(const XMLCh* const schemaLocation)
  301. {
  302.     fScanner->setExternalSchemaLocation(schemaLocation);
  303. }
  304. void DOMParser::setExternalNoNamespaceSchemaLocation(const XMLCh* const noNamespaceSchemaLocation)
  305. {
  306.     fScanner->setExternalNoNamespaceSchemaLocation(noNamespaceSchemaLocation);
  307. }
  308. void DOMParser::setExternalSchemaLocation(const char* const schemaLocation)
  309. {
  310.     fScanner->setExternalSchemaLocation(schemaLocation);
  311. }
  312. void DOMParser::setExternalNoNamespaceSchemaLocation(const char* const noNamespaceSchemaLocation)
  313. {
  314.     fScanner->setExternalNoNamespaceSchemaLocation(noNamespaceSchemaLocation);
  315. }
  316. void DOMParser::cacheGrammarFromParse(const bool newState)
  317. {
  318.     fScanner->cacheGrammarFromParse(newState);
  319.     if (newState)
  320.         fScanner->useCachedGrammarInParse(newState);
  321. }
  322. void DOMParser::useCachedGrammarInParse(const bool newState)
  323. {
  324.     if (newState || !fScanner->isCachingGrammarFromParse())
  325.         fScanner->useCachedGrammarInParse(newState);
  326. }
  327. void DOMParser::setCalculateSrcOfs(const bool newState)
  328. {
  329.     fScanner->setCalculateSrcOfs(newState);
  330. }
  331. void DOMParser::setStandardUriConformant(const bool newState)
  332. {
  333.     fScanner->setStandardUriConformant(newState);
  334. }
  335. void DOMParser::useScanner(const XMLCh* const scannerName)
  336. {
  337.     XMLScanner* tempScanner = XMLScannerResolver::resolveScanner
  338.     (
  339.         scannerName
  340.         , fValidator
  341.         , fMemoryManager
  342.     );
  343.     if (tempScanner) {
  344.         tempScanner->setParseSettings(fScanner);
  345.         tempScanner->setGrammarResolver(fGrammarResolver);
  346.         tempScanner->setURIStringPool(fURIStringPool);
  347.         delete fScanner;
  348.         fScanner = tempScanner;
  349.     }
  350. }
  351. // ---------------------------------------------------------------------------
  352. //  DOMParser: Parsing methods
  353. // ---------------------------------------------------------------------------
  354. void DOMParser::parse(const InputSource& source)
  355. {
  356.     // Avoid multiple entrance
  357.     if (fParseInProgress)
  358.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  359.     try
  360.     {
  361.         fParseInProgress = true;
  362.         fScanner->scanDocument(source);
  363.         fParseInProgress = false;
  364.     }
  365.     catch(...)
  366.     {
  367.         fParseInProgress = false;
  368.         throw;
  369.     }
  370. }
  371. void DOMParser::parse(const XMLCh* const systemId)
  372. {
  373.     // Avoid multiple entrance
  374.     if (fParseInProgress)
  375.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  376.     try
  377.     {
  378.         fParseInProgress = true;
  379.         fScanner->scanDocument(systemId);
  380.         fParseInProgress = false;
  381.     }
  382.     catch(...)
  383.     {
  384.         fParseInProgress = false;
  385.         throw;
  386.     }
  387. }
  388. void DOMParser::parse(const char* const systemId)
  389. {
  390.     // Avoid multiple entrance
  391.     if (fParseInProgress)
  392.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  393.     try
  394.     {
  395.         fParseInProgress = true;
  396.         fScanner->scanDocument(systemId);
  397.         fParseInProgress = false;
  398.     }
  399.     catch(...)
  400.     {
  401.         fParseInProgress = false;
  402.         throw;
  403.     }
  404. }
  405. // ---------------------------------------------------------------------------
  406. //  DOMParser: Progressive parse methods
  407. // ---------------------------------------------------------------------------
  408. bool DOMParser::parseFirst( const   XMLCh* const    systemId
  409.                            ,       XMLPScanToken&  toFill)
  410. {
  411.     //
  412.     //  Avoid multiple entrance. We cannot enter here while a regular parse
  413.     //  is in progress.
  414.     //
  415.     if (fParseInProgress)
  416.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  417.     return fScanner->scanFirst(systemId, toFill);
  418. }
  419. bool DOMParser::parseFirst( const   char* const         systemId
  420.                            ,       XMLPScanToken&      toFill)
  421. {
  422.     //
  423.     //  Avoid multiple entrance. We cannot enter here while a regular parse
  424.     //  is in progress.
  425.     //
  426.     if (fParseInProgress)
  427.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  428.     return fScanner->scanFirst(systemId, toFill);
  429. }
  430. bool DOMParser::parseFirst( const   InputSource&    source
  431.                            ,       XMLPScanToken&  toFill)
  432. {
  433.     //
  434.     //  Avoid multiple entrance. We cannot enter here while a regular parse
  435.     //  is in progress.
  436.     //
  437.     if (fParseInProgress)
  438.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  439.     return fScanner->scanFirst(source, toFill);
  440. }
  441. bool DOMParser::parseNext(XMLPScanToken& token)
  442. {
  443.     return fScanner->scanNext(token);
  444. }
  445. void DOMParser::parseReset(XMLPScanToken& token)
  446. {
  447.     // Reset the scanner, and then reset the parser
  448.     fScanner->scanReset(token);
  449.     reset();
  450. }
  451. // ---------------------------------------------------------------------------
  452. //  DOMParser: Implementation of the XMLErrorReporter interface
  453. // ---------------------------------------------------------------------------
  454. void DOMParser::error(  const   unsigned int                code
  455.                       , const XMLCh* const                msgDomain
  456.                       , const XMLErrorReporter::ErrTypes  errType
  457.                       , const XMLCh* const                errorText
  458.                       , const XMLCh* const                systemId
  459.                       , const XMLCh* const                publicId
  460.                       , const XMLSSize_t                  lineNum
  461.                       , const XMLSSize_t                  colNum)
  462. {
  463.     SAXParseException toThrow = SAXParseException
  464.         (
  465.         errorText
  466.         , publicId
  467.         , systemId
  468.         , lineNum
  469.         , colNum
  470.         );
  471.     //
  472.     //  If there is an error handler registered, call it, otherwise ignore
  473.     //  all but the fatal errors.
  474.     //
  475.     if (!fErrorHandler)
  476.     {
  477.         if (errType == XMLErrorReporter::ErrType_Fatal)
  478.             throw toThrow;
  479.         return;
  480.     }
  481.     if (errType == XMLErrorReporter::ErrType_Warning)
  482.         fErrorHandler->warning(toThrow);
  483.     else if (errType >= XMLErrorReporter::ErrType_Fatal)
  484.         fErrorHandler->fatalError(toThrow);
  485.     else
  486.         fErrorHandler->error(toThrow);
  487. }
  488. void DOMParser::resetErrors()
  489. {
  490. }
  491. // ---------------------------------------------------------------------------
  492. //  DOMParser: Implementation of XMLEntityHandler interface
  493. // ---------------------------------------------------------------------------
  494. InputSource*
  495. DOMParser::resolveEntity(const XMLCh* const publicId,
  496.                          const XMLCh* const systemId,
  497.                          const XMLCh* const baseURI)
  498. {
  499.     //
  500.     //  Just map it to the SAX entity resolver. If there is not one installed,
  501.     //  return a null pointer to cause the default resolution.
  502.     //
  503.     if (fEntityResolver)
  504.         return fEntityResolver->resolveEntity(publicId, systemId);
  505.     return 0;
  506. }
  507. // ---------------------------------------------------------------------------
  508. //  DOMParser: Implementation of XMLDocumentHandler interface
  509. // ---------------------------------------------------------------------------
  510. void DOMParser::docCharacters(  const   XMLCh* const    chars
  511.                               , const unsigned int    length
  512.                               , const bool            cdataSection)
  513. {
  514.     // Ignore chars outside of content
  515.     if (!fWithinElement)
  516.         return;
  517.     if (cdataSection == true)
  518.     {
  519.         DOM_CDATASection node = fDocument.createCDATASection
  520.             (
  521.             DOMString(chars, length)
  522.             );
  523.         fCurrentParent.appendChild(node);
  524.         fCurrentNode = node;
  525.     }
  526.     else
  527.     {
  528.         if (fCurrentNode.getNodeType() == DOM_Node::TEXT_NODE)
  529.         {
  530.             DOM_Text node = (DOM_Text&)fCurrentNode;
  531.             node.appendData(DOMString(chars, length));
  532.         }
  533.         else
  534.         {
  535.             DOM_Text node = fDocument.createTextNode(DOMString(chars, length));
  536.             fCurrentParent.appendChild(node);
  537.             fCurrentNode = node;
  538.         }
  539.     }
  540. }
  541. void DOMParser::docComment(const XMLCh* const comment)
  542. {
  543.     DOM_Comment dcom = fDocument.createComment(comment);
  544.     fCurrentParent.appendChild(dcom);
  545.     fCurrentNode = dcom;
  546. }
  547. void DOMParser::docPI(  const   XMLCh* const    target
  548.                       , const XMLCh* const    data)
  549. {
  550.     DOM_ProcessingInstruction pi = fDocument.createProcessingInstruction
  551.         (
  552.         target
  553.         , data
  554.         );
  555.     fCurrentParent.appendChild(pi);
  556.     fCurrentNode = pi;
  557. }
  558. void DOMParser::endEntityReference(const XMLEntityDecl& entDecl)
  559. {
  560.     if (fCreateEntityReferenceNodes == true)
  561.     {
  562.         if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) {
  563.             ((DOM_EntityReference&)fCurrentParent).fImpl->setReadOnly(true, true);
  564.         }
  565.         fCurrentParent = fNodeStack->pop();
  566.         fCurrentNode   = fCurrentParent;
  567.     }
  568. }
  569. void DOMParser::endElement( const   XMLElementDecl&    elemDecl
  570.                            , const unsigned int        urlId
  571.                            , const bool                isRoot
  572.                            , const XMLCh* const        elemPrefix)
  573. {
  574.     fCurrentNode   = fCurrentParent;
  575.     fCurrentParent = fNodeStack->pop();
  576.     // If we've hit the end of content, clear the flag
  577.     if (fNodeStack->empty())
  578.         fWithinElement = false;
  579. }
  580. void DOMParser::ignorableWhitespace(const   XMLCh* const    chars
  581.                                     , const unsigned int    length
  582.                                     , const bool            cdataSection)
  583. {
  584.     // Ignore chars before the root element
  585.     if (!fWithinElement || !fIncludeIgnorableWhitespace)
  586.         return;
  587.     if (fCurrentNode.getNodeType() == DOM_Node::TEXT_NODE)
  588.     {
  589.         DOM_Text node = (DOM_Text&)fCurrentNode;
  590.         node.appendData(DOMString(chars, length));
  591.     }
  592.     else
  593.     {
  594.         DOM_Text node = fDocument.createTextNode(DOMString(chars, length));
  595.         TextImpl *text = (TextImpl *) node.fImpl;
  596.         text -> setIgnorableWhitespace(true);
  597.         fCurrentParent.appendChild(node);
  598.         fCurrentNode = node;
  599.     }
  600. }
  601. void DOMParser::resetDocument()
  602. {
  603.     //
  604.     //  The reset methods are called before a new parse event occurs.
  605.     //  Reset this parsers state to clear out anything that may be left
  606.     //  from a previous use, in particular the DOM document itself.
  607.     //
  608.     this->reset();
  609. }
  610. void DOMParser::startDocument()
  611. {
  612.     // Just set the document as the current parent and current node
  613.     fCurrentParent = fDocument;
  614.     fCurrentNode   = fDocument;
  615.     // set DOM error checking off
  616.     fDocument.setErrorChecking(false);
  617. }
  618. void DOMParser::endDocument()
  619. {
  620.     // set DOM error checking back on
  621.     fDocument.setErrorChecking(true);
  622. }
  623. void DOMParser::startElement(const  XMLElementDecl&         elemDecl
  624.                              , const unsigned int            urlId
  625.                              , const XMLCh* const            elemPrefix
  626.                              , const RefVectorOf<XMLAttr>&   attrList
  627.                              , const unsigned int            attrCount
  628.                              , const bool                    isEmpty
  629.                              , const bool                    isRoot)
  630. {
  631.     DOM_Element     elem;
  632.     DocumentImpl    *docImpl = (DocumentImpl *)fDocument.fImpl;
  633.     if (fScanner -> getDoNamespaces()) {    //DOM Level 2, doNamespaces on
  634.         XMLBuffer buf(1023, fMemoryManager);
  635.         DOMString namespaceURI = 0;
  636.         DOMString elemQName = 0;
  637.         if (urlId != fScanner->getEmptyNamespaceId()) {  //TagName has a prefix
  638.             fScanner->getURIText(urlId, buf);   //get namespaceURI
  639.             namespaceURI = DOMString(buf.getRawBuffer());
  640.             if (elemPrefix && *elemPrefix) {
  641.                 elemQName.appendData(elemPrefix);
  642.                 elemQName.appendData(chColon);
  643.             }
  644.         }
  645.         elemQName.appendData(elemDecl.getBaseName());
  646.         elem = fDocument.createElementNS(namespaceURI, elemQName);
  647.         ElementImpl *elemImpl = (ElementImpl *) elem.fImpl;
  648.         for (unsigned int index = 0; index < attrCount; ++index) {
  649.             static const XMLCh XMLNS[] = {
  650.             chLatin_x, chLatin_m, chLatin_l, chLatin_n, chLatin_s, chNull
  651.             };
  652.             const XMLAttr* oneAttrib = attrList.elementAt(index);
  653.             unsigned int attrURIId = oneAttrib -> getURIId();
  654.             namespaceURI = 0;
  655.             if (!XMLString::compareString(oneAttrib -> getName(), XMLNS))    //for xmlns=...
  656.                 attrURIId = fScanner->getXMLNSNamespaceId();
  657.             if (attrURIId != fScanner->getEmptyNamespaceId()) {  //TagName has a prefix
  658.                 fScanner->getURIText(attrURIId, buf);   //get namespaceURI
  659.                 namespaceURI = DOMString(buf.getRawBuffer());
  660.             }
  661.             AttrImpl *attr = elemImpl->setAttributeNS(namespaceURI, oneAttrib -> getQName(),
  662.             oneAttrib -> getValue());
  663.             // Attributes of type ID.  If this is one, add it to the hashtable of IDs
  664.             //   that is constructed for use by GetElementByID().
  665.             //
  666.             if (oneAttrib->getType()==XMLAttDef::ID)
  667.             {
  668.                 if (docImpl->fNodeIDMap == 0)
  669.                     docImpl->fNodeIDMap = new (fMemoryManager) NodeIDMap(500, fMemoryManager);
  670.                 docImpl->fNodeIDMap->add(attr);
  671.                 attr->isIdAttr(true);
  672.             }
  673.             attr->setSpecified(oneAttrib->getSpecified());
  674.         }
  675.     }
  676.     else {    //DOM Level 1
  677.         elem = fDocument.createElement(elemDecl.getFullName());
  678.         ElementImpl *elemImpl = (ElementImpl *) elem.fImpl;
  679.         for (unsigned int index = 0; index < attrCount; ++index) {
  680.             const XMLAttr* oneAttrib = attrList.elementAt(index);
  681.             AttrImpl *attr = elemImpl->setAttribute(oneAttrib->getName(), oneAttrib->getValue());
  682.             attr->setSpecified(oneAttrib->getSpecified());
  683.             // Attributes of type ID.  If this is one, add it to the hashtable of IDs
  684.             //   that is constructed for use by GetElementByID().
  685.             //
  686.             if (oneAttrib->getType()==XMLAttDef::ID)
  687.             {
  688.                 if (docImpl->fNodeIDMap == 0)
  689.                     docImpl->fNodeIDMap = new (fMemoryManager) NodeIDMap(500, fMemoryManager);
  690.                 docImpl->fNodeIDMap->add(attr);
  691.                 attr->isIdAttr(true);
  692.             }
  693.         }
  694.     }
  695.     fCurrentParent.appendChild(elem);
  696.     fNodeStack->push(fCurrentParent);
  697.     fCurrentParent = elem;
  698.     fCurrentNode = elem;
  699.     fWithinElement = true;
  700.     // If an empty element, do end right now (no endElement() will be called)
  701.     if (isEmpty)
  702.         endElement(elemDecl, urlId, isRoot, elemPrefix);
  703. }
  704. void DOMParser::startEntityReference(const XMLEntityDecl& entDecl)
  705. {
  706.     if (fCreateEntityReferenceNodes == true)
  707.     {
  708. DOMString entName(entDecl.getName());
  709.         DOM_EntityReference er = fDocument.createEntityReference(entName);
  710.         //set the readOnly flag to false before appending node, will be reset in endEntityReference
  711.         er.fImpl->setReadOnly(false, true);
  712.         fCurrentParent.appendChild(er);
  713.         fNodeStack->push(fCurrentParent);
  714.         fCurrentParent = er;
  715.         fCurrentNode = er;
  716. // this entityRef needs to be stored in Entity map too.
  717.         // We'd decide later whether the entity nodes should be created by a
  718.         // separated method in parser or not. For now just stick it in if
  719.         // the ref nodes are created
  720. EntityImpl* entity = (EntityImpl*)fDocumentType->entities->getNamedItem(entName);
  721. entity->setEntityRef((EntityReferenceImpl*)er.fImpl);
  722.     }
  723. }
  724. void DOMParser::XMLDecl(const   XMLCh* const version
  725.                         , const XMLCh* const encoding
  726.                         , const XMLCh* const standalone
  727.                         , const XMLCh* const actualEncStr)
  728. {
  729.     //This is a non-standard extension to creating XMLDecl type nodes and attching to DOM Tree
  730.     // currently this flag it set to false unless user explicitly asks for it
  731.     // Needs to be revisited after W3C specs are laid out on this issue.
  732.     if (fToCreateXMLDeclTypeNode) {
  733.         DOMString ver(version);
  734.         DOMString enc(encoding);
  735.         DOMString isStd(standalone);
  736.         DOM_XMLDecl xmlDecl = fDocument.createXMLDecl(ver, enc, isStd);
  737.         fCurrentParent.appendChild(xmlDecl);
  738.     }
  739. }
  740. // ---------------------------------------------------------------------------
  741. //  DOMParser: Deprecated methods
  742. // ---------------------------------------------------------------------------
  743. bool DOMParser::getDoValidation() const
  744. {
  745.     //
  746.     //  We don't want to tie the public parser classes to the enum used
  747.     //  by the scanner, so we use a separate one and map.
  748.     //
  749.     //  DON'T mix the new and old methods!!
  750.     //
  751.     const XMLScanner::ValSchemes scheme = fScanner->getValidationScheme();
  752.     if (scheme == XMLScanner::Val_Always)
  753.         return true;
  754.     return false;
  755. }
  756. void DOMParser::setDoValidation(const bool newState)
  757. {
  758.     fScanner->setDoValidation
  759.     (
  760.         newState ? XMLScanner::Val_Always : XMLScanner::Val_Never
  761.     );
  762. }
  763. //doctypehandler interfaces
  764. void DOMParser::attDef
  765. (
  766.     const   DTDElementDecl&     elemDecl
  767.     , const DTDAttDef&          attDef
  768.     , const bool                ignoring
  769. )
  770. {
  771.     if (fDocumentType->isIntSubsetReading())
  772.     {
  773.         DOMString attString;
  774.         if (elemDecl.hasAttDefs())
  775.         {
  776.             attString.appendData(chOpenAngle);
  777.             attString.appendData(chBang);
  778.             attString.appendData(XMLUni::fgAttListString);
  779.             attString.appendData(chSpace);
  780.             attString.appendData(elemDecl.getFullName());
  781.             attString.appendData(chSpace);
  782.             attString.appendData(attDef.getFullName());
  783.             // Get the type and display it
  784.             const XMLAttDef::AttTypes type = attDef.getType();
  785.             switch(type)
  786.             {
  787.             case XMLAttDef::CData :
  788.                 attString.appendData(chSpace);
  789.                 attString.appendData(XMLUni::fgCDATAString);
  790.                 break;
  791.             case XMLAttDef::ID :
  792.                 attString.appendData(chSpace);
  793.                 attString.appendData(XMLUni::fgIDString);
  794.                 break;
  795.             case XMLAttDef::IDRef :
  796.                 attString.appendData(chSpace);
  797.                 attString.appendData(XMLUni::fgIDRefString);
  798.                 break;
  799.             case XMLAttDef::IDRefs :
  800.                 attString.appendData(chSpace);
  801.                 attString.appendData(XMLUni::fgIDRefsString);
  802.                 break;
  803.             case XMLAttDef::Entity :
  804.                 attString.appendData(chSpace);
  805.                 attString.appendData(XMLUni::fgEntityString);
  806.                 break;
  807.             case XMLAttDef::Entities :
  808.                 attString.appendData(chSpace);
  809.                 attString.appendData(XMLUni::fgEntitiesString);
  810.                 break;
  811.             case XMLAttDef::NmToken :
  812.                 attString.appendData(chSpace);
  813.                 attString.appendData(XMLUni::fgNmTokenString);
  814.                 break;
  815.             case XMLAttDef::NmTokens :
  816.                 attString.appendData(chSpace);
  817.                 attString.appendData(XMLUni::fgNmTokensString);
  818.                 break;
  819.             case XMLAttDef::Notation :
  820.                 attString.appendData(chSpace);
  821.                 attString.appendData(XMLUni::fgNotationString);
  822.                 break;
  823.             case XMLAttDef::Enumeration :
  824.                 attString.appendData(chSpace);
  825.                 //  attString.appendData(XMLUni::fgEnumerationString);
  826.                 const XMLCh* enumString = attDef.getEnumeration();
  827.                 int length = XMLString::stringLen(enumString);
  828.                 if (length > 0) {
  829.                     DOMString anotherEnumString;
  830.                     anotherEnumString.appendData(chOpenParen );
  831.                     for(int i=0; i<length; i++) {
  832.                         if (enumString[i] == chSpace)
  833.                             anotherEnumString.appendData(chPipe);
  834.                         else
  835.                             anotherEnumString.appendData(enumString[i]);
  836.                     }
  837.                     anotherEnumString.appendData(chCloseParen);
  838.                     attString.appendData(anotherEnumString);
  839.                 }
  840.                 break;
  841.             }
  842.             //get te default types of the attlist
  843.             const XMLAttDef::DefAttTypes def = attDef.getDefaultType();
  844.             switch(def)
  845.             {
  846.             case XMLAttDef::Required :
  847.                 attString.appendData(chSpace);
  848.                 attString.appendData(XMLUni::fgRequiredString);
  849.                 break;
  850.             case XMLAttDef::Implied :
  851.                 attString.appendData(chSpace);
  852.                 attString.appendData(XMLUni::fgImpliedString);
  853.                 break;
  854.             case XMLAttDef::Fixed :
  855.                 attString.appendData(chSpace);
  856.                 attString.appendData(XMLUni::fgFixedString);
  857.                 break;
  858.             }
  859.             const XMLCh* defaultValue = attDef.getValue();
  860.             if (defaultValue != 0) {
  861.                 attString.appendData(chSpace);
  862.                 attString.appendData(chDoubleQuote);
  863.                 attString.appendData(defaultValue);
  864.                 attString.appendData(chDoubleQuote);
  865.             }
  866.             attString.appendData(chCloseAngle);
  867.             fDocumentType->internalSubset.appendData(attString);
  868.         }
  869.     }
  870. }
  871. void DOMParser::doctypeComment
  872. (
  873.     const   XMLCh* const    comment
  874. )
  875. {
  876.     if (fDocumentType->isIntSubsetReading())
  877.     {
  878.         if (comment != 0)
  879.         {
  880.             DOMString comString;
  881.             comString.appendData(XMLUni::fgCommentString);
  882.             comString.appendData(chSpace);
  883.             comString.appendData(comment);
  884.             comString.appendData(chSpace);
  885.             comString.appendData(chDash);
  886.             comString.appendData(chDash);
  887.             comString.appendData(chCloseAngle);
  888.             fDocumentType->internalSubset.appendData(comString);
  889.         }
  890.     }
  891. }
  892. void DOMParser::doctypeDecl
  893. (
  894.     const   DTDElementDecl& elemDecl
  895.     , const XMLCh* const    publicId
  896.     , const XMLCh* const    systemId
  897.     , const bool            hasIntSubset
  898.     , const bool            hasExtSubset
  899. )
  900. {
  901. DOM_DocumentType dt;
  902. dt = fDocument.getImplementation().createDocumentType(elemDecl.getFullName(), publicId, systemId);
  903.     fDocumentType = (DocumentTypeImpl*)dt.fImpl;
  904. ((DocumentImpl*)fDocument.fImpl)->setDocumentType(fDocumentType);
  905. }
  906. void DOMParser::doctypePI
  907. (
  908.     const   XMLCh* const    target
  909.     , const XMLCh* const    data
  910. )
  911. {
  912.     if (fDocumentType->isIntSubsetReading())
  913. {
  914. //add these chars to internalSubset variable
  915.         DOMString pi;
  916.         pi.appendData(chOpenAngle);
  917.         pi.appendData(chQuestion);
  918.         pi.appendData(target);
  919.         pi.appendData(chSpace);
  920.         pi.appendData(data);
  921.         pi.appendData(chQuestion);
  922.         pi.appendData(chCloseAngle);
  923. fDocumentType->internalSubset.appendData(pi);
  924. }
  925. }
  926. void DOMParser::doctypeWhitespace
  927. (
  928.     const   XMLCh* const    chars
  929.     , const unsigned int    length
  930. )
  931. {
  932.     if (fDocumentType->isIntSubsetReading())
  933. fDocumentType->internalSubset.appendData(chars);
  934. }
  935. void DOMParser::elementDecl
  936. (
  937.     const   DTDElementDecl& decl
  938.     , const bool            isIgnored
  939. )
  940. {
  941.     if (fDocumentType->isIntSubsetReading())
  942. {
  943.         DOMString elemDecl;
  944.         elemDecl.appendData(chOpenAngle);
  945.         elemDecl.appendData(chBang);
  946.         elemDecl.appendData(XMLUni::fgElemString);
  947.         elemDecl.appendData(chSpace);
  948.         elemDecl.appendData(decl.getFullName());
  949.         //get the ContentSpec information
  950.         const XMLCh* contentModel = decl.getFormattedContentModel();
  951.         if (contentModel != 0) {
  952.             elemDecl.appendData(chSpace);
  953.             elemDecl.appendData(contentModel);
  954.         }
  955.         elemDecl.appendData(chCloseAngle);
  956. fDocumentType->internalSubset.appendData(elemDecl);
  957. }
  958. }
  959. void DOMParser::endAttList
  960. (
  961.     const   DTDElementDecl& elemDecl
  962. )
  963. {
  964. // this section sets up default attributes.
  965. // default attribute nodes are stored in a NamedNodeMap DocumentTypeImpl::elements
  966. // default attribute data attached to the document is used to conform to the
  967. // DOM spec regarding creating element nodes & removing attributes with default values
  968. // see DocumentTypeImpl
  969. if (elemDecl.hasAttDefs())
  970. {
  971. XMLAttDefList* defAttrs = &elemDecl.getAttDefList();
  972. XMLAttDef* attr = 0;
  973. AttrImpl* insertAttr = 0;
  974. DOM_Element dom_elem = fDocument.createElement(elemDecl.getFullName());
  975. ElementImpl* elem = (ElementImpl*)(dom_elem.fImpl);
  976. while (defAttrs->hasMoreElements())
  977.         {
  978.             attr = &defAttrs->nextElement();
  979.             if (attr->getValue() != null)
  980.             {
  981.                 if (fScanner->getDoNamespaces())
  982.                 {
  983.                     // DOM Level 2 wants all namespace declaration attributes
  984.                     // to be bound to "http://www.w3.org/2000/xmlns/"
  985.                     // So as long as the XML parser doesn't do it, it needs to
  986.                     // done here.
  987.                     DOMString qualifiedName = attr->getFullName();
  988.                     int index = DocumentImpl::indexofQualifiedName(qualifiedName);
  989.                     XMLBuffer buf(1023, fMemoryManager);
  990.                     static const XMLCh XMLNS[] = {
  991.                         chLatin_x, chLatin_m, chLatin_l, chLatin_n, chLatin_s, chNull};
  992.                     if (index > 0) {
  993.                         // there is prefix
  994.                         // map to XML URI for all cases except when prefix == "xmlns"
  995.                         DOMString prefix = qualifiedName.substringData(0, index);
  996.                         if (prefix.equals(XMLNS))
  997.                             buf.append(XMLUni::fgXMLNSURIName);
  998.                         else
  999.                             buf.append(XMLUni::fgXMLURIName);
  1000.                     }
  1001.                     else {
  1002.                         //   No prefix
  1003.                         if (qualifiedName.equals(XMLNS))
  1004.                             buf.append(XMLUni::fgXMLNSURIName);
  1005.                     }
  1006.                     insertAttr = new (fMemoryManager) AttrNSImpl((DocumentImpl*)fDocument.fImpl,
  1007.                        DOMString(buf.getRawBuffer()),     // NameSpaceURI
  1008.                        qualifiedName);   // qualified name
  1009.                 }
  1010.                 else
  1011.                 {
  1012.                     // Namespaces is turned off...
  1013.                     insertAttr = new (fMemoryManager) AttrImpl((DocumentImpl*)fDocument.fImpl, attr->getFullName());
  1014.                 }
  1015.                 insertAttr->setValue(attr->getValue());
  1016.                 // memory leak here
  1017.                 AttrImpl * previousAttr = elem->setAttributeNode(insertAttr);
  1018. if ( previousAttr != 0 && previousAttr->nodeRefCount ==0)
  1019. NodeImpl::deleteIf(previousAttr);
  1020.                 insertAttr->setSpecified(false);
  1021.             }
  1022.         }
  1023.         ElementImpl *previousElem = (ElementImpl *)
  1024.                 fDocumentType->getElements()->setNamedItem( elem );
  1025.         //
  1026.         //  If this new element is replacing an element node that was already
  1027.         //    in the element named node map, we need to delete the original
  1028.         //    element node, assuming no-one else was referencing it.
  1029.         //
  1030.         if (previousElem != 0 && previousElem->nodeRefCount == 0)
  1031.             NodeImpl::deleteIf(previousElem);
  1032.     }
  1033. }
  1034. void DOMParser::endIntSubset()
  1035. {
  1036. fDocumentType->intSubsetReading = false;
  1037. }
  1038. void DOMParser::endExtSubset()
  1039. {
  1040. }
  1041. void DOMParser::entityDecl
  1042. (
  1043.     const   DTDEntityDecl&  entityDecl
  1044.     , const bool            isPEDecl
  1045.     , const bool            isIgnored
  1046. )
  1047. {
  1048. EntityImpl* entity = ((DocumentImpl*)fDocument.fImpl)->createEntity(entityDecl.getName());
  1049. entity->setPublicId(entityDecl.getPublicId());
  1050. entity->setSystemId(entityDecl.getSystemId());
  1051. entity->setNotationName(entityDecl.getNotationName());
  1052.     EntityImpl *previousDef = (EntityImpl *)
  1053.     fDocumentType->entities->setNamedItem( entity );
  1054.     //
  1055.     //  If this new entity node is replacing an entity node that was already
  1056.     //    in the entities named node map (happens if documents redefine the
  1057.     //    predefined entited such as lt), we need to delete the original
  1058.     //    entitiy node, assuming no-one else was referencing it.
  1059.     //
  1060.     if (previousDef != 0 && previousDef->nodeRefCount == 0)
  1061.              NodeImpl::deleteIf(previousDef);
  1062. if (fDocumentType->isIntSubsetReading())
  1063. {
  1064. //add thes chars to internalSubset variable
  1065. DOMString entityName;
  1066. entityName.appendData(chOpenAngle);
  1067.         entityName.appendData(chBang);
  1068. entityName.appendData(XMLUni::fgEntityString);
  1069.         entityName.appendData(chSpace);
  1070.         entityName.appendData(entityDecl.getName());
  1071.         DOMString id = entity->getPublicId();
  1072.         if (id != 0) {
  1073.             entityName.appendData(chSpace);
  1074.             entityName.appendData(XMLUni::fgPubIDString);
  1075.             entityName.appendData(chSpace);
  1076.             entityName.appendData(chDoubleQuote);
  1077.             entityName.appendData(id);
  1078.             entityName.appendData(chDoubleQuote);
  1079.         }
  1080.         id = entity->getSystemId();
  1081.         if (id != 0) {
  1082.             entityName.appendData(chSpace);
  1083.             entityName.appendData(XMLUni::fgSysIDString);
  1084.             entityName.appendData(chSpace);
  1085.             entityName.appendData(chDoubleQuote);
  1086.             entityName.appendData(id);
  1087.             entityName.appendData(chDoubleQuote);
  1088.         }
  1089.         id = entity->getNotationName();
  1090.         if (id != 0) {
  1091.             entityName.appendData(chSpace);
  1092.             entityName.appendData(XMLUni::fgNDATAString);
  1093.             entityName.appendData(chSpace);
  1094.             entityName.appendData(chDoubleQuote);
  1095.             entityName.appendData(id);
  1096.             entityName.appendData(chDoubleQuote);
  1097.         }
  1098.         id = entityDecl.getValue();
  1099.         if (id !=0) {
  1100.             entityName.appendData(chSpace);
  1101.             entityName.appendData(chDoubleQuote);
  1102.             entityName.appendData(id);
  1103.             entityName.appendData(chDoubleQuote);
  1104.         }
  1105.         entityName.appendData(chCloseAngle);
  1106.         fDocumentType->internalSubset.appendData(entityName);
  1107.     }
  1108. }
  1109. void DOMParser::resetDocType()
  1110. {
  1111. fDocumentType = null;
  1112. }
  1113. void DOMParser::notationDecl
  1114. (
  1115.     const   XMLNotationDecl&    notDecl
  1116.     , const bool                isIgnored
  1117. )
  1118. {
  1119. NotationImpl* notation = ((DocumentImpl*)fDocument.fImpl)->createNotation(notDecl.getName());
  1120. notation->setPublicId(notDecl.getPublicId());
  1121. notation->setSystemId(notDecl.getSystemId());
  1122.     NotationImpl *previousNot = (NotationImpl *)
  1123.        fDocumentType->notations->setNamedItem( notation );
  1124.     //
  1125.     //  If this new notation is replacing a notation node that was already
  1126.     //    in the notation named node map, we need to delete the original
  1127.     //    notation node, assuming no-one else was referencing it.
  1128.     //
  1129.     if (previousNot != 0 && previousNot->nodeRefCount == 0)
  1130.         NodeImpl::deleteIf(previousNot);
  1131. }
  1132. void DOMParser::startAttList
  1133. (
  1134.     const   DTDElementDecl& elemDecl
  1135. )
  1136. {
  1137. }
  1138. void DOMParser::startIntSubset()
  1139. {
  1140. fDocumentType->intSubsetReading = true;
  1141. }
  1142. void DOMParser::startExtSubset()
  1143. {
  1144. }
  1145. void DOMParser::TextDecl
  1146. (
  1147.     const   XMLCh* const    versionStr
  1148.     , const XMLCh* const    encodingStr
  1149. )
  1150. {
  1151. }
  1152. // ---------------------------------------------------------------------------
  1153. //  DOMParser: Grammar preparsing methods
  1154. // ---------------------------------------------------------------------------
  1155. Grammar* DOMParser::loadGrammar(const char* const systemId,
  1156.                                 const short grammarType,
  1157.                                 const bool toCache)
  1158. {
  1159.     // Avoid multiple entrance
  1160.     if (fParseInProgress)
  1161.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  1162.     Grammar* grammar = 0;
  1163.     try
  1164.     {
  1165.         fParseInProgress = true;
  1166.         grammar = fScanner->loadGrammar(systemId, grammarType, toCache);
  1167.         fParseInProgress = false;
  1168.     }
  1169.     catch(...)
  1170.     {
  1171.         fParseInProgress = false;
  1172.         throw;
  1173.     }
  1174.     return grammar;
  1175. }
  1176. Grammar* DOMParser::loadGrammar(const XMLCh* const systemId,
  1177.                                 const short grammarType,
  1178.                                 const bool toCache)
  1179. {
  1180.     // Avoid multiple entrance
  1181.     if (fParseInProgress)
  1182.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  1183.     Grammar* grammar = 0;
  1184.     try
  1185.     {
  1186.         fParseInProgress = true;
  1187.         grammar = fScanner->loadGrammar(systemId, grammarType, toCache);
  1188.         fParseInProgress = false;
  1189.     }
  1190.     catch(...)
  1191.     {
  1192.         fParseInProgress = false;
  1193.         throw;
  1194.     }
  1195.     return grammar;
  1196. }
  1197. Grammar* DOMParser::loadGrammar(const InputSource& source,
  1198.                                 const short grammarType,
  1199.                                 const bool toCache)
  1200. {
  1201.     // Avoid multiple entrance
  1202.     if (fParseInProgress)
  1203.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  1204.    Grammar* grammar = 0;
  1205.     try
  1206.     {
  1207.         fParseInProgress = true;
  1208.         grammar = fScanner->loadGrammar(source, grammarType, toCache);
  1209.         fParseInProgress = false;
  1210.     }
  1211.     catch(...)
  1212.     {
  1213.         fParseInProgress = false;
  1214.         throw;
  1215.     }
  1216.     return grammar;
  1217. }
  1218. void DOMParser::resetCachedGrammarPool()
  1219. {
  1220.     fGrammarResolver->resetCachedGrammar();
  1221. }
  1222. XERCES_CPP_NAMESPACE_END