bytesrc.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:16k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bytesrc.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/02/12 21:57:36  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.23
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef UTIL___BYTESRC__HPP
  10. #define UTIL___BYTESRC__HPP
  11. /*  $Id: bytesrc.hpp,v 1000.2 2004/02/12 21:57:36 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author: Eugene Vasilchenko
  37.  *
  38.  */
  39. /// @file bytesrc.hpp
  40. ///
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbiobj.hpp>
  43. #include <util/reader_writer.hpp>
  44. /** @addtogroup StreamSupport
  45.  *
  46.  * @{
  47.  */
  48. BEGIN_NCBI_SCOPE
  49. class CByteSource;
  50. class CByteSourceReader;
  51. class CSubSourceCollector;
  52. class CIStreamBuffer;
  53. class NCBI_XUTIL_EXPORT CByteSource : public CObject
  54. {
  55. public:
  56.     CByteSource(void);
  57.     virtual ~CByteSource(void);
  58.     virtual CRef<CByteSourceReader> Open(void) = 0;
  59. };
  60. class NCBI_XUTIL_EXPORT CByteSourceReader : public CObject
  61. {
  62. public:
  63.     CByteSourceReader(void);
  64.     virtual ~CByteSourceReader(void);
  65.     /// Read up to bufferLength bytes into buffer
  66.     /// return amount of bytes read (if zero - see EndOfData())
  67.     virtual size_t Read(char* buffer, size_t bufferLength) = 0;
  68.     /// Call this method after Read returned zero to determine whether
  69.     /// end of data reached or error occurred
  70.     virtual bool EndOfData(void) const;
  71.     virtual CRef<CSubSourceCollector> 
  72.         SubSource(size_t prepend, CRef<CSubSourceCollector> parent);
  73.     // push back some data in source, return true if successful
  74.     virtual bool Pushback(const char* data, size_t size);
  75.     // Set reader current position, when possible
  76.     // (default implementation throws an exception)
  77.     virtual void Seekg(size_t pos);
  78. private:
  79.     CByteSourceReader(const CByteSourceReader&);
  80.     CByteSourceReader& operator=(const CByteSourceReader&);
  81. };
  82. /// Abstract class for implementing "sub collectors".
  83. ///
  84. /// Sub source collectors can accumulate data in memory, disk
  85. /// or uany other media. This is used to temporarily 
  86. /// store fragments of binary streams or BLOBs. 
  87. /// Typically such collected data can be re-read by provided 
  88. /// CByteSource interface.
  89. class NCBI_XUTIL_EXPORT CSubSourceCollector : public CObject
  90. {
  91. public:
  92.     /// Constructor.
  93.     ///
  94.     /// @param parent_collector
  95.     ///   Pointer on parent(chained) collector.
  96.     ///   CSubSourceCollector relays all AddChunk calls to the parent object
  97.     ///   making possible having several sub-sources chained together.
  98.     CSubSourceCollector(CRef<CSubSourceCollector> parent);
  99.     // Destructor.
  100.     virtual ~CSubSourceCollector(void);
  101.     /// Add data to the sub-source. If parent pointer is
  102.     /// set(m_ParentSubSource) call is redirected to the parent chain.
  103.     virtual void AddChunk(const char* buffer, size_t bufferLength);
  104.     /// Get CByteSource implementation.
  105.     ///
  106.     /// Calling program can try to re-read collected data using CByteSource and
  107.     /// CByteSourceReader interfaces, though it is legal to return NULL pointer
  108.     /// if CSubSourceCollector implementation does not support re-reading
  109.     /// (for example if collector sends data away using network or just writes
  110.     /// down logs to a write-only database).
  111.     /// @sa
  112.     ///   CByteSource, CByteSourceReader
  113.     virtual CRef<CByteSource> GetSource(void) = 0;
  114. protected:
  115.     /// Pointer on parent (or chained) collector.
  116.     CRef<CSubSourceCollector> m_ParentSubSource;
  117. };
  118. class NCBI_XUTIL_EXPORT CStreamByteSource : public CByteSource
  119. {
  120. public:
  121.     CStreamByteSource(CNcbiIstream& in);
  122.     ~CStreamByteSource(void);
  123.     CRef<CByteSourceReader> Open(void);
  124. protected:
  125.     CNcbiIstream* m_Stream;
  126. };
  127. class NCBI_XUTIL_EXPORT CFStreamByteSource : public CStreamByteSource
  128. {
  129. public:
  130.     CFStreamByteSource(CNcbiIstream& in);
  131.     CFStreamByteSource(const string& fileName, bool binary);
  132.     ~CFStreamByteSource(void);
  133. };
  134. class NCBI_XUTIL_EXPORT CFileByteSource : public CByteSource
  135. {
  136. public:
  137.     CFileByteSource(const string& name, bool binary);
  138.     CFileByteSource(const CFileByteSource& file);
  139.     ~CFileByteSource(void);
  140.     CRef<CByteSourceReader> Open(void);
  141.     const string& GetFileName(void) const
  142.         { return m_FileName; }
  143.     bool IsBinary(void) const
  144.         { return m_Binary; }
  145. private:
  146.     string m_FileName;
  147.     bool   m_Binary;
  148. };
  149. class NCBI_XUTIL_EXPORT CStreamByteSourceReader : public CByteSourceReader
  150. {
  151. public:
  152.     CStreamByteSourceReader(const CByteSource* source, CNcbiIstream* stream);
  153.     ~CStreamByteSourceReader(void);
  154.     size_t Read(char* buffer, size_t bufferLength);
  155.     bool EndOfData(void) const;
  156.     bool Pushback(const char* data, size_t size);
  157.     virtual void Seekg(size_t pos);
  158. protected:
  159.     CConstRef<CByteSource> m_Source;
  160.     CNcbiIstream*          m_Stream;
  161. };
  162. /// Class adapter from IReader to CByteSourceReader.
  163. ///
  164. class NCBI_XUTIL_EXPORT CIRByteSourceReader : public CByteSourceReader
  165. {
  166. public:
  167.     CIRByteSourceReader(IReader* reader);
  168.     ~CIRByteSourceReader(void);
  169.     size_t Read(char* buffer, size_t bufferLength);
  170.     bool EndOfData(void) const;
  171. protected:
  172.     IReader*   m_Reader;
  173.     bool       m_EOF;
  174. };
  175. /// Stream based byte source reader.
  176. /// 
  177. /// Class works as a virtual class factory to create CWriterSourceCollector.
  178. ///
  179. /// One of the projected uses is to update local BLOB cache.
  180. /// @sa
  181. ///   SubSource().
  182. class NCBI_XUTIL_EXPORT CWriterByteSourceReader 
  183.     : public CStreamByteSourceReader
  184. {
  185. public:
  186.     /// Constructor.
  187.     ///
  188.     /// @param stream
  189.     ///   Readers source.
  190.     /// @param writer
  191.     ///   Destination interface pointer.
  192.     CWriterByteSourceReader(CNcbiIstream* stream, IWriter* writer);
  193.     ~CWriterByteSourceReader(void);
  194.     /// Create CWriterSourceCollector.
  195.     virtual CRef<CSubSourceCollector> 
  196.         SubSource(size_t prepend, CRef<CSubSourceCollector> parent);
  197. protected:
  198.     IWriter* m_Writer;
  199. };
  200. class NCBI_XUTIL_EXPORT CWriterCopyByteSourceReader 
  201.     : public CByteSourceReader
  202. {
  203. public:
  204.     /// Constructor.
  205.     ///
  206.     /// @param reader
  207.     ///   Source reader.
  208.     /// @param writer
  209.     ///   Destination interface pointer.
  210.     CWriterCopyByteSourceReader(CByteSourceReader* reader, IWriter* writer);
  211.     ~CWriterCopyByteSourceReader(void);
  212.     /// Just call Read method on source reader.
  213.     size_t Read(char* buffer, size_t bufferLength);
  214.     /// Just call EndOfData method on source reader.
  215.     bool EndOfData(void) const;
  216.     /// Create CWriterSourceCollector.
  217.     virtual CRef<CSubSourceCollector> 
  218.         SubSource(size_t prepend, CRef<CSubSourceCollector> parent);
  219. protected:
  220.     CRef<CByteSourceReader> m_Reader;
  221.     IWriter* m_Writer;
  222. };
  223. class NCBI_XUTIL_EXPORT CFileByteSourceReader : public CStreamByteSourceReader
  224. {
  225. public:
  226.     CFileByteSourceReader(const CFileByteSource* source);
  227.     ~CFileByteSourceReader(void);
  228.    
  229.     CRef<CSubSourceCollector> SubSource(size_t prepend, 
  230.                                         CRef<CSubSourceCollector> parent);
  231. private:
  232.     CConstRef<CFileByteSource> m_FileSource;
  233.     CNcbiIfstream              m_FStream;
  234. };
  235. class NCBI_XUTIL_EXPORT CMemoryChunk : public CObject 
  236. {
  237. public:
  238.     CMemoryChunk(const char* data, size_t dataSize,
  239.                  CRef<CMemoryChunk> prevChunk);
  240.     ~CMemoryChunk(void);
  241.     
  242.     const char* GetData(size_t offset) const
  243.         { return m_Data+offset; }
  244.     size_t GetDataSize(void) const
  245.         { return m_DataSize; }
  246.     CRef<CMemoryChunk> GetNextChunk(void) const
  247.         { return m_NextChunk; }
  248.     void SetNextChunk(CRef<CMemoryChunk> chunk);
  249. private:
  250.     char*              m_Data;
  251.     size_t             m_DataSize;
  252.     CRef<CMemoryChunk> m_NextChunk;
  253. };
  254. class NCBI_XUTIL_EXPORT CMemoryByteSource : public CByteSource
  255. {
  256. public:
  257.     CMemoryByteSource(CConstRef<CMemoryChunk> bytes);
  258.     ~CMemoryByteSource(void);
  259.     CRef<CByteSourceReader> Open(void);
  260. private:
  261.     CConstRef<CMemoryChunk> m_Bytes;
  262. };
  263. class NCBI_XUTIL_EXPORT CMemoryByteSourceReader : public CByteSourceReader
  264. {
  265. public:
  266.     CMemoryByteSourceReader(CConstRef<CMemoryChunk> bytes);
  267.     ~CMemoryByteSourceReader(void);
  268.     
  269.     size_t Read(char* buffer, size_t bufferLength);
  270.     bool EndOfData(void) const;
  271. private:
  272.     size_t GetCurrentChunkAvailable(void) const;
  273. private:
  274.     CConstRef<CMemoryChunk> m_CurrentChunk;
  275.     size_t                  m_CurrentChunkOffset;
  276. };
  277. class NCBI_XUTIL_EXPORT CMemorySourceCollector : public CSubSourceCollector
  278. {
  279. public:
  280.     CMemorySourceCollector(CRef<CSubSourceCollector>
  281.                            parent = CRef<CSubSourceCollector>());
  282.     ~CMemorySourceCollector(void);
  283.     virtual void AddChunk(const char* buffer, size_t bufferLength);
  284.     virtual CRef<CByteSource> GetSource(void);
  285. private:
  286.     CConstRef<CMemoryChunk> m_FirstChunk;
  287.     CRef<CMemoryChunk>      m_LastChunk;
  288. };
  289. /// Class adapter IWriter - CSubSourceCollector.
  290. class NCBI_XUTIL_EXPORT CWriterSourceCollector : public CSubSourceCollector
  291. {
  292. public:
  293.     /// Constructor.
  294.     ///
  295.     /// @param writer
  296.     ///   Pointer on adapted IWriter interface.
  297.     /// @param own
  298.     ///   Flag to take ownership on the writer (delete on destruction).
  299.     /// @param parent
  300.     ///   Chained sub-source.
  301.     CWriterSourceCollector(IWriter*                  writer, 
  302.                            EOwnership                own, 
  303.                            CRef<CSubSourceCollector> parent);
  304.     virtual ~CWriterSourceCollector();
  305.     /// Reset the destination IWriter interface.
  306.     ///
  307.     /// @param writer
  308.     ///   Pointer on adapted IWriter interface.
  309.     /// @param own
  310.     ///   Flag to take ownership on the writer (delete on destruction).
  311.     void SetWriter(IWriter* writer, EOwnership own);
  312.     virtual void AddChunk(const char* buffer, size_t bufferLength);
  313.     /// Return pointer on "reader" interface. In this implementation
  314.     /// returns NULL, since IWriter is a one way (write only interface).
  315.     virtual CRef<CByteSource> GetSource(void);
  316. private:
  317.     IWriter*    m_Writer; ///< Destination interface pointer.
  318.     EOwnership  m_Own;    ///< Flag to delete IWriter on destruction.
  319. };
  320. class NCBI_XUTIL_EXPORT CFileSourceCollector : public CSubSourceCollector
  321. {
  322. public:
  323. #ifdef HAVE_NO_IOS_BASE
  324.     typedef streampos TFilePos;
  325.     typedef streamoff TFileOff;
  326. #else
  327.     typedef CNcbiIstream::pos_type TFilePos;
  328.     typedef CNcbiIstream::off_type TFileOff;
  329. #endif
  330.     CFileSourceCollector(CConstRef<CFileByteSource> source,
  331.                          TFilePos                   start,
  332.                          CRef<CSubSourceCollector>  parent);
  333.     ~CFileSourceCollector(void);
  334.     virtual void AddChunk(const char* buffer, size_t bufferLength);
  335.     virtual CRef<CByteSource> GetSource(void);
  336. private:
  337.     CConstRef<CFileByteSource> m_FileSource;
  338.     TFilePos                   m_Start;
  339.     TFileOff                   m_Length;
  340. };
  341. class NCBI_XUTIL_EXPORT CSubFileByteSource : public CFileByteSource
  342. {
  343.     typedef CFileByteSource CParent;
  344. public:
  345.     typedef CFileSourceCollector::TFilePos TFilePos;
  346.     typedef CFileSourceCollector::TFileOff TFileOff;
  347.     CSubFileByteSource(const CFileByteSource& file,
  348.                        TFilePos start, TFileOff length);
  349.     ~CSubFileByteSource(void);
  350.     CRef<CByteSourceReader> Open(void);
  351.     const TFilePos& GetStart(void) const
  352.         { return m_Start; }
  353.     const TFileOff& GetLength(void) const
  354.         { return m_Length; }
  355. private:
  356.     TFilePos m_Start;
  357.     TFileOff m_Length;
  358. };
  359. class NCBI_XUTIL_EXPORT CSubFileByteSourceReader : public CFileByteSourceReader
  360. {
  361.     typedef CFileByteSourceReader CParent;
  362. public:
  363.     typedef CFileSourceCollector::TFilePos TFilePos;
  364.     typedef CFileSourceCollector::TFileOff TFileOff;
  365.     CSubFileByteSourceReader(const CFileByteSource* source,
  366.                              TFilePos start, TFileOff length);
  367.     ~CSubFileByteSourceReader(void);
  368.     size_t Read(char* buffer, size_t bufferLength);
  369.     bool EndOfData(void) const;
  370.     
  371. private:
  372.     TFileOff m_Length;
  373. };
  374. /* @} */
  375. END_NCBI_SCOPE
  376. /*
  377.  * ===========================================================================
  378.  *
  379.  * $Log: bytesrc.hpp,v $
  380.  * Revision 1000.2  2004/02/12 21:57:36  gouriano
  381.  * PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.23
  382.  *
  383.  * Revision 1.23  2003/12/31 20:52:17  gouriano
  384.  * added possibility to seek (when possible) in CByteSourceReader
  385.  *
  386.  * Revision 1.22  2003/11/19 15:40:09  vasilche
  387.  * Added possibility to pushback data to CByteSourceReader.
  388.  *
  389.  * Revision 1.21  2003/10/14 18:28:33  vasilche
  390.  * Added full set of explicit constructors/destructors to all readers and sources.
  391.  * Added CWriterCopyByteSourceReader for copying data from another reader object.
  392.  *
  393.  * Revision 1.20  2003/10/01 21:08:37  ivanov
  394.  * Formal code rearrangement
  395.  *
  396.  * Revision 1.19  2003/10/01 18:45:12  kuznets
  397.  * + CIRByteSourceReader
  398.  *
  399.  * Revision 1.18  2003/09/30 20:37:35  kuznets
  400.  * Class names clean up (Removed I from CI prefix for classes based in
  401.  * interfaces)
  402.  *
  403.  * Revision 1.17  2003/09/30 20:23:39  kuznets
  404.  * +CIWriterByteSourceReader
  405.  *
  406.  * Revision 1.16  2003/09/30 20:07:02  kuznets
  407.  * Added CStreamRedirectByteSourceReader class (byte source reader
  408.  * with stream redirection into IWriter).
  409.  *
  410.  * Revision 1.15  2003/09/26 15:23:03  kuznets
  411.  * Documented CSubSourceCollector and it's relations with CByteSource
  412.  * and CByteSourceReader
  413.  *
  414.  * Revision 1.14  2003/09/25 16:37:47  kuznets
  415.  * + IWriter based sub source collector
  416.  *
  417.  * Revision 1.13  2003/09/25 13:59:35  ucko
  418.  * Pass C(Const)Ref by value, not reference!
  419.  * Move CVS log to end.
  420.  *
  421.  * Revision 1.12  2003/09/25 12:46:28  kuznets
  422.  * CSubSourceCollector(s) are changed so they can be chained
  423.  * (CByteSourceReader can have more than one CSubSourceCollector)
  424.  *
  425.  * Revision 1.11  2003/04/17 17:50:11  siyan
  426.  * Added doxygen support
  427.  *
  428.  * Revision 1.10  2002/12/19 14:51:00  dicuccio
  429.  * Added export specifier for Win32 DLL builds.
  430.  *
  431.  * Revision 1.9  2001/05/17 15:01:19  lavr
  432.  * Typos corrected
  433.  *
  434.  * Revision 1.8  2001/05/16 17:55:36  grichenk
  435.  * Redesigned support for non-blocking stream read operations
  436.  *
  437.  * Revision 1.7  2001/05/11 20:41:14  grichenk
  438.  * Added support for non-blocking stream reading
  439.  *
  440.  * Revision 1.6  2001/01/05 20:08:52  vasilche
  441.  * Added util directory for various algorithms and utility classes.
  442.  *
  443.  * Revision 1.5  2000/11/01 20:35:27  vasilche
  444.  * Removed ECanDelete enum and related constructors.
  445.  *
  446.  * Revision 1.4  2000/07/03 18:42:32  vasilche
  447.  * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  448.  * Reduced header dependency.
  449.  *
  450.  * Revision 1.3  2000/05/03 14:38:05  vasilche
  451.  * SERIAL: added support for delayed reading to generated classes.
  452.  * DATATOOL: added code generation for delayed reading.
  453.  *
  454.  * Revision 1.2  2000/04/28 19:14:30  vasilche
  455.  * Fixed stream position and offset typedefs.
  456.  *
  457.  * Revision 1.1  2000/04/28 16:58:00  vasilche
  458.  * Added classes CByteSource and CByteSourceReader for generic reading.
  459.  * Added delayed reading of choice variants.
  460.  *
  461.  * ===========================================================================
  462.  */
  463. #endif  /* BUTIL___BYTESRC__HPP */