00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef OW32_zipstrstream_h
00023 #define OW32_zipstrstream_h
00024
00025 #include <iostream>
00026 #include <zlib.h>
00027 #include <OW32/auto_buf.h>
00028 #include <OW32/OW32Libs.h>
00029
00030 namespace OW32
00031 {
00032
00033
00034
00035
00036 using std::streambuf;
00037 using std::ostream;
00038 using std::istream;
00039 using std::streamsize;
00040
00041 #ifdef _MSC_VER
00042 #pragma warning(disable: 4251)
00043 #endif
00044
00046 class OW32_LIB_EXPORT zipstrstreambuf : public streambuf
00047 {
00048 public:
00049 void freeze(bool frz = true) const;
00050 char* str() { return (char*)m_storage.str(); }
00051 streamsize pcount() const { return (streamsize)m_flateStream.total_out; }
00052
00053 zipstrstreambuf(const char* in, int length);
00054 zipstrstreambuf();
00055 ~zipstrstreambuf();
00056
00057 protected:
00058 virtual int sync();
00059 virtual streamsize xsgetn(char *s, streamsize n);
00060 virtual int_type underflow();
00061 virtual streamsize xsputn(const char *s, streamsize n);
00062 virtual int_type overflow(int_type c);
00063
00064 private:
00065 enum { CHUNK = 2048 };
00066
00067 int m_flags;
00068 z_stream m_flateStream;
00069 OW32::auto_byte_buf m_storage;
00070
00071 void expandFlateStream();
00072 void Init();
00073 };
00074 #ifdef _MSC_VER
00075 #pragma warning(default: 4251)
00076 #endif
00077
00079 class OW32_LIB_EXPORT ozipstrstream
00080 : public ostream
00081 {
00082 public:
00083 ozipstrstream()
00084 : ostream(&_Mysb), _Mysb()
00085 {
00086 }
00087
00088 ozipstrstream(char *, streamsize,
00089 ios_base::openmode =
00090 ios_base::out);
00091
00092
00093
00094 zipstrstreambuf *rdbuf() const
00095 {
00096 return ((zipstrstreambuf *)&_Mysb);
00097 }
00098
00099 void freeze(bool _Freezeit = true)
00100 {
00101 _Mysb.freeze(_Freezeit);
00102 }
00103
00104 char *str()
00105 {
00106 flush();
00107 return (_Mysb.str());
00108 }
00109
00110 streamsize pcount() const
00111 {
00112 return (_Mysb.pcount());
00113 }
00114
00115 private:
00116 ozipstrstream(const ozipstrstream& );
00117 ozipstrstream& operator=(const ozipstrstream& );
00118
00119 zipstrstreambuf _Mysb;
00120 };
00121
00123 class OW32_LIB_EXPORT izipstrstream
00124 : public istream
00125 {
00126 public:
00127
00128
00129
00130
00131
00132
00133 izipstrstream(const char *_Ptr, streamsize _Count)
00134 : istream(&_Mysb), _Mysb(_Ptr, _Count)
00135 {
00136 }
00137
00138
00139
00140
00141
00142
00143 izipstrstream(char *_Ptr, int _Count)
00144 : istream(&_Mysb), _Mysb((const char *)_Ptr, _Count)
00145 {
00146 }
00147
00148
00149
00150 zipstrstreambuf *rdbuf() const
00151 {
00152 return ((zipstrstreambuf *)&_Mysb);
00153 }
00154
00155 char *str()
00156 {
00157 return (_Mysb.str());
00158 }
00159
00160 private:
00161 izipstrstream(const izipstrstream& );
00162 izipstrstream& operator=(const izipstrstream& );
00163
00164 zipstrstreambuf _Mysb;
00165 };
00166
00167 };
00168
00169 #endif // OW32_zipstrstream_h