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

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