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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: stream.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:41:03  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: stream.cpp,v 1000.3 2004/06/01 19:41:03 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Vladimir Ivanov
  35.  *
  36.  * File Description:  CCompression based C++ I/O streams
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "streambuf.hpp"
  41. #include <memory>
  42. BEGIN_NCBI_SCOPE
  43. //////////////////////////////////////////////////////////////////////////////
  44. //
  45. // CCompressionStreamProcessor
  46. //
  47. CCompressionStreamProcessor::CCompressionStreamProcessor(
  48.     CCompressionProcessor*  processor,
  49.     EDeleteProcessor        need_delete,
  50.     streamsize              in_bufsize,
  51.     streamsize              out_bufsize)
  52.     : m_Processor(processor), 
  53.       m_InBuf(0),
  54.       m_InBufSize(in_bufsize <= 1 ? kCompressionDefaultBufSize : in_bufsize),
  55.       m_OutBuf(0),
  56.       m_OutBufSize(out_bufsize <= 1 ? kCompressionDefaultBufSize :out_bufsize),
  57.       m_LastOutAvail(0),
  58.       m_Begin(0),
  59.       m_End(0),
  60.       m_NeedDelete(need_delete),
  61.       m_LastStatus(CCompressionProcessor::eStatus_Error),
  62.       m_Finalized(0)
  63. {
  64.     return;
  65. }
  66. CCompressionStreamProcessor::~CCompressionStreamProcessor(void)
  67. {
  68.     if ( m_Processor  &&  m_NeedDelete == eDelete ) {
  69.         delete m_Processor;
  70.     }
  71.     m_Processor = 0;
  72. }
  73. //////////////////////////////////////////////////////////////////////////////
  74. //
  75. // CCompressionStream
  76. //
  77. CCompressionStream::CCompressionStream(CNcbiIos&                    stream,
  78.                                        CCompressionStreamProcessor* read_sp,
  79.                                        CCompressionStreamProcessor* write_sp,
  80.                                        TOwnership                   ownership)
  81.     : CNcbiIos(0), m_Stream(&stream), m_StreamBuf(0),
  82.       m_Reader(read_sp), m_Writer(write_sp), m_Ownership(ownership)
  83. {
  84.     // Create a new stream buffer
  85.     auto_ptr<CCompressionStreambuf> sb(
  86.         new CCompressionStreambuf(&stream, read_sp, write_sp));
  87.     init(sb.get());
  88.     m_StreamBuf = sb.release();
  89.     if ( !m_StreamBuf->IsOkay() ) {
  90.         setstate(badbit | eofbit);
  91.     }
  92. }
  93. CCompressionStream::~CCompressionStream(void)
  94. {
  95.     // Delete stream buffer
  96.     streambuf* sb = rdbuf();
  97.     delete sb;
  98.     if ( sb != m_StreamBuf ) {
  99.         delete m_StreamBuf;
  100.     }
  101. #ifdef AUTOMATIC_STREAMBUF_DESTRUCTION
  102.     rdbuf(0);
  103. #endif
  104.     // Delete owned objects
  105.     if ( m_Stream  &&  m_Ownership & fOwnStream ) {
  106. #if defined(NCBI_COMPILER_GCC)  &&  NCBI_COMPILER_VERSION < 300
  107.        // On GCC 2.9x ios::~ios() is protected
  108. #else
  109.         delete m_Stream;
  110.         m_Stream = 0;
  111. #endif
  112.     }
  113.     if ( m_Reader  &&  m_Ownership & fOwnReader ) {
  114.         if ( m_Reader == m_Writer  &&  m_Ownership & fOwnWriter ) {
  115.             m_Writer = 0;
  116.         }
  117.         delete m_Reader;
  118.         m_Reader = 0;
  119.     }
  120.     if ( m_Writer  &&  m_Ownership & fOwnWriter ) {
  121.         delete m_Writer;
  122.         m_Writer = 0;
  123.     }
  124. }
  125. void CCompressionStream::Finalize(CCompressionStream::EDirection dir) 
  126. {
  127.     if ( m_StreamBuf ) {
  128.         m_StreamBuf->Finalize(dir);
  129.     }
  130. }
  131. unsigned long CCompressionStream::x_GetProcessedSize(
  132.                                   CCompressionStream::EDirection dir)
  133. {
  134.     CCompressionStreamProcessor* sp = (dir == eRead) ? m_Reader :
  135.                                                        m_Writer;
  136.     if (!sp  ||  !sp->m_Processor) {
  137.         return 0;
  138.     }
  139.     return sp->m_Processor->GetProcessedSize();
  140. }
  141. unsigned long CCompressionStream::x_GetOutputSize(
  142.                                   CCompressionStream::EDirection dir)
  143. {
  144.     CCompressionStreamProcessor* sp = (dir == eRead) ? m_Reader :
  145.                                                        m_Writer;
  146.     if (!sp  ||  !sp->m_Processor) {
  147.         return 0;
  148.     }
  149.     return sp->m_Processor->GetOutputSize();
  150. }
  151. END_NCBI_SCOPE
  152. /*
  153.  * ===========================================================================
  154.  * $Log: stream.cpp,v $
  155.  * Revision 1000.3  2004/06/01 19:41:03  gouriano
  156.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  157.  *
  158.  * Revision 1.9  2004/05/17 21:07:25  gorelenk
  159.  * Added include of PCH ncbi_pch.hpp
  160.  *
  161.  * Revision 1.8  2004/05/10 11:56:08  ivanov
  162.  * Added gzip file format support
  163.  *
  164.  * Revision 1.7  2004/04/09 14:02:29  ivanov
  165.  * Added workaround fix for GCC 2.95. The ios::~ios() is protected here.
  166.  *
  167.  * Revision 1.6  2004/04/09 11:47:29  ivanov
  168.  * Added ownership parameter for automaticaly destruction underlying stream
  169.  * and read/write compression processors.
  170.  *
  171.  * Revision 1.5  2004/01/20 20:38:34  lavr
  172.  * Cease using HAVE_BUGGY_IOS_CALLBACKS in this file
  173.  *
  174.  * Revision 1.4  2003/06/17 15:45:05  ivanov
  175.  * Added CCompressionStreamProcessor base class. Rewritten CCompressionStream
  176.  * to use I/O stream processors of class CCompressionStreamProcessor.
  177.  *
  178.  * Revision 1.3  2003/06/03 20:09:16  ivanov
  179.  * The Compression API redesign. Added some new classes, rewritten old.
  180.  *
  181.  * Revision 1.2  2003/04/11 19:55:28  ivanov
  182.  * Move streambuf.hpp from 'include/...' to 'src/...'
  183.  *
  184.  * Revision 1.1  2003/04/07 20:21:35  ivanov
  185.  * Initial revision
  186.  *
  187.  * ===========================================================================
  188.  */