xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Nsis/NsisIn.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // NsisIn.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_NSIS_IN_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_NSIS_IN_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/CpuArch.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/DynLimBuf.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/UTFConvert.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/StreamUtils.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #include "NsisDecode.h"
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker /* If NSIS_SCRIPT is defined, it will decompile NSIS script to [NSIS].nsi file.
19*f6dc9357SAndroid Build Coastguard Worker    The code is much larger in that case. */
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker // #define NSIS_SCRIPT
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
24*f6dc9357SAndroid Build Coastguard Worker namespace NNsis {
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker const size_t kScriptSizeLimit = 1 << 27;
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker const unsigned kSignatureSize = 16;
29*f6dc9357SAndroid Build Coastguard Worker extern const Byte kSignature[kSignatureSize];
30*f6dc9357SAndroid Build Coastguard Worker #define NSIS_SIGNATURE { 0xEF, 0xBE, 0xAD, 0xDE, 'N', 'u', 'l', 'l', 's', 'o', 'f', 't', 'I', 'n', 's', 't' }
31*f6dc9357SAndroid Build Coastguard Worker 
32*f6dc9357SAndroid Build Coastguard Worker const UInt32 kFlagsMask = 0xF;
33*f6dc9357SAndroid Build Coastguard Worker namespace NFlags
34*f6dc9357SAndroid Build Coastguard Worker {
35*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kUninstall = 1;
36*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kSilent = 2;
37*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kNoCrc = 4;
38*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kForceCrc = 8;
39*f6dc9357SAndroid Build Coastguard Worker   // NSISBI fork flags:
40*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_BI_LongOffset = 16;
41*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_BI_ExternalFileSupport = 32;
42*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_BI_ExternalFile = 64;
43*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_BI_IsStubInstaller = 128;
44*f6dc9357SAndroid Build Coastguard Worker }
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker struct CFirstHeader
47*f6dc9357SAndroid Build Coastguard Worker {
48*f6dc9357SAndroid Build Coastguard Worker   UInt32 Flags;
49*f6dc9357SAndroid Build Coastguard Worker   UInt32 HeaderSize;
50*f6dc9357SAndroid Build Coastguard Worker   UInt32 ArcSize;
51*f6dc9357SAndroid Build Coastguard Worker 
ThereIsCrcCFirstHeader52*f6dc9357SAndroid Build Coastguard Worker   bool ThereIsCrc() const
53*f6dc9357SAndroid Build Coastguard Worker   {
54*f6dc9357SAndroid Build Coastguard Worker     return
55*f6dc9357SAndroid Build Coastguard Worker         (Flags & NFlags::kForceCrc) != 0 ||
56*f6dc9357SAndroid Build Coastguard Worker         (Flags & NFlags::kNoCrc) == 0;
57*f6dc9357SAndroid Build Coastguard Worker   }
58*f6dc9357SAndroid Build Coastguard Worker 
GetDataSizeCFirstHeader59*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetDataSize() const { return ArcSize - (ThereIsCrc() ? 4 : 0); }
60*f6dc9357SAndroid Build Coastguard Worker };
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker struct CBlockHeader
64*f6dc9357SAndroid Build Coastguard Worker {
65*f6dc9357SAndroid Build Coastguard Worker   UInt32 Offset;
66*f6dc9357SAndroid Build Coastguard Worker   UInt32 Num;
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *p, unsigned bhoSize);
69*f6dc9357SAndroid Build Coastguard Worker };
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker struct CItem
72*f6dc9357SAndroid Build Coastguard Worker {
73*f6dc9357SAndroid Build Coastguard Worker   bool IsEmptyFile;
74*f6dc9357SAndroid Build Coastguard Worker   bool IsCompressed;
75*f6dc9357SAndroid Build Coastguard Worker   bool Size_Defined;
76*f6dc9357SAndroid Build Coastguard Worker   bool CompressedSize_Defined;
77*f6dc9357SAndroid Build Coastguard Worker   bool EstimatedSize_Defined;
78*f6dc9357SAndroid Build Coastguard Worker   bool Attrib_Defined;
79*f6dc9357SAndroid Build Coastguard Worker   bool IsUninstaller;
80*f6dc9357SAndroid Build Coastguard Worker   // bool UseFilter;
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker   UInt32 Attrib;
83*f6dc9357SAndroid Build Coastguard Worker   UInt32 Pos;       // = 0, if (IsEmptyFile == true)
84*f6dc9357SAndroid Build Coastguard Worker   UInt32 Size;
85*f6dc9357SAndroid Build Coastguard Worker   UInt32 CompressedSize;
86*f6dc9357SAndroid Build Coastguard Worker   UInt32 EstimatedSize;
87*f6dc9357SAndroid Build Coastguard Worker   UInt32 DictionarySize;
88*f6dc9357SAndroid Build Coastguard Worker   UInt32 PatchSize; // for Uninstaller.exe
89*f6dc9357SAndroid Build Coastguard Worker   int Prefix; // - 1 means no prefix
90*f6dc9357SAndroid Build Coastguard Worker 
91*f6dc9357SAndroid Build Coastguard Worker   FILETIME MTime;
92*f6dc9357SAndroid Build Coastguard Worker   AString NameA;
93*f6dc9357SAndroid Build Coastguard Worker   UString NameU;
94*f6dc9357SAndroid Build Coastguard Worker 
Is_PatchedUninstallerCItem95*f6dc9357SAndroid Build Coastguard Worker   bool Is_PatchedUninstaller() const { return PatchSize != 0; }
96*f6dc9357SAndroid Build Coastguard Worker 
CItemCItem97*f6dc9357SAndroid Build Coastguard Worker   CItem():
98*f6dc9357SAndroid Build Coastguard Worker       IsEmptyFile(false),
99*f6dc9357SAndroid Build Coastguard Worker       IsCompressed(true),
100*f6dc9357SAndroid Build Coastguard Worker       Size_Defined(false),
101*f6dc9357SAndroid Build Coastguard Worker       CompressedSize_Defined(false),
102*f6dc9357SAndroid Build Coastguard Worker       EstimatedSize_Defined(false),
103*f6dc9357SAndroid Build Coastguard Worker       Attrib_Defined(false),
104*f6dc9357SAndroid Build Coastguard Worker       IsUninstaller(false),
105*f6dc9357SAndroid Build Coastguard Worker       // UseFilter(false),
106*f6dc9357SAndroid Build Coastguard Worker       Attrib(0),
107*f6dc9357SAndroid Build Coastguard Worker       Pos(0),
108*f6dc9357SAndroid Build Coastguard Worker       Size(0),
109*f6dc9357SAndroid Build Coastguard Worker       CompressedSize(0),
110*f6dc9357SAndroid Build Coastguard Worker       EstimatedSize(0),
111*f6dc9357SAndroid Build Coastguard Worker       DictionarySize(1),
112*f6dc9357SAndroid Build Coastguard Worker       PatchSize(0),
113*f6dc9357SAndroid Build Coastguard Worker       Prefix(-1)
114*f6dc9357SAndroid Build Coastguard Worker   {
115*f6dc9357SAndroid Build Coastguard Worker     MTime.dwLowDateTime = 0;
116*f6dc9357SAndroid Build Coastguard Worker     MTime.dwHighDateTime = 0;
117*f6dc9357SAndroid Build Coastguard Worker   }
118*f6dc9357SAndroid Build Coastguard Worker 
119*f6dc9357SAndroid Build Coastguard Worker   /*
120*f6dc9357SAndroid Build Coastguard Worker   bool IsINSTDIR() const
121*f6dc9357SAndroid Build Coastguard Worker   {
122*f6dc9357SAndroid Build Coastguard Worker     return (PrefixA.Len() >= 3 || PrefixU.Len() >= 3);
123*f6dc9357SAndroid Build Coastguard Worker   }
124*f6dc9357SAndroid Build Coastguard Worker   */
125*f6dc9357SAndroid Build Coastguard Worker };
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker enum ENsisType
128*f6dc9357SAndroid Build Coastguard Worker {
129*f6dc9357SAndroid Build Coastguard Worker   k_NsisType_Nsis2,
130*f6dc9357SAndroid Build Coastguard Worker   k_NsisType_Nsis3,
131*f6dc9357SAndroid Build Coastguard Worker   k_NsisType_Park1, // Park 2.46.1-
132*f6dc9357SAndroid Build Coastguard Worker   k_NsisType_Park2, // Park 2.46.2  : GetFontVersion
133*f6dc9357SAndroid Build Coastguard Worker   k_NsisType_Park3  // Park 2.46.3+ : GetFontName
134*f6dc9357SAndroid Build Coastguard Worker };
135*f6dc9357SAndroid Build Coastguard Worker 
136*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
137*f6dc9357SAndroid Build Coastguard Worker 
138*f6dc9357SAndroid Build Coastguard Worker struct CSection
139*f6dc9357SAndroid Build Coastguard Worker {
140*f6dc9357SAndroid Build Coastguard Worker   UInt32 InstallTypes; // bits set for each of the different install_types, if any.
141*f6dc9357SAndroid Build Coastguard Worker   UInt32 Flags; // SF_* - defined above
142*f6dc9357SAndroid Build Coastguard Worker   UInt32 StartCmdIndex; // code;
143*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumCommands; // code_size;
144*f6dc9357SAndroid Build Coastguard Worker   UInt32 SizeKB;
145*f6dc9357SAndroid Build Coastguard Worker   UInt32 Name;
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *data);
148*f6dc9357SAndroid Build Coastguard Worker };
149*f6dc9357SAndroid Build Coastguard Worker 
150*f6dc9357SAndroid Build Coastguard Worker struct CLicenseFile
151*f6dc9357SAndroid Build Coastguard Worker {
152*f6dc9357SAndroid Build Coastguard Worker   UInt32 Offset;
153*f6dc9357SAndroid Build Coastguard Worker   UInt32 Size;
154*f6dc9357SAndroid Build Coastguard Worker   AString Name;
155*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer Text;
156*f6dc9357SAndroid Build Coastguard Worker };
157*f6dc9357SAndroid Build Coastguard Worker 
158*f6dc9357SAndroid Build Coastguard Worker #endif
159*f6dc9357SAndroid Build Coastguard Worker 
160*f6dc9357SAndroid Build Coastguard Worker class CInArchive
161*f6dc9357SAndroid Build Coastguard Worker {
162*f6dc9357SAndroid Build Coastguard Worker public:
163*f6dc9357SAndroid Build Coastguard Worker   #ifdef NSIS_SCRIPT
164*f6dc9357SAndroid Build Coastguard Worker   CDynLimBuf Script;
165*f6dc9357SAndroid Build Coastguard Worker   #endif
166*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer _data;
167*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CItem> Items;
168*f6dc9357SAndroid Build Coastguard Worker   bool IsUnicode;
169*f6dc9357SAndroid Build Coastguard Worker   bool Is64Bit;
170*f6dc9357SAndroid Build Coastguard Worker private:
171*f6dc9357SAndroid Build Coastguard Worker   UInt32 _stringsPos;     // relative to _data
172*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumStringChars;
173*f6dc9357SAndroid Build Coastguard Worker   size_t _size;           // it's Header Size
174*f6dc9357SAndroid Build Coastguard Worker 
175*f6dc9357SAndroid Build Coastguard Worker   AString Raw_AString;
176*f6dc9357SAndroid Build Coastguard Worker   UString Raw_UString;
177*f6dc9357SAndroid Build Coastguard Worker 
178*f6dc9357SAndroid Build Coastguard Worker   ENsisType NsisType;
179*f6dc9357SAndroid Build Coastguard Worker   bool IsNsis200; // NSIS 2.03 and before
180*f6dc9357SAndroid Build Coastguard Worker   bool IsNsis225; // NSIS 2.25 and before
181*f6dc9357SAndroid Build Coastguard Worker   bool LogCmdIsEnabled;
182*f6dc9357SAndroid Build Coastguard Worker   int BadCmd; // -1: no bad command; in another cases lowest bad command id
183*f6dc9357SAndroid Build Coastguard Worker 
IsPark()184*f6dc9357SAndroid Build Coastguard Worker   bool IsPark() const { return NsisType >= k_NsisType_Park1; }
IsNsis3_OrHigher()185*f6dc9357SAndroid Build Coastguard Worker   bool IsNsis3_OrHigher() const { return NsisType == k_NsisType_Nsis3; }
186*f6dc9357SAndroid Build Coastguard Worker 
187*f6dc9357SAndroid Build Coastguard Worker   UInt64 _fileSize;
188*f6dc9357SAndroid Build Coastguard Worker 
189*f6dc9357SAndroid Build Coastguard Worker   bool _headerIsCompressed;
190*f6dc9357SAndroid Build Coastguard Worker   UInt32 _nonSolidStartOffset;
191*f6dc9357SAndroid Build Coastguard Worker 
192*f6dc9357SAndroid Build Coastguard Worker   #ifdef NSIS_SCRIPT
193*f6dc9357SAndroid Build Coastguard Worker 
194*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer strUsed;
195*f6dc9357SAndroid Build Coastguard Worker 
196*f6dc9357SAndroid Build Coastguard Worker   CBlockHeader bhPages;
197*f6dc9357SAndroid Build Coastguard Worker   CBlockHeader bhSections;
198*f6dc9357SAndroid Build Coastguard Worker   CBlockHeader bhCtlColors;
199*f6dc9357SAndroid Build Coastguard Worker   CBlockHeader bhData;
200*f6dc9357SAndroid Build Coastguard Worker   UInt32 AfterHeaderSize;
201*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer _afterHeader;
202*f6dc9357SAndroid Build Coastguard Worker 
203*f6dc9357SAndroid Build Coastguard Worker   UInt32 SectionSize;
204*f6dc9357SAndroid Build Coastguard Worker   const Byte *_mainLang;
205*f6dc9357SAndroid Build Coastguard Worker   UInt32 _numLangStrings;
206*f6dc9357SAndroid Build Coastguard Worker   AString LangComment;
207*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt32> langStrIDs;
208*f6dc9357SAndroid Build Coastguard Worker   UInt32 numOnFunc;
209*f6dc9357SAndroid Build Coastguard Worker   UInt32 onFuncOffset;
210*f6dc9357SAndroid Build Coastguard Worker   // CRecordVector<UInt32> OnFuncs;
211*f6dc9357SAndroid Build Coastguard Worker   unsigned _numRootLicenses;
212*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt32> noParseStringIndexes;
213*f6dc9357SAndroid Build Coastguard Worker   AString _tempString_for_GetVar;
214*f6dc9357SAndroid Build Coastguard Worker   AString _tempString_for_AddFuncName;
215*f6dc9357SAndroid Build Coastguard Worker   AString _tempString;
216*f6dc9357SAndroid Build Coastguard Worker 
217*f6dc9357SAndroid Build Coastguard Worker   #endif
218*f6dc9357SAndroid Build Coastguard Worker 
219*f6dc9357SAndroid Build Coastguard Worker 
220*f6dc9357SAndroid Build Coastguard Worker public:
221*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInStream> _stream; // it's limited stream that contains only NSIS archive
222*f6dc9357SAndroid Build Coastguard Worker   UInt64 StartOffset;           // offset in original stream.
223*f6dc9357SAndroid Build Coastguard Worker   UInt64 DataStreamOffset;      // = sizeof(FirstHeader) = offset of Header in _stream
224*f6dc9357SAndroid Build Coastguard Worker 
225*f6dc9357SAndroid Build Coastguard Worker   bool IsArc;
226*f6dc9357SAndroid Build Coastguard Worker 
227*f6dc9357SAndroid Build Coastguard Worker   CDecoder Decoder;
228*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer ExeStub;
229*f6dc9357SAndroid Build Coastguard Worker   CFirstHeader FirstHeader;
230*f6dc9357SAndroid Build Coastguard Worker   NMethodType::EEnum Method;
231*f6dc9357SAndroid Build Coastguard Worker   UInt32 DictionarySize;
232*f6dc9357SAndroid Build Coastguard Worker   bool IsSolid;
233*f6dc9357SAndroid Build Coastguard Worker   bool UseFilter;
234*f6dc9357SAndroid Build Coastguard Worker   bool FilterFlag;
235*f6dc9357SAndroid Build Coastguard Worker 
236*f6dc9357SAndroid Build Coastguard Worker   bool IsInstaller;
237*f6dc9357SAndroid Build Coastguard Worker   AString Name;
238*f6dc9357SAndroid Build Coastguard Worker   AString BrandingText;
239*f6dc9357SAndroid Build Coastguard Worker   UStringVector UPrefixes;
240*f6dc9357SAndroid Build Coastguard Worker   AStringVector APrefixes;
241*f6dc9357SAndroid Build Coastguard Worker 
242*f6dc9357SAndroid Build Coastguard Worker   #ifdef NSIS_SCRIPT
243*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CLicenseFile> LicenseFiles;
244*f6dc9357SAndroid Build Coastguard Worker   #endif
245*f6dc9357SAndroid Build Coastguard Worker 
246*f6dc9357SAndroid Build Coastguard Worker private:
247*f6dc9357SAndroid Build Coastguard Worker   void GetShellString(AString &s, unsigned index1, unsigned index2);
248*f6dc9357SAndroid Build Coastguard Worker   void GetNsisString_Raw(const Byte *s);
249*f6dc9357SAndroid Build Coastguard Worker   void GetNsisString_Unicode_Raw(const Byte *s);
250*f6dc9357SAndroid Build Coastguard Worker   void ReadString2_Raw(UInt32 pos);
251*f6dc9357SAndroid Build Coastguard Worker   bool IsGoodString(UInt32 param) const;
252*f6dc9357SAndroid Build Coastguard Worker   bool AreTwoParamStringsEqual(UInt32 param1, UInt32 param2) const;
253*f6dc9357SAndroid Build Coastguard Worker 
254*f6dc9357SAndroid Build Coastguard Worker   void Add_LangStr(AString &res, UInt32 id);
255*f6dc9357SAndroid Build Coastguard Worker 
256*f6dc9357SAndroid Build Coastguard Worker   #ifdef NSIS_SCRIPT
257*f6dc9357SAndroid Build Coastguard Worker 
258*f6dc9357SAndroid Build Coastguard Worker   void Add_UInt(UInt32 v);
259*f6dc9357SAndroid Build Coastguard Worker   void AddLicense(UInt32 param, Int32 langID);
260*f6dc9357SAndroid Build Coastguard Worker 
261*f6dc9357SAndroid Build Coastguard Worker   void Add_LangStr_Simple(UInt32 id);
262*f6dc9357SAndroid Build Coastguard Worker   void Add_FuncName(const UInt32 *labels, UInt32 index);
263*f6dc9357SAndroid Build Coastguard Worker   void AddParam_Func(const UInt32 *labels, UInt32 index);
264*f6dc9357SAndroid Build Coastguard Worker   void Add_LabelName(UInt32 index);
265*f6dc9357SAndroid Build Coastguard Worker 
266*f6dc9357SAndroid Build Coastguard Worker   void Add_Color2(UInt32 v);
267*f6dc9357SAndroid Build Coastguard Worker   void Add_ColorParam(UInt32 v);
268*f6dc9357SAndroid Build Coastguard Worker   void Add_Color(UInt32 index);
269*f6dc9357SAndroid Build Coastguard Worker 
270*f6dc9357SAndroid Build Coastguard Worker   void Add_ButtonID(UInt32 buttonID);
271*f6dc9357SAndroid Build Coastguard Worker 
272*f6dc9357SAndroid Build Coastguard Worker   void Add_ShowWindow_Cmd(UInt32 cmd);
273*f6dc9357SAndroid Build Coastguard Worker   void Add_TypeFromList(const char * const *table, unsigned tableSize, UInt32 type);
274*f6dc9357SAndroid Build Coastguard Worker   void Add_ExecFlags(UInt32 flagsType);
275*f6dc9357SAndroid Build Coastguard Worker   void Add_SectOp(UInt32 opType);
276*f6dc9357SAndroid Build Coastguard Worker 
277*f6dc9357SAndroid Build Coastguard Worker   void Add_Var(UInt32 index);
278*f6dc9357SAndroid Build Coastguard Worker   void AddParam_Var(UInt32 value);
279*f6dc9357SAndroid Build Coastguard Worker   void AddParam_UInt(UInt32 value);
280*f6dc9357SAndroid Build Coastguard Worker 
281*f6dc9357SAndroid Build Coastguard Worker   void Add_GotoVar(UInt32 param);
282*f6dc9357SAndroid Build Coastguard Worker   void Add_GotoVar1(UInt32 param);
283*f6dc9357SAndroid Build Coastguard Worker   void Add_GotoVars2(const UInt32 *params);
284*f6dc9357SAndroid Build Coastguard Worker 
285*f6dc9357SAndroid Build Coastguard Worker 
286*f6dc9357SAndroid Build Coastguard Worker 
287*f6dc9357SAndroid Build Coastguard Worker   bool PrintSectionBegin(const CSection &sect, unsigned index);
288*f6dc9357SAndroid Build Coastguard Worker   void PrintSectionEnd();
289*f6dc9357SAndroid Build Coastguard Worker 
290*f6dc9357SAndroid Build Coastguard Worker   void GetNsisString(AString &res, const Byte *s);
291*f6dc9357SAndroid Build Coastguard Worker   void GetNsisString_Unicode(AString &res, const Byte *s);
292*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetNumUsedVars() const;
293*f6dc9357SAndroid Build Coastguard Worker   void ReadString2(AString &s, UInt32 pos);
294*f6dc9357SAndroid Build Coastguard Worker 
295*f6dc9357SAndroid Build Coastguard Worker   void MessageBox_MB_Part(UInt32 param);
296*f6dc9357SAndroid Build Coastguard Worker   void AddParam(UInt32 pos);
297*f6dc9357SAndroid Build Coastguard Worker   void AddOptionalParam(UInt32 pos);
298*f6dc9357SAndroid Build Coastguard Worker   void AddParams(const UInt32 *params, unsigned num);
299*f6dc9357SAndroid Build Coastguard Worker   void AddPageOption1(UInt32 param, const char *name);
300*f6dc9357SAndroid Build Coastguard Worker   void AddPageOption(const UInt32 *params, unsigned num, const char *name);
301*f6dc9357SAndroid Build Coastguard Worker   void AddOptionalParams(const UInt32 *params, unsigned num);
302*f6dc9357SAndroid Build Coastguard Worker   void AddRegRoot(UInt32 value);
303*f6dc9357SAndroid Build Coastguard Worker 
304*f6dc9357SAndroid Build Coastguard Worker 
305*f6dc9357SAndroid Build Coastguard Worker   void ClearLangComment();
306*f6dc9357SAndroid Build Coastguard Worker   void Separator();
307*f6dc9357SAndroid Build Coastguard Worker   void Space();
308*f6dc9357SAndroid Build Coastguard Worker   void Tab();
309*f6dc9357SAndroid Build Coastguard Worker   void Tab(bool commented);
310*f6dc9357SAndroid Build Coastguard Worker   void BigSpaceComment();
311*f6dc9357SAndroid Build Coastguard Worker   void SmallSpaceComment();
312*f6dc9357SAndroid Build Coastguard Worker   void AddCommentAndString(const char *s);
313*f6dc9357SAndroid Build Coastguard Worker   void AddError(const char *s);
314*f6dc9357SAndroid Build Coastguard Worker   void AddErrorLF(const char *s);
315*f6dc9357SAndroid Build Coastguard Worker   void CommentOpen();
316*f6dc9357SAndroid Build Coastguard Worker   void CommentClose();
317*f6dc9357SAndroid Build Coastguard Worker   void AddLF();
318*f6dc9357SAndroid Build Coastguard Worker   void AddQuotes();
319*f6dc9357SAndroid Build Coastguard Worker   void TabString(const char *s);
320*f6dc9357SAndroid Build Coastguard Worker   void AddStringLF(const char *s);
321*f6dc9357SAndroid Build Coastguard Worker   void NewLine();
322*f6dc9357SAndroid Build Coastguard Worker   void PrintNumComment(const char *name, UInt32 value);
323*f6dc9357SAndroid Build Coastguard Worker   void Add_QuStr(const AString &s);
324*f6dc9357SAndroid Build Coastguard Worker   void SpaceQuStr(const AString &s);
325*f6dc9357SAndroid Build Coastguard Worker   bool CompareCommands(const Byte *rawCmds, const Byte *sequence, size_t numCommands);
326*f6dc9357SAndroid Build Coastguard Worker 
327*f6dc9357SAndroid Build Coastguard Worker   #endif
328*f6dc9357SAndroid Build Coastguard Worker 
329*f6dc9357SAndroid Build Coastguard Worker   #ifdef NSIS_SCRIPT
330*f6dc9357SAndroid Build Coastguard Worker   unsigned GetNumSupportedCommands() const;
331*f6dc9357SAndroid Build Coastguard Worker   #endif
332*f6dc9357SAndroid Build Coastguard Worker 
333*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetCmd(UInt32 a);
334*f6dc9357SAndroid Build Coastguard Worker   void FindBadCmd(const CBlockHeader &bh, const Byte *);
335*f6dc9357SAndroid Build Coastguard Worker   void DetectNsisType(const CBlockHeader &bh, const Byte *);
336*f6dc9357SAndroid Build Coastguard Worker 
337*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReadEntries(const CBlockHeader &bh);
338*f6dc9357SAndroid Build Coastguard Worker   HRESULT SortItems();
339*f6dc9357SAndroid Build Coastguard Worker   HRESULT Parse();
340*f6dc9357SAndroid Build Coastguard Worker   HRESULT Open2(const Byte *data, size_t size);
341*f6dc9357SAndroid Build Coastguard Worker   void Clear2();
342*f6dc9357SAndroid Build Coastguard Worker 
343*f6dc9357SAndroid Build Coastguard Worker   void GetVar2(AString &res, UInt32 index);
344*f6dc9357SAndroid Build Coastguard Worker   void GetVar(AString &res, UInt32 index);
345*f6dc9357SAndroid Build Coastguard Worker   Int32 GetVarIndex(UInt32 strPos) const;
346*f6dc9357SAndroid Build Coastguard Worker   Int32 GetVarIndex(UInt32 strPos, UInt32 &resOffset) const;
347*f6dc9357SAndroid Build Coastguard Worker   Int32 GetVarIndexFinished(UInt32 strPos, Byte endChar, UInt32 &resOffset) const;
348*f6dc9357SAndroid Build Coastguard Worker   bool IsVarStr(UInt32 strPos, UInt32 varIndex) const;
349*f6dc9357SAndroid Build Coastguard Worker   bool IsAbsolutePathVar(UInt32 strPos) const;
350*f6dc9357SAndroid Build Coastguard Worker   void SetItemName(CItem &item, UInt32 strPos);
351*f6dc9357SAndroid Build Coastguard Worker 
352*f6dc9357SAndroid Build Coastguard Worker public:
353*f6dc9357SAndroid Build Coastguard Worker   HRESULT Open(IInStream *inStream, const UInt64 *maxCheckStartPosition);
354*f6dc9357SAndroid Build Coastguard Worker   AString GetFormatDescription() const;
InitDecoder()355*f6dc9357SAndroid Build Coastguard Worker   HRESULT InitDecoder()
356*f6dc9357SAndroid Build Coastguard Worker   {
357*f6dc9357SAndroid Build Coastguard Worker     bool useFilter;
358*f6dc9357SAndroid Build Coastguard Worker     return Decoder.Init(_stream, useFilter);
359*f6dc9357SAndroid Build Coastguard Worker   }
360*f6dc9357SAndroid Build Coastguard Worker 
SeekTo(UInt64 pos)361*f6dc9357SAndroid Build Coastguard Worker   HRESULT SeekTo(UInt64 pos)
362*f6dc9357SAndroid Build Coastguard Worker   {
363*f6dc9357SAndroid Build Coastguard Worker     return InStream_SeekSet(_stream, pos);
364*f6dc9357SAndroid Build Coastguard Worker   }
365*f6dc9357SAndroid Build Coastguard Worker 
SeekTo_DataStreamOffset()366*f6dc9357SAndroid Build Coastguard Worker   HRESULT SeekTo_DataStreamOffset()
367*f6dc9357SAndroid Build Coastguard Worker   {
368*f6dc9357SAndroid Build Coastguard Worker     return SeekTo(DataStreamOffset);
369*f6dc9357SAndroid Build Coastguard Worker   }
370*f6dc9357SAndroid Build Coastguard Worker 
SeekToNonSolidItem(unsigned index)371*f6dc9357SAndroid Build Coastguard Worker   HRESULT SeekToNonSolidItem(unsigned index)
372*f6dc9357SAndroid Build Coastguard Worker   {
373*f6dc9357SAndroid Build Coastguard Worker     return SeekTo(GetPosOfNonSolidItem(index));
374*f6dc9357SAndroid Build Coastguard Worker   }
375*f6dc9357SAndroid Build Coastguard Worker 
376*f6dc9357SAndroid Build Coastguard Worker   void Clear();
377*f6dc9357SAndroid Build Coastguard Worker 
378*f6dc9357SAndroid Build Coastguard Worker   bool IsDirectString_Equal(UInt32 offset, const char *s) const;
379*f6dc9357SAndroid Build Coastguard Worker   /*
380*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetDataPos(unsigned index)
381*f6dc9357SAndroid Build Coastguard Worker   {
382*f6dc9357SAndroid Build Coastguard Worker     const CItem &item = Items[index];
383*f6dc9357SAndroid Build Coastguard Worker     return GetOffset() + FirstHeader.HeaderSize + item.Pos;
384*f6dc9357SAndroid Build Coastguard Worker   }
385*f6dc9357SAndroid Build Coastguard Worker   */
386*f6dc9357SAndroid Build Coastguard Worker 
GetPosOfSolidItem(unsigned index)387*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetPosOfSolidItem(unsigned index) const
388*f6dc9357SAndroid Build Coastguard Worker   {
389*f6dc9357SAndroid Build Coastguard Worker     const CItem &item = Items[index];
390*f6dc9357SAndroid Build Coastguard Worker     return 4 + (UInt64)FirstHeader.HeaderSize + item.Pos;
391*f6dc9357SAndroid Build Coastguard Worker   }
392*f6dc9357SAndroid Build Coastguard Worker 
GetPosOfNonSolidItem(unsigned index)393*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetPosOfNonSolidItem(unsigned index) const
394*f6dc9357SAndroid Build Coastguard Worker   {
395*f6dc9357SAndroid Build Coastguard Worker     const CItem &item = Items[index];
396*f6dc9357SAndroid Build Coastguard Worker     return DataStreamOffset + _nonSolidStartOffset + 4 + item.Pos;
397*f6dc9357SAndroid Build Coastguard Worker   }
398*f6dc9357SAndroid Build Coastguard Worker 
Release()399*f6dc9357SAndroid Build Coastguard Worker   void Release()
400*f6dc9357SAndroid Build Coastguard Worker   {
401*f6dc9357SAndroid Build Coastguard Worker     Decoder.Release();
402*f6dc9357SAndroid Build Coastguard Worker   }
403*f6dc9357SAndroid Build Coastguard Worker 
IsTruncated()404*f6dc9357SAndroid Build Coastguard Worker   bool IsTruncated() const { return (_fileSize - StartOffset < FirstHeader.ArcSize); }
405*f6dc9357SAndroid Build Coastguard Worker 
GetReducedName(unsigned index)406*f6dc9357SAndroid Build Coastguard Worker   UString GetReducedName(unsigned index) const
407*f6dc9357SAndroid Build Coastguard Worker   {
408*f6dc9357SAndroid Build Coastguard Worker     const CItem &item = Items[index];
409*f6dc9357SAndroid Build Coastguard Worker 
410*f6dc9357SAndroid Build Coastguard Worker     UString s;
411*f6dc9357SAndroid Build Coastguard Worker     if (item.Prefix >= 0)
412*f6dc9357SAndroid Build Coastguard Worker     {
413*f6dc9357SAndroid Build Coastguard Worker       if (IsUnicode)
414*f6dc9357SAndroid Build Coastguard Worker         s = UPrefixes[item.Prefix];
415*f6dc9357SAndroid Build Coastguard Worker       else
416*f6dc9357SAndroid Build Coastguard Worker         s = MultiByteToUnicodeString(APrefixes[item.Prefix]);
417*f6dc9357SAndroid Build Coastguard Worker       if (s.Len() > 0)
418*f6dc9357SAndroid Build Coastguard Worker         if (s.Back() != L'\\')
419*f6dc9357SAndroid Build Coastguard Worker           s.Add_Char('\\');
420*f6dc9357SAndroid Build Coastguard Worker     }
421*f6dc9357SAndroid Build Coastguard Worker 
422*f6dc9357SAndroid Build Coastguard Worker     if (IsUnicode)
423*f6dc9357SAndroid Build Coastguard Worker     {
424*f6dc9357SAndroid Build Coastguard Worker       s += item.NameU;
425*f6dc9357SAndroid Build Coastguard Worker       if (item.NameU.IsEmpty())
426*f6dc9357SAndroid Build Coastguard Worker         s += "file";
427*f6dc9357SAndroid Build Coastguard Worker     }
428*f6dc9357SAndroid Build Coastguard Worker     else
429*f6dc9357SAndroid Build Coastguard Worker     {
430*f6dc9357SAndroid Build Coastguard Worker       s += MultiByteToUnicodeString(item.NameA);
431*f6dc9357SAndroid Build Coastguard Worker       if (item.NameA.IsEmpty())
432*f6dc9357SAndroid Build Coastguard Worker         s += "file";
433*f6dc9357SAndroid Build Coastguard Worker     }
434*f6dc9357SAndroid Build Coastguard Worker 
435*f6dc9357SAndroid Build Coastguard Worker     const char * const kRemoveStr = "$INSTDIR\\";
436*f6dc9357SAndroid Build Coastguard Worker     if (s.IsPrefixedBy_Ascii_NoCase(kRemoveStr))
437*f6dc9357SAndroid Build Coastguard Worker     {
438*f6dc9357SAndroid Build Coastguard Worker       s.Delete(0, MyStringLen(kRemoveStr));
439*f6dc9357SAndroid Build Coastguard Worker       if (s[0] == L'\\')
440*f6dc9357SAndroid Build Coastguard Worker         s.DeleteFrontal(1);
441*f6dc9357SAndroid Build Coastguard Worker     }
442*f6dc9357SAndroid Build Coastguard Worker     if (item.Is_PatchedUninstaller() && ExeStub.Size() == 0)
443*f6dc9357SAndroid Build Coastguard Worker       s += ".nsis";
444*f6dc9357SAndroid Build Coastguard Worker     return s;
445*f6dc9357SAndroid Build Coastguard Worker   }
446*f6dc9357SAndroid Build Coastguard Worker 
447*f6dc9357SAndroid Build Coastguard Worker   UString ConvertToUnicode(const AString &s) const;
448*f6dc9357SAndroid Build Coastguard Worker 
CInArchive()449*f6dc9357SAndroid Build Coastguard Worker   CInArchive()
450*f6dc9357SAndroid Build Coastguard Worker     #ifdef NSIS_SCRIPT
451*f6dc9357SAndroid Build Coastguard Worker       : Script(kScriptSizeLimit)
452*f6dc9357SAndroid Build Coastguard Worker     #endif
453*f6dc9357SAndroid Build Coastguard Worker     {}
454*f6dc9357SAndroid Build Coastguard Worker };
455*f6dc9357SAndroid Build Coastguard Worker 
456*f6dc9357SAndroid Build Coastguard Worker }}
457*f6dc9357SAndroid Build Coastguard Worker 
458*f6dc9357SAndroid Build Coastguard Worker #endif
459