#ifdef WITH_ZLIB
#include <zlib.h>
#endif
+#include <msp/core/except.h>
#include "zlibcompressed.h"
using namespace std;
namespace Msp {
namespace IO {
-zlib_error::zlib_error(const std::string &w, int c):
+zlib_error::zlib_error(const string &w, int c):
#ifdef WITH_ZLIB
runtime_error(w+": "+zError(c)),
#else
runtime_error(w),
#endif
- code_(c)
+ m_code(c)
{ }
ZlibCompressed::Private::Private()
{
#ifdef WITH_ZLIB
- stream.zalloc = 0;
- stream.zfree = 0;
- stream.opaque = 0;
+ stream.zalloc = nullptr;
+ stream.zfree = nullptr;
+ stream.opaque = nullptr;
#endif
}
-ZlibCompressed::ZlibCompressed(Base &b, unsigned level):
- below(b),
- buffer_size(1024),
- in_buffer(0),
- out_buffer(0),
- stream_end(false),
- priv(0)
+ZlibCompressed::ZlibCompressed(Base &b, Mode m, unsigned level):
+ below(b)
{
-#ifdef WITH_ZLIB
- mode = below.get_mode()&M_RDWR;
+ mode = m&below.get_mode()&M_RDWR;
if(mode!=M_READ && mode!=M_WRITE)
- throw invalid_access(mode);
+ throw invalid_access(m);
+#ifdef WITH_ZLIB
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);
+ throw unsupported("ZlibCompressed");
#endif
}
delete priv;
}
+void ZlibCompressed::set_block(bool)
+{
+ throw unsupported("ZlibCompressed::set_block");
+}
+
+void ZlibCompressed::set_inherit(bool)
+{
+ throw unsupported("ZlibCompressed::set_inherit");
+}
+
void ZlibCompressed::flush()
{
#ifdef WITH_ZLIB
#endif
}
-unsigned ZlibCompressed::do_write(const char *data, unsigned size)
+size_t ZlibCompressed::do_write(const char *data, size_t size)
{
check_access(M_WRITE);
- unsigned processed = 0;
+ size_t processed = 0;
#ifdef WITH_ZLIB
while(processed<size)
{
- unsigned free_in = (in_buffer+buffer_size-priv->stream.next_in);
+ size_t free_in = (in_buffer+buffer_size-priv->stream.next_in);
if(free_in<size && priv->stream.next_in>in_buffer)
{
// Not all of the data fits in the buffer, so make some more room
if(free_in)
{
// Copy as much data into the input buffer as possible
- unsigned len = min(free_in, size-processed);
+ size_t len = min(free_in, size-processed);
copy(data+processed, data+processed+len, priv->stream.next_in+priv->stream.avail_in);
priv->stream.avail_in += len;
processed += len;
}
// Write compressed data into the underlying object
- unsigned len = 0;
+ size_t len = 0;
if(priv->stream.next_out>out_buffer)
len = below.write(reinterpret_cast<char *>(out_buffer), priv->stream.next_out-out_buffer);
if(len>0)
{
- if(len<static_cast<unsigned>(priv->stream.next_out-out_buffer))
+ if(len<static_cast<size_t>(priv->stream.next_out-out_buffer))
copy(out_buffer+len, priv->stream.next_out, out_buffer);
priv->stream.avail_out += len;
priv->stream.next_out -= len;
#endif
}
-unsigned ZlibCompressed::do_read(char *data, unsigned size)
+size_t ZlibCompressed::do_read(char *data, size_t size)
{
check_access(M_READ);
- unsigned processed = 0;
+ size_t processed = 0;
#ifdef WITH_ZLIB
while(processed<size)
{
if(priv->stream.next_out>out_buffer)
{
// We have some pending output, give it out first
- unsigned len = min<unsigned>(priv->stream.next_out-out_buffer, size-processed);
+ size_t len = min<size_t>(priv->stream.next_out-out_buffer, size-processed);
copy(out_buffer, out_buffer+len, data+processed);
processed += len;
- if(len<static_cast<unsigned>(priv->stream.next_out-out_buffer))
+ if(len<static_cast<size_t>(priv->stream.next_out-out_buffer))
copy(out_buffer+len, priv->stream.next_out, out_buffer);
priv->stream.next_out -= len;
priv->stream.avail_out += len;
copy(priv->stream.next_in, priv->stream.next_in+priv->stream.avail_in, in_buffer);
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);
+ size_t 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())
stream_end = true;
return processed;
}
+const Handle &ZlibCompressed::get_handle(Mode)
+{
+ throw unsupported("ZlibCompressed::get_handle");
+}
+
} // namespace IO
} // namespace Msp