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

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: DTDScanner.hpp,v $
  58.  * Revision 1.4  2001/06/21 14:25:56  knoaman
  59.  * Fix for bug 1946
  60.  *
  61.  * Revision 1.3  2001/05/11 13:27:10  tng
  62.  * Copyright update.
  63.  *
  64.  * Revision 1.2  2001/04/19 18:17:22  tng
  65.  * Schema: SchemaValidator update, and use QName in Content Model
  66.  *
  67.  * Revision 1.1  2001/03/21 21:56:20  tng
  68.  * Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
  69.  *
  70.  */
  71. #if !defined(DTDSCANNER_HPP)
  72. #define DTDSCANNER_HPP
  73. #include <validators/DTD/DTDGrammar.hpp>
  74. #include <validators/DTD/DTDEntityDecl.hpp>
  75. /*
  76.  * Default implementation of an XML DTD scanner.
  77.  */
  78. class DocTypeHandler;
  79. class VALIDATORS_EXPORT DTDScanner
  80. {
  81. public:
  82.     // -----------------------------------------------------------------------
  83.     //  Class specific types
  84.     //
  85.     //  NOTE: This should really be private, but some of the compilers we
  86.     //  have to support cannot understand that.
  87.     //
  88.     //  EntityExpRes
  89.     //      Returned from scanEntityRef() to indicate how the expanded text
  90.     //      was treated.
  91.     // -----------------------------------------------------------------------
  92.     enum EntityExpRes
  93.     {
  94.         EntityExp_Failed
  95.         , EntityExp_Pushed
  96.         , EntityExp_Returned
  97.     };
  98.     // -----------------------------------------------------------------------
  99.     //  Constructors and Destructor
  100.     // -----------------------------------------------------------------------
  101.     DTDScanner(DTDGrammar* dtdGrammar, NameIdPool<DTDEntityDecl>* entityDeclPool, DocTypeHandler* const    docTypeHandler);
  102.     virtual ~DTDScanner();
  103.     // -----------------------------------------------------------------------
  104.     //  Getter methods
  105.     // -----------------------------------------------------------------------
  106.     DocTypeHandler* getDocTypeHandler();
  107.     const DocTypeHandler* getDocTypeHandler() const;
  108.     // -----------------------------------------------------------------------
  109.     //  Setter methods
  110.     //
  111.     //  setScannerInfo() is called by the scanner to tell the DTDScanner
  112.     //  about the stuff it needs to have access to.
  113.     // -----------------------------------------------------------------------
  114.     void setScannerInfo
  115.     (
  116.         XMLScanner* const           owningScanner
  117.         , ReaderMgr* const          readerMgr
  118.         , XMLBufferMgr* const       bufMgr
  119.     );
  120.     void setDocTypeHandler
  121.     (
  122.             DocTypeHandler* const handlerToSet
  123.     );
  124.     void scanDocTypeDecl(const bool reuseGrammar);
  125. private:
  126.     // -----------------------------------------------------------------------
  127.     //  Private class types
  128.     // -----------------------------------------------------------------------
  129.     enum IDTypes
  130.     {
  131.         IDType_Public
  132.         , IDType_External
  133.         , IDType_Either
  134.     };
  135.     // -----------------------------------------------------------------------
  136.     //  Private DTD scanning methods. These are all in XMLValidator2.cpp
  137.     // -----------------------------------------------------------------------
  138.     bool checkForPERef
  139.     (
  140.         const   bool    spaceRequired
  141.         , const bool    inLiteral
  142.         , const bool    inMarkup
  143.         , const bool    throwEndOfExt = false
  144.     );
  145.     bool expandPERef
  146.     (
  147.         const   bool    scanExternal
  148.         , const bool    inLiteral
  149.         , const bool    inMarkup
  150.         , const bool    throwEndOfExt = false
  151.     );
  152.     bool getQuotedString(XMLBuffer& toFill);
  153.     XMLAttDef* scanAttDef(DTDElementDecl& elemDecl, XMLBuffer& bufToUse);
  154.     bool scanAttValue
  155.     (
  156.         const   XMLCh* const        attrName
  157.         ,       XMLBuffer&          toFill
  158.         , const XMLAttDef::AttTypes type
  159.     );
  160.     void scanAttListDecl();
  161.     ContentSpecNode* scanChildren
  162.     (
  163.         const   DTDElementDecl&     elemDecl
  164.         ,       XMLBuffer&          bufToUse
  165.     );
  166.     bool scanCharRef(XMLCh& toFill, XMLCh& second);
  167.     void scanComment();
  168.     bool scanContentSpec(DTDElementDecl& toFill);
  169.     void scanDefaultDecl(DTDAttDef& toFill);
  170.     void scanElementDecl();
  171.     void scanEntityDecl();
  172.     bool scanEntityDef();
  173.     bool scanEntityLiteral(XMLBuffer& toFill, const bool isPE);
  174.     bool scanEntityDef(DTDEntityDecl& decl, const bool isPEDecl);
  175.     EntityExpRes scanEntityRef(XMLCh& firstCh, XMLCh& secondCh, bool& escaped);
  176.     bool scanEnumeration
  177.     (
  178.         const   DTDAttDef&  attDef
  179.         ,       XMLBuffer&  toFill
  180.         , const bool        notation
  181.     );
  182.     bool scanEq();
  183.     void scanExtSubsetDecl(const bool inIncludeSect);
  184.     bool scanId
  185.     (
  186.                 XMLBuffer&  pubIdToFill
  187.         ,       XMLBuffer&  sysIdToFill
  188.         , const IDTypes     whatKind
  189.     );
  190.     void scanIgnoredSection();
  191.     bool scanInternalSubset();
  192.     void scanMarkupDecl(const bool parseTextDecl);
  193.     bool scanMixed(DTDElementDecl& toFill);
  194.     void scanNotationDecl();
  195.     void scanPI();
  196.     bool scanPublicLiteral(XMLBuffer& toFill);
  197.     bool scanSystemLiteral(XMLBuffer& toFill);
  198.     void scanTextDecl();
  199.     bool isReadingExternalEntity();
  200.     // -----------------------------------------------------------------------
  201.     //  Private data members
  202.     //
  203.     //  fDocTypeHandler
  204.     //      This holds the optional doc type handler that can be installed
  205.     //      and used to call back for all markup events. It is DTD specific.
  206.     //
  207.     //  fDumAttDef
  208.     //  fDumElemDecl
  209.     //  fDumEntityDecl
  210.     //      These are dummy objects into which mark decls are parsed when
  211.     //      they are just overrides of previously declared markup decls. In
  212.     //      such situations, the first one wins but we need to have somewhere
  213.     //      to parse them into. So these are lazily created and used as needed
  214.     //      when such markup decls are seen.
  215.     //
  216.     //  fInternalSubset
  217.     //      This is used to track whether we are in the internal subset or not,
  218.     //      in which case we are in the external subset.
  219.     //
  220.     //  fNextAttrId
  221.     //      Since att defs are per-element, we don't have a validator wide
  222.     //      attribute def pool. So we use a simpler data structure in each
  223.     //      element decl to store its att defs, and we use this simple counter
  224.     //      to apply a unique id to each new attribute.
  225.     //
  226.     //  fDTDGrammar
  227.     //      The DTD information we scanned like element decl, attribute decl
  228.     //      are stored in this Grammar.
  229.     //
  230.     //  fBufMgr
  231.     //      This is the buffer manager of the scanner. This is provided as a
  232.     //      convenience so that the DTDScanner doesn't have to create its own
  233.     //      buffer manager during the parse process.
  234.     //
  235.     //  fReaderMgr
  236.     //      This is a pointer to the reader manager that is being used by the scanner.
  237.     //
  238.     //  fScanner
  239.     //      The pointer to the scanner to which this DTDScanner belongs
  240.     //
  241.     //  fPEntityDeclPool
  242.     //      This is a pool of EntityDecl objects, which contains all of the
  243.     //      parameter entities that are declared in the DTD subsets.
  244.     //
  245.     //  fEntityDeclPool
  246.     //      This is a pool of EntityDecl objects, which contains all of the
  247.     //      general entities that are declared in the DTD subsets.  It is
  248.     //      owned by the Scanner as Schema Grammar may also need access to
  249.     //      this pool for entity reference.
  250.     //
  251.     //  fEmptyNamespaceId
  252.     //      The uri for all DTD decls
  253.     //
  254.     //  fDocTypeReaderId
  255.     //      The original reader in the fReaderMgr - to be compared against the
  256.     //      current reader to decide whether we are processing an external/internal
  257.     //      declaration
  258.     // -----------------------------------------------------------------------
  259.     DocTypeHandler*                 fDocTypeHandler;
  260.     DTDAttDef*                      fDumAttDef;
  261.     DTDElementDecl*                 fDumElemDecl;
  262.     DTDEntityDecl*                  fDumEntityDecl;
  263.     bool                            fInternalSubset;
  264.     unsigned int                    fNextAttrId;
  265.     DTDGrammar*                     fDTDGrammar;
  266.     XMLBufferMgr*                   fBufMgr;
  267.     ReaderMgr*                      fReaderMgr;
  268.     XMLScanner*                     fScanner;
  269.     NameIdPool<DTDEntityDecl>*      fPEntityDeclPool;
  270.     NameIdPool<DTDEntityDecl>*      fEntityDeclPool;
  271.     unsigned int                    fEmptyNamespaceId;
  272.     unsigned int                    fDocTypeReaderId;
  273. };
  274. // ---------------------------------------------------------------------------
  275. //  DTDScanner: Getter methods
  276. // ---------------------------------------------------------------------------
  277. inline DocTypeHandler* DTDScanner::getDocTypeHandler()
  278. {
  279.     return fDocTypeHandler;
  280. }
  281. inline const DocTypeHandler* DTDScanner::getDocTypeHandler() const
  282. {
  283.     return fDocTypeHandler;
  284. }
  285. // ---------------------------------------------------------------------------
  286. //  DTDScanner: Setter methods
  287. // ---------------------------------------------------------------------------
  288. inline void DTDScanner::setDocTypeHandler(DocTypeHandler* const handlerToSet)
  289. {
  290.     fDocTypeHandler = handlerToSet;
  291. }
  292. // -----------------------------------------------------------------------
  293. //  Setter methods
  294. // -----------------------------------------------------------------------
  295. inline void DTDScanner::setScannerInfo(XMLScanner* const      owningScanner
  296.                             , ReaderMgr* const      readerMgr
  297.                             , XMLBufferMgr* const   bufMgr)
  298. {
  299.     // We don't own any of these, we just reference them
  300.     fScanner = owningScanner;
  301.     fReaderMgr = readerMgr;
  302.     fBufMgr = bufMgr;
  303.     if (fScanner->getDoNamespaces())
  304.         fEmptyNamespaceId = fScanner->getEmptyNamespaceId();
  305.     else
  306.         fEmptyNamespaceId = 0;
  307.     fDocTypeReaderId = fReaderMgr->getCurrentReaderNum();
  308. }
  309. // -----------------------------------------------------------------------
  310. //  Helper methods
  311. // -----------------------------------------------------------------------
  312. inline bool DTDScanner::isReadingExternalEntity() {
  313.     return (fDocTypeReaderId != fReaderMgr->getCurrentReaderNum());
  314. }
  315. #endif