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

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2000 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: ReaderMgr.hpp,v $
  58.  * Revision 1.13  2001/07/12 18:50:08  tng
  59.  * Some performance modification regarding standalone check and xml decl check.
  60.  *
  61.  * Revision 1.12  2000/09/09 00:18:18  andyh
  62.  * Reordered member variables in ThrowEOEJanitor.  Patch submitted
  63.  * by Kirk Wylie.
  64.  *
  65.  * Revision 1.11  2000/07/08 00:17:13  andyh
  66.  * Cleanup of yesterday's speedup changes.  Merged new bit into the
  67.  * scanner character properties table.
  68.  *
  69.  * Revision 1.10  2000/07/07 01:08:44  andyh
  70.  * Parser speed up in scan of XML content.
  71.  *
  72.  * Revision 1.9  2000/03/02 19:54:29  roddey
  73.  * This checkin includes many changes done while waiting for the
  74.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  75.  * available elsewhere.
  76.  *
  77.  * Revision 1.8  2000/02/24 20:18:07  abagchi
  78.  * Swat for removing Log from API docs
  79.  *
  80.  * Revision 1.7  2000/02/24 02:12:53  aruna1
  81.  * ReaderMgr:;getReaderDepth() added
  82.  *
  83.  * Revision 1.6  2000/02/06 07:47:53  rahulj
  84.  * Year 2K copyright swat.
  85.  *
  86.  * Revision 1.5  2000/01/25 01:04:21  roddey
  87.  * Fixes a bogus error about ]]> in char data.
  88.  *
  89.  * Revision 1.4  2000/01/24 20:40:43  roddey
  90.  * Exposed the APIs to get to the byte offset in the source XML buffer. This stuff
  91.  * is not tested yet, but I wanted to get the API changes in now so that the API
  92.  * can be stablized.
  93.  *
  94.  * Revision 1.3  2000/01/12 00:15:04  roddey
  95.  * Changes to deal with multiply nested, relative pathed, entities and to deal
  96.  * with the new URL class changes.
  97.  *
  98.  * Revision 1.2  1999/12/15 19:48:03  roddey
  99.  * Changed to use new split of transcoder interfaces into XML transcoders and
  100.  * LCP transcoders, and implementation of intrinsic transcoders as pluggable
  101.  * transcoders, and addition of Latin1 intrinsic support.
  102.  *
  103.  * Revision 1.1.1.1  1999/11/09 01:08:13  twl
  104.  * Initial checkin
  105.  *
  106.  * Revision 1.4  1999/11/08 20:56:54  droddey
  107.  * If the main xml entity does not exist, we need to get the error handling for that
  108.  * inside the main XMLScanner::scanDocument() try block so that it gets reported
  109.  * in the normal way. We have to add a little extra safety code because, when this
  110.  * happens, there is no reader on the reader stack to get position ino from.
  111.  *
  112.  * Revision 1.3  1999/11/08 20:44:43  rahul
  113.  * Swat for adding in Product name and CVS comment log variable.
  114.  *
  115.  */
  116. #if !defined(READERMGR_HPP)
  117. #define READERMGR_HPP
  118. #include <util/RefStackOf.hpp>
  119. #include <util/XMLString.hpp>
  120. #include <sax/Locator.hpp>
  121. #include <framework/XMLBuffer.hpp>
  122. #include <internal/XMLReader.hpp>
  123. class XMLBuffer;
  124. class XMLEntityDecl;
  125. class XMLEntityHandler;
  126. class XMLDocumentHandler;
  127. class XMLScanner;
  128. // ---------------------------------------------------------------------------
  129. //  This class is used by the scanner. The scanner must deal with expansion
  130. //  of entities, some of which are totally different files (external parsed
  131. //  entities.) It does so by pushing readers onto a stack. The top reader is
  132. //  the one it wants to read out of, but that one must be popped when it is
  133. //  empty. To keep that logic from being all over the place, the scanner
  134. //  talks to the reader manager, which handles the stack and popping off
  135. //  used up readers.
  136. // ---------------------------------------------------------------------------
  137. class XMLPARSER_EXPORT ReaderMgr : public Locator
  138. {
  139. public :
  140.     // -----------------------------------------------------------------------
  141.     //  Class specific types
  142.     // -----------------------------------------------------------------------
  143.     struct LastExtEntityInfo
  144.     {
  145.         const   XMLCh*          systemId;
  146.         const   XMLCh*          publicId;
  147.                 unsigned int    lineNumber;
  148.                 unsigned int    colNumber;
  149.     };
  150.     // -----------------------------------------------------------------------
  151.     //  Constructors and Destructor
  152.     // -----------------------------------------------------------------------
  153.     ReaderMgr();
  154.     ~ReaderMgr();
  155.     // -----------------------------------------------------------------------
  156.     //  Convenience scanning methods
  157.     //
  158.     //  This are all convenience methods that work in terms of the core
  159.     //  character spooling methods.
  160.     // -----------------------------------------------------------------------
  161.     bool atEOF() const;
  162.     bool getName(XMLBuffer& toFill);
  163.     bool getNameToken(XMLBuffer& toFill);
  164.     XMLCh getNextChar();
  165.     bool getNextCharIfNot(const XMLCh chNotToGet, XMLCh& chGotten);
  166.     void movePlainContentChars(XMLBuffer &dest);
  167.     void getSpaces(XMLBuffer& toFill);
  168.     void getUpToCharOrWS(XMLBuffer& toFill, const XMLCh toCheck);
  169.     bool isEmpty() const;
  170.     bool lookingAtChar(const XMLCh toCheck);
  171.     bool lookingAtSpace();
  172.     XMLCh peekNextChar();
  173.     bool skipIfQuote(XMLCh& chGotten);
  174.     void skipPastChar(const XMLCh toSkip);
  175.     bool skipPastSpaces();
  176.     void skipToChar(const XMLCh toSkipTo);
  177.     bool skippedChar(const XMLCh toSkip);
  178.     bool skippedSpace();
  179.     bool skippedString(const XMLCh* const toSkip);
  180.     void skipQuotedString(const XMLCh quoteCh);
  181.     XMLCh skipUntilIn(const XMLCh* const listToSkip);
  182.     XMLCh skipUntilInOrWS(const XMLCh* const listToSkip);
  183.     bool peekString(const XMLCh* const toPeek);
  184.     // -----------------------------------------------------------------------
  185.     //  Control methods
  186.     // -----------------------------------------------------------------------
  187.     void cleanStackBackTo(const unsigned int readerNum);
  188.     XMLReader* createReader
  189.     (
  190.         const   InputSource&        src
  191.         , const bool                xmlDecl
  192.         , const XMLReader::RefFrom  refFrom
  193.         , const XMLReader::Types    type
  194.         , const XMLReader::Sources  source
  195.     );
  196.     XMLReader* createReader
  197.     (
  198.         const   XMLCh* const        sysId
  199.         , const XMLCh* const        pubId
  200.         , const bool                xmlDecl
  201.         , const XMLReader::RefFrom  refFrom
  202.         , const XMLReader::Types    type
  203.         , const XMLReader::Sources  source
  204.         ,       InputSource*&       srcToFill
  205.     );
  206.     XMLReader* createIntEntReader
  207.     (
  208.         const   XMLCh* const        sysId
  209.         , const XMLReader::RefFrom  refFrom
  210.         , const XMLReader::Types    type
  211.         , const XMLCh* const        dataBuf
  212.         , const unsigned int        dataLen
  213.         , const bool                copyBuf
  214.     );
  215.     bool isScanningPERefOutOfLiteral() const;
  216.     bool pushReader
  217.     (
  218.                 XMLReader* const        reader
  219.         ,       XMLEntityDecl* const    entity
  220.     );
  221.     void reset();
  222.     // -----------------------------------------------------------------------
  223.     //  Getter methods
  224.     // -----------------------------------------------------------------------
  225.     const XMLCh* getCurrentEncodingStr() const;
  226.     const XMLEntityDecl* getCurrentEntity() const;
  227.     XMLEntityDecl* getCurrentEntity();
  228.     const XMLReader* getCurrentReader() const;
  229.     XMLReader* getCurrentReader();
  230.     unsigned int getCurrentReaderNum() const;
  231.     unsigned int getReaderDepth() const;
  232.     void getLastExtEntityInfo(LastExtEntityInfo& lastInfo) const;
  233.     unsigned int getSrcOffset() const;
  234.     bool getThrowEOE() const;
  235.     // -----------------------------------------------------------------------
  236.     //  Setter methods
  237.     // -----------------------------------------------------------------------
  238.     void setEntityHandler(XMLEntityHandler* const newHandler);
  239.     void setThrowEOE(const bool newValue);
  240.     // -----------------------------------------------------------------------
  241.     //  Implement the SAX Locator interface
  242.     // -----------------------------------------------------------------------
  243.     virtual const XMLCh* getPublicId() const;
  244.     virtual const XMLCh* getSystemId() const;
  245.     virtual int getLineNumber() const;
  246.     virtual int getColumnNumber() const;
  247. private :
  248.     // -----------------------------------------------------------------------
  249.     //  Private helper methods
  250.     // -----------------------------------------------------------------------
  251.     const XMLReader* getLastExtEntity(const XMLEntityDecl*& itsEntity) const;
  252.     bool popReader();
  253.     // -----------------------------------------------------------------------
  254.     //  Private data members
  255.     //
  256.     //  fCurEntity
  257.     //      This is the current top of stack entity. We pull it off the stack
  258.     //      and store it here for efficiency.
  259.     //
  260.     //  fCurReader
  261.     //      This is the current top of stack reader. We pull it off the
  262.     //      stack and store it here for efficiency.
  263.     //
  264.     //  fEntityHandler
  265.     //      This is the installed entity handler. Its installed via the
  266.     //      scanner but he passes it on to us since we need it the most, in
  267.     //      process of creating external entity readers.
  268.     //
  269.     //  fEntityStack
  270.     //      We need to keep up with which of the pushed readers are pushed
  271.     //      entity values that are being spooled. This is done to avoid the
  272.     //      problem of recursive definitions. This stack consists of refs to
  273.     //      EntityDecl objects for the pushed entities.
  274.     //
  275.     //  fNextReaderNum
  276.     //      This is the reader serial number value. Each new reader that is
  277.     //      created from this reader is given a successive number. This lets
  278.     //      us catch things like partial markup errors and such.
  279.     //
  280.     //  fReaderStack
  281.     //      This is the stack of reader references. We own all the readers
  282.     //      and destroy them when they are used up.
  283.     //
  284.     //  fThrowEOE
  285.     //      This flag controls whether we throw an exception when we hit an
  286.     //      end of entity. The scanner doesn't really need to know about ends
  287.     //      of entities in the int/ext subsets, so it will turn this flag off
  288.     //      until it gets into the content usually.
  289.     // -----------------------------------------------------------------------
  290.     XMLEntityDecl*              fCurEntity;
  291.     XMLReader*                  fCurReader;
  292.     XMLEntityHandler*           fEntityHandler;
  293.     RefStackOf<XMLEntityDecl>*  fEntityStack;
  294.     unsigned int                fNextReaderNum;
  295.     RefStackOf<XMLReader>*      fReaderStack;
  296.     bool                        fThrowEOE;
  297. };
  298. // ---------------------------------------------------------------------------
  299. //  ReaderMgr: Inlined methods
  300. //
  301. //  NOTE: We cannot put these in alphabetical and type order as we usually
  302. //  do because some of the compilers we have to support are too stupid to
  303. //  understand out of order inlines!
  304. // ---------------------------------------------------------------------------
  305. inline unsigned int ReaderMgr::getCurrentReaderNum() const
  306. {
  307.     return fCurReader->getReaderNum();
  308. }
  309. inline bool ReaderMgr::getName(XMLBuffer& toFill)
  310. {
  311.     toFill.reset();
  312.     return fCurReader->getName(toFill, false);
  313. }
  314. inline bool ReaderMgr::getNameToken(XMLBuffer& toFill)
  315. {
  316.     toFill.reset();
  317.     return fCurReader->getName(toFill, true);
  318. }
  319. inline bool ReaderMgr::getNextCharIfNot(const XMLCh chNotToGet, XMLCh& chGotten)
  320. {
  321.     return fCurReader->getNextCharIfNot(chNotToGet, chGotten);
  322. }
  323. inline void ReaderMgr::movePlainContentChars(XMLBuffer &dest)
  324. {
  325.     fCurReader->movePlainContentChars(dest);
  326. }
  327. inline bool ReaderMgr::getThrowEOE() const
  328. {
  329.     return fThrowEOE;
  330. }
  331. inline unsigned int ReaderMgr::getSrcOffset() const
  332. {
  333.     return fCurReader->getSrcOffset();
  334. }
  335. inline bool ReaderMgr::lookingAtChar(const XMLCh chToCheck)
  336. {
  337.     return (chToCheck == peekNextChar());
  338. }
  339. inline bool ReaderMgr::lookingAtSpace()
  340. {
  341.     return XMLReader::isWhitespace(peekNextChar());
  342. }
  343. inline void ReaderMgr::setThrowEOE(const bool newValue)
  344. {
  345.     fThrowEOE = newValue;
  346. }
  347. inline bool ReaderMgr::skippedString(const XMLCh* const toSkip)
  348. {
  349.     return fCurReader->skippedString(toSkip);
  350. }
  351. inline void ReaderMgr::skipToChar(const XMLCh toSkipTo)
  352. {
  353.     while (true)
  354.     {
  355.         // Get chars until we find the one to skip
  356.         const XMLCh nextCh = getNextChar();
  357.         // Break out at end of input or the char to skip
  358.         if ((nextCh == toSkipTo) || !nextCh)
  359.             break;
  360.     }
  361. }
  362. inline void ReaderMgr::skipPastChar(const XMLCh toSkipPast)
  363. {
  364.     while (true)
  365.     {
  366.         // Get chars until we find the one to skip
  367.         const XMLCh nextCh = getNextChar();
  368.         if ((nextCh == toSkipPast) || !nextCh)
  369.             break;
  370.     }
  371. }
  372. inline bool ReaderMgr::peekString(const XMLCh* const toPeek)
  373. {
  374.     return fCurReader->peekString(toPeek);
  375. }
  376. inline void ReaderMgr::setEntityHandler(XMLEntityHandler* const newHandler)
  377. {
  378.     fEntityHandler = newHandler;
  379. }
  380. //
  381. //  This is a simple class to temporarily change the 'throw at end of entity'
  382. //  flag of the reader manager. There are some places where we need to
  383. //  turn this on and off on a scoped basis.
  384. //
  385. class XMLPARSER_EXPORT ThrowEOEJanitor
  386. {
  387. public :
  388.     // -----------------------------------------------------------------------
  389.     //  Constructors and destructor
  390.     // -----------------------------------------------------------------------
  391.     ThrowEOEJanitor(ReaderMgr* mgrTarget, const bool newValue) :
  392.         fOld(mgrTarget->getThrowEOE())
  393.         , fMgr(mgrTarget)
  394.     {
  395.         mgrTarget->setThrowEOE(newValue);
  396.     }
  397.     ~ThrowEOEJanitor()
  398.     {
  399.         fMgr->setThrowEOE(fOld);
  400.     };
  401. private :
  402.     // -----------------------------------------------------------------------
  403.     //  Private data members
  404.     //
  405.     //  fOld
  406.     //      The previous value of the flag, which we replaced during ctor,
  407.     //      and will replace during dtor.
  408.     //
  409.     //  fMgr
  410.     //      A pointer to the reader manager we are going to set/reset the
  411.     //      flag on.
  412.     // -----------------------------------------------------------------------
  413.     bool        fOld;
  414.     ReaderMgr*  fMgr;
  415. };
  416. #endif