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 
~CCopyCoder()15 CCopyCoder::~CCopyCoder()
16 {
17   ::MidFree(_buffer);
18 }
19 
Code(ISequentialInStream * inStream,ISequentialOutStream * outStream,const UInt64 *,const UInt64 * outSize,ICompressProgressInfo * progress)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 
GetInStreamProcessedSize(UInt64 * value)55 STDMETHODIMP CCopyCoder::GetInStreamProcessedSize(UInt64 *value)
56 {
57   *value = TotalSize;
58   return S_OK;
59 }
60 
CopyStream(ISequentialInStream * inStream,ISequentialOutStream * outStream,ICompressProgressInfo * progress)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