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