rlm@1: // Compress/CopyCoder.cpp rlm@1: rlm@1: #include "StdAfx.h" rlm@1: rlm@1: extern "C" rlm@1: { rlm@1: #include "../../../C/Alloc.h" rlm@1: } rlm@1: rlm@1: #include "../Common/StreamUtils.h" rlm@1: rlm@1: #include "CopyCoder.h" rlm@1: rlm@1: namespace NCompress { rlm@1: rlm@1: static const UInt32 kBufferSize = 1 << 17; rlm@1: rlm@1: CCopyCoder::~CCopyCoder() rlm@1: { rlm@1: ::MidFree(_buffer); rlm@1: } rlm@1: rlm@1: STDMETHODIMP CCopyCoder::Code(ISequentialInStream *inStream, rlm@1: ISequentialOutStream *outStream, rlm@1: const UInt64 * /* inSize */, const UInt64 *outSize, rlm@1: ICompressProgressInfo *progress) rlm@1: { rlm@1: if (_buffer == 0) rlm@1: { rlm@1: _buffer = (Byte *)::MidAlloc(kBufferSize); rlm@1: if (_buffer == 0) rlm@1: return E_OUTOFMEMORY; rlm@1: } rlm@1: rlm@1: TotalSize = 0; rlm@1: for (;;) rlm@1: { rlm@1: UInt32 realProcessedSize; rlm@1: UInt32 size = kBufferSize; rlm@1: if (outSize != 0) rlm@1: if (size > *outSize - TotalSize) rlm@1: size = (UInt32)(*outSize - TotalSize); rlm@1: RINOK(inStream->Read(_buffer, size, &realProcessedSize)); rlm@1: if (realProcessedSize == 0) rlm@1: break; rlm@1: RINOK(WriteStream(outStream, _buffer, realProcessedSize)); rlm@1: TotalSize += realProcessedSize; rlm@1: if (progress != NULL) rlm@1: { rlm@1: RINOK(progress->SetRatioInfo(&TotalSize, &TotalSize)); rlm@1: } rlm@1: } rlm@1: return S_OK; rlm@1: } rlm@1: rlm@1: STDMETHODIMP CCopyCoder::GetInStreamProcessedSize(UInt64 *value) rlm@1: { rlm@1: *value = TotalSize; rlm@1: return S_OK; rlm@1: } rlm@1: rlm@1: }