| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- // 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;
- }
- }
|