void AsioSessionState::beginWrite() { mSlicedWriteByteBuffers.resize(0); sliceByteBuffers( mSlicedWriteByteBuffers, mWriteByteBuffers, lengthByteBuffers(mWriteByteBuffers)-mWriteBufferRemaining); mTransportFilters.empty() ? write(mSlicedWriteByteBuffers) : mTransportFilters.front()->write(mSlicedWriteByteBuffers); }
void ZlibCompressionWriteFilter::write( const std::vector<ByteBuffer> &byteBuffers) { if (mStateful == false || mCompressionStateInited == false) { resetCompressionState(); } sliceByteBuffers(mPreBuffers, byteBuffers, 0, ZlibFilterBandwidthLimit); compress(); mFilter.getPostFilter().write(mPostBuffers); }
void AsioSessionState::invokeAsyncWrite() { RCF2_TRACE("")(this); mSlicedWriteByteBuffers.resize(0); sliceByteBuffers( mSlicedWriteByteBuffers, mWriteByteBuffers, lengthByteBuffers(mWriteByteBuffers)-mWriteBufferRemaining); mTransportFilters.empty() ? write(mSlicedWriteByteBuffers) : mTransportFilters.front()->write(mSlicedWriteByteBuffers); }
bool filterData( const std::vector<ByteBuffer> &unfilteredData, std::vector<ByteBuffer> &filteredData, const std::vector<FilterPtr> &filters) { std::size_t bytesTransferred = 0; std::size_t bytesTransferredTotal = 0; WriteProxy writeProxy; writeProxy.setPreFilter(*filters.back()); filters.back()->setPostFilter(writeProxy); filters.front()->setPreFilter(writeProxy); std::size_t unfilteredDataLen = lengthByteBuffers(unfilteredData); while (bytesTransferredTotal < unfilteredDataLen) { ThreadLocalCached< std::vector<ByteBuffer> > tlcSlicedByteBuffers; std::vector<ByteBuffer> &slicedByteBuffers = tlcSlicedByteBuffers.get(); sliceByteBuffers(slicedByteBuffers, unfilteredData, bytesTransferredTotal); filters.front()->write(slicedByteBuffers); // TODO: error handling bytesTransferred = writeProxy.getBytesTransferred(); bytesTransferredTotal += bytesTransferred; } RCF_ASSERT_EQ(bytesTransferredTotal , unfilteredDataLen); filteredData.resize(0); std::copy( writeProxy.getByteBuffers().begin(), writeProxy.getByteBuffers().end(), std::back_inserter(filteredData)); return bytesTransferredTotal == unfilteredDataLen; }
void ZlibCompressionWriteFilter::onWriteCompleted( std::size_t bytesTransferred) { // 1. if partial buffer was written -> write remaining part of buffer // 2. if whole buffer was written -> check if any more compression or writing is needed // 3. if no more compression or writing needed, notify previous filter of completion RCF_ASSERT_LTEQ(bytesTransferred , lengthByteBuffers(mPostBuffers)); if (bytesTransferred < lengthByteBuffers(mPostBuffers)) { // TODO: optimize std::vector<ByteBuffer> slicedBuffers; sliceByteBuffers(slicedBuffers, mPostBuffers, bytesTransferred); mPostBuffers = slicedBuffers; mFilter.getPostFilter().write(mPostBuffers); } else { mPreBuffers.resize(0); mPostBuffers.resize(0); mFilter.getPreFilter().onWriteCompleted(mTotalBytesIn); } }