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 }