view 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
line wrap: on
line source
1 // Compress/CopyCoder.cpp
3 #include "StdAfx.h"
5 extern "C"
6 {
7 #include "../../../C/Alloc.h"
8 }
10 #include "../Common/StreamUtils.h"
12 #include "CopyCoder.h"
14 namespace NCompress {
16 static const UInt32 kBufferSize = 1 << 17;
18 CCopyCoder::~CCopyCoder()
19 {
20 ::MidFree(_buffer);
21 }
23 STDMETHODIMP CCopyCoder::Code(ISequentialInStream *inStream,
24 ISequentialOutStream *outStream,
25 const UInt64 * /* inSize */, const UInt64 *outSize,
26 ICompressProgressInfo *progress)
27 {
28 if (_buffer == 0)
29 {
30 _buffer = (Byte *)::MidAlloc(kBufferSize);
31 if (_buffer == 0)
32 return E_OUTOFMEMORY;
33 }
35 TotalSize = 0;
36 for (;;)
37 {
38 UInt32 realProcessedSize;
39 UInt32 size = kBufferSize;
40 if (outSize != 0)
41 if (size > *outSize - TotalSize)
42 size = (UInt32)(*outSize - TotalSize);
43 RINOK(inStream->Read(_buffer, size, &realProcessedSize));
44 if (realProcessedSize == 0)
45 break;
46 RINOK(WriteStream(outStream, _buffer, realProcessedSize));
47 TotalSize += realProcessedSize;
48 if (progress != NULL)
49 {
50 RINOK(progress->SetRatioInfo(&TotalSize, &TotalSize));
51 }
52 }
53 return S_OK;
54 }
56 STDMETHODIMP CCopyCoder::GetInStreamProcessedSize(UInt64 *value)
57 {
58 *value = TotalSize;
59 return S_OK;
60 }
62 }