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