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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: zlib.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:39:26  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef UTIL_COMPRESS__ZLIB__HPP
  10. #define UTIL_COMPRESS__ZLIB__HPP
  11. /*  $Id: zlib.hpp,v 1000.2 2004/06/01 19:39:26 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:  Vladimir Ivanov
  37.  *
  38.  * File Description:  ZLib Compression API
  39.  *
  40.  * NOTE: The zlib documentation can be found here: 
  41.  *       http://zlib.org   or   http://www.gzip.org/zlib/manual.html
  42.  */
  43. #include <util/compress/stream.hpp>
  44. #ifdef USE_LOCAL_ZLIB
  45. #  include <util/compress/zlib/zutil.h>
  46. #else
  47. #  include <zlib.h>
  48. #endif
  49. #ifndef DEF_MEM_LEVEL
  50. #  if MAX_MEM_LEVEL >= 8
  51. #    define DEF_MEM_LEVEL 8
  52. #  else
  53. #    define DEF_MEM_LEVEL  MAX_MEM_LEVEL
  54. #  endif
  55. #endif
  56. /** @addtogroup Compression
  57.  *
  58.  * @{
  59.  */
  60. BEGIN_NCBI_SCOPE
  61. //////////////////////////////////////////////////////////////////////////////
  62. //
  63. // Special compressor's parameters (description from zlib docs)
  64. //        
  65. // <window_bits>
  66. //    This parameter is the base two logarithm of the window size
  67. //    (the size of the history buffer). It should be in the range 8..15 for
  68. //    this version of the library. Larger values of this parameter result
  69. //    in better compression at the expense of memory usage. 
  70. //
  71. // <mem_level> 
  72. //    The "mem_level" parameter specifies how much memory should be
  73. //    allocated for the internal compression state. mem_level=1 uses minimum
  74. //    memory but is slow and reduces compression ratio; mem_level=9 uses
  75. //    maximum memory for optimal speed. The default value is 8. See zconf.h
  76. //    for total memory usage as a function of windowBits and memLevel.
  77. //
  78. // <strategy> 
  79. //    The strategy parameter is used to tune the compression algorithm.
  80. //    Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data
  81. //    produced by a filter (or predictor), or Z_HUFFMAN_ONLY to force
  82. //    Huffman encoding only (no string match). Filtered data consists mostly
  83. //    of small values with a somewhat random distribution. In this case,
  84. //    the compression algorithm is tuned to compress them better. The effect
  85. //    of Z_FILTERED is to force more Huffman coding and less string matching;
  86. //    it is somewhat intermediate between Z_DEFAULT and Z_HUFFMAN_ONLY.
  87. //    The strategy parameter only affects the compression ratio but not the
  88. //    correctness of the compressed output even if it is not set appropriately.
  89. //////////////////////////////////////////////////////////////////////////////
  90. //
  91. // CCompressionZip class
  92. //
  93. class NCBI_XUTIL_EXPORT CZipCompression : public CCompression 
  94. {
  95. public:
  96.     /// Zip stream processing flags.
  97.     enum EFlags {
  98.         fCheckFileHeader = (1<<1), // Check & skip file header
  99.                                    // for decompression stream;
  100.         fWriteGZipFormat = (1<<2)  // Use .gz file format to write
  101.                                    // into compression stream
  102.     };
  103.     // 'ctors
  104.     CZipCompression(
  105.         ELevel level       = eLevel_Default,
  106.         int    window_bits = MAX_WBITS,             // [8..15]
  107.         int    mem_level   = DEF_MEM_LEVEL,         // [1..9] 
  108.         int    strategy    = Z_DEFAULT_STRATEGY     // [0,1]
  109.     );
  110.     virtual ~CZipCompression(void);
  111.     // Returns default compression level for a compression algorithm
  112.     virtual ELevel GetDefaultLevel(void) const
  113.         { return ELevel(Z_DEFAULT_COMPRESSION); };
  114.     //
  115.     // Utility functions 
  116.     //
  117.     // Note:
  118.     //    The CompressBuffer/DecompressBuffer do not use extended options
  119.     //    passed in constructor like <window_bits>, <mem_level> and
  120.     //    <strategy>; because the native ZLib compress2/uncompress
  121.     //    functions use primitive initialization methods without a such
  122.     //    options. 
  123.   
  124.     // (De)compress the source buffer into the destination buffer.
  125.     // Return TRUE if operation was succesfully or FALSE otherwise.
  126.     // Altogether, the total size of the destination buffer must be little
  127.     // more then size of the source buffer (at least 0.1% larger + 12 bytes).
  128.     virtual bool CompressBuffer(
  129.         const void* src_buf, unsigned int  src_len,
  130.         void*       dst_buf, unsigned int  dst_size,
  131.         /* out */            unsigned int* dst_len
  132.     );
  133.     virtual bool DecompressBuffer(
  134.         const void* src_buf, unsigned int  src_len,
  135.         void*       dst_buf, unsigned int  dst_size,
  136.         /* out */            unsigned int* dst_len
  137.     );
  138.     // (De)compress file "src_file" and put result to file
  139.     // with name "dst_file".
  140.     // Return TRUE on success, FALSE on error.
  141.     virtual bool CompressFile(
  142.         const string& src_file,
  143.         const string& dst_file,
  144.         size_t        buf_size = kCompressionDefaultBufSize
  145.     );
  146.     virtual bool DecompressFile(
  147.         const string& src_file,
  148.         const string& dst_file, 
  149.         size_t        buf_size = kCompressionDefaultBufSize
  150.     );
  151.     
  152. protected:
  153.     // Format string with last error description
  154.     string FormatErrorMessage(string where, bool use_stream_data =true) const;
  155. protected:
  156.     z_stream  m_Stream;     // Compressor stream;
  157.     int       m_WindowBits; // The base two logarithm of the window size
  158.                             // (the size of the history buffer). 
  159.     int       m_MemLevel;   // The allocation memory level for the
  160.                             // internal compression state;
  161.     int       m_Strategy;   // The parameter to tune the compression algorithm
  162. };
  163.  
  164. //////////////////////////////////////////////////////////////////////////////
  165. //
  166. // CZipCompressionFile class
  167. //
  168. // Note, Read() copies data from the compressed file in chunks of size
  169. // BZ_MAX_UNUSED bytes before decompressing it. If the file contains more
  170. // bytes than strictly needed to reach the logical end-of-stream, Read()
  171. // will almost certainly read some of the trailing data before signalling of
  172. // sequence end.
  173. //
  174. class NCBI_XUTIL_EXPORT CZipCompressionFile : public CZipCompression,
  175.                                               public CCompressionFile
  176. {
  177. public:
  178.     // 'ctors (for a special parameters description see CZipCompression)
  179.     // Throw exception CCompressionException::eCompressionFile on error.
  180.     CZipCompressionFile(
  181.         const string& file_name,
  182.         EMode         mode,
  183.         ELevel        level       = eLevel_Default,
  184.         int           window_bits = MAX_WBITS,
  185.         int           mem_level   = DEF_MEM_LEVEL,
  186.         int           strategy    = Z_DEFAULT_STRATEGY
  187.     );
  188.     CZipCompressionFile(
  189.         ELevel        level       = eLevel_Default,
  190.         int           window_bits = MAX_WBITS,
  191.         int           mem_level   = DEF_MEM_LEVEL,
  192.         int           strategy    = Z_DEFAULT_STRATEGY
  193.     );
  194.     ~CZipCompressionFile(void);
  195.     // Opens a gzip (.gz) file for reading or writing.
  196.     // This function can be used to read a file which is not in gzip format;
  197.     // in this case Read() will directly read from the file without
  198.     // decompression. 
  199.     // Return TRUE if file was opened succesfully or FALSE otherwise.
  200.     virtual bool Open(const string& file_name, EMode mode);
  201.     // Read up to "len" uncompressed bytes from the compressed file "file"
  202.     // into the buffer "buf". If the input file was not in gzip format,
  203.     // gzread copies the given number of bytes into the buffer. 
  204.     // Return the number of bytes actually read
  205.     // (0 for end of file, -1 for error).
  206.     // The number of really readed bytes can be less than requested.
  207.     virtual int Read(void* buf, int len);
  208.     // Writes the given number of uncompressed bytes into the compressed file.
  209.     // Return the number of bytes actually written or -1 for error.
  210.     virtual int Write(const void* buf, int len);
  211.     // Flushes all pending output if necessary, closes the compressed file.
  212.     // Return TRUE on success, FALSE on error.
  213.     virtual bool Close(void);
  214. };
  215. //////////////////////////////////////////////////////////////////////////////
  216. //
  217. // CZipCompressor class
  218. //
  219. class NCBI_XUTIL_EXPORT CZipCompressor : public CZipCompression,
  220.                                          public CCompressionProcessor
  221. {
  222. public:
  223.     // 'ctors
  224.     CZipCompressor(
  225.         ELevel               level       = eLevel_Default,
  226.         int                  window_bits = MAX_WBITS,
  227.         int                  mem_level   = DEF_MEM_LEVEL,
  228.         int                  strategy    = Z_DEFAULT_STRATEGY,
  229.         CCompression::TFlags flags       = 0
  230.     );
  231.     virtual ~CZipCompressor(void);
  232. protected:
  233.     virtual EStatus Init   (void);
  234.     virtual EStatus Process(const char* in_buf,  unsigned long  in_len,
  235.                             char*       out_buf, unsigned long  out_size,
  236.                             /* out */            unsigned long* in_avail,
  237.                             /* out */            unsigned long* out_avail);
  238.     virtual EStatus Flush  (char*       out_buf, unsigned long  out_size,
  239.                             /* out */            unsigned long* out_avail);
  240.     virtual EStatus Finish (char*       out_buf, unsigned long  out_size,
  241.                             /* out */            unsigned long* out_avail);
  242.     virtual EStatus End    (void);
  243. private:
  244.     unsigned long m_CRC32;  // CRC32 for compressed data
  245.     string        m_Cache;  // Buffer to cache small pieces of data
  246.     bool          m_NeedWriteHeader;
  247.                             // Is true if needed to write a file header
  248. };
  249. //////////////////////////////////////////////////////////////////////////////
  250. //
  251. // CZipDecompressor class
  252. //
  253. class NCBI_XUTIL_EXPORT CZipDecompressor : public CZipCompression,
  254.                                            public CCompressionProcessor
  255. {
  256. public:
  257.     // 'ctors
  258.     CZipDecompressor(
  259.         int                  window_bits = MAX_WBITS,
  260.         CCompression::TFlags flags       = 0
  261.     );
  262.     virtual ~CZipDecompressor(void);
  263. protected:
  264.     virtual EStatus Init   (void); 
  265.     virtual EStatus Process(const char* in_buf,  unsigned long  in_len,
  266.                             char*       out_buf, unsigned long  out_size,
  267.                             /* out */            unsigned long* in_avail,
  268.                             /* out */            unsigned long* out_avail);
  269.     virtual EStatus Flush  (char*       out_buf, unsigned long  out_size,
  270.                             /* out */            unsigned long* out_avail);
  271.     virtual EStatus Finish (char*       out_buf, unsigned long  out_size,
  272.                             /* out */            unsigned long* out_avail);
  273.     virtual EStatus End    (void);
  274. private:
  275.     bool   m_NeedCheckHeader; // Is true if needed to check at file header
  276.     string m_Cache;           // Buffer to cache small pieces of data
  277. };
  278. //////////////////////////////////////////////////////////////////////////////
  279. //
  280. // Compression/decompression stream processors (for details see "stream.hpp")
  281. //
  282. class NCBI_XUTIL_EXPORT CZipStreamCompressor
  283.     : public CCompressionStreamProcessor
  284. {
  285. public:
  286.     // Full constructor
  287.     CZipStreamCompressor(
  288.         CCompression::ELevel  level,
  289.         streamsize            in_bufsize,
  290.         streamsize            out_bufsize,
  291.         int                   window_bits,
  292.         int                   mem_level,
  293.         int                   strategy,
  294.         CCompression::TFlags  flags
  295.         ) 
  296.         : CCompressionStreamProcessor(
  297.               new CZipCompressor(level,window_bits,mem_level,strategy,flags),
  298.               eDelete, in_bufsize, out_bufsize)
  299.     {}
  300.     // Conventional constructors
  301.     CZipStreamCompressor(
  302.         CCompression::ELevel  level,
  303.         CCompression::TFlags  flags = 0
  304.         )
  305.         : CCompressionStreamProcessor(
  306.               new CZipCompressor(level, MAX_WBITS, DEF_MEM_LEVEL,
  307.                                  Z_DEFAULT_STRATEGY, flags),
  308.               eDelete, kCompressionDefaultBufSize, kCompressionDefaultBufSize)
  309.     {}
  310.     CZipStreamCompressor(CCompression::TFlags flags = 0)
  311.         : CCompressionStreamProcessor(
  312.               new CZipCompressor(CCompression::eLevel_Default, MAX_WBITS,
  313.                                  DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, flags),
  314.               eDelete, kCompressionDefaultBufSize, kCompressionDefaultBufSize)
  315.     {}
  316. };
  317. class NCBI_XUTIL_EXPORT CZipStreamDecompressor
  318.     : public CCompressionStreamProcessor
  319. {
  320. public:
  321.     // Full constructor
  322.     CZipStreamDecompressor(
  323.         streamsize            in_bufsize,
  324.         streamsize            out_bufsize,
  325.         int                   window_bits,
  326.         CCompression::TFlags  flags
  327.         )
  328.         : CCompressionStreamProcessor( 
  329.               new CZipDecompressor(window_bits,flags),
  330.               eDelete, in_bufsize, out_bufsize)
  331.     {}
  332.     // Conventional constructor
  333.     CZipStreamDecompressor(CCompression::TFlags flags = 0)
  334.         : CCompressionStreamProcessor( 
  335.               new CZipDecompressor(MAX_WBITS, flags),
  336.               eDelete, kCompressionDefaultBufSize, kCompressionDefaultBufSize)
  337.     {}
  338. };
  339. END_NCBI_SCOPE
  340. /* @} */
  341. /*
  342.  * ===========================================================================
  343.  * $Log: zlib.hpp,v $
  344.  * Revision 1000.2  2004/06/01 19:39:26  gouriano
  345.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  346.  *
  347.  * Revision 1.10  2004/05/14 15:16:46  vakatov
  348.  * Take into account only USE_LOCAL_ZLIB, and not NCBI_COMPILER_MSVC
  349.  *
  350.  * Revision 1.9  2004/05/10 11:56:24  ivanov
  351.  * Added gzip file format support
  352.  *
  353.  * Revision 1.8  2004/04/19 14:17:54  ivanov
  354.  * Added gzip file format support into stream decompressor
  355.  *
  356.  * Revision 1.7  2004/04/05 16:55:13  ucko
  357.  * Include the internal zlib.h when using MSVC until its build system
  358.  * catches up.
  359.  *
  360.  * Revision 1.6  2004/04/05 15:54:12  ucko
  361.  * Default to using external versions of zlib,bzlib, and libpcre if available.
  362.  *
  363.  * Revision 1.5  2003/07/15 15:45:45  ivanov
  364.  * Improved error diagnostics
  365.  *
  366.  * Revision 1.4  2003/07/10 16:22:27  ivanov
  367.  * Added buffer size parameter into [De]CompressFile() functions.
  368.  * Cosmetic changes.
  369.  *
  370.  * Revision 1.3  2003/06/17 15:48:59  ivanov
  371.  * Removed all standalone compression/decompression I/O classes.
  372.  * Added CZipStream[De]compressor classes. Now all zlib-based I/O stream
  373.  * classes can be constructed using unified CCompression[I/O]Stream
  374.  * (see stream.hpp) and CZipStream[De]compressor classes.
  375.  *
  376.  * Revision 1.2  2003/06/03 20:09:54  ivanov
  377.  * The Compression API redesign. Added some new classes, rewritten old.
  378.  *
  379.  * Revision 1.1  2003/04/07 20:42:11  ivanov
  380.  * Initial revision
  381.  *
  382.  * ===========================================================================
  383.  */
  384. #endif  /* UTIL_COMPRESS__ZLIB__HPP */