00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef _zfstream_hxx
00028 #define _zfstream_hxx
00029
00030 #include <simgear/compiler.h>
00031
00032 #include <zlib.h>
00033
00034
00035 #include <streambuf>
00036 #include <istream>
00037
00038 #define ios_openmode std::ios_base::openmode
00039 #define ios_in std::ios_base::in
00040 #define ios_out std::ios_base::out
00041 #define ios_app std::ios_base::app
00042 #define ios_binary std::ios_base::binary
00043
00044 #define ios_seekdir std::ios_base::seekdir
00045
00046 #define ios_badbit std::ios_base::badbit
00047 #define ios_failbit std::ios_base::failbit
00048
00052 #ifdef SG_NEED_STREAMBUF_HACK
00053 class gzfilebuf : public __streambuf {
00054 typedef __streambuf parent;
00055 #else
00056 class gzfilebuf : public std::streambuf {
00057 typedef std::streambuf parent;
00058 #endif
00059
00060 public:
00062 gzfilebuf();
00063
00065 virtual ~gzfilebuf();
00066
00073 gzfilebuf* open( const char* name, ios_openmode io_mode );
00074
00081 gzfilebuf* attach( int file_descriptor, ios_openmode io_mode );
00082
00084 gzfilebuf* close();
00085
00086
00087
00088
00090 bool is_open() const { return (file != NULL); }
00091
00093 virtual std::streampos seekoff( std::streamoff off, ios_seekdir way, int which );
00094
00096 virtual int sync();
00097
00098 protected:
00099
00100 virtual int_type underflow();
00101
00102 virtual int_type overflow( int_type c = parent::traits_type::eof() );
00103 private:
00104
00105 int_type flushbuf();
00106 int fillbuf();
00107
00108
00109 void cvt_iomode( char* mode_str, ios_openmode io_mode );
00110
00111 private:
00112
00113 gzFile file;
00114 ios_openmode mode;
00115 bool own_file_descriptor;
00116
00117
00118 int ibuf_size;
00119 char* ibuffer;
00120
00121 enum { page_size = 4096 };
00122
00123 private:
00124
00125 gzfilebuf( const gzfilebuf& );
00126 void operator= ( const gzfilebuf& );
00127 };
00128
00132 struct gzifstream_base
00133 {
00134 gzifstream_base() {}
00135
00136 gzfilebuf gzbuf;
00137 };
00138
00139 #endif // _zfstream_hxx
00140