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

词法分析

开发平台:

Visual 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: MemBufInputSource.hpp,v $
  58.  * Revision 1.4  2003/05/16 21:36:55  knoaman
  59.  * Memory manager implementation: Modify constructors to pass in the memory manager.
  60.  *
  61.  * Revision 1.3  2002/11/04 15:00:21  tng
  62.  * C++ Namespace Support.
  63.  *
  64.  * Revision 1.2  2002/02/20 18:17:01  tng
  65.  * [Bug 5977] Warnings on generating apiDocs.
  66.  *
  67.  * Revision 1.1.1.1  2002/02/01 22:21:50  peiyongz
  68.  * sane_include
  69.  *
  70.  * Revision 1.6  2000/12/14 18:49:54  tng
  71.  * Fix API document generation warning: "Warning: end of member group without matching begin"
  72.  *
  73.  * Revision 1.5  2000/02/24 20:00:22  abagchi
  74.  * Swat for removing Log from API docs
  75.  *
  76.  * Revision 1.4  2000/02/15 23:59:06  roddey
  77.  * More updated documentation of Framework classes.
  78.  *
  79.  * Revision 1.3  2000/02/15 01:21:30  roddey
  80.  * Some initial documentation improvements. More to come...
  81.  *
  82.  * Revision 1.2  2000/02/06 07:47:46  rahulj
  83.  * Year 2K copyright swat.
  84.  *
  85.  * Revision 1.1  2000/01/12 00:13:26  roddey
  86.  * These were moved from internal/ to framework/, which was something that should have
  87.  * happened long ago. They are really framework type of classes.
  88.  *
  89.  * Revision 1.1.1.1  1999/11/09 01:08:10  twl
  90.  * Initial checkin
  91.  *
  92.  * Revision 1.2  1999/11/08 20:44:43  rahul
  93.  * Swat for adding in Product name and CVS comment log variable.
  94.  *
  95.  */
  96. #if !defined(MEMBUFINPUTSOURCE_HPP)
  97. #define MEMBUFINPUTSOURCE_HPP
  98. #include <xercesc/sax/InputSource.hpp>
  99. XERCES_CPP_NAMESPACE_BEGIN
  100. class BinInputStream;
  101. /**
  102.  *  This class is a derivative of the standard InputSource class. It provides
  103.  *  for the parser access to data stored in a memory buffer. The type of
  104.  *  buffer and its host specific attributes are of little concern here. The
  105.  *  only real requirement is that the memory be readable by the current
  106.  *  process.
  107.  *
  108.  *  Note that the memory buffer size is expressed in <b>bytes</b>, not in
  109.  *  characters. If you pass it text data, you must account for the bytes
  110.  *  per character when indicating the buffer size.
  111.  *
  112.  *  As with all InputSource derivatives. The primary objective of an input
  113.  *  source is to create an input stream via which the parser can spool in
  114.  *  data from the referenced source. In this case, there are two options
  115.  *  available.
  116.  *
  117.  *  The passed buffer can be adopted or merely referenced. If it is adopted,
  118.  *  then it must be dynamically allocated and will be destroyed when the
  119.  *  input source is destroyed (no reference counting!.) If not adopted, the
  120.  *  caller must insure that it remains valid until the input source object
  121.  *  is destroyed.
  122.  *
  123.  *  The other option indicates whether each stream created for this input
  124.  *  source should get its own copy of the data, or whether it should just
  125.  *  stream the data directly from this object's copy of the data. The same
  126.  *  rules apply here, in that the buffer must either be copied by the
  127.  *  stream or it must remain valid until the stream is destroyed.
  128.  */
  129. class XMLPARSER_EXPORT MemBufInputSource : public InputSource
  130. {
  131. public :
  132.     // -----------------------------------------------------------------------
  133.     //  Constructors and Destructor
  134.     // -----------------------------------------------------------------------
  135.     /** @name Constructors */
  136.     //@{
  137.     /**
  138.       * A memory buffer input source is constructed from a buffer of byte
  139.       * data, and the count of bytes in that buffer. The parser will parse
  140.       * from this memory buffer until it has eaten the indicated number of
  141.       * bytes.
  142.       *
  143.       * Note that the system id provided serves two purposes. Firstly it is
  144.       * going to be displayed in error messages as the source of the error.
  145.       * And secondly, any entities which are refered to from this entity
  146.       * via relative paths/URLs will be relative to this fake system id.
  147.       *
  148.       * @param  srcDocBytes     The actual data buffer to be parsed from.
  149.       * @param  byteCount       The count of bytes (not characters, bytes!)
  150.       *                         in the buffer.
  151.       * @param  bufId           A fake system id for the buffer.
  152.       * @param  adoptBuffer     Indicates whether this object should adopt
  153.       *                         the buffer (i.e. make a copy of it) or just
  154.       *                         use it in place.
  155.       */
  156.     MemBufInputSource
  157.     (
  158.         const   XMLByte* const  srcDocBytes
  159.         , const unsigned int    byteCount
  160.         , const XMLCh* const    bufId
  161.         , const bool            adoptBuffer// = false
  162.         , MemoryManager* const  manager = XMLPlatformUtils::fgMemoryManager
  163.     );
  164.     /**
  165.       * This constructor is identical to the previous one, except that it takes
  166.       * the fake system id in local code page form and transcodes it internally.
  167.       */
  168.     MemBufInputSource
  169.     (
  170.         const   XMLByte* const  srcDocBytes
  171.         , const unsigned int    byteCount
  172.         , const char* const     bufId
  173.         , const bool            adoptBuffer = false
  174.         , MemoryManager* const  manager = XMLPlatformUtils::fgMemoryManager
  175.     );
  176.     //@}
  177.     /** @name Destructor */
  178.     //@{
  179.     /**
  180.       * If the buffer was adopted, the copy made during construction is deleted
  181.       * at this point.
  182.       */
  183.     ~MemBufInputSource();
  184.     //@}
  185.     // -----------------------------------------------------------------------
  186.     //  Virtual input source interface
  187.     // -----------------------------------------------------------------------
  188.     /** @name Virtual methods */
  189.     //@{
  190.     /**
  191.       * This method will return a binary input stream derivative that will
  192.       * parse from the memory buffer. If setCopyBufToStream() has been set,
  193.       * then the stream will make its own copy. Otherwise, it will use the
  194.       * buffer as is (in which case it must remain valid until the stream
  195.       * is no longer in use, i.e. the parse completes.)
  196.       *
  197.       * @return A dynamically allocated binary input stream derivative that
  198.       *         can parse from the memory buffer.
  199.       */
  200.     BinInputStream* makeStream() const;
  201.     //@}
  202.     // -----------------------------------------------------------------------
  203.     //  Setter methods
  204.     // -----------------------------------------------------------------------
  205.     /** @name Setter methods */
  206.     //@{
  207.     /**
  208.       * By default, for safety's sake, each newly created stream from this
  209.       * input source will make its own copy of the buffer to stream from. This
  210.       * avoids having to deal with aliasing of the buffer for simple work. But,
  211.       * for higher performance applications or for large buffers, this is
  212.       * obviously not optimal.
  213.       *
  214.       * In such cases, you can call this method to turn off that default
  215.       * action. Once turned off, the streams will just get a pointer to the
  216.       * buffer and parse directly from that. In this case, you must insure that
  217.       * the buffer remains valid for as long as any parse events are still
  218.       * using it.
  219.       *
  220.       * @param  newState    The new boolean flag state to set.
  221.       */
  222.     void setCopyBufToStream(const bool newState);
  223.     //@}
  224. private :
  225.     // -----------------------------------------------------------------------
  226.     //  Private data members
  227.     //
  228.     //  fAdopted
  229.     //      Indicates whether the buffer is adopted or not. If so, then it
  230.     //      is destroyed when the input source is destroyed.
  231.     //
  232.     //  fByteCount
  233.     //      The size of the source document.
  234.     //
  235.     //  fCopyBufToStream
  236.     //      This defaults to true (the safe option), which causes it to
  237.     //      give a copy of the buffer to any streams it creates. If you set
  238.     //      it to false, it will allow the streams to just reference the
  239.     //      buffer (in which case this input source must stay alive as long
  240.     //      as the buffer is in use by the stream.)
  241.     //
  242.     //  fSrcBytes
  243.     //      The source memory buffer that is being spooled from. Whether it
  244.     //      belongs to the this input source or not is controlled by the
  245.     //      fAdopted flag.
  246.     // -----------------------------------------------------------------------
  247.     bool            fAdopted;
  248.     unsigned int    fByteCount;
  249.     bool            fCopyBufToStream;
  250.     const XMLByte*  fSrcBytes;
  251. };
  252. inline void MemBufInputSource::setCopyBufToStream(const bool newState)
  253. {
  254.     fCopyBufToStream = newState;
  255. }
  256. XERCES_CPP_NAMESPACE_END
  257. #endif