knoaman 2002/12/03 17:57:10 Modified: c/src/xercesc/parsers XercesDOMParser.cpp SAXParser.hpp SAXParser.cpp SAX2XMLReaderImpl.hpp SAX2XMLReaderImpl.cpp DOMBuilderImpl.cpp AbstractDOMParser.hpp AbstractDOMParser.cpp Log: Scanner re-organization. Revision Changes Path 1.9 +4 -3 xml-xerces/c/src/xercesc/parsers/XercesDOMParser.cpp Index: XercesDOMParser.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/XercesDOMParser.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- XercesDOMParser.cpp 4 Nov 2002 14:57:03 -0000 1.8 +++ XercesDOMParser.cpp 4 Dec 2002 01:57:09 -0000 1.9 @@ -74,6 +74,7 @@ #include <xercesc/util/IOException.hpp> #include <xercesc/internal/XMLScanner.hpp> #include <xercesc/parsers/XercesDOMParser.hpp> +#include <xercesc/validators/common/GrammarResolver.hpp> XERCES_CPP_NAMESPACE_BEGIN @@ -111,7 +112,7 @@ Grammar* XercesDOMParser::getGrammar(const XMLCh* const nameSpaceKey) { - return getScanner()->getGrammar(nameSpaceKey); + return getGrammarResolver()->getGrammar(nameSpaceKey); } Grammar* XercesDOMParser::getRootGrammar() @@ -319,7 +320,7 @@ void XercesDOMParser::resetCachedGrammarPool() { - getScanner()->resetCachedGrammarPool(); + getGrammarResolver()->resetCachedGrammar(); } XERCES_CPP_NAMESPACE_END 1.15 +58 -11 xml-xerces/c/src/xercesc/parsers/SAXParser.hpp Index: SAXParser.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/SAXParser.hpp,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- SAXParser.hpp 4 Nov 2002 14:57:03 -0000 1.14 +++ SAXParser.hpp 4 Dec 2002 01:57:09 -0000 1.15 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.15 2002/12/04 01:57:09 knoaman + * Scanner re-organization. + * * Revision 1.14 2002/11/04 14:57:03 tng * C++ Namespace Support. * @@ -199,6 +202,7 @@ class XMLScanner; class XMLValidator; class Grammar; +class GrammarResolver; /** @@ -478,6 +482,19 @@ 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 * * @param nameSpaceKey Namespace key @@ -730,6 +747,28 @@ */ 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); //@} @@ -1803,6 +1842,11 @@ SAXParser(const SAXParser&); void operator=(const SAXParser&); + // ----------------------------------------------------------------------- + // Initialize/Cleanup methods + // ----------------------------------------------------------------------- + void initialize(); + void cleanUp(); // ----------------------------------------------------------------------- // Private data members @@ -1851,17 +1895,20 @@ // during construction. // // ----------------------------------------------------------------------- - VecAttrListImpl fAttrList; - DocumentHandler* fDocHandler; - DTDHandler* fDTDHandler; - unsigned int fElemDepth; - EntityResolver* fEntityResolver; - ErrorHandler* fErrorHandler; - unsigned int fAdvDHCount; - XMLDocumentHandler** fAdvDHList; - unsigned int fAdvDHListSize; - bool fParseInProgress; - XMLScanner* fScanner; + bool fParseInProgress; + unsigned int fElemDepth; + unsigned int fAdvDHCount; + unsigned int fAdvDHListSize; + VecAttrListImpl fAttrList; + DocumentHandler* fDocHandler; + DTDHandler* fDTDHandler; + EntityResolver* fEntityResolver; + ErrorHandler* fErrorHandler; + XMLDocumentHandler** fAdvDHList; + XMLScanner* fScanner; + GrammarResolver* fGrammarResolver; + XMLStringPool* fURIStringPool; + XMLValidator* fValidator; }; 1.10 +76 -13 xml-xerces/c/src/xercesc/parsers/SAXParser.cpp Index: SAXParser.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/SAXParser.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- SAXParser.cpp 4 Nov 2002 14:57:03 -0000 1.9 +++ SAXParser.cpp 4 Dec 2002 01:57:09 -0000 1.10 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.10 2002/12/04 01:57:09 knoaman + * Scanner re-organization. + * * Revision 1.9 2002/11/04 14:57:03 tng * C++ Namespace Support. * @@ -183,14 +186,16 @@ // --------------------------------------------------------------------------- // Includes // --------------------------------------------------------------------------- +#include <xercesc/parsers/SAXParser.hpp> +#include <xercesc/internal/XMLScannerResolver.hpp> +#include <xercesc/framework/XMLValidator.hpp> #include <xercesc/util/IOException.hpp> #include <xercesc/sax/DocumentHandler.hpp> #include <xercesc/sax/DTDHandler.hpp> #include <xercesc/sax/ErrorHandler.hpp> #include <xercesc/sax/EntityResolver.hpp> #include <xercesc/sax/SAXParseException.hpp> -#include <xercesc/internal/XMLScanner.hpp> -#include <xercesc/parsers/SAXParser.hpp> +#include <xercesc/validators/common/GrammarResolver.hpp> #include <string.h> XERCES_CPP_NAMESPACE_BEGIN @@ -201,32 +206,66 @@ // --------------------------------------------------------------------------- SAXParser::SAXParser(XMLValidator* const valToAdopt) : - fDocHandler(0) - , fDTDHandler(0) + fParseInProgress(false) , fElemDepth(0) + , fAdvDHCount(0) + , fAdvDHListSize(32) + , fDocHandler(0) + , fDTDHandler(0) , fEntityResolver(0) , fErrorHandler(0) - , fAdvDHCount(0) , fAdvDHList(0) - , fAdvDHListSize(32) - , fParseInProgress(false) , fScanner(0) + , fGrammarResolver(0) + , fURIStringPool(0) + , fValidator(valToAdopt) +{ + try + { + initialize(); + } + catch(...) + { + cleanUp(); + throw; + } +} + + +SAXParser::~SAXParser() { + cleanUp(); +} + +// --------------------------------------------------------------------------- +// SAXParser: Initialize/CleanUp methods +// --------------------------------------------------------------------------- +void SAXParser::initialize() +{ + // Create grammar resolver and string pool to pass to scanner + fGrammarResolver = new GrammarResolver(); + fURIStringPool = new XMLStringPool(); + // Create our scanner and tell it what validator to use - fScanner = new XMLScanner(valToAdopt); + fScanner = XMLScannerResolver::getDefaultScanner(fValidator); + fScanner->setGrammarResolver(fGrammarResolver); + fScanner->setURIStringPool(fURIStringPool); // Create the initial advanced handler list array and zero it out fAdvDHList = new XMLDocumentHandler*[fAdvDHListSize]; memset(fAdvDHList, 0, sizeof(void*) * fAdvDHListSize); } - -SAXParser::~SAXParser() +void SAXParser::cleanUp() { delete [] fAdvDHList; delete fScanner; -} + delete fGrammarResolver; + delete fURIStringPool; + if (fValidator) + delete fValidator; +} // --------------------------------------------------------------------------- @@ -396,9 +435,14 @@ return fScanner->isUsingCachedGrammarInParse(); } +bool SAXParser::getCalculateSrcOfs() const +{ + return fScanner->getCalculateSrcOfs(); +} + Grammar* SAXParser::getGrammar(const XMLCh* const nameSpaceKey) { - return fScanner->getGrammar(nameSpaceKey); + return fGrammarResolver->getGrammar(nameSpaceKey); } Grammar* SAXParser::getRootGrammar() @@ -489,6 +533,25 @@ fScanner->useCachedGrammarInParse(newState); } +void SAXParser::setCalculateSrcOfs(const bool newState) +{ + fScanner->setCalculateSrcOfs(newState); +} + +void SAXParser::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); + } +} + // --------------------------------------------------------------------------- // SAXParser: Overrides of the SAX Parser interface @@ -1258,7 +1321,7 @@ void SAXParser::resetCachedGrammarPool() { - fScanner->resetCachedGrammarPool(); + fGrammarResolver->resetCachedGrammar(); } XERCES_CPP_NAMESPACE_END 1.15 +34 -30 xml-xerces/c/src/xercesc/parsers/SAX2XMLReaderImpl.hpp Index: SAX2XMLReaderImpl.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/SAX2XMLReaderImpl.hpp,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- SAX2XMLReaderImpl.hpp 4 Nov 2002 14:57:03 -0000 1.14 +++ SAX2XMLReaderImpl.hpp 4 Dec 2002 01:57:09 -0000 1.15 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.15 2002/12/04 01:57:09 knoaman + * Scanner re-organization. + * * Revision 1.14 2002/11/04 14:57:03 tng * C++ Namespace Support. * @@ -199,6 +202,7 @@ class ContentHandler; class LexicalHandler; class DeclHandler; +class GrammarResolver; /** * This class implements the SAX2 'XMLReader' interface and should be @@ -1643,6 +1647,12 @@ void operator=(const SAX2XMLReaderImpl&); // ----------------------------------------------------------------------- + // Initialize/Cleanup methods + // ----------------------------------------------------------------------- + void initialize(); + void cleanUp(); + + // ----------------------------------------------------------------------- // Private data members // // fAttrList @@ -1722,30 +1732,30 @@ // Indicate if the document has external DTD subset. // // ----------------------------------------------------------------------- - VecAttributesImpl fAttrList ; - ContentHandler* fDocHandler ; - RefVectorOf<XMLAttr>* tempAttrVec ; - - bool fnamespacePrefix; - bool fautoValidation; - bool fValidation; - - XMLBufferMgr fStringBuffers ; - RefStackOf<XMLBuffer> * fPrefixes ; - ValueStackOf<unsigned int> * prefixCounts ; - - DTDHandler* fDTDHandler; - unsigned int fElemDepth; - EntityResolver* fEntityResolver; - ErrorHandler* fErrorHandler; - LexicalHandler* fLexicalHandler; - DeclHandler* fDeclHandler; - unsigned int fAdvDHCount; - XMLDocumentHandler** fAdvDHList; - unsigned int fAdvDHListSize; - bool fParseInProgress; - XMLScanner* fScanner; - bool fHasExternalSubset; + bool fNamespacePrefix; + bool fAutoValidation; + bool fValidation; + bool fParseInProgress; + bool fHasExternalSubset; + unsigned int fElemDepth; + unsigned int fAdvDHCount; + unsigned int fAdvDHListSize; + VecAttributesImpl fAttrList ; + ContentHandler* fDocHandler ; + RefVectorOf<XMLAttr>* fTempAttrVec ; + XMLBufferMgr fStringBuffers ; + RefStackOf<XMLBuffer> * fPrefixes ; + ValueStackOf<unsigned int>* fPrefixCounts ; + DTDHandler* fDTDHandler; + EntityResolver* fEntityResolver; + ErrorHandler* fErrorHandler; + LexicalHandler* fLexicalHandler; + DeclHandler* fDeclHandler; + XMLDocumentHandler** fAdvDHList; + XMLScanner* fScanner; + GrammarResolver* fGrammarResolver; + XMLStringPool* fURIStringPool; + XMLValidator* fValidator; // ----------------------------------------------------------------------- // internal function used to set the state of the parser @@ -1755,7 +1765,6 @@ bool getDoNamespaces() const; void setDoSchema(const bool newState); bool getDoSchema() const; - }; @@ -1800,11 +1809,6 @@ inline bool SAX2XMLReaderImpl::getValidationConstraintFatal() const { return fScanner->getValidationConstraintFatal(); -} - -inline Grammar* SAX2XMLReaderImpl::getGrammar(const XMLCh* const nameSpaceKey) -{ - return fScanner->getGrammar(nameSpaceKey); } inline Grammar* SAX2XMLReaderImpl::getRootGrammar() 1.13 +103 -42 xml-xerces/c/src/xercesc/parsers/SAX2XMLReaderImpl.cpp Index: SAX2XMLReaderImpl.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/SAX2XMLReaderImpl.cpp,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- SAX2XMLReaderImpl.cpp 4 Nov 2002 14:57:03 -0000 1.12 +++ SAX2XMLReaderImpl.cpp 4 Dec 2002 01:57:09 -0000 1.13 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.13 2002/12/04 01:57:09 knoaman + * Scanner re-organization. + * * Revision 1.12 2002/11/04 14:57:03 tng * C++ Namespace Support. * @@ -224,6 +227,7 @@ #include <xercesc/util/XMLChTranscoder.hpp> #include <xercesc/util/RefStackOf.hpp> #include <xercesc/util/XMLUniDefs.hpp> +#include <xercesc/util/Janitor.hpp> #include <xercesc/sax2/ContentHandler.hpp> #include <xercesc/sax2/LexicalHandler.hpp> #include <xercesc/sax2/DeclHandler.hpp> @@ -232,8 +236,9 @@ #include <xercesc/sax/EntityResolver.hpp> #include <xercesc/sax/SAXParseException.hpp> #include <xercesc/sax/SAXException.hpp> -#include <xercesc/internal/XMLScanner.hpp> +#include <xercesc/internal/XMLScannerResolver.hpp> #include <xercesc/parsers/SAX2XMLReaderImpl.hpp> +#include <xercesc/validators/common/GrammarResolver.hpp> #include <string.h> XERCES_CPP_NAMESPACE_BEGIN @@ -245,25 +250,59 @@ }; SAX2XMLReaderImpl::SAX2XMLReaderImpl() : - fDocHandler(0) - , fDTDHandler(0) + + fNamespacePrefix(false) + , fAutoValidation(false) + , fValidation(true) + , fParseInProgress(false) + , fHasExternalSubset(false) , fElemDepth(0) + , fAdvDHCount(0) + , fAdvDHListSize(32) + , fDocHandler(0) + , fTempAttrVec(0) + , fPrefixes(0) + , fPrefixCounts(0) + , fDTDHandler(0) , fEntityResolver(0) , fErrorHandler(0) , fLexicalHandler(0) , fDeclHandler(0) - , fAdvDHCount(0) , fAdvDHList(0) - , fAdvDHListSize(32) - , fParseInProgress(false) , fScanner(0) - , fHasExternalSubset(false) + , fGrammarResolver(0) + , fURIStringPool(0) { - // + try + { + initialize(); + } + catch(...) + { + cleanUp(); + throw; + } +} + +SAX2XMLReaderImpl::~SAX2XMLReaderImpl() +{ + cleanUp(); +} + +// --------------------------------------------------------------------------- +// SAX2XMLReaderImpl: Initialize/Cleanup methods +// --------------------------------------------------------------------------- +void SAX2XMLReaderImpl::initialize() +{ + // Create grammar resolver and string pool that we 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(0); + fScanner = XMLScannerResolver::getDefaultScanner(0); + fScanner->setGrammarResolver(fGrammarResolver); + fScanner->setURIStringPool(fURIStringPool); // Create the initial advanced handler list array and zero it out fAdvDHList = new XMLDocumentHandler*[fAdvDHListSize]; @@ -272,28 +311,24 @@ // SAX2 default is for namespaces (feature http://xml.org/sax/features/namespaces) to be on setDoNamespaces(true) ; - // SAX2 default is for namespaces-prefixes to be off - fnamespacePrefix = false; - - // SAX2 default: validation on, auto-validation off - fValidation = true; - fautoValidation = false; - // default: schema is on setDoSchema(true); fPrefixes = new RefStackOf<XMLBuffer> (10, false) ; - tempAttrVec = new RefVectorOf<XMLAttr> (10, false) ; - prefixCounts = new ValueStackOf<unsigned int>(10) ; + fTempAttrVec = new RefVectorOf<XMLAttr> (10, false) ; + fPrefixCounts = new ValueStackOf<unsigned int>(10) ; } -SAX2XMLReaderImpl::~SAX2XMLReaderImpl() + +void SAX2XMLReaderImpl::cleanUp() { delete [] fAdvDHList; delete fScanner; delete fPrefixes; - delete tempAttrVec; - delete prefixCounts ; + delete fTempAttrVec; + delete fPrefixCounts; + delete fGrammarResolver; + delete fURIStringPool; } // --------------------------------------------------------------------------- @@ -389,6 +424,7 @@ // --------------------------------------------------------------------------- void SAX2XMLReaderImpl::setValidator(XMLValidator* valueToAdopt) { + fValidator = valueToAdopt; fScanner->setValidator(valueToAdopt); } @@ -757,9 +793,9 @@ fElemDepth = 0; // Pop any prefix buffers left over from previous uses - while (!prefixCounts->empty()) + while (!fPrefixCounts->empty()) { - unsigned int numPrefix = prefixCounts->pop(); + unsigned int numPrefix = fPrefixCounts->pop(); for (unsigned int i = 0; i < numPrefix; i++) { XMLBuffer * buf = fPrefixes->pop() ; @@ -817,9 +853,9 @@ const XMLCh* nsURI = 0; const XMLAttr* tempAttr = 0; - if (!fnamespacePrefix) + if (!fNamespacePrefix) { - tempAttrVec->removeAllElements(); + fTempAttrVec->removeAllElements(); } for (unsigned int i = 0; i < attrCount; i++) @@ -832,10 +868,10 @@ nsPrefix = tempAttr->getName(); nsURI = tempAttr->getValue(); } - if (!fnamespacePrefix) + if (!fNamespacePrefix) { if (nsURI == 0) - tempAttrVec->addElement((XMLAttr* const)tempAttr); + fTempAttrVec->addElement((XMLAttr* const)tempAttr); } if (nsURI != 0) { @@ -850,9 +886,9 @@ nsURI = 0; nsPrefix = 0; } - prefixCounts->push(numPrefix) ; - if (!fnamespacePrefix) - fAttrList.setVector(tempAttrVec, tempAttrVec->size(), fScanner); + fPrefixCounts->push(numPrefix) ; + if (!fNamespacePrefix) + fAttrList.setVector(fTempAttrVec, fTempAttrVec->size(), fScanner); else fAttrList.setVector(&attrList, attrCount, fScanner); @@ -891,7 +927,7 @@ elemDecl.getBaseName(), elemQName.getRawBuffer()); - unsigned int numPrefix = prefixCounts->pop(); + unsigned int numPrefix = fPrefixCounts->pop(); for (unsigned int i = 0; i < numPrefix; ++i) { XMLBuffer * buf = fPrefixes->pop() ; @@ -955,7 +991,7 @@ elemDecl.getBaseName(), elemQName.getRawBuffer()); - unsigned int numPrefix = prefixCounts->pop(); + unsigned int numPrefix = fPrefixCounts->pop(); for (unsigned int i = 0; i < numPrefix; i++) { XMLBuffer * buf = fPrefixes->pop() ; @@ -1339,7 +1375,7 @@ { fValidation = value; if (fValidation) - if (fautoValidation) + if (fAutoValidation) setValidationScheme(Val_Auto); else setValidationScheme(Val_Always); @@ -1348,14 +1384,14 @@ } else if (XMLString::compareIString(name, XMLUni::fgSAX2CoreNameSpacePrefixes) == 0) { - fnamespacePrefix = value; + fNamespacePrefix = value; } else if (XMLString::compareIString(name, XMLUni::fgXercesDynamic) == 0) { - fautoValidation = value; + fAutoValidation = value; // for auto validation, the sax2 core validation feature must also be enabled. if (fValidation) - if (fautoValidation) + if (fAutoValidation) setValidationScheme(Val_Auto); else setValidationScheme(Val_Always); @@ -1394,6 +1430,10 @@ if (value || !fScanner->isCachingGrammarFromParse()) fScanner->useCachedGrammarInParse(value); } + else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0) + { + fScanner->setCalculateSrcOfs(value); + } else throw SAXNotRecognizedException("Unknown Feature"); } @@ -1405,9 +1445,9 @@ else if (XMLString::compareIString(name, XMLUni::fgSAX2CoreValidation) == 0) return fValidation; else if (XMLString::compareIString(name, XMLUni::fgSAX2CoreNameSpacePrefixes) == 0) - return fnamespacePrefix; + return fNamespacePrefix; else if (XMLString::compareIString(name, XMLUni::fgXercesDynamic) == 0) - return fautoValidation; + return fAutoValidation; else if (XMLString::compareIString(name, XMLUni::fgXercesSchema) == 0) return getDoSchema(); else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaFullChecking) == 0) @@ -1422,6 +1462,8 @@ return fScanner->isCachingGrammarFromParse(); else if (XMLString::compareIString(name, XMLUni::fgXercesUseCachedGrammarInParse) == 0) return fScanner->isUsingCachedGrammarInParse(); + else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0) + return fScanner->getCalculateSrcOfs(); else throw SAXNotRecognizedException("Unknown Feature"); @@ -1437,13 +1479,24 @@ { fScanner->setExternalSchemaLocation((XMLCh*)value); } - else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation) == 0) { fScanner->setExternalNoNamespaceSchemaLocation((XMLCh*)value); } + else if (XMLString::equals(name, XMLUni::fgXercesScannerName)) + { + XMLScanner* tempScanner = XMLScannerResolver::resolveScanner((const XMLCh*) value, fValidator); - else + if (tempScanner) { + + // REVISIT: set scanner options and handlers + tempScanner->setGrammarResolver(fGrammarResolver); + tempScanner->setURIStringPool(fURIStringPool); + delete fScanner; + fScanner = tempScanner; + } + } + else throw SAXNotRecognizedException("Unknown Property"); } @@ -1454,6 +1507,8 @@ return (void*)fScanner->getExternalSchemaLocation(); else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation) == 0) return (void*)fScanner->getExternalNoNamespaceSchemaLocation(); + else if (XMLString::equals(name, XMLUni::fgXercesScannerName)) + return (void*)fScanner->getName(); else throw SAXNotRecognizedException("Unknown Property"); return 0; @@ -1575,8 +1630,14 @@ void SAX2XMLReaderImpl::resetCachedGrammarPool() { - fScanner->resetCachedGrammarPool(); + fGrammarResolver->resetCachedGrammar(); } + +Grammar* SAX2XMLReaderImpl::getGrammar(const XMLCh* const nameSpaceKey) +{ + return fGrammarResolver->getGrammar(nameSpaceKey); +} + XERCES_CPP_NAMESPACE_END 1.14 +19 -5 xml-xerces/c/src/xercesc/parsers/DOMBuilderImpl.cpp Index: DOMBuilderImpl.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/DOMBuilderImpl.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- DOMBuilderImpl.cpp 4 Nov 2002 14:57:03 -0000 1.13 +++ DOMBuilderImpl.cpp 4 Dec 2002 01:57:09 -0000 1.14 @@ -78,6 +78,7 @@ #include <xercesc/sax/SAXParseException.hpp> #include <xercesc/internal/XMLScanner.hpp> #include <xercesc/framework/Wrapper4DOMInputSource.hpp> +#include <xercesc/validators/common/GrammarResolver.hpp> XERCES_CPP_NAMESPACE_BEGIN @@ -231,7 +232,11 @@ else if (XMLString::compareIString(name, XMLUni::fgXercesUseCachedGrammarInParse) == 0) { if (state || !getScanner()->isCachingGrammarFromParse()) - getScanner()->useCachedGrammarInParse(state); + getScanner()->useCachedGrammarInParse(state); + } + else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0) + { + getScanner()->setCalculateSrcOfs(state); } else { throw DOMException(DOMException::NOT_FOUND_ERR, 0); @@ -304,6 +309,10 @@ { return getScanner()->isUsingCachedGrammarInParse(); } + else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0) + { + return getScanner()->getCalculateSrcOfs(); + } else { throw DOMException(DOMException::NOT_FOUND_ERR, 0); } @@ -320,7 +329,8 @@ (XMLString::compareIString(name, XMLUni::fgDOMValidation) == 0) || (XMLString::compareIString(name, XMLUni::fgDOMValidateIfSchema) == 0) || (XMLString::compareIString(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) || - (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0)) { + (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) || + (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)) { return true; } @@ -362,6 +372,10 @@ { setExternalNoNamespaceSchemaLocation((XMLCh*)value); } + else if (XMLString::equals(name, XMLUni::fgXercesScannerName)) + { + AbstractDOMParser::useScanner((const XMLCh*) value); + } else throw DOMException(DOMException::NOT_FOUND_ERR, 0); } @@ -577,12 +591,12 @@ void DOMBuilderImpl::resetCachedGrammarPool() { - getScanner()->resetCachedGrammarPool(); + getGrammarResolver()->resetCachedGrammar(); } Grammar* DOMBuilderImpl::getGrammar(const XMLCh* const nameSpaceKey) const { - return getScanner()->getGrammar(nameSpaceKey); + return getGrammarResolver()->getGrammar(nameSpaceKey); } Grammar* DOMBuilderImpl::getRootGrammar() const 1.13 +60 -4 xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.hpp Index: AbstractDOMParser.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.hpp,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- AbstractDOMParser.hpp 4 Nov 2002 14:57:03 -0000 1.12 +++ AbstractDOMParser.hpp 4 Dec 2002 01:57:09 -0000 1.13 @@ -61,7 +61,6 @@ #if !defined(ABSTRACTDOMPARSER_HPP) #define ABSTRACTDOMPARSER_HPP - #include <xercesc/dom/DOMDocument.hpp> #include <xercesc/framework/XMLDocumentHandler.hpp> #include <xercesc/framework/XMLErrorReporter.hpp> @@ -81,6 +80,7 @@ class DOMDocumentImpl; class DOMDocumentTypeImpl; class DOMElement; +class GrammarResolver; /** @@ -362,6 +362,19 @@ */ bool getCreateCommentNodes()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; + //@} @@ -611,6 +624,29 @@ */ void setCreateCommentNodes(const bool create); + /** 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 the scanner to use + * when scanning a given XML document. + * + * @param scannerName The name of the desired scanner + */ + void useScanner(const XMLCh* const scannerName); + //@} @@ -1234,6 +1270,12 @@ */ XMLScanner* getScanner() const; + /** Get the Grammar resolver + * + * This provides derived classes with access to the grammar resolver. + */ + GrammarResolver* getGrammarResolver() const; + /** Get the parse in progress flag * * This provides derived classes with access to the parse in progress @@ -1291,6 +1333,12 @@ private : // ----------------------------------------------------------------------- + // Initialize/Cleanup methods + // ----------------------------------------------------------------------- + void initialize(); + void cleanUp(); + + // ----------------------------------------------------------------------- // Private data members // // fCurrentNode @@ -1353,6 +1401,8 @@ bool fIncludeIgnorableWhitespace; bool fWithinElement; bool fParseInProgress; + bool fCreateCommentNodes; + bool fDocumentAdoptedByUser; XMLBufferMgr fBufMgr; XMLScanner* fScanner; DOMNode* fCurrentParent; @@ -1362,8 +1412,9 @@ ValueStackOf<DOMNode*>* fNodeStack; DOMDocumentTypeImpl* fDocumentType; RefVectorOf<DOMDocumentImpl>* fDocumentVector; - bool fCreateCommentNodes; - bool fDocumentAdoptedByUser; + GrammarResolver* fGrammarResolver; + XMLStringPool* fURIStringPool; + XMLValidator* fValidator; XMLBuffer& fInternalSubset; }; @@ -1394,6 +1445,11 @@ inline XMLScanner* AbstractDOMParser::getScanner() const { return fScanner; +} + +inline GrammarResolver* AbstractDOMParser::getGrammarResolver() const +{ + return fGrammarResolver; } inline bool AbstractDOMParser::getCreateCommentNodes() const 1.28 +73 -17 xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.cpp Index: AbstractDOMParser.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.cpp,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- AbstractDOMParser.cpp 4 Nov 2002 14:57:03 -0000 1.27 +++ AbstractDOMParser.cpp 4 Dec 2002 01:57:09 -0000 1.28 @@ -68,13 +68,14 @@ // --------------------------------------------------------------------------- // Includes // --------------------------------------------------------------------------- +#include <xercesc/parsers/AbstractDOMParser.hpp> +#include <xercesc/internal/XMLScannerResolver.hpp> +#include <xercesc/internal/ElemStack.hpp> #include <xercesc/sax/EntityResolver.hpp> #include <xercesc/util/XMLUniDefs.hpp> #include <xercesc/framework/XMLNotationDecl.hpp> +#include <xercesc/framework/XMLValidator.hpp> #include <xercesc/util/IOException.hpp> -#include <xercesc/internal/XMLScanner.hpp> -#include <xercesc/validators/DTD/DTDValidator.hpp> -#include <xercesc/parsers/AbstractDOMParser.hpp> #include <xercesc/dom/DOMImplementation.hpp> #include <xercesc/dom/DOMElement.hpp> #include <xercesc/dom/impl/DOMAttrImpl.hpp> @@ -92,9 +93,9 @@ #include <xercesc/dom/DOMProcessingInstruction.hpp> #include <xercesc/dom/impl/DOMProcessingInstructionImpl.hpp> #include <xercesc/dom/impl/DOMNodeIDMap.hpp> - #include <xercesc/validators/common/ContentSpecNode.hpp> -#include <xercesc/validators/DTD/DTDAttDefList.hpp> +#include <xercesc/validators/common/GrammarResolver.hpp> + XERCES_CPP_NAMESPACE_BEGIN @@ -108,6 +109,8 @@ , fIncludeIgnorableWhitespace(true) , fWithinElement(false) , fParseInProgress(false) +, fCreateCommentNodes(true) +, fDocumentAdoptedByUser(false) , fScanner(0) , fCurrentParent(0) , fCurrentNode(0) @@ -116,34 +119,65 @@ , fNodeStack(0) , fDocumentType(0) , fDocumentVector(0) -, fCreateCommentNodes(true) -, fDocumentAdoptedByUser(false) +, fGrammarResolver(0) +, fURIStringPool(0) +, fValidator(valToAdopt) , fInternalSubset(fBufMgr.bidOnBuffer()) { - // + try + { + initialize(); + } + catch(...) + { + cleanUp(); + throw; + } +} + + +AbstractDOMParser::~AbstractDOMParser() +{ + cleanUp(); +} + +// --------------------------------------------------------------------------- +// AbstractDOMParser: Initialize/CleanUp methods +// --------------------------------------------------------------------------- +void AbstractDOMParser::initialize() +{ + // Create grammar resolver and 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<DOMNode*>(64); this->reset(); } - -AbstractDOMParser::~AbstractDOMParser() +void AbstractDOMParser::cleanUp() { if (fDocumentVector) delete fDocumentVector; if (!fDocumentAdoptedByUser) delete fDocument; + delete fNodeStack; delete fScanner; -} + delete fGrammarResolver; + delete fURIStringPool; + if (fValidator) + delete fValidator; +} // --------------------------------------------------------------------------- // AbstractDOMParser: Utilities @@ -266,6 +300,11 @@ return fScanner->getLoadExternalDTD(); } +bool AbstractDOMParser::getCalculateSrcOfs() const +{ + return fScanner->getCalculateSrcOfs(); +} + // --------------------------------------------------------------------------- // AbstractDOMParser: Setter methods @@ -328,6 +367,24 @@ fScanner->setLoadExternalDTD(newState); } +void AbstractDOMParser::setCalculateSrcOfs(const bool newState) +{ + fScanner->setCalculateSrcOfs(newState); +} + +void AbstractDOMParser::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); + } +} // --------------------------------------------------------------------------- // AbstractDOMParser: Parsing methods @@ -801,10 +858,9 @@ // done here. const XMLCh* qualifiedName = attr->getFullName(); XMLBufBid bbPrefixQName(&fBufMgr); - XMLBufBid bbQName(&fBufMgr); XMLBuffer& prefixBuf = bbPrefixQName.getBuffer(); - XMLBuffer& nameBuf = bbQName.getBuffer(); - unsigned int uriId = fScanner->resolveQName(qualifiedName, nameBuf, prefixBuf, ElemStack::Mode_Attribute); + int colonPos = -1; + unsigned int uriId = fScanner->resolveQName(qualifiedName, prefixBuf, ElemStack::Mode_Attribute, colonPos); const XMLCh* namespaceURI = 0; if (XMLString::equals(qualifiedName, XMLNS)) //for xmlns=...
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]