diff --git a/src/xercesc/dom/deprecated/DOMParser.cpp b/src/xercesc/dom/deprecated/DOMParser.cpp index 593eb9a0eb78155e0d59ec1ffff438d0e0164ee8..0f6c9d0d94951412591b229ebded9da1f725e392 100644 --- a/src/xercesc/dom/deprecated/DOMParser.cpp +++ b/src/xercesc/dom/deprecated/DOMParser.cpp @@ -68,14 +68,15 @@ // --------------------------------------------------------------------------- // Includes // --------------------------------------------------------------------------- +#include <xercesc/internal/XMLScannerResolver.hpp> #include <xercesc/sax/EntityResolver.hpp> #include <xercesc/util/XMLUniDefs.hpp> #include <xercesc/sax/ErrorHandler.hpp> #include <xercesc/sax/SAXParseException.hpp> #include <xercesc/framework/XMLNotationDecl.hpp> #include <xercesc/util/IOException.hpp> -#include <xercesc/internal/XMLScanner.hpp> -#include <xercesc/validators/DTD/DTDValidator.hpp> +#include <xercesc/framework/XMLValidator.hpp> +#include <xercesc/validators/common/GrammarResolver.hpp> #include "DOMParser.hpp" #include "ElementImpl.hpp" #include "AttrImpl.hpp" @@ -100,35 +101,68 @@ XERCES_CPP_NAMESPACE_BEGIN // --------------------------------------------------------------------------- DOMParser::DOMParser(XMLValidator* const valToAdopt) : -fErrorHandler(0) -, fEntityResolver(0) -, fCreateEntityReferenceNodes(true) -, fToCreateXMLDeclTypeNode(false) -, fIncludeIgnorableWhitespace(true) -, fNodeStack(0) -, fScanner(0) + fToCreateXMLDeclTypeNode(false) + , fCreateEntityReferenceNodes(true) + , fIncludeIgnorableWhitespace(true) + , fParseInProgress(false) + , fWithinElement(false) + , fEntityResolver(0) + , fErrorHandler(0) + , fNodeStack(0) + , fScanner(0) + , fDocumentType(0) + , fGrammarResolver(0) + , fURIStringPool(0) + , fValidator(valToAdopt) { - // + try + { + initialize(); + } + catch(...) + { + cleanUp(); + throw; + } +} + + +DOMParser::~DOMParser() +{ + cleanUp(); +} + +// --------------------------------------------------------------------------- +// DOMParser: Initialize/CleanUp methods +// --------------------------------------------------------------------------- +void DOMParser::initialize() +{ + // Create grammar resolver and URI string pool to pass to the scanner + fGrammarResolver = new GrammarResolver(); + fURIStringPool = new XMLStringPool(); + // Create a scanner and tell it what validator to use. Then set us // as the document event handler so we can fill the DOM document. - // - fScanner = new XMLScanner(valToAdopt); + fScanner = XMLScannerResolver::getDefaultScanner(fValidator); fScanner->setDocHandler(this); fScanner->setDocTypeHandler(this); + fScanner->setGrammarResolver(fGrammarResolver); + fScanner->setURIStringPool(fURIStringPool); fNodeStack = new ValueStackOf<DOM_Node>(64); this->reset(); - - } - -DOMParser::~DOMParser() -{ +void DOMParser::cleanUp() +{ delete fNodeStack; delete fScanner; -} + delete fGrammarResolver; + delete fURIStringPool; + if (fValidator) + delete fValidator; +} void DOMParser::reset() { @@ -221,7 +255,7 @@ bool DOMParser::isUsingCachedGrammarInParse() const Grammar* DOMParser::getGrammar(const XMLCh* const nameSpaceKey) { - return fScanner->getGrammar(nameSpaceKey); + return fGrammarResolver->getGrammar(nameSpaceKey); } Grammar* DOMParser::getRootGrammar() @@ -234,6 +268,10 @@ const XMLCh* DOMParser::getURIText(unsigned int uriId) return fScanner->getURIText(uriId); } +bool DOMParser::getCalculateSrcOfs() const +{ + return fScanner->getCalculateSrcOfs(); +} // --------------------------------------------------------------------------- // DOMParser: Setter methods @@ -329,6 +367,24 @@ void DOMParser::useCachedGrammarInParse(const bool newState) fScanner->useCachedGrammarInParse(newState); } +void DOMParser::setCalculateSrcOfs(const bool newState) +{ + fScanner->setCalculateSrcOfs(newState); +} + +void DOMParser::useScanner(const XMLCh* const scannerName) +{ + XMLScanner* tempScanner = XMLScannerResolver::resolveScanner(scannerName, fValidator); + + if (tempScanner) { + + // REVISIT: need to set scanner options and handlers + delete fScanner; + fScanner = tempScanner; + fScanner->setGrammarResolver(fGrammarResolver); + fScanner->setURIStringPool(fURIStringPool); + } +} // --------------------------------------------------------------------------- // DOMParser: Parsing methods @@ -1340,7 +1396,7 @@ Grammar* DOMParser::loadGrammar(const InputSource& source, void DOMParser::resetCachedGrammarPool() { - fScanner->resetCachedGrammarPool(); + fGrammarResolver->resetCachedGrammar(); } XERCES_CPP_NAMESPACE_END diff --git a/src/xercesc/dom/deprecated/DOMParser.hpp b/src/xercesc/dom/deprecated/DOMParser.hpp index e90bd19c12c515d537162020aecf46d84a3cff7f..055e57d6bf145718504e33fdcb678bd0a048ff9f 100644 --- a/src/xercesc/dom/deprecated/DOMParser.hpp +++ b/src/xercesc/dom/deprecated/DOMParser.hpp @@ -62,7 +62,6 @@ #if !defined(DOMPARSER_HPP) #define DOMPARSER_HPP - #include <xercesc/framework/XMLDocumentHandler.hpp> #include <xercesc/framework/XMLErrorReporter.hpp> #include <xercesc/framework/XMLEntityHandler.hpp> @@ -82,7 +81,7 @@ class XMLPScanToken; class XMLScanner; class XMLValidator; class Grammar; - +class GrammarResolver; /** * This class implements the Document Object Model (DOM) interface. @@ -401,6 +400,19 @@ public : */ bool isUsingCachedGrammarInParse() const; + /** + * Get the 'calculate src offset flag' + * + * This method returns the state of the parser's src offset calculation + * when parsing an XML document. + * + * @return true, if the parser is currently configured to + * calculate src offsets, false otherwise. + * + * @see #setCalculateSrcOfs + */ + bool getCalculateSrcOfs() const; + /** * Retrieve the grammar that is associated with the specified namespace key * @@ -726,6 +738,29 @@ public : */ void useCachedGrammarInParse(const bool newState); + /** Enable/disable src offset calculation + * + * This method allows users to enable/disable src offset calculation. + * Disabling the calculation will improve performance. + * + * The parser's default state is: true. + * + * @param newState The value specifying whether we should enable or + * disable src offset calculation + * + * @see #getCalculateSrcOfs + */ + void setCalculateSrcOfs(const bool newState); + + /** Set the scanner to use when scanning the XML document + * + * This method allows users to set the scanner to use + * when scanning a given XML document. + * + * @param scannerName The name of the desired scanner + */ + void useScanner(const XMLCh* const scannerName); + //@} @@ -1612,6 +1647,12 @@ protected : private : + // ----------------------------------------------------------------------- + // Protected setter methods + // ----------------------------------------------------------------------- + void initialize(); + void cleanUp(); + // ----------------------------------------------------------------------- // Private data members // @@ -1661,23 +1702,25 @@ private : // This is an extension to xerces implementation // // ----------------------------------------------------------------------- + bool fToCreateXMLDeclTypeNode; + bool fCreateEntityReferenceNodes; + bool fIncludeIgnorableWhitespace; + bool fParseInProgress; + bool fWithinElement; DOM_Node fCurrentParent; DOM_Node fCurrentNode; DOM_Document fDocument; EntityResolver* fEntityResolver; ErrorHandler* fErrorHandler; - bool fCreateEntityReferenceNodes; - bool fIncludeIgnorableWhitespace; ValueStackOf<DOM_Node>* fNodeStack; - bool fParseInProgress; XMLScanner* fScanner; - bool fWithinElement; DocumentTypeImpl* fDocumentType; - bool fToCreateXMLDeclTypeNode; + GrammarResolver* fGrammarResolver; + XMLStringPool* fURIStringPool; + XMLValidator* fValidator; }; - // --------------------------------------------------------------------------- // DOMParser: Handlers for the XMLEntityHandler interface // --------------------------------------------------------------------------- @@ -1788,7 +1831,6 @@ inline DOM_Node DOMParser::getCurrentNode() return fCurrentNode; } - // --------------------------------------------------------------------------- // DOMParser: Protected setter methods // ---------------------------------------------------------------------------