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

词法分析

开发平台:

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: XMLAttr.hpp,v $
  58.  * Revision 1.7  2003/05/22 02:10:51  knoaman
  59.  * Default the memory manager.
  60.  *
  61.  * Revision 1.6  2003/05/16 21:36:55  knoaman
  62.  * Memory manager implementation: Modify constructors to pass in the memory manager.
  63.  *
  64.  * Revision 1.5  2003/05/15 18:26:07  knoaman
  65.  * Partial implementation of the configurable memory manager.
  66.  *
  67.  * Revision 1.4  2002/11/28 20:12:45  knoaman
  68.  * Allow creating/setting of XMLAttr using a rawname (i.e. 'prefix:localpart').
  69.  *
  70.  * Revision 1.3  2002/11/04 15:00:21  tng
  71.  * C++ Namespace Support.
  72.  *
  73.  * Revision 1.2  2002/02/20 18:17:01  tng
  74.  * [Bug 5977] Warnings on generating apiDocs.
  75.  *
  76.  * Revision 1.1.1.1  2002/02/01 22:21:50  peiyongz
  77.  * sane_include
  78.  *
  79.  * Revision 1.9  2001/11/02 14:21:18  knoaman
  80.  * Add support for identity constraints.
  81.  *
  82.  * Revision 1.8  2001/05/11 13:25:31  tng
  83.  * Copyright update.
  84.  *
  85.  * Revision 1.7  2001/02/27 18:33:55  tng
  86.  * Schema: Use QName in XMLAttr.
  87.  *
  88.  * Revision 1.6  2000/04/10 22:42:53  roddey
  89.  * Extended the buffer reuse to the QName field, to further increase
  90.  * performance of attribute heavy applications.
  91.  *
  92.  * Revision 1.5  2000/03/02 19:54:24  roddey
  93.  * This checkin includes many changes done while waiting for the
  94.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  95.  * available elsewhere.
  96.  *
  97.  * Revision 1.4  2000/02/24 20:00:22  abagchi
  98.  * Swat for removing Log from API docs
  99.  *
  100.  * Revision 1.3  2000/02/15 01:21:30  roddey
  101.  * Some initial documentation improvements. More to come...
  102.  *
  103.  * Revision 1.2  2000/02/06 07:47:47  rahulj
  104.  * Year 2K copyright swat.
  105.  *
  106.  * Revision 1.1.1.1  1999/11/09 01:08:28  twl
  107.  * Initial checkin
  108.  *
  109.  * Revision 1.2  1999/11/08 20:44:35  rahul
  110.  * Swat for adding in Product name and CVS comment log variable.
  111.  *
  112.  */
  113. #if !defined(XMLATTR_HPP)
  114. #define XMLATTR_HPP
  115. #include <xercesc/util/PlatformUtils.hpp>
  116. #include <xercesc/util/QName.hpp>
  117. #include <xercesc/framework/XMLAttDef.hpp>
  118. XERCES_CPP_NAMESPACE_BEGIN
  119. /**
  120.  *  This class defines the information about an attribute that will come out
  121.  *  of the scanner during parsing. This information does not depend upon the
  122.  *  type of validator because it is not tied to any scheme/DTD type info. Its
  123.  *  just the raw XML 1.0 information that will be reported about an attribute
  124.  *  in the startElement() callback method of the XMLDocumentHandler class.
  125.  *  Hence it is not intended to be extended or derived from. Its designed to
  126.  *  be used as is.
  127.  *
  128.  *  The 'specified' field of this class indicates whether the attribute was
  129.  *  actually present or whether it was faulted in because it had a fixed or
  130.  *  default value.
  131.  *
  132.  *  The code receiving this information can ask its validator for more info
  133.  *  about the attribute, i.e. get its declaration from the DTD/Schema info.
  134.  *
  135.  *  Because of the heavy use (and reuse) of instances of this class, and the
  136.  *  number of string members it has, this class takes pains to not reallocate
  137.  *  string members unless it has to. It keeps up with how long each buffer
  138.  *  is and only reallocates if the new value won't fit.
  139.  */
  140. class XMLPARSER_EXPORT XMLAttr : public XMemory
  141. {
  142. public:
  143.     // -----------------------------------------------------------------------
  144.     //  Constructors and Destructor
  145.     // -----------------------------------------------------------------------
  146.     /** @name Constructors */
  147.     //@{
  148.     /**
  149.       * The default constructor just setsup an empty attribute to be filled
  150.       * in the later. Though the initial state is a reasonable one, it is
  151.       * not documented because it should not be depended on.
  152.       *
  153.       * @param  manager     The configurable memory manager
  154.       */
  155.     XMLAttr(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
  156.     /**
  157.       * This is the primary constructor which takes all of the information
  158.       * required to construct a complete attribute object.
  159.       *
  160.       * @param  uriId       The id into the validator's URI pool of the URI
  161.       *                     that the prefix mapped to. Only used if namespaces
  162.       *                     are enabled/supported.
  163.       *
  164.       * @param  attrName    The base name of the attribute, i.e. the part
  165.       *                     after any prefix.
  166.       *
  167.       * @param  attrPrefix  The prefix, if any, of this attribute's name. If
  168.       *                     this is empty, then uriID is meaningless as well.
  169.       *
  170.       * @param  attrValue   The value string of the attribute, which should
  171.       *                     be fully normalized by XML rules!
  172.       *
  173.       * @param  type        The type of the attribute. This will indicate
  174.       *                     the type of normalization done and constrains
  175.       *                     the value content. Make sure that the value
  176.       *                     set meets the constraints!
  177.       *
  178.       * @param  specified   Indicates whether the attribute was explicitly
  179.       *                     specified or not. If not, then it was faulted
  180.       *                     in from a FIXED or DEFAULT value.
  181.       *
  182.       * @param  manager     The configurable memory manager
  183.       */
  184.     XMLAttr
  185.     (
  186.           const unsigned int        uriId
  187.         , const XMLCh* const        attrName
  188.         , const XMLCh* const        attrPrefix
  189.         , const XMLCh* const        attrValue
  190.         , const XMLAttDef::AttTypes type = XMLAttDef::CData
  191.         , const bool                specified = true
  192.         , MemoryManager* const      manager = XMLPlatformUtils::fgMemoryManager
  193.     );
  194.     /**
  195.       * This is the primary constructor which takes all of the information
  196.       * required to construct a complete attribute object.
  197.       *
  198.       * @param  uriId       The id into the validator's URI pool of the URI
  199.       *                     that the prefix mapped to. Only used if namespaces
  200.       *                     are enabled/supported.
  201.       *
  202.       * @param  rawName     The raw name of the attribute.
  203.       *
  204.       * @param  attrValue   The value string of the attribute, which should
  205.       *                     be fully normalized by XML rules!
  206.       *
  207.       * @param  type        The type of the attribute. This will indicate
  208.       *                     the type of normalization done and constrains
  209.       *                     the value content. Make sure that the value
  210.       *                     set meets the constraints!
  211.       *
  212.       * @param  specified   Indicates whether the attribute was explicitly
  213.       *                     specified or not. If not, then it was faulted
  214.       *                     in from a FIXED or DEFAULT value.
  215.       *
  216.       * @param  manager     The configurable memory manager
  217.       */
  218.     XMLAttr
  219.     (
  220.         const unsigned int uriId
  221.         , const XMLCh* const rawName
  222.         , const XMLCh* const attrValue
  223.         , const XMLAttDef::AttTypes type = XMLAttDef::CData
  224.         , const bool specified = true
  225.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  226.     );
  227.     //@}
  228.     /** @name Destructor */
  229.     //@{
  230.     ~XMLAttr();
  231.     //@}
  232.     // -----------------------------------------------------------------------
  233.     //  Getter methods
  234.     // -----------------------------------------------------------------------
  235.     /** @name Getter methods */
  236.     //@{
  237.     /**
  238.       * This methode returns the attribute name in a QName format.
  239.       */
  240.     QName* getAttName() const;
  241.     /**
  242.       * This method gets a const pointer tot he name of the attribute. The
  243.       * form of this name is defined by the validator in use.
  244.       */
  245.     const XMLCh* getName() const;
  246.     /**
  247.       * This method will get a const pointer to the prefix string of this
  248.       * attribute. Since prefixes are optional, it may be zero.
  249.       */
  250.     const XMLCh* getPrefix() const;
  251.     /**
  252.       * This method will get the QName of this attribute, which will be the
  253.       * prefix if any, then a colon, then the base name. If there was no
  254.       * prefix, its the same as the getName() method.
  255.       */
  256.     const XMLCh* getQName() const;
  257.     /**
  258.       * This method will get the specified flag, which indicates whether
  259.       * the attribute was explicitly specified or just faulted in.
  260.       */
  261.     bool getSpecified() const;
  262.     /**
  263.       * This method will get the type of the attribute. The available types
  264.       * are defined by the XML specification.
  265.       */
  266.     XMLAttDef::AttTypes getType() const;
  267.     /**
  268.       * This method will get the value of the attribute. The value can be
  269.       * be an empty string, but never null if the object is correctly
  270.       * set up.
  271.       */
  272.     const XMLCh* getValue() const;
  273.     /**
  274.       * This method will get the id of the URI that this attribute's prefix
  275.       * mapped to. If namespaces are not on, then its value is meaningless.
  276.       */
  277.     unsigned int getURIId() const;
  278.     //@}
  279.     // -----------------------------------------------------------------------
  280.     //  Setter methods
  281.     // -----------------------------------------------------------------------
  282.     /** @name Setter methods */
  283.     //@{
  284.     /**
  285.       * This method is called to set up a default constructed object after
  286.       * the fact, or to reuse a previously used object.
  287.       *
  288.       * @param  uriId       The id into the validator's URI pool of the URI
  289.       *                     that the prefix mapped to. Only used if namespaces
  290.       *                     are enabled/supported.
  291.       *
  292.       * @param  attrName    The base name of the attribute, i.e. the part
  293.       *                     after any prefix.
  294.       *
  295.       * @param  attrPrefix  The prefix, if any, of this attribute's name. If
  296.       *                     this is empty, then uriID is meaningless as well.
  297.       *
  298.       * @param  attrValue   The value string of the attribute, which should
  299.       *                     be fully normalized by XML rules according to the
  300.       *                     attribute type.
  301.       *
  302.       * @param  type        The type of the attribute. This will indicate
  303.       *                     the type of normalization done and constrains
  304.       *                     the value content. Make sure that the value
  305.       *                     set meets the constraints!
  306.       *
  307.       */
  308.     void set
  309.     (
  310.         const   unsigned int        uriId
  311.         , const XMLCh* const        attrName
  312.         , const XMLCh* const        attrPrefix
  313.         , const XMLCh* const        attrValue
  314.         , const XMLAttDef::AttTypes type = XMLAttDef::CData
  315.     );
  316.     /**
  317.       * This method is called to set up a default constructed object after
  318.       * the fact, or to reuse a previously used object.
  319.       *
  320.       * @param  uriId       The id into the validator's URI pool of the URI
  321.       *                     that the prefix mapped to. Only used if namespaces
  322.       *                     are enabled/supported.
  323.       *
  324.       * @param  attrRawName The raw name of the attribute.
  325.       *
  326.       * @param  attrValue   The value string of the attribute, which should
  327.       *                     be fully normalized by XML rules according to the
  328.       *                     attribute type.
  329.       *
  330.       * @param  type        The type of the attribute. This will indicate
  331.       *                     the type of normalization done and constrains
  332.       *                     the value content. Make sure that the value
  333.       *                     set meets the constraints!
  334.       *
  335.       */
  336.     void set
  337.     (
  338.         const   unsigned int        uriId
  339.         , const XMLCh* const        attrRawName
  340.         , const XMLCh* const        attrValue
  341.         , const XMLAttDef::AttTypes type = XMLAttDef::CData
  342.     );
  343.     /**
  344.       * This method will update just the name related fields of the
  345.       * attribute object. The other fields are left as is.
  346.       *
  347.       * @param  uriId       The id into the validator's URI pool of the URI
  348.       *                     that the prefix mapped to. Only used if namespaces
  349.       *                     are enabled/supported.
  350.       *
  351.       * @param  attrName    The base name of the attribute, i.e. the part
  352.       *                     after any prefix.
  353.       *
  354.       * @param  attrPrefix  The prefix, if any, of this attribute's name. If
  355.       *                     this is empty, then uriID is meaningless as well.
  356.       */
  357.     void setName
  358.     (
  359.         const   unsigned int        uriId
  360.         , const XMLCh* const        attrName
  361.         , const XMLCh* const        attrPrefix
  362.     );
  363.     /**
  364.       * This method will update the specified state of the object.
  365.       *
  366.       * @param  newValue    Indicates whether the attribute was explicitly
  367.       *                     specified or not. If not, then it was faulted
  368.       *                     in from a FIXED or DEFAULT value.
  369.       */
  370.     void setSpecified(const bool newValue);
  371.     /**
  372.       * This method will update the attribute type of the object.
  373.       *
  374.       * @param  newType     The type of the attribute. This will indicate
  375.       *                     the type of normalization done and constrains
  376.       *                     the value content. Make sure that the value
  377.       *                     set meets the constraints!
  378.       */
  379.     void setType(const XMLAttDef::AttTypes newType);
  380.     /**
  381.       * This method will update the value field of the attribute.
  382.       *
  383.       * @param  newValue    The value string of the attribute, which should
  384.       *                     be fully normalized by XML rules according to the
  385.       *                     attribute type.
  386.       */
  387.     void setValue(const XMLCh* const newValue);
  388.     /**
  389.       * This method will set the URI id field of this attribute. This is
  390.       * generally only ever called internally by the parser itself during
  391.       * the parsing process.
  392.       *
  393.       * @param  uriId       The uriId of the attribute.
  394.       */
  395.     void setURIId(const unsigned int uriId);
  396.     //@}
  397. private :
  398.     // -----------------------------------------------------------------------
  399.     //  Unimplemented constructors and operators
  400.     // -----------------------------------------------------------------------
  401.     XMLAttr(const XMLAttr&);
  402.     XMLAttr& operator=(const XMLAttr&);
  403.     // -----------------------------------------------------------------------
  404.     //  Private, helper methods
  405.     // -----------------------------------------------------------------------
  406.     void cleanUp();
  407.     // -----------------------------------------------------------------------
  408.     //  Private instance variables
  409.     //
  410.     //  fAttName
  411.     //      The Attribute Name;
  412.     //
  413.     //  fSpecified
  414.     //      True if this attribute appeared in the element; else, false if
  415.     //      it was defaulted from an AttDef.
  416.     //
  417.     //  fType
  418.     //      The attribute type enum value for this attribute. Indicates what
  419.     //      type of attribute it was.
  420.     //
  421.     //  fValue
  422.     //  fValueBufSz
  423.     //      The attribute value that was given in the attribute instance, and
  424.     //      its current buffer size (minus one, where the null is.)
  425.     //
  426.     //  fMemoryManager
  427.     //      The memory manager used for dynamic memory allocation/deallocation
  428.     //
  429.     // -----------------------------------------------------------------------
  430.     bool                fSpecified;
  431.     XMLAttDef::AttTypes fType;
  432.     unsigned int        fValueBufSz;
  433.     XMLCh*              fValue;
  434.     QName*              fAttName;
  435.     MemoryManager*      fMemoryManager;
  436. };
  437. // ---------------------------------------------------------------------------
  438. //  XMLAttr: Constructors and Destructor
  439. // ---------------------------------------------------------------------------
  440. inline XMLAttr::~XMLAttr()
  441. {
  442.     cleanUp();
  443. }
  444. // ---------------------------------------------------------------------------
  445. //  XMLAttr: Getter methods
  446. // ---------------------------------------------------------------------------
  447. inline QName* XMLAttr::getAttName() const
  448. {
  449.     return fAttName;
  450. }
  451. inline const XMLCh* XMLAttr::getName() const
  452. {
  453.     return fAttName->getLocalPart();
  454. }
  455. inline const XMLCh* XMLAttr::getPrefix() const
  456. {
  457.     return fAttName->getPrefix();
  458. }
  459. inline bool XMLAttr::getSpecified() const
  460. {
  461.     return fSpecified;
  462. }
  463. inline XMLAttDef::AttTypes XMLAttr::getType() const
  464. {
  465.     return fType;
  466. }
  467. inline const XMLCh* XMLAttr::getValue() const
  468. {
  469.     return fValue;
  470. }
  471. inline unsigned int XMLAttr::getURIId() const
  472. {
  473.     return fAttName->getURI();
  474. }
  475. // ---------------------------------------------------------------------------
  476. //  XMLAttr: Setter methods
  477. // ---------------------------------------------------------------------------
  478. inline void XMLAttr::set(const  unsigned int        uriId
  479.                         , const XMLCh* const        attrName
  480.                         , const XMLCh* const        attrPrefix
  481.                         , const XMLCh* const        attrValue
  482.                         , const XMLAttDef::AttTypes type)
  483. {
  484.     // Set the name info and the value via their respective calls
  485.     fAttName->setName(attrPrefix, attrName, uriId);
  486.     setValue(attrValue);
  487.     // And store the type
  488.     fType = type;
  489. }
  490. inline void XMLAttr::set(const  unsigned int        uriId
  491.                         , const XMLCh* const        attrRawName
  492.                         , const XMLCh* const        attrValue
  493.                         , const XMLAttDef::AttTypes type)
  494. {
  495.     // Set the name info and the value via their respective calls
  496.     fAttName->setName(attrRawName, uriId);
  497.     setValue(attrValue);
  498.     // And store the type
  499.     fType = type;
  500. }
  501. inline void XMLAttr::setType(const XMLAttDef::AttTypes newValue)
  502. {
  503.     fType = newValue;
  504. }
  505. inline void XMLAttr::setSpecified(const bool newValue)
  506. {
  507.     fSpecified = newValue;
  508. }
  509. XERCES_CPP_NAMESPACE_END
  510. #endif