xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/ZlibEncoder.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // ZlibEncoder.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../Common/StreamUtils.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "ZlibEncoder.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker namespace NCompress {
10*f6dc9357SAndroid Build Coastguard Worker namespace NZlib {
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #define DEFLATE_TRY_BEGIN try {
13*f6dc9357SAndroid Build Coastguard Worker #define DEFLATE_TRY_END } catch(...) { return S_FALSE; }
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker UInt32 Adler32_Update(UInt32 adler, const Byte *buf, size_t size);
16*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CInStreamWithAdler::Read (void * data,UInt32 size,UInt32 * processedSize))17*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CInStreamWithAdler::Read(void *data, UInt32 size, UInt32 *processedSize))
18*f6dc9357SAndroid Build Coastguard Worker {
19*f6dc9357SAndroid Build Coastguard Worker   const HRESULT result = _stream->Read(data, size, &size);
20*f6dc9357SAndroid Build Coastguard Worker   _adler = Adler32_Update(_adler, (const Byte *)data, size);
21*f6dc9357SAndroid Build Coastguard Worker   _size += size;
22*f6dc9357SAndroid Build Coastguard Worker   if (processedSize)
23*f6dc9357SAndroid Build Coastguard Worker     *processedSize = size;
24*f6dc9357SAndroid Build Coastguard Worker   return result;
25*f6dc9357SAndroid Build Coastguard Worker }
26*f6dc9357SAndroid Build Coastguard Worker 
Create()27*f6dc9357SAndroid Build Coastguard Worker void CEncoder::Create()
28*f6dc9357SAndroid Build Coastguard Worker {
29*f6dc9357SAndroid Build Coastguard Worker   if (!DeflateEncoder)
30*f6dc9357SAndroid Build Coastguard Worker     DeflateEncoder = DeflateEncoderSpec = new NDeflate::NEncoder::CCOMCoder;
31*f6dc9357SAndroid Build Coastguard Worker }
32*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CEncoder::Code (ISequentialInStream * inStream,ISequentialOutStream * outStream,const UInt64 * inSize,const UInt64 *,ICompressProgressInfo * progress))33*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
34*f6dc9357SAndroid Build Coastguard Worker     const UInt64 *inSize, const UInt64 * /* outSize */, ICompressProgressInfo *progress))
35*f6dc9357SAndroid Build Coastguard Worker {
36*f6dc9357SAndroid Build Coastguard Worker   DEFLATE_TRY_BEGIN
37*f6dc9357SAndroid Build Coastguard Worker   if (!AdlerStream)
38*f6dc9357SAndroid Build Coastguard Worker     AdlerStream = AdlerSpec = new CInStreamWithAdler;
39*f6dc9357SAndroid Build Coastguard Worker   Create();
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker   {
42*f6dc9357SAndroid Build Coastguard Worker     Byte buf[2] = { 0x78, 0xDA };
43*f6dc9357SAndroid Build Coastguard Worker     RINOK(WriteStream(outStream, buf, 2))
44*f6dc9357SAndroid Build Coastguard Worker   }
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker   AdlerSpec->SetStream(inStream);
47*f6dc9357SAndroid Build Coastguard Worker   AdlerSpec->Init();
48*f6dc9357SAndroid Build Coastguard Worker   const HRESULT res = DeflateEncoder->Code(AdlerStream, outStream, inSize, NULL, progress);
49*f6dc9357SAndroid Build Coastguard Worker   AdlerSpec->ReleaseStream();
50*f6dc9357SAndroid Build Coastguard Worker 
51*f6dc9357SAndroid Build Coastguard Worker   RINOK(res)
52*f6dc9357SAndroid Build Coastguard Worker 
53*f6dc9357SAndroid Build Coastguard Worker   {
54*f6dc9357SAndroid Build Coastguard Worker     const UInt32 a = AdlerSpec->GetAdler();
55*f6dc9357SAndroid Build Coastguard Worker     const Byte buf[4] = { (Byte)(a >> 24), (Byte)(a >> 16), (Byte)(a >> 8), (Byte)(a) };
56*f6dc9357SAndroid Build Coastguard Worker     return WriteStream(outStream, buf, 4);
57*f6dc9357SAndroid Build Coastguard Worker   }
58*f6dc9357SAndroid Build Coastguard Worker   DEFLATE_TRY_END
59*f6dc9357SAndroid Build Coastguard Worker }
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker }}
62