Mercurial > vba-linux
annotate src/win32/7zip/7z/CPP/7zip/Compress/CopyCoder.cpp @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
rev | line source |
---|---|
rlm@1 | 1 // Compress/CopyCoder.cpp |
rlm@1 | 2 |
rlm@1 | 3 #include "StdAfx.h" |
rlm@1 | 4 |
rlm@1 | 5 extern "C" |
rlm@1 | 6 { |
rlm@1 | 7 #include "../../../C/Alloc.h" |
rlm@1 | 8 } |
rlm@1 | 9 |
rlm@1 | 10 #include "../Common/StreamUtils.h" |
rlm@1 | 11 |
rlm@1 | 12 #include "CopyCoder.h" |
rlm@1 | 13 |
rlm@1 | 14 namespace NCompress { |
rlm@1 | 15 |
rlm@1 | 16 static const UInt32 kBufferSize = 1 << 17; |
rlm@1 | 17 |
rlm@1 | 18 CCopyCoder::~CCopyCoder() |
rlm@1 | 19 { |
rlm@1 | 20 ::MidFree(_buffer); |
rlm@1 | 21 } |
rlm@1 | 22 |
rlm@1 | 23 STDMETHODIMP CCopyCoder::Code(ISequentialInStream *inStream, |
rlm@1 | 24 ISequentialOutStream *outStream, |
rlm@1 | 25 const UInt64 * /* inSize */, const UInt64 *outSize, |
rlm@1 | 26 ICompressProgressInfo *progress) |
rlm@1 | 27 { |
rlm@1 | 28 if (_buffer == 0) |
rlm@1 | 29 { |
rlm@1 | 30 _buffer = (Byte *)::MidAlloc(kBufferSize); |
rlm@1 | 31 if (_buffer == 0) |
rlm@1 | 32 return E_OUTOFMEMORY; |
rlm@1 | 33 } |
rlm@1 | 34 |
rlm@1 | 35 TotalSize = 0; |
rlm@1 | 36 for (;;) |
rlm@1 | 37 { |
rlm@1 | 38 UInt32 realProcessedSize; |
rlm@1 | 39 UInt32 size = kBufferSize; |
rlm@1 | 40 if (outSize != 0) |
rlm@1 | 41 if (size > *outSize - TotalSize) |
rlm@1 | 42 size = (UInt32)(*outSize - TotalSize); |
rlm@1 | 43 RINOK(inStream->Read(_buffer, size, &realProcessedSize)); |
rlm@1 | 44 if (realProcessedSize == 0) |
rlm@1 | 45 break; |
rlm@1 | 46 RINOK(WriteStream(outStream, _buffer, realProcessedSize)); |
rlm@1 | 47 TotalSize += realProcessedSize; |
rlm@1 | 48 if (progress != NULL) |
rlm@1 | 49 { |
rlm@1 | 50 RINOK(progress->SetRatioInfo(&TotalSize, &TotalSize)); |
rlm@1 | 51 } |
rlm@1 | 52 } |
rlm@1 | 53 return S_OK; |
rlm@1 | 54 } |
rlm@1 | 55 |
rlm@1 | 56 STDMETHODIMP CCopyCoder::GetInStreamProcessedSize(UInt64 *value) |
rlm@1 | 57 { |
rlm@1 | 58 *value = TotalSize; |
rlm@1 | 59 return S_OK; |
rlm@1 | 60 } |
rlm@1 | 61 |
rlm@1 | 62 } |