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)
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
{
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);
if(need_more_input)
{
- if(eof_flag)
+ if(stream_end)
break;
if(priv->stream.next_in>in_buffer)
unsigned len = below.read(reinterpret_cast<char *>(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;