1 // Compress/CopyCoder.cpp 2 3 #include "StdAfx.h" 4 5 #include "../../../C/Alloc.h" 6 7 #include "../Common/StreamUtils.h" 8 9 #include "CopyCoder.h" 10 11 namespace NCompress { 12 13 static const UInt32 kBufferSize = 1 << 17; 14 15 CCopyCoder::~CCopyCoder() 16 { 17 ::MidFree(_buffer); 18 } 19 20 STDMETHODIMP CCopyCoder::Code(ISequentialInStream *inStream, 21 ISequentialOutStream *outStream, 22 const UInt64 * /* inSize */, const UInt64 *outSize, 23 ICompressProgressInfo *progress) 24 { 25 if (_buffer == 0) 26 { 27 _buffer = (Byte *)::MidAlloc(kBufferSize); 28 if (_buffer == 0) 29 return E_OUTOFMEMORY; 30 } 31 32 TotalSize = 0; 33 for (;;) 34 { 35 UInt32 size = kBufferSize; 36 if (outSize != 0) 37 if (size > *outSize - TotalSize) 38 size = (UInt32)(*outSize - TotalSize); 39 RINOK(inStream->Read(_buffer, size, &size)); 40 if (size == 0) 41 break; 42 if (outStream) 43 { 44 RINOK(WriteStream(outStream, _buffer, size)); 45 } 46 TotalSize += size; 47 if (progress != NULL) 48 { 49 RINOK(progress->SetRatioInfo(&TotalSize, &TotalSize)); 50 } 51 } 52 return S_OK; 53 } 54 55 STDMETHODIMP CCopyCoder::GetInStreamProcessedSize(UInt64 *value) 56 { 57 *value = TotalSize; 58 return S_OK; 59 } 60 61 HRESULT CopyStream(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress) 62 { 63 CMyComPtr<ICompressCoder> copyCoder = new NCompress::CCopyCoder; 64 return copyCoder->Code(inStream, outStream, NULL, NULL, progress); 65 } 66 67 } 68