00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef OW32_zipfstream_h
00023 #define OW32_zipfstream_h
00024
00025 #include <iostream>
00026 #include <zlib.h>
00027 #include <OW32/OW32Libs.h>
00028
00029 namespace OW32
00030 {
00031
00032 using std::streambuf;
00033 using std::ostream;
00034 using std::istream;
00035 using std::streamsize;
00036 using std::ios_base;
00037
00039 class OW32_LIB_EXPORT zipfilebuf : public streambuf
00040 {
00041 public:
00042 zipfilebuf();
00043 zipfilebuf(const char* fname,
00044 ios_base::openmode mode = ios_base::out | ios_base::trunc);
00045 ~zipfilebuf();
00046 bool open(const char* fname,
00047 ios_base::openmode mode = ios_base::out | ios_base::trunc);
00048
00049 protected:
00050 virtual int sync();
00051 virtual int_type underflow();
00052 virtual int_type overflow(int_type c);
00053
00054 private:
00055
00056 enum { CHUNK = 2048 };
00057
00058 int m_flags;
00059 FILE* m_fp;
00060 z_stream m_flateStream;
00061 char m_in_buf[CHUNK];
00062 char m_storage[CHUNK];
00063
00064 void Init();
00065 };
00066
00068 class OW32_LIB_EXPORT ofzipstream : public ostream
00069 {
00070 public:
00071 ofzipstream()
00072 : ostream(&_Mysb), _Mysb()
00073 {
00074 }
00075
00076 ofzipstream(const char *fname,
00077 ios_base::openmode mode = ios_base::out | ios_base::trunc)
00078 : ostream(&_Mysb), _Mysb(fname, mode)
00079 {
00080 }
00081
00082
00083
00084 zipfilebuf *rdbuf() const
00085 {
00086 return ((zipfilebuf *)&_Mysb);
00087 }
00088
00089 private:
00090 ofzipstream(const ofzipstream& );
00091 ofzipstream& operator=(const ofzipstream& );
00092
00093 zipfilebuf _Mysb;
00094 };
00095
00097 class OW32_LIB_EXPORT ifzipstream : public istream
00098 {
00099 public:
00100 ifzipstream()
00101 : istream(&_Mysb), _Mysb()
00102 {
00103 }
00104
00105 ifzipstream(const char *fname,
00106 ios_base::openmode mode = ios_base::in)
00107 : istream(&_Mysb), _Mysb(fname, mode)
00108 {
00109 }
00110
00111 void open(const char *fname,
00112 ios_base::openmode mode = ios_base::in)
00113 {
00114 if (!_Mysb.open(fname, mode))
00115 setstate(ios_base::failbit);
00116 }
00117
00118
00119 zipfilebuf *rdbuf() const
00120 {
00121 return ((zipfilebuf *)&_Mysb);
00122 }
00123
00124 private:
00125 ifzipstream(const ifzipstream& );
00126 ifzipstream& operator=(const ifzipstream& );
00127 zipfilebuf _Mysb;
00128 };
00129
00130 }
00131
00132 #endif // OW32_zipfstream_h