xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Nsis/NsisDecode.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // NsisDecode.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_NSIS_DECODE_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_NSIS_DECODE_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/FilterCoder.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/StreamUtils.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "../../Compress/BZip2Decoder.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../Compress/DeflateDecoder.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "../../Compress/LzmaDecoder.h"
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
16*f6dc9357SAndroid Build Coastguard Worker namespace NNsis {
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker namespace NMethodType
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker   enum EEnum
21*f6dc9357SAndroid Build Coastguard Worker   {
22*f6dc9357SAndroid Build Coastguard Worker     kCopy,
23*f6dc9357SAndroid Build Coastguard Worker     kDeflate,
24*f6dc9357SAndroid Build Coastguard Worker     kBZip2,
25*f6dc9357SAndroid Build Coastguard Worker     kLZMA
26*f6dc9357SAndroid Build Coastguard Worker   };
27*f6dc9357SAndroid Build Coastguard Worker }
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker /* 7-Zip installers 4.38 - 9.08 used modified version of NSIS that
30*f6dc9357SAndroid Build Coastguard Worker    supported BCJ filter for better compression ratio.
31*f6dc9357SAndroid Build Coastguard Worker    We support such modified NSIS archives. */
32*f6dc9357SAndroid Build Coastguard Worker 
33*f6dc9357SAndroid Build Coastguard Worker class CDecoder
34*f6dc9357SAndroid Build Coastguard Worker {
35*f6dc9357SAndroid Build Coastguard Worker   NMethodType::EEnum _curMethod; // method of created decoder
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker   CFilterCoder *_filter;
38*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISequentialInStream> _filterInStream;
39*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISequentialInStream> _codecInStream;
40*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISequentialInStream> _decoderInStream;
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker   NCompress::NBZip2::CNsisDecoder *_bzDecoder;
43*f6dc9357SAndroid Build Coastguard Worker   NCompress::NDeflate::NDecoder::CCOMCoder *_deflateDecoder;
44*f6dc9357SAndroid Build Coastguard Worker   NCompress::NLzma::CDecoder *_lzmaDecoder;
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker public:
47*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInStream> InputStream; // for non-solid
48*f6dc9357SAndroid Build Coastguard Worker   UInt64 StreamPos; // the pos in unpacked for solid, the pos in Packed for non-solid
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker   NMethodType::EEnum Method;
51*f6dc9357SAndroid Build Coastguard Worker   bool FilterFlag;
52*f6dc9357SAndroid Build Coastguard Worker   bool Solid;
53*f6dc9357SAndroid Build Coastguard Worker   bool IsNsisDeflate;
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer Buffer; // temp buf
56*f6dc9357SAndroid Build Coastguard Worker 
CDecoder()57*f6dc9357SAndroid Build Coastguard Worker   CDecoder():
58*f6dc9357SAndroid Build Coastguard Worker       FilterFlag(false),
59*f6dc9357SAndroid Build Coastguard Worker       Solid(true),
60*f6dc9357SAndroid Build Coastguard Worker       IsNsisDeflate(true)
61*f6dc9357SAndroid Build Coastguard Worker   {
62*f6dc9357SAndroid Build Coastguard Worker     _bzDecoder = NULL;
63*f6dc9357SAndroid Build Coastguard Worker     _deflateDecoder = NULL;
64*f6dc9357SAndroid Build Coastguard Worker     _lzmaDecoder = NULL;
65*f6dc9357SAndroid Build Coastguard Worker   }
66*f6dc9357SAndroid Build Coastguard Worker 
Release()67*f6dc9357SAndroid Build Coastguard Worker   void Release()
68*f6dc9357SAndroid Build Coastguard Worker   {
69*f6dc9357SAndroid Build Coastguard Worker     _filterInStream.Release();
70*f6dc9357SAndroid Build Coastguard Worker     _codecInStream.Release();
71*f6dc9357SAndroid Build Coastguard Worker     _decoderInStream.Release();
72*f6dc9357SAndroid Build Coastguard Worker     InputStream.Release();
73*f6dc9357SAndroid Build Coastguard Worker 
74*f6dc9357SAndroid Build Coastguard Worker     _bzDecoder = NULL;
75*f6dc9357SAndroid Build Coastguard Worker     _deflateDecoder = NULL;
76*f6dc9357SAndroid Build Coastguard Worker     _lzmaDecoder = NULL;
77*f6dc9357SAndroid Build Coastguard Worker   }
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetInputProcessedSize() const;
80*f6dc9357SAndroid Build Coastguard Worker 
81*f6dc9357SAndroid Build Coastguard Worker   HRESULT Init(ISequentialInStream *inStream, bool &useFilter);
82*f6dc9357SAndroid Build Coastguard Worker 
Read(void * data,size_t * processedSize)83*f6dc9357SAndroid Build Coastguard Worker   HRESULT Read(void *data, size_t *processedSize)
84*f6dc9357SAndroid Build Coastguard Worker   {
85*f6dc9357SAndroid Build Coastguard Worker     return ReadStream(_decoderInStream, data, processedSize);
86*f6dc9357SAndroid Build Coastguard Worker   }
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker   HRESULT SetToPos(UInt64 pos, ICompressProgressInfo *progress); // for solid
90*f6dc9357SAndroid Build Coastguard Worker   HRESULT Decode(CByteBuffer *outBuf, bool unpackSizeDefined, UInt32 unpackSize,
91*f6dc9357SAndroid Build Coastguard Worker       ISequentialOutStream *realOutStream, ICompressProgressInfo *progress,
92*f6dc9357SAndroid Build Coastguard Worker       UInt32 &packSizeRes, UInt32 &unpackSizeRes);
93*f6dc9357SAndroid Build Coastguard Worker };
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker }}
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker #endif
98