void read(const ByteBuffer &byteBuffer, std::size_t bytesRequested) { RCF_ASSERT(byteBuffer.isEmpty())(byteBuffer.getLength()); RCF_ASSERT_LT(mInByteBufferPos, mInByteBuffer.getLength()); std::size_t bytesRemaining = mInByteBuffer.getLength() - mInByteBufferPos; std::size_t bytesToRead = RCF_MIN(bytesRemaining, bytesRequested); ByteBuffer myByteBuffer(mInByteBuffer, mInByteBufferPos, bytesToRead); mInByteBufferPos += bytesToRead; getPreFilter().onReadCompleted(myByteBuffer); }
void ZlibCompressionWriteFilter::compress() { mPostBuffers.resize(0); // TODO: buffer size std::size_t bufferSize = 2*(lengthByteBuffers(mPreBuffers)+7+7); std::size_t leftMargin = mPreBuffers.front().getLeftMargin(); if (mVecPtr.get() == NULL || !mVecPtr.unique()) { mVecPtr.reset( new ReallocBuffer()); } mVecPtr->resize(leftMargin + bufferSize); if (leftMargin > 0) { mPostBuffers.push_back( ByteBuffer( &(*mVecPtr)[0] + leftMargin, mVecPtr->size() - leftMargin, leftMargin, mVecPtr)); } else { mPostBuffers.push_back( ByteBuffer( &(*mVecPtr)[0], mVecPtr->size(), mVecPtr)); } ByteBuffer &outBuffer = mPostBuffers.back(); std::size_t outPos = 0; std::size_t outRemaining = outBuffer.getLength() - outPos; mTotalBytesIn = 0; mTotalBytesOut = 0; for (std::size_t i=0; i<mPreBuffers.size(); ++i) { RCF_ASSERT_LT(outPos , outBuffer.getLength()); ByteBuffer &inBuffer = mPreBuffers[i]; mCstream.next_in = (Bytef*) inBuffer.getPtr(); mCstream.avail_in = static_cast<uInt>(inBuffer.getLength()); mCstream.next_out = (Bytef*) &outBuffer.getPtr()[outPos]; mCstream.avail_out = static_cast<uInt>(outRemaining); mZerr = (i<mPreBuffers.size()-1) ? deflate(&mCstream, Z_NO_FLUSH) : deflate(&mCstream, Z_SYNC_FLUSH); RCF_VERIFY( mZerr == Z_OK || mZerr == Z_BUF_ERROR, FilterException( _RcfError_Zlib(), mZerr, RcfSubsystem_Zlib, "deflate() failed")) (mZerr)(inBuffer.getLength())(outBuffer.getLength()); RCF_ASSERT_GTEQ(mCstream.avail_out , 0); std::size_t bytesIn = inBuffer.getLength() - mCstream.avail_in; std::size_t bytesOut = outRemaining - mCstream.avail_out; mTotalBytesIn += bytesIn; mTotalBytesOut += bytesOut; outPos += bytesOut; outRemaining -= bytesOut; } if (!mStateful) { mCstream.next_in = NULL; mCstream.avail_in = 0; mCstream.next_out = (Bytef*) &outBuffer.getPtr()[outPos]; mCstream.avail_out = static_cast<uInt>(outRemaining); mZerr = deflate(&mCstream, Z_FINISH); RCF_VERIFY( mZerr == Z_BUF_ERROR || mZerr == Z_STREAM_END, FilterException( _RcfError_Zlib(), mZerr, RcfSubsystem_Zlib, "deflate() failed")) (mZerr)(outPos)(outRemaining); RCF_ASSERT_GT(mCstream.avail_out , 0); std::size_t bytesOut = outRemaining - mCstream.avail_out; mTotalBytesOut += bytesOut; outPos += bytesOut; outRemaining -= bytesOut; } mPreBuffers.resize(0); outBuffer = ByteBuffer(outBuffer, 0, mTotalBytesOut); }