cmtkCompressedStreamBZip2.cxx

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 1997-2009 Torsten Rohlfing
00004 //
00005 //  Copyright 2004-2011 SRI International
00006 //
00007 //  This file is part of the Computational Morphometry Toolkit.
00008 //
00009 //  http://www.nitrc.org/projects/cmtk/
00010 //
00011 //  The Computational Morphometry Toolkit is free software: you can
00012 //  redistribute it and/or modify it under the terms of the GNU General Public
00013 //  License as published by the Free Software Foundation, either version 3 of
00014 //  the License, or (at your option) any later version.
00015 //
00016 //  The Computational Morphometry Toolkit is distributed in the hope that it
00017 //  will be useful, but WITHOUT ANY WARRANTY; without even the implied
00018 //  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 //  GNU General Public License for more details.
00020 //
00021 //  You should have received a copy of the GNU General Public License along
00022 //  with the Computational Morphometry Toolkit.  If not, see
00023 //  <http://www.gnu.org/licenses/>.
00024 //
00025 //  $Revision: 2731 $
00026 //
00027 //  $LastChangedDate: 2011-01-13 16:22:47 -0800 (Thu, 13 Jan 2011) $
00028 //
00029 //  $LastChangedBy: torstenrohlfing $
00030 //
00031 */
00032 
00033 #include "cmtkCompressedStream.h"
00034 
00035 #include <bzlib.h>
00036 
00037 #include <System/cmtkConsole.h>
00038 #include <System/cmtkExitException.h>
00039 
00040 namespace
00041 cmtk
00042 {
00043 
00046 
00047 CompressedStream::BZip2::BZip2( const char* filename ) 
00048 {
00049   this->m_BzFile = BZ2_bzopen( filename, CMTK_FILE_MODE );
00050   if ( !this->m_BzFile ) 
00051     {
00052     StdErr << "ERROR: CompressedStream::BZip2 could not open file '" << filename << "'\n";
00053     throw ExitException( 1 );
00054     }
00055 }
00056 
00057 void 
00058 CompressedStream::BZip2::Close()
00059 {
00060   BZ2_bzclose( this->m_BzFile );
00061 }
00062 
00063 void
00064 CompressedStream::BZip2::Rewind() 
00065 {
00066   StdErr << "CompressedStream::BZip2::Rewind() is not implemented\n";
00067   throw ExitException( 1 );
00068 }
00069 
00070 size_t
00071 CompressedStream::BZip2::Read ( void *data, size_t size, size_t count ) 
00072 {
00073   const size_t bytesRead = BZ2_bzRead( &this->m_BzError, this->m_BzFile, data, size * count );
00074 
00075   if ( this->m_BzError < 0 )
00076     {
00077     StdErr << "BZ2_bzRead() returned error " << this->m_BzError << "\n";
00078     throw( ExitException( 1 ) );
00079     }
00080 
00081   this->m_BytesRead += bytesRead;
00082   return bytesRead / size;
00083 }
00084 
00085 bool
00086 CompressedStream::BZip2::Get ( char &c)
00087 {
00088   if ( this->Feof() || !this->Read( &c, sizeof(char), 1 ) )
00089     return false;
00090 
00091   return true;
00092 }
00093 
00094 int
00095 CompressedStream::BZip2::Tell () const 
00096 {
00097   return this->m_BytesRead;
00098 }
00099 
00100 bool
00101 CompressedStream::BZip2::Feof () const 
00102 {
00103   return this->m_BzError == BZ_STREAM_END;
00104 }
00105 
00106 } // namespace cmtk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines