TZlibTransport::~TZlibTransport() { int rv; rv = inflateEnd(rstream_); checkZlibRvNothrow(rv, rstream_->msg); rv = deflateEnd(wstream_); checkZlibRvNothrow(rv, wstream_->msg); delete[] urbuf_; delete[] crbuf_; delete[] uwbuf_; delete[] cwbuf_; delete rstream_; delete wstream_; }
TZlibTransport::~TZlibTransport() { int rv; rv = inflateEnd(rstream_); checkZlibRvNothrow(rv, rstream_->msg); rv = deflateEnd(wstream_); // Z_DATA_ERROR may be returned if the caller has written data, but not // called flush() to actually finish writing the data out to the underlying // transport. The defined TTransport behavior in this case is that this data // may be discarded, so we ignore the error and silently discard the data. // For other erros, log a message. if (rv != Z_DATA_ERROR) { checkZlibRvNothrow(rv, wstream_->msg); } delete[] urbuf_; delete[] crbuf_; delete[] uwbuf_; delete[] cwbuf_; delete rstream_; delete wstream_; }
// Don't call this outside of the constructor. void TZlibTransport::initZlib() { int rv; bool r_init = false; try { rstream_ = new z_stream; wstream_ = new z_stream; rstream_->zalloc = Z_NULL; wstream_->zalloc = Z_NULL; rstream_->zfree = Z_NULL; wstream_->zfree = Z_NULL; rstream_->opaque = Z_NULL; wstream_->opaque = Z_NULL; rstream_->next_in = crbuf_; wstream_->next_in = uwbuf_; rstream_->next_out = urbuf_; wstream_->next_out = cwbuf_; rstream_->avail_in = 0; wstream_->avail_in = 0; rstream_->avail_out = urbuf_size_; wstream_->avail_out = cwbuf_size_; rv = inflateInit(rstream_); checkZlibRv(rv, rstream_->msg); // Have to set this flag so we know whether to de-initialize. r_init = true; rv = deflateInit(wstream_, Z_DEFAULT_COMPRESSION); checkZlibRv(rv, wstream_->msg); } catch (...) { if (r_init) { rv = inflateEnd(rstream_); checkZlibRvNothrow(rv, rstream_->msg); } // There is no way we can get here if wstream_ was initialized. throw; } }