00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00034
00035 #ifndef GROOVX_RUTZ_GZSTREAMBUF_H_UTC20050626084020_DEFINED
00036 #define GROOVX_RUTZ_GZSTREAMBUF_H_UTC20050626084020_DEFINED
00037
00038 #include <istream>
00039 #include <ostream>
00040 #include <streambuf>
00041 #include <zlib.h>
00042
00043 namespace rutz
00044 {
00045 class fstring;
00046
00047 template <class T> class shared_ptr;
00048
00050 class gzstreambuf : public std::streambuf
00051 {
00052 private:
00053 bool m_opened;
00054 int m_mode;
00055 gzFile m_gzfile;
00056
00057 gzstreambuf(const gzstreambuf&);
00058 gzstreambuf& operator=(const gzstreambuf&);
00059
00060 static const int s_buf_size = 4092;
00061 static const int s_pback_size = 4;
00062 char m_buf[s_buf_size];
00063
00064 int flushoutput();
00065
00066 public:
00067 gzstreambuf(const char* name, int om, bool throw_exception=false);
00068 ~gzstreambuf() { close(); }
00069
00070 bool is_open() { return m_opened; }
00071
00072 void ensure_open();
00073
00074 void close();
00075
00076 virtual int underflow();
00077
00078 virtual int overflow(int c);
00079
00080 virtual int sync();
00081 };
00082
00086 shared_ptr<std::ostream> ogzopen(const rutz::fstring& filename,
00087 std::ios::openmode flags =
00088 std::ios::openmode(0));
00089
00091 shared_ptr<std::ostream> ogzopen(const char* filename,
00092 std::ios::openmode flags =
00093 std::ios::openmode(0));
00094
00099 shared_ptr<std::istream> igzopen(const rutz::fstring& filename,
00100 std::ios::openmode flags =
00101 std::ios::openmode(0));
00102
00104 shared_ptr<std::istream> igzopen(const char* filename,
00105 std::ios::openmode flags =
00106 std::ios::openmode(0));
00107 }
00108
00109 static const char __attribute__((used)) vcid_groovx_rutz_gzstreambuf_h_utc20050626084020[] = "$Id: gzstreambuf.h 10065 2007-04-12 05:54:56Z rjpeters $ $HeadURL: file:
00110 #endif // !GROOVX_RUTZ_GZSTREAMBUF_H_UTC20050626084020_DEFINED