XMLEntityDecl.hpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:18k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2003 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: XMLEntityDecl.hpp,v $
  58.  * Revision 1.7  2003/05/16 21:36:55  knoaman
  59.  * Memory manager implementation: Modify constructors to pass in the memory manager.
  60.  *
  61.  * Revision 1.6  2003/05/15 18:26:07  knoaman
  62.  * Partial implementation of the configurable memory manager.
  63.  *
  64.  * Revision 1.5  2003/04/21 20:46:01  knoaman
  65.  * Use XMLString::release to prepare for configurable memory manager.
  66.  *
  67.  * Revision 1.4  2003/03/07 18:08:10  tng
  68.  * Return a reference instead of void for operator=
  69.  *
  70.  * Revision 1.3  2002/11/04 15:00:21  tng
  71.  * C++ Namespace Support.
  72.  *
  73.  * Revision 1.2  2002/08/22 19:27:41  tng
  74.  * [Bug 11448] DomCount has problems with XHTML1.1 DTD.
  75.  *
  76.  * Revision 1.1.1.1  2002/02/01 22:21:51  peiyongz
  77.  * sane_include
  78.  *
  79.  * Revision 1.6  2000/02/24 20:00:23  abagchi
  80.  * Swat for removing Log from API docs
  81.  *
  82.  * Revision 1.5  2000/02/16 23:03:48  roddey
  83.  * More documentation updates
  84.  *
  85.  * Revision 1.4  2000/02/16 21:42:58  aruna1
  86.  * API Doc++ summary changes in
  87.  *
  88.  * Revision 1.3  2000/02/15 01:21:30  roddey
  89.  * Some initial documentation improvements. More to come...
  90.  *
  91.  * Revision 1.2  2000/02/06 07:47:48  rahulj
  92.  * Year 2K copyright swat.
  93.  *
  94.  * Revision 1.1.1.1  1999/11/09 01:08:32  twl
  95.  * Initial checkin
  96.  *
  97.  * Revision 1.2  1999/11/08 20:44:38  rahul
  98.  * Swat for adding in Product name and CVS comment log variable.
  99.  *
  100.  */
  101. #if !defined(XMLENTITYDECL_HPP)
  102. #define XMLENTITYDECL_HPP
  103. #include <xercesc/util/XMemory.hpp>
  104. #include <xercesc/util/PlatformUtils.hpp>
  105. #include <xercesc/util/XMLString.hpp>
  106. XERCES_CPP_NAMESPACE_BEGIN
  107. /**
  108.  *  This class defines that core information that defines an XML entity, no
  109.  *  matter what validator is used. Each validator will create a derivative
  110.  *  of this class which adds any extra information it requires.
  111.  *
  112.  *  This class supports keyed collection semantics via the getKey() method
  113.  *  which extracts the key field, the entity name in this case. The name will
  114.  *  have whatever form is deemed appropriate for the type of validator in
  115.  *  use.
  116.  *
  117.  *  When setting the fields of this class, you must make sure that you do
  118.  *  not set conflicting values. For instance, an internal entity cannot have
  119.  *  a notation name. And an external entity cannot have a value string.
  120.  *  These rules are defined by the XML specification. In most cases, these
  121.  *  objects are created by validator objects as they parse a DTD or Schema
  122.  *  or whatever, at which time they confirm the correctness of the data before
  123.  *  creating the entity decl object.
  124.  */
  125. class XMLPARSER_EXPORT XMLEntityDecl : public XMemory
  126. {
  127. public:
  128.     // -----------------------------------------------------------------------
  129.     //  Constructors and Destructor
  130.     // -----------------------------------------------------------------------
  131.     /** @name Constructors */
  132.     //@{
  133.     /**
  134.       *  Deafult Constructor
  135.       */
  136.     XMLEntityDecl(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
  137.     /** Constructor with a const entity name
  138.       *
  139.       * @param  entName The new name to give to this entity.
  140.       */
  141.     XMLEntityDecl
  142.     (
  143.         const   XMLCh* const    entName
  144.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  145.     );
  146.     /**
  147.       * Constructor with a const entity name and value
  148.       *
  149.       * @param  entName The new name to give to this entity.
  150.       * @param  value   The new value to give to this entity name.
  151.       */
  152.     XMLEntityDecl
  153.     (
  154.         const   XMLCh* const    entName
  155.         , const XMLCh* const    value
  156.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  157.     );
  158.     /**
  159.       * Constructor with a const entity name and single XMLCh value
  160.       *
  161.       * @param  entName The new name to give to this entity.
  162.       * @param  value   The new value to give to this entity name.
  163.       */
  164.     XMLEntityDecl
  165.     (
  166.         const   XMLCh* const    entName
  167.         , const XMLCh           value
  168.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  169.     );
  170.     //@}
  171.     /** @name Destructor */
  172.     //@{
  173.     /**
  174.       *  Default destructor
  175.       */
  176.     virtual ~XMLEntityDecl();
  177.     //@}
  178.     // -----------------------------------------------------------------------
  179.     //  Virtual entity decl interface
  180.     // -----------------------------------------------------------------------
  181.     /** @name The pure virtual methods in this interface. */
  182.     //@{
  183.     /** Get the 'declared in internal subset' flag
  184.       *
  185.       * Gets the state of the flag which indicates whether the entity was
  186.       * declared in the internal or external subset. Some structural
  187.       * description languages might not have an internal subset concept, in
  188.       * which case this will always return false.
  189.       */
  190.     virtual bool getDeclaredInIntSubset() const = 0;
  191.     /** Get the 'is parameter entity' flag
  192.       *
  193.       * Gets the state of the flag which indicates whether this entity is
  194.       * a parameter entity. If not, then its a general entity.
  195.       */
  196.     virtual bool getIsParameter() const = 0;
  197.     /** Get the 'is special char entity' flag
  198.       *
  199.       * Gets the state of the flag that indicates whether this entity is
  200.       * one of the special, intrinsically supported character entities.
  201.       */
  202.     virtual bool getIsSpecialChar() const = 0;
  203.     //@}
  204.     // -----------------------------------------------------------------------
  205.     //  Getter methods
  206.     // -----------------------------------------------------------------------
  207.     /** @name Getter methods */
  208.     //@{
  209.     /**
  210.       * Gets the pool id of this entity. Validators maintain all decls in
  211.       * pools, from which they can be quickly extracted via id.
  212.       */
  213.     unsigned int getId() const;
  214.     /**
  215.       * Returns a const pointer to the name of this entity decl. This name
  216.       * will be in whatever format is appropriate for the type of validator
  217.       * in use.
  218.       */
  219.     const XMLCh* getName() const;
  220.     /**
  221.       * Gets the notation name, if any, declared for this entity. If this
  222.       * entity is not a notation type entity, it will be a null pointer.
  223.       */
  224.     const XMLCh* getNotationName() const;
  225.     /**
  226.       * Gets the public id declared for this entity. Public ids are optional
  227.       * so it can be a null pointer.
  228.       */
  229.     const XMLCh* getPublicId() const;
  230.     /**
  231.       * Gets the system id declared for this entity. The system id is required
  232.       * so this method should never return a null pointers.
  233.       */
  234.     const XMLCh* getSystemId() const;
  235.     /**
  236.       * Gets the base URI for this entity.
  237.       */
  238.     const XMLCh* getBaseURI() const;
  239.     /**
  240.       * This method returns the value of an internal entity. If this is not
  241.       * an internal entity (i.e. its external), then this will be a null
  242.       * pointer.
  243.       */
  244.     const XMLCh* getValue() const;
  245.     /**
  246.      *  This method returns the number of characters in the value returned
  247.      *  by getValue(). If this entity is external, this will be zero since
  248.      *  an external entity has no internal value.
  249.      */
  250.     unsigned int getValueLen() const;
  251.     /**
  252.       * Indicates that this entity is an external entity. If not, then it is
  253.       * assumed to be an internal entity, suprise.
  254.       */
  255.     bool isExternal() const;
  256.     /**
  257.       * Indicates whether this entity is unparsed. This is meaningless for
  258.       * internal entities. Some external entities are unparsed in that they
  259.       * refer to something other than XML source.
  260.       */
  261.     bool isUnparsed() const;
  262.     /** Get the plugged-in memory manager
  263.       *
  264.       * This method returns the plugged-in memory manager user for dynamic
  265.       * memory allocation/deallocation.
  266.       *
  267.       * @return the plugged-in memory manager
  268.       */
  269.     MemoryManager* getMemoryManager() const;
  270.     //@}
  271.     // -----------------------------------------------------------------------
  272.     //  Setter methods
  273.     // -----------------------------------------------------------------------
  274.     /** @name Setter methods */
  275.     //@{
  276.     /**
  277.      *  This method will set the entity name. The format of this name is
  278.      *  defined by the particular validator in use, since it will be the
  279.      *  one who creates entity definitions as it parses the DTD, Schema,
  280.      *  ect...
  281.      *
  282.      *  @param  entName   The new name to give to this entity.
  283.      */
  284.     void setName
  285.     (
  286.         const   XMLCh* const    entName
  287.     );
  288.     /**
  289.      *  This method will set the notation name for this entity. By setting
  290.      *  this, you are indicating that this is an unparsed external entity.
  291.      *
  292.      *  @param  newName   The new notation name to give to this entity.
  293.      */
  294.     void setNotationName(const XMLCh* const newName);
  295.     /**
  296.      *  This method will set a new public id on this entity. The public id
  297.      *  has no particular form and is purely for client consumption.
  298.      *
  299.      *  @param  newId     The new public id to give to this entity.
  300.      */
  301.     void setPublicId(const XMLCh* const newId);
  302.     /**
  303.      *  This method will set a new sysetm id on this entity. This will
  304.      *  then control where the source for this entity lives. If it is
  305.      *  an internal entity, then the system id is only for bookkeeping
  306.      *  purposes, and to allow any external entities referenced from
  307.      *  within the entity to be correctly resolved.
  308.      *
  309.      *  @param  newId     The new system id to give to the entity.
  310.      */
  311.     void setSystemId(const XMLCh* const newId);
  312.     /**
  313.      *  This method will set a new baseURI on this entity. This will
  314.      *  then control the URI used to resolve the relative system Id.
  315.      *
  316.      *  @param  newId     The new base URI to give to the entity.
  317.      */
  318.     void setBaseURI(const XMLCh* const newId);
  319.     /**
  320.      *  This method will set a new value for this entity. This is only
  321.      *  valid if the entity is to be an internal entity. By setting this
  322.      *  field, you are indicating that the entity is internal.
  323.      *
  324.      *  @param  newValue  The new value to give to this entity.
  325.      */
  326.     void setValue(const XMLCh* const newValue);
  327.     //@}
  328.     /* For internal use only */
  329.     void setId(const unsigned int newId);
  330.     // -----------------------------------------------------------------------
  331.     //  Support named pool syntax
  332.     // -----------------------------------------------------------------------
  333.     /** @name Setter methods */
  334.     //@{
  335.     /**
  336.       * This method allows objects of this class to be used within a standard
  337.       * keyed collection used commonly within the parser system. The collection
  338.       * calls this method to get the key (usually to hash it) by which the
  339.       * object is to be stored.
  340.       */
  341.     const XMLCh* getKey() const;
  342.     //@}
  343. private :
  344.     // -----------------------------------------------------------------------
  345.     //  Unimplemented constructors and operators
  346.     // -----------------------------------------------------------------------
  347.     XMLEntityDecl(const XMLEntityDecl&);
  348.     XMLEntityDecl& operator=(XMLEntityDecl&);
  349.     // -----------------------------------------------------------------------
  350.     //  XMLEntityDecl: Private helper methods
  351.     // -----------------------------------------------------------------------
  352.     void cleanUp();
  353.     // -----------------------------------------------------------------------
  354.     //  Private data members
  355.     //
  356.     //  fId
  357.     //      This is the unique id given to this entity decl.
  358.     //
  359.     //  fName
  360.     //      The name of the enitity. Entity names are never namespace based.
  361.     //
  362.     //  fNotationName
  363.     //      The optional notation of the entity. If there was none, then its
  364.     //      empty.
  365.     //
  366.     //  fPublicId
  367.     //      The public id of the entity, which can be empty.
  368.     //
  369.     //  fSystemId
  370.     //      The system id of the entity.
  371.     //
  372.     //  fValue
  373.     //  fValueLen
  374.     //      The entity's value and length, which is only valid if its an
  375.     //      internal style entity.
  376.     //
  377.     //  fBaseURI
  378.     //      The base URI of the entity.   According to XML InfoSet, such value
  379.     //      is the URI where it is declared (NOT referenced).
  380.     // -----------------------------------------------------------------------
  381.     unsigned int    fId;
  382.     unsigned int    fValueLen;
  383.     XMLCh*          fValue;
  384.     XMLCh*          fName;
  385.     XMLCh*          fNotationName;
  386.     XMLCh*          fPublicId;
  387.     XMLCh*          fSystemId;
  388.     XMLCh*          fBaseURI;
  389.     MemoryManager*  fMemoryManager;
  390. };
  391. // ---------------------------------------------------------------------------
  392. //  XMLEntityDecl: Getter methods
  393. // ---------------------------------------------------------------------------
  394. inline unsigned int XMLEntityDecl::getId() const
  395. {
  396.     return fId;
  397. }
  398. inline const XMLCh* XMLEntityDecl::getName() const
  399. {
  400.     return fName;
  401. }
  402. inline const XMLCh* XMLEntityDecl::getNotationName() const
  403. {
  404.     return fNotationName;
  405. }
  406. inline const XMLCh* XMLEntityDecl::getPublicId() const
  407. {
  408.     return fPublicId;
  409. }
  410. inline const XMLCh* XMLEntityDecl::getSystemId() const
  411. {
  412.     return fSystemId;
  413. }
  414. inline const XMLCh* XMLEntityDecl::getBaseURI() const
  415. {
  416.     return fBaseURI;
  417. }
  418. inline const XMLCh* XMLEntityDecl::getValue() const
  419. {
  420.     return fValue;
  421. }
  422. inline unsigned int XMLEntityDecl::getValueLen() const
  423. {
  424.     return fValueLen;
  425. }
  426. inline bool XMLEntityDecl::isExternal() const
  427. {
  428.     // If it has a system or public id, its external
  429.     return ((fPublicId != 0) || (fSystemId != 0));
  430. }
  431. inline bool XMLEntityDecl::isUnparsed() const
  432. {
  433.     // If it has a notation, its unparsed
  434.     return (fNotationName != 0);
  435. }
  436. inline MemoryManager* XMLEntityDecl::getMemoryManager() const
  437. {
  438.     return fMemoryManager;
  439. }
  440. // ---------------------------------------------------------------------------
  441. //  XMLEntityDecl: Setter methods
  442. // ---------------------------------------------------------------------------
  443. inline void XMLEntityDecl::setId(const unsigned int newId)
  444. {
  445.     fId = newId;
  446. }
  447. inline void XMLEntityDecl::setNotationName(const XMLCh* const newName)
  448. {
  449.     if (fNotationName)
  450.         fMemoryManager->deallocate(fNotationName);
  451.     fNotationName = XMLString::replicate(newName, fMemoryManager);
  452. }
  453. inline void XMLEntityDecl::setPublicId(const XMLCh* const newId)
  454. {
  455.     if (fPublicId)
  456.         fMemoryManager->deallocate(fPublicId);
  457.     fPublicId = XMLString::replicate(newId, fMemoryManager);
  458. }
  459. inline void XMLEntityDecl::setSystemId(const XMLCh* const newId)
  460. {
  461.     if (fSystemId)
  462.         fMemoryManager->deallocate(fSystemId);
  463.     fSystemId = XMLString::replicate(newId, fMemoryManager);
  464. }
  465. inline void XMLEntityDecl::setBaseURI(const XMLCh* const newId)
  466. {
  467.     if (fBaseURI)
  468.         fMemoryManager->deallocate(fBaseURI);
  469.     fBaseURI = XMLString::replicate(newId, fMemoryManager);
  470. }
  471. inline void XMLEntityDecl::setValue(const XMLCh* const newValue)
  472. {
  473.     if (fValue)
  474.         fMemoryManager->deallocate(fValue);
  475.     fValue = XMLString::replicate(newValue, fMemoryManager);
  476.     fValueLen = XMLString::stringLen(newValue);
  477. }
  478. // ---------------------------------------------------------------------------
  479. //  XMLEntityDecl: Support named pool syntax
  480. // ---------------------------------------------------------------------------
  481. inline const XMLCh* XMLEntityDecl::getKey() const
  482. {
  483.     return fName;
  484. }
  485. XERCES_CPP_NAMESPACE_END
  486. #endif