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