SAX2XMLReaderImpl.cpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:47k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2001 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.  * $Log: SAX2XMLReaderImpl.cpp,v $
  58.  * Revision 1.20  2001/11/20 18:51:44  tng
  59.  * Schema: schemaLocation and noNamespaceSchemaLocation to be specified outside the instance document.  New methods setExternalSchemaLocation and setExternalNoNamespaceSchemaLocation are added (for SAX2, two new properties are added).
  60.  *
  61.  * Revision 1.19  2001/10/25 19:46:15  tng
  62.  * Comment outside root element should also be reported.
  63.  *
  64.  * Revision 1.18  2001/09/12 13:03:43  tng
  65.  * [Bug 3155] SAX2 does not offer progressive parse.
  66.  *
  67.  * Revision 1.17  2001/08/02 19:00:46  tng
  68.  * [Bug 1329] SAX2XMLReaderImpl leaks XMLBuffers.
  69.  *
  70.  * Revision 1.16  2001/08/01 19:11:02  tng
  71.  * Add full schema constraint checking flag to the samples and the parser.
  72.  *
  73.  * Revision 1.15  2001/06/27 17:39:50  knoaman
  74.  * Fix for bug #2353.
  75.  *
  76.  * Revision 1.14  2001/06/19 16:45:08  tng
  77.  * Add installAdvDocHandler to SAX2XMLReader as the code is there already.
  78.  *
  79.  * Revision 1.13  2001/06/03 19:26:19  jberry
  80.  * Add support for querying error count following parse; enables simple parse without requiring error handler.
  81.  *
  82.  * Revision 1.12  2001/05/11 13:26:21  tng
  83.  * Copyright update.
  84.  *
  85.  * Revision 1.11  2001/05/03 20:34:33  tng
  86.  * Schema: SchemaValidator update
  87.  *
  88.  * Revision 1.10  2001/03/30 16:46:57  tng
  89.  * Schema: Use setDoSchema instead of setSchemaValidation which makes more sense.
  90.  *
  91.  * Revision 1.9  2001/03/21 21:56:08  tng
  92.  * Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
  93.  *
  94.  * Revision 1.8  2001/02/15 15:56:29  tng
  95.  * Schema: Add setSchemaValidation and getSchemaValidation for DOMParser and SAXParser.
  96.  * Add feature "http://apache.org/xml/features/validation/schema" for SAX2XMLReader.
  97.  * New data field  fSchemaValidation in XMLScanner as the flag.
  98.  *
  99.  * Revision 1.7  2001/01/15 21:26:33  tng
  100.  * Performance Patches by David Bertoni.
  101.  *
  102.  * Details: (see xerces-c-dev mailing Jan 14)
  103.  * XMLRecognizer.cpp: the internal encoding string XMLUni::fgXMLChEncodingString
  104.  * was going through this function numerous times.  As a result, the top hot-spot
  105.  * for the parse was _wcsicmp().  The real problem is that the Microsofts wide string
  106.  * functions are unbelievably slow.  For things like encodings, it might be
  107.  * better to use a special comparison function that only considers a-z and
  108.  * A-Z as characters with case.  This works since the character set for
  109.  * encodings is limit to printable ASCII characters.
  110.  *
  111.  *  XMLScanner2.cpp: This also has some case-sensitive vs. insensitive compares.
  112.  * They are also much faster.  The other tweak is to only make a copy of an attribute
  113.  * string if it needs to be split.  And then, the strategy is to try to use a
  114.  * stack-based buffer, rather than a dynamically-allocated one.
  115.  *
  116.  * SAX2XMLReaderImpl.cpp: Again, more case-sensitive vs. insensitive comparisons.
  117.  *
  118.  * KVStringPair.cpp & hpp: By storing the size of the allocation, the storage can
  119.  * likely be re-used many times, cutting down on dynamic memory allocations.
  120.  *
  121.  * XMLString.hpp: a more efficient implementation of stringLen().
  122.  *
  123.  * DTDValidator.cpp: another case of using a stack-based buffer when possible
  124.  *
  125.  * These patches made a big difference in parse time in some of our test
  126.  * files, especially the ones are very attribute-heavy.
  127.  *
  128.  * Revision 1.6  2000/12/22 20:41:52  tng
  129.  * XMLUni::fgEmptyString which is defined as "EMPTY" is incorrectly used as an empty string; in fact XMLUni::fgZeroLenString should be used instead
  130.  *
  131.  * Revision 1.5  2000/12/22 15:16:51  tng
  132.  * SAX2-ext's LexicalHandler support added by David Bertoni.
  133.  *
  134.  * Revision 1.4  2000/08/09 23:39:58  jpolast
  135.  * should be namespace-prefixes; not namespaces-prefixes
  136.  *
  137.  * Revision 1.3  2000/08/09 22:16:12  jpolast
  138.  * many conformance & stability changes:
  139.  *   - ContentHandler::resetDocument() removed
  140.  *   - attrs param of ContentHandler::startDocument() made const
  141.  *   - SAXExceptions thrown now have msgs
  142.  *   - removed duplicate function signatures that had 'const'
  143.  *       [ eg: getContentHander() ]
  144.  *   - changed getFeature and getProperty to apply to const objs
  145.  *   - setProperty now takes a void* instead of const void*
  146.  *   - SAX2XMLReaderImpl does not inherit from SAXParser anymore
  147.  *   - Reuse Validator (http://apache.org/xml/features/reuse-validator) implemented
  148.  *   - Features & Properties now read-only during parse
  149.  *
  150.  * Revision 1.2  2000/08/07 22:53:44  jpolast
  151.  * fixes for when 'namespaces' feature is turned off:
  152.  *   * namespaces-prefixes only used when namespaces is on
  153.  *   * URIs not looked up when namespaces is off, blank string instead
  154.  *   * default validation scheme is validation on, auto-validation off.
  155.  *
  156.  * Revision 1.1  2000/08/02 18:04:41  jpolast
  157.  * initial checkin of sax2 implemenation
  158.  * submitted by Simon Fell (simon@fell.com)
  159.  * and Joe Polastre (jpolast@apache.org)
  160.  *
  161.  *
  162.  */
  163. #include <util/IOException.hpp>
  164. #include <util/XMLChTranscoder.hpp>
  165. #include <util/RefStackOf.hpp>
  166. #include <util/XMLUniDefs.hpp>
  167. #include <sax2/ContentHandler.hpp>
  168. #include <sax2/LexicalHandler.hpp>
  169. #include <sax/DTDHandler.hpp>
  170. #include <sax/ErrorHandler.hpp>
  171. #include <sax/EntityResolver.hpp>
  172. #include <sax/SAXParseException.hpp>
  173. #include <sax/SAXException.hpp>
  174. #include <internal/XMLScanner.hpp>
  175. #include <parsers/SAX2XMLReaderImpl.hpp>
  176. #include <string.h>
  177. // SAX2 Core: http://xml.org/sax/features/validation
  178. const XMLCh SAX2XMLReaderImpl::SAX_CORE_VALIDATION[] = {
  179. chLatin_h, chLatin_t, chLatin_t, chLatin_p,
  180. chColon, chForwardSlash, chForwardSlash,
  181. chLatin_x, chLatin_m, chLatin_l, chPeriod,
  182. chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
  183. chLatin_s, chLatin_a, chLatin_x, chForwardSlash,
  184. chLatin_f, chLatin_e, chLatin_a,
  185. chLatin_t, chLatin_u, chLatin_r,
  186. chLatin_e, chLatin_s, chForwardSlash,
  187. chLatin_v, chLatin_a, chLatin_l,
  188. chLatin_i, chLatin_d, chLatin_a, chLatin_t,
  189. chLatin_i, chLatin_o, chLatin_n, chNull
  190. };
  191. // SAX2 Core: http://xml.org/sax/features/namespaces
  192. const XMLCh SAX2XMLReaderImpl::SAX_CORE_NAMESPACES[] = {
  193. chLatin_h, chLatin_t, chLatin_t, chLatin_p,
  194. chColon, chForwardSlash, chForwardSlash,
  195. chLatin_x, chLatin_m, chLatin_l, chPeriod,
  196. chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
  197. chLatin_s, chLatin_a, chLatin_x, chForwardSlash,
  198. chLatin_f, chLatin_e, chLatin_a,
  199. chLatin_t, chLatin_u, chLatin_r,
  200. chLatin_e, chLatin_s, chForwardSlash,
  201. chLatin_n, chLatin_a, chLatin_m,
  202. chLatin_e, chLatin_s, chLatin_p, chLatin_a,
  203. chLatin_c, chLatin_e, chLatin_s, chNull
  204. };
  205. //SAX2 Core: http://xml.org/sax/features/namespace-prefixes
  206. const XMLCh SAX2XMLReaderImpl::SAX_CORE_NAMESPACE_PREFIXES[] = {
  207. chLatin_h, chLatin_t, chLatin_t, chLatin_p,
  208. chColon, chForwardSlash, chForwardSlash,
  209. chLatin_x, chLatin_m, chLatin_l, chPeriod,
  210. chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
  211. chLatin_s, chLatin_a, chLatin_x, chForwardSlash,
  212. chLatin_f, chLatin_e, chLatin_a,
  213. chLatin_t, chLatin_u, chLatin_r,
  214. chLatin_e, chLatin_s, chForwardSlash,
  215. chLatin_n, chLatin_a, chLatin_m,
  216. chLatin_e, chLatin_s, chLatin_p, chLatin_a,
  217. chLatin_c, chLatin_e,
  218. chDash, chLatin_p, chLatin_r, chLatin_e,
  219. chLatin_f, chLatin_i, chLatin_x,
  220. chLatin_e, chLatin_s, chNull
  221. };
  222. //Xerces: http://apache.org/xml/features/validation/dynamic
  223. const XMLCh SAX2XMLReaderImpl::SAX_XERCES_DYNAMIC[] = {
  224. chLatin_h, chLatin_t, chLatin_t, chLatin_p,
  225. chColon, chForwardSlash, chForwardSlash,
  226. chLatin_a, chLatin_p, chLatin_a, chLatin_c, chLatin_h, chLatin_e, chPeriod,
  227. chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
  228. chLatin_x, chLatin_m, chLatin_l, chForwardSlash,
  229. chLatin_f, chLatin_e, chLatin_a,
  230. chLatin_t, chLatin_u, chLatin_r,
  231. chLatin_e, chLatin_s, chForwardSlash,
  232. chLatin_v, chLatin_a, chLatin_l,
  233. chLatin_i, chLatin_d, chLatin_a, chLatin_t,
  234. chLatin_i, chLatin_o, chLatin_n, chForwardSlash,
  235. chLatin_d, chLatin_y, chLatin_n, chLatin_a,
  236. chLatin_m, chLatin_i, chLatin_c, chNull
  237. };
  238. //Xerces: http://apache.org/xml/features/validation/reuse-grammar
  239. const XMLCh SAX2XMLReaderImpl::SAX_XERCES_REUSEGRAMMAR[] = {
  240. chLatin_h, chLatin_t, chLatin_t, chLatin_p,
  241. chColon, chForwardSlash, chForwardSlash,
  242. chLatin_a, chLatin_p, chLatin_a, chLatin_c, chLatin_h, chLatin_e, chPeriod,
  243. chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
  244. chLatin_x, chLatin_m, chLatin_l, chForwardSlash,
  245. chLatin_f, chLatin_e, chLatin_a,
  246. chLatin_t, chLatin_u, chLatin_r,
  247. chLatin_e, chLatin_s, chForwardSlash,
  248. chLatin_v, chLatin_a, chLatin_l,
  249. chLatin_i, chLatin_d, chLatin_a, chLatin_t,
  250. chLatin_i, chLatin_o, chLatin_n, chForwardSlash,
  251. chLatin_r, chLatin_e, chLatin_u, chLatin_s, chLatin_e, chDash,
  252.       chLatin_g, chLatin_r, chLatin_a, chLatin_m, chLatin_m,
  253.       chLatin_a, chLatin_r, chNull
  254. };
  255. //Xerces: http://apache.org/xml/features/validation/schema
  256. const XMLCh SAX2XMLReaderImpl::SAX_XERCES_SCHEMA[] = {
  257. chLatin_h, chLatin_t, chLatin_t, chLatin_p,
  258. chColon, chForwardSlash, chForwardSlash,
  259. chLatin_a, chLatin_p, chLatin_a, chLatin_c, chLatin_h, chLatin_e, chPeriod,
  260. chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
  261. chLatin_x, chLatin_m, chLatin_l, chForwardSlash,
  262. chLatin_f, chLatin_e, chLatin_a,
  263. chLatin_t, chLatin_u, chLatin_r,
  264. chLatin_e, chLatin_s, chForwardSlash,
  265. chLatin_v, chLatin_a, chLatin_l,
  266. chLatin_i, chLatin_d, chLatin_a, chLatin_t,
  267. chLatin_i, chLatin_o, chLatin_n, chForwardSlash,
  268. chLatin_s, chLatin_c, chLatin_h, chLatin_e,
  269. chLatin_m, chLatin_a, chNull
  270. };
  271. //Xerces: http://apache.org/xml/features/validation/schema-full-checking
  272. const XMLCh SAX2XMLReaderImpl::SAX_XERCES_SCHEMA_FULL_CHECKING[] = {
  273. chLatin_h, chLatin_t, chLatin_t, chLatin_p,
  274. chColon, chForwardSlash, chForwardSlash,
  275. chLatin_a, chLatin_p, chLatin_a, chLatin_c, chLatin_h, chLatin_e, chPeriod,
  276. chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
  277. chLatin_x, chLatin_m, chLatin_l, chForwardSlash,
  278. chLatin_f, chLatin_e, chLatin_a,
  279. chLatin_t, chLatin_u, chLatin_r,
  280. chLatin_e, chLatin_s, chForwardSlash,
  281. chLatin_v, chLatin_a, chLatin_l,
  282. chLatin_i, chLatin_d, chLatin_a, chLatin_t,
  283. chLatin_i, chLatin_o, chLatin_n, chForwardSlash,
  284. chLatin_s, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a,
  285.       chDash, chLatin_f, chLatin_u, chLatin_l, chLatin_l,
  286.       chDash, chLatin_c, chLatin_h, chLatin_e, chLatin_c, chLatin_k,
  287.       chLatin_i, chLatin_n, chLatin_g, chNull
  288. };
  289. //deprecated
  290. //Xerces: http://apache.org/xml/features/validation/reuse-validator
  291. const XMLCh SAX2XMLReaderImpl::SAX_XERCES_REUSEVALIDATOR[] = {
  292. chLatin_h, chLatin_t, chLatin_t, chLatin_p,
  293. chColon, chForwardSlash, chForwardSlash,
  294. chLatin_a, chLatin_p, chLatin_a, chLatin_c, chLatin_h, chLatin_e, chPeriod,
  295. chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
  296. chLatin_x, chLatin_m, chLatin_l, chForwardSlash,
  297. chLatin_f, chLatin_e, chLatin_a,
  298. chLatin_t, chLatin_u, chLatin_r,
  299. chLatin_e, chLatin_s, chForwardSlash,
  300. chLatin_v, chLatin_a, chLatin_l,
  301. chLatin_i, chLatin_d, chLatin_a, chLatin_t,
  302. chLatin_i, chLatin_o, chLatin_n, chForwardSlash,
  303. chLatin_r, chLatin_e, chLatin_u, chLatin_s,
  304. chLatin_e, chDash, chLatin_v,
  305. chLatin_a, chLatin_l,
  306. chLatin_i, chLatin_d, chLatin_a, chLatin_t,
  307. chLatin_o, chLatin_r, chNull
  308. };
  309. //Property
  310. //Xerces: http://apache.org/xml/properties/schema/external-schemaLocation
  311. const XMLCh SAX2XMLReaderImpl::SAX_XERCES_SCHEMA_EXTERNAL_SCHEMALOCATION[] = {
  312. chLatin_h, chLatin_t, chLatin_t, chLatin_p,
  313. chColon, chForwardSlash, chForwardSlash,
  314. chLatin_a, chLatin_p, chLatin_a, chLatin_c, chLatin_h, chLatin_e, chPeriod,
  315. chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
  316. chLatin_x, chLatin_m, chLatin_l, chForwardSlash,
  317. chLatin_p, chLatin_r, chLatin_o, chLatin_p, chLatin_e, chLatin_r,
  318.       chLatin_t, chLatin_i, chLatin_e, chLatin_s, chForwardSlash,
  319. chLatin_s, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a, chForwardSlash,
  320. chLatin_e, chLatin_x, chLatin_t, chLatin_e, chLatin_r, chLatin_n, chLatin_a, chLatin_l, chDash,
  321.       chLatin_s, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a,
  322.       chLatin_L, chLatin_o, chLatin_c, chLatin_a, chLatin_t, chLatin_i, chLatin_o, chLatin_n, chNull
  323. };
  324. //Property
  325. //Xerces: http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation
  326. const XMLCh SAX2XMLReaderImpl::SAX_XERCES_SCHEMA_EXTERNAL_NONAMESPACESCHEMALOCATION[] = {
  327. chLatin_h, chLatin_t, chLatin_t, chLatin_p,
  328. chColon, chForwardSlash, chForwardSlash,
  329. chLatin_a, chLatin_p, chLatin_a, chLatin_c, chLatin_h, chLatin_e, chPeriod,
  330. chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
  331. chLatin_x, chLatin_m, chLatin_l, chForwardSlash,
  332. chLatin_p, chLatin_r, chLatin_o, chLatin_p, chLatin_e, chLatin_r,
  333.       chLatin_t, chLatin_i, chLatin_e, chLatin_s, chForwardSlash,
  334. chLatin_s, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a, chForwardSlash,
  335. chLatin_e, chLatin_x, chLatin_t, chLatin_e, chLatin_r, chLatin_n, chLatin_a, chLatin_l, chDash,
  336.       chLatin_n, chLatin_o, chLatin_N, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chLatin_p, chLatin_a, chLatin_c, chLatin_e,
  337.       chLatin_S, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a,
  338.       chLatin_L, chLatin_o, chLatin_c, chLatin_a, chLatin_t, chLatin_i, chLatin_o, chLatin_n, chNull
  339. };
  340. SAX2XMLReaderImpl::SAX2XMLReaderImpl() :
  341.     fDocHandler(0)
  342.     , fDTDHandler(0)
  343.     , fElemDepth(0)
  344.     , fEntityResolver(0)
  345.     , fErrorHandler(0)
  346.     , fLexicalHandler(0)
  347.     , fAdvDHCount(0)
  348.     , fAdvDHList(0)
  349.     , fAdvDHListSize(32)
  350.     , fParseInProgress(false)
  351.     , fScanner(0)
  352. {
  353.     //
  354.     //  Create a scanner and tell it what validator to use. Then set us
  355.     //  as the document event handler so we can fill the DOM document.
  356.     //
  357.     fScanner = new XMLScanner(0);
  358.     // Create the initial advanced handler list array and zero it out
  359.     fAdvDHList = new XMLDocumentHandler*[fAdvDHListSize];
  360.     memset(fAdvDHList, 0, sizeof(void*) * fAdvDHListSize);
  361. // SAX2 default is for namespaces (feature http://xml.org/sax/features/namespaces) to be on
  362. setDoNamespaces(true) ;
  363. // SAX2 default is for namespaces-prefixes to be on
  364. fnamespacePrefix = true;
  365. // SAX2 default: validation on, auto-validation off
  366. fValidation = true;
  367. fautoValidation = false;
  368. // default: reuseValidator is off
  369. fReuseGrammar = false;
  370. // default: schema is on
  371. setDoSchema(true);
  372. fPrefixes    = new RefStackOf<XMLBuffer> (10, false) ;
  373. tempAttrVec  = new RefVectorOf<XMLAttr>  (10, false) ;
  374. prefixCounts = new ValueStackOf<unsigned int>(10) ;
  375. }
  376. SAX2XMLReaderImpl::~SAX2XMLReaderImpl()
  377. {
  378.     delete [] fAdvDHList;
  379.     delete fScanner;
  380.     delete fPrefixes;
  381.     delete tempAttrVec;
  382.     delete prefixCounts ;
  383. }
  384. // ---------------------------------------------------------------------------
  385. //  SAX2XMLReaderImpl: Advanced document handler list maintenance methods
  386. // ---------------------------------------------------------------------------
  387. void SAX2XMLReaderImpl::installAdvDocHandler(XMLDocumentHandler* const toInstall)
  388. {
  389.     // See if we need to expand and do so now if needed
  390.     if (fAdvDHCount == fAdvDHListSize)
  391.     {
  392.         // Calc a new size and allocate the new temp buffer
  393.         const unsigned int newSize = (unsigned int)(fAdvDHListSize * 1.5);
  394.         XMLDocumentHandler** newList = new XMLDocumentHandler*[newSize];
  395.         // Copy over the old data to the new list and zero out the rest
  396.         memcpy(newList, fAdvDHList, sizeof(void*) * fAdvDHListSize);
  397.         memset
  398.         (
  399.             &newList[fAdvDHListSize]
  400.             , 0
  401.             , sizeof(void*) * (newSize - fAdvDHListSize)
  402.         );
  403.         // And now clean up the old array and store the new stuff
  404.         delete [] fAdvDHList;
  405.         fAdvDHList = newList;
  406.         fAdvDHListSize = newSize;
  407.     }
  408.     // Add this new guy into the empty slot
  409.     fAdvDHList[fAdvDHCount++] = toInstall;
  410.     //
  411.     //  Install ourself as the document handler with the scanner. We might
  412.     //  already be, but its not worth checking, just do it.
  413.     //
  414.     fScanner->setDocHandler(this);
  415. }
  416. bool SAX2XMLReaderImpl::removeAdvDocHandler(XMLDocumentHandler* const toRemove)
  417. {
  418.     // If our count is zero, can't be any installed
  419.     if (!fAdvDHCount)
  420.         return false;
  421.     //
  422.     //  Search the array until we find this handler. If we find a null entry
  423.     //  first, we can stop there before the list is kept contiguous.
  424.     //
  425.     unsigned int index;
  426.     for (index = 0; index < fAdvDHCount; index++)
  427.     {
  428.         //
  429.         //  We found it. We have to keep the list contiguous, so we have to
  430.         //  copy down any used elements after this one.
  431.         //
  432.         if (fAdvDHList[index] == toRemove)
  433.         {
  434.             //
  435.             //  Optimize if only one entry (pretty common). Otherwise, we
  436.             //  have to copy them down to compact them.
  437.             //
  438.             if (fAdvDHCount > 1)
  439.             {
  440.                 index++;
  441.                 while (index < fAdvDHCount)
  442.                     fAdvDHList[index - 1] = fAdvDHList[index];
  443.             }
  444.             // Bump down the count and zero out the last one
  445.             fAdvDHCount--;
  446.             fAdvDHList[fAdvDHCount] = 0;
  447.             //
  448.             //  If this leaves us with no advanced handlers and there is
  449.             //  no SAX doc handler installed on us, then remove us from the
  450.             //  scanner as the document handler.
  451.             //
  452.             if (!fAdvDHCount && !fDocHandler)
  453.                 fScanner->setDocHandler(0);
  454.             return true;
  455.         }
  456.     }
  457.     // Never found it
  458.     return false;
  459. }
  460. // ---------------------------------------------------------------------------
  461. //  SAX2XMLReaderImpl Validator functions
  462. // ---------------------------------------------------------------------------
  463. void SAX2XMLReaderImpl::setValidator(XMLValidator* valueToAdopt)
  464. {
  465. fScanner->setValidator(valueToAdopt);
  466. }
  467. XMLValidator* SAX2XMLReaderImpl::getValidator() const
  468. {
  469. return fScanner->getValidator();
  470. }
  471. // ---------------------------------------------------------------------------
  472. //  SAX2XMLReader Interface
  473. // ---------------------------------------------------------------------------
  474. int SAX2XMLReaderImpl::getErrorCount() const
  475. {
  476.     return fScanner->getErrorCount();
  477. }
  478. void SAX2XMLReaderImpl::setContentHandler(ContentHandler* const handler)
  479. {
  480. fDocHandler = handler;
  481.     if (fDocHandler)
  482.     {
  483.         //
  484.         //  Make sure we are set as the document handler with the scanner.
  485.         //  We may already be (if advanced handlers are installed), but its
  486.         //  not worthing checking, just do it.
  487.         //
  488.         fScanner->setDocHandler(this);
  489.     }
  490.      else
  491.     {
  492.         //
  493.         //  If we don't have any advanced handlers either, then deinstall us
  494.         //  from the scanner because we don't need document events anymore.
  495.         //
  496.         if (!fAdvDHCount)
  497.             fScanner->setDocHandler(0);
  498.     }
  499. }
  500. void SAX2XMLReaderImpl::setDTDHandler(DTDHandler* const handler)
  501. {
  502.     fDTDHandler = handler;
  503.     if (fDTDHandler)
  504.         fScanner->setDocTypeHandler(this);
  505.     else
  506.         fScanner->setDocTypeHandler(0);
  507. }
  508. void SAX2XMLReaderImpl::setErrorHandler(ErrorHandler* const handler)
  509. {
  510.     //
  511.     //  Store the handler. Then either install or deinstall us as the
  512.     //  error reporter on the scanner.
  513.     //
  514.     fErrorHandler = handler;
  515.     if (fErrorHandler) {
  516.         fScanner->setErrorReporter(this);
  517.         fScanner->setErrorHandler(fErrorHandler);
  518.     }
  519.     else {
  520.         fScanner->setErrorReporter(0);
  521.         fScanner->setErrorHandler(0);
  522.     }
  523. }
  524. void SAX2XMLReaderImpl::setLexicalHandler(LexicalHandler* const handler)
  525. {
  526.     fLexicalHandler = handler;
  527. }
  528. void SAX2XMLReaderImpl::setEntityResolver(EntityResolver* const resolver)
  529. {
  530.     fEntityResolver = resolver;
  531.     if (fEntityResolver) {
  532.         fScanner->setEntityHandler(this);
  533.         fScanner->setEntityResolver(fEntityResolver);
  534.     }
  535.     else {
  536.         fScanner->setEntityHandler(0);
  537.         fScanner->setEntityResolver(0);
  538.     }
  539. }
  540. void SAX2XMLReaderImpl::setExitOnFirstFatalError(const bool newState)
  541. {
  542.     fScanner->setExitOnFirstFatal(newState);
  543. }
  544. void SAX2XMLReaderImpl::setValidationConstraintFatal(const bool newState)
  545. {
  546.     fScanner->setValidationConstraintFatal(newState);
  547. }
  548. void SAX2XMLReaderImpl::parse (const   InputSource&    source)
  549. {
  550.     // Avoid multiple entrance
  551.     if (fParseInProgress)
  552.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  553.     try
  554.     {
  555.         fParseInProgress = true;
  556.         fScanner->scanDocument(source, fReuseGrammar);
  557.         fParseInProgress = false;
  558.     }
  559.     catch (...)
  560.     {
  561.         fParseInProgress = false;
  562.         throw;
  563.     }
  564. }
  565. void SAX2XMLReaderImpl::parse (const   XMLCh* const    systemId)
  566. {
  567.     // Avoid multiple entrance
  568.     if (fParseInProgress)
  569.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  570.     try
  571.     {
  572.         fParseInProgress = true;
  573.         fScanner->scanDocument(systemId, fReuseGrammar);
  574.         fParseInProgress = false;
  575.     }
  576.     catch (...)
  577.     {
  578.         fParseInProgress = false;
  579.         throw;
  580.     }
  581. }
  582. void SAX2XMLReaderImpl::parse (const   char* const     systemId)
  583. {
  584.     // Avoid multiple entrance
  585.     if (fParseInProgress)
  586.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  587.     try
  588.     {
  589.         fParseInProgress = true;
  590.         fScanner->scanDocument(systemId, fReuseGrammar);
  591.         fParseInProgress = false;
  592.     }
  593.     catch (...)
  594.     {
  595.         fParseInProgress = false;
  596.         throw;
  597.     }
  598. }
  599. // ---------------------------------------------------------------------------
  600. //  SAX2XMLReaderImpl: Progressive parse methods
  601. // ---------------------------------------------------------------------------
  602. bool SAX2XMLReaderImpl::parseFirst( const   XMLCh* const    systemId
  603.                             ,       XMLPScanToken&  toFill
  604.                             , const bool            reuseGrammar)
  605. {
  606.     //
  607.     //  Avoid multiple entrance. We cannot enter here while a regular parse
  608.     //  is in progress.
  609.     //
  610.     if (fParseInProgress)
  611.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  612.     return fScanner->scanFirst(systemId, toFill, reuseGrammar);
  613. }
  614. bool SAX2XMLReaderImpl::parseFirst( const   char* const     systemId
  615.                             ,       XMLPScanToken&  toFill
  616.                             , const bool            reuseGrammar)
  617. {
  618.     //
  619.     //  Avoid multiple entrance. We cannot enter here while a regular parse
  620.     //  is in progress.
  621.     //
  622.     if (fParseInProgress)
  623.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  624.     return fScanner->scanFirst(systemId, toFill, reuseGrammar);
  625. }
  626. bool SAX2XMLReaderImpl::parseFirst( const   InputSource&    source
  627.                             ,       XMLPScanToken&  toFill
  628.                             , const bool            reuseGrammar)
  629. {
  630.     //
  631.     //  Avoid multiple entrance. We cannot enter here while a regular parse
  632.     //  is in progress.
  633.     //
  634.     if (fParseInProgress)
  635.         ThrowXML(IOException, XMLExcepts::Gen_ParseInProgress);
  636.     return fScanner->scanFirst(source, toFill, reuseGrammar);
  637. }
  638. bool SAX2XMLReaderImpl::parseNext(XMLPScanToken& token)
  639. {
  640.     return fScanner->scanNext(token);
  641. }
  642. void SAX2XMLReaderImpl::parseReset(XMLPScanToken& token)
  643. {
  644.     // Reset the scanner
  645.     fScanner->scanReset(token);
  646. }
  647. // ---------------------------------------------------------------------------
  648. //  SAX2XMLReaderImpl: Overrides of the XMLDocumentHandler interface
  649. // ---------------------------------------------------------------------------
  650. void SAX2XMLReaderImpl::docCharacters(  const   XMLCh* const    chars
  651.                                 , const unsigned int    length
  652.                                 , const bool            cdataSection)
  653. {
  654.     // Suppress the chars before the root element.
  655.     if (!fElemDepth)
  656.         return;
  657.    // Call the installed LexicalHandler.
  658.    if (cdataSection && fLexicalHandler)
  659.         fLexicalHandler->startCDATA();
  660.     // Just map to the SAX document handler
  661.     if (fDocHandler)
  662.         fDocHandler->characters(chars, length);
  663.    // Call the installed LexicalHandler.
  664.    if (cdataSection && fLexicalHandler)
  665.         fLexicalHandler->endCDATA();
  666.     //
  667.     //  If there are any installed advanced handlers, then lets call them
  668.     //  with this info.
  669.     //
  670.     for (unsigned int index = 0; index < fAdvDHCount; index++)
  671.         fAdvDHList[index]->docCharacters(chars, length, cdataSection);
  672. }
  673. void SAX2XMLReaderImpl::docComment(const XMLCh* const commentText)
  674. {
  675.    // Call the installed LexicalHandler.
  676.    if (fLexicalHandler)
  677.    {
  678.         // SAX2 reports comment text like characters -- as an
  679.         // array with a length.
  680.         fLexicalHandler->comment(commentText, XMLString::stringLen(commentText));
  681.    }
  682.     //
  683.     //  OK, if there are any installed advanced handlers,
  684.    // then let's call them with this info.
  685.     //
  686.     for (unsigned int index = 0; index < fAdvDHCount; index++)
  687.         fAdvDHList[index]->docComment(commentText);
  688. }
  689. void SAX2XMLReaderImpl::XMLDecl( const  XMLCh* const    versionStr
  690.                         , const XMLCh* const    encodingStr
  691.                         , const XMLCh* const    standaloneStr
  692.                         , const XMLCh* const    actualEncodingStr
  693.                         )
  694. {
  695.     // SAX has no way to report this event. But, if there are any installed
  696.     //  advanced handlers, then lets call them with this info.
  697.     //
  698.     for (unsigned int index = 0; index < fAdvDHCount; index++)
  699.         fAdvDHList[index]->XMLDecl( versionStr,
  700.                                     encodingStr,
  701.                                     standaloneStr,
  702.                                     actualEncodingStr );
  703. }
  704. void SAX2XMLReaderImpl::docPI(  const   XMLCh* const    target
  705.                         , const XMLCh* const    data)
  706. {
  707.     // Just map to the SAX document handler
  708.     if (fDocHandler)
  709.         fDocHandler->processingInstruction(target, data);
  710.     //
  711.     //  If there are any installed advanced handlers, then lets call them
  712.     //  with this info.
  713.     //
  714.     for (unsigned int index = 0; index < fAdvDHCount; index++)
  715.         fAdvDHList[index]->docPI(target, data);
  716. }
  717. void SAX2XMLReaderImpl::endDocument()
  718. {
  719.     if (fDocHandler)
  720.         fDocHandler->endDocument();
  721.     //
  722.     //  If there are any installed advanced handlers, then lets call them
  723.     //  with this info.
  724.     //
  725.     for (unsigned int index = 0; index < fAdvDHCount; index++)
  726.         fAdvDHList[index]->endDocument();
  727. }
  728. void SAX2XMLReaderImpl::endEntityReference(const XMLEntityDecl& entityDecl)
  729. {
  730.    // Call the installed LexicalHandler.
  731.    if (fLexicalHandler)
  732.         fLexicalHandler->endEntity(entityDecl.getName());
  733.     //
  734.     //  SAX has no way to report this event. But, if there are any installed
  735.     //  advanced handlers, then lets call them with this info.
  736.     //
  737.     for (unsigned int index = 0; index < fAdvDHCount; index++)
  738.         fAdvDHList[index]->endEntityReference(entityDecl);
  739. }
  740. void SAX2XMLReaderImpl::ignorableWhitespace(const   XMLCh* const    chars
  741.                                     , const unsigned int    length
  742.                                     , const bool            cdataSection)
  743. {
  744.     // Do not report the whitespace before the root element.
  745.     if (!fElemDepth)
  746.         return;
  747.     // Just map to the SAX document handler
  748.     if (fDocHandler)
  749.         fDocHandler->ignorableWhitespace(chars, length);
  750.     //
  751.     //  If there are any installed advanced handlers, then lets call them
  752.     //  with this info.
  753.     //
  754.     for (unsigned int index = 0; index < fAdvDHCount; index++)
  755.         fAdvDHList[index]->ignorableWhitespace(chars, length, cdataSection);
  756. }
  757. void SAX2XMLReaderImpl::resetDocument()
  758. {
  759.     //
  760.     //  If there are any installed advanced handlers, then lets call them
  761.     //  with this info.
  762.     //
  763.     for (unsigned int index = 0; index < fAdvDHCount; index++)
  764.         fAdvDHList[index]->resetDocument();
  765.     // Make sure our element depth flag gets set back to zero
  766.     fElemDepth = 0;
  767.     // Pop any prefix buffers left over from previous uses
  768.     while (!prefixCounts->empty())
  769.     {
  770.         unsigned int numPrefix = prefixCounts->pop();
  771.         for (unsigned int i = 0; i < numPrefix; i++)
  772.         {
  773.             XMLBuffer * buf = fPrefixes->pop() ;
  774.             fStringBuffers.releaseBuffer(*buf) ;
  775.         }
  776.     }
  777. }
  778. void SAX2XMLReaderImpl::startDocument()
  779. {
  780.     // Just map to the SAX document handler
  781.     if (fDocHandler)
  782.     {
  783.         fDocHandler->setDocumentLocator(fScanner->getLocator());
  784.         fDocHandler->startDocument();
  785.     }
  786.     //
  787.     //  If there are any installed advanced handlers, then lets call them
  788.     //  with this info.
  789.     //
  790.     for (unsigned int index = 0; index < fAdvDHCount; index++)
  791.         fAdvDHList[index]->startDocument();
  792. }
  793. void SAX2XMLReaderImpl::
  794. startElement(   const   XMLElementDecl&         elemDecl
  795.                 , const unsigned int            elemURLId
  796.                 , const XMLCh* const            elemPrefix
  797.                 , const RefVectorOf<XMLAttr>&   attrList
  798.                 , const unsigned int            attrCount
  799.                 , const bool                    isEmpty
  800.                 , const bool                    isRoot)
  801. {
  802. // Bump the element depth counter if not empty
  803.     if (!isEmpty)
  804.         fElemDepth++;
  805.     if (fDocHandler)
  806. {
  807. if (getDoNamespaces())
  808. {
  809.             unsigned int numPrefix = 0;
  810. const XMLCh*   nsString = XMLUni::fgXMLNSString;
  811. const XMLCh*   nsPrefix = 0;
  812. const XMLCh*   nsURI    = 0;
  813. const XMLAttr* tempAttr = 0;
  814.             if (!fnamespacePrefix)
  815. {
  816.                 tempAttrVec->removeAllElements();
  817. }
  818. for (unsigned int i = 0; i < attrCount; i++)
  819. {
  820. tempAttr = attrList.elementAt(i);
  821.                   if (XMLString::compareString(tempAttr->getQName(), nsString) == 0)
  822. nsURI = tempAttr->getValue();
  823.                   if (XMLString::compareString(tempAttr->getPrefix(), nsString) == 0)
  824. {
  825. nsPrefix = tempAttr->getName();
  826. nsURI = tempAttr->getValue();
  827. }
  828. if (!fnamespacePrefix)
  829. {
  830. if (nsURI == 0)
  831. tempAttrVec->addElement((XMLAttr* const)tempAttr);
  832. }
  833. if (nsURI != 0)
  834. {
  835. if (nsPrefix == 0)
  836. nsPrefix = XMLUni::fgZeroLenString;
  837. fDocHandler->startPrefixMapping(nsPrefix, nsURI);
  838. XMLBuffer &buf = fStringBuffers.bidOnBuffer()  ;
  839. buf.set ( nsPrefix ) ;
  840. fPrefixes->push(&buf) ;
  841. numPrefix++;
  842. }
  843. nsURI = 0;
  844. nsPrefix = 0;
  845. }
  846. prefixCounts->push(numPrefix) ;
  847. if (!fnamespacePrefix)
  848. fAttrList.setVector(tempAttrVec, tempAttrVec->size(), fScanner);
  849. else
  850.                 fAttrList.setVector(&attrList, attrCount, fScanner);
  851. // call startElement() with namespace declarations
  852. XMLBufBid URIBufferBid ( &fStringBuffers ) ;
  853. XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ;
  854. fScanner->getURIText(elemURLId, (XMLBuffer &)URIBuffer);
  855. fDocHandler->startElement(URIBuffer.getRawBuffer(),
  856. elemDecl.getBaseName(),
  857. elemDecl.getFullName(),
  858. fAttrList);
  859. }
  860. else
  861. {
  862. fAttrList.setVector(&attrList, attrCount, fScanner);
  863. fDocHandler->startElement(XMLUni::fgZeroLenString,
  864. elemDecl.getBaseName(),
  865. elemDecl.getFullName(),
  866. fAttrList);
  867. }
  868.         // If its empty, send the end tag event now
  869.         if (isEmpty)
  870. {
  871. // call endPrefixMapping appropriately.
  872. if (getDoNamespaces())
  873. {
  874. XMLBufBid URIBufferBid ( &fStringBuffers ) ;
  875. XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ;
  876. fScanner->getURIText(elemURLId, (XMLBuffer &)URIBuffer);
  877. fDocHandler->endElement( URIBuffer.getRawBuffer(),
  878. elemDecl.getBaseName(),
  879. elemDecl.getFullName() );
  880. unsigned int numPrefix = prefixCounts->pop();
  881. for (unsigned int i = 0; i < numPrefix; ++i)
  882. {
  883. XMLBuffer * buf = fPrefixes->pop() ;
  884. fDocHandler->endPrefixMapping( buf->getRawBuffer() );
  885. fStringBuffers.releaseBuffer(*buf) ;
  886. }
  887. }
  888. else
  889. {
  890. fDocHandler->endElement(XMLUni::fgZeroLenString,
  891. elemDecl.getBaseName(),
  892. elemDecl.getFullName() );
  893. }
  894. }
  895.     }
  896.     //
  897.     //  If there are any installed advanced handlers, then lets call them
  898.     //  with this info.
  899.     //
  900.     for (unsigned int index = 0; index < fAdvDHCount; index++)
  901.     {
  902.         fAdvDHList[index]->startElement
  903.         (
  904.             elemDecl
  905.             , elemURLId
  906.             , elemPrefix
  907.             , attrList
  908.             , attrCount
  909.             , isEmpty
  910.             , isRoot
  911.         );
  912.     }
  913. }
  914. void SAX2XMLReaderImpl::endElement( const   XMLElementDecl& elemDecl
  915.                             , const unsigned int    uriId
  916.                             , const bool            isRoot)
  917. {
  918.     // Just map to the SAX document handler
  919.     if (fDocHandler)
  920. {
  921. // get the prefixes back so that we can call endPrefixMapping()
  922.         if (getDoNamespaces())
  923. {
  924. XMLBufBid URIBufferBid ( &fStringBuffers ) ;
  925. XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ;
  926. fScanner->getURIText(uriId, URIBuffer ) ;
  927. fDocHandler->endElement( URIBuffer.getRawBuffer(),
  928. elemDecl.getBaseName(),
  929. elemDecl.getFullName() );
  930. unsigned int numPrefix = prefixCounts->pop();
  931. for (unsigned int i = 0; i < numPrefix; i++)
  932. {
  933. XMLBuffer * buf = fPrefixes->pop() ;
  934. fDocHandler->endPrefixMapping( buf->getRawBuffer() );
  935. fStringBuffers.releaseBuffer(*buf) ;
  936. }
  937. }
  938. else
  939. {
  940. fDocHandler->endElement(XMLUni::fgZeroLenString,
  941. elemDecl.getBaseName(),
  942. elemDecl.getFullName() );
  943. }
  944. }
  945.     //
  946.     //  If there are any installed advanced handlers, then lets call them
  947.     //  with this info.
  948.     //
  949.     for (unsigned int index = 0; index < fAdvDHCount; index++)
  950.         fAdvDHList[index]->endElement(elemDecl, uriId, isRoot);
  951.     //
  952.     //  Dump the element depth down again. Don't let it underflow in case
  953.     //  of malformed XML.
  954.     //
  955.     if (fElemDepth)
  956.         fElemDepth--;
  957. }
  958. void SAX2XMLReaderImpl::startEntityReference(const XMLEntityDecl& entityDecl)
  959. {
  960.    // Call the installed LexicalHandler.
  961.    if (fLexicalHandler)
  962.         fLexicalHandler->startEntity(entityDecl.getName());
  963.     //
  964.     //  SAX has no way to report this. But, If there are any installed
  965.     //  advanced handlers, then lets call them with this info.
  966.     //
  967.     for (unsigned int index = 0; index < fAdvDHCount; index++)
  968.         fAdvDHList[index]->startEntityReference(entityDecl);
  969. }
  970. // ---------------------------------------------------------------------------
  971. //  SAX2XMLReaderImpl: Overrides of the DocTypeHandler interface
  972. // ---------------------------------------------------------------------------
  973. void SAX2XMLReaderImpl::attDef( const   DTDElementDecl& elemDecl
  974.                         , const DTDAttDef&      attDef
  975.                         , const bool            ignoring)
  976. {
  977.     // Unused by SAX DTDHandler interface at this time
  978. }
  979. void SAX2XMLReaderImpl::doctypeComment(const XMLCh* const)
  980. {
  981.     // Unused by SAX DTDHandler interface at this time
  982. }
  983. void SAX2XMLReaderImpl::doctypeDecl(const   DTDElementDecl& elemDecl
  984.                             , const XMLCh* const    publicId
  985.                             , const XMLCh* const    systemId
  986.                             , const bool            hasIntSubset)
  987. {
  988.    // Call the installed LexicalHandler.
  989.    if (fLexicalHandler)
  990.         fLexicalHandler->startDTD(elemDecl.getFullName(), publicId, systemId);
  991.     // Unused by SAX DTDHandler interface at this time
  992. }
  993. void SAX2XMLReaderImpl::doctypePI(  const   XMLCh* const
  994.                             , const XMLCh* const)
  995. {
  996.     // Unused by SAX DTDHandler interface at this time
  997. }
  998. void SAX2XMLReaderImpl::doctypeWhitespace(  const   XMLCh* const    chars
  999.                                     , const unsigned int    length)
  1000. {
  1001.     // Unused by SAX DTDHandler interface at this time
  1002. }
  1003. void SAX2XMLReaderImpl::elementDecl(const DTDElementDecl&, const bool)
  1004. {
  1005.     // Unused by SAX DTDHandler interface at this time
  1006. }
  1007. void SAX2XMLReaderImpl::endAttList(const DTDElementDecl&)
  1008. {
  1009.     // Unused by SAX DTDHandler interface at this time
  1010. }
  1011. void SAX2XMLReaderImpl::endIntSubset()
  1012. {
  1013.     // Unused by SAX DTDHandler interface at this time
  1014. }
  1015. void SAX2XMLReaderImpl::endExtSubset()
  1016. {
  1017.    // Call the installed LexicalHandler.
  1018.    if (fLexicalHandler)
  1019.         fLexicalHandler->endDTD();
  1020.     // Unused by SAX DTDHandler interface at this time
  1021. }
  1022. void SAX2XMLReaderImpl::entityDecl( const   DTDEntityDecl&  entityDecl
  1023.                             , const bool            isPEDecl
  1024.                             , const bool            isIgnored)
  1025. {
  1026.     //
  1027.     //  If we have a DTD handler, and this entity is not ignored, and
  1028.     //  its an unparsed entity, then send this one.
  1029.     //
  1030.     if (fDTDHandler && !isIgnored)
  1031.     {
  1032.         if (entityDecl.isUnparsed())
  1033.         {
  1034.             fDTDHandler->unparsedEntityDecl
  1035.             (
  1036.                 entityDecl.getName()
  1037.                 , entityDecl.getPublicId()
  1038.                 , entityDecl.getSystemId()
  1039.                 , entityDecl.getNotationName()
  1040.             );
  1041.         }
  1042.     }
  1043. }
  1044. void SAX2XMLReaderImpl::resetDocType()
  1045. {
  1046.     // Just map to the DTD handler
  1047.     if (fDTDHandler)
  1048.         fDTDHandler->resetDocType();
  1049. }
  1050. void SAX2XMLReaderImpl::notationDecl(   const   XMLNotationDecl&    notDecl
  1051.                                 , const bool                isIgnored)
  1052. {
  1053.     if (fDTDHandler && !isIgnored)
  1054.     {
  1055.         fDTDHandler->notationDecl
  1056.         (
  1057.             notDecl.getName()
  1058.             , notDecl.getPublicId()
  1059.             , notDecl.getSystemId()
  1060.         );
  1061.     }
  1062. }
  1063. void SAX2XMLReaderImpl::startAttList(const DTDElementDecl&)
  1064. {
  1065.     // Unused by SAX DTDHandler interface at this time
  1066. }
  1067. void SAX2XMLReaderImpl::startIntSubset()
  1068. {
  1069.     // Unused by SAX DTDHandler interface at this time
  1070. }
  1071. void SAX2XMLReaderImpl::startExtSubset()
  1072. {
  1073.     // Unused by SAX DTDHandler interface at this time
  1074. }
  1075. void SAX2XMLReaderImpl::TextDecl(   const  XMLCh* const
  1076.                             , const XMLCh* const)
  1077. {
  1078.     // Unused by SAX DTDHandler interface at this time
  1079. }
  1080. // ---------------------------------------------------------------------------
  1081. //  SAX2XMLReaderImpl: Handlers for the XMLEntityHandler interface
  1082. // ---------------------------------------------------------------------------
  1083. void SAX2XMLReaderImpl::endInputSource(const InputSource&)
  1084. {
  1085. }
  1086. bool SAX2XMLReaderImpl::expandSystemId(const XMLCh* const, XMLBuffer&)
  1087. {
  1088.     return false;
  1089. }
  1090. void SAX2XMLReaderImpl::resetEntities()
  1091. {
  1092.     // Nothing to do for this one
  1093. }
  1094. InputSource* SAX2XMLReaderImpl::resolveEntity(   const   XMLCh* const    publicId
  1095.                                                , const   XMLCh* const    systemId)
  1096. {
  1097.     // Just map to the SAX entity resolver handler
  1098.     if (fEntityResolver)
  1099.         return fEntityResolver->resolveEntity(publicId, systemId);
  1100.     return 0;
  1101. }
  1102. void SAX2XMLReaderImpl::startInputSource(const InputSource&)
  1103. {
  1104.     // Nothing to do for this one
  1105. }
  1106. // ---------------------------------------------------------------------------
  1107. //  SAX2XMLReaderImpl: Overrides of the XMLErrorReporter interface
  1108. // ---------------------------------------------------------------------------
  1109. void SAX2XMLReaderImpl::resetErrors()
  1110. {
  1111.     if (fErrorHandler)
  1112.         fErrorHandler->resetErrors();
  1113. }
  1114. void SAX2XMLReaderImpl::error(  const   unsigned int                code
  1115.                         , const XMLCh* const                msgDomain
  1116.                         , const XMLErrorReporter::ErrTypes  errType
  1117.                         , const XMLCh* const                errorText
  1118.                         , const XMLCh* const                systemId
  1119.                         , const XMLCh* const                publicId
  1120.                         , const unsigned int                lineNum
  1121.                         , const unsigned int                colNum)
  1122. {
  1123.     SAXParseException toThrow = SAXParseException
  1124.     (
  1125.         errorText
  1126.         , publicId
  1127.         , systemId
  1128.         , lineNum
  1129.         , colNum
  1130.     );
  1131.     if (!fErrorHandler)
  1132.     {
  1133.         if (errType == XMLErrorReporter::ErrType_Fatal)
  1134.             throw toThrow;
  1135.         else
  1136.             return;
  1137.     }
  1138.     if (errType == XMLErrorReporter::ErrType_Warning)
  1139.         fErrorHandler->warning(toThrow);
  1140.     else if (errType == XMLErrorReporter::ErrType_Fatal)
  1141.         fErrorHandler->fatalError(toThrow);
  1142.     else
  1143.         fErrorHandler->error(toThrow);
  1144. }
  1145. // ---------------------------------------------------------------------------
  1146. //  SAX2XMLReaderImpl: Features and Properties
  1147. // ---------------------------------------------------------------------------
  1148. void SAX2XMLReaderImpl::setFeature(const XMLCh* const name, const bool value)
  1149. {
  1150. if (fParseInProgress)
  1151. throw SAXNotSupportedException("Feature modification is not supported during parse.");
  1152. if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_CORE_NAMESPACES) == 0)
  1153. {
  1154. setDoNamespaces(value);
  1155. }
  1156. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_CORE_VALIDATION) == 0)
  1157. {
  1158. fValidation = value;
  1159. if (fValidation)
  1160. if (fautoValidation)
  1161. setValidationScheme(Val_Auto);
  1162. else
  1163. setValidationScheme(Val_Always);
  1164. else
  1165. setValidationScheme(Val_Never);
  1166. }
  1167. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_CORE_NAMESPACE_PREFIXES) == 0)
  1168. {
  1169. fnamespacePrefix = value;
  1170. }
  1171. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_DYNAMIC) == 0)
  1172. {
  1173. fautoValidation = value;
  1174. // for auto validation, the sax2 core validation feature must also be enabled.
  1175. if (fValidation)
  1176. if (fautoValidation)
  1177. setValidationScheme(Val_Auto);
  1178. else
  1179. setValidationScheme(Val_Always);
  1180. else
  1181. setValidationScheme(Val_Never);
  1182. }
  1183. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_REUSEVALIDATOR) == 0)
  1184. {
  1185. fReuseGrammar = value;
  1186. }
  1187. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_REUSEGRAMMAR) == 0)
  1188. {
  1189. fReuseGrammar = value;
  1190. }
  1191. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_SCHEMA) == 0)
  1192. {
  1193. setDoSchema(value);
  1194. }
  1195. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_SCHEMA_FULL_CHECKING) == 0)
  1196. {
  1197. fScanner->setValidationSchemaFullChecking(value);
  1198. }
  1199.    else
  1200.        throw SAXNotRecognizedException("Unknown Feature");
  1201. }
  1202. bool SAX2XMLReaderImpl::getFeature(const XMLCh* const name) const
  1203. {
  1204. if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_CORE_NAMESPACES) == 0)
  1205. return getDoNamespaces();
  1206. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_CORE_VALIDATION) == 0)
  1207. return fValidation;
  1208. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_CORE_NAMESPACE_PREFIXES) == 0)
  1209. return fnamespacePrefix;
  1210. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_DYNAMIC) == 0)
  1211. return fautoValidation;
  1212. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_REUSEVALIDATOR) == 0)
  1213.         return fReuseGrammar;
  1214. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_REUSEGRAMMAR) == 0)
  1215.         return fReuseGrammar;
  1216. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_SCHEMA) == 0)
  1217.         return getDoSchema();
  1218. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_SCHEMA_FULL_CHECKING) == 0)
  1219.         return fScanner->getValidationSchemaFullChecking();
  1220.    else
  1221.        throw SAXNotRecognizedException("Unknown Feature");
  1222. return false;
  1223. }
  1224. void SAX2XMLReaderImpl::setProperty(const XMLCh* const name, void* value)
  1225. {
  1226. if (fParseInProgress)
  1227. throw SAXNotSupportedException("Property modification is not supported during parse.");
  1228. if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_SCHEMA_EXTERNAL_SCHEMALOCATION) == 0)
  1229. {
  1230. fScanner->setExternalSchemaLocation((XMLCh*)value);
  1231. }
  1232. else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_SCHEMA_EXTERNAL_NONAMESPACESCHEMALOCATION) == 0)
  1233. {
  1234. fScanner->setExternalNoNamespaceSchemaLocation((XMLCh*)value);
  1235. }
  1236.    else
  1237.        throw SAXNotRecognizedException("Unknown Property");
  1238. }
  1239. void* SAX2XMLReaderImpl::getProperty(const XMLCh* const name) const
  1240. {
  1241.     if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_SCHEMA_EXTERNAL_SCHEMALOCATION) == 0)
  1242.         return (void*)fScanner->getExternalSchemaLocation();
  1243.     else if (XMLString::compareIString(name, SAX2XMLReaderImpl::SAX_XERCES_SCHEMA_EXTERNAL_NONAMESPACESCHEMALOCATION) == 0)
  1244.         return (void*)fScanner->getExternalNoNamespaceSchemaLocation();
  1245.     else
  1246.         throw SAXNotRecognizedException("Unknown Property");
  1247.     return 0;
  1248. }
  1249. // ---------------------------------------------------------------------------
  1250. //  SAX2XMLReaderImpl: Private getters and setters for conveniences
  1251. // ---------------------------------------------------------------------------
  1252. void SAX2XMLReaderImpl::setValidationScheme(const ValSchemes newScheme)
  1253. {
  1254.     if (newScheme == Val_Never)
  1255.         fScanner->setValidationScheme(XMLScanner::Val_Never);
  1256.     else if (newScheme == Val_Always)
  1257.         fScanner->setValidationScheme(XMLScanner::Val_Always);
  1258.     else
  1259.         fScanner->setValidationScheme(XMLScanner::Val_Auto);
  1260. }
  1261. void SAX2XMLReaderImpl::setDoNamespaces(const bool newState)
  1262. {
  1263.     fScanner->setDoNamespaces(newState);
  1264. }
  1265. bool SAX2XMLReaderImpl::getDoNamespaces() const
  1266. {
  1267.     return fScanner->getDoNamespaces();
  1268. }
  1269. void SAX2XMLReaderImpl::setDoSchema(const bool newState)
  1270. {
  1271.     fScanner->setDoSchema(newState);
  1272. }
  1273. bool SAX2XMLReaderImpl::getDoSchema() const
  1274. {
  1275.     return fScanner->getDoSchema();
  1276. }