X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fzlibcompressed.cpp;h=99ae7f81f8845016e73e92d60f13083e7e672ee6;hp=ea5e8030142f5fcfb90b72171b268ed1cdba3b7b;hb=481b844ed7d180ffbf70223075f2fc1ffdb5b444;hpb=8ed14b63ab6249e9fc2a3a691cf8ffbf49166deb diff --git a/source/io/zlibcompressed.cpp b/source/io/zlibcompressed.cpp index ea5e803..99ae7f8 100644 --- a/source/io/zlibcompressed.cpp +++ b/source/io/zlibcompressed.cpp @@ -38,17 +38,32 @@ ZlibCompressed::Private::Private() ZlibCompressed::ZlibCompressed(Base &b, unsigned level): - below(b), - buffer_size(1024), - in_buffer(0), - out_buffer(0), - priv(0) + below(b) { -#ifdef WITH_ZLIB mode = below.get_mode()&M_RDWR; if(mode!=M_READ && mode!=M_WRITE) throw invalid_access(mode); + init(level); +} + +ZlibCompressed::ZlibCompressed(Base &b, Mode m, unsigned level): + below(b) +{ + mode = m&below.get_mode()&M_RDWR; + if(mode!=M_READ && mode!=M_WRITE) + throw invalid_access(m); + + init(level); +} + +void ZlibCompressed::init(unsigned level) +{ +#ifdef WITH_ZLIB + buffer_size = 1024; + in_buffer = 0; + out_buffer = 0; + stream_end = false; priv = new Private; if(mode==M_WRITE) @@ -74,6 +89,8 @@ ZlibCompressed::ZlibCompressed(Base &b, unsigned level): below.signal_flush_required.connect(sigc::mem_fun(this, &ZlibCompressed::flush)); #else + (void)buffer_size; + (void)stream_end; (void)level; throw zlib_error("unsupported", -1); #endif @@ -96,6 +113,11 @@ ZlibCompressed::~ZlibCompressed() delete priv; } +void ZlibCompressed::set_block(bool) +{ + throw logic_error("ZlibCompressed::set_block"); +} + void ZlibCompressed::flush() { #ifdef WITH_ZLIB @@ -219,7 +241,7 @@ unsigned ZlibCompressed::do_read(char *data, unsigned size) { int ret = inflate(&priv->stream, Z_NO_FLUSH); if(ret==Z_STREAM_END) - set_eof(); + stream_end = true; else if(ret!=Z_OK) throw zlib_error("inflate", ret); need_more_input = (priv->stream.next_out==out_buffer); @@ -227,7 +249,7 @@ unsigned ZlibCompressed::do_read(char *data, unsigned size) if(need_more_input) { - if(eof_flag) + if(stream_end) break; if(priv->stream.next_in>in_buffer) @@ -237,9 +259,12 @@ unsigned ZlibCompressed::do_read(char *data, unsigned size) unsigned len = below.read(reinterpret_cast(priv->stream.next_in), in_buffer+buffer_size-priv->stream.next_in); priv->stream.avail_in += len; if(!len && below.eof()) - set_eof(); + stream_end = true; } } + + if(size>0 && processed==0 && stream_end) + set_eof(); #else (void)data; (void)size; @@ -248,5 +273,10 @@ unsigned ZlibCompressed::do_read(char *data, unsigned size) return processed; } +const Handle &ZlibCompressed::get_handle(Mode) +{ + throw logic_error("ZlibCompressed::get_handle"); +} + } // namespace IO } // namespace Msp