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

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2002, 2003 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) 2001, 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: DOMBuilderImpl.cpp,v 1.24 2003/05/16 21:36:59 knoaman Exp $
  62. *
  63. */
  64. // ---------------------------------------------------------------------------
  65. //  Includes
  66. // ---------------------------------------------------------------------------
  67. #include <xercesc/parsers/DOMBuilderImpl.hpp>
  68. #include <xercesc/util/IOException.hpp>
  69. #include <xercesc/dom/DOMEntityResolver.hpp>
  70. #include <xercesc/dom/DOMErrorHandler.hpp>
  71. #include <xercesc/dom/impl/DOMErrorImpl.hpp>
  72. #include <xercesc/dom/impl/DOMLocatorImpl.hpp>
  73. #include <xercesc/dom/DOMException.hpp>
  74. #include <xercesc/sax/SAXParseException.hpp>
  75. #include <xercesc/internal/XMLScanner.hpp>
  76. #include <xercesc/framework/Wrapper4DOMInputSource.hpp>
  77. #include <xercesc/validators/common/GrammarResolver.hpp>
  78. XERCES_CPP_NAMESPACE_BEGIN
  79. // ---------------------------------------------------------------------------
  80. //  DOMBuilderImpl: Constructors and Destructor
  81. // ---------------------------------------------------------------------------
  82. DOMBuilderImpl::DOMBuilderImpl( XMLValidator* const  valToAdopt
  83.                               , MemoryManager* const manager) :
  84. AbstractDOMParser(valToAdopt, manager)
  85. , fAutoValidation(false)
  86. , fValidation(false)
  87. , fErrorHandler(0)
  88. , fEntityResolver(0)
  89. , fFilter(0)
  90. , fCharsetOverridesXMLEncoding(true)
  91. , fUserAdoptsDocument(false)
  92. {
  93.     // dom spec has different default from scanner's default, so set explicitly
  94.     getScanner()->setNormalizeData(false);
  95. }
  96. DOMBuilderImpl::~DOMBuilderImpl()
  97. {
  98. }
  99. // ---------------------------------------------------------------------------
  100. //  DOMBuilderImpl: Setter methods
  101. // ---------------------------------------------------------------------------
  102. void DOMBuilderImpl::setErrorHandler(DOMErrorHandler* const handler)
  103. {
  104.     fErrorHandler = handler;
  105.     if (fErrorHandler) {
  106.         getScanner()->setErrorReporter(this);
  107.     }
  108.     else {
  109.         getScanner()->setErrorReporter(0);
  110.     }
  111. }
  112. void DOMBuilderImpl::setEntityResolver(DOMEntityResolver* const handler)
  113. {
  114.     fEntityResolver = handler;
  115.     if (fEntityResolver) {
  116.         getScanner()->setEntityHandler(this);
  117.     }
  118.     else {
  119.         getScanner()->setEntityHandler(0);
  120.     }
  121. }
  122. void DOMBuilderImpl::setFilter(DOMBuilderFilter* const filter)
  123. {
  124.     throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
  125. }
  126. // ---------------------------------------------------------------------------
  127. //  DOMBuilderImpl: Feature methods
  128. // ---------------------------------------------------------------------------
  129. void DOMBuilderImpl::setFeature(const XMLCh* const name, const bool state)
  130. {
  131.     if (XMLString::compareIString(name, XMLUni::fgDOMEntities) == 0) {
  132.         setCreateEntityReferenceNodes(state);
  133.     }
  134.     else if (XMLString::compareIString(name, XMLUni::fgDOMComments) == 0) {
  135.         setCreateCommentNodes(state);
  136.     }
  137.     else if (XMLString::compareIString(name, XMLUni::fgDOMDatatypeNormalization) == 0) {
  138.         getScanner()->setNormalizeData(state);
  139.     }
  140.     else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaces) == 0) {
  141.         setDoNamespaces(state);
  142.     }
  143.     else if (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) {
  144.         setIncludeIgnorableWhitespace(state);
  145.     }
  146.     else if (XMLString::compareIString(name, XMLUni::fgDOMValidation) == 0) {
  147.         fValidation = state;
  148.         if (state) {
  149.             if (getValidationScheme() == AbstractDOMParser::Val_Never)
  150.                 setValidationScheme(AbstractDOMParser::Val_Always);
  151.         }
  152.         else {
  153.             setValidationScheme(AbstractDOMParser::Val_Never);
  154.         }
  155.     }
  156.     else if (XMLString::compareIString(name, XMLUni::fgDOMValidateIfSchema) == 0) {
  157.         fAutoValidation = state;
  158.         if (state) {
  159.             setValidationScheme(AbstractDOMParser::Val_Auto);
  160.         }
  161.         else {
  162.             setValidationScheme(AbstractDOMParser::Val_Never);
  163.         }
  164.     }
  165.     else if (XMLString::compareIString(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) {
  166.         // in fact, setting this has no effect to the parser
  167.         fCharsetOverridesXMLEncoding = state;
  168.     }
  169.     else if (XMLString::compareIString(name, XMLUni::fgDOMSupportedMediatypesOnly) == 0 ||
  170.              XMLString::compareIString(name, XMLUni::fgDOMInfoset) == 0 ||
  171.              XMLString::compareIString(name, XMLUni::fgDOMCanonicalForm) == 0 ) {
  172.         if (state)
  173.             throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
  174.     }
  175.     else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaceDeclarations) == 0 ||
  176.              XMLString::compareIString(name, XMLUni::fgDOMCDATASections) == 0 ) {
  177.         if (!state)
  178.             throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
  179.     }
  180.     else if (XMLString::compareIString(name, XMLUni::fgXercesSchema) == 0)
  181.     {
  182.         setDoSchema(state);
  183.     }
  184.     else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaFullChecking) == 0)
  185.     {
  186.         setValidationSchemaFullChecking(state);
  187.     }
  188.     else if (XMLString::compareIString(name, XMLUni::fgXercesUserAdoptsDOMDocument) == 0)
  189.     {
  190.         if(state)
  191.             fUserAdoptsDocument = true;
  192.         else
  193.             fUserAdoptsDocument = false;
  194.     }
  195.     else if (XMLString::compareIString(name, XMLUni::fgXercesLoadExternalDTD) == 0)
  196.     {
  197.         setLoadExternalDTD(state);
  198.     }
  199.     else if (XMLString::compareIString(name, XMLUni::fgXercesContinueAfterFatalError) == 0)
  200.     {
  201.         setExitOnFirstFatalError(!state);
  202.     }
  203.     else if (XMLString::compareIString(name, XMLUni::fgXercesValidationErrorAsFatal) == 0)
  204.     {
  205.         setValidationConstraintFatal(state);
  206.     }
  207.     else if (XMLString::compareIString(name, XMLUni::fgXercesCacheGrammarFromParse) == 0)
  208.     {
  209.         getScanner()->cacheGrammarFromParse(state);
  210.         if (state)
  211.             getScanner()->useCachedGrammarInParse(state);
  212.     }
  213.     else if (XMLString::compareIString(name, XMLUni::fgXercesUseCachedGrammarInParse) == 0)
  214.     {
  215.         if (state || !getScanner()->isCachingGrammarFromParse())
  216.             getScanner()->useCachedGrammarInParse(state);
  217.     }
  218.     else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)
  219.     {
  220.         getScanner()->setCalculateSrcOfs(state);
  221.     }
  222.     else if (XMLString::compareIString(name, XMLUni::fgXercesStandardUriConformant) == 0)
  223.     {
  224.         getScanner()->setStandardUriConformant(state);
  225.     }
  226.     else {
  227.         throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  228.     }
  229. }
  230. bool DOMBuilderImpl::getFeature(const XMLCh* const name) const
  231. {
  232.     if (XMLString::compareIString(name, XMLUni::fgDOMEntities) == 0) {
  233.         return getCreateEntityReferenceNodes();
  234.     }
  235.     else if (XMLString::compareIString(name, XMLUni::fgDOMComments) == 0) {
  236.         return getCreateCommentNodes();
  237.     }
  238.     else if (XMLString::compareIString(name, XMLUni::fgDOMDatatypeNormalization) == 0) {
  239.         return getScanner()->getNormalizeData();
  240.     }
  241.     else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaces) == 0) {
  242.         return getDoNamespaces();
  243.     }
  244.     else if (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) {
  245.         return getIncludeIgnorableWhitespace();
  246.     }
  247.     else if (XMLString::compareIString(name, XMLUni::fgDOMValidation) == 0) {
  248.         return fValidation;
  249.     }
  250.     else if (XMLString::compareIString(name, XMLUni::fgDOMValidateIfSchema) == 0) {
  251.         return fAutoValidation;
  252.     }
  253.     else if (XMLString::compareIString(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) {
  254.         return fCharsetOverridesXMLEncoding;
  255.     }
  256.     else if (XMLString::compareIString(name, XMLUni::fgDOMSupportedMediatypesOnly) == 0 ||
  257.              XMLString::compareIString(name, XMLUni::fgDOMInfoset) == 0 ||
  258.              XMLString::compareIString(name, XMLUni::fgDOMCanonicalForm) == 0 ) {
  259.         return false;
  260.     }
  261.     else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaceDeclarations) == 0 ||
  262.              XMLString::compareIString(name, XMLUni::fgDOMCDATASections) == 0 ) {
  263.         return true;
  264.     }
  265.     else if (XMLString::compareIString(name, XMLUni::fgXercesSchema) == 0)
  266.     {
  267.         return getDoSchema();
  268.     }
  269.     else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaFullChecking) == 0)
  270.     {
  271.         return getValidationSchemaFullChecking();
  272.     }
  273.     else if (XMLString::compareIString(name, XMLUni::fgXercesLoadExternalDTD) == 0)
  274.     {
  275.         return getLoadExternalDTD();
  276.     }
  277.     else if (XMLString::compareIString(name, XMLUni::fgXercesContinueAfterFatalError) == 0)
  278.     {
  279.         return !getExitOnFirstFatalError();
  280.     }
  281.     else if (XMLString::compareIString(name, XMLUni::fgXercesValidationErrorAsFatal) == 0)
  282.     {
  283.         return getValidationConstraintFatal();
  284.     }
  285.     else if (XMLString::compareIString(name, XMLUni::fgXercesCacheGrammarFromParse) == 0)
  286.     {
  287.         return getScanner()->isCachingGrammarFromParse();
  288.     }
  289.     else if (XMLString::compareIString(name, XMLUni::fgXercesUseCachedGrammarInParse) == 0)
  290.     {
  291.         return getScanner()->isUsingCachedGrammarInParse();
  292.     }
  293.     else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)
  294.     {
  295.         return getScanner()->getCalculateSrcOfs();
  296.     }
  297.     else if (XMLString::compareIString(name, XMLUni::fgXercesStandardUriConformant) == 0)
  298.     {
  299.         return getScanner()->getStandardUriConformant();
  300.     }
  301.     else if(XMLString::compareIString(name, XMLUni::fgXercesUserAdoptsDOMDocument) == 0) {
  302.         return fUserAdoptsDocument;
  303.     }
  304.     else {
  305.         throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  306.     }
  307.     return false;
  308. }
  309. bool DOMBuilderImpl::canSetFeature(const XMLCh* const name, const bool state) const
  310. {
  311.     if ((XMLString::compareIString(name, XMLUni::fgDOMEntities) == 0) ||
  312.         (XMLString::compareIString(name, XMLUni::fgDOMComments) == 0) ||
  313.         (XMLString::compareIString(name, XMLUni::fgDOMDatatypeNormalization) == 0) ||
  314.         (XMLString::compareIString(name, XMLUni::fgDOMNamespaces) == 0) ||
  315.         (XMLString::compareIString(name, XMLUni::fgDOMValidation) == 0) ||
  316.         (XMLString::compareIString(name, XMLUni::fgDOMValidateIfSchema) == 0) ||
  317.         (XMLString::compareIString(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) ||
  318.         (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) ||
  319.         (XMLString::compareIString(name, XMLUni::fgXercesUserAdoptsDOMDocument) == 0) ||
  320.         (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0) ||
  321.         (XMLString::compareIString(name, XMLUni::fgXercesStandardUriConformant) == 0)) {
  322.         return true;
  323.     }
  324.     else if (XMLString::compareIString(name, XMLUni::fgDOMSupportedMediatypesOnly) == 0 ||
  325.              XMLString::compareIString(name, XMLUni::fgDOMInfoset) == 0 ||
  326.              XMLString::compareIString(name, XMLUni::fgDOMCanonicalForm) == 0 ) {
  327.         if (!state)
  328.             return true;
  329.     }
  330.     else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaceDeclarations) == 0 ||
  331.              XMLString::compareIString(name, XMLUni::fgDOMCDATASections) == 0 ) {
  332.         if (state)
  333.             return true;
  334.     }
  335.     else if ((XMLString::compareIString(name, XMLUni::fgXercesSchema) == 0) ||
  336.              (XMLString::compareIString(name, XMLUni::fgXercesSchemaFullChecking) == 0) ||
  337.              (XMLString::compareIString(name, XMLUni::fgXercesLoadExternalDTD) == 0) ||
  338.              (XMLString::compareIString(name, XMLUni::fgXercesContinueAfterFatalError) == 0) ||
  339.              (XMLString::compareIString(name, XMLUni::fgXercesValidationErrorAsFatal) == 0) ||
  340.              (XMLString::compareIString(name, XMLUni::fgXercesCacheGrammarFromParse) == 0) ||
  341.              (XMLString::compareIString(name, XMLUni::fgXercesUseCachedGrammarInParse) == 0)) {
  342.         return true;
  343.     }
  344.     return false;
  345. }
  346. // ---------------------------------------------------------------------------
  347. //  DOMBuilderImpl: Non standard extension
  348. // ---------------------------------------------------------------------------
  349. void DOMBuilderImpl::setProperty(const XMLCh* const name, void* value)
  350. {
  351. if (XMLString::compareIString(name, XMLUni::fgXercesSchemaExternalSchemaLocation) == 0)
  352. {
  353. setExternalSchemaLocation((XMLCh*)value);
  354. }
  355. else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation) == 0)
  356. {
  357. setExternalNoNamespaceSchemaLocation((XMLCh*)value);
  358. }
  359. else if (XMLString::compareIString(name, XMLUni::fgXercesSecurityManager) == 0)
  360. {
  361. setSecurityManager((SecurityManager*)value);
  362. }
  363.     else if (XMLString::equals(name, XMLUni::fgXercesScannerName))
  364.     {
  365.         AbstractDOMParser::useScanner((const XMLCh*) value);
  366.     }
  367.     else
  368.       throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  369. }
  370. void* DOMBuilderImpl::getProperty(const XMLCh* const name) const
  371. {
  372.     if (XMLString::compareIString(name, XMLUni::fgXercesSchemaExternalSchemaLocation) == 0)
  373.         return (void*)getExternalSchemaLocation();
  374.     else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation) == 0)
  375.         return (void*)getExternalNoNamespaceSchemaLocation();
  376.     else if (XMLString::compareIString(name, XMLUni::fgXercesSecurityManager) == 0)
  377.         return (void*)getSecurityManager();
  378.     else
  379.         throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  380.     return 0;
  381. }
  382. void DOMBuilderImpl::release()
  383. {
  384.     DOMBuilderImpl* builder = (DOMBuilderImpl*) this;
  385.     delete builder;
  386. }
  387. void DOMBuilderImpl::resetDocumentPool()
  388. {
  389.     resetPool();
  390. }
  391. // ---------------------------------------------------------------------------
  392. //  DOMBuilderImpl: Parsing methods
  393. // ---------------------------------------------------------------------------
  394. DOMDocument* DOMBuilderImpl::parse(const DOMInputSource& source)
  395. {
  396.     Wrapper4DOMInputSource isWrapper((DOMInputSource*) &source, false, getMemoryManager());
  397.     AbstractDOMParser::parse(isWrapper);
  398.     if (fUserAdoptsDocument)
  399.         return adoptDocument();
  400.     else
  401.         return getDocument();
  402. }
  403. DOMDocument* DOMBuilderImpl::parseURI(const XMLCh* const systemId)
  404. {
  405.     AbstractDOMParser::parse(systemId);
  406.     if (fUserAdoptsDocument)
  407.         return adoptDocument();
  408.     else
  409.         return getDocument();
  410. }
  411. DOMDocument* DOMBuilderImpl::parseURI(const char* const systemId)
  412. {
  413.     AbstractDOMParser::parse(systemId);
  414.     if (fUserAdoptsDocument)
  415.         return adoptDocument();
  416.     else
  417.         return getDocument();
  418. }
  419. void DOMBuilderImpl::parseWithContext(const DOMInputSource& source,
  420.                                       DOMNode* const contextNode,
  421.                                       const short action)
  422. {
  423.     throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
  424. }
  425. // ---------------------------------------------------------------------------
  426. //  DOMBuilderImpl: Implementation of the XMLErrorReporter interface
  427. // ---------------------------------------------------------------------------
  428. void DOMBuilderImpl::error( const   unsigned int                code
  429.                             , const XMLCh* const                msgDomain
  430.                             , const XMLErrorReporter::ErrTypes  errType
  431.                             , const XMLCh* const                errorText
  432.                             , const XMLCh* const                systemId
  433.                             , const XMLCh* const                publicId
  434.                             , const XMLSSize_t                  lineNum
  435.                             , const XMLSSize_t                  colNum)
  436. {
  437.     if (fErrorHandler) {
  438.         short severity = DOMError::DOM_SEVERITY_ERROR;
  439.         if (errType == XMLErrorReporter::ErrType_Warning)
  440.             severity = DOMError::DOM_SEVERITY_WARNING;
  441.         else if (errType == XMLErrorReporter::ErrType_Fatal)
  442.             severity = DOMError::DOM_SEVERITY_FATAL_ERROR;
  443.         DOMLocatorImpl location((int)lineNum, (int) colNum, getCurrentNode(), systemId);
  444.         DOMErrorImpl domError(severity, errorText, &location);
  445.         // if user return false, we should stop the process, so throw an error
  446.         if (!fErrorHandler->handleError(domError) && !getScanner()->getInException())
  447.             throw (XMLErrs::Codes) code;
  448.     }
  449. }
  450. void DOMBuilderImpl::resetErrors()
  451. {
  452. }
  453. // ---------------------------------------------------------------------------
  454. //  DOMBuilderImpl: Implementation of XMLEntityHandler interface
  455. // ---------------------------------------------------------------------------
  456. InputSource*
  457. DOMBuilderImpl::resolveEntity(const XMLCh* const publicId,
  458.                               const XMLCh* const systemId,
  459.                               const XMLCh* const baseURI)
  460. {
  461.     //
  462.     //  Just map it to the SAX entity resolver. If there is not one installed,
  463.     //  return a null pointer to cause the default resolution.
  464.     //
  465.     if (fEntityResolver) {
  466.         DOMInputSource* is = fEntityResolver->resolveEntity(publicId, systemId, baseURI);
  467.         if (is)
  468.             return new Wrapper4DOMInputSource(is, true, getMemoryManager());
  469.     }
  470.     return 0;
  471. }
  472. // ---------------------------------------------------------------------------
  473. //  DOMBuilderImpl: Grammar preparsing methods
  474. // ---------------------------------------------------------------------------
  475. Grammar* DOMBuilderImpl::loadGrammar(const char* const systemId,
  476.                                      const short grammarType,
  477.                                      const bool toCache)
  478. {
  479.     // Avoid multiple entrance
  480.     if (getParseInProgress())
  481.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  482. Grammar* grammar = 0;
  483.     try
  484.     {
  485.         setParseInProgress(true);
  486.         grammar = getScanner()->loadGrammar(systemId, grammarType, toCache);
  487.         // Release DOM tree - DTD
  488.         DOMDocument* doc = adoptDocument();
  489.         if (doc)
  490.             doc->release();
  491.         setParseInProgress(false);
  492.     }
  493.     catch(...)
  494.     {
  495.         setParseInProgress(false);
  496.         throw;
  497.     }
  498.     return grammar;
  499. }
  500. Grammar* DOMBuilderImpl::loadGrammar(const XMLCh* const systemId,
  501.                                      const short grammarType,
  502.                                      const bool toCache)
  503. {
  504.     // Avoid multiple entrance
  505.     if (getParseInProgress())
  506.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  507.     Grammar* grammar = 0;
  508.     try
  509.     {
  510.         setParseInProgress(true);
  511.         grammar = getScanner()->loadGrammar(systemId, grammarType, toCache);
  512.         // Release DOM tree - DTD
  513.         DOMDocument* doc = adoptDocument();
  514.         if (doc)
  515.             doc->release();
  516.         setParseInProgress(false);
  517.     }
  518.     catch(...)
  519.     {
  520.         setParseInProgress(false);
  521.         throw;
  522.     }
  523.     return grammar;
  524. }
  525. Grammar* DOMBuilderImpl::loadGrammar(const DOMInputSource& source,
  526.                                      const short grammarType,
  527.                                      const bool toCache)
  528. {
  529.     // Avoid multiple entrance
  530.     if (getParseInProgress())
  531.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  532.     Grammar* grammar = 0;
  533.     try
  534.     {
  535.         Wrapper4DOMInputSource isWrapper((DOMInputSource*) &source, false, getMemoryManager());
  536.         setParseInProgress(true);
  537.         grammar = getScanner()->loadGrammar(isWrapper, grammarType, toCache);
  538.         // Release DOM tree - DTD
  539.         DOMDocument* doc = adoptDocument();
  540.         if (doc)
  541.             doc->release();
  542.         setParseInProgress(false);
  543.     }
  544.     catch(...)
  545.     {
  546.         setParseInProgress(false);
  547.         throw;
  548.     }
  549.     return grammar;
  550. }
  551. void DOMBuilderImpl::resetCachedGrammarPool()
  552. {
  553.     getGrammarResolver()->resetCachedGrammar();
  554. }
  555. Grammar* DOMBuilderImpl::getGrammar(const XMLCh* const nameSpaceKey) const
  556. {
  557.     return getGrammarResolver()->getGrammar(nameSpaceKey);
  558. }
  559. Grammar* DOMBuilderImpl::getRootGrammar() const
  560. {
  561.     return getScanner()->getRootGrammar();
  562. }
  563. const XMLCh* DOMBuilderImpl::getURIText(unsigned int uriId) const
  564. {
  565.     return getScanner()->getURIText(uriId);
  566. }
  567. unsigned int DOMBuilderImpl::getSrcOffset() const
  568. {
  569.     return getScanner()->getSrcOffset();
  570. }
  571. XERCES_CPP_NAMESPACE_END