1*f6dc9357SAndroid Build Coastguard Worker // NsisIn.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/IntToString.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringToInt.h"
7*f6dc9357SAndroid Build Coastguard Worker
8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/LimitedStreams.h"
9*f6dc9357SAndroid Build Coastguard Worker
10*f6dc9357SAndroid Build Coastguard Worker #include "NsisIn.h"
11*f6dc9357SAndroid Build Coastguard Worker
12*f6dc9357SAndroid Build Coastguard Worker #define Get16(p) GetUi16(p)
13*f6dc9357SAndroid Build Coastguard Worker #define Get32(p) GetUi32(p)
14*f6dc9357SAndroid Build Coastguard Worker
15*f6dc9357SAndroid Build Coastguard Worker // #define NUM_SPEED_TESTS 1000
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
18*f6dc9357SAndroid Build Coastguard Worker namespace NNsis {
19*f6dc9357SAndroid Build Coastguard Worker
20*f6dc9357SAndroid Build Coastguard Worker static const size_t kInputBufSize = 1 << 20;
21*f6dc9357SAndroid Build Coastguard Worker
22*f6dc9357SAndroid Build Coastguard Worker const Byte kSignature[kSignatureSize] = NSIS_SIGNATURE;
23*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kMask_IsCompressed = (UInt32)1 << 31;
24*f6dc9357SAndroid Build Coastguard Worker
25*f6dc9357SAndroid Build Coastguard Worker static const unsigned kNumCommandParams = 6;
26*f6dc9357SAndroid Build Coastguard Worker static const unsigned kCmdSize = 4 + kNumCommandParams * 4;
27*f6dc9357SAndroid Build Coastguard Worker
28*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
29*f6dc9357SAndroid Build Coastguard Worker #define CR_LF "\x0D\x0A"
30*f6dc9357SAndroid Build Coastguard Worker #endif
31*f6dc9357SAndroid Build Coastguard Worker
32*f6dc9357SAndroid Build Coastguard Worker static const char * const kErrorStr = "$_ERROR_STR_";
33*f6dc9357SAndroid Build Coastguard Worker
34*f6dc9357SAndroid Build Coastguard Worker #define RINOZ(x) { int _tt_ = (x); if (_tt_ != 0) return _tt_; }
35*f6dc9357SAndroid Build Coastguard Worker
36*f6dc9357SAndroid Build Coastguard Worker
37*f6dc9357SAndroid Build Coastguard Worker /* There are several versions of NSIS:
38*f6dc9357SAndroid Build Coastguard Worker 1) Original NSIS:
39*f6dc9357SAndroid Build Coastguard Worker NSIS-2 ANSI
40*f6dc9357SAndroid Build Coastguard Worker NSIS-3 ANSI
41*f6dc9357SAndroid Build Coastguard Worker NSIS-3 Unicode
42*f6dc9357SAndroid Build Coastguard Worker 2) NSIS from Jim Park that extends old NSIS-2 to Unicode support:
43*f6dc9357SAndroid Build Coastguard Worker NSIS-Park-(1,2,3) ANSI
44*f6dc9357SAndroid Build Coastguard Worker NSIS-Park-(1,2,3) Unicode
45*f6dc9357SAndroid Build Coastguard Worker
46*f6dc9357SAndroid Build Coastguard Worker The command IDs layout is slightly different for different versions.
47*f6dc9357SAndroid Build Coastguard Worker Also there are additional "log" versions of NSIS that support EW_LOG.
48*f6dc9357SAndroid Build Coastguard Worker We use the layout of "NSIS-3 Unicode" without "log" as main layout.
49*f6dc9357SAndroid Build Coastguard Worker And we transfer the command IDs to main layout, if another layout is detected. */
50*f6dc9357SAndroid Build Coastguard Worker
51*f6dc9357SAndroid Build Coastguard Worker
52*f6dc9357SAndroid Build Coastguard Worker enum
53*f6dc9357SAndroid Build Coastguard Worker {
54*f6dc9357SAndroid Build Coastguard Worker EW_INVALID_OPCODE,
55*f6dc9357SAndroid Build Coastguard Worker EW_RET, // Return
56*f6dc9357SAndroid Build Coastguard Worker EW_NOP, // Nop, Goto
57*f6dc9357SAndroid Build Coastguard Worker EW_ABORT, // Abort
58*f6dc9357SAndroid Build Coastguard Worker EW_QUIT, // Quit
59*f6dc9357SAndroid Build Coastguard Worker EW_CALL, // Call, InitPluginsDir
60*f6dc9357SAndroid Build Coastguard Worker EW_UPDATETEXT, // DetailPrint
61*f6dc9357SAndroid Build Coastguard Worker EW_SLEEP, // Sleep
62*f6dc9357SAndroid Build Coastguard Worker EW_BRINGTOFRONT, // BringToFront
63*f6dc9357SAndroid Build Coastguard Worker EW_CHDETAILSVIEW, // SetDetailsView
64*f6dc9357SAndroid Build Coastguard Worker EW_SETFILEATTRIBUTES, // SetFileAttributes
65*f6dc9357SAndroid Build Coastguard Worker EW_CREATEDIR, // CreateDirectory, SetOutPath
66*f6dc9357SAndroid Build Coastguard Worker EW_IFFILEEXISTS, // IfFileExists
67*f6dc9357SAndroid Build Coastguard Worker EW_SETFLAG, // SetRebootFlag, ...
68*f6dc9357SAndroid Build Coastguard Worker EW_IFFLAG, // IfAbort, IfSilent, IfErrors, IfRebootFlag
69*f6dc9357SAndroid Build Coastguard Worker EW_GETFLAG, // GetInstDirError, GetErrorLevel
70*f6dc9357SAndroid Build Coastguard Worker EW_RENAME, // Rename
71*f6dc9357SAndroid Build Coastguard Worker EW_GETFULLPATHNAME, // GetFullPathName
72*f6dc9357SAndroid Build Coastguard Worker EW_SEARCHPATH, // SearchPath
73*f6dc9357SAndroid Build Coastguard Worker EW_GETTEMPFILENAME, // GetTempFileName
74*f6dc9357SAndroid Build Coastguard Worker EW_EXTRACTFILE, // File
75*f6dc9357SAndroid Build Coastguard Worker EW_DELETEFILE, // Delete
76*f6dc9357SAndroid Build Coastguard Worker EW_MESSAGEBOX, // MessageBox
77*f6dc9357SAndroid Build Coastguard Worker EW_RMDIR, // RMDir
78*f6dc9357SAndroid Build Coastguard Worker EW_STRLEN, // StrLen
79*f6dc9357SAndroid Build Coastguard Worker EW_ASSIGNVAR, // StrCpy
80*f6dc9357SAndroid Build Coastguard Worker EW_STRCMP, // StrCmp
81*f6dc9357SAndroid Build Coastguard Worker EW_READENVSTR, // ReadEnvStr, ExpandEnvStrings
82*f6dc9357SAndroid Build Coastguard Worker EW_INTCMP, // IntCmp, IntCmpU
83*f6dc9357SAndroid Build Coastguard Worker EW_INTOP, // IntOp
84*f6dc9357SAndroid Build Coastguard Worker EW_INTFMT, // IntFmt/Int64Fmt
85*f6dc9357SAndroid Build Coastguard Worker EW_PUSHPOP, // Push/Pop/Exchange
86*f6dc9357SAndroid Build Coastguard Worker EW_FINDWINDOW, // FindWindow
87*f6dc9357SAndroid Build Coastguard Worker EW_SENDMESSAGE, // SendMessage
88*f6dc9357SAndroid Build Coastguard Worker EW_ISWINDOW, // IsWindow
89*f6dc9357SAndroid Build Coastguard Worker EW_GETDLGITEM, // GetDlgItem
90*f6dc9357SAndroid Build Coastguard Worker EW_SETCTLCOLORS, // SetCtlColors
91*f6dc9357SAndroid Build Coastguard Worker EW_SETBRANDINGIMAGE, // SetBrandingImage / LoadAndSetImage
92*f6dc9357SAndroid Build Coastguard Worker EW_CREATEFONT, // CreateFont
93*f6dc9357SAndroid Build Coastguard Worker EW_SHOWWINDOW, // ShowWindow, EnableWindow, HideWindow
94*f6dc9357SAndroid Build Coastguard Worker EW_SHELLEXEC, // ExecShell
95*f6dc9357SAndroid Build Coastguard Worker EW_EXECUTE, // Exec, ExecWait
96*f6dc9357SAndroid Build Coastguard Worker EW_GETFILETIME, // GetFileTime
97*f6dc9357SAndroid Build Coastguard Worker EW_GETDLLVERSION, // GetDLLVersion
98*f6dc9357SAndroid Build Coastguard Worker
99*f6dc9357SAndroid Build Coastguard Worker // EW_GETFONTVERSION, // Park : 2.46.2
100*f6dc9357SAndroid Build Coastguard Worker // EW_GETFONTNAME, // Park : 2.46.3
101*f6dc9357SAndroid Build Coastguard Worker
102*f6dc9357SAndroid Build Coastguard Worker EW_REGISTERDLL, // RegDLL, UnRegDLL, CallInstDLL
103*f6dc9357SAndroid Build Coastguard Worker EW_CREATESHORTCUT, // CreateShortCut
104*f6dc9357SAndroid Build Coastguard Worker EW_COPYFILES, // CopyFiles
105*f6dc9357SAndroid Build Coastguard Worker EW_REBOOT, // Reboot
106*f6dc9357SAndroid Build Coastguard Worker EW_WRITEINI, // WriteINIStr, DeleteINISec, DeleteINIStr, FlushINI
107*f6dc9357SAndroid Build Coastguard Worker EW_READINISTR, // ReadINIStr
108*f6dc9357SAndroid Build Coastguard Worker EW_DELREG, // DeleteRegValue, DeleteRegKey
109*f6dc9357SAndroid Build Coastguard Worker EW_WRITEREG, // WriteRegStr, WriteRegExpandStr, WriteRegBin, WriteRegDWORD
110*f6dc9357SAndroid Build Coastguard Worker EW_READREGSTR, // ReadRegStr, ReadRegDWORD
111*f6dc9357SAndroid Build Coastguard Worker EW_REGENUM, // EnumRegKey, EnumRegValue
112*f6dc9357SAndroid Build Coastguard Worker EW_FCLOSE, // FileClose
113*f6dc9357SAndroid Build Coastguard Worker EW_FOPEN, // FileOpen
114*f6dc9357SAndroid Build Coastguard Worker EW_FPUTS, // FileWrite, FileWriteByte
115*f6dc9357SAndroid Build Coastguard Worker EW_FGETS, // FileRead, FileReadByte
116*f6dc9357SAndroid Build Coastguard Worker
117*f6dc9357SAndroid Build Coastguard Worker // Park
118*f6dc9357SAndroid Build Coastguard Worker // EW_FPUTWS, // FileWriteUTF16LE, FileWriteWord
119*f6dc9357SAndroid Build Coastguard Worker // EW_FGETWS, // FileReadUTF16LE, FileReadWord
120*f6dc9357SAndroid Build Coastguard Worker
121*f6dc9357SAndroid Build Coastguard Worker EW_FSEEK, // FileSeek
122*f6dc9357SAndroid Build Coastguard Worker EW_FINDCLOSE, // FindClose
123*f6dc9357SAndroid Build Coastguard Worker EW_FINDNEXT, // FindNext
124*f6dc9357SAndroid Build Coastguard Worker EW_FINDFIRST, // FindFirst
125*f6dc9357SAndroid Build Coastguard Worker EW_WRITEUNINSTALLER, // WriteUninstaller
126*f6dc9357SAndroid Build Coastguard Worker
127*f6dc9357SAndroid Build Coastguard Worker // Park : since 2.46.3 the log is enabled in main Park version
128*f6dc9357SAndroid Build Coastguard Worker // EW_LOG, // LogSet, LogText
129*f6dc9357SAndroid Build Coastguard Worker
130*f6dc9357SAndroid Build Coastguard Worker EW_SECTIONSET, // Get*, Set*
131*f6dc9357SAndroid Build Coastguard Worker EW_INSTTYPESET, // InstTypeSetText, InstTypeGetText, SetCurInstType, GetCurInstType
132*f6dc9357SAndroid Build Coastguard Worker
133*f6dc9357SAndroid Build Coastguard Worker /*
134*f6dc9357SAndroid Build Coastguard Worker // before v3.06 nsis it was so:
135*f6dc9357SAndroid Build Coastguard Worker // instructions not actually implemented in exehead, but used in compiler.
136*f6dc9357SAndroid Build Coastguard Worker EW_GETLABELADDR, // both of these get converted to EW_ASSIGNVAR
137*f6dc9357SAndroid Build Coastguard Worker EW_GETFUNCTIONADDR,
138*f6dc9357SAndroid Build Coastguard Worker */
139*f6dc9357SAndroid Build Coastguard Worker
140*f6dc9357SAndroid Build Coastguard Worker // v3.06 and later it was changed to:
141*f6dc9357SAndroid Build Coastguard Worker EW_GETOSINFO,
142*f6dc9357SAndroid Build Coastguard Worker EW_RESERVEDOPCODE,
143*f6dc9357SAndroid Build Coastguard Worker
144*f6dc9357SAndroid Build Coastguard Worker EW_LOCKWINDOW, // LockWindow
145*f6dc9357SAndroid Build Coastguard Worker
146*f6dc9357SAndroid Build Coastguard Worker // 2 unicode commands available only in Unicode archive
147*f6dc9357SAndroid Build Coastguard Worker EW_FPUTWS, // FileWriteUTF16LE, FileWriteWord
148*f6dc9357SAndroid Build Coastguard Worker EW_FGETWS, // FileReadUTF16LE, FileReadWord
149*f6dc9357SAndroid Build Coastguard Worker
150*f6dc9357SAndroid Build Coastguard Worker /*
151*f6dc9357SAndroid Build Coastguard Worker // since v3.06 the fllowing IDs codes was moved here:
152*f6dc9357SAndroid Build Coastguard Worker // Opcodes listed here are not actually used in exehead. No exehead opcodes should be present after these!
153*f6dc9357SAndroid Build Coastguard Worker EW_GETLABELADDR, // --> EW_ASSIGNVAR
154*f6dc9357SAndroid Build Coastguard Worker EW_GETFUNCTIONADDR, // --> EW_ASSIGNVAR
155*f6dc9357SAndroid Build Coastguard Worker */
156*f6dc9357SAndroid Build Coastguard Worker
157*f6dc9357SAndroid Build Coastguard Worker // The following IDs are not IDs in real order.
158*f6dc9357SAndroid Build Coastguard Worker // We just need some IDs to translate eny extended layout to main layout.
159*f6dc9357SAndroid Build Coastguard Worker
160*f6dc9357SAndroid Build Coastguard Worker EW_LOG, // LogSet, LogText
161*f6dc9357SAndroid Build Coastguard Worker
162*f6dc9357SAndroid Build Coastguard Worker // Park
163*f6dc9357SAndroid Build Coastguard Worker EW_FINDPROC, // FindProc
164*f6dc9357SAndroid Build Coastguard Worker
165*f6dc9357SAndroid Build Coastguard Worker EW_GETFONTVERSION, // GetFontVersion
166*f6dc9357SAndroid Build Coastguard Worker EW_GETFONTNAME, // GetFontName
167*f6dc9357SAndroid Build Coastguard Worker
168*f6dc9357SAndroid Build Coastguard Worker kNumCmds
169*f6dc9357SAndroid Build Coastguard Worker };
170*f6dc9357SAndroid Build Coastguard Worker
171*f6dc9357SAndroid Build Coastguard Worker
172*f6dc9357SAndroid Build Coastguard Worker
173*f6dc9357SAndroid Build Coastguard Worker struct CCommandInfo
174*f6dc9357SAndroid Build Coastguard Worker {
175*f6dc9357SAndroid Build Coastguard Worker Byte NumParams;
176*f6dc9357SAndroid Build Coastguard Worker };
177*f6dc9357SAndroid Build Coastguard Worker
178*f6dc9357SAndroid Build Coastguard Worker static const CCommandInfo k_Commands[kNumCmds] =
179*f6dc9357SAndroid Build Coastguard Worker {
180*f6dc9357SAndroid Build Coastguard Worker { 0 }, // "Invalid" },
181*f6dc9357SAndroid Build Coastguard Worker { 0 }, // Return
182*f6dc9357SAndroid Build Coastguard Worker { 1 }, // Nop, Goto
183*f6dc9357SAndroid Build Coastguard Worker { 1 }, // "Abort" },
184*f6dc9357SAndroid Build Coastguard Worker { 0 }, // "Quit" },
185*f6dc9357SAndroid Build Coastguard Worker { 2 }, // Call
186*f6dc9357SAndroid Build Coastguard Worker { 6 }, // "DetailPrint" }, // 1 param in new versions, 6 in old NSIS versions
187*f6dc9357SAndroid Build Coastguard Worker { 1 }, // "Sleep" },
188*f6dc9357SAndroid Build Coastguard Worker { 0 }, // "BringToFront" },
189*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "SetDetailsView" },
190*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "SetFileAttributes" },
191*f6dc9357SAndroid Build Coastguard Worker { 3 }, // CreateDirectory, SetOutPath
192*f6dc9357SAndroid Build Coastguard Worker { 3 }, // "IfFileExists" },
193*f6dc9357SAndroid Build Coastguard Worker { 3 }, // SetRebootFlag, ...
194*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "If" }, // IfAbort, IfSilent, IfErrors, IfRebootFlag
195*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "Get" }, // GetInstDirError, GetErrorLevel
196*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "Rename" },
197*f6dc9357SAndroid Build Coastguard Worker { 3 }, // "GetFullPathName" },
198*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "SearchPath" },
199*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "GetTempFileName" },
200*f6dc9357SAndroid Build Coastguard Worker { 6 }, // "File"
201*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "Delete" },
202*f6dc9357SAndroid Build Coastguard Worker { 6 }, // "MessageBox" },
203*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "RMDir" },
204*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "StrLen" },
205*f6dc9357SAndroid Build Coastguard Worker { 4 }, // StrCpy, GetCurrentAddress
206*f6dc9357SAndroid Build Coastguard Worker { 5 }, // "StrCmp" },
207*f6dc9357SAndroid Build Coastguard Worker { 3 }, // ReadEnvStr, ExpandEnvStrings
208*f6dc9357SAndroid Build Coastguard Worker { 6 }, // "IntCmp" },
209*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "IntOp" },
210*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "IntFmt" }, EW_INTFMT
211*f6dc9357SAndroid Build Coastguard Worker { 6 }, // Push, Pop, Exch // it must be 3 params. But some multi-command write garbage.
212*f6dc9357SAndroid Build Coastguard Worker { 5 }, // "FindWindow" },
213*f6dc9357SAndroid Build Coastguard Worker { 6 }, // "SendMessage" },
214*f6dc9357SAndroid Build Coastguard Worker { 3 }, // "IsWindow" },
215*f6dc9357SAndroid Build Coastguard Worker { 3 }, // "GetDlgItem" },
216*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "SetCtlColors" },
217*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "SetBrandingImage" } // LoadAndSetImage
218*f6dc9357SAndroid Build Coastguard Worker { 5 }, // "CreateFont" },
219*f6dc9357SAndroid Build Coastguard Worker { 4 }, // ShowWindow, EnableWindow, HideWindow
220*f6dc9357SAndroid Build Coastguard Worker { 6 }, // "ExecShell" },
221*f6dc9357SAndroid Build Coastguard Worker { 3 }, // "Exec" }, // Exec, ExecWait
222*f6dc9357SAndroid Build Coastguard Worker { 3 }, // "GetFileTime" },
223*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "GetDLLVersion" },
224*f6dc9357SAndroid Build Coastguard Worker { 6 }, // RegDLL, UnRegDLL, CallInstDLL // it must be 5 params. But some multi-command write garbage.
225*f6dc9357SAndroid Build Coastguard Worker { 6 }, // "CreateShortCut" },
226*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "CopyFiles" },
227*f6dc9357SAndroid Build Coastguard Worker { 1 }, // "Reboot" },
228*f6dc9357SAndroid Build Coastguard Worker { 5 }, // WriteINIStr, DeleteINISec, DeleteINIStr, FlushINI
229*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "ReadINIStr" },
230*f6dc9357SAndroid Build Coastguard Worker { 5 }, // "DeleteReg" }, // DeleteRegKey, DeleteRegValue
231*f6dc9357SAndroid Build Coastguard Worker { 6 }, // "WriteReg" }, // WriteRegStr, WriteRegExpandStr, WriteRegBin, WriteRegDWORD
232*f6dc9357SAndroid Build Coastguard Worker { 5 }, // "ReadReg" }, // ReadRegStr, ReadRegDWORD
233*f6dc9357SAndroid Build Coastguard Worker { 5 }, // "EnumReg" }, // EnumRegKey, EnumRegValue
234*f6dc9357SAndroid Build Coastguard Worker { 1 }, // "FileClose" },
235*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "FileOpen" },
236*f6dc9357SAndroid Build Coastguard Worker { 3 }, // "FileWrite" }, // FileWrite, FileWriteByte
237*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "FileRead" }, // FileRead, FileReadByte
238*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "FileSeek" },
239*f6dc9357SAndroid Build Coastguard Worker { 1 }, // "FindClose" },
240*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "FindNext" },
241*f6dc9357SAndroid Build Coastguard Worker { 3 }, // "FindFirst" },
242*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "WriteUninstaller" },
243*f6dc9357SAndroid Build Coastguard Worker { 5 }, // "Section" }, // ***
244*f6dc9357SAndroid Build Coastguard Worker { 4 }, // InstTypeSetText, InstTypeGetText, SetCurInstType, GetCurInstType
245*f6dc9357SAndroid Build Coastguard Worker
246*f6dc9357SAndroid Build Coastguard Worker // { 6 }, // "GetLabelAddr" }, // before 3.06
247*f6dc9357SAndroid Build Coastguard Worker { 6 }, // "GetOsInfo" }, GetKnownFolderPath, ReadMemory, // v3.06+
248*f6dc9357SAndroid Build Coastguard Worker
249*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "GetFunctionAddress" }, // before 3.06
250*f6dc9357SAndroid Build Coastguard Worker
251*f6dc9357SAndroid Build Coastguard Worker { 1 }, // "LockWindow" },
252*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "FileWrite" }, // FileWriteUTF16LE, FileWriteWord
253*f6dc9357SAndroid Build Coastguard Worker { 4 }, // "FileRead" }, // FileReadUTF16LE, FileReadWord
254*f6dc9357SAndroid Build Coastguard Worker
255*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "Log" }, // LogSet, LogText
256*f6dc9357SAndroid Build Coastguard Worker // Park
257*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "FindProc" },
258*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "GetFontVersion" },
259*f6dc9357SAndroid Build Coastguard Worker { 2 }, // "GetFontName" }
260*f6dc9357SAndroid Build Coastguard Worker };
261*f6dc9357SAndroid Build Coastguard Worker
262*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
263*f6dc9357SAndroid Build Coastguard Worker
264*f6dc9357SAndroid Build Coastguard Worker static const char * const k_CommandNames[kNumCmds] =
265*f6dc9357SAndroid Build Coastguard Worker {
266*f6dc9357SAndroid Build Coastguard Worker "Invalid"
267*f6dc9357SAndroid Build Coastguard Worker , NULL // Return
268*f6dc9357SAndroid Build Coastguard Worker , NULL // Nop, Goto
269*f6dc9357SAndroid Build Coastguard Worker , "Abort"
270*f6dc9357SAndroid Build Coastguard Worker , "Quit"
271*f6dc9357SAndroid Build Coastguard Worker , NULL // Call
272*f6dc9357SAndroid Build Coastguard Worker , "DetailPrint" // 1 param in new versions, 6 in old NSIS versions
273*f6dc9357SAndroid Build Coastguard Worker , "Sleep"
274*f6dc9357SAndroid Build Coastguard Worker , "BringToFront"
275*f6dc9357SAndroid Build Coastguard Worker , "SetDetailsView"
276*f6dc9357SAndroid Build Coastguard Worker , "SetFileAttributes"
277*f6dc9357SAndroid Build Coastguard Worker , NULL // CreateDirectory, SetOutPath
278*f6dc9357SAndroid Build Coastguard Worker , "IfFileExists"
279*f6dc9357SAndroid Build Coastguard Worker , NULL // SetRebootFlag, ...
280*f6dc9357SAndroid Build Coastguard Worker , "If" // IfAbort, IfSilent, IfErrors, IfRebootFlag
281*f6dc9357SAndroid Build Coastguard Worker , "Get" // GetInstDirError, GetErrorLevel
282*f6dc9357SAndroid Build Coastguard Worker , "Rename"
283*f6dc9357SAndroid Build Coastguard Worker , "GetFullPathName"
284*f6dc9357SAndroid Build Coastguard Worker , "SearchPath"
285*f6dc9357SAndroid Build Coastguard Worker , "GetTempFileName"
286*f6dc9357SAndroid Build Coastguard Worker , NULL // File
287*f6dc9357SAndroid Build Coastguard Worker , "Delete"
288*f6dc9357SAndroid Build Coastguard Worker , "MessageBox"
289*f6dc9357SAndroid Build Coastguard Worker , "RMDir"
290*f6dc9357SAndroid Build Coastguard Worker , "StrLen"
291*f6dc9357SAndroid Build Coastguard Worker , NULL // StrCpy, GetCurrentAddress
292*f6dc9357SAndroid Build Coastguard Worker , "StrCmp"
293*f6dc9357SAndroid Build Coastguard Worker , NULL // ReadEnvStr, ExpandEnvStrings
294*f6dc9357SAndroid Build Coastguard Worker , NULL // IntCmp / Int64Cmp / EW_INTCMP
295*f6dc9357SAndroid Build Coastguard Worker , "IntOp"
296*f6dc9357SAndroid Build Coastguard Worker , NULL // IntFmt / Int64Fmt / EW_INTFMT
297*f6dc9357SAndroid Build Coastguard Worker , NULL // Push, Pop, Exch // it must be 3 params. But some multi-command write garbage.
298*f6dc9357SAndroid Build Coastguard Worker , "FindWindow"
299*f6dc9357SAndroid Build Coastguard Worker , "SendMessage"
300*f6dc9357SAndroid Build Coastguard Worker , "IsWindow"
301*f6dc9357SAndroid Build Coastguard Worker , "GetDlgItem"
302*f6dc9357SAndroid Build Coastguard Worker , "SetCtlColors"
303*f6dc9357SAndroid Build Coastguard Worker , "SetBrandingImage"
304*f6dc9357SAndroid Build Coastguard Worker , "CreateFont"
305*f6dc9357SAndroid Build Coastguard Worker , NULL // ShowWindow, EnableWindow, HideWindow
306*f6dc9357SAndroid Build Coastguard Worker , "ExecShell"
307*f6dc9357SAndroid Build Coastguard Worker , "Exec" // Exec, ExecWait
308*f6dc9357SAndroid Build Coastguard Worker , "GetFileTime"
309*f6dc9357SAndroid Build Coastguard Worker , "GetDLLVersion"
310*f6dc9357SAndroid Build Coastguard Worker , NULL // RegDLL, UnRegDLL, CallInstDLL // it must be 5 params. But some multi-command write garbage.
311*f6dc9357SAndroid Build Coastguard Worker , "CreateShortCut"
312*f6dc9357SAndroid Build Coastguard Worker , "CopyFiles"
313*f6dc9357SAndroid Build Coastguard Worker , "Reboot"
314*f6dc9357SAndroid Build Coastguard Worker , NULL // WriteINIStr, DeleteINISec, DeleteINIStr, FlushINI
315*f6dc9357SAndroid Build Coastguard Worker , "ReadINIStr"
316*f6dc9357SAndroid Build Coastguard Worker , "DeleteReg" // DeleteRegKey, DeleteRegValue
317*f6dc9357SAndroid Build Coastguard Worker , "WriteReg" // WriteRegStr, WriteRegExpandStr, WriteRegBin, WriteRegDWORD
318*f6dc9357SAndroid Build Coastguard Worker , "ReadReg" // ReadRegStr, ReadRegDWORD
319*f6dc9357SAndroid Build Coastguard Worker , "EnumReg" // EnumRegKey, EnumRegValue
320*f6dc9357SAndroid Build Coastguard Worker , "FileClose"
321*f6dc9357SAndroid Build Coastguard Worker , "FileOpen"
322*f6dc9357SAndroid Build Coastguard Worker , "FileWrite" // FileWrite, FileWriteByte
323*f6dc9357SAndroid Build Coastguard Worker , "FileRead" // FileRead, FileReadByte
324*f6dc9357SAndroid Build Coastguard Worker , "FileSeek"
325*f6dc9357SAndroid Build Coastguard Worker , "FindClose"
326*f6dc9357SAndroid Build Coastguard Worker , "FindNext"
327*f6dc9357SAndroid Build Coastguard Worker , "FindFirst"
328*f6dc9357SAndroid Build Coastguard Worker , "WriteUninstaller"
329*f6dc9357SAndroid Build Coastguard Worker , "Section" // ***
330*f6dc9357SAndroid Build Coastguard Worker , NULL // InstTypeSetText, InstTypeGetText, SetCurInstType, GetCurInstType
331*f6dc9357SAndroid Build Coastguard Worker
332*f6dc9357SAndroid Build Coastguard Worker , NULL // "GetOsInfo" // , "GetLabelAddr" //
333*f6dc9357SAndroid Build Coastguard Worker , "GetFunctionAddress"
334*f6dc9357SAndroid Build Coastguard Worker
335*f6dc9357SAndroid Build Coastguard Worker , "LockWindow"
336*f6dc9357SAndroid Build Coastguard Worker , "FileWrite" // FileWriteUTF16LE, FileWriteWord
337*f6dc9357SAndroid Build Coastguard Worker , "FileRead" // FileReadUTF16LE, FileReadWord
338*f6dc9357SAndroid Build Coastguard Worker
339*f6dc9357SAndroid Build Coastguard Worker , "Log" // LogSet, LogText
340*f6dc9357SAndroid Build Coastguard Worker
341*f6dc9357SAndroid Build Coastguard Worker // Park
342*f6dc9357SAndroid Build Coastguard Worker , "FindProc"
343*f6dc9357SAndroid Build Coastguard Worker , "GetFontVersion"
344*f6dc9357SAndroid Build Coastguard Worker , "GetFontName"
345*f6dc9357SAndroid Build Coastguard Worker };
346*f6dc9357SAndroid Build Coastguard Worker
347*f6dc9357SAndroid Build Coastguard Worker #endif
348*f6dc9357SAndroid Build Coastguard Worker
349*f6dc9357SAndroid Build Coastguard Worker /* NSIS can use one name for two CSIDL_*** and CSIDL_COMMON_*** items (CurrentUser / AllUsers)
350*f6dc9357SAndroid Build Coastguard Worker Some NSIS shell names are not identical to WIN32 CSIDL_* names.
351*f6dc9357SAndroid Build Coastguard Worker NSIS doesn't use some CSIDL_* values. But we add name for all CSIDL_ (marked with '+'). */
352*f6dc9357SAndroid Build Coastguard Worker
353*f6dc9357SAndroid Build Coastguard Worker static const char * const kShellStrings[] =
354*f6dc9357SAndroid Build Coastguard Worker {
355*f6dc9357SAndroid Build Coastguard Worker "DESKTOP" // +
356*f6dc9357SAndroid Build Coastguard Worker , "INTERNET" // +
357*f6dc9357SAndroid Build Coastguard Worker , "SMPROGRAMS" // CSIDL_PROGRAMS
358*f6dc9357SAndroid Build Coastguard Worker , "CONTROLS" // +
359*f6dc9357SAndroid Build Coastguard Worker , "PRINTERS" // +
360*f6dc9357SAndroid Build Coastguard Worker , "DOCUMENTS" // CSIDL_PERSONAL
361*f6dc9357SAndroid Build Coastguard Worker , "FAVORITES" // CSIDL_FAVORITES
362*f6dc9357SAndroid Build Coastguard Worker , "SMSTARTUP" // CSIDL_STARTUP
363*f6dc9357SAndroid Build Coastguard Worker , "RECENT" // CSIDL_RECENT
364*f6dc9357SAndroid Build Coastguard Worker , "SENDTO" // CSIDL_SENDTO
365*f6dc9357SAndroid Build Coastguard Worker , "BITBUCKET" // +
366*f6dc9357SAndroid Build Coastguard Worker , "STARTMENU"
367*f6dc9357SAndroid Build Coastguard Worker , NULL // CSIDL_MYDOCUMENTS = CSIDL_PERSONAL
368*f6dc9357SAndroid Build Coastguard Worker , "MUSIC" // CSIDL_MYMUSIC
369*f6dc9357SAndroid Build Coastguard Worker , "VIDEOS" // CSIDL_MYVIDEO
370*f6dc9357SAndroid Build Coastguard Worker , NULL
371*f6dc9357SAndroid Build Coastguard Worker , "DESKTOP" // CSIDL_DESKTOPDIRECTORY
372*f6dc9357SAndroid Build Coastguard Worker , "DRIVES" // +
373*f6dc9357SAndroid Build Coastguard Worker , "NETWORK" // +
374*f6dc9357SAndroid Build Coastguard Worker , "NETHOOD"
375*f6dc9357SAndroid Build Coastguard Worker , "FONTS"
376*f6dc9357SAndroid Build Coastguard Worker , "TEMPLATES"
377*f6dc9357SAndroid Build Coastguard Worker , "STARTMENU" // CSIDL_COMMON_STARTMENU
378*f6dc9357SAndroid Build Coastguard Worker , "SMPROGRAMS" // CSIDL_COMMON_PROGRAMS
379*f6dc9357SAndroid Build Coastguard Worker , "SMSTARTUP" // CSIDL_COMMON_STARTUP
380*f6dc9357SAndroid Build Coastguard Worker , "DESKTOP" // CSIDL_COMMON_DESKTOPDIRECTORY
381*f6dc9357SAndroid Build Coastguard Worker , "APPDATA" // CSIDL_APPDATA !!! "QUICKLAUNCH"
382*f6dc9357SAndroid Build Coastguard Worker , "PRINTHOOD"
383*f6dc9357SAndroid Build Coastguard Worker , "LOCALAPPDATA"
384*f6dc9357SAndroid Build Coastguard Worker , "ALTSTARTUP"
385*f6dc9357SAndroid Build Coastguard Worker , "ALTSTARTUP" // CSIDL_COMMON_ALTSTARTUP
386*f6dc9357SAndroid Build Coastguard Worker , "FAVORITES" // CSIDL_COMMON_FAVORITES
387*f6dc9357SAndroid Build Coastguard Worker , "INTERNET_CACHE"
388*f6dc9357SAndroid Build Coastguard Worker , "COOKIES"
389*f6dc9357SAndroid Build Coastguard Worker , "HISTORY"
390*f6dc9357SAndroid Build Coastguard Worker , "APPDATA" // CSIDL_COMMON_APPDATA
391*f6dc9357SAndroid Build Coastguard Worker , "WINDIR"
392*f6dc9357SAndroid Build Coastguard Worker , "SYSDIR"
393*f6dc9357SAndroid Build Coastguard Worker , "PROGRAM_FILES" // +
394*f6dc9357SAndroid Build Coastguard Worker , "PICTURES" // CSIDL_MYPICTURES
395*f6dc9357SAndroid Build Coastguard Worker , "PROFILE"
396*f6dc9357SAndroid Build Coastguard Worker , "SYSTEMX86" // +
397*f6dc9357SAndroid Build Coastguard Worker , "PROGRAM_FILESX86" // +
398*f6dc9357SAndroid Build Coastguard Worker , "PROGRAM_FILES_COMMON" // +
399*f6dc9357SAndroid Build Coastguard Worker , "PROGRAM_FILES_COMMONX8" // + CSIDL_PROGRAM_FILES_COMMONX86
400*f6dc9357SAndroid Build Coastguard Worker , "TEMPLATES" // CSIDL_COMMON_TEMPLATES
401*f6dc9357SAndroid Build Coastguard Worker , "DOCUMENTS" // CSIDL_COMMON_DOCUMENTS
402*f6dc9357SAndroid Build Coastguard Worker , "ADMINTOOLS" // CSIDL_COMMON_ADMINTOOLS
403*f6dc9357SAndroid Build Coastguard Worker , "ADMINTOOLS" // CSIDL_ADMINTOOLS
404*f6dc9357SAndroid Build Coastguard Worker , "CONNECTIONS" // +
405*f6dc9357SAndroid Build Coastguard Worker , NULL
406*f6dc9357SAndroid Build Coastguard Worker , NULL
407*f6dc9357SAndroid Build Coastguard Worker , NULL
408*f6dc9357SAndroid Build Coastguard Worker , "MUSIC" // CSIDL_COMMON_MUSIC
409*f6dc9357SAndroid Build Coastguard Worker , "PICTURES" // CSIDL_COMMON_PICTURES
410*f6dc9357SAndroid Build Coastguard Worker , "VIDEOS" // CSIDL_COMMON_VIDEO
411*f6dc9357SAndroid Build Coastguard Worker , "RESOURCES"
412*f6dc9357SAndroid Build Coastguard Worker , "RESOURCES_LOCALIZED"
413*f6dc9357SAndroid Build Coastguard Worker , "COMMON_OEM_LINKS" // +
414*f6dc9357SAndroid Build Coastguard Worker , "CDBURN_AREA"
415*f6dc9357SAndroid Build Coastguard Worker , NULL // unused
416*f6dc9357SAndroid Build Coastguard Worker , "COMPUTERSNEARME" // +
417*f6dc9357SAndroid Build Coastguard Worker };
418*f6dc9357SAndroid Build Coastguard Worker
419*f6dc9357SAndroid Build Coastguard Worker
UIntToString(AString & s,UInt32 v)420*f6dc9357SAndroid Build Coastguard Worker static inline void UIntToString(AString &s, UInt32 v)
421*f6dc9357SAndroid Build Coastguard Worker {
422*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32(v);
423*f6dc9357SAndroid Build Coastguard Worker }
424*f6dc9357SAndroid Build Coastguard Worker
425*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
426*f6dc9357SAndroid Build Coastguard Worker
Add_UInt(UInt32 v)427*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_UInt(UInt32 v)
428*f6dc9357SAndroid Build Coastguard Worker {
429*f6dc9357SAndroid Build Coastguard Worker char sz[16];
430*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToString(v, sz);
431*f6dc9357SAndroid Build Coastguard Worker Script += sz;
432*f6dc9357SAndroid Build Coastguard Worker }
433*f6dc9357SAndroid Build Coastguard Worker
Add_SignedInt(CDynLimBuf & s,Int32 v)434*f6dc9357SAndroid Build Coastguard Worker static void Add_SignedInt(CDynLimBuf &s, Int32 v)
435*f6dc9357SAndroid Build Coastguard Worker {
436*f6dc9357SAndroid Build Coastguard Worker char sz[32];
437*f6dc9357SAndroid Build Coastguard Worker ConvertInt64ToString(v, sz);
438*f6dc9357SAndroid Build Coastguard Worker s += sz;
439*f6dc9357SAndroid Build Coastguard Worker }
440*f6dc9357SAndroid Build Coastguard Worker
Add_Hex(CDynLimBuf & s,UInt32 v)441*f6dc9357SAndroid Build Coastguard Worker static void Add_Hex(CDynLimBuf &s, UInt32 v)
442*f6dc9357SAndroid Build Coastguard Worker {
443*f6dc9357SAndroid Build Coastguard Worker char sz[16];
444*f6dc9357SAndroid Build Coastguard Worker sz[0] = '0';
445*f6dc9357SAndroid Build Coastguard Worker sz[1] = 'x';
446*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToHex(v, sz + 2);
447*f6dc9357SAndroid Build Coastguard Worker s += sz;
448*f6dc9357SAndroid Build Coastguard Worker }
449*f6dc9357SAndroid Build Coastguard Worker
GetUi16Str_Len(const Byte * p)450*f6dc9357SAndroid Build Coastguard Worker static UInt32 GetUi16Str_Len(const Byte *p)
451*f6dc9357SAndroid Build Coastguard Worker {
452*f6dc9357SAndroid Build Coastguard Worker const Byte *pp = p;
453*f6dc9357SAndroid Build Coastguard Worker for (; *pp != 0 || *(pp + 1) != 0; pp += 2);
454*f6dc9357SAndroid Build Coastguard Worker return (UInt32)((pp - p) >> 1);
455*f6dc9357SAndroid Build Coastguard Worker }
456*f6dc9357SAndroid Build Coastguard Worker
AddLicense(UInt32 param,Int32 langID)457*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddLicense(UInt32 param, Int32 langID)
458*f6dc9357SAndroid Build Coastguard Worker {
459*f6dc9357SAndroid Build Coastguard Worker Space();
460*f6dc9357SAndroid Build Coastguard Worker if (param >= NumStringChars ||
461*f6dc9357SAndroid Build Coastguard Worker param + 1 >= NumStringChars)
462*f6dc9357SAndroid Build Coastguard Worker {
463*f6dc9357SAndroid Build Coastguard Worker Script += kErrorStr;
464*f6dc9357SAndroid Build Coastguard Worker return;
465*f6dc9357SAndroid Build Coastguard Worker }
466*f6dc9357SAndroid Build Coastguard Worker strUsed[param] = 1;
467*f6dc9357SAndroid Build Coastguard Worker
468*f6dc9357SAndroid Build Coastguard Worker const UInt32 start = _stringsPos + (IsUnicode ? param * 2 : param);
469*f6dc9357SAndroid Build Coastguard Worker const UInt32 offset = start + (IsUnicode ? 2 : 1);
470*f6dc9357SAndroid Build Coastguard Worker {
471*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, LicenseFiles)
472*f6dc9357SAndroid Build Coastguard Worker {
473*f6dc9357SAndroid Build Coastguard Worker const CLicenseFile &lic = LicenseFiles[i];
474*f6dc9357SAndroid Build Coastguard Worker if (offset == lic.Offset)
475*f6dc9357SAndroid Build Coastguard Worker {
476*f6dc9357SAndroid Build Coastguard Worker Script += lic.Name;
477*f6dc9357SAndroid Build Coastguard Worker return;
478*f6dc9357SAndroid Build Coastguard Worker }
479*f6dc9357SAndroid Build Coastguard Worker }
480*f6dc9357SAndroid Build Coastguard Worker }
481*f6dc9357SAndroid Build Coastguard Worker AString fileName ("[LICENSE]");
482*f6dc9357SAndroid Build Coastguard Worker if (langID >= 0)
483*f6dc9357SAndroid Build Coastguard Worker {
484*f6dc9357SAndroid Build Coastguard Worker fileName += "\\license-";
485*f6dc9357SAndroid Build Coastguard Worker // LangId_To_String(fileName, langID);
486*f6dc9357SAndroid Build Coastguard Worker UIntToString(fileName, (UInt32)langID);
487*f6dc9357SAndroid Build Coastguard Worker }
488*f6dc9357SAndroid Build Coastguard Worker else if (++_numRootLicenses > 1)
489*f6dc9357SAndroid Build Coastguard Worker {
490*f6dc9357SAndroid Build Coastguard Worker fileName.Add_Minus();
491*f6dc9357SAndroid Build Coastguard Worker UIntToString(fileName, _numRootLicenses);
492*f6dc9357SAndroid Build Coastguard Worker }
493*f6dc9357SAndroid Build Coastguard Worker const Byte *sz = (_data + start);
494*f6dc9357SAndroid Build Coastguard Worker const unsigned marker = IsUnicode ? Get16(sz) : *sz;
495*f6dc9357SAndroid Build Coastguard Worker const bool isRTF = (marker == 2);
496*f6dc9357SAndroid Build Coastguard Worker fileName += isRTF ? ".rtf" : ".txt"; // if (*sz == 1) it's text;
497*f6dc9357SAndroid Build Coastguard Worker Script += fileName;
498*f6dc9357SAndroid Build Coastguard Worker
499*f6dc9357SAndroid Build Coastguard Worker CLicenseFile &lic = LicenseFiles.AddNew();
500*f6dc9357SAndroid Build Coastguard Worker lic.Name = fileName;
501*f6dc9357SAndroid Build Coastguard Worker lic.Offset = offset;
502*f6dc9357SAndroid Build Coastguard Worker if (!IsUnicode)
503*f6dc9357SAndroid Build Coastguard Worker lic.Size = (UInt32)strlen((const char *)sz + 1);
504*f6dc9357SAndroid Build Coastguard Worker else
505*f6dc9357SAndroid Build Coastguard Worker {
506*f6dc9357SAndroid Build Coastguard Worker sz += 2;
507*f6dc9357SAndroid Build Coastguard Worker const UInt32 len = GetUi16Str_Len(sz);
508*f6dc9357SAndroid Build Coastguard Worker lic.Size = len * 2;
509*f6dc9357SAndroid Build Coastguard Worker if (isRTF)
510*f6dc9357SAndroid Build Coastguard Worker {
511*f6dc9357SAndroid Build Coastguard Worker lic.Text.Alloc((size_t)len);
512*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < len; i++, sz += 2)
513*f6dc9357SAndroid Build Coastguard Worker {
514*f6dc9357SAndroid Build Coastguard Worker unsigned c = Get16(sz);
515*f6dc9357SAndroid Build Coastguard Worker if (c >= 256)
516*f6dc9357SAndroid Build Coastguard Worker c = '?';
517*f6dc9357SAndroid Build Coastguard Worker lic.Text[i] = (Byte)(c);
518*f6dc9357SAndroid Build Coastguard Worker }
519*f6dc9357SAndroid Build Coastguard Worker lic.Size = len;
520*f6dc9357SAndroid Build Coastguard Worker lic.Offset = 0;
521*f6dc9357SAndroid Build Coastguard Worker }
522*f6dc9357SAndroid Build Coastguard Worker }
523*f6dc9357SAndroid Build Coastguard Worker }
524*f6dc9357SAndroid Build Coastguard Worker
525*f6dc9357SAndroid Build Coastguard Worker #endif
526*f6dc9357SAndroid Build Coastguard Worker
527*f6dc9357SAndroid Build Coastguard Worker
528*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
529*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_GENERIC_READ ((UInt32)1 << 31)
530*f6dc9357SAndroid Build Coastguard Worker #endif
531*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_GENERIC_WRITE ((UInt32)1 << 30)
532*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
533*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_GENERIC_EXECUTE ((UInt32)1 << 29)
534*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_GENERIC_ALL ((UInt32)1 << 28)
535*f6dc9357SAndroid Build Coastguard Worker #endif
536*f6dc9357SAndroid Build Coastguard Worker
537*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
538*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_CREATE_NEW 1
539*f6dc9357SAndroid Build Coastguard Worker #endif
540*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_CREATE_ALWAYS 2
541*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
542*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_OPEN_EXISTING 3
543*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_OPEN_ALWAYS 4
544*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_TRUNCATE_EXISTING 5
545*f6dc9357SAndroid Build Coastguard Worker #endif
546*f6dc9357SAndroid Build Coastguard Worker
547*f6dc9357SAndroid Build Coastguard Worker
548*f6dc9357SAndroid Build Coastguard Worker // #define kVar_CMDLINE 20
549*f6dc9357SAndroid Build Coastguard Worker #define kVar_INSTDIR 21
550*f6dc9357SAndroid Build Coastguard Worker #define kVar_OUTDIR 22
551*f6dc9357SAndroid Build Coastguard Worker #define kVar_EXEDIR 23
552*f6dc9357SAndroid Build Coastguard Worker // #define kVar_LANGUAGE 24
553*f6dc9357SAndroid Build Coastguard Worker #define kVar_TEMP 25
554*f6dc9357SAndroid Build Coastguard Worker #define kVar_PLUGINSDIR 26
555*f6dc9357SAndroid Build Coastguard Worker #define kVar_EXEPATH 27 // NSIS 2.26+
556*f6dc9357SAndroid Build Coastguard Worker // #define kVar_EXEFILE 28 // NSIS 2.26+
557*f6dc9357SAndroid Build Coastguard Worker
558*f6dc9357SAndroid Build Coastguard Worker #define kVar_HWNDPARENT_225 27
559*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
560*f6dc9357SAndroid Build Coastguard Worker #define kVar_HWNDPARENT 29
561*f6dc9357SAndroid Build Coastguard Worker #endif
562*f6dc9357SAndroid Build Coastguard Worker
563*f6dc9357SAndroid Build Coastguard Worker // #define kVar__CLICK 30
564*f6dc9357SAndroid Build Coastguard Worker #define kVar_Spec_OUTDIR_225 29 // NSIS 2.04 - 2.25
565*f6dc9357SAndroid Build Coastguard Worker #define kVar_Spec_OUTDIR 31 // NSIS 2.26+
566*f6dc9357SAndroid Build Coastguard Worker
567*f6dc9357SAndroid Build Coastguard Worker
568*f6dc9357SAndroid Build Coastguard Worker static const char * const kVarStrings[] =
569*f6dc9357SAndroid Build Coastguard Worker {
570*f6dc9357SAndroid Build Coastguard Worker "CMDLINE"
571*f6dc9357SAndroid Build Coastguard Worker , "INSTDIR"
572*f6dc9357SAndroid Build Coastguard Worker , "OUTDIR"
573*f6dc9357SAndroid Build Coastguard Worker , "EXEDIR"
574*f6dc9357SAndroid Build Coastguard Worker , "LANGUAGE"
575*f6dc9357SAndroid Build Coastguard Worker , "TEMP"
576*f6dc9357SAndroid Build Coastguard Worker , "PLUGINSDIR"
577*f6dc9357SAndroid Build Coastguard Worker , "EXEPATH" // NSIS 2.26+
578*f6dc9357SAndroid Build Coastguard Worker , "EXEFILE" // NSIS 2.26+
579*f6dc9357SAndroid Build Coastguard Worker , "HWNDPARENT"
580*f6dc9357SAndroid Build Coastguard Worker , "_CLICK" // is set from page->clicknext
581*f6dc9357SAndroid Build Coastguard Worker , "_OUTDIR" // NSIS 2.04+
582*f6dc9357SAndroid Build Coastguard Worker };
583*f6dc9357SAndroid Build Coastguard Worker
584*f6dc9357SAndroid Build Coastguard Worker static const unsigned kNumInternalVars = 20 + Z7_ARRAY_SIZE(kVarStrings);
585*f6dc9357SAndroid Build Coastguard Worker
586*f6dc9357SAndroid Build Coastguard Worker #define GET_NUM_INTERNAL_VARS (IsNsis200 ? kNumInternalVars - 3 : IsNsis225 ? kNumInternalVars - 2 : kNumInternalVars)
587*f6dc9357SAndroid Build Coastguard Worker
GetVar2(AString & res,UInt32 index)588*f6dc9357SAndroid Build Coastguard Worker void CInArchive::GetVar2(AString &res, UInt32 index)
589*f6dc9357SAndroid Build Coastguard Worker {
590*f6dc9357SAndroid Build Coastguard Worker if (index < 20)
591*f6dc9357SAndroid Build Coastguard Worker {
592*f6dc9357SAndroid Build Coastguard Worker if (index >= 10)
593*f6dc9357SAndroid Build Coastguard Worker {
594*f6dc9357SAndroid Build Coastguard Worker res += 'R';
595*f6dc9357SAndroid Build Coastguard Worker index -= 10;
596*f6dc9357SAndroid Build Coastguard Worker }
597*f6dc9357SAndroid Build Coastguard Worker UIntToString(res, index);
598*f6dc9357SAndroid Build Coastguard Worker }
599*f6dc9357SAndroid Build Coastguard Worker else
600*f6dc9357SAndroid Build Coastguard Worker {
601*f6dc9357SAndroid Build Coastguard Worker unsigned numInternalVars = GET_NUM_INTERNAL_VARS;
602*f6dc9357SAndroid Build Coastguard Worker if (index < numInternalVars)
603*f6dc9357SAndroid Build Coastguard Worker {
604*f6dc9357SAndroid Build Coastguard Worker if (IsNsis225 && index >= kVar_EXEPATH)
605*f6dc9357SAndroid Build Coastguard Worker index += 2;
606*f6dc9357SAndroid Build Coastguard Worker res += kVarStrings[index - 20];
607*f6dc9357SAndroid Build Coastguard Worker }
608*f6dc9357SAndroid Build Coastguard Worker else
609*f6dc9357SAndroid Build Coastguard Worker {
610*f6dc9357SAndroid Build Coastguard Worker res += '_';
611*f6dc9357SAndroid Build Coastguard Worker UIntToString(res, index - numInternalVars);
612*f6dc9357SAndroid Build Coastguard Worker res += '_';
613*f6dc9357SAndroid Build Coastguard Worker }
614*f6dc9357SAndroid Build Coastguard Worker }
615*f6dc9357SAndroid Build Coastguard Worker }
616*f6dc9357SAndroid Build Coastguard Worker
GetVar(AString & res,UInt32 index)617*f6dc9357SAndroid Build Coastguard Worker void CInArchive::GetVar(AString &res, UInt32 index)
618*f6dc9357SAndroid Build Coastguard Worker {
619*f6dc9357SAndroid Build Coastguard Worker res += '$';
620*f6dc9357SAndroid Build Coastguard Worker GetVar2(res, index);
621*f6dc9357SAndroid Build Coastguard Worker }
622*f6dc9357SAndroid Build Coastguard Worker
623*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
624*f6dc9357SAndroid Build Coastguard Worker
Add_Var(UInt32 index)625*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_Var(UInt32 index)
626*f6dc9357SAndroid Build Coastguard Worker {
627*f6dc9357SAndroid Build Coastguard Worker _tempString_for_GetVar.Empty();
628*f6dc9357SAndroid Build Coastguard Worker GetVar(_tempString_for_GetVar, index);
629*f6dc9357SAndroid Build Coastguard Worker Script += _tempString_for_GetVar;
630*f6dc9357SAndroid Build Coastguard Worker }
631*f6dc9357SAndroid Build Coastguard Worker
AddParam_Var(UInt32 index)632*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddParam_Var(UInt32 index)
633*f6dc9357SAndroid Build Coastguard Worker {
634*f6dc9357SAndroid Build Coastguard Worker Space();
635*f6dc9357SAndroid Build Coastguard Worker Add_Var(index);
636*f6dc9357SAndroid Build Coastguard Worker }
637*f6dc9357SAndroid Build Coastguard Worker
AddParam_UInt(UInt32 value)638*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddParam_UInt(UInt32 value)
639*f6dc9357SAndroid Build Coastguard Worker {
640*f6dc9357SAndroid Build Coastguard Worker Space();
641*f6dc9357SAndroid Build Coastguard Worker Add_UInt(value);
642*f6dc9357SAndroid Build Coastguard Worker }
643*f6dc9357SAndroid Build Coastguard Worker
644*f6dc9357SAndroid Build Coastguard Worker #endif
645*f6dc9357SAndroid Build Coastguard Worker
646*f6dc9357SAndroid Build Coastguard Worker
647*f6dc9357SAndroid Build Coastguard Worker #define NS_CODE_SKIP 252
648*f6dc9357SAndroid Build Coastguard Worker #define NS_CODE_VAR 253
649*f6dc9357SAndroid Build Coastguard Worker #define NS_CODE_SHELL 254
650*f6dc9357SAndroid Build Coastguard Worker // #define NS_CODE_LANG 255
651*f6dc9357SAndroid Build Coastguard Worker
652*f6dc9357SAndroid Build Coastguard Worker // #define NS_3_CODE_LANG 1
653*f6dc9357SAndroid Build Coastguard Worker #define NS_3_CODE_SHELL 2
654*f6dc9357SAndroid Build Coastguard Worker #define NS_3_CODE_VAR 3
655*f6dc9357SAndroid Build Coastguard Worker #define NS_3_CODE_SKIP 4
656*f6dc9357SAndroid Build Coastguard Worker
657*f6dc9357SAndroid Build Coastguard Worker #define PARK_CODE_SKIP 0xE000
658*f6dc9357SAndroid Build Coastguard Worker #define PARK_CODE_VAR 0xE001
659*f6dc9357SAndroid Build Coastguard Worker #define PARK_CODE_SHELL 0xE002
660*f6dc9357SAndroid Build Coastguard Worker #define PARK_CODE_LANG 0xE003
661*f6dc9357SAndroid Build Coastguard Worker
662*f6dc9357SAndroid Build Coastguard Worker #define IS_NS_SPEC_CHAR(c) ((c) >= NS_CODE_SKIP)
663*f6dc9357SAndroid Build Coastguard Worker #define IS_PARK_SPEC_CHAR(c) ((c) >= PARK_CODE_SKIP && (c) <= PARK_CODE_LANG)
664*f6dc9357SAndroid Build Coastguard Worker
665*f6dc9357SAndroid Build Coastguard Worker #define DECODE_NUMBER_FROM_2_CHARS(c0, c1) (((unsigned)(c0) & 0x7F) | (((unsigned)((c1) & 0x7F)) << 7))
666*f6dc9357SAndroid Build Coastguard Worker #define CONVERT_NUMBER_NS_3_UNICODE(n) n = ((n & 0x7F) | (((n >> 8) & 0x7F) << 7))
667*f6dc9357SAndroid Build Coastguard Worker #define CONVERT_NUMBER_PARK(n) n &= 0x7FFF
668*f6dc9357SAndroid Build Coastguard Worker
669*f6dc9357SAndroid Build Coastguard Worker
AreStringsEqual_16and8(const Byte * p16,const char * p8)670*f6dc9357SAndroid Build Coastguard Worker static bool AreStringsEqual_16and8(const Byte *p16, const char *p8)
671*f6dc9357SAndroid Build Coastguard Worker {
672*f6dc9357SAndroid Build Coastguard Worker for (;;)
673*f6dc9357SAndroid Build Coastguard Worker {
674*f6dc9357SAndroid Build Coastguard Worker unsigned c16 = Get16(p16); p16 += 2;
675*f6dc9357SAndroid Build Coastguard Worker unsigned c = (Byte)(*p8++);
676*f6dc9357SAndroid Build Coastguard Worker if (c16 != c)
677*f6dc9357SAndroid Build Coastguard Worker return false;
678*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
679*f6dc9357SAndroid Build Coastguard Worker return true;
680*f6dc9357SAndroid Build Coastguard Worker }
681*f6dc9357SAndroid Build Coastguard Worker }
682*f6dc9357SAndroid Build Coastguard Worker
GetShellString(AString & s,unsigned index1,unsigned index2)683*f6dc9357SAndroid Build Coastguard Worker void CInArchive::GetShellString(AString &s, unsigned index1, unsigned index2)
684*f6dc9357SAndroid Build Coastguard Worker {
685*f6dc9357SAndroid Build Coastguard Worker // zeros are not allowed here.
686*f6dc9357SAndroid Build Coastguard Worker // if (index1 == 0 || index2 == 0) throw 333;
687*f6dc9357SAndroid Build Coastguard Worker
688*f6dc9357SAndroid Build Coastguard Worker if ((index1 & 0x80) != 0)
689*f6dc9357SAndroid Build Coastguard Worker {
690*f6dc9357SAndroid Build Coastguard Worker unsigned offset = (index1 & 0x3F);
691*f6dc9357SAndroid Build Coastguard Worker
692*f6dc9357SAndroid Build Coastguard Worker /* NSIS reads registry string:
693*f6dc9357SAndroid Build Coastguard Worker keyName = HKLM Software\\Microsoft\\Windows\\CurrentVersion
694*f6dc9357SAndroid Build Coastguard Worker mask = KEY_WOW64_64KEY, If 64-bit flag in index1 is set
695*f6dc9357SAndroid Build Coastguard Worker valueName = string(offset)
696*f6dc9357SAndroid Build Coastguard Worker If registry reading is failed, NSIS uses second parameter (index2)
697*f6dc9357SAndroid Build Coastguard Worker to read string. The recursion is possible in that case in NSIS.
698*f6dc9357SAndroid Build Coastguard Worker We don't parse index2 string. We only set strUsed status for that
699*f6dc9357SAndroid Build Coastguard Worker string (but without recursion). */
700*f6dc9357SAndroid Build Coastguard Worker
701*f6dc9357SAndroid Build Coastguard Worker if (offset >= NumStringChars)
702*f6dc9357SAndroid Build Coastguard Worker {
703*f6dc9357SAndroid Build Coastguard Worker s += kErrorStr;
704*f6dc9357SAndroid Build Coastguard Worker return;
705*f6dc9357SAndroid Build Coastguard Worker }
706*f6dc9357SAndroid Build Coastguard Worker
707*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
708*f6dc9357SAndroid Build Coastguard Worker strUsed[offset] = 1;
709*f6dc9357SAndroid Build Coastguard Worker if (index2 < NumStringChars)
710*f6dc9357SAndroid Build Coastguard Worker strUsed[index2] = 1;
711*f6dc9357SAndroid Build Coastguard Worker #endif
712*f6dc9357SAndroid Build Coastguard Worker
713*f6dc9357SAndroid Build Coastguard Worker const Byte *p = (const Byte *)(_data + _stringsPos);
714*f6dc9357SAndroid Build Coastguard Worker int id = -1;
715*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
716*f6dc9357SAndroid Build Coastguard Worker {
717*f6dc9357SAndroid Build Coastguard Worker p += offset * 2;
718*f6dc9357SAndroid Build Coastguard Worker if (AreStringsEqual_16and8(p, "ProgramFilesDir"))
719*f6dc9357SAndroid Build Coastguard Worker id = 0;
720*f6dc9357SAndroid Build Coastguard Worker else if (AreStringsEqual_16and8(p, "CommonFilesDir"))
721*f6dc9357SAndroid Build Coastguard Worker id = 1;
722*f6dc9357SAndroid Build Coastguard Worker }
723*f6dc9357SAndroid Build Coastguard Worker else
724*f6dc9357SAndroid Build Coastguard Worker {
725*f6dc9357SAndroid Build Coastguard Worker p += offset;
726*f6dc9357SAndroid Build Coastguard Worker if (strcmp((const char *)p, "ProgramFilesDir") == 0)
727*f6dc9357SAndroid Build Coastguard Worker id = 0;
728*f6dc9357SAndroid Build Coastguard Worker else if (strcmp((const char *)p, "CommonFilesDir") == 0)
729*f6dc9357SAndroid Build Coastguard Worker id = 1;
730*f6dc9357SAndroid Build Coastguard Worker }
731*f6dc9357SAndroid Build Coastguard Worker
732*f6dc9357SAndroid Build Coastguard Worker s += ((id >= 0) ? (id == 0 ? "$PROGRAMFILES" : "$COMMONFILES") :
733*f6dc9357SAndroid Build Coastguard Worker "$_ERROR_UNSUPPORTED_VALUE_REGISTRY_");
734*f6dc9357SAndroid Build Coastguard Worker // s += ((index1 & 0x40) != 0) ? "64" : "32";
735*f6dc9357SAndroid Build Coastguard Worker if ((index1 & 0x40) != 0)
736*f6dc9357SAndroid Build Coastguard Worker s += "64";
737*f6dc9357SAndroid Build Coastguard Worker
738*f6dc9357SAndroid Build Coastguard Worker if (id < 0)
739*f6dc9357SAndroid Build Coastguard Worker {
740*f6dc9357SAndroid Build Coastguard Worker s += '(';
741*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
742*f6dc9357SAndroid Build Coastguard Worker {
743*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < 256; i++)
744*f6dc9357SAndroid Build Coastguard Worker {
745*f6dc9357SAndroid Build Coastguard Worker wchar_t c = Get16(p + i * 2);
746*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
747*f6dc9357SAndroid Build Coastguard Worker break;
748*f6dc9357SAndroid Build Coastguard Worker if (c < 0x80)
749*f6dc9357SAndroid Build Coastguard Worker s += (char)c;
750*f6dc9357SAndroid Build Coastguard Worker }
751*f6dc9357SAndroid Build Coastguard Worker }
752*f6dc9357SAndroid Build Coastguard Worker else
753*f6dc9357SAndroid Build Coastguard Worker s += (const char *)p;
754*f6dc9357SAndroid Build Coastguard Worker s += ')';
755*f6dc9357SAndroid Build Coastguard Worker }
756*f6dc9357SAndroid Build Coastguard Worker return;
757*f6dc9357SAndroid Build Coastguard Worker }
758*f6dc9357SAndroid Build Coastguard Worker
759*f6dc9357SAndroid Build Coastguard Worker s += '$';
760*f6dc9357SAndroid Build Coastguard Worker if (index1 < Z7_ARRAY_SIZE(kShellStrings))
761*f6dc9357SAndroid Build Coastguard Worker {
762*f6dc9357SAndroid Build Coastguard Worker const char *sz = kShellStrings[index1];
763*f6dc9357SAndroid Build Coastguard Worker if (sz)
764*f6dc9357SAndroid Build Coastguard Worker {
765*f6dc9357SAndroid Build Coastguard Worker s += sz;
766*f6dc9357SAndroid Build Coastguard Worker return;
767*f6dc9357SAndroid Build Coastguard Worker }
768*f6dc9357SAndroid Build Coastguard Worker }
769*f6dc9357SAndroid Build Coastguard Worker if (index2 < Z7_ARRAY_SIZE(kShellStrings))
770*f6dc9357SAndroid Build Coastguard Worker {
771*f6dc9357SAndroid Build Coastguard Worker const char *sz = kShellStrings[index2];
772*f6dc9357SAndroid Build Coastguard Worker if (sz)
773*f6dc9357SAndroid Build Coastguard Worker {
774*f6dc9357SAndroid Build Coastguard Worker s += sz;
775*f6dc9357SAndroid Build Coastguard Worker return;
776*f6dc9357SAndroid Build Coastguard Worker }
777*f6dc9357SAndroid Build Coastguard Worker }
778*f6dc9357SAndroid Build Coastguard Worker s += "_ERROR_UNSUPPORTED_SHELL_";
779*f6dc9357SAndroid Build Coastguard Worker s += '[';
780*f6dc9357SAndroid Build Coastguard Worker UIntToString(s, index1);
781*f6dc9357SAndroid Build Coastguard Worker s += ',';
782*f6dc9357SAndroid Build Coastguard Worker UIntToString(s, index2);
783*f6dc9357SAndroid Build Coastguard Worker s += ']';
784*f6dc9357SAndroid Build Coastguard Worker }
785*f6dc9357SAndroid Build Coastguard Worker
786*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
787*f6dc9357SAndroid Build Coastguard Worker
Add_LangStr_Simple(UInt32 id)788*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_LangStr_Simple(UInt32 id)
789*f6dc9357SAndroid Build Coastguard Worker {
790*f6dc9357SAndroid Build Coastguard Worker Script += "LSTR_";
791*f6dc9357SAndroid Build Coastguard Worker Add_UInt(id);
792*f6dc9357SAndroid Build Coastguard Worker }
793*f6dc9357SAndroid Build Coastguard Worker
794*f6dc9357SAndroid Build Coastguard Worker #endif
795*f6dc9357SAndroid Build Coastguard Worker
Add_LangStr(AString & res,UInt32 id)796*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_LangStr(AString &res, UInt32 id)
797*f6dc9357SAndroid Build Coastguard Worker {
798*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
799*f6dc9357SAndroid Build Coastguard Worker langStrIDs.Add(id);
800*f6dc9357SAndroid Build Coastguard Worker #endif
801*f6dc9357SAndroid Build Coastguard Worker res += "$(LSTR_";
802*f6dc9357SAndroid Build Coastguard Worker UIntToString(res, id);
803*f6dc9357SAndroid Build Coastguard Worker res += ')';
804*f6dc9357SAndroid Build Coastguard Worker }
805*f6dc9357SAndroid Build Coastguard Worker
GetNsisString_Raw(const Byte * s)806*f6dc9357SAndroid Build Coastguard Worker void CInArchive::GetNsisString_Raw(const Byte *s)
807*f6dc9357SAndroid Build Coastguard Worker {
808*f6dc9357SAndroid Build Coastguard Worker Raw_AString.Empty();
809*f6dc9357SAndroid Build Coastguard Worker
810*f6dc9357SAndroid Build Coastguard Worker if (NsisType != k_NsisType_Nsis3)
811*f6dc9357SAndroid Build Coastguard Worker {
812*f6dc9357SAndroid Build Coastguard Worker for (;;)
813*f6dc9357SAndroid Build Coastguard Worker {
814*f6dc9357SAndroid Build Coastguard Worker Byte c = *s++;
815*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
816*f6dc9357SAndroid Build Coastguard Worker return;
817*f6dc9357SAndroid Build Coastguard Worker if (IS_NS_SPEC_CHAR(c))
818*f6dc9357SAndroid Build Coastguard Worker {
819*f6dc9357SAndroid Build Coastguard Worker Byte c0 = *s++;
820*f6dc9357SAndroid Build Coastguard Worker if (c0 == 0)
821*f6dc9357SAndroid Build Coastguard Worker return;
822*f6dc9357SAndroid Build Coastguard Worker if (c != NS_CODE_SKIP)
823*f6dc9357SAndroid Build Coastguard Worker {
824*f6dc9357SAndroid Build Coastguard Worker Byte c1 = *s++;
825*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0)
826*f6dc9357SAndroid Build Coastguard Worker return;
827*f6dc9357SAndroid Build Coastguard Worker
828*f6dc9357SAndroid Build Coastguard Worker if (c == NS_CODE_SHELL)
829*f6dc9357SAndroid Build Coastguard Worker GetShellString(Raw_AString, c0, c1);
830*f6dc9357SAndroid Build Coastguard Worker else
831*f6dc9357SAndroid Build Coastguard Worker {
832*f6dc9357SAndroid Build Coastguard Worker unsigned n = DECODE_NUMBER_FROM_2_CHARS(c0, c1);
833*f6dc9357SAndroid Build Coastguard Worker if (c == NS_CODE_VAR)
834*f6dc9357SAndroid Build Coastguard Worker GetVar(Raw_AString, n);
835*f6dc9357SAndroid Build Coastguard Worker else // if (c == NS_CODE_LANG)
836*f6dc9357SAndroid Build Coastguard Worker Add_LangStr(Raw_AString, n);
837*f6dc9357SAndroid Build Coastguard Worker }
838*f6dc9357SAndroid Build Coastguard Worker continue;
839*f6dc9357SAndroid Build Coastguard Worker }
840*f6dc9357SAndroid Build Coastguard Worker c = c0;
841*f6dc9357SAndroid Build Coastguard Worker }
842*f6dc9357SAndroid Build Coastguard Worker Raw_AString += (char)c;
843*f6dc9357SAndroid Build Coastguard Worker }
844*f6dc9357SAndroid Build Coastguard Worker }
845*f6dc9357SAndroid Build Coastguard Worker
846*f6dc9357SAndroid Build Coastguard Worker // NSIS-3 ANSI
847*f6dc9357SAndroid Build Coastguard Worker for (;;)
848*f6dc9357SAndroid Build Coastguard Worker {
849*f6dc9357SAndroid Build Coastguard Worker Byte c = *s++;
850*f6dc9357SAndroid Build Coastguard Worker if (c <= NS_3_CODE_SKIP)
851*f6dc9357SAndroid Build Coastguard Worker {
852*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
853*f6dc9357SAndroid Build Coastguard Worker return;
854*f6dc9357SAndroid Build Coastguard Worker Byte c0 = *s++;
855*f6dc9357SAndroid Build Coastguard Worker if (c0 == 0)
856*f6dc9357SAndroid Build Coastguard Worker return;
857*f6dc9357SAndroid Build Coastguard Worker if (c != NS_3_CODE_SKIP)
858*f6dc9357SAndroid Build Coastguard Worker {
859*f6dc9357SAndroid Build Coastguard Worker Byte c1 = *s++;
860*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0)
861*f6dc9357SAndroid Build Coastguard Worker return;
862*f6dc9357SAndroid Build Coastguard Worker
863*f6dc9357SAndroid Build Coastguard Worker if (c == NS_3_CODE_SHELL)
864*f6dc9357SAndroid Build Coastguard Worker GetShellString(Raw_AString, c0, c1);
865*f6dc9357SAndroid Build Coastguard Worker else
866*f6dc9357SAndroid Build Coastguard Worker {
867*f6dc9357SAndroid Build Coastguard Worker unsigned n = DECODE_NUMBER_FROM_2_CHARS(c0, c1);
868*f6dc9357SAndroid Build Coastguard Worker if (c == NS_3_CODE_VAR)
869*f6dc9357SAndroid Build Coastguard Worker GetVar(Raw_AString, n);
870*f6dc9357SAndroid Build Coastguard Worker else // if (c == NS_3_CODE_LANG)
871*f6dc9357SAndroid Build Coastguard Worker Add_LangStr(Raw_AString, n);
872*f6dc9357SAndroid Build Coastguard Worker }
873*f6dc9357SAndroid Build Coastguard Worker continue;
874*f6dc9357SAndroid Build Coastguard Worker }
875*f6dc9357SAndroid Build Coastguard Worker c = c0;
876*f6dc9357SAndroid Build Coastguard Worker }
877*f6dc9357SAndroid Build Coastguard Worker Raw_AString += (char)c;
878*f6dc9357SAndroid Build Coastguard Worker }
879*f6dc9357SAndroid Build Coastguard Worker }
880*f6dc9357SAndroid Build Coastguard Worker
881*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
882*f6dc9357SAndroid Build Coastguard Worker
GetNsisString(AString & res,const Byte * s)883*f6dc9357SAndroid Build Coastguard Worker void CInArchive::GetNsisString(AString &res, const Byte *s)
884*f6dc9357SAndroid Build Coastguard Worker {
885*f6dc9357SAndroid Build Coastguard Worker for (;;)
886*f6dc9357SAndroid Build Coastguard Worker {
887*f6dc9357SAndroid Build Coastguard Worker Byte c = *s++;
888*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
889*f6dc9357SAndroid Build Coastguard Worker return;
890*f6dc9357SAndroid Build Coastguard Worker if (NsisType != k_NsisType_Nsis3)
891*f6dc9357SAndroid Build Coastguard Worker {
892*f6dc9357SAndroid Build Coastguard Worker if (IS_NS_SPEC_CHAR(c))
893*f6dc9357SAndroid Build Coastguard Worker {
894*f6dc9357SAndroid Build Coastguard Worker Byte c0 = *s++;
895*f6dc9357SAndroid Build Coastguard Worker if (c0 == 0)
896*f6dc9357SAndroid Build Coastguard Worker return;
897*f6dc9357SAndroid Build Coastguard Worker if (c != NS_CODE_SKIP)
898*f6dc9357SAndroid Build Coastguard Worker {
899*f6dc9357SAndroid Build Coastguard Worker Byte c1 = *s++;
900*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0)
901*f6dc9357SAndroid Build Coastguard Worker return;
902*f6dc9357SAndroid Build Coastguard Worker if (c == NS_CODE_SHELL)
903*f6dc9357SAndroid Build Coastguard Worker GetShellString(res, c0, c1);
904*f6dc9357SAndroid Build Coastguard Worker else
905*f6dc9357SAndroid Build Coastguard Worker {
906*f6dc9357SAndroid Build Coastguard Worker unsigned n = DECODE_NUMBER_FROM_2_CHARS(c0, c1);
907*f6dc9357SAndroid Build Coastguard Worker if (c == NS_CODE_VAR)
908*f6dc9357SAndroid Build Coastguard Worker GetVar(res, n);
909*f6dc9357SAndroid Build Coastguard Worker else // if (c == NS_CODE_LANG)
910*f6dc9357SAndroid Build Coastguard Worker Add_LangStr(res, n);
911*f6dc9357SAndroid Build Coastguard Worker }
912*f6dc9357SAndroid Build Coastguard Worker continue;
913*f6dc9357SAndroid Build Coastguard Worker }
914*f6dc9357SAndroid Build Coastguard Worker c = c0;
915*f6dc9357SAndroid Build Coastguard Worker }
916*f6dc9357SAndroid Build Coastguard Worker }
917*f6dc9357SAndroid Build Coastguard Worker else
918*f6dc9357SAndroid Build Coastguard Worker {
919*f6dc9357SAndroid Build Coastguard Worker // NSIS-3 ANSI
920*f6dc9357SAndroid Build Coastguard Worker if (c <= NS_3_CODE_SKIP)
921*f6dc9357SAndroid Build Coastguard Worker {
922*f6dc9357SAndroid Build Coastguard Worker Byte c0 = *s++;
923*f6dc9357SAndroid Build Coastguard Worker if (c0 == 0)
924*f6dc9357SAndroid Build Coastguard Worker return;
925*f6dc9357SAndroid Build Coastguard Worker if (c0 == 0)
926*f6dc9357SAndroid Build Coastguard Worker break;
927*f6dc9357SAndroid Build Coastguard Worker if (c != NS_3_CODE_SKIP)
928*f6dc9357SAndroid Build Coastguard Worker {
929*f6dc9357SAndroid Build Coastguard Worker Byte c1 = *s++;
930*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0)
931*f6dc9357SAndroid Build Coastguard Worker return;
932*f6dc9357SAndroid Build Coastguard Worker if (c == NS_3_CODE_SHELL)
933*f6dc9357SAndroid Build Coastguard Worker GetShellString(res, c0, c1);
934*f6dc9357SAndroid Build Coastguard Worker else
935*f6dc9357SAndroid Build Coastguard Worker {
936*f6dc9357SAndroid Build Coastguard Worker unsigned n = DECODE_NUMBER_FROM_2_CHARS(c0, c1);
937*f6dc9357SAndroid Build Coastguard Worker if (c == NS_3_CODE_VAR)
938*f6dc9357SAndroid Build Coastguard Worker GetVar(res, n);
939*f6dc9357SAndroid Build Coastguard Worker else // if (c == NS_3_CODE_LANG)
940*f6dc9357SAndroid Build Coastguard Worker Add_LangStr(res, n);
941*f6dc9357SAndroid Build Coastguard Worker }
942*f6dc9357SAndroid Build Coastguard Worker continue;
943*f6dc9357SAndroid Build Coastguard Worker }
944*f6dc9357SAndroid Build Coastguard Worker c = c0;
945*f6dc9357SAndroid Build Coastguard Worker }
946*f6dc9357SAndroid Build Coastguard Worker }
947*f6dc9357SAndroid Build Coastguard Worker
948*f6dc9357SAndroid Build Coastguard Worker {
949*f6dc9357SAndroid Build Coastguard Worker const char *e;
950*f6dc9357SAndroid Build Coastguard Worker if (c == 9) e = "$\\t";
951*f6dc9357SAndroid Build Coastguard Worker else if (c == 10) e = "$\\n";
952*f6dc9357SAndroid Build Coastguard Worker else if (c == 13) e = "$\\r";
953*f6dc9357SAndroid Build Coastguard Worker else if (c == '"') e = "$\\\"";
954*f6dc9357SAndroid Build Coastguard Worker else if (c == '$') e = "$$";
955*f6dc9357SAndroid Build Coastguard Worker else
956*f6dc9357SAndroid Build Coastguard Worker {
957*f6dc9357SAndroid Build Coastguard Worker res += (char)c;
958*f6dc9357SAndroid Build Coastguard Worker continue;
959*f6dc9357SAndroid Build Coastguard Worker }
960*f6dc9357SAndroid Build Coastguard Worker res += e;
961*f6dc9357SAndroid Build Coastguard Worker continue;
962*f6dc9357SAndroid Build Coastguard Worker }
963*f6dc9357SAndroid Build Coastguard Worker }
964*f6dc9357SAndroid Build Coastguard Worker }
965*f6dc9357SAndroid Build Coastguard Worker
966*f6dc9357SAndroid Build Coastguard Worker #endif
967*f6dc9357SAndroid Build Coastguard Worker
GetNsisString_Unicode_Raw(const Byte * p)968*f6dc9357SAndroid Build Coastguard Worker void CInArchive::GetNsisString_Unicode_Raw(const Byte *p)
969*f6dc9357SAndroid Build Coastguard Worker {
970*f6dc9357SAndroid Build Coastguard Worker Raw_UString.Empty();
971*f6dc9357SAndroid Build Coastguard Worker
972*f6dc9357SAndroid Build Coastguard Worker if (IsPark())
973*f6dc9357SAndroid Build Coastguard Worker {
974*f6dc9357SAndroid Build Coastguard Worker for (;;)
975*f6dc9357SAndroid Build Coastguard Worker {
976*f6dc9357SAndroid Build Coastguard Worker unsigned c = Get16(p);
977*f6dc9357SAndroid Build Coastguard Worker p += 2;
978*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
979*f6dc9357SAndroid Build Coastguard Worker break;
980*f6dc9357SAndroid Build Coastguard Worker if (c < 0x80)
981*f6dc9357SAndroid Build Coastguard Worker {
982*f6dc9357SAndroid Build Coastguard Worker Raw_UString.Add_Char((char)c);
983*f6dc9357SAndroid Build Coastguard Worker continue;
984*f6dc9357SAndroid Build Coastguard Worker }
985*f6dc9357SAndroid Build Coastguard Worker
986*f6dc9357SAndroid Build Coastguard Worker if (IS_PARK_SPEC_CHAR(c))
987*f6dc9357SAndroid Build Coastguard Worker {
988*f6dc9357SAndroid Build Coastguard Worker unsigned n = Get16(p);
989*f6dc9357SAndroid Build Coastguard Worker p += 2;
990*f6dc9357SAndroid Build Coastguard Worker if (n == 0)
991*f6dc9357SAndroid Build Coastguard Worker break;
992*f6dc9357SAndroid Build Coastguard Worker if (c != PARK_CODE_SKIP)
993*f6dc9357SAndroid Build Coastguard Worker {
994*f6dc9357SAndroid Build Coastguard Worker Raw_AString.Empty();
995*f6dc9357SAndroid Build Coastguard Worker if (c == PARK_CODE_SHELL)
996*f6dc9357SAndroid Build Coastguard Worker GetShellString(Raw_AString, n & 0xFF, n >> 8);
997*f6dc9357SAndroid Build Coastguard Worker else
998*f6dc9357SAndroid Build Coastguard Worker {
999*f6dc9357SAndroid Build Coastguard Worker CONVERT_NUMBER_PARK(n);
1000*f6dc9357SAndroid Build Coastguard Worker if (c == PARK_CODE_VAR)
1001*f6dc9357SAndroid Build Coastguard Worker GetVar(Raw_AString, n);
1002*f6dc9357SAndroid Build Coastguard Worker else // if (c == PARK_CODE_LANG)
1003*f6dc9357SAndroid Build Coastguard Worker Add_LangStr(Raw_AString, n);
1004*f6dc9357SAndroid Build Coastguard Worker }
1005*f6dc9357SAndroid Build Coastguard Worker Raw_UString += Raw_AString.Ptr(); // check it !
1006*f6dc9357SAndroid Build Coastguard Worker continue;
1007*f6dc9357SAndroid Build Coastguard Worker }
1008*f6dc9357SAndroid Build Coastguard Worker c = n;
1009*f6dc9357SAndroid Build Coastguard Worker }
1010*f6dc9357SAndroid Build Coastguard Worker
1011*f6dc9357SAndroid Build Coastguard Worker Raw_UString += (wchar_t)c;
1012*f6dc9357SAndroid Build Coastguard Worker }
1013*f6dc9357SAndroid Build Coastguard Worker
1014*f6dc9357SAndroid Build Coastguard Worker return;
1015*f6dc9357SAndroid Build Coastguard Worker }
1016*f6dc9357SAndroid Build Coastguard Worker
1017*f6dc9357SAndroid Build Coastguard Worker // NSIS-3 Unicode
1018*f6dc9357SAndroid Build Coastguard Worker for (;;)
1019*f6dc9357SAndroid Build Coastguard Worker {
1020*f6dc9357SAndroid Build Coastguard Worker unsigned c = Get16(p);
1021*f6dc9357SAndroid Build Coastguard Worker p += 2;
1022*f6dc9357SAndroid Build Coastguard Worker if (c > NS_3_CODE_SKIP)
1023*f6dc9357SAndroid Build Coastguard Worker {
1024*f6dc9357SAndroid Build Coastguard Worker Raw_UString += (wchar_t)c;
1025*f6dc9357SAndroid Build Coastguard Worker continue;
1026*f6dc9357SAndroid Build Coastguard Worker }
1027*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1028*f6dc9357SAndroid Build Coastguard Worker break;
1029*f6dc9357SAndroid Build Coastguard Worker
1030*f6dc9357SAndroid Build Coastguard Worker unsigned n = Get16(p);
1031*f6dc9357SAndroid Build Coastguard Worker p += 2;
1032*f6dc9357SAndroid Build Coastguard Worker if (n == 0)
1033*f6dc9357SAndroid Build Coastguard Worker break;
1034*f6dc9357SAndroid Build Coastguard Worker if (c == NS_3_CODE_SKIP)
1035*f6dc9357SAndroid Build Coastguard Worker {
1036*f6dc9357SAndroid Build Coastguard Worker Raw_UString += (wchar_t)n;
1037*f6dc9357SAndroid Build Coastguard Worker continue;
1038*f6dc9357SAndroid Build Coastguard Worker }
1039*f6dc9357SAndroid Build Coastguard Worker
1040*f6dc9357SAndroid Build Coastguard Worker Raw_AString.Empty();
1041*f6dc9357SAndroid Build Coastguard Worker if (c == NS_3_CODE_SHELL)
1042*f6dc9357SAndroid Build Coastguard Worker GetShellString(Raw_AString, n & 0xFF, n >> 8);
1043*f6dc9357SAndroid Build Coastguard Worker else
1044*f6dc9357SAndroid Build Coastguard Worker {
1045*f6dc9357SAndroid Build Coastguard Worker CONVERT_NUMBER_NS_3_UNICODE(n);
1046*f6dc9357SAndroid Build Coastguard Worker if (c == NS_3_CODE_VAR)
1047*f6dc9357SAndroid Build Coastguard Worker GetVar(Raw_AString, n);
1048*f6dc9357SAndroid Build Coastguard Worker else // if (c == NS_3_CODE_LANG)
1049*f6dc9357SAndroid Build Coastguard Worker Add_LangStr(Raw_AString, n);
1050*f6dc9357SAndroid Build Coastguard Worker }
1051*f6dc9357SAndroid Build Coastguard Worker Raw_UString += Raw_AString.Ptr();
1052*f6dc9357SAndroid Build Coastguard Worker }
1053*f6dc9357SAndroid Build Coastguard Worker }
1054*f6dc9357SAndroid Build Coastguard Worker
1055*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
1056*f6dc9357SAndroid Build Coastguard Worker
1057*f6dc9357SAndroid Build Coastguard Worker static const Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
1058*f6dc9357SAndroid Build Coastguard Worker
GetNsisString_Unicode(AString & res,const Byte * p)1059*f6dc9357SAndroid Build Coastguard Worker void CInArchive::GetNsisString_Unicode(AString &res, const Byte *p)
1060*f6dc9357SAndroid Build Coastguard Worker {
1061*f6dc9357SAndroid Build Coastguard Worker for (;;)
1062*f6dc9357SAndroid Build Coastguard Worker {
1063*f6dc9357SAndroid Build Coastguard Worker unsigned c = Get16(p);
1064*f6dc9357SAndroid Build Coastguard Worker p += 2;
1065*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1066*f6dc9357SAndroid Build Coastguard Worker break;
1067*f6dc9357SAndroid Build Coastguard Worker if (IsPark())
1068*f6dc9357SAndroid Build Coastguard Worker {
1069*f6dc9357SAndroid Build Coastguard Worker if (IS_PARK_SPEC_CHAR(c))
1070*f6dc9357SAndroid Build Coastguard Worker {
1071*f6dc9357SAndroid Build Coastguard Worker unsigned n = Get16(p);
1072*f6dc9357SAndroid Build Coastguard Worker p += 2;
1073*f6dc9357SAndroid Build Coastguard Worker if (n == 0)
1074*f6dc9357SAndroid Build Coastguard Worker break;
1075*f6dc9357SAndroid Build Coastguard Worker if (c != PARK_CODE_SKIP)
1076*f6dc9357SAndroid Build Coastguard Worker {
1077*f6dc9357SAndroid Build Coastguard Worker if (c == PARK_CODE_SHELL)
1078*f6dc9357SAndroid Build Coastguard Worker GetShellString(res, n & 0xFF, n >> 8);
1079*f6dc9357SAndroid Build Coastguard Worker else
1080*f6dc9357SAndroid Build Coastguard Worker {
1081*f6dc9357SAndroid Build Coastguard Worker CONVERT_NUMBER_PARK(n);
1082*f6dc9357SAndroid Build Coastguard Worker if (c == PARK_CODE_VAR)
1083*f6dc9357SAndroid Build Coastguard Worker GetVar(res, n);
1084*f6dc9357SAndroid Build Coastguard Worker else // if (c == PARK_CODE_LANG)
1085*f6dc9357SAndroid Build Coastguard Worker Add_LangStr(res, n);
1086*f6dc9357SAndroid Build Coastguard Worker }
1087*f6dc9357SAndroid Build Coastguard Worker continue;
1088*f6dc9357SAndroid Build Coastguard Worker }
1089*f6dc9357SAndroid Build Coastguard Worker c = n;
1090*f6dc9357SAndroid Build Coastguard Worker }
1091*f6dc9357SAndroid Build Coastguard Worker }
1092*f6dc9357SAndroid Build Coastguard Worker else
1093*f6dc9357SAndroid Build Coastguard Worker {
1094*f6dc9357SAndroid Build Coastguard Worker // NSIS-3 Unicode
1095*f6dc9357SAndroid Build Coastguard Worker if (c <= NS_3_CODE_SKIP)
1096*f6dc9357SAndroid Build Coastguard Worker {
1097*f6dc9357SAndroid Build Coastguard Worker unsigned n = Get16(p);
1098*f6dc9357SAndroid Build Coastguard Worker p += 2;
1099*f6dc9357SAndroid Build Coastguard Worker if (n == 0)
1100*f6dc9357SAndroid Build Coastguard Worker break;
1101*f6dc9357SAndroid Build Coastguard Worker if (c != NS_3_CODE_SKIP)
1102*f6dc9357SAndroid Build Coastguard Worker {
1103*f6dc9357SAndroid Build Coastguard Worker if (c == NS_3_CODE_SHELL)
1104*f6dc9357SAndroid Build Coastguard Worker GetShellString(res, n & 0xFF, n >> 8);
1105*f6dc9357SAndroid Build Coastguard Worker else
1106*f6dc9357SAndroid Build Coastguard Worker {
1107*f6dc9357SAndroid Build Coastguard Worker CONVERT_NUMBER_NS_3_UNICODE(n);
1108*f6dc9357SAndroid Build Coastguard Worker if (c == NS_3_CODE_VAR)
1109*f6dc9357SAndroid Build Coastguard Worker GetVar(res, n);
1110*f6dc9357SAndroid Build Coastguard Worker else // if (c == NS_3_CODE_LANG)
1111*f6dc9357SAndroid Build Coastguard Worker Add_LangStr(res, n);
1112*f6dc9357SAndroid Build Coastguard Worker }
1113*f6dc9357SAndroid Build Coastguard Worker continue;
1114*f6dc9357SAndroid Build Coastguard Worker }
1115*f6dc9357SAndroid Build Coastguard Worker c = n;
1116*f6dc9357SAndroid Build Coastguard Worker }
1117*f6dc9357SAndroid Build Coastguard Worker }
1118*f6dc9357SAndroid Build Coastguard Worker
1119*f6dc9357SAndroid Build Coastguard Worker if (c < 0x80)
1120*f6dc9357SAndroid Build Coastguard Worker {
1121*f6dc9357SAndroid Build Coastguard Worker const char *e;
1122*f6dc9357SAndroid Build Coastguard Worker if (c == 9) e = "$\\t";
1123*f6dc9357SAndroid Build Coastguard Worker else if (c == 10) e = "$\\n";
1124*f6dc9357SAndroid Build Coastguard Worker else if (c == 13) e = "$\\r";
1125*f6dc9357SAndroid Build Coastguard Worker else if (c == '"') e = "$\\\"";
1126*f6dc9357SAndroid Build Coastguard Worker else if (c == '$') e = "$$";
1127*f6dc9357SAndroid Build Coastguard Worker else
1128*f6dc9357SAndroid Build Coastguard Worker {
1129*f6dc9357SAndroid Build Coastguard Worker res += (char)c;
1130*f6dc9357SAndroid Build Coastguard Worker continue;
1131*f6dc9357SAndroid Build Coastguard Worker }
1132*f6dc9357SAndroid Build Coastguard Worker res += e;
1133*f6dc9357SAndroid Build Coastguard Worker continue;
1134*f6dc9357SAndroid Build Coastguard Worker }
1135*f6dc9357SAndroid Build Coastguard Worker
1136*f6dc9357SAndroid Build Coastguard Worker UInt32 value = c;
1137*f6dc9357SAndroid Build Coastguard Worker /*
1138*f6dc9357SAndroid Build Coastguard Worker if (value >= 0xD800 && value < 0xE000)
1139*f6dc9357SAndroid Build Coastguard Worker {
1140*f6dc9357SAndroid Build Coastguard Worker UInt32 c2;
1141*f6dc9357SAndroid Build Coastguard Worker if (value >= 0xDC00 || srcPos == srcLen)
1142*f6dc9357SAndroid Build Coastguard Worker break;
1143*f6dc9357SAndroid Build Coastguard Worker c2 = src[srcPos++];
1144*f6dc9357SAndroid Build Coastguard Worker if (c2 < 0xDC00 || c2 >= 0xE000)
1145*f6dc9357SAndroid Build Coastguard Worker break;
1146*f6dc9357SAndroid Build Coastguard Worker value = (((value - 0xD800) << 10) | (c2 - 0xDC00)) + 0x10000;
1147*f6dc9357SAndroid Build Coastguard Worker }
1148*f6dc9357SAndroid Build Coastguard Worker */
1149*f6dc9357SAndroid Build Coastguard Worker unsigned numAdds;
1150*f6dc9357SAndroid Build Coastguard Worker for (numAdds = 1; numAdds < 5; numAdds++)
1151*f6dc9357SAndroid Build Coastguard Worker if (value < (((UInt32)1) << (numAdds * 5 + 6)))
1152*f6dc9357SAndroid Build Coastguard Worker break;
1153*f6dc9357SAndroid Build Coastguard Worker res += (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds)));
1154*f6dc9357SAndroid Build Coastguard Worker do
1155*f6dc9357SAndroid Build Coastguard Worker {
1156*f6dc9357SAndroid Build Coastguard Worker numAdds--;
1157*f6dc9357SAndroid Build Coastguard Worker res += (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F));
1158*f6dc9357SAndroid Build Coastguard Worker // destPos++;
1159*f6dc9357SAndroid Build Coastguard Worker }
1160*f6dc9357SAndroid Build Coastguard Worker while (numAdds != 0);
1161*f6dc9357SAndroid Build Coastguard Worker
1162*f6dc9357SAndroid Build Coastguard Worker // AddToUtf8(res, c);
1163*f6dc9357SAndroid Build Coastguard Worker }
1164*f6dc9357SAndroid Build Coastguard Worker }
1165*f6dc9357SAndroid Build Coastguard Worker
1166*f6dc9357SAndroid Build Coastguard Worker #endif
1167*f6dc9357SAndroid Build Coastguard Worker
ReadString2_Raw(UInt32 pos)1168*f6dc9357SAndroid Build Coastguard Worker void CInArchive::ReadString2_Raw(UInt32 pos)
1169*f6dc9357SAndroid Build Coastguard Worker {
1170*f6dc9357SAndroid Build Coastguard Worker Raw_AString.Empty();
1171*f6dc9357SAndroid Build Coastguard Worker Raw_UString.Empty();
1172*f6dc9357SAndroid Build Coastguard Worker if ((Int32)pos < 0)
1173*f6dc9357SAndroid Build Coastguard Worker Add_LangStr(Raw_AString, (UInt32)-((Int32)pos + 1));
1174*f6dc9357SAndroid Build Coastguard Worker else if (pos >= NumStringChars)
1175*f6dc9357SAndroid Build Coastguard Worker {
1176*f6dc9357SAndroid Build Coastguard Worker Raw_AString += kErrorStr;
1177*f6dc9357SAndroid Build Coastguard Worker // UIntToString(Raw_AString, pos);
1178*f6dc9357SAndroid Build Coastguard Worker }
1179*f6dc9357SAndroid Build Coastguard Worker else
1180*f6dc9357SAndroid Build Coastguard Worker {
1181*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
1182*f6dc9357SAndroid Build Coastguard Worker GetNsisString_Unicode_Raw(_data + _stringsPos + pos * 2);
1183*f6dc9357SAndroid Build Coastguard Worker else
1184*f6dc9357SAndroid Build Coastguard Worker GetNsisString_Raw(_data + _stringsPos + pos);
1185*f6dc9357SAndroid Build Coastguard Worker return;
1186*f6dc9357SAndroid Build Coastguard Worker }
1187*f6dc9357SAndroid Build Coastguard Worker Raw_UString = Raw_AString.Ptr();
1188*f6dc9357SAndroid Build Coastguard Worker }
1189*f6dc9357SAndroid Build Coastguard Worker
IsGoodString(UInt32 param) const1190*f6dc9357SAndroid Build Coastguard Worker bool CInArchive::IsGoodString(UInt32 param) const
1191*f6dc9357SAndroid Build Coastguard Worker {
1192*f6dc9357SAndroid Build Coastguard Worker if (param >= NumStringChars)
1193*f6dc9357SAndroid Build Coastguard Worker return false;
1194*f6dc9357SAndroid Build Coastguard Worker if (param == 0)
1195*f6dc9357SAndroid Build Coastguard Worker return true;
1196*f6dc9357SAndroid Build Coastguard Worker const Byte *p = _data + _stringsPos;
1197*f6dc9357SAndroid Build Coastguard Worker unsigned c;
1198*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
1199*f6dc9357SAndroid Build Coastguard Worker c = Get16(p + param * 2 - 2);
1200*f6dc9357SAndroid Build Coastguard Worker else
1201*f6dc9357SAndroid Build Coastguard Worker c = p[param - 1];
1202*f6dc9357SAndroid Build Coastguard Worker // some files have '\\' character before string?
1203*f6dc9357SAndroid Build Coastguard Worker return (c == 0 || c == '\\');
1204*f6dc9357SAndroid Build Coastguard Worker }
1205*f6dc9357SAndroid Build Coastguard Worker
AreTwoParamStringsEqual(UInt32 param1,UInt32 param2) const1206*f6dc9357SAndroid Build Coastguard Worker bool CInArchive::AreTwoParamStringsEqual(UInt32 param1, UInt32 param2) const
1207*f6dc9357SAndroid Build Coastguard Worker {
1208*f6dc9357SAndroid Build Coastguard Worker if (param1 == param2)
1209*f6dc9357SAndroid Build Coastguard Worker return true;
1210*f6dc9357SAndroid Build Coastguard Worker
1211*f6dc9357SAndroid Build Coastguard Worker /* NSIS-3.0a1 probably contains bug, so it can use 2 different strings
1212*f6dc9357SAndroid Build Coastguard Worker with same content. So we check real string also.
1213*f6dc9357SAndroid Build Coastguard Worker Also it's possible to check identical postfix parts of strings. */
1214*f6dc9357SAndroid Build Coastguard Worker
1215*f6dc9357SAndroid Build Coastguard Worker if (param1 >= NumStringChars ||
1216*f6dc9357SAndroid Build Coastguard Worker param2 >= NumStringChars)
1217*f6dc9357SAndroid Build Coastguard Worker return false;
1218*f6dc9357SAndroid Build Coastguard Worker
1219*f6dc9357SAndroid Build Coastguard Worker const Byte *p = _data + _stringsPos;
1220*f6dc9357SAndroid Build Coastguard Worker
1221*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
1222*f6dc9357SAndroid Build Coastguard Worker {
1223*f6dc9357SAndroid Build Coastguard Worker const Byte *p1 = p + param1 * 2;
1224*f6dc9357SAndroid Build Coastguard Worker const Byte *p2 = p + param2 * 2;
1225*f6dc9357SAndroid Build Coastguard Worker for (;;)
1226*f6dc9357SAndroid Build Coastguard Worker {
1227*f6dc9357SAndroid Build Coastguard Worker UInt16 c = Get16(p1);
1228*f6dc9357SAndroid Build Coastguard Worker if (c != Get16(p2))
1229*f6dc9357SAndroid Build Coastguard Worker return false;
1230*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1231*f6dc9357SAndroid Build Coastguard Worker return true;
1232*f6dc9357SAndroid Build Coastguard Worker p1 += 2;
1233*f6dc9357SAndroid Build Coastguard Worker p2 += 2;
1234*f6dc9357SAndroid Build Coastguard Worker }
1235*f6dc9357SAndroid Build Coastguard Worker }
1236*f6dc9357SAndroid Build Coastguard Worker else
1237*f6dc9357SAndroid Build Coastguard Worker {
1238*f6dc9357SAndroid Build Coastguard Worker const Byte *p1 = p + param1;
1239*f6dc9357SAndroid Build Coastguard Worker const Byte *p2 = p + param2;
1240*f6dc9357SAndroid Build Coastguard Worker for (;;)
1241*f6dc9357SAndroid Build Coastguard Worker {
1242*f6dc9357SAndroid Build Coastguard Worker Byte c = *p1++;
1243*f6dc9357SAndroid Build Coastguard Worker if (c != *p2++)
1244*f6dc9357SAndroid Build Coastguard Worker return false;
1245*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1246*f6dc9357SAndroid Build Coastguard Worker return true;
1247*f6dc9357SAndroid Build Coastguard Worker }
1248*f6dc9357SAndroid Build Coastguard Worker }
1249*f6dc9357SAndroid Build Coastguard Worker }
1250*f6dc9357SAndroid Build Coastguard Worker
1251*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
1252*f6dc9357SAndroid Build Coastguard Worker
GetNumUsedVars() const1253*f6dc9357SAndroid Build Coastguard Worker UInt32 CInArchive::GetNumUsedVars() const
1254*f6dc9357SAndroid Build Coastguard Worker {
1255*f6dc9357SAndroid Build Coastguard Worker UInt32 numUsedVars = 0;
1256*f6dc9357SAndroid Build Coastguard Worker const Byte *data = (const Byte *)_data + _stringsPos;
1257*f6dc9357SAndroid Build Coastguard Worker unsigned npi = 0;
1258*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < NumStringChars;)
1259*f6dc9357SAndroid Build Coastguard Worker {
1260*f6dc9357SAndroid Build Coastguard Worker bool process = true;
1261*f6dc9357SAndroid Build Coastguard Worker if (npi < noParseStringIndexes.Size() && noParseStringIndexes[npi] == i)
1262*f6dc9357SAndroid Build Coastguard Worker {
1263*f6dc9357SAndroid Build Coastguard Worker process = false;
1264*f6dc9357SAndroid Build Coastguard Worker npi++;
1265*f6dc9357SAndroid Build Coastguard Worker }
1266*f6dc9357SAndroid Build Coastguard Worker
1267*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
1268*f6dc9357SAndroid Build Coastguard Worker {
1269*f6dc9357SAndroid Build Coastguard Worker if (IsPark())
1270*f6dc9357SAndroid Build Coastguard Worker {
1271*f6dc9357SAndroid Build Coastguard Worker for (;;)
1272*f6dc9357SAndroid Build Coastguard Worker {
1273*f6dc9357SAndroid Build Coastguard Worker unsigned c = Get16(data + i * 2);
1274*f6dc9357SAndroid Build Coastguard Worker i++;
1275*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1276*f6dc9357SAndroid Build Coastguard Worker break;
1277*f6dc9357SAndroid Build Coastguard Worker if (IS_PARK_SPEC_CHAR(c))
1278*f6dc9357SAndroid Build Coastguard Worker {
1279*f6dc9357SAndroid Build Coastguard Worker UInt32 n = Get16(data + i * 2);
1280*f6dc9357SAndroid Build Coastguard Worker i++;
1281*f6dc9357SAndroid Build Coastguard Worker if (n == 0)
1282*f6dc9357SAndroid Build Coastguard Worker break;
1283*f6dc9357SAndroid Build Coastguard Worker if (process && c == PARK_CODE_VAR)
1284*f6dc9357SAndroid Build Coastguard Worker {
1285*f6dc9357SAndroid Build Coastguard Worker CONVERT_NUMBER_PARK(n);
1286*f6dc9357SAndroid Build Coastguard Worker n++;
1287*f6dc9357SAndroid Build Coastguard Worker if (numUsedVars < n)
1288*f6dc9357SAndroid Build Coastguard Worker numUsedVars = n;
1289*f6dc9357SAndroid Build Coastguard Worker }
1290*f6dc9357SAndroid Build Coastguard Worker }
1291*f6dc9357SAndroid Build Coastguard Worker }
1292*f6dc9357SAndroid Build Coastguard Worker }
1293*f6dc9357SAndroid Build Coastguard Worker else // NSIS-3 Unicode
1294*f6dc9357SAndroid Build Coastguard Worker {
1295*f6dc9357SAndroid Build Coastguard Worker for (;;)
1296*f6dc9357SAndroid Build Coastguard Worker {
1297*f6dc9357SAndroid Build Coastguard Worker unsigned c = Get16(data + i * 2);
1298*f6dc9357SAndroid Build Coastguard Worker i++;
1299*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1300*f6dc9357SAndroid Build Coastguard Worker break;
1301*f6dc9357SAndroid Build Coastguard Worker if (c > NS_3_CODE_SKIP)
1302*f6dc9357SAndroid Build Coastguard Worker continue;
1303*f6dc9357SAndroid Build Coastguard Worker UInt32 n = Get16(data + i * 2);
1304*f6dc9357SAndroid Build Coastguard Worker i++;
1305*f6dc9357SAndroid Build Coastguard Worker if (n == 0)
1306*f6dc9357SAndroid Build Coastguard Worker break;
1307*f6dc9357SAndroid Build Coastguard Worker if (process && c == NS_3_CODE_VAR)
1308*f6dc9357SAndroid Build Coastguard Worker {
1309*f6dc9357SAndroid Build Coastguard Worker CONVERT_NUMBER_NS_3_UNICODE(n);
1310*f6dc9357SAndroid Build Coastguard Worker n++;
1311*f6dc9357SAndroid Build Coastguard Worker if (numUsedVars < n)
1312*f6dc9357SAndroid Build Coastguard Worker numUsedVars = n;
1313*f6dc9357SAndroid Build Coastguard Worker }
1314*f6dc9357SAndroid Build Coastguard Worker }
1315*f6dc9357SAndroid Build Coastguard Worker }
1316*f6dc9357SAndroid Build Coastguard Worker }
1317*f6dc9357SAndroid Build Coastguard Worker else // not Unicode (ANSI)
1318*f6dc9357SAndroid Build Coastguard Worker {
1319*f6dc9357SAndroid Build Coastguard Worker if (NsisType != k_NsisType_Nsis3)
1320*f6dc9357SAndroid Build Coastguard Worker {
1321*f6dc9357SAndroid Build Coastguard Worker for (;;)
1322*f6dc9357SAndroid Build Coastguard Worker {
1323*f6dc9357SAndroid Build Coastguard Worker Byte c = data[i++];
1324*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1325*f6dc9357SAndroid Build Coastguard Worker break;
1326*f6dc9357SAndroid Build Coastguard Worker if (IS_NS_SPEC_CHAR(c))
1327*f6dc9357SAndroid Build Coastguard Worker {
1328*f6dc9357SAndroid Build Coastguard Worker Byte c0 = data[i++];
1329*f6dc9357SAndroid Build Coastguard Worker if (c0 == 0)
1330*f6dc9357SAndroid Build Coastguard Worker break;
1331*f6dc9357SAndroid Build Coastguard Worker if (c == NS_CODE_SKIP)
1332*f6dc9357SAndroid Build Coastguard Worker continue;
1333*f6dc9357SAndroid Build Coastguard Worker Byte c1 = data[i++];
1334*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0)
1335*f6dc9357SAndroid Build Coastguard Worker break;
1336*f6dc9357SAndroid Build Coastguard Worker if (process && c == NS_CODE_VAR)
1337*f6dc9357SAndroid Build Coastguard Worker {
1338*f6dc9357SAndroid Build Coastguard Worker UInt32 n = DECODE_NUMBER_FROM_2_CHARS(c0, c1);
1339*f6dc9357SAndroid Build Coastguard Worker n++;
1340*f6dc9357SAndroid Build Coastguard Worker if (numUsedVars < n)
1341*f6dc9357SAndroid Build Coastguard Worker numUsedVars = n;
1342*f6dc9357SAndroid Build Coastguard Worker }
1343*f6dc9357SAndroid Build Coastguard Worker }
1344*f6dc9357SAndroid Build Coastguard Worker }
1345*f6dc9357SAndroid Build Coastguard Worker }
1346*f6dc9357SAndroid Build Coastguard Worker else
1347*f6dc9357SAndroid Build Coastguard Worker {
1348*f6dc9357SAndroid Build Coastguard Worker // NSIS-3 ANSI
1349*f6dc9357SAndroid Build Coastguard Worker for (;;)
1350*f6dc9357SAndroid Build Coastguard Worker {
1351*f6dc9357SAndroid Build Coastguard Worker Byte c = data[i++];
1352*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1353*f6dc9357SAndroid Build Coastguard Worker break;
1354*f6dc9357SAndroid Build Coastguard Worker if (c > NS_3_CODE_SKIP)
1355*f6dc9357SAndroid Build Coastguard Worker continue;
1356*f6dc9357SAndroid Build Coastguard Worker
1357*f6dc9357SAndroid Build Coastguard Worker Byte c0 = data[i++];
1358*f6dc9357SAndroid Build Coastguard Worker if (c0 == 0)
1359*f6dc9357SAndroid Build Coastguard Worker break;
1360*f6dc9357SAndroid Build Coastguard Worker if (c == NS_3_CODE_SKIP)
1361*f6dc9357SAndroid Build Coastguard Worker continue;
1362*f6dc9357SAndroid Build Coastguard Worker Byte c1 = data[i++];
1363*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0)
1364*f6dc9357SAndroid Build Coastguard Worker break;
1365*f6dc9357SAndroid Build Coastguard Worker if (process && c == NS_3_CODE_VAR)
1366*f6dc9357SAndroid Build Coastguard Worker {
1367*f6dc9357SAndroid Build Coastguard Worker UInt32 n = DECODE_NUMBER_FROM_2_CHARS(c0, c1);
1368*f6dc9357SAndroid Build Coastguard Worker n++;
1369*f6dc9357SAndroid Build Coastguard Worker if (numUsedVars < n)
1370*f6dc9357SAndroid Build Coastguard Worker numUsedVars = n;
1371*f6dc9357SAndroid Build Coastguard Worker }
1372*f6dc9357SAndroid Build Coastguard Worker }
1373*f6dc9357SAndroid Build Coastguard Worker }
1374*f6dc9357SAndroid Build Coastguard Worker }
1375*f6dc9357SAndroid Build Coastguard Worker }
1376*f6dc9357SAndroid Build Coastguard Worker return numUsedVars;
1377*f6dc9357SAndroid Build Coastguard Worker }
1378*f6dc9357SAndroid Build Coastguard Worker
ReadString2(AString & s,UInt32 pos)1379*f6dc9357SAndroid Build Coastguard Worker void CInArchive::ReadString2(AString &s, UInt32 pos)
1380*f6dc9357SAndroid Build Coastguard Worker {
1381*f6dc9357SAndroid Build Coastguard Worker if ((Int32)pos < 0)
1382*f6dc9357SAndroid Build Coastguard Worker {
1383*f6dc9357SAndroid Build Coastguard Worker Add_LangStr(s, (UInt32)-((Int32)pos + 1));
1384*f6dc9357SAndroid Build Coastguard Worker return;
1385*f6dc9357SAndroid Build Coastguard Worker }
1386*f6dc9357SAndroid Build Coastguard Worker
1387*f6dc9357SAndroid Build Coastguard Worker if (pos >= NumStringChars)
1388*f6dc9357SAndroid Build Coastguard Worker {
1389*f6dc9357SAndroid Build Coastguard Worker s += kErrorStr;
1390*f6dc9357SAndroid Build Coastguard Worker // UIntToString(s, pos);
1391*f6dc9357SAndroid Build Coastguard Worker return;
1392*f6dc9357SAndroid Build Coastguard Worker }
1393*f6dc9357SAndroid Build Coastguard Worker
1394*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
1395*f6dc9357SAndroid Build Coastguard Worker strUsed[pos] = 1;
1396*f6dc9357SAndroid Build Coastguard Worker #endif
1397*f6dc9357SAndroid Build Coastguard Worker
1398*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
1399*f6dc9357SAndroid Build Coastguard Worker GetNsisString_Unicode(s, _data + _stringsPos + pos * 2);
1400*f6dc9357SAndroid Build Coastguard Worker else
1401*f6dc9357SAndroid Build Coastguard Worker GetNsisString(s, _data + _stringsPos + pos);
1402*f6dc9357SAndroid Build Coastguard Worker }
1403*f6dc9357SAndroid Build Coastguard Worker
1404*f6dc9357SAndroid Build Coastguard Worker #endif
1405*f6dc9357SAndroid Build Coastguard Worker
1406*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
1407*f6dc9357SAndroid Build Coastguard Worker
1408*f6dc9357SAndroid Build Coastguard Worker // #define DEL_DIR 1
1409*f6dc9357SAndroid Build Coastguard Worker #define DEL_RECURSE 2
1410*f6dc9357SAndroid Build Coastguard Worker #define DEL_REBOOT 4
1411*f6dc9357SAndroid Build Coastguard Worker // #define DEL_SIMPLE 8
1412*f6dc9357SAndroid Build Coastguard Worker
AddRegRoot(UInt32 val)1413*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddRegRoot(UInt32 val)
1414*f6dc9357SAndroid Build Coastguard Worker {
1415*f6dc9357SAndroid Build Coastguard Worker Space();
1416*f6dc9357SAndroid Build Coastguard Worker const char *s;
1417*f6dc9357SAndroid Build Coastguard Worker switch (val)
1418*f6dc9357SAndroid Build Coastguard Worker {
1419*f6dc9357SAndroid Build Coastguard Worker case 0: s = "SHCTX"; break;
1420*f6dc9357SAndroid Build Coastguard Worker case 0x80000000: s = "HKCR"; break;
1421*f6dc9357SAndroid Build Coastguard Worker case 0x80000001: s = "HKCU"; break;
1422*f6dc9357SAndroid Build Coastguard Worker case 0x80000002: s = "HKLM"; break;
1423*f6dc9357SAndroid Build Coastguard Worker case 0x80000003: s = "HKU"; break;
1424*f6dc9357SAndroid Build Coastguard Worker case 0x80000004: s = "HKPD"; break;
1425*f6dc9357SAndroid Build Coastguard Worker case 0x80000005: s = "HKCC"; break;
1426*f6dc9357SAndroid Build Coastguard Worker case 0x80000006: s = "HKDD"; break;
1427*f6dc9357SAndroid Build Coastguard Worker case 0x80000050: s = "HKPT"; break;
1428*f6dc9357SAndroid Build Coastguard Worker case 0x80000060: s = "HKPN"; break;
1429*f6dc9357SAndroid Build Coastguard Worker default:
1430*f6dc9357SAndroid Build Coastguard Worker // Script += " RRRRR ";
1431*f6dc9357SAndroid Build Coastguard Worker // throw 1;
1432*f6dc9357SAndroid Build Coastguard Worker Add_Hex(Script, val); return;
1433*f6dc9357SAndroid Build Coastguard Worker }
1434*f6dc9357SAndroid Build Coastguard Worker Script += s;
1435*f6dc9357SAndroid Build Coastguard Worker }
1436*f6dc9357SAndroid Build Coastguard Worker
1437*f6dc9357SAndroid Build Coastguard Worker static const char * const g_WinAttrib[] =
1438*f6dc9357SAndroid Build Coastguard Worker {
1439*f6dc9357SAndroid Build Coastguard Worker "READONLY"
1440*f6dc9357SAndroid Build Coastguard Worker , "HIDDEN"
1441*f6dc9357SAndroid Build Coastguard Worker , "SYSTEM"
1442*f6dc9357SAndroid Build Coastguard Worker , NULL
1443*f6dc9357SAndroid Build Coastguard Worker , "DIRECTORY"
1444*f6dc9357SAndroid Build Coastguard Worker , "ARCHIVE"
1445*f6dc9357SAndroid Build Coastguard Worker , "DEVICE"
1446*f6dc9357SAndroid Build Coastguard Worker , "NORMAL"
1447*f6dc9357SAndroid Build Coastguard Worker , "TEMPORARY"
1448*f6dc9357SAndroid Build Coastguard Worker , "SPARSE_FILE"
1449*f6dc9357SAndroid Build Coastguard Worker , "REPARSE_POINT"
1450*f6dc9357SAndroid Build Coastguard Worker , "COMPRESSED"
1451*f6dc9357SAndroid Build Coastguard Worker , "OFFLINE"
1452*f6dc9357SAndroid Build Coastguard Worker , "NOT_CONTENT_INDEXED"
1453*f6dc9357SAndroid Build Coastguard Worker , "ENCRYPTED"
1454*f6dc9357SAndroid Build Coastguard Worker , NULL
1455*f6dc9357SAndroid Build Coastguard Worker , "VIRTUAL"
1456*f6dc9357SAndroid Build Coastguard Worker };
1457*f6dc9357SAndroid Build Coastguard Worker
1458*f6dc9357SAndroid Build Coastguard Worker #define FLAGS_DELIMITER '|'
1459*f6dc9357SAndroid Build Coastguard Worker
FlagsToString2(CDynLimBuf & s,const char * const * table,unsigned num,UInt32 flags)1460*f6dc9357SAndroid Build Coastguard Worker static void FlagsToString2(CDynLimBuf &s, const char * const *table, unsigned num, UInt32 flags)
1461*f6dc9357SAndroid Build Coastguard Worker {
1462*f6dc9357SAndroid Build Coastguard Worker bool filled = false;
1463*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < num; i++)
1464*f6dc9357SAndroid Build Coastguard Worker {
1465*f6dc9357SAndroid Build Coastguard Worker UInt32 f = (UInt32)1 << i;
1466*f6dc9357SAndroid Build Coastguard Worker if ((flags & f) != 0)
1467*f6dc9357SAndroid Build Coastguard Worker {
1468*f6dc9357SAndroid Build Coastguard Worker const char *name = table[i];
1469*f6dc9357SAndroid Build Coastguard Worker if (name)
1470*f6dc9357SAndroid Build Coastguard Worker {
1471*f6dc9357SAndroid Build Coastguard Worker if (filled)
1472*f6dc9357SAndroid Build Coastguard Worker s += FLAGS_DELIMITER;
1473*f6dc9357SAndroid Build Coastguard Worker filled = true;
1474*f6dc9357SAndroid Build Coastguard Worker s += name;
1475*f6dc9357SAndroid Build Coastguard Worker flags &= ~f;
1476*f6dc9357SAndroid Build Coastguard Worker }
1477*f6dc9357SAndroid Build Coastguard Worker }
1478*f6dc9357SAndroid Build Coastguard Worker }
1479*f6dc9357SAndroid Build Coastguard Worker if (flags != 0)
1480*f6dc9357SAndroid Build Coastguard Worker {
1481*f6dc9357SAndroid Build Coastguard Worker if (filled)
1482*f6dc9357SAndroid Build Coastguard Worker s += FLAGS_DELIMITER;
1483*f6dc9357SAndroid Build Coastguard Worker Add_Hex(s, flags);
1484*f6dc9357SAndroid Build Coastguard Worker }
1485*f6dc9357SAndroid Build Coastguard Worker }
1486*f6dc9357SAndroid Build Coastguard Worker
DoesNeedQuotes(const char * s)1487*f6dc9357SAndroid Build Coastguard Worker static bool DoesNeedQuotes(const char *s)
1488*f6dc9357SAndroid Build Coastguard Worker {
1489*f6dc9357SAndroid Build Coastguard Worker {
1490*f6dc9357SAndroid Build Coastguard Worker char c = s[0];
1491*f6dc9357SAndroid Build Coastguard Worker if (c == 0 || c == '#' || c == ';' || (c == '/' && s[1] == '*'))
1492*f6dc9357SAndroid Build Coastguard Worker return true;
1493*f6dc9357SAndroid Build Coastguard Worker }
1494*f6dc9357SAndroid Build Coastguard Worker for (;;)
1495*f6dc9357SAndroid Build Coastguard Worker {
1496*f6dc9357SAndroid Build Coastguard Worker char c = *s++;
1497*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1498*f6dc9357SAndroid Build Coastguard Worker return false;
1499*f6dc9357SAndroid Build Coastguard Worker if (c == ' ')
1500*f6dc9357SAndroid Build Coastguard Worker return true;
1501*f6dc9357SAndroid Build Coastguard Worker }
1502*f6dc9357SAndroid Build Coastguard Worker }
1503*f6dc9357SAndroid Build Coastguard Worker
Add_QuStr(const AString & s)1504*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_QuStr(const AString &s)
1505*f6dc9357SAndroid Build Coastguard Worker {
1506*f6dc9357SAndroid Build Coastguard Worker bool needQuotes = DoesNeedQuotes(s);
1507*f6dc9357SAndroid Build Coastguard Worker if (needQuotes)
1508*f6dc9357SAndroid Build Coastguard Worker Script += '\"';
1509*f6dc9357SAndroid Build Coastguard Worker Script += s;
1510*f6dc9357SAndroid Build Coastguard Worker if (needQuotes)
1511*f6dc9357SAndroid Build Coastguard Worker Script += '\"';
1512*f6dc9357SAndroid Build Coastguard Worker }
1513*f6dc9357SAndroid Build Coastguard Worker
SpaceQuStr(const AString & s)1514*f6dc9357SAndroid Build Coastguard Worker void CInArchive::SpaceQuStr(const AString &s)
1515*f6dc9357SAndroid Build Coastguard Worker {
1516*f6dc9357SAndroid Build Coastguard Worker Space();
1517*f6dc9357SAndroid Build Coastguard Worker Add_QuStr(s);
1518*f6dc9357SAndroid Build Coastguard Worker }
1519*f6dc9357SAndroid Build Coastguard Worker
AddParam(UInt32 pos)1520*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddParam(UInt32 pos)
1521*f6dc9357SAndroid Build Coastguard Worker {
1522*f6dc9357SAndroid Build Coastguard Worker _tempString.Empty();
1523*f6dc9357SAndroid Build Coastguard Worker ReadString2(_tempString, pos);
1524*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(_tempString);
1525*f6dc9357SAndroid Build Coastguard Worker }
1526*f6dc9357SAndroid Build Coastguard Worker
AddParams(const UInt32 * params,unsigned num)1527*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddParams(const UInt32 *params, unsigned num)
1528*f6dc9357SAndroid Build Coastguard Worker {
1529*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < num; i++)
1530*f6dc9357SAndroid Build Coastguard Worker AddParam(params[i]);
1531*f6dc9357SAndroid Build Coastguard Worker }
1532*f6dc9357SAndroid Build Coastguard Worker
AddOptionalParam(UInt32 pos)1533*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddOptionalParam(UInt32 pos)
1534*f6dc9357SAndroid Build Coastguard Worker {
1535*f6dc9357SAndroid Build Coastguard Worker if (pos != 0)
1536*f6dc9357SAndroid Build Coastguard Worker AddParam(pos);
1537*f6dc9357SAndroid Build Coastguard Worker }
1538*f6dc9357SAndroid Build Coastguard Worker
GetNumParams(const UInt32 * params,unsigned num)1539*f6dc9357SAndroid Build Coastguard Worker static unsigned GetNumParams(const UInt32 *params, unsigned num)
1540*f6dc9357SAndroid Build Coastguard Worker {
1541*f6dc9357SAndroid Build Coastguard Worker for (; num > 0 && params[num - 1] == 0; num--);
1542*f6dc9357SAndroid Build Coastguard Worker return num;
1543*f6dc9357SAndroid Build Coastguard Worker }
1544*f6dc9357SAndroid Build Coastguard Worker
AddOptionalParams(const UInt32 * params,unsigned num)1545*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddOptionalParams(const UInt32 *params, unsigned num)
1546*f6dc9357SAndroid Build Coastguard Worker {
1547*f6dc9357SAndroid Build Coastguard Worker AddParams(params, GetNumParams(params, num));
1548*f6dc9357SAndroid Build Coastguard Worker }
1549*f6dc9357SAndroid Build Coastguard Worker
1550*f6dc9357SAndroid Build Coastguard Worker
1551*f6dc9357SAndroid Build Coastguard Worker static const UInt32 CMD_REF_Goto = (1 << 0);
1552*f6dc9357SAndroid Build Coastguard Worker static const UInt32 CMD_REF_Call = (1 << 1);
1553*f6dc9357SAndroid Build Coastguard Worker static const UInt32 CMD_REF_Pre = (1 << 2);
1554*f6dc9357SAndroid Build Coastguard Worker static const UInt32 CMD_REF_Show = (1 << 3);
1555*f6dc9357SAndroid Build Coastguard Worker static const UInt32 CMD_REF_Leave = (1 << 4);
1556*f6dc9357SAndroid Build Coastguard Worker static const UInt32 CMD_REF_OnFunc = (1 << 5);
1557*f6dc9357SAndroid Build Coastguard Worker static const UInt32 CMD_REF_Section = (1 << 6);
1558*f6dc9357SAndroid Build Coastguard Worker static const UInt32 CMD_REF_InitPluginDir = (1 << 7);
1559*f6dc9357SAndroid Build Coastguard Worker // static const UInt32 CMD_REF_Creator = (1 << 5); // CMD_REF_Pre is used instead
1560*f6dc9357SAndroid Build Coastguard Worker static const unsigned CMD_REF_OnFunc_NumShifts = 28; // it uses for onFunc too
1561*f6dc9357SAndroid Build Coastguard Worker static const unsigned CMD_REF_Page_NumShifts = 16; // it uses for onFunc too
1562*f6dc9357SAndroid Build Coastguard Worker static const UInt32 CMD_REF_Page_Mask = 0x0FFF0000;
1563*f6dc9357SAndroid Build Coastguard Worker static const UInt32 CMD_REF_OnFunc_Mask = 0xF0000000;
1564*f6dc9357SAndroid Build Coastguard Worker
IsPageFunc(UInt32 flag)1565*f6dc9357SAndroid Build Coastguard Worker inline bool IsPageFunc(UInt32 flag)
1566*f6dc9357SAndroid Build Coastguard Worker {
1567*f6dc9357SAndroid Build Coastguard Worker return (flag & (CMD_REF_Pre | CMD_REF_Show | CMD_REF_Leave)) != 0;
1568*f6dc9357SAndroid Build Coastguard Worker }
1569*f6dc9357SAndroid Build Coastguard Worker
IsFunc(UInt32 flag)1570*f6dc9357SAndroid Build Coastguard Worker inline bool IsFunc(UInt32 flag)
1571*f6dc9357SAndroid Build Coastguard Worker {
1572*f6dc9357SAndroid Build Coastguard Worker // return (flag & (CMD_REF_Pre | CMD_REF_Show | CMD_REF_Leave | CMD_REF_OnFunc)) != 0;
1573*f6dc9357SAndroid Build Coastguard Worker return (flag & (CMD_REF_Call | CMD_REF_Pre | CMD_REF_Show | CMD_REF_Leave | CMD_REF_OnFunc)) != 0;
1574*f6dc9357SAndroid Build Coastguard Worker }
1575*f6dc9357SAndroid Build Coastguard Worker
IsProbablyEndOfFunc(UInt32 flag)1576*f6dc9357SAndroid Build Coastguard Worker inline bool IsProbablyEndOfFunc(UInt32 flag)
1577*f6dc9357SAndroid Build Coastguard Worker {
1578*f6dc9357SAndroid Build Coastguard Worker return (flag != 0 && flag != CMD_REF_Goto);
1579*f6dc9357SAndroid Build Coastguard Worker }
1580*f6dc9357SAndroid Build Coastguard Worker
1581*f6dc9357SAndroid Build Coastguard Worker static const char * const kOnFunc[] =
1582*f6dc9357SAndroid Build Coastguard Worker {
1583*f6dc9357SAndroid Build Coastguard Worker "Init"
1584*f6dc9357SAndroid Build Coastguard Worker , "InstSuccess"
1585*f6dc9357SAndroid Build Coastguard Worker , "InstFailed"
1586*f6dc9357SAndroid Build Coastguard Worker , "UserAbort"
1587*f6dc9357SAndroid Build Coastguard Worker , "GUIInit"
1588*f6dc9357SAndroid Build Coastguard Worker , "GUIEnd"
1589*f6dc9357SAndroid Build Coastguard Worker , "MouseOverSection"
1590*f6dc9357SAndroid Build Coastguard Worker , "VerifyInstDir"
1591*f6dc9357SAndroid Build Coastguard Worker , "SelChange"
1592*f6dc9357SAndroid Build Coastguard Worker , "RebootFailed"
1593*f6dc9357SAndroid Build Coastguard Worker };
1594*f6dc9357SAndroid Build Coastguard Worker
Add_FuncName(const UInt32 * labels,UInt32 index)1595*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_FuncName(const UInt32 *labels, UInt32 index)
1596*f6dc9357SAndroid Build Coastguard Worker {
1597*f6dc9357SAndroid Build Coastguard Worker UInt32 mask = labels[index];
1598*f6dc9357SAndroid Build Coastguard Worker if (mask & CMD_REF_OnFunc)
1599*f6dc9357SAndroid Build Coastguard Worker {
1600*f6dc9357SAndroid Build Coastguard Worker Script += ".on";
1601*f6dc9357SAndroid Build Coastguard Worker Script += kOnFunc[labels[index] >> CMD_REF_OnFunc_NumShifts];
1602*f6dc9357SAndroid Build Coastguard Worker }
1603*f6dc9357SAndroid Build Coastguard Worker else if (mask & CMD_REF_InitPluginDir)
1604*f6dc9357SAndroid Build Coastguard Worker {
1605*f6dc9357SAndroid Build Coastguard Worker /*
1606*f6dc9357SAndroid Build Coastguard Worker if (!IsInstaller)
1607*f6dc9357SAndroid Build Coastguard Worker Script += "un."
1608*f6dc9357SAndroid Build Coastguard Worker */
1609*f6dc9357SAndroid Build Coastguard Worker Script += "Initialize_____Plugins";
1610*f6dc9357SAndroid Build Coastguard Worker }
1611*f6dc9357SAndroid Build Coastguard Worker else
1612*f6dc9357SAndroid Build Coastguard Worker {
1613*f6dc9357SAndroid Build Coastguard Worker Script += "func_";
1614*f6dc9357SAndroid Build Coastguard Worker Add_UInt(index);
1615*f6dc9357SAndroid Build Coastguard Worker }
1616*f6dc9357SAndroid Build Coastguard Worker }
1617*f6dc9357SAndroid Build Coastguard Worker
AddParam_Func(const UInt32 * labels,UInt32 index)1618*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddParam_Func(const UInt32 *labels, UInt32 index)
1619*f6dc9357SAndroid Build Coastguard Worker {
1620*f6dc9357SAndroid Build Coastguard Worker Space();
1621*f6dc9357SAndroid Build Coastguard Worker if ((Int32)index >= 0)
1622*f6dc9357SAndroid Build Coastguard Worker Add_FuncName(labels, index);
1623*f6dc9357SAndroid Build Coastguard Worker else
1624*f6dc9357SAndroid Build Coastguard Worker AddQuotes();
1625*f6dc9357SAndroid Build Coastguard Worker }
1626*f6dc9357SAndroid Build Coastguard Worker
1627*f6dc9357SAndroid Build Coastguard Worker
Add_LabelName(UInt32 index)1628*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_LabelName(UInt32 index)
1629*f6dc9357SAndroid Build Coastguard Worker {
1630*f6dc9357SAndroid Build Coastguard Worker Script += "label_";
1631*f6dc9357SAndroid Build Coastguard Worker Add_UInt(index);
1632*f6dc9357SAndroid Build Coastguard Worker }
1633*f6dc9357SAndroid Build Coastguard Worker
1634*f6dc9357SAndroid Build Coastguard Worker // param != 0
Add_GotoVar(UInt32 param)1635*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_GotoVar(UInt32 param)
1636*f6dc9357SAndroid Build Coastguard Worker {
1637*f6dc9357SAndroid Build Coastguard Worker Space();
1638*f6dc9357SAndroid Build Coastguard Worker if ((Int32)param < 0)
1639*f6dc9357SAndroid Build Coastguard Worker Add_Var((UInt32)-((Int32)param + 1));
1640*f6dc9357SAndroid Build Coastguard Worker else
1641*f6dc9357SAndroid Build Coastguard Worker Add_LabelName(param - 1);
1642*f6dc9357SAndroid Build Coastguard Worker }
1643*f6dc9357SAndroid Build Coastguard Worker
Add_GotoVar1(UInt32 param)1644*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_GotoVar1(UInt32 param)
1645*f6dc9357SAndroid Build Coastguard Worker {
1646*f6dc9357SAndroid Build Coastguard Worker if (param == 0)
1647*f6dc9357SAndroid Build Coastguard Worker Script += " 0";
1648*f6dc9357SAndroid Build Coastguard Worker else
1649*f6dc9357SAndroid Build Coastguard Worker Add_GotoVar(param);
1650*f6dc9357SAndroid Build Coastguard Worker }
1651*f6dc9357SAndroid Build Coastguard Worker
Add_GotoVars2(const UInt32 * params)1652*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_GotoVars2(const UInt32 *params)
1653*f6dc9357SAndroid Build Coastguard Worker {
1654*f6dc9357SAndroid Build Coastguard Worker Add_GotoVar1(params[0]);
1655*f6dc9357SAndroid Build Coastguard Worker if (params[1] != 0)
1656*f6dc9357SAndroid Build Coastguard Worker Add_GotoVar(params[1]);
1657*f6dc9357SAndroid Build Coastguard Worker }
1658*f6dc9357SAndroid Build Coastguard Worker
NoLabels(const UInt32 * labels,UInt32 num)1659*f6dc9357SAndroid Build Coastguard Worker static bool NoLabels(const UInt32 *labels, UInt32 num)
1660*f6dc9357SAndroid Build Coastguard Worker {
1661*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < num; i++)
1662*f6dc9357SAndroid Build Coastguard Worker if (labels[i] != 0)
1663*f6dc9357SAndroid Build Coastguard Worker return false;
1664*f6dc9357SAndroid Build Coastguard Worker return true;
1665*f6dc9357SAndroid Build Coastguard Worker }
1666*f6dc9357SAndroid Build Coastguard Worker
1667*f6dc9357SAndroid Build Coastguard Worker static const char * const k_REBOOTOK = " /REBOOTOK";
1668*f6dc9357SAndroid Build Coastguard Worker
1669*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_MB_ABORTRETRYIGNORE 2
1670*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_MB_RETRYCANCEL 5
1671*f6dc9357SAndroid Build Coastguard Worker
1672*f6dc9357SAndroid Build Coastguard Worker static const char * const k_MB_Buttons[] =
1673*f6dc9357SAndroid Build Coastguard Worker {
1674*f6dc9357SAndroid Build Coastguard Worker "OK"
1675*f6dc9357SAndroid Build Coastguard Worker , "OKCANCEL"
1676*f6dc9357SAndroid Build Coastguard Worker , "ABORTRETRYIGNORE"
1677*f6dc9357SAndroid Build Coastguard Worker , "YESNOCANCEL"
1678*f6dc9357SAndroid Build Coastguard Worker , "YESNO"
1679*f6dc9357SAndroid Build Coastguard Worker , "RETRYCANCEL"
1680*f6dc9357SAndroid Build Coastguard Worker , "CANCELTRYCONTINUE"
1681*f6dc9357SAndroid Build Coastguard Worker };
1682*f6dc9357SAndroid Build Coastguard Worker
1683*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_MB_ICONSTOP (1 << 4)
1684*f6dc9357SAndroid Build Coastguard Worker
1685*f6dc9357SAndroid Build Coastguard Worker static const char * const k_MB_Icons[] =
1686*f6dc9357SAndroid Build Coastguard Worker {
1687*f6dc9357SAndroid Build Coastguard Worker NULL
1688*f6dc9357SAndroid Build Coastguard Worker , "ICONSTOP"
1689*f6dc9357SAndroid Build Coastguard Worker , "ICONQUESTION"
1690*f6dc9357SAndroid Build Coastguard Worker , "ICONEXCLAMATION"
1691*f6dc9357SAndroid Build Coastguard Worker , "ICONINFORMATION"
1692*f6dc9357SAndroid Build Coastguard Worker };
1693*f6dc9357SAndroid Build Coastguard Worker
1694*f6dc9357SAndroid Build Coastguard Worker static const char * const k_MB_Flags[] =
1695*f6dc9357SAndroid Build Coastguard Worker {
1696*f6dc9357SAndroid Build Coastguard Worker "HELP"
1697*f6dc9357SAndroid Build Coastguard Worker , "NOFOCUS"
1698*f6dc9357SAndroid Build Coastguard Worker , "SETFOREGROUND"
1699*f6dc9357SAndroid Build Coastguard Worker , "DEFAULT_DESKTOP_ONLY"
1700*f6dc9357SAndroid Build Coastguard Worker , "TOPMOST"
1701*f6dc9357SAndroid Build Coastguard Worker , "RIGHT"
1702*f6dc9357SAndroid Build Coastguard Worker , "RTLREADING"
1703*f6dc9357SAndroid Build Coastguard Worker // , "SERVICE_NOTIFICATION" // unsupported. That bit is used for NSIS purposes
1704*f6dc9357SAndroid Build Coastguard Worker };
1705*f6dc9357SAndroid Build Coastguard Worker
1706*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_IDCANCEL 2
1707*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_IDIGNORE 5
1708*f6dc9357SAndroid Build Coastguard Worker
1709*f6dc9357SAndroid Build Coastguard Worker static const char * const k_Button_IDs[] =
1710*f6dc9357SAndroid Build Coastguard Worker {
1711*f6dc9357SAndroid Build Coastguard Worker "0"
1712*f6dc9357SAndroid Build Coastguard Worker , "IDOK"
1713*f6dc9357SAndroid Build Coastguard Worker , "IDCANCEL"
1714*f6dc9357SAndroid Build Coastguard Worker , "IDABORT"
1715*f6dc9357SAndroid Build Coastguard Worker , "IDRETRY"
1716*f6dc9357SAndroid Build Coastguard Worker , "IDIGNORE"
1717*f6dc9357SAndroid Build Coastguard Worker , "IDYES"
1718*f6dc9357SAndroid Build Coastguard Worker , "IDNO"
1719*f6dc9357SAndroid Build Coastguard Worker , "IDCLOSE"
1720*f6dc9357SAndroid Build Coastguard Worker , "IDHELP"
1721*f6dc9357SAndroid Build Coastguard Worker , "IDTRYAGAIN"
1722*f6dc9357SAndroid Build Coastguard Worker , "IDCONTINUE"
1723*f6dc9357SAndroid Build Coastguard Worker };
1724*f6dc9357SAndroid Build Coastguard Worker
Add_ButtonID(UInt32 buttonID)1725*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_ButtonID(UInt32 buttonID)
1726*f6dc9357SAndroid Build Coastguard Worker {
1727*f6dc9357SAndroid Build Coastguard Worker Space();
1728*f6dc9357SAndroid Build Coastguard Worker if (buttonID < Z7_ARRAY_SIZE(k_Button_IDs))
1729*f6dc9357SAndroid Build Coastguard Worker Script += k_Button_IDs[buttonID];
1730*f6dc9357SAndroid Build Coastguard Worker else
1731*f6dc9357SAndroid Build Coastguard Worker {
1732*f6dc9357SAndroid Build Coastguard Worker Script += "Button_";
1733*f6dc9357SAndroid Build Coastguard Worker Add_UInt(buttonID);
1734*f6dc9357SAndroid Build Coastguard Worker }
1735*f6dc9357SAndroid Build Coastguard Worker }
1736*f6dc9357SAndroid Build Coastguard Worker
IsDirectString_Equal(UInt32 offset,const char * s) const1737*f6dc9357SAndroid Build Coastguard Worker bool CInArchive::IsDirectString_Equal(UInt32 offset, const char *s) const
1738*f6dc9357SAndroid Build Coastguard Worker {
1739*f6dc9357SAndroid Build Coastguard Worker if (offset >= NumStringChars)
1740*f6dc9357SAndroid Build Coastguard Worker return false;
1741*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
1742*f6dc9357SAndroid Build Coastguard Worker return AreStringsEqual_16and8(_data + _stringsPos + offset * 2, s);
1743*f6dc9357SAndroid Build Coastguard Worker else
1744*f6dc9357SAndroid Build Coastguard Worker return strcmp((const char *)(const Byte *)_data + _stringsPos + offset, s) == 0;
1745*f6dc9357SAndroid Build Coastguard Worker }
1746*f6dc9357SAndroid Build Coastguard Worker
StringToUInt32(const char * s,UInt32 & res)1747*f6dc9357SAndroid Build Coastguard Worker static bool StringToUInt32(const char *s, UInt32 &res)
1748*f6dc9357SAndroid Build Coastguard Worker {
1749*f6dc9357SAndroid Build Coastguard Worker const char *end;
1750*f6dc9357SAndroid Build Coastguard Worker if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1751*f6dc9357SAndroid Build Coastguard Worker res = ConvertHexStringToUInt32(s + 2, &end);
1752*f6dc9357SAndroid Build Coastguard Worker else
1753*f6dc9357SAndroid Build Coastguard Worker res = ConvertStringToUInt32(s, &end);
1754*f6dc9357SAndroid Build Coastguard Worker return (*end == 0);
1755*f6dc9357SAndroid Build Coastguard Worker }
1756*f6dc9357SAndroid Build Coastguard Worker
1757*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_CtlColors32_Size = 24;
1758*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_CtlColors64_Size = 28;
1759*f6dc9357SAndroid Build Coastguard Worker
1760*f6dc9357SAndroid Build Coastguard Worker #define GET_CtlColors_SIZE(is64) ((is64) ? k_CtlColors64_Size : k_CtlColors32_Size)
1761*f6dc9357SAndroid Build Coastguard Worker
1762*f6dc9357SAndroid Build Coastguard Worker struct CNsis_CtlColors
1763*f6dc9357SAndroid Build Coastguard Worker {
1764*f6dc9357SAndroid Build Coastguard Worker UInt32 text; // COLORREF
1765*f6dc9357SAndroid Build Coastguard Worker UInt32 bkc; // COLORREF
1766*f6dc9357SAndroid Build Coastguard Worker UInt32 lbStyle;
1767*f6dc9357SAndroid Build Coastguard Worker UInt32 bkb; // HBRUSH
1768*f6dc9357SAndroid Build Coastguard Worker Int32 bkmode;
1769*f6dc9357SAndroid Build Coastguard Worker Int32 flags;
1770*f6dc9357SAndroid Build Coastguard Worker UInt32 bkb_hi32;
1771*f6dc9357SAndroid Build Coastguard Worker
1772*f6dc9357SAndroid Build Coastguard Worker void Parse(const Byte *p, bool is64);
1773*f6dc9357SAndroid Build Coastguard Worker };
1774*f6dc9357SAndroid Build Coastguard Worker
Parse(const Byte * p,bool is64)1775*f6dc9357SAndroid Build Coastguard Worker void CNsis_CtlColors::Parse(const Byte *p, bool is64)
1776*f6dc9357SAndroid Build Coastguard Worker {
1777*f6dc9357SAndroid Build Coastguard Worker text = Get32(p);
1778*f6dc9357SAndroid Build Coastguard Worker bkc = Get32(p + 4);
1779*f6dc9357SAndroid Build Coastguard Worker if (is64)
1780*f6dc9357SAndroid Build Coastguard Worker {
1781*f6dc9357SAndroid Build Coastguard Worker bkb = Get32(p + 8);
1782*f6dc9357SAndroid Build Coastguard Worker bkb_hi32 = Get32(p + 12);
1783*f6dc9357SAndroid Build Coastguard Worker lbStyle = Get32(p + 16);
1784*f6dc9357SAndroid Build Coastguard Worker p += 4;
1785*f6dc9357SAndroid Build Coastguard Worker }
1786*f6dc9357SAndroid Build Coastguard Worker else
1787*f6dc9357SAndroid Build Coastguard Worker {
1788*f6dc9357SAndroid Build Coastguard Worker lbStyle = Get32(p + 8);
1789*f6dc9357SAndroid Build Coastguard Worker bkb = Get32(p + 12);
1790*f6dc9357SAndroid Build Coastguard Worker }
1791*f6dc9357SAndroid Build Coastguard Worker bkmode = (Int32)Get32(p + 16);
1792*f6dc9357SAndroid Build Coastguard Worker flags = (Int32)Get32(p + 20);
1793*f6dc9357SAndroid Build Coastguard Worker }
1794*f6dc9357SAndroid Build Coastguard Worker
1795*f6dc9357SAndroid Build Coastguard Worker // Win32 constants
1796*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_TRANSPARENT 1
1797*f6dc9357SAndroid Build Coastguard Worker // #define Z7_NSIS_WIN_OPAQUE 2
1798*f6dc9357SAndroid Build Coastguard Worker
1799*f6dc9357SAndroid Build Coastguard Worker // text/bg colors
1800*f6dc9357SAndroid Build Coastguard Worker #define kColorsFlags_TEXT 1
1801*f6dc9357SAndroid Build Coastguard Worker #define kColorsFlags_TEXT_SYS 2
1802*f6dc9357SAndroid Build Coastguard Worker #define kColorsFlags_BK 4
1803*f6dc9357SAndroid Build Coastguard Worker #define kColorsFlags_BK_SYS 8
1804*f6dc9357SAndroid Build Coastguard Worker #define kColorsFlags_BKB 16
1805*f6dc9357SAndroid Build Coastguard Worker
Add_Color2(UInt32 v)1806*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_Color2(UInt32 v)
1807*f6dc9357SAndroid Build Coastguard Worker {
1808*f6dc9357SAndroid Build Coastguard Worker v = ((v & 0xFF) << 16) | (v & 0xFF00) | ((v >> 16) & 0xFF);
1809*f6dc9357SAndroid Build Coastguard Worker char sz[32];
1810*f6dc9357SAndroid Build Coastguard Worker for (int i = 5; i >= 0; i--)
1811*f6dc9357SAndroid Build Coastguard Worker {
1812*f6dc9357SAndroid Build Coastguard Worker unsigned t = v & 0xF;
1813*f6dc9357SAndroid Build Coastguard Worker v >>= 4;
1814*f6dc9357SAndroid Build Coastguard Worker sz[i] = (char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))));
1815*f6dc9357SAndroid Build Coastguard Worker }
1816*f6dc9357SAndroid Build Coastguard Worker sz[6] = 0;
1817*f6dc9357SAndroid Build Coastguard Worker Script += sz;
1818*f6dc9357SAndroid Build Coastguard Worker }
1819*f6dc9357SAndroid Build Coastguard Worker
Add_ColorParam(UInt32 v)1820*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_ColorParam(UInt32 v)
1821*f6dc9357SAndroid Build Coastguard Worker {
1822*f6dc9357SAndroid Build Coastguard Worker Space();
1823*f6dc9357SAndroid Build Coastguard Worker Add_Color2(v);
1824*f6dc9357SAndroid Build Coastguard Worker }
1825*f6dc9357SAndroid Build Coastguard Worker
Add_Color(UInt32 v)1826*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_Color(UInt32 v)
1827*f6dc9357SAndroid Build Coastguard Worker {
1828*f6dc9357SAndroid Build Coastguard Worker Script += "0x";
1829*f6dc9357SAndroid Build Coastguard Worker Add_Color2(v);
1830*f6dc9357SAndroid Build Coastguard Worker }
1831*f6dc9357SAndroid Build Coastguard Worker
1832*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_SW_HIDE 0
1833*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_SW_SHOWNORMAL 1
1834*f6dc9357SAndroid Build Coastguard Worker
1835*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_SW_SHOWMINIMIZED 2
1836*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_SW_SHOWMINNOACTIVE 7
1837*f6dc9357SAndroid Build Coastguard Worker #define Z7_NSIS_WIN_SW_SHOWNA 8
1838*f6dc9357SAndroid Build Coastguard Worker
1839*f6dc9357SAndroid Build Coastguard Worker static const char * const kShowWindow_Commands[] =
1840*f6dc9357SAndroid Build Coastguard Worker {
1841*f6dc9357SAndroid Build Coastguard Worker "HIDE"
1842*f6dc9357SAndroid Build Coastguard Worker , "SHOWNORMAL" // "NORMAL"
1843*f6dc9357SAndroid Build Coastguard Worker , "SHOWMINIMIZED"
1844*f6dc9357SAndroid Build Coastguard Worker , "SHOWMAXIMIZED" // "MAXIMIZE"
1845*f6dc9357SAndroid Build Coastguard Worker , "SHOWNOACTIVATE"
1846*f6dc9357SAndroid Build Coastguard Worker , "SHOW"
1847*f6dc9357SAndroid Build Coastguard Worker , "MINIMIZE"
1848*f6dc9357SAndroid Build Coastguard Worker , "SHOWMINNOACTIVE"
1849*f6dc9357SAndroid Build Coastguard Worker , "SHOWNA"
1850*f6dc9357SAndroid Build Coastguard Worker , "RESTORE"
1851*f6dc9357SAndroid Build Coastguard Worker , "SHOWDEFAULT"
1852*f6dc9357SAndroid Build Coastguard Worker , "FORCEMINIMIZE" // "MAX"
1853*f6dc9357SAndroid Build Coastguard Worker };
1854*f6dc9357SAndroid Build Coastguard Worker
Add_ShowWindow_Cmd_2(AString & s,UInt32 cmd)1855*f6dc9357SAndroid Build Coastguard Worker static void Add_ShowWindow_Cmd_2(AString &s, UInt32 cmd)
1856*f6dc9357SAndroid Build Coastguard Worker {
1857*f6dc9357SAndroid Build Coastguard Worker if (cmd < Z7_ARRAY_SIZE(kShowWindow_Commands))
1858*f6dc9357SAndroid Build Coastguard Worker {
1859*f6dc9357SAndroid Build Coastguard Worker s += "SW_";
1860*f6dc9357SAndroid Build Coastguard Worker s += kShowWindow_Commands[cmd];
1861*f6dc9357SAndroid Build Coastguard Worker }
1862*f6dc9357SAndroid Build Coastguard Worker else
1863*f6dc9357SAndroid Build Coastguard Worker UIntToString(s, cmd);
1864*f6dc9357SAndroid Build Coastguard Worker }
1865*f6dc9357SAndroid Build Coastguard Worker
Add_ShowWindow_Cmd(UInt32 cmd)1866*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_ShowWindow_Cmd(UInt32 cmd)
1867*f6dc9357SAndroid Build Coastguard Worker {
1868*f6dc9357SAndroid Build Coastguard Worker if (cmd < Z7_ARRAY_SIZE(kShowWindow_Commands))
1869*f6dc9357SAndroid Build Coastguard Worker {
1870*f6dc9357SAndroid Build Coastguard Worker Script += "SW_";
1871*f6dc9357SAndroid Build Coastguard Worker Script += kShowWindow_Commands[cmd];
1872*f6dc9357SAndroid Build Coastguard Worker }
1873*f6dc9357SAndroid Build Coastguard Worker else
1874*f6dc9357SAndroid Build Coastguard Worker Add_UInt(cmd);
1875*f6dc9357SAndroid Build Coastguard Worker }
1876*f6dc9357SAndroid Build Coastguard Worker
Add_TypeFromList(const char * const * table,unsigned tableSize,UInt32 type)1877*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_TypeFromList(const char * const *table, unsigned tableSize, UInt32 type)
1878*f6dc9357SAndroid Build Coastguard Worker {
1879*f6dc9357SAndroid Build Coastguard Worker if (type < tableSize)
1880*f6dc9357SAndroid Build Coastguard Worker Script += table[type];
1881*f6dc9357SAndroid Build Coastguard Worker else
1882*f6dc9357SAndroid Build Coastguard Worker {
1883*f6dc9357SAndroid Build Coastguard Worker Script += '_';
1884*f6dc9357SAndroid Build Coastguard Worker Add_UInt(type);
1885*f6dc9357SAndroid Build Coastguard Worker }
1886*f6dc9357SAndroid Build Coastguard Worker }
1887*f6dc9357SAndroid Build Coastguard Worker
1888*f6dc9357SAndroid Build Coastguard Worker #define ADD_TYPE_FROM_LIST(table, type) Add_TypeFromList(table, Z7_ARRAY_SIZE(table), type)
1889*f6dc9357SAndroid Build Coastguard Worker
1890*f6dc9357SAndroid Build Coastguard Worker enum
1891*f6dc9357SAndroid Build Coastguard Worker {
1892*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_AutoClose,
1893*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_ShellVarContext,
1894*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_Errors,
1895*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_Abort,
1896*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_RebootFlag,
1897*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_reboot_called,
1898*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_cur_insttype,
1899*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_plugin_api_version,
1900*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_Silent,
1901*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_InstDirError,
1902*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_rtl,
1903*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_ErrorLevel,
1904*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_RegView,
1905*f6dc9357SAndroid Build Coastguard Worker k_ExecFlags_DetailsPrint = 13
1906*f6dc9357SAndroid Build Coastguard Worker };
1907*f6dc9357SAndroid Build Coastguard Worker
1908*f6dc9357SAndroid Build Coastguard Worker // Names for NSIS exec_flags_t structure vars
1909*f6dc9357SAndroid Build Coastguard Worker static const char * const kExecFlags_VarsNames[] =
1910*f6dc9357SAndroid Build Coastguard Worker {
1911*f6dc9357SAndroid Build Coastguard Worker "AutoClose" // autoclose;
1912*f6dc9357SAndroid Build Coastguard Worker , "ShellVarContext" // all_user_var;
1913*f6dc9357SAndroid Build Coastguard Worker , "Errors" // exec_error;
1914*f6dc9357SAndroid Build Coastguard Worker , "Abort" // abort;
1915*f6dc9357SAndroid Build Coastguard Worker , "RebootFlag" // exec_reboot; // NSIS_SUPPORT_REBOOT
1916*f6dc9357SAndroid Build Coastguard Worker , "reboot_called" // reboot_called; // NSIS_SUPPORT_REBOOT
1917*f6dc9357SAndroid Build Coastguard Worker , "cur_insttype" // XXX_cur_insttype; // depreacted
1918*f6dc9357SAndroid Build Coastguard Worker , "plugin_api_version" // plugin_api_version; // see NSISPIAPIVER_CURR
1919*f6dc9357SAndroid Build Coastguard Worker // used to be XXX_insttype_changed
1920*f6dc9357SAndroid Build Coastguard Worker , "Silent" // silent; // NSIS_CONFIG_SILENT_SUPPORT
1921*f6dc9357SAndroid Build Coastguard Worker , "InstDirError" // instdir_error;
1922*f6dc9357SAndroid Build Coastguard Worker , "rtl" // rtl;
1923*f6dc9357SAndroid Build Coastguard Worker , "ErrorLevel" // errlvl;
1924*f6dc9357SAndroid Build Coastguard Worker , "RegView" // alter_reg_view;
1925*f6dc9357SAndroid Build Coastguard Worker , "DetailsPrint" // status_update;
1926*f6dc9357SAndroid Build Coastguard Worker };
1927*f6dc9357SAndroid Build Coastguard Worker
Add_ExecFlags(UInt32 flagsType)1928*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_ExecFlags(UInt32 flagsType)
1929*f6dc9357SAndroid Build Coastguard Worker {
1930*f6dc9357SAndroid Build Coastguard Worker ADD_TYPE_FROM_LIST(kExecFlags_VarsNames, flagsType);
1931*f6dc9357SAndroid Build Coastguard Worker }
1932*f6dc9357SAndroid Build Coastguard Worker
1933*f6dc9357SAndroid Build Coastguard Worker
1934*f6dc9357SAndroid Build Coastguard Worker // ---------- Page ----------
1935*f6dc9357SAndroid Build Coastguard Worker
1936*f6dc9357SAndroid Build Coastguard Worker // page flags
1937*f6dc9357SAndroid Build Coastguard Worker #define PF_CANCEL_ENABLE 4
1938*f6dc9357SAndroid Build Coastguard Worker #define PF_LICENSE_FORCE_SELECTION 32
1939*f6dc9357SAndroid Build Coastguard Worker #define PF_LICENSE_NO_FORCE_SELECTION 64
1940*f6dc9357SAndroid Build Coastguard Worker #define PF_PAGE_EX 512
1941*f6dc9357SAndroid Build Coastguard Worker #define PF_DIR_NO_BTN_DISABLE 1024
1942*f6dc9357SAndroid Build Coastguard Worker /*
1943*f6dc9357SAndroid Build Coastguard Worker #define PF_LICENSE_SELECTED 1
1944*f6dc9357SAndroid Build Coastguard Worker #define PF_NEXT_ENABLE 2
1945*f6dc9357SAndroid Build Coastguard Worker #define PF_BACK_SHOW 8
1946*f6dc9357SAndroid Build Coastguard Worker #define PF_LICENSE_STREAM 16
1947*f6dc9357SAndroid Build Coastguard Worker #define PF_NO_NEXT_FOCUS 128
1948*f6dc9357SAndroid Build Coastguard Worker #define PF_BACK_ENABLE 256
1949*f6dc9357SAndroid Build Coastguard Worker */
1950*f6dc9357SAndroid Build Coastguard Worker
1951*f6dc9357SAndroid Build Coastguard Worker // page window proc
1952*f6dc9357SAndroid Build Coastguard Worker enum
1953*f6dc9357SAndroid Build Coastguard Worker {
1954*f6dc9357SAndroid Build Coastguard Worker PWP_LICENSE,
1955*f6dc9357SAndroid Build Coastguard Worker PWP_SELCOM,
1956*f6dc9357SAndroid Build Coastguard Worker PWP_DIR,
1957*f6dc9357SAndroid Build Coastguard Worker PWP_INSTFILES,
1958*f6dc9357SAndroid Build Coastguard Worker PWP_UNINST,
1959*f6dc9357SAndroid Build Coastguard Worker PWP_COMPLETED,
1960*f6dc9357SAndroid Build Coastguard Worker PWP_CUSTOM
1961*f6dc9357SAndroid Build Coastguard Worker };
1962*f6dc9357SAndroid Build Coastguard Worker
1963*f6dc9357SAndroid Build Coastguard Worker static const char * const kPageTypes[] =
1964*f6dc9357SAndroid Build Coastguard Worker {
1965*f6dc9357SAndroid Build Coastguard Worker "license"
1966*f6dc9357SAndroid Build Coastguard Worker , "components"
1967*f6dc9357SAndroid Build Coastguard Worker , "directory"
1968*f6dc9357SAndroid Build Coastguard Worker , "instfiles"
1969*f6dc9357SAndroid Build Coastguard Worker , "uninstConfirm"
1970*f6dc9357SAndroid Build Coastguard Worker , "COMPLETED"
1971*f6dc9357SAndroid Build Coastguard Worker , "custom"
1972*f6dc9357SAndroid Build Coastguard Worker };
1973*f6dc9357SAndroid Build Coastguard Worker
1974*f6dc9357SAndroid Build Coastguard Worker #define SET_FUNC_REF(x, flag) if ((Int32)(x) >= 0 && (x) < bh.Num) \
1975*f6dc9357SAndroid Build Coastguard Worker { labels[x] = (labels[x] & ~CMD_REF_Page_Mask) | ((flag) | (pageIndex << CMD_REF_Page_NumShifts)); }
1976*f6dc9357SAndroid Build Coastguard Worker
1977*f6dc9357SAndroid Build Coastguard Worker // #define IDD_LICENSE 102
1978*f6dc9357SAndroid Build Coastguard Worker #define IDD_LICENSE_FSRB 108
1979*f6dc9357SAndroid Build Coastguard Worker #define IDD_LICENSE_FSCB 109
1980*f6dc9357SAndroid Build Coastguard Worker
AddPageOption1(UInt32 param,const char * name)1981*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddPageOption1(UInt32 param, const char *name)
1982*f6dc9357SAndroid Build Coastguard Worker {
1983*f6dc9357SAndroid Build Coastguard Worker if (param == 0)
1984*f6dc9357SAndroid Build Coastguard Worker return;
1985*f6dc9357SAndroid Build Coastguard Worker TabString(name);
1986*f6dc9357SAndroid Build Coastguard Worker AddParam(param);
1987*f6dc9357SAndroid Build Coastguard Worker NewLine();
1988*f6dc9357SAndroid Build Coastguard Worker }
1989*f6dc9357SAndroid Build Coastguard Worker
AddPageOption(const UInt32 * params,unsigned num,const char * name)1990*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddPageOption(const UInt32 *params, unsigned num, const char *name)
1991*f6dc9357SAndroid Build Coastguard Worker {
1992*f6dc9357SAndroid Build Coastguard Worker num = GetNumParams(params, num);
1993*f6dc9357SAndroid Build Coastguard Worker if (num == 0)
1994*f6dc9357SAndroid Build Coastguard Worker return;
1995*f6dc9357SAndroid Build Coastguard Worker TabString(name);
1996*f6dc9357SAndroid Build Coastguard Worker AddParams(params, num);
1997*f6dc9357SAndroid Build Coastguard Worker NewLine();
1998*f6dc9357SAndroid Build Coastguard Worker }
1999*f6dc9357SAndroid Build Coastguard Worker
Separator()2000*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Separator()
2001*f6dc9357SAndroid Build Coastguard Worker {
2002*f6dc9357SAndroid Build Coastguard Worker AddLF();
2003*f6dc9357SAndroid Build Coastguard Worker AddCommentAndString("--------------------");
2004*f6dc9357SAndroid Build Coastguard Worker AddLF();
2005*f6dc9357SAndroid Build Coastguard Worker }
2006*f6dc9357SAndroid Build Coastguard Worker
Space()2007*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Space()
2008*f6dc9357SAndroid Build Coastguard Worker {
2009*f6dc9357SAndroid Build Coastguard Worker Script += ' ';
2010*f6dc9357SAndroid Build Coastguard Worker }
2011*f6dc9357SAndroid Build Coastguard Worker
Tab()2012*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Tab()
2013*f6dc9357SAndroid Build Coastguard Worker {
2014*f6dc9357SAndroid Build Coastguard Worker Script += " ";
2015*f6dc9357SAndroid Build Coastguard Worker }
2016*f6dc9357SAndroid Build Coastguard Worker
Tab(bool commented)2017*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Tab(bool commented)
2018*f6dc9357SAndroid Build Coastguard Worker {
2019*f6dc9357SAndroid Build Coastguard Worker Script += commented ? " ; " : " ";
2020*f6dc9357SAndroid Build Coastguard Worker }
2021*f6dc9357SAndroid Build Coastguard Worker
BigSpaceComment()2022*f6dc9357SAndroid Build Coastguard Worker void CInArchive::BigSpaceComment()
2023*f6dc9357SAndroid Build Coastguard Worker {
2024*f6dc9357SAndroid Build Coastguard Worker Script += " ; ";
2025*f6dc9357SAndroid Build Coastguard Worker }
2026*f6dc9357SAndroid Build Coastguard Worker
SmallSpaceComment()2027*f6dc9357SAndroid Build Coastguard Worker void CInArchive::SmallSpaceComment()
2028*f6dc9357SAndroid Build Coastguard Worker {
2029*f6dc9357SAndroid Build Coastguard Worker Script += " ; ";
2030*f6dc9357SAndroid Build Coastguard Worker }
2031*f6dc9357SAndroid Build Coastguard Worker
AddCommentAndString(const char * s)2032*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddCommentAndString(const char *s)
2033*f6dc9357SAndroid Build Coastguard Worker {
2034*f6dc9357SAndroid Build Coastguard Worker Script += "; ";
2035*f6dc9357SAndroid Build Coastguard Worker Script += s;
2036*f6dc9357SAndroid Build Coastguard Worker }
2037*f6dc9357SAndroid Build Coastguard Worker
AddError(const char * s)2038*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddError(const char *s)
2039*f6dc9357SAndroid Build Coastguard Worker {
2040*f6dc9357SAndroid Build Coastguard Worker BigSpaceComment();
2041*f6dc9357SAndroid Build Coastguard Worker Script += "!!! ERROR: ";
2042*f6dc9357SAndroid Build Coastguard Worker Script += s;
2043*f6dc9357SAndroid Build Coastguard Worker }
2044*f6dc9357SAndroid Build Coastguard Worker
AddErrorLF(const char * s)2045*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddErrorLF(const char *s)
2046*f6dc9357SAndroid Build Coastguard Worker {
2047*f6dc9357SAndroid Build Coastguard Worker AddError(s);
2048*f6dc9357SAndroid Build Coastguard Worker AddLF();
2049*f6dc9357SAndroid Build Coastguard Worker }
2050*f6dc9357SAndroid Build Coastguard Worker
CommentOpen()2051*f6dc9357SAndroid Build Coastguard Worker void CInArchive::CommentOpen()
2052*f6dc9357SAndroid Build Coastguard Worker {
2053*f6dc9357SAndroid Build Coastguard Worker AddStringLF("/*");
2054*f6dc9357SAndroid Build Coastguard Worker }
2055*f6dc9357SAndroid Build Coastguard Worker
CommentClose()2056*f6dc9357SAndroid Build Coastguard Worker void CInArchive::CommentClose()
2057*f6dc9357SAndroid Build Coastguard Worker {
2058*f6dc9357SAndroid Build Coastguard Worker AddStringLF("*/");
2059*f6dc9357SAndroid Build Coastguard Worker }
2060*f6dc9357SAndroid Build Coastguard Worker
AddLF()2061*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddLF()
2062*f6dc9357SAndroid Build Coastguard Worker {
2063*f6dc9357SAndroid Build Coastguard Worker Script += CR_LF;
2064*f6dc9357SAndroid Build Coastguard Worker }
2065*f6dc9357SAndroid Build Coastguard Worker
AddQuotes()2066*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddQuotes()
2067*f6dc9357SAndroid Build Coastguard Worker {
2068*f6dc9357SAndroid Build Coastguard Worker Script += "\"\"";
2069*f6dc9357SAndroid Build Coastguard Worker }
2070*f6dc9357SAndroid Build Coastguard Worker
TabString(const char * s)2071*f6dc9357SAndroid Build Coastguard Worker void CInArchive::TabString(const char *s)
2072*f6dc9357SAndroid Build Coastguard Worker {
2073*f6dc9357SAndroid Build Coastguard Worker Tab();
2074*f6dc9357SAndroid Build Coastguard Worker Script += s;
2075*f6dc9357SAndroid Build Coastguard Worker }
2076*f6dc9357SAndroid Build Coastguard Worker
AddStringLF(const char * s)2077*f6dc9357SAndroid Build Coastguard Worker void CInArchive::AddStringLF(const char *s)
2078*f6dc9357SAndroid Build Coastguard Worker {
2079*f6dc9357SAndroid Build Coastguard Worker Script += s;
2080*f6dc9357SAndroid Build Coastguard Worker AddLF();
2081*f6dc9357SAndroid Build Coastguard Worker }
2082*f6dc9357SAndroid Build Coastguard Worker
2083*f6dc9357SAndroid Build Coastguard Worker // ---------- Section ----------
2084*f6dc9357SAndroid Build Coastguard Worker
2085*f6dc9357SAndroid Build Coastguard Worker static const char * const kSection_VarsNames[] =
2086*f6dc9357SAndroid Build Coastguard Worker {
2087*f6dc9357SAndroid Build Coastguard Worker "Text"
2088*f6dc9357SAndroid Build Coastguard Worker , "InstTypes"
2089*f6dc9357SAndroid Build Coastguard Worker , "Flags"
2090*f6dc9357SAndroid Build Coastguard Worker , "Code"
2091*f6dc9357SAndroid Build Coastguard Worker , "CodeSize"
2092*f6dc9357SAndroid Build Coastguard Worker , "Size" // size in KB
2093*f6dc9357SAndroid Build Coastguard Worker };
2094*f6dc9357SAndroid Build Coastguard Worker
Add_SectOp(UInt32 opType)2095*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Add_SectOp(UInt32 opType)
2096*f6dc9357SAndroid Build Coastguard Worker {
2097*f6dc9357SAndroid Build Coastguard Worker ADD_TYPE_FROM_LIST(kSection_VarsNames, opType);
2098*f6dc9357SAndroid Build Coastguard Worker }
2099*f6dc9357SAndroid Build Coastguard Worker
Parse(const Byte * p)2100*f6dc9357SAndroid Build Coastguard Worker void CSection::Parse(const Byte *p)
2101*f6dc9357SAndroid Build Coastguard Worker {
2102*f6dc9357SAndroid Build Coastguard Worker Name = Get32(p);
2103*f6dc9357SAndroid Build Coastguard Worker InstallTypes = Get32(p + 4);
2104*f6dc9357SAndroid Build Coastguard Worker Flags = Get32(p + 8);
2105*f6dc9357SAndroid Build Coastguard Worker StartCmdIndex = Get32(p + 12);
2106*f6dc9357SAndroid Build Coastguard Worker NumCommands = Get32(p + 16);
2107*f6dc9357SAndroid Build Coastguard Worker SizeKB = Get32(p + 20);
2108*f6dc9357SAndroid Build Coastguard Worker }
2109*f6dc9357SAndroid Build Coastguard Worker
2110*f6dc9357SAndroid Build Coastguard Worker // used for section->flags
2111*f6dc9357SAndroid Build Coastguard Worker #define SF_SELECTED (1 << 0)
2112*f6dc9357SAndroid Build Coastguard Worker #define SF_SECGRP (1 << 1)
2113*f6dc9357SAndroid Build Coastguard Worker #define SF_SECGRPEND (1 << 2)
2114*f6dc9357SAndroid Build Coastguard Worker #define SF_BOLD (1 << 3)
2115*f6dc9357SAndroid Build Coastguard Worker #define SF_RO (1 << 4)
2116*f6dc9357SAndroid Build Coastguard Worker #define SF_EXPAND (1 << 5)
2117*f6dc9357SAndroid Build Coastguard Worker /*
2118*f6dc9357SAndroid Build Coastguard Worker #define SF_PSELECTED (1 << 6)
2119*f6dc9357SAndroid Build Coastguard Worker #define SF_TOGGLED (1 << 7)
2120*f6dc9357SAndroid Build Coastguard Worker #define SF_NAMECHG (1 << 8)
2121*f6dc9357SAndroid Build Coastguard Worker */
2122*f6dc9357SAndroid Build Coastguard Worker
PrintSectionBegin(const CSection & sect,unsigned index)2123*f6dc9357SAndroid Build Coastguard Worker bool CInArchive::PrintSectionBegin(const CSection §, unsigned index)
2124*f6dc9357SAndroid Build Coastguard Worker {
2125*f6dc9357SAndroid Build Coastguard Worker AString name;
2126*f6dc9357SAndroid Build Coastguard Worker if (sect.Flags & SF_BOLD)
2127*f6dc9357SAndroid Build Coastguard Worker name += '!';
2128*f6dc9357SAndroid Build Coastguard Worker AString s2;
2129*f6dc9357SAndroid Build Coastguard Worker ReadString2(s2, sect.Name);
2130*f6dc9357SAndroid Build Coastguard Worker if (!IsInstaller)
2131*f6dc9357SAndroid Build Coastguard Worker {
2132*f6dc9357SAndroid Build Coastguard Worker if (!StringsAreEqualNoCase_Ascii(s2, "uninstall"))
2133*f6dc9357SAndroid Build Coastguard Worker name += "un.";
2134*f6dc9357SAndroid Build Coastguard Worker }
2135*f6dc9357SAndroid Build Coastguard Worker name += s2;
2136*f6dc9357SAndroid Build Coastguard Worker
2137*f6dc9357SAndroid Build Coastguard Worker if (sect.Flags & SF_SECGRPEND)
2138*f6dc9357SAndroid Build Coastguard Worker {
2139*f6dc9357SAndroid Build Coastguard Worker AddStringLF("SectionGroupEnd");
2140*f6dc9357SAndroid Build Coastguard Worker return true;
2141*f6dc9357SAndroid Build Coastguard Worker }
2142*f6dc9357SAndroid Build Coastguard Worker
2143*f6dc9357SAndroid Build Coastguard Worker if (sect.Flags & SF_SECGRP)
2144*f6dc9357SAndroid Build Coastguard Worker {
2145*f6dc9357SAndroid Build Coastguard Worker Script += "SectionGroup";
2146*f6dc9357SAndroid Build Coastguard Worker if (sect.Flags & SF_EXPAND)
2147*f6dc9357SAndroid Build Coastguard Worker Script += " /e";
2148*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(name);
2149*f6dc9357SAndroid Build Coastguard Worker Script += " ; Section";
2150*f6dc9357SAndroid Build Coastguard Worker AddParam_UInt(index);
2151*f6dc9357SAndroid Build Coastguard Worker NewLine();
2152*f6dc9357SAndroid Build Coastguard Worker return true;
2153*f6dc9357SAndroid Build Coastguard Worker }
2154*f6dc9357SAndroid Build Coastguard Worker
2155*f6dc9357SAndroid Build Coastguard Worker Script += "Section";
2156*f6dc9357SAndroid Build Coastguard Worker if ((sect.Flags & SF_SELECTED) == 0)
2157*f6dc9357SAndroid Build Coastguard Worker Script += " /o";
2158*f6dc9357SAndroid Build Coastguard Worker if (!name.IsEmpty())
2159*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(name);
2160*f6dc9357SAndroid Build Coastguard Worker
2161*f6dc9357SAndroid Build Coastguard Worker /*
2162*f6dc9357SAndroid Build Coastguard Worker if (!name.IsEmpty())
2163*f6dc9357SAndroid Build Coastguard Worker Script += ' ';
2164*f6dc9357SAndroid Build Coastguard Worker else
2165*f6dc9357SAndroid Build Coastguard Worker */
2166*f6dc9357SAndroid Build Coastguard Worker SmallSpaceComment();
2167*f6dc9357SAndroid Build Coastguard Worker Script += "Section_";
2168*f6dc9357SAndroid Build Coastguard Worker Add_UInt(index);
2169*f6dc9357SAndroid Build Coastguard Worker
2170*f6dc9357SAndroid Build Coastguard Worker /*
2171*f6dc9357SAndroid Build Coastguard Worker Script += " ; flags = ";
2172*f6dc9357SAndroid Build Coastguard Worker Add_Hex(Script, sect.Flags);
2173*f6dc9357SAndroid Build Coastguard Worker */
2174*f6dc9357SAndroid Build Coastguard Worker
2175*f6dc9357SAndroid Build Coastguard Worker NewLine();
2176*f6dc9357SAndroid Build Coastguard Worker
2177*f6dc9357SAndroid Build Coastguard Worker if (sect.SizeKB != 0)
2178*f6dc9357SAndroid Build Coastguard Worker {
2179*f6dc9357SAndroid Build Coastguard Worker // probably we must show AddSize, only if there is additional size.
2180*f6dc9357SAndroid Build Coastguard Worker Tab();
2181*f6dc9357SAndroid Build Coastguard Worker AddCommentAndString("AddSize");
2182*f6dc9357SAndroid Build Coastguard Worker AddParam_UInt(sect.SizeKB);
2183*f6dc9357SAndroid Build Coastguard Worker AddLF();
2184*f6dc9357SAndroid Build Coastguard Worker }
2185*f6dc9357SAndroid Build Coastguard Worker
2186*f6dc9357SAndroid Build Coastguard Worker bool needSectionIn =
2187*f6dc9357SAndroid Build Coastguard Worker (sect.Name != 0 && sect.InstallTypes != 0) ||
2188*f6dc9357SAndroid Build Coastguard Worker (sect.Name == 0 && sect.InstallTypes != 0xFFFFFFFF);
2189*f6dc9357SAndroid Build Coastguard Worker if (needSectionIn || (sect.Flags & SF_RO) != 0)
2190*f6dc9357SAndroid Build Coastguard Worker {
2191*f6dc9357SAndroid Build Coastguard Worker TabString("SectionIn");
2192*f6dc9357SAndroid Build Coastguard Worker UInt32 instTypes = sect.InstallTypes;
2193*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < 32; i++, instTypes >>= 1)
2194*f6dc9357SAndroid Build Coastguard Worker if ((instTypes & 1) != 0)
2195*f6dc9357SAndroid Build Coastguard Worker {
2196*f6dc9357SAndroid Build Coastguard Worker AddParam_UInt(i + 1);
2197*f6dc9357SAndroid Build Coastguard Worker }
2198*f6dc9357SAndroid Build Coastguard Worker if ((sect.Flags & SF_RO) != 0)
2199*f6dc9357SAndroid Build Coastguard Worker Script += " RO";
2200*f6dc9357SAndroid Build Coastguard Worker AddLF();
2201*f6dc9357SAndroid Build Coastguard Worker }
2202*f6dc9357SAndroid Build Coastguard Worker return false;
2203*f6dc9357SAndroid Build Coastguard Worker }
2204*f6dc9357SAndroid Build Coastguard Worker
PrintSectionEnd()2205*f6dc9357SAndroid Build Coastguard Worker void CInArchive::PrintSectionEnd()
2206*f6dc9357SAndroid Build Coastguard Worker {
2207*f6dc9357SAndroid Build Coastguard Worker AddStringLF("SectionEnd");
2208*f6dc9357SAndroid Build Coastguard Worker AddLF();
2209*f6dc9357SAndroid Build Coastguard Worker }
2210*f6dc9357SAndroid Build Coastguard Worker
2211*f6dc9357SAndroid Build Coastguard Worker // static const unsigned kOnFuncShift = 4;
2212*f6dc9357SAndroid Build Coastguard Worker
ClearLangComment()2213*f6dc9357SAndroid Build Coastguard Worker void CInArchive::ClearLangComment()
2214*f6dc9357SAndroid Build Coastguard Worker {
2215*f6dc9357SAndroid Build Coastguard Worker langStrIDs.Clear();
2216*f6dc9357SAndroid Build Coastguard Worker }
2217*f6dc9357SAndroid Build Coastguard Worker
PrintNumComment(const char * name,UInt32 value)2218*f6dc9357SAndroid Build Coastguard Worker void CInArchive::PrintNumComment(const char *name, UInt32 value)
2219*f6dc9357SAndroid Build Coastguard Worker {
2220*f6dc9357SAndroid Build Coastguard Worker // size_t len = Script.Len();
2221*f6dc9357SAndroid Build Coastguard Worker AddCommentAndString(name);
2222*f6dc9357SAndroid Build Coastguard Worker Script += ": ";
2223*f6dc9357SAndroid Build Coastguard Worker Add_UInt(value);
2224*f6dc9357SAndroid Build Coastguard Worker AddLF();
2225*f6dc9357SAndroid Build Coastguard Worker /*
2226*f6dc9357SAndroid Build Coastguard Worker len = Script.Len() - len;
2227*f6dc9357SAndroid Build Coastguard Worker char sz[16];
2228*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToString(value, sz);
2229*f6dc9357SAndroid Build Coastguard Worker len += MyStringLen(sz);
2230*f6dc9357SAndroid Build Coastguard Worker for (; len < 20; len++)
2231*f6dc9357SAndroid Build Coastguard Worker Space();
2232*f6dc9357SAndroid Build Coastguard Worker AddStringLF(sz);
2233*f6dc9357SAndroid Build Coastguard Worker */
2234*f6dc9357SAndroid Build Coastguard Worker }
2235*f6dc9357SAndroid Build Coastguard Worker
2236*f6dc9357SAndroid Build Coastguard Worker
NewLine()2237*f6dc9357SAndroid Build Coastguard Worker void CInArchive::NewLine()
2238*f6dc9357SAndroid Build Coastguard Worker {
2239*f6dc9357SAndroid Build Coastguard Worker if (!langStrIDs.IsEmpty())
2240*f6dc9357SAndroid Build Coastguard Worker {
2241*f6dc9357SAndroid Build Coastguard Worker BigSpaceComment();
2242*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < langStrIDs.Size() && i < 20; i++)
2243*f6dc9357SAndroid Build Coastguard Worker {
2244*f6dc9357SAndroid Build Coastguard Worker /*
2245*f6dc9357SAndroid Build Coastguard Worker if (i != 0)
2246*f6dc9357SAndroid Build Coastguard Worker Script += ' ';
2247*f6dc9357SAndroid Build Coastguard Worker */
2248*f6dc9357SAndroid Build Coastguard Worker UInt32 langStr = langStrIDs[i];
2249*f6dc9357SAndroid Build Coastguard Worker if (langStr >= _numLangStrings)
2250*f6dc9357SAndroid Build Coastguard Worker {
2251*f6dc9357SAndroid Build Coastguard Worker AddError("langStr");
2252*f6dc9357SAndroid Build Coastguard Worker break;
2253*f6dc9357SAndroid Build Coastguard Worker }
2254*f6dc9357SAndroid Build Coastguard Worker UInt32 param = Get32(_mainLang + langStr * 4);
2255*f6dc9357SAndroid Build Coastguard Worker if (param != 0)
2256*f6dc9357SAndroid Build Coastguard Worker AddParam(param);
2257*f6dc9357SAndroid Build Coastguard Worker }
2258*f6dc9357SAndroid Build Coastguard Worker ClearLangComment();
2259*f6dc9357SAndroid Build Coastguard Worker }
2260*f6dc9357SAndroid Build Coastguard Worker AddLF();
2261*f6dc9357SAndroid Build Coastguard Worker }
2262*f6dc9357SAndroid Build Coastguard Worker
2263*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kPageSize = 16 * 4;
2264*f6dc9357SAndroid Build Coastguard Worker
2265*f6dc9357SAndroid Build Coastguard Worker static const char * const k_SetOverwrite_Modes[] =
2266*f6dc9357SAndroid Build Coastguard Worker {
2267*f6dc9357SAndroid Build Coastguard Worker "on"
2268*f6dc9357SAndroid Build Coastguard Worker , "off"
2269*f6dc9357SAndroid Build Coastguard Worker , "try"
2270*f6dc9357SAndroid Build Coastguard Worker , "ifnewer"
2271*f6dc9357SAndroid Build Coastguard Worker , "ifdiff"
2272*f6dc9357SAndroid Build Coastguard Worker // "lastused"
2273*f6dc9357SAndroid Build Coastguard Worker };
2274*f6dc9357SAndroid Build Coastguard Worker
2275*f6dc9357SAndroid Build Coastguard Worker
MessageBox_MB_Part(UInt32 param)2276*f6dc9357SAndroid Build Coastguard Worker void CInArchive::MessageBox_MB_Part(UInt32 param)
2277*f6dc9357SAndroid Build Coastguard Worker {
2278*f6dc9357SAndroid Build Coastguard Worker {
2279*f6dc9357SAndroid Build Coastguard Worker UInt32 v = param & 0xF;
2280*f6dc9357SAndroid Build Coastguard Worker Script += " MB_";
2281*f6dc9357SAndroid Build Coastguard Worker if (v < Z7_ARRAY_SIZE(k_MB_Buttons))
2282*f6dc9357SAndroid Build Coastguard Worker Script += k_MB_Buttons[v];
2283*f6dc9357SAndroid Build Coastguard Worker else
2284*f6dc9357SAndroid Build Coastguard Worker {
2285*f6dc9357SAndroid Build Coastguard Worker Script += "Buttons_";
2286*f6dc9357SAndroid Build Coastguard Worker Add_UInt(v);
2287*f6dc9357SAndroid Build Coastguard Worker }
2288*f6dc9357SAndroid Build Coastguard Worker }
2289*f6dc9357SAndroid Build Coastguard Worker {
2290*f6dc9357SAndroid Build Coastguard Worker UInt32 icon = (param >> 4) & 0x7;
2291*f6dc9357SAndroid Build Coastguard Worker if (icon != 0)
2292*f6dc9357SAndroid Build Coastguard Worker {
2293*f6dc9357SAndroid Build Coastguard Worker Script += "|MB_";
2294*f6dc9357SAndroid Build Coastguard Worker if (icon < Z7_ARRAY_SIZE(k_MB_Icons) && k_MB_Icons[icon])
2295*f6dc9357SAndroid Build Coastguard Worker Script += k_MB_Icons[icon];
2296*f6dc9357SAndroid Build Coastguard Worker else
2297*f6dc9357SAndroid Build Coastguard Worker {
2298*f6dc9357SAndroid Build Coastguard Worker Script += "Icon_";
2299*f6dc9357SAndroid Build Coastguard Worker Add_UInt(icon);
2300*f6dc9357SAndroid Build Coastguard Worker }
2301*f6dc9357SAndroid Build Coastguard Worker }
2302*f6dc9357SAndroid Build Coastguard Worker }
2303*f6dc9357SAndroid Build Coastguard Worker if ((param & 0x80) != 0)
2304*f6dc9357SAndroid Build Coastguard Worker Script += "|MB_USERICON";
2305*f6dc9357SAndroid Build Coastguard Worker {
2306*f6dc9357SAndroid Build Coastguard Worker UInt32 defButton = (param >> 8) & 0xF;
2307*f6dc9357SAndroid Build Coastguard Worker if (defButton != 0)
2308*f6dc9357SAndroid Build Coastguard Worker {
2309*f6dc9357SAndroid Build Coastguard Worker Script += "|MB_DEFBUTTON";
2310*f6dc9357SAndroid Build Coastguard Worker Add_UInt(defButton + 1);
2311*f6dc9357SAndroid Build Coastguard Worker }
2312*f6dc9357SAndroid Build Coastguard Worker }
2313*f6dc9357SAndroid Build Coastguard Worker {
2314*f6dc9357SAndroid Build Coastguard Worker UInt32 modal = (param >> 12) & 0x3;
2315*f6dc9357SAndroid Build Coastguard Worker if (modal == 1) Script += "|MB_SYSTEMMODAL";
2316*f6dc9357SAndroid Build Coastguard Worker else if (modal == 2) Script += "|MB_TASKMODAL";
2317*f6dc9357SAndroid Build Coastguard Worker else if (modal == 3) Script += "|0x3000";
2318*f6dc9357SAndroid Build Coastguard Worker UInt32 flags = (param >> 14);
2319*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < Z7_ARRAY_SIZE(k_MB_Flags); i++)
2320*f6dc9357SAndroid Build Coastguard Worker if ((flags & (1 << i)) != 0)
2321*f6dc9357SAndroid Build Coastguard Worker {
2322*f6dc9357SAndroid Build Coastguard Worker Script += "|MB_";
2323*f6dc9357SAndroid Build Coastguard Worker Script += k_MB_Flags[i];
2324*f6dc9357SAndroid Build Coastguard Worker }
2325*f6dc9357SAndroid Build Coastguard Worker }
2326*f6dc9357SAndroid Build Coastguard Worker }
2327*f6dc9357SAndroid Build Coastguard Worker
2328*f6dc9357SAndroid Build Coastguard Worker #define GET_CMD_PARAM(ppp, index) Get32((ppp) + 4 + (index) * 4)
2329*f6dc9357SAndroid Build Coastguard Worker
2330*f6dc9357SAndroid Build Coastguard Worker static const Byte k_InitPluginDir_Commands[] =
2331*f6dc9357SAndroid Build Coastguard Worker { 13, 26, 31, 13, 19, 21, 11, 14, 25, 31, 1, 22, 4, 1 };
2332*f6dc9357SAndroid Build Coastguard Worker
CompareCommands(const Byte * rawCmds,const Byte * sequence,size_t numCommands)2333*f6dc9357SAndroid Build Coastguard Worker bool CInArchive::CompareCommands(const Byte *rawCmds, const Byte *sequence, size_t numCommands)
2334*f6dc9357SAndroid Build Coastguard Worker {
2335*f6dc9357SAndroid Build Coastguard Worker for (UInt32 kkk = 0; kkk < numCommands; kkk++, rawCmds += kCmdSize)
2336*f6dc9357SAndroid Build Coastguard Worker if (GetCmd(Get32(rawCmds)) != sequence[kkk])
2337*f6dc9357SAndroid Build Coastguard Worker return false;
2338*f6dc9357SAndroid Build Coastguard Worker return true;
2339*f6dc9357SAndroid Build Coastguard Worker }
2340*f6dc9357SAndroid Build Coastguard Worker
2341*f6dc9357SAndroid Build Coastguard Worker
2342*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kSectionSize_base = 6 * 4;
2343*f6dc9357SAndroid Build Coastguard Worker // static const UInt32 kSectionSize_8bit = kSectionSize_base + 1024;
2344*f6dc9357SAndroid Build Coastguard Worker // static const UInt32 kSectionSize_16bit = kSectionSize_base + 1024 * 2;
2345*f6dc9357SAndroid Build Coastguard Worker // static const UInt32 kSectionSize_16bit_Big = kSectionSize_base + 8196 * 2;
2346*f6dc9357SAndroid Build Coastguard Worker // 8196 is default string length in NSIS-Unicode since 2.37.3
2347*f6dc9357SAndroid Build Coastguard Worker
2348*f6dc9357SAndroid Build Coastguard Worker #endif
2349*f6dc9357SAndroid Build Coastguard Worker
2350*f6dc9357SAndroid Build Coastguard Worker
AddString(AString & dest,const char * src)2351*f6dc9357SAndroid Build Coastguard Worker static void AddString(AString &dest, const char *src)
2352*f6dc9357SAndroid Build Coastguard Worker {
2353*f6dc9357SAndroid Build Coastguard Worker dest.Add_Space_if_NotEmpty();
2354*f6dc9357SAndroid Build Coastguard Worker dest += src;
2355*f6dc9357SAndroid Build Coastguard Worker }
2356*f6dc9357SAndroid Build Coastguard Worker
GetFormatDescription() const2357*f6dc9357SAndroid Build Coastguard Worker AString CInArchive::GetFormatDescription() const
2358*f6dc9357SAndroid Build Coastguard Worker {
2359*f6dc9357SAndroid Build Coastguard Worker AString s ("NSIS-");
2360*f6dc9357SAndroid Build Coastguard Worker char c;
2361*f6dc9357SAndroid Build Coastguard Worker if (IsPark())
2362*f6dc9357SAndroid Build Coastguard Worker {
2363*f6dc9357SAndroid Build Coastguard Worker s += "Park-";
2364*f6dc9357SAndroid Build Coastguard Worker c = '1';
2365*f6dc9357SAndroid Build Coastguard Worker if (NsisType == k_NsisType_Park2) c = '2';
2366*f6dc9357SAndroid Build Coastguard Worker else if (NsisType == k_NsisType_Park3) c = '3';
2367*f6dc9357SAndroid Build Coastguard Worker }
2368*f6dc9357SAndroid Build Coastguard Worker else
2369*f6dc9357SAndroid Build Coastguard Worker {
2370*f6dc9357SAndroid Build Coastguard Worker c = '2';
2371*f6dc9357SAndroid Build Coastguard Worker if (NsisType == k_NsisType_Nsis3)
2372*f6dc9357SAndroid Build Coastguard Worker c = '3';
2373*f6dc9357SAndroid Build Coastguard Worker }
2374*f6dc9357SAndroid Build Coastguard Worker s += c;
2375*f6dc9357SAndroid Build Coastguard Worker if (IsNsis200)
2376*f6dc9357SAndroid Build Coastguard Worker s += ".00";
2377*f6dc9357SAndroid Build Coastguard Worker else if (IsNsis225)
2378*f6dc9357SAndroid Build Coastguard Worker s += ".25";
2379*f6dc9357SAndroid Build Coastguard Worker
2380*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
2381*f6dc9357SAndroid Build Coastguard Worker AddString(s, "Unicode");
2382*f6dc9357SAndroid Build Coastguard Worker
2383*f6dc9357SAndroid Build Coastguard Worker if (Is64Bit)
2384*f6dc9357SAndroid Build Coastguard Worker AddString(s, "64-bit");
2385*f6dc9357SAndroid Build Coastguard Worker
2386*f6dc9357SAndroid Build Coastguard Worker if (LogCmdIsEnabled)
2387*f6dc9357SAndroid Build Coastguard Worker AddString(s, "log");
2388*f6dc9357SAndroid Build Coastguard Worker
2389*f6dc9357SAndroid Build Coastguard Worker if (BadCmd >= 0)
2390*f6dc9357SAndroid Build Coastguard Worker {
2391*f6dc9357SAndroid Build Coastguard Worker AddString(s, "BadCmd=");
2392*f6dc9357SAndroid Build Coastguard Worker UIntToString(s, (UInt32)BadCmd);
2393*f6dc9357SAndroid Build Coastguard Worker }
2394*f6dc9357SAndroid Build Coastguard Worker return s;
2395*f6dc9357SAndroid Build Coastguard Worker }
2396*f6dc9357SAndroid Build Coastguard Worker
2397*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
2398*f6dc9357SAndroid Build Coastguard Worker
2399*f6dc9357SAndroid Build Coastguard Worker static const unsigned kNumAdditionalParkCmds = 3;
2400*f6dc9357SAndroid Build Coastguard Worker
GetNumSupportedCommands() const2401*f6dc9357SAndroid Build Coastguard Worker unsigned CInArchive::GetNumSupportedCommands() const
2402*f6dc9357SAndroid Build Coastguard Worker {
2403*f6dc9357SAndroid Build Coastguard Worker unsigned numCmds = IsPark() ? (unsigned)kNumCmds : (unsigned)(kNumCmds) - kNumAdditionalParkCmds;
2404*f6dc9357SAndroid Build Coastguard Worker if (!LogCmdIsEnabled)
2405*f6dc9357SAndroid Build Coastguard Worker numCmds--;
2406*f6dc9357SAndroid Build Coastguard Worker if (!IsUnicode)
2407*f6dc9357SAndroid Build Coastguard Worker numCmds -= 2;
2408*f6dc9357SAndroid Build Coastguard Worker return numCmds;
2409*f6dc9357SAndroid Build Coastguard Worker }
2410*f6dc9357SAndroid Build Coastguard Worker
2411*f6dc9357SAndroid Build Coastguard Worker #endif
2412*f6dc9357SAndroid Build Coastguard Worker
GetCmd(UInt32 a)2413*f6dc9357SAndroid Build Coastguard Worker UInt32 CInArchive::GetCmd(UInt32 a)
2414*f6dc9357SAndroid Build Coastguard Worker {
2415*f6dc9357SAndroid Build Coastguard Worker if (!IsPark())
2416*f6dc9357SAndroid Build Coastguard Worker {
2417*f6dc9357SAndroid Build Coastguard Worker if (!LogCmdIsEnabled)
2418*f6dc9357SAndroid Build Coastguard Worker return a;
2419*f6dc9357SAndroid Build Coastguard Worker if (a < EW_SECTIONSET)
2420*f6dc9357SAndroid Build Coastguard Worker return a;
2421*f6dc9357SAndroid Build Coastguard Worker if (a == EW_SECTIONSET)
2422*f6dc9357SAndroid Build Coastguard Worker return EW_LOG;
2423*f6dc9357SAndroid Build Coastguard Worker return a - 1;
2424*f6dc9357SAndroid Build Coastguard Worker }
2425*f6dc9357SAndroid Build Coastguard Worker
2426*f6dc9357SAndroid Build Coastguard Worker if (a < EW_REGISTERDLL)
2427*f6dc9357SAndroid Build Coastguard Worker return a;
2428*f6dc9357SAndroid Build Coastguard Worker if (NsisType >= k_NsisType_Park2)
2429*f6dc9357SAndroid Build Coastguard Worker {
2430*f6dc9357SAndroid Build Coastguard Worker if (a == EW_REGISTERDLL) return EW_GETFONTVERSION;
2431*f6dc9357SAndroid Build Coastguard Worker a--;
2432*f6dc9357SAndroid Build Coastguard Worker }
2433*f6dc9357SAndroid Build Coastguard Worker if (NsisType >= k_NsisType_Park3)
2434*f6dc9357SAndroid Build Coastguard Worker {
2435*f6dc9357SAndroid Build Coastguard Worker if (a == EW_REGISTERDLL) return EW_GETFONTNAME;
2436*f6dc9357SAndroid Build Coastguard Worker a--;
2437*f6dc9357SAndroid Build Coastguard Worker }
2438*f6dc9357SAndroid Build Coastguard Worker if (a >= EW_FSEEK)
2439*f6dc9357SAndroid Build Coastguard Worker {
2440*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
2441*f6dc9357SAndroid Build Coastguard Worker {
2442*f6dc9357SAndroid Build Coastguard Worker if (a == EW_FSEEK) return EW_FPUTWS;
2443*f6dc9357SAndroid Build Coastguard Worker if (a == EW_FSEEK + 1) return EW_FPUTWS + 1;
2444*f6dc9357SAndroid Build Coastguard Worker a -= 2;
2445*f6dc9357SAndroid Build Coastguard Worker }
2446*f6dc9357SAndroid Build Coastguard Worker
2447*f6dc9357SAndroid Build Coastguard Worker if (a >= EW_SECTIONSET && LogCmdIsEnabled)
2448*f6dc9357SAndroid Build Coastguard Worker {
2449*f6dc9357SAndroid Build Coastguard Worker if (a == EW_SECTIONSET)
2450*f6dc9357SAndroid Build Coastguard Worker return EW_LOG;
2451*f6dc9357SAndroid Build Coastguard Worker return a - 1;
2452*f6dc9357SAndroid Build Coastguard Worker }
2453*f6dc9357SAndroid Build Coastguard Worker if (a == EW_FPUTWS)
2454*f6dc9357SAndroid Build Coastguard Worker return EW_FINDPROC;
2455*f6dc9357SAndroid Build Coastguard Worker // if (a > EW_FPUTWS) return 0;
2456*f6dc9357SAndroid Build Coastguard Worker }
2457*f6dc9357SAndroid Build Coastguard Worker return a;
2458*f6dc9357SAndroid Build Coastguard Worker }
2459*f6dc9357SAndroid Build Coastguard Worker
FindBadCmd(const CBlockHeader & bh,const Byte * p)2460*f6dc9357SAndroid Build Coastguard Worker void CInArchive::FindBadCmd(const CBlockHeader &bh, const Byte *p)
2461*f6dc9357SAndroid Build Coastguard Worker {
2462*f6dc9357SAndroid Build Coastguard Worker BadCmd = -1;
2463*f6dc9357SAndroid Build Coastguard Worker
2464*f6dc9357SAndroid Build Coastguard Worker for (UInt32 kkk = 0; kkk < bh.Num; kkk++, p += kCmdSize)
2465*f6dc9357SAndroid Build Coastguard Worker {
2466*f6dc9357SAndroid Build Coastguard Worker const UInt32 id = GetCmd(Get32(p));
2467*f6dc9357SAndroid Build Coastguard Worker if (id >= kNumCmds)
2468*f6dc9357SAndroid Build Coastguard Worker continue;
2469*f6dc9357SAndroid Build Coastguard Worker if (BadCmd >= 0 && id >= (unsigned)BadCmd)
2470*f6dc9357SAndroid Build Coastguard Worker continue;
2471*f6dc9357SAndroid Build Coastguard Worker unsigned i;
2472*f6dc9357SAndroid Build Coastguard Worker if (IsNsis3_OrHigher())
2473*f6dc9357SAndroid Build Coastguard Worker {
2474*f6dc9357SAndroid Build Coastguard Worker if (id == EW_RESERVEDOPCODE)
2475*f6dc9357SAndroid Build Coastguard Worker {
2476*f6dc9357SAndroid Build Coastguard Worker BadCmd = (int)id;
2477*f6dc9357SAndroid Build Coastguard Worker continue;
2478*f6dc9357SAndroid Build Coastguard Worker }
2479*f6dc9357SAndroid Build Coastguard Worker }
2480*f6dc9357SAndroid Build Coastguard Worker else
2481*f6dc9357SAndroid Build Coastguard Worker {
2482*f6dc9357SAndroid Build Coastguard Worker // if (id == EW_GETLABELADDR || id == EW_GETFUNCTIONADDR)
2483*f6dc9357SAndroid Build Coastguard Worker if (id == EW_RESERVEDOPCODE || id == EW_GETOSINFO)
2484*f6dc9357SAndroid Build Coastguard Worker {
2485*f6dc9357SAndroid Build Coastguard Worker BadCmd = (int)id;
2486*f6dc9357SAndroid Build Coastguard Worker continue;
2487*f6dc9357SAndroid Build Coastguard Worker }
2488*f6dc9357SAndroid Build Coastguard Worker }
2489*f6dc9357SAndroid Build Coastguard Worker for (i = 6; i != 0; i--)
2490*f6dc9357SAndroid Build Coastguard Worker {
2491*f6dc9357SAndroid Build Coastguard Worker const UInt32 param = Get32(p + i * 4);
2492*f6dc9357SAndroid Build Coastguard Worker if (param != 0)
2493*f6dc9357SAndroid Build Coastguard Worker break;
2494*f6dc9357SAndroid Build Coastguard Worker }
2495*f6dc9357SAndroid Build Coastguard Worker if (id == EW_FINDPROC && i == 0)
2496*f6dc9357SAndroid Build Coastguard Worker {
2497*f6dc9357SAndroid Build Coastguard Worker BadCmd = (int)id;
2498*f6dc9357SAndroid Build Coastguard Worker continue;
2499*f6dc9357SAndroid Build Coastguard Worker }
2500*f6dc9357SAndroid Build Coastguard Worker if (k_Commands[id].NumParams < i)
2501*f6dc9357SAndroid Build Coastguard Worker BadCmd = (int)id;
2502*f6dc9357SAndroid Build Coastguard Worker }
2503*f6dc9357SAndroid Build Coastguard Worker }
2504*f6dc9357SAndroid Build Coastguard Worker
2505*f6dc9357SAndroid Build Coastguard Worker /* We calculate the number of parameters in commands to detect
2506*f6dc9357SAndroid Build Coastguard Worker layout of commands. It's not very good way.
2507*f6dc9357SAndroid Build Coastguard Worker If you know simpler and more robust way to detect Version and layout,
2508*f6dc9357SAndroid Build Coastguard Worker please write to 7-Zip forum */
2509*f6dc9357SAndroid Build Coastguard Worker
DetectNsisType(const CBlockHeader & bh,const Byte * p)2510*f6dc9357SAndroid Build Coastguard Worker void CInArchive::DetectNsisType(const CBlockHeader &bh, const Byte *p)
2511*f6dc9357SAndroid Build Coastguard Worker {
2512*f6dc9357SAndroid Build Coastguard Worker bool strongPark = false;
2513*f6dc9357SAndroid Build Coastguard Worker bool strongNsis = false;
2514*f6dc9357SAndroid Build Coastguard Worker
2515*f6dc9357SAndroid Build Coastguard Worker if (NumStringChars > 2)
2516*f6dc9357SAndroid Build Coastguard Worker {
2517*f6dc9357SAndroid Build Coastguard Worker const Byte *strData = _data + _stringsPos;
2518*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
2519*f6dc9357SAndroid Build Coastguard Worker {
2520*f6dc9357SAndroid Build Coastguard Worker UInt32 num = NumStringChars - 2;
2521*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < num; i++)
2522*f6dc9357SAndroid Build Coastguard Worker {
2523*f6dc9357SAndroid Build Coastguard Worker if (Get16(strData + i * 2) == 0)
2524*f6dc9357SAndroid Build Coastguard Worker {
2525*f6dc9357SAndroid Build Coastguard Worker unsigned c2 = Get16(strData + 2 + i * 2);
2526*f6dc9357SAndroid Build Coastguard Worker // it can be TXT/RTF with marker char (1 or 2). so we must check next char
2527*f6dc9357SAndroid Build Coastguard Worker // if (c2 <= NS_3_CODE_SKIP && c2 != NS_3_CODE_SHELL)
2528*f6dc9357SAndroid Build Coastguard Worker if (c2 == NS_3_CODE_VAR)
2529*f6dc9357SAndroid Build Coastguard Worker {
2530*f6dc9357SAndroid Build Coastguard Worker // 18.06: fixed: is it correct ?
2531*f6dc9357SAndroid Build Coastguard Worker // if ((Get16(strData + 3 + i * 2) & 0x8000) != 0)
2532*f6dc9357SAndroid Build Coastguard Worker if ((Get16(strData + 4 + i * 2) & 0x8080) == 0x8080)
2533*f6dc9357SAndroid Build Coastguard Worker {
2534*f6dc9357SAndroid Build Coastguard Worker NsisType = k_NsisType_Nsis3;
2535*f6dc9357SAndroid Build Coastguard Worker strongNsis = true;
2536*f6dc9357SAndroid Build Coastguard Worker break;
2537*f6dc9357SAndroid Build Coastguard Worker }
2538*f6dc9357SAndroid Build Coastguard Worker }
2539*f6dc9357SAndroid Build Coastguard Worker }
2540*f6dc9357SAndroid Build Coastguard Worker }
2541*f6dc9357SAndroid Build Coastguard Worker if (!strongNsis)
2542*f6dc9357SAndroid Build Coastguard Worker {
2543*f6dc9357SAndroid Build Coastguard Worker NsisType = k_NsisType_Park1;
2544*f6dc9357SAndroid Build Coastguard Worker strongPark = true;
2545*f6dc9357SAndroid Build Coastguard Worker }
2546*f6dc9357SAndroid Build Coastguard Worker }
2547*f6dc9357SAndroid Build Coastguard Worker else
2548*f6dc9357SAndroid Build Coastguard Worker {
2549*f6dc9357SAndroid Build Coastguard Worker UInt32 num = NumStringChars - 2;
2550*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < num; i++)
2551*f6dc9357SAndroid Build Coastguard Worker {
2552*f6dc9357SAndroid Build Coastguard Worker if (strData[i] == 0)
2553*f6dc9357SAndroid Build Coastguard Worker {
2554*f6dc9357SAndroid Build Coastguard Worker Byte c2 = strData[i + 1];
2555*f6dc9357SAndroid Build Coastguard Worker // it can be TXT/RTF with marker char (1 or 2). so we must check next char
2556*f6dc9357SAndroid Build Coastguard Worker // for marker=1 (txt)
2557*f6dc9357SAndroid Build Coastguard Worker if (c2 == NS_3_CODE_VAR)
2558*f6dc9357SAndroid Build Coastguard Worker // if (c2 <= NS_3_CODE_SKIP && c2 != NS_3_CODE_SHELL && c2 != 1)
2559*f6dc9357SAndroid Build Coastguard Worker {
2560*f6dc9357SAndroid Build Coastguard Worker if ((strData[i + 2] & 0x80) != 0)
2561*f6dc9357SAndroid Build Coastguard Worker {
2562*f6dc9357SAndroid Build Coastguard Worker // const char *p2 = (const char *)(strData + i + 1);
2563*f6dc9357SAndroid Build Coastguard Worker // p2 = p2;
2564*f6dc9357SAndroid Build Coastguard Worker NsisType = k_NsisType_Nsis3;
2565*f6dc9357SAndroid Build Coastguard Worker strongNsis = true;
2566*f6dc9357SAndroid Build Coastguard Worker break;
2567*f6dc9357SAndroid Build Coastguard Worker }
2568*f6dc9357SAndroid Build Coastguard Worker }
2569*f6dc9357SAndroid Build Coastguard Worker }
2570*f6dc9357SAndroid Build Coastguard Worker }
2571*f6dc9357SAndroid Build Coastguard Worker }
2572*f6dc9357SAndroid Build Coastguard Worker }
2573*f6dc9357SAndroid Build Coastguard Worker
2574*f6dc9357SAndroid Build Coastguard Worker if (NsisType == k_NsisType_Nsis2 && !IsUnicode)
2575*f6dc9357SAndroid Build Coastguard Worker {
2576*f6dc9357SAndroid Build Coastguard Worker const Byte *p2 = p;
2577*f6dc9357SAndroid Build Coastguard Worker
2578*f6dc9357SAndroid Build Coastguard Worker for (UInt32 kkk = 0; kkk < bh.Num; kkk++, p2 += kCmdSize)
2579*f6dc9357SAndroid Build Coastguard Worker {
2580*f6dc9357SAndroid Build Coastguard Worker UInt32 cmd = GetCmd(Get32(p2));
2581*f6dc9357SAndroid Build Coastguard Worker if (cmd != EW_GETDLGITEM &&
2582*f6dc9357SAndroid Build Coastguard Worker cmd != EW_ASSIGNVAR)
2583*f6dc9357SAndroid Build Coastguard Worker continue;
2584*f6dc9357SAndroid Build Coastguard Worker
2585*f6dc9357SAndroid Build Coastguard Worker UInt32 params[kNumCommandParams];
2586*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < kNumCommandParams; i++)
2587*f6dc9357SAndroid Build Coastguard Worker params[i] = Get32(p2 + 4 + 4 * i);
2588*f6dc9357SAndroid Build Coastguard Worker
2589*f6dc9357SAndroid Build Coastguard Worker if (cmd == EW_GETDLGITEM)
2590*f6dc9357SAndroid Build Coastguard Worker {
2591*f6dc9357SAndroid Build Coastguard Worker // we can use also EW_SETCTLCOLORS
2592*f6dc9357SAndroid Build Coastguard Worker if (IsVarStr(params[1], kVar_HWNDPARENT_225))
2593*f6dc9357SAndroid Build Coastguard Worker {
2594*f6dc9357SAndroid Build Coastguard Worker IsNsis225 = true;
2595*f6dc9357SAndroid Build Coastguard Worker if (params[0] == kVar_Spec_OUTDIR_225)
2596*f6dc9357SAndroid Build Coastguard Worker {
2597*f6dc9357SAndroid Build Coastguard Worker IsNsis200 = true;
2598*f6dc9357SAndroid Build Coastguard Worker break;
2599*f6dc9357SAndroid Build Coastguard Worker }
2600*f6dc9357SAndroid Build Coastguard Worker }
2601*f6dc9357SAndroid Build Coastguard Worker }
2602*f6dc9357SAndroid Build Coastguard Worker else // if (cmd == EW_ASSIGNVAR)
2603*f6dc9357SAndroid Build Coastguard Worker {
2604*f6dc9357SAndroid Build Coastguard Worker if (params[0] == kVar_Spec_OUTDIR_225 &&
2605*f6dc9357SAndroid Build Coastguard Worker params[2] == 0 &&
2606*f6dc9357SAndroid Build Coastguard Worker params[3] == 0 &&
2607*f6dc9357SAndroid Build Coastguard Worker IsVarStr(params[1], kVar_OUTDIR))
2608*f6dc9357SAndroid Build Coastguard Worker IsNsis225 = true;
2609*f6dc9357SAndroid Build Coastguard Worker }
2610*f6dc9357SAndroid Build Coastguard Worker }
2611*f6dc9357SAndroid Build Coastguard Worker }
2612*f6dc9357SAndroid Build Coastguard Worker
2613*f6dc9357SAndroid Build Coastguard Worker bool parkVer_WasDetected = false;
2614*f6dc9357SAndroid Build Coastguard Worker
2615*f6dc9357SAndroid Build Coastguard Worker if (!strongNsis && !IsNsis225 && !IsNsis200)
2616*f6dc9357SAndroid Build Coastguard Worker {
2617*f6dc9357SAndroid Build Coastguard Worker // it must be before FindBadCmd(bh, p);
2618*f6dc9357SAndroid Build Coastguard Worker unsigned mask = 0;
2619*f6dc9357SAndroid Build Coastguard Worker
2620*f6dc9357SAndroid Build Coastguard Worker unsigned numInsertMax = IsUnicode ? 4 : 2;
2621*f6dc9357SAndroid Build Coastguard Worker
2622*f6dc9357SAndroid Build Coastguard Worker const Byte *p2 = p;
2623*f6dc9357SAndroid Build Coastguard Worker
2624*f6dc9357SAndroid Build Coastguard Worker for (UInt32 kkk = 0; kkk < bh.Num; kkk++, p2 += kCmdSize)
2625*f6dc9357SAndroid Build Coastguard Worker {
2626*f6dc9357SAndroid Build Coastguard Worker const UInt32 cmd = Get32(p2); // we use original (not converted) command
2627*f6dc9357SAndroid Build Coastguard Worker
2628*f6dc9357SAndroid Build Coastguard Worker if (cmd < EW_WRITEUNINSTALLER ||
2629*f6dc9357SAndroid Build Coastguard Worker cmd > EW_WRITEUNINSTALLER + numInsertMax)
2630*f6dc9357SAndroid Build Coastguard Worker continue;
2631*f6dc9357SAndroid Build Coastguard Worker
2632*f6dc9357SAndroid Build Coastguard Worker UInt32 params[kNumCommandParams];
2633*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < kNumCommandParams; i++)
2634*f6dc9357SAndroid Build Coastguard Worker params[i] = Get32(p2 + 4 + 4 * i);
2635*f6dc9357SAndroid Build Coastguard Worker
2636*f6dc9357SAndroid Build Coastguard Worker if (params[4] != 0 ||
2637*f6dc9357SAndroid Build Coastguard Worker params[5] != 0 ||
2638*f6dc9357SAndroid Build Coastguard Worker params[0] <= 1 ||
2639*f6dc9357SAndroid Build Coastguard Worker params[3] <= 1)
2640*f6dc9357SAndroid Build Coastguard Worker continue;
2641*f6dc9357SAndroid Build Coastguard Worker
2642*f6dc9357SAndroid Build Coastguard Worker const UInt32 altParam = params[3];
2643*f6dc9357SAndroid Build Coastguard Worker if (!IsGoodString(params[0]) ||
2644*f6dc9357SAndroid Build Coastguard Worker !IsGoodString(altParam))
2645*f6dc9357SAndroid Build Coastguard Worker continue;
2646*f6dc9357SAndroid Build Coastguard Worker
2647*f6dc9357SAndroid Build Coastguard Worker UInt32 additional = 0;
2648*f6dc9357SAndroid Build Coastguard Worker if (GetVarIndexFinished(altParam, '\\', additional) != kVar_INSTDIR)
2649*f6dc9357SAndroid Build Coastguard Worker continue;
2650*f6dc9357SAndroid Build Coastguard Worker if (AreTwoParamStringsEqual(altParam + additional, params[0]))
2651*f6dc9357SAndroid Build Coastguard Worker {
2652*f6dc9357SAndroid Build Coastguard Worker const unsigned numInserts = cmd - EW_WRITEUNINSTALLER;
2653*f6dc9357SAndroid Build Coastguard Worker mask |= ((unsigned)1 << numInserts);
2654*f6dc9357SAndroid Build Coastguard Worker }
2655*f6dc9357SAndroid Build Coastguard Worker }
2656*f6dc9357SAndroid Build Coastguard Worker
2657*f6dc9357SAndroid Build Coastguard Worker if (mask == 1)
2658*f6dc9357SAndroid Build Coastguard Worker {
2659*f6dc9357SAndroid Build Coastguard Worker parkVer_WasDetected = true; // it can be original NSIS or Park-1
2660*f6dc9357SAndroid Build Coastguard Worker }
2661*f6dc9357SAndroid Build Coastguard Worker else if (mask != 0)
2662*f6dc9357SAndroid Build Coastguard Worker {
2663*f6dc9357SAndroid Build Coastguard Worker ENsisType newType = NsisType;
2664*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
2665*f6dc9357SAndroid Build Coastguard Worker switch (mask)
2666*f6dc9357SAndroid Build Coastguard Worker {
2667*f6dc9357SAndroid Build Coastguard Worker case (1 << 3): newType = k_NsisType_Park2; break;
2668*f6dc9357SAndroid Build Coastguard Worker case (1 << 4): newType = k_NsisType_Park3; break;
2669*f6dc9357SAndroid Build Coastguard Worker }
2670*f6dc9357SAndroid Build Coastguard Worker else
2671*f6dc9357SAndroid Build Coastguard Worker switch (mask)
2672*f6dc9357SAndroid Build Coastguard Worker {
2673*f6dc9357SAndroid Build Coastguard Worker case (1 << 1): newType = k_NsisType_Park2; break;
2674*f6dc9357SAndroid Build Coastguard Worker case (1 << 2): newType = k_NsisType_Park3; break;
2675*f6dc9357SAndroid Build Coastguard Worker }
2676*f6dc9357SAndroid Build Coastguard Worker if (newType != NsisType)
2677*f6dc9357SAndroid Build Coastguard Worker {
2678*f6dc9357SAndroid Build Coastguard Worker parkVer_WasDetected = true;
2679*f6dc9357SAndroid Build Coastguard Worker NsisType = newType;
2680*f6dc9357SAndroid Build Coastguard Worker }
2681*f6dc9357SAndroid Build Coastguard Worker }
2682*f6dc9357SAndroid Build Coastguard Worker }
2683*f6dc9357SAndroid Build Coastguard Worker
2684*f6dc9357SAndroid Build Coastguard Worker FindBadCmd(bh, p);
2685*f6dc9357SAndroid Build Coastguard Worker
2686*f6dc9357SAndroid Build Coastguard Worker /*
2687*f6dc9357SAndroid Build Coastguard Worker if (strongNsis)
2688*f6dc9357SAndroid Build Coastguard Worker return;
2689*f6dc9357SAndroid Build Coastguard Worker */
2690*f6dc9357SAndroid Build Coastguard Worker
2691*f6dc9357SAndroid Build Coastguard Worker if (BadCmd < EW_REGISTERDLL)
2692*f6dc9357SAndroid Build Coastguard Worker return;
2693*f6dc9357SAndroid Build Coastguard Worker
2694*f6dc9357SAndroid Build Coastguard Worker /*
2695*f6dc9357SAndroid Build Coastguard Worker // in ANSI archive we don't check Park and log version
2696*f6dc9357SAndroid Build Coastguard Worker if (!IsUnicode)
2697*f6dc9357SAndroid Build Coastguard Worker return;
2698*f6dc9357SAndroid Build Coastguard Worker */
2699*f6dc9357SAndroid Build Coastguard Worker
2700*f6dc9357SAndroid Build Coastguard Worker // We can support Park-ANSI archives, if we remove if (strongPark) check
2701*f6dc9357SAndroid Build Coastguard Worker if (strongPark && !parkVer_WasDetected)
2702*f6dc9357SAndroid Build Coastguard Worker {
2703*f6dc9357SAndroid Build Coastguard Worker if (BadCmd < EW_SECTIONSET)
2704*f6dc9357SAndroid Build Coastguard Worker {
2705*f6dc9357SAndroid Build Coastguard Worker NsisType = k_NsisType_Park3;
2706*f6dc9357SAndroid Build Coastguard Worker LogCmdIsEnabled = true; // version 3 is provided with log enabled
2707*f6dc9357SAndroid Build Coastguard Worker FindBadCmd(bh, p);
2708*f6dc9357SAndroid Build Coastguard Worker if (BadCmd > 0 && BadCmd < EW_SECTIONSET)
2709*f6dc9357SAndroid Build Coastguard Worker {
2710*f6dc9357SAndroid Build Coastguard Worker NsisType = k_NsisType_Park2;
2711*f6dc9357SAndroid Build Coastguard Worker LogCmdIsEnabled = false;
2712*f6dc9357SAndroid Build Coastguard Worker FindBadCmd(bh, p);
2713*f6dc9357SAndroid Build Coastguard Worker if (BadCmd > 0 && BadCmd < EW_SECTIONSET)
2714*f6dc9357SAndroid Build Coastguard Worker {
2715*f6dc9357SAndroid Build Coastguard Worker NsisType = k_NsisType_Park1;
2716*f6dc9357SAndroid Build Coastguard Worker FindBadCmd(bh, p);
2717*f6dc9357SAndroid Build Coastguard Worker }
2718*f6dc9357SAndroid Build Coastguard Worker }
2719*f6dc9357SAndroid Build Coastguard Worker }
2720*f6dc9357SAndroid Build Coastguard Worker }
2721*f6dc9357SAndroid Build Coastguard Worker
2722*f6dc9357SAndroid Build Coastguard Worker if (BadCmd >= EW_SECTIONSET)
2723*f6dc9357SAndroid Build Coastguard Worker {
2724*f6dc9357SAndroid Build Coastguard Worker LogCmdIsEnabled = !LogCmdIsEnabled;
2725*f6dc9357SAndroid Build Coastguard Worker FindBadCmd(bh, p);
2726*f6dc9357SAndroid Build Coastguard Worker if (BadCmd >= EW_SECTIONSET && LogCmdIsEnabled)
2727*f6dc9357SAndroid Build Coastguard Worker {
2728*f6dc9357SAndroid Build Coastguard Worker LogCmdIsEnabled = false;
2729*f6dc9357SAndroid Build Coastguard Worker FindBadCmd(bh, p);
2730*f6dc9357SAndroid Build Coastguard Worker }
2731*f6dc9357SAndroid Build Coastguard Worker }
2732*f6dc9357SAndroid Build Coastguard Worker }
2733*f6dc9357SAndroid Build Coastguard Worker
GetVarIndex(UInt32 strPos) const2734*f6dc9357SAndroid Build Coastguard Worker Int32 CInArchive::GetVarIndex(UInt32 strPos) const
2735*f6dc9357SAndroid Build Coastguard Worker {
2736*f6dc9357SAndroid Build Coastguard Worker if (strPos >= NumStringChars)
2737*f6dc9357SAndroid Build Coastguard Worker return -1;
2738*f6dc9357SAndroid Build Coastguard Worker
2739*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
2740*f6dc9357SAndroid Build Coastguard Worker {
2741*f6dc9357SAndroid Build Coastguard Worker if (NumStringChars - strPos < 3 * 2)
2742*f6dc9357SAndroid Build Coastguard Worker return -1;
2743*f6dc9357SAndroid Build Coastguard Worker const Byte *p = _data + _stringsPos + strPos * 2;
2744*f6dc9357SAndroid Build Coastguard Worker unsigned code = Get16(p);
2745*f6dc9357SAndroid Build Coastguard Worker if (IsPark())
2746*f6dc9357SAndroid Build Coastguard Worker {
2747*f6dc9357SAndroid Build Coastguard Worker if (code != PARK_CODE_VAR)
2748*f6dc9357SAndroid Build Coastguard Worker return -1;
2749*f6dc9357SAndroid Build Coastguard Worker UInt32 n = Get16(p + 2);
2750*f6dc9357SAndroid Build Coastguard Worker if (n == 0)
2751*f6dc9357SAndroid Build Coastguard Worker return -1;
2752*f6dc9357SAndroid Build Coastguard Worker CONVERT_NUMBER_PARK(n);
2753*f6dc9357SAndroid Build Coastguard Worker return (Int32)n;
2754*f6dc9357SAndroid Build Coastguard Worker }
2755*f6dc9357SAndroid Build Coastguard Worker
2756*f6dc9357SAndroid Build Coastguard Worker // NSIS-3
2757*f6dc9357SAndroid Build Coastguard Worker {
2758*f6dc9357SAndroid Build Coastguard Worker if (code != NS_3_CODE_VAR)
2759*f6dc9357SAndroid Build Coastguard Worker return -1;
2760*f6dc9357SAndroid Build Coastguard Worker UInt32 n = Get16(p + 2);
2761*f6dc9357SAndroid Build Coastguard Worker if (n == 0)
2762*f6dc9357SAndroid Build Coastguard Worker return -1;
2763*f6dc9357SAndroid Build Coastguard Worker CONVERT_NUMBER_NS_3_UNICODE(n);
2764*f6dc9357SAndroid Build Coastguard Worker return (Int32)n;
2765*f6dc9357SAndroid Build Coastguard Worker }
2766*f6dc9357SAndroid Build Coastguard Worker }
2767*f6dc9357SAndroid Build Coastguard Worker
2768*f6dc9357SAndroid Build Coastguard Worker if (NumStringChars - strPos < 4)
2769*f6dc9357SAndroid Build Coastguard Worker return -1;
2770*f6dc9357SAndroid Build Coastguard Worker
2771*f6dc9357SAndroid Build Coastguard Worker const Byte *p = _data + _stringsPos + strPos;
2772*f6dc9357SAndroid Build Coastguard Worker unsigned c = *p;
2773*f6dc9357SAndroid Build Coastguard Worker if (NsisType == k_NsisType_Nsis3)
2774*f6dc9357SAndroid Build Coastguard Worker {
2775*f6dc9357SAndroid Build Coastguard Worker if (c != NS_3_CODE_VAR)
2776*f6dc9357SAndroid Build Coastguard Worker return -1;
2777*f6dc9357SAndroid Build Coastguard Worker }
2778*f6dc9357SAndroid Build Coastguard Worker else if (c != NS_CODE_VAR)
2779*f6dc9357SAndroid Build Coastguard Worker return -1;
2780*f6dc9357SAndroid Build Coastguard Worker
2781*f6dc9357SAndroid Build Coastguard Worker const unsigned c0 = p[1];
2782*f6dc9357SAndroid Build Coastguard Worker if (c0 == 0)
2783*f6dc9357SAndroid Build Coastguard Worker return -1;
2784*f6dc9357SAndroid Build Coastguard Worker const unsigned c1 = p[2];
2785*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0)
2786*f6dc9357SAndroid Build Coastguard Worker return -1;
2787*f6dc9357SAndroid Build Coastguard Worker return (Int32)DECODE_NUMBER_FROM_2_CHARS(c0, c1);
2788*f6dc9357SAndroid Build Coastguard Worker }
2789*f6dc9357SAndroid Build Coastguard Worker
GetVarIndex(UInt32 strPos,UInt32 & resOffset) const2790*f6dc9357SAndroid Build Coastguard Worker Int32 CInArchive::GetVarIndex(UInt32 strPos, UInt32 &resOffset) const
2791*f6dc9357SAndroid Build Coastguard Worker {
2792*f6dc9357SAndroid Build Coastguard Worker resOffset = 0;
2793*f6dc9357SAndroid Build Coastguard Worker Int32 varIndex = GetVarIndex(strPos);
2794*f6dc9357SAndroid Build Coastguard Worker if (varIndex < 0)
2795*f6dc9357SAndroid Build Coastguard Worker return varIndex;
2796*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
2797*f6dc9357SAndroid Build Coastguard Worker {
2798*f6dc9357SAndroid Build Coastguard Worker if (NumStringChars - strPos < 2 * 2)
2799*f6dc9357SAndroid Build Coastguard Worker return -1;
2800*f6dc9357SAndroid Build Coastguard Worker resOffset = 2;
2801*f6dc9357SAndroid Build Coastguard Worker }
2802*f6dc9357SAndroid Build Coastguard Worker else
2803*f6dc9357SAndroid Build Coastguard Worker {
2804*f6dc9357SAndroid Build Coastguard Worker if (NumStringChars - strPos < 3)
2805*f6dc9357SAndroid Build Coastguard Worker return -1;
2806*f6dc9357SAndroid Build Coastguard Worker resOffset = 3;
2807*f6dc9357SAndroid Build Coastguard Worker }
2808*f6dc9357SAndroid Build Coastguard Worker return varIndex;
2809*f6dc9357SAndroid Build Coastguard Worker }
2810*f6dc9357SAndroid Build Coastguard Worker
GetVarIndexFinished(UInt32 strPos,Byte endChar,UInt32 & resOffset) const2811*f6dc9357SAndroid Build Coastguard Worker Int32 CInArchive::GetVarIndexFinished(UInt32 strPos, Byte endChar, UInt32 &resOffset) const
2812*f6dc9357SAndroid Build Coastguard Worker {
2813*f6dc9357SAndroid Build Coastguard Worker resOffset = 0;
2814*f6dc9357SAndroid Build Coastguard Worker Int32 varIndex = GetVarIndex(strPos);
2815*f6dc9357SAndroid Build Coastguard Worker if (varIndex < 0)
2816*f6dc9357SAndroid Build Coastguard Worker return varIndex;
2817*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
2818*f6dc9357SAndroid Build Coastguard Worker {
2819*f6dc9357SAndroid Build Coastguard Worker if (NumStringChars - strPos < 3 * 2)
2820*f6dc9357SAndroid Build Coastguard Worker return -1;
2821*f6dc9357SAndroid Build Coastguard Worker const Byte *p = _data + _stringsPos + strPos * 2;
2822*f6dc9357SAndroid Build Coastguard Worker if (Get16(p + 4) != endChar)
2823*f6dc9357SAndroid Build Coastguard Worker return -1;
2824*f6dc9357SAndroid Build Coastguard Worker resOffset = 3;
2825*f6dc9357SAndroid Build Coastguard Worker }
2826*f6dc9357SAndroid Build Coastguard Worker else
2827*f6dc9357SAndroid Build Coastguard Worker {
2828*f6dc9357SAndroid Build Coastguard Worker if (NumStringChars - strPos < 4)
2829*f6dc9357SAndroid Build Coastguard Worker return -1;
2830*f6dc9357SAndroid Build Coastguard Worker const Byte *p = _data + _stringsPos + strPos;
2831*f6dc9357SAndroid Build Coastguard Worker if (p[3] != endChar)
2832*f6dc9357SAndroid Build Coastguard Worker return -1;
2833*f6dc9357SAndroid Build Coastguard Worker resOffset = 4;
2834*f6dc9357SAndroid Build Coastguard Worker }
2835*f6dc9357SAndroid Build Coastguard Worker return varIndex;
2836*f6dc9357SAndroid Build Coastguard Worker }
2837*f6dc9357SAndroid Build Coastguard Worker
IsVarStr(UInt32 strPos,UInt32 varIndex) const2838*f6dc9357SAndroid Build Coastguard Worker bool CInArchive::IsVarStr(UInt32 strPos, UInt32 varIndex) const
2839*f6dc9357SAndroid Build Coastguard Worker {
2840*f6dc9357SAndroid Build Coastguard Worker if (varIndex > (UInt32)0x7FFF)
2841*f6dc9357SAndroid Build Coastguard Worker return false;
2842*f6dc9357SAndroid Build Coastguard Worker UInt32 resOffset;
2843*f6dc9357SAndroid Build Coastguard Worker return GetVarIndexFinished(strPos, 0, resOffset) == (Int32)varIndex;
2844*f6dc9357SAndroid Build Coastguard Worker }
2845*f6dc9357SAndroid Build Coastguard Worker
IsAbsolutePathVar(UInt32 strPos) const2846*f6dc9357SAndroid Build Coastguard Worker bool CInArchive::IsAbsolutePathVar(UInt32 strPos) const
2847*f6dc9357SAndroid Build Coastguard Worker {
2848*f6dc9357SAndroid Build Coastguard Worker Int32 varIndex = GetVarIndex(strPos);
2849*f6dc9357SAndroid Build Coastguard Worker if (varIndex < 0)
2850*f6dc9357SAndroid Build Coastguard Worker return false;
2851*f6dc9357SAndroid Build Coastguard Worker switch (varIndex)
2852*f6dc9357SAndroid Build Coastguard Worker {
2853*f6dc9357SAndroid Build Coastguard Worker case kVar_INSTDIR:
2854*f6dc9357SAndroid Build Coastguard Worker case kVar_EXEDIR:
2855*f6dc9357SAndroid Build Coastguard Worker case kVar_TEMP:
2856*f6dc9357SAndroid Build Coastguard Worker case kVar_PLUGINSDIR:
2857*f6dc9357SAndroid Build Coastguard Worker return true;
2858*f6dc9357SAndroid Build Coastguard Worker }
2859*f6dc9357SAndroid Build Coastguard Worker return false;
2860*f6dc9357SAndroid Build Coastguard Worker }
2861*f6dc9357SAndroid Build Coastguard Worker
2862*f6dc9357SAndroid Build Coastguard Worker #define IS_LETTER_CHAR(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z'))
2863*f6dc9357SAndroid Build Coastguard Worker
2864*f6dc9357SAndroid Build Coastguard Worker // We use same check as in NSIS decoder
IsDrivePath(const wchar_t * s)2865*f6dc9357SAndroid Build Coastguard Worker static bool IsDrivePath(const wchar_t *s) { return IS_LETTER_CHAR(s[0]) && s[1] == ':' /* && s[2] == '\\' */ ; }
IsDrivePath(const char * s)2866*f6dc9357SAndroid Build Coastguard Worker static bool IsDrivePath(const char *s) { return IS_LETTER_CHAR(s[0]) && s[1] == ':' /* && s[2] == '\\' */ ; }
2867*f6dc9357SAndroid Build Coastguard Worker
IsAbsolutePath(const wchar_t * s)2868*f6dc9357SAndroid Build Coastguard Worker static bool IsAbsolutePath(const wchar_t *s)
2869*f6dc9357SAndroid Build Coastguard Worker {
2870*f6dc9357SAndroid Build Coastguard Worker return (s[0] == WCHAR_PATH_SEPARATOR && s[1] == WCHAR_PATH_SEPARATOR) || IsDrivePath(s);
2871*f6dc9357SAndroid Build Coastguard Worker }
2872*f6dc9357SAndroid Build Coastguard Worker
IsAbsolutePath(const char * s)2873*f6dc9357SAndroid Build Coastguard Worker static bool IsAbsolutePath(const char *s)
2874*f6dc9357SAndroid Build Coastguard Worker {
2875*f6dc9357SAndroid Build Coastguard Worker return (s[0] == CHAR_PATH_SEPARATOR && s[1] == CHAR_PATH_SEPARATOR) || IsDrivePath(s);
2876*f6dc9357SAndroid Build Coastguard Worker }
2877*f6dc9357SAndroid Build Coastguard Worker
SetItemName(CItem & item,UInt32 strPos)2878*f6dc9357SAndroid Build Coastguard Worker void CInArchive::SetItemName(CItem &item, UInt32 strPos)
2879*f6dc9357SAndroid Build Coastguard Worker {
2880*f6dc9357SAndroid Build Coastguard Worker ReadString2_Raw(strPos);
2881*f6dc9357SAndroid Build Coastguard Worker const bool isAbs = IsAbsolutePathVar(strPos);
2882*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
2883*f6dc9357SAndroid Build Coastguard Worker {
2884*f6dc9357SAndroid Build Coastguard Worker item.NameU = Raw_UString;
2885*f6dc9357SAndroid Build Coastguard Worker if (!isAbs && !IsAbsolutePath(Raw_UString))
2886*f6dc9357SAndroid Build Coastguard Worker item.Prefix = (int)UPrefixes.Size() - 1;
2887*f6dc9357SAndroid Build Coastguard Worker }
2888*f6dc9357SAndroid Build Coastguard Worker else
2889*f6dc9357SAndroid Build Coastguard Worker {
2890*f6dc9357SAndroid Build Coastguard Worker item.NameA = Raw_AString;
2891*f6dc9357SAndroid Build Coastguard Worker if (!isAbs && !IsAbsolutePath(Raw_AString))
2892*f6dc9357SAndroid Build Coastguard Worker item.Prefix = (int)APrefixes.Size() - 1;
2893*f6dc9357SAndroid Build Coastguard Worker }
2894*f6dc9357SAndroid Build Coastguard Worker }
2895*f6dc9357SAndroid Build Coastguard Worker
ReadEntries(const CBlockHeader & bh)2896*f6dc9357SAndroid Build Coastguard Worker HRESULT CInArchive::ReadEntries(const CBlockHeader &bh)
2897*f6dc9357SAndroid Build Coastguard Worker {
2898*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
2899*f6dc9357SAndroid Build Coastguard Worker CDynLimBuf &s = Script;
2900*f6dc9357SAndroid Build Coastguard Worker
2901*f6dc9357SAndroid Build Coastguard Worker CObjArray<UInt32> labels;
2902*f6dc9357SAndroid Build Coastguard Worker labels.Alloc(bh.Num);
2903*f6dc9357SAndroid Build Coastguard Worker memset(labels, 0, bh.Num * sizeof(UInt32));
2904*f6dc9357SAndroid Build Coastguard Worker
2905*f6dc9357SAndroid Build Coastguard Worker {
2906*f6dc9357SAndroid Build Coastguard Worker const Byte *p = _data;
2907*f6dc9357SAndroid Build Coastguard Worker UInt32 i;
2908*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < numOnFunc; i++)
2909*f6dc9357SAndroid Build Coastguard Worker {
2910*f6dc9357SAndroid Build Coastguard Worker UInt32 func = Get32(p + onFuncOffset + 4 * i);
2911*f6dc9357SAndroid Build Coastguard Worker if (func < bh.Num)
2912*f6dc9357SAndroid Build Coastguard Worker labels[func] = (labels[func] & ~CMD_REF_OnFunc_Mask) | (CMD_REF_OnFunc | (i << CMD_REF_OnFunc_NumShifts));
2913*f6dc9357SAndroid Build Coastguard Worker }
2914*f6dc9357SAndroid Build Coastguard Worker }
2915*f6dc9357SAndroid Build Coastguard Worker
2916*f6dc9357SAndroid Build Coastguard Worker /*
2917*f6dc9357SAndroid Build Coastguard Worker {
2918*f6dc9357SAndroid Build Coastguard Worker for (int i = 0; i < OnFuncs.Size(); i++)
2919*f6dc9357SAndroid Build Coastguard Worker {
2920*f6dc9357SAndroid Build Coastguard Worker UInt32 address = OnFuncs[i] >> kOnFuncShift;
2921*f6dc9357SAndroid Build Coastguard Worker if (address < bh.Num)
2922*f6dc9357SAndroid Build Coastguard Worker }
2923*f6dc9357SAndroid Build Coastguard Worker }
2924*f6dc9357SAndroid Build Coastguard Worker */
2925*f6dc9357SAndroid Build Coastguard Worker
2926*f6dc9357SAndroid Build Coastguard Worker if (bhPages.Num != 0)
2927*f6dc9357SAndroid Build Coastguard Worker {
2928*f6dc9357SAndroid Build Coastguard Worker Separator();
2929*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("PAGES", bhPages.Num);
2930*f6dc9357SAndroid Build Coastguard Worker
2931*f6dc9357SAndroid Build Coastguard Worker if (bhPages.Num > (1 << 12)
2932*f6dc9357SAndroid Build Coastguard Worker || bhPages.Offset > _size
2933*f6dc9357SAndroid Build Coastguard Worker || bhPages.Num * kPageSize > _size - bhPages.Offset)
2934*f6dc9357SAndroid Build Coastguard Worker {
2935*f6dc9357SAndroid Build Coastguard Worker AddErrorLF("Pages error");
2936*f6dc9357SAndroid Build Coastguard Worker }
2937*f6dc9357SAndroid Build Coastguard Worker else
2938*f6dc9357SAndroid Build Coastguard Worker {
2939*f6dc9357SAndroid Build Coastguard Worker
2940*f6dc9357SAndroid Build Coastguard Worker AddLF();
2941*f6dc9357SAndroid Build Coastguard Worker const Byte *p = _data + bhPages.Offset;
2942*f6dc9357SAndroid Build Coastguard Worker
2943*f6dc9357SAndroid Build Coastguard Worker for (UInt32 pageIndex = 0; pageIndex < bhPages.Num; pageIndex++, p += kPageSize)
2944*f6dc9357SAndroid Build Coastguard Worker {
2945*f6dc9357SAndroid Build Coastguard Worker UInt32 dlgID = Get32(p);
2946*f6dc9357SAndroid Build Coastguard Worker UInt32 wndProcID = Get32(p + 4);
2947*f6dc9357SAndroid Build Coastguard Worker UInt32 preFunc = Get32(p + 8);
2948*f6dc9357SAndroid Build Coastguard Worker UInt32 showFunc = Get32(p + 12);
2949*f6dc9357SAndroid Build Coastguard Worker UInt32 leaveFunc = Get32(p + 16);
2950*f6dc9357SAndroid Build Coastguard Worker UInt32 flags = Get32(p + 20);
2951*f6dc9357SAndroid Build Coastguard Worker UInt32 caption = Get32(p + 24);
2952*f6dc9357SAndroid Build Coastguard Worker // UInt32 back = Get32(p + 28);
2953*f6dc9357SAndroid Build Coastguard Worker UInt32 next = Get32(p + 32);
2954*f6dc9357SAndroid Build Coastguard Worker // UInt32 clickNext = Get32(p + 36);
2955*f6dc9357SAndroid Build Coastguard Worker // UInt32 cancel = Get32(p + 40);
2956*f6dc9357SAndroid Build Coastguard Worker UInt32 params[5];
2957*f6dc9357SAndroid Build Coastguard Worker for (int i = 0; i < 5; i++)
2958*f6dc9357SAndroid Build Coastguard Worker params[i] = Get32(p + 44 + 4 * i);
2959*f6dc9357SAndroid Build Coastguard Worker
2960*f6dc9357SAndroid Build Coastguard Worker SET_FUNC_REF(preFunc, CMD_REF_Pre)
2961*f6dc9357SAndroid Build Coastguard Worker SET_FUNC_REF(showFunc, CMD_REF_Show)
2962*f6dc9357SAndroid Build Coastguard Worker SET_FUNC_REF(leaveFunc, CMD_REF_Leave)
2963*f6dc9357SAndroid Build Coastguard Worker
2964*f6dc9357SAndroid Build Coastguard Worker if (wndProcID == PWP_COMPLETED)
2965*f6dc9357SAndroid Build Coastguard Worker CommentOpen();
2966*f6dc9357SAndroid Build Coastguard Worker
2967*f6dc9357SAndroid Build Coastguard Worker AddCommentAndString("Page ");
2968*f6dc9357SAndroid Build Coastguard Worker Add_UInt(pageIndex);
2969*f6dc9357SAndroid Build Coastguard Worker AddLF();
2970*f6dc9357SAndroid Build Coastguard Worker
2971*f6dc9357SAndroid Build Coastguard Worker if (flags & PF_PAGE_EX)
2972*f6dc9357SAndroid Build Coastguard Worker {
2973*f6dc9357SAndroid Build Coastguard Worker s += "PageEx ";
2974*f6dc9357SAndroid Build Coastguard Worker if (!IsInstaller)
2975*f6dc9357SAndroid Build Coastguard Worker s += "un.";
2976*f6dc9357SAndroid Build Coastguard Worker }
2977*f6dc9357SAndroid Build Coastguard Worker else
2978*f6dc9357SAndroid Build Coastguard Worker s += IsInstaller ? "Page " : "UninstPage ";
2979*f6dc9357SAndroid Build Coastguard Worker
2980*f6dc9357SAndroid Build Coastguard Worker if (wndProcID < Z7_ARRAY_SIZE(kPageTypes))
2981*f6dc9357SAndroid Build Coastguard Worker s += kPageTypes[wndProcID];
2982*f6dc9357SAndroid Build Coastguard Worker else
2983*f6dc9357SAndroid Build Coastguard Worker Add_UInt(wndProcID);
2984*f6dc9357SAndroid Build Coastguard Worker
2985*f6dc9357SAndroid Build Coastguard Worker
2986*f6dc9357SAndroid Build Coastguard Worker bool needCallbacks = (
2987*f6dc9357SAndroid Build Coastguard Worker (Int32)preFunc >= 0 ||
2988*f6dc9357SAndroid Build Coastguard Worker (Int32)showFunc >= 0 ||
2989*f6dc9357SAndroid Build Coastguard Worker (Int32)leaveFunc >= 0);
2990*f6dc9357SAndroid Build Coastguard Worker
2991*f6dc9357SAndroid Build Coastguard Worker if (flags & PF_PAGE_EX)
2992*f6dc9357SAndroid Build Coastguard Worker {
2993*f6dc9357SAndroid Build Coastguard Worker AddLF();
2994*f6dc9357SAndroid Build Coastguard Worker if (needCallbacks)
2995*f6dc9357SAndroid Build Coastguard Worker TabString("PageCallbacks");
2996*f6dc9357SAndroid Build Coastguard Worker }
2997*f6dc9357SAndroid Build Coastguard Worker
2998*f6dc9357SAndroid Build Coastguard Worker if (needCallbacks)
2999*f6dc9357SAndroid Build Coastguard Worker {
3000*f6dc9357SAndroid Build Coastguard Worker AddParam_Func(labels, preFunc); // it's creator_function for PWP_CUSTOM
3001*f6dc9357SAndroid Build Coastguard Worker if (wndProcID != PWP_CUSTOM)
3002*f6dc9357SAndroid Build Coastguard Worker {
3003*f6dc9357SAndroid Build Coastguard Worker AddParam_Func(labels, showFunc);
3004*f6dc9357SAndroid Build Coastguard Worker }
3005*f6dc9357SAndroid Build Coastguard Worker AddParam_Func(labels, leaveFunc);
3006*f6dc9357SAndroid Build Coastguard Worker }
3007*f6dc9357SAndroid Build Coastguard Worker
3008*f6dc9357SAndroid Build Coastguard Worker if ((flags & PF_PAGE_EX) == 0)
3009*f6dc9357SAndroid Build Coastguard Worker {
3010*f6dc9357SAndroid Build Coastguard Worker // AddOptionalParam(caption);
3011*f6dc9357SAndroid Build Coastguard Worker if (flags & PF_CANCEL_ENABLE)
3012*f6dc9357SAndroid Build Coastguard Worker s += " /ENABLECANCEL";
3013*f6dc9357SAndroid Build Coastguard Worker AddLF();
3014*f6dc9357SAndroid Build Coastguard Worker }
3015*f6dc9357SAndroid Build Coastguard Worker else
3016*f6dc9357SAndroid Build Coastguard Worker {
3017*f6dc9357SAndroid Build Coastguard Worker AddLF();
3018*f6dc9357SAndroid Build Coastguard Worker AddPageOption1(caption, "Caption");
3019*f6dc9357SAndroid Build Coastguard Worker }
3020*f6dc9357SAndroid Build Coastguard Worker
3021*f6dc9357SAndroid Build Coastguard Worker if (wndProcID == PWP_LICENSE)
3022*f6dc9357SAndroid Build Coastguard Worker {
3023*f6dc9357SAndroid Build Coastguard Worker if ((flags & PF_LICENSE_NO_FORCE_SELECTION) != 0 ||
3024*f6dc9357SAndroid Build Coastguard Worker (flags & PF_LICENSE_FORCE_SELECTION) != 0)
3025*f6dc9357SAndroid Build Coastguard Worker {
3026*f6dc9357SAndroid Build Coastguard Worker TabString("LicenseForceSelection ");
3027*f6dc9357SAndroid Build Coastguard Worker if (flags & PF_LICENSE_NO_FORCE_SELECTION)
3028*f6dc9357SAndroid Build Coastguard Worker s += "off";
3029*f6dc9357SAndroid Build Coastguard Worker else
3030*f6dc9357SAndroid Build Coastguard Worker {
3031*f6dc9357SAndroid Build Coastguard Worker if (dlgID == IDD_LICENSE_FSCB)
3032*f6dc9357SAndroid Build Coastguard Worker s += "checkbox";
3033*f6dc9357SAndroid Build Coastguard Worker else if (dlgID == IDD_LICENSE_FSRB)
3034*f6dc9357SAndroid Build Coastguard Worker s += "radiobuttons";
3035*f6dc9357SAndroid Build Coastguard Worker else
3036*f6dc9357SAndroid Build Coastguard Worker Add_UInt(dlgID);
3037*f6dc9357SAndroid Build Coastguard Worker AddOptionalParams(params + 2, 2);
3038*f6dc9357SAndroid Build Coastguard Worker }
3039*f6dc9357SAndroid Build Coastguard Worker NewLine();
3040*f6dc9357SAndroid Build Coastguard Worker }
3041*f6dc9357SAndroid Build Coastguard Worker
3042*f6dc9357SAndroid Build Coastguard Worker if (params[0] != 0 || next != 0)
3043*f6dc9357SAndroid Build Coastguard Worker {
3044*f6dc9357SAndroid Build Coastguard Worker TabString("LicenseText");
3045*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
3046*f6dc9357SAndroid Build Coastguard Worker AddOptionalParam(next);
3047*f6dc9357SAndroid Build Coastguard Worker NewLine();
3048*f6dc9357SAndroid Build Coastguard Worker }
3049*f6dc9357SAndroid Build Coastguard Worker if (params[1] != 0)
3050*f6dc9357SAndroid Build Coastguard Worker {
3051*f6dc9357SAndroid Build Coastguard Worker TabString("LicenseData");
3052*f6dc9357SAndroid Build Coastguard Worker if ((Int32)params[1] < 0)
3053*f6dc9357SAndroid Build Coastguard Worker AddParam(params[1]);
3054*f6dc9357SAndroid Build Coastguard Worker else
3055*f6dc9357SAndroid Build Coastguard Worker AddLicense(params[1], -1);
3056*f6dc9357SAndroid Build Coastguard Worker ClearLangComment();
3057*f6dc9357SAndroid Build Coastguard Worker NewLine();
3058*f6dc9357SAndroid Build Coastguard Worker }
3059*f6dc9357SAndroid Build Coastguard Worker }
3060*f6dc9357SAndroid Build Coastguard Worker else if (wndProcID == PWP_SELCOM)
3061*f6dc9357SAndroid Build Coastguard Worker AddPageOption(params, 3, "ComponentsText");
3062*f6dc9357SAndroid Build Coastguard Worker else if (wndProcID == PWP_DIR)
3063*f6dc9357SAndroid Build Coastguard Worker {
3064*f6dc9357SAndroid Build Coastguard Worker AddPageOption(params, 4, "DirText");
3065*f6dc9357SAndroid Build Coastguard Worker if (params[4] != 0)
3066*f6dc9357SAndroid Build Coastguard Worker {
3067*f6dc9357SAndroid Build Coastguard Worker TabString("DirVar");
3068*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[4] - 1);
3069*f6dc9357SAndroid Build Coastguard Worker AddLF();
3070*f6dc9357SAndroid Build Coastguard Worker }
3071*f6dc9357SAndroid Build Coastguard Worker if (flags & PF_DIR_NO_BTN_DISABLE)
3072*f6dc9357SAndroid Build Coastguard Worker {
3073*f6dc9357SAndroid Build Coastguard Worker TabString("DirVerify leave");
3074*f6dc9357SAndroid Build Coastguard Worker AddLF();
3075*f6dc9357SAndroid Build Coastguard Worker }
3076*f6dc9357SAndroid Build Coastguard Worker
3077*f6dc9357SAndroid Build Coastguard Worker }
3078*f6dc9357SAndroid Build Coastguard Worker else if (wndProcID == PWP_INSTFILES)
3079*f6dc9357SAndroid Build Coastguard Worker {
3080*f6dc9357SAndroid Build Coastguard Worker AddPageOption1(params[2], "CompletedText");
3081*f6dc9357SAndroid Build Coastguard Worker AddPageOption1(params[1], "DetailsButtonText");
3082*f6dc9357SAndroid Build Coastguard Worker }
3083*f6dc9357SAndroid Build Coastguard Worker else if (wndProcID == PWP_UNINST)
3084*f6dc9357SAndroid Build Coastguard Worker {
3085*f6dc9357SAndroid Build Coastguard Worker if (params[4] != 0)
3086*f6dc9357SAndroid Build Coastguard Worker {
3087*f6dc9357SAndroid Build Coastguard Worker TabString("DirVar");
3088*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[4] - 1);
3089*f6dc9357SAndroid Build Coastguard Worker AddLF();
3090*f6dc9357SAndroid Build Coastguard Worker }
3091*f6dc9357SAndroid Build Coastguard Worker AddPageOption(params, 2, "UninstallText");
3092*f6dc9357SAndroid Build Coastguard Worker }
3093*f6dc9357SAndroid Build Coastguard Worker
3094*f6dc9357SAndroid Build Coastguard Worker if (flags & PF_PAGE_EX)
3095*f6dc9357SAndroid Build Coastguard Worker {
3096*f6dc9357SAndroid Build Coastguard Worker s += "PageExEnd";
3097*f6dc9357SAndroid Build Coastguard Worker NewLine();
3098*f6dc9357SAndroid Build Coastguard Worker }
3099*f6dc9357SAndroid Build Coastguard Worker if (wndProcID == PWP_COMPLETED)
3100*f6dc9357SAndroid Build Coastguard Worker CommentClose();
3101*f6dc9357SAndroid Build Coastguard Worker NewLine();
3102*f6dc9357SAndroid Build Coastguard Worker }
3103*f6dc9357SAndroid Build Coastguard Worker }
3104*f6dc9357SAndroid Build Coastguard Worker }
3105*f6dc9357SAndroid Build Coastguard Worker
3106*f6dc9357SAndroid Build Coastguard Worker CObjArray<CSection> Sections;
3107*f6dc9357SAndroid Build Coastguard Worker
3108*f6dc9357SAndroid Build Coastguard Worker {
3109*f6dc9357SAndroid Build Coastguard Worker Separator();
3110*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("SECTIONS", bhSections.Num);
3111*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("COMMANDS", bh.Num);
3112*f6dc9357SAndroid Build Coastguard Worker AddLF();
3113*f6dc9357SAndroid Build Coastguard Worker
3114*f6dc9357SAndroid Build Coastguard Worker if (bhSections.Num > (1 << 15)
3115*f6dc9357SAndroid Build Coastguard Worker // || bhSections.Offset > _size
3116*f6dc9357SAndroid Build Coastguard Worker // || (bhSections.Num * SectionSize > _size - bhSections.Offset)
3117*f6dc9357SAndroid Build Coastguard Worker )
3118*f6dc9357SAndroid Build Coastguard Worker {
3119*f6dc9357SAndroid Build Coastguard Worker AddErrorLF("Sections error");
3120*f6dc9357SAndroid Build Coastguard Worker }
3121*f6dc9357SAndroid Build Coastguard Worker else if (bhSections.Num != 0)
3122*f6dc9357SAndroid Build Coastguard Worker {
3123*f6dc9357SAndroid Build Coastguard Worker Sections.Alloc((unsigned)bhSections.Num);
3124*f6dc9357SAndroid Build Coastguard Worker const Byte *p = _data + bhSections.Offset;
3125*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < bhSections.Num; i++, p += SectionSize)
3126*f6dc9357SAndroid Build Coastguard Worker {
3127*f6dc9357SAndroid Build Coastguard Worker CSection §ion = Sections[i];
3128*f6dc9357SAndroid Build Coastguard Worker section.Parse(p);
3129*f6dc9357SAndroid Build Coastguard Worker if (section.StartCmdIndex < bh.Num)
3130*f6dc9357SAndroid Build Coastguard Worker labels[section.StartCmdIndex] |= CMD_REF_Section;
3131*f6dc9357SAndroid Build Coastguard Worker }
3132*f6dc9357SAndroid Build Coastguard Worker }
3133*f6dc9357SAndroid Build Coastguard Worker }
3134*f6dc9357SAndroid Build Coastguard Worker
3135*f6dc9357SAndroid Build Coastguard Worker #endif
3136*f6dc9357SAndroid Build Coastguard Worker
3137*f6dc9357SAndroid Build Coastguard Worker const Byte *p;
3138*f6dc9357SAndroid Build Coastguard Worker UInt32 kkk;
3139*f6dc9357SAndroid Build Coastguard Worker
3140*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
3141*f6dc9357SAndroid Build Coastguard Worker
3142*f6dc9357SAndroid Build Coastguard Worker p = _data + bh.Offset;
3143*f6dc9357SAndroid Build Coastguard Worker
3144*f6dc9357SAndroid Build Coastguard Worker for (kkk = 0; kkk < bh.Num; kkk++, p += kCmdSize)
3145*f6dc9357SAndroid Build Coastguard Worker {
3146*f6dc9357SAndroid Build Coastguard Worker UInt32 commandId = GetCmd(Get32(p));
3147*f6dc9357SAndroid Build Coastguard Worker UInt32 mask;
3148*f6dc9357SAndroid Build Coastguard Worker switch (commandId)
3149*f6dc9357SAndroid Build Coastguard Worker {
3150*f6dc9357SAndroid Build Coastguard Worker case EW_NOP: mask = 1 << 0; break;
3151*f6dc9357SAndroid Build Coastguard Worker case EW_IFFILEEXISTS: mask = 3 << 1; break;
3152*f6dc9357SAndroid Build Coastguard Worker case EW_IFFLAG: mask = 3 << 0; break;
3153*f6dc9357SAndroid Build Coastguard Worker case EW_MESSAGEBOX: mask = 5 << 3; break;
3154*f6dc9357SAndroid Build Coastguard Worker case EW_STRCMP: mask = 3 << 2; break;
3155*f6dc9357SAndroid Build Coastguard Worker case EW_INTCMP: mask = 7 << 2; break;
3156*f6dc9357SAndroid Build Coastguard Worker case EW_ISWINDOW: mask = 3 << 1; break;
3157*f6dc9357SAndroid Build Coastguard Worker case EW_CALL:
3158*f6dc9357SAndroid Build Coastguard Worker {
3159*f6dc9357SAndroid Build Coastguard Worker if (Get32(p + 4 + 4) == 1) // it's Call :Label
3160*f6dc9357SAndroid Build Coastguard Worker {
3161*f6dc9357SAndroid Build Coastguard Worker mask = 1 << 0;
3162*f6dc9357SAndroid Build Coastguard Worker break;
3163*f6dc9357SAndroid Build Coastguard Worker }
3164*f6dc9357SAndroid Build Coastguard Worker UInt32 param0 = Get32(p + 4);
3165*f6dc9357SAndroid Build Coastguard Worker if ((Int32)param0 > 0)
3166*f6dc9357SAndroid Build Coastguard Worker labels[param0 - 1] |= CMD_REF_Call;
3167*f6dc9357SAndroid Build Coastguard Worker continue;
3168*f6dc9357SAndroid Build Coastguard Worker }
3169*f6dc9357SAndroid Build Coastguard Worker default: continue;
3170*f6dc9357SAndroid Build Coastguard Worker }
3171*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; mask != 0; i++, mask >>= 1)
3172*f6dc9357SAndroid Build Coastguard Worker if (mask & 1)
3173*f6dc9357SAndroid Build Coastguard Worker {
3174*f6dc9357SAndroid Build Coastguard Worker UInt32 param = Get32(p + 4 + 4 * i);
3175*f6dc9357SAndroid Build Coastguard Worker if ((Int32)param > 0 && (Int32)param <= (Int32)bh.Num)
3176*f6dc9357SAndroid Build Coastguard Worker labels[param - 1] |= CMD_REF_Goto;
3177*f6dc9357SAndroid Build Coastguard Worker }
3178*f6dc9357SAndroid Build Coastguard Worker }
3179*f6dc9357SAndroid Build Coastguard Worker
3180*f6dc9357SAndroid Build Coastguard Worker int InitPluginsDir_Start = -1;
3181*f6dc9357SAndroid Build Coastguard Worker int InitPluginsDir_End = -1;
3182*f6dc9357SAndroid Build Coastguard Worker p = _data + bh.Offset;
3183*f6dc9357SAndroid Build Coastguard Worker for (kkk = 0; kkk < bh.Num; kkk++, p += kCmdSize)
3184*f6dc9357SAndroid Build Coastguard Worker {
3185*f6dc9357SAndroid Build Coastguard Worker UInt32 flg = labels[kkk];
3186*f6dc9357SAndroid Build Coastguard Worker /*
3187*f6dc9357SAndroid Build Coastguard Worker if (IsFunc(flg))
3188*f6dc9357SAndroid Build Coastguard Worker {
3189*f6dc9357SAndroid Build Coastguard Worker AddLF();
3190*f6dc9357SAndroid Build Coastguard Worker for (int i = 0; i < 14; i++)
3191*f6dc9357SAndroid Build Coastguard Worker {
3192*f6dc9357SAndroid Build Coastguard Worker UInt32 commandId = GetCmd(Get32(p + kCmdSize * i));
3193*f6dc9357SAndroid Build Coastguard Worker s += ", ";
3194*f6dc9357SAndroid Build Coastguard Worker UIntToString(s, commandId);
3195*f6dc9357SAndroid Build Coastguard Worker }
3196*f6dc9357SAndroid Build Coastguard Worker AddLF();
3197*f6dc9357SAndroid Build Coastguard Worker }
3198*f6dc9357SAndroid Build Coastguard Worker */
3199*f6dc9357SAndroid Build Coastguard Worker if (IsFunc(flg)
3200*f6dc9357SAndroid Build Coastguard Worker && bh.Num - kkk >= Z7_ARRAY_SIZE(k_InitPluginDir_Commands)
3201*f6dc9357SAndroid Build Coastguard Worker && CompareCommands(p, k_InitPluginDir_Commands, Z7_ARRAY_SIZE(k_InitPluginDir_Commands)))
3202*f6dc9357SAndroid Build Coastguard Worker {
3203*f6dc9357SAndroid Build Coastguard Worker InitPluginsDir_Start = (int)kkk;
3204*f6dc9357SAndroid Build Coastguard Worker InitPluginsDir_End = (int)(kkk + Z7_ARRAY_SIZE(k_InitPluginDir_Commands));
3205*f6dc9357SAndroid Build Coastguard Worker labels[kkk] |= CMD_REF_InitPluginDir;
3206*f6dc9357SAndroid Build Coastguard Worker break;
3207*f6dc9357SAndroid Build Coastguard Worker }
3208*f6dc9357SAndroid Build Coastguard Worker }
3209*f6dc9357SAndroid Build Coastguard Worker
3210*f6dc9357SAndroid Build Coastguard Worker #endif
3211*f6dc9357SAndroid Build Coastguard Worker
3212*f6dc9357SAndroid Build Coastguard Worker // AString prefixA_Temp;
3213*f6dc9357SAndroid Build Coastguard Worker // UString prefixU_Temp;
3214*f6dc9357SAndroid Build Coastguard Worker
3215*f6dc9357SAndroid Build Coastguard Worker
3216*f6dc9357SAndroid Build Coastguard Worker // const UInt32 kFindS = 158;
3217*f6dc9357SAndroid Build Coastguard Worker
3218*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
3219*f6dc9357SAndroid Build Coastguard Worker
3220*f6dc9357SAndroid Build Coastguard Worker UInt32 curSectionIndex = 0;
3221*f6dc9357SAndroid Build Coastguard Worker // UInt32 lastSectionEndCmd = 0xFFFFFFFF;
3222*f6dc9357SAndroid Build Coastguard Worker bool sectionIsOpen = false;
3223*f6dc9357SAndroid Build Coastguard Worker // int curOnFunc = 0;
3224*f6dc9357SAndroid Build Coastguard Worker bool onFuncIsOpen = false;
3225*f6dc9357SAndroid Build Coastguard Worker
3226*f6dc9357SAndroid Build Coastguard Worker /*
3227*f6dc9357SAndroid Build Coastguard Worker for (unsigned yyy = 0; yyy + 3 < _data.Size(); yyy++)
3228*f6dc9357SAndroid Build Coastguard Worker {
3229*f6dc9357SAndroid Build Coastguard Worker UInt32 val = Get32(_data + yyy);
3230*f6dc9357SAndroid Build Coastguard Worker if (val == kFindS)
3231*f6dc9357SAndroid Build Coastguard Worker val = val;
3232*f6dc9357SAndroid Build Coastguard Worker }
3233*f6dc9357SAndroid Build Coastguard Worker */
3234*f6dc9357SAndroid Build Coastguard Worker
3235*f6dc9357SAndroid Build Coastguard Worker UInt32 overwrite_State = 0; // "SetOverwrite on"
3236*f6dc9357SAndroid Build Coastguard Worker Int32 allowSkipFiles_State = -1; // -1: on, -2: off, >=0 : RAW value
3237*f6dc9357SAndroid Build Coastguard Worker UInt32 endCommentIndex = 0;
3238*f6dc9357SAndroid Build Coastguard Worker
3239*f6dc9357SAndroid Build Coastguard Worker unsigned numSupportedCommands = GetNumSupportedCommands();
3240*f6dc9357SAndroid Build Coastguard Worker
3241*f6dc9357SAndroid Build Coastguard Worker #endif
3242*f6dc9357SAndroid Build Coastguard Worker
3243*f6dc9357SAndroid Build Coastguard Worker p = _data + bh.Offset;
3244*f6dc9357SAndroid Build Coastguard Worker
3245*f6dc9357SAndroid Build Coastguard Worker UString spec_outdir_U;
3246*f6dc9357SAndroid Build Coastguard Worker AString spec_outdir_A;
3247*f6dc9357SAndroid Build Coastguard Worker
3248*f6dc9357SAndroid Build Coastguard Worker UPrefixes.Add(UString("$INSTDIR"));
3249*f6dc9357SAndroid Build Coastguard Worker APrefixes.Add(AString("$INSTDIR"));
3250*f6dc9357SAndroid Build Coastguard Worker
3251*f6dc9357SAndroid Build Coastguard Worker p = _data + bh.Offset;
3252*f6dc9357SAndroid Build Coastguard Worker
3253*f6dc9357SAndroid Build Coastguard Worker unsigned spec_outdir_VarIndex = IsNsis225 ?
3254*f6dc9357SAndroid Build Coastguard Worker kVar_Spec_OUTDIR_225 :
3255*f6dc9357SAndroid Build Coastguard Worker kVar_Spec_OUTDIR;
3256*f6dc9357SAndroid Build Coastguard Worker
3257*f6dc9357SAndroid Build Coastguard Worker for (kkk = 0; kkk < bh.Num; kkk++, p += kCmdSize)
3258*f6dc9357SAndroid Build Coastguard Worker {
3259*f6dc9357SAndroid Build Coastguard Worker UInt32 commandId;
3260*f6dc9357SAndroid Build Coastguard Worker UInt32 params[kNumCommandParams];
3261*f6dc9357SAndroid Build Coastguard Worker commandId = GetCmd(Get32(p));
3262*f6dc9357SAndroid Build Coastguard Worker {
3263*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < kNumCommandParams; i++)
3264*f6dc9357SAndroid Build Coastguard Worker {
3265*f6dc9357SAndroid Build Coastguard Worker params[i] = Get32(p + 4 + 4 * i);
3266*f6dc9357SAndroid Build Coastguard Worker /*
3267*f6dc9357SAndroid Build Coastguard Worker if (params[i] == kFindS)
3268*f6dc9357SAndroid Build Coastguard Worker i = i;
3269*f6dc9357SAndroid Build Coastguard Worker */
3270*f6dc9357SAndroid Build Coastguard Worker }
3271*f6dc9357SAndroid Build Coastguard Worker }
3272*f6dc9357SAndroid Build Coastguard Worker
3273*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
3274*f6dc9357SAndroid Build Coastguard Worker
3275*f6dc9357SAndroid Build Coastguard Worker bool IsSectionGroup = false;
3276*f6dc9357SAndroid Build Coastguard Worker while (curSectionIndex < bhSections.Num)
3277*f6dc9357SAndroid Build Coastguard Worker {
3278*f6dc9357SAndroid Build Coastguard Worker const CSection § = Sections[curSectionIndex];
3279*f6dc9357SAndroid Build Coastguard Worker if (sectionIsOpen)
3280*f6dc9357SAndroid Build Coastguard Worker {
3281*f6dc9357SAndroid Build Coastguard Worker if (sect.StartCmdIndex + sect.NumCommands + 1 != kkk)
3282*f6dc9357SAndroid Build Coastguard Worker break;
3283*f6dc9357SAndroid Build Coastguard Worker PrintSectionEnd();
3284*f6dc9357SAndroid Build Coastguard Worker sectionIsOpen = false;
3285*f6dc9357SAndroid Build Coastguard Worker // lastSectionEndCmd = kkk;
3286*f6dc9357SAndroid Build Coastguard Worker curSectionIndex++;
3287*f6dc9357SAndroid Build Coastguard Worker continue;
3288*f6dc9357SAndroid Build Coastguard Worker }
3289*f6dc9357SAndroid Build Coastguard Worker if (sect.StartCmdIndex != kkk)
3290*f6dc9357SAndroid Build Coastguard Worker break;
3291*f6dc9357SAndroid Build Coastguard Worker if (PrintSectionBegin(sect, curSectionIndex))
3292*f6dc9357SAndroid Build Coastguard Worker {
3293*f6dc9357SAndroid Build Coastguard Worker IsSectionGroup = true;
3294*f6dc9357SAndroid Build Coastguard Worker curSectionIndex++;
3295*f6dc9357SAndroid Build Coastguard Worker // do we need to flush prefixes in new section?
3296*f6dc9357SAndroid Build Coastguard Worker // FlushOutPathPrefixes();
3297*f6dc9357SAndroid Build Coastguard Worker }
3298*f6dc9357SAndroid Build Coastguard Worker else
3299*f6dc9357SAndroid Build Coastguard Worker sectionIsOpen = true;
3300*f6dc9357SAndroid Build Coastguard Worker }
3301*f6dc9357SAndroid Build Coastguard Worker
3302*f6dc9357SAndroid Build Coastguard Worker /*
3303*f6dc9357SAndroid Build Coastguard Worker if (curOnFunc < OnFuncs.Size())
3304*f6dc9357SAndroid Build Coastguard Worker {
3305*f6dc9357SAndroid Build Coastguard Worker if ((OnFuncs[curOnFunc] >> kOnFuncShift) == kkk)
3306*f6dc9357SAndroid Build Coastguard Worker {
3307*f6dc9357SAndroid Build Coastguard Worker s += "Function .on";
3308*f6dc9357SAndroid Build Coastguard Worker s += kOnFunc[OnFuncs[curOnFunc++] & ((1 << kOnFuncShift) - 1)];
3309*f6dc9357SAndroid Build Coastguard Worker AddLF();
3310*f6dc9357SAndroid Build Coastguard Worker onFuncIsOpen = true;
3311*f6dc9357SAndroid Build Coastguard Worker }
3312*f6dc9357SAndroid Build Coastguard Worker }
3313*f6dc9357SAndroid Build Coastguard Worker */
3314*f6dc9357SAndroid Build Coastguard Worker
3315*f6dc9357SAndroid Build Coastguard Worker if (labels[kkk] != 0 && labels[kkk] != CMD_REF_Section)
3316*f6dc9357SAndroid Build Coastguard Worker {
3317*f6dc9357SAndroid Build Coastguard Worker UInt32 flg = labels[kkk];
3318*f6dc9357SAndroid Build Coastguard Worker if (IsFunc(flg))
3319*f6dc9357SAndroid Build Coastguard Worker {
3320*f6dc9357SAndroid Build Coastguard Worker if ((int)kkk == InitPluginsDir_Start)
3321*f6dc9357SAndroid Build Coastguard Worker CommentOpen();
3322*f6dc9357SAndroid Build Coastguard Worker
3323*f6dc9357SAndroid Build Coastguard Worker onFuncIsOpen = true;
3324*f6dc9357SAndroid Build Coastguard Worker s += "Function ";
3325*f6dc9357SAndroid Build Coastguard Worker Add_FuncName(labels, kkk);
3326*f6dc9357SAndroid Build Coastguard Worker if (IsPageFunc(flg))
3327*f6dc9357SAndroid Build Coastguard Worker {
3328*f6dc9357SAndroid Build Coastguard Worker BigSpaceComment();
3329*f6dc9357SAndroid Build Coastguard Worker s += "Page ";
3330*f6dc9357SAndroid Build Coastguard Worker Add_UInt((flg & CMD_REF_Page_Mask) >> CMD_REF_Page_NumShifts);
3331*f6dc9357SAndroid Build Coastguard Worker // if (flg & CMD_REF_Creator) s += ", Creator";
3332*f6dc9357SAndroid Build Coastguard Worker if (flg & CMD_REF_Leave) s += ", Leave";
3333*f6dc9357SAndroid Build Coastguard Worker if (flg & CMD_REF_Pre) s += ", Pre";
3334*f6dc9357SAndroid Build Coastguard Worker if (flg & CMD_REF_Show) s += ", Show";
3335*f6dc9357SAndroid Build Coastguard Worker }
3336*f6dc9357SAndroid Build Coastguard Worker AddLF();
3337*f6dc9357SAndroid Build Coastguard Worker }
3338*f6dc9357SAndroid Build Coastguard Worker if (flg & CMD_REF_Goto)
3339*f6dc9357SAndroid Build Coastguard Worker {
3340*f6dc9357SAndroid Build Coastguard Worker Add_LabelName(kkk);
3341*f6dc9357SAndroid Build Coastguard Worker s += ':';
3342*f6dc9357SAndroid Build Coastguard Worker AddLF();
3343*f6dc9357SAndroid Build Coastguard Worker }
3344*f6dc9357SAndroid Build Coastguard Worker }
3345*f6dc9357SAndroid Build Coastguard Worker
3346*f6dc9357SAndroid Build Coastguard Worker if (commandId != EW_RET)
3347*f6dc9357SAndroid Build Coastguard Worker {
3348*f6dc9357SAndroid Build Coastguard Worker Tab(kkk < endCommentIndex);
3349*f6dc9357SAndroid Build Coastguard Worker }
3350*f6dc9357SAndroid Build Coastguard Worker
3351*f6dc9357SAndroid Build Coastguard Worker /*
3352*f6dc9357SAndroid Build Coastguard Worker UInt32 originalCmd = Get32(p);
3353*f6dc9357SAndroid Build Coastguard Worker if (originalCmd >= EW_REGISTERDLL)
3354*f6dc9357SAndroid Build Coastguard Worker {
3355*f6dc9357SAndroid Build Coastguard Worker UIntToString(s, originalCmd);
3356*f6dc9357SAndroid Build Coastguard Worker s += ' ';
3357*f6dc9357SAndroid Build Coastguard Worker if (originalCmd != commandId)
3358*f6dc9357SAndroid Build Coastguard Worker {
3359*f6dc9357SAndroid Build Coastguard Worker UIntToString(s, commandId);
3360*f6dc9357SAndroid Build Coastguard Worker s += ' ';
3361*f6dc9357SAndroid Build Coastguard Worker }
3362*f6dc9357SAndroid Build Coastguard Worker }
3363*f6dc9357SAndroid Build Coastguard Worker */
3364*f6dc9357SAndroid Build Coastguard Worker
3365*f6dc9357SAndroid Build Coastguard Worker unsigned numSkipParams = 0;
3366*f6dc9357SAndroid Build Coastguard Worker
3367*f6dc9357SAndroid Build Coastguard Worker if (commandId < Z7_ARRAY_SIZE(k_Commands) && commandId < numSupportedCommands)
3368*f6dc9357SAndroid Build Coastguard Worker {
3369*f6dc9357SAndroid Build Coastguard Worker numSkipParams = k_Commands[commandId].NumParams;
3370*f6dc9357SAndroid Build Coastguard Worker const char *sz = k_CommandNames[commandId];
3371*f6dc9357SAndroid Build Coastguard Worker if (sz)
3372*f6dc9357SAndroid Build Coastguard Worker s += sz;
3373*f6dc9357SAndroid Build Coastguard Worker }
3374*f6dc9357SAndroid Build Coastguard Worker else
3375*f6dc9357SAndroid Build Coastguard Worker {
3376*f6dc9357SAndroid Build Coastguard Worker s += "Command";
3377*f6dc9357SAndroid Build Coastguard Worker Add_UInt(commandId);
3378*f6dc9357SAndroid Build Coastguard Worker /* We don't show wrong commands that use overlapped ids.
3379*f6dc9357SAndroid Build Coastguard Worker So we change commandId to big value */
3380*f6dc9357SAndroid Build Coastguard Worker if (commandId < (1 << 12))
3381*f6dc9357SAndroid Build Coastguard Worker commandId += (1 << 12);
3382*f6dc9357SAndroid Build Coastguard Worker }
3383*f6dc9357SAndroid Build Coastguard Worker
3384*f6dc9357SAndroid Build Coastguard Worker #endif
3385*f6dc9357SAndroid Build Coastguard Worker
3386*f6dc9357SAndroid Build Coastguard Worker switch (commandId)
3387*f6dc9357SAndroid Build Coastguard Worker {
3388*f6dc9357SAndroid Build Coastguard Worker case EW_CREATEDIR:
3389*f6dc9357SAndroid Build Coastguard Worker {
3390*f6dc9357SAndroid Build Coastguard Worker bool isSetOutPath = (params[1] != 0);
3391*f6dc9357SAndroid Build Coastguard Worker
3392*f6dc9357SAndroid Build Coastguard Worker if (isSetOutPath)
3393*f6dc9357SAndroid Build Coastguard Worker {
3394*f6dc9357SAndroid Build Coastguard Worker UInt32 par0 = params[0];
3395*f6dc9357SAndroid Build Coastguard Worker
3396*f6dc9357SAndroid Build Coastguard Worker UInt32 resOffset;
3397*f6dc9357SAndroid Build Coastguard Worker Int32 idx = GetVarIndex(par0, resOffset);
3398*f6dc9357SAndroid Build Coastguard Worker if (idx == (Int32)spec_outdir_VarIndex ||
3399*f6dc9357SAndroid Build Coastguard Worker idx == kVar_OUTDIR)
3400*f6dc9357SAndroid Build Coastguard Worker par0 += resOffset;
3401*f6dc9357SAndroid Build Coastguard Worker
3402*f6dc9357SAndroid Build Coastguard Worker ReadString2_Raw(par0);
3403*f6dc9357SAndroid Build Coastguard Worker
3404*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
3405*f6dc9357SAndroid Build Coastguard Worker {
3406*f6dc9357SAndroid Build Coastguard Worker if (idx == (Int32)spec_outdir_VarIndex)
3407*f6dc9357SAndroid Build Coastguard Worker Raw_UString.Insert(0, spec_outdir_U);
3408*f6dc9357SAndroid Build Coastguard Worker else if (idx == kVar_OUTDIR)
3409*f6dc9357SAndroid Build Coastguard Worker Raw_UString.Insert(0, UPrefixes.Back());
3410*f6dc9357SAndroid Build Coastguard Worker UPrefixes.Add(Raw_UString);
3411*f6dc9357SAndroid Build Coastguard Worker }
3412*f6dc9357SAndroid Build Coastguard Worker else
3413*f6dc9357SAndroid Build Coastguard Worker {
3414*f6dc9357SAndroid Build Coastguard Worker if (idx == (Int32)spec_outdir_VarIndex)
3415*f6dc9357SAndroid Build Coastguard Worker Raw_AString.Insert(0, spec_outdir_A);
3416*f6dc9357SAndroid Build Coastguard Worker else if (idx == kVar_OUTDIR)
3417*f6dc9357SAndroid Build Coastguard Worker Raw_AString.Insert(0, APrefixes.Back());
3418*f6dc9357SAndroid Build Coastguard Worker APrefixes.Add(Raw_AString);
3419*f6dc9357SAndroid Build Coastguard Worker }
3420*f6dc9357SAndroid Build Coastguard Worker }
3421*f6dc9357SAndroid Build Coastguard Worker
3422*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
3423*f6dc9357SAndroid Build Coastguard Worker s += isSetOutPath ? "SetOutPath" : "CreateDirectory";
3424*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
3425*f6dc9357SAndroid Build Coastguard Worker if (params[2] != 0) // 2.51+ & 3.0b3+
3426*f6dc9357SAndroid Build Coastguard Worker {
3427*f6dc9357SAndroid Build Coastguard Worker SmallSpaceComment();
3428*f6dc9357SAndroid Build Coastguard Worker s += "CreateRestrictedDirectory";
3429*f6dc9357SAndroid Build Coastguard Worker }
3430*f6dc9357SAndroid Build Coastguard Worker #endif
3431*f6dc9357SAndroid Build Coastguard Worker
3432*f6dc9357SAndroid Build Coastguard Worker break;
3433*f6dc9357SAndroid Build Coastguard Worker }
3434*f6dc9357SAndroid Build Coastguard Worker
3435*f6dc9357SAndroid Build Coastguard Worker
3436*f6dc9357SAndroid Build Coastguard Worker case EW_ASSIGNVAR:
3437*f6dc9357SAndroid Build Coastguard Worker {
3438*f6dc9357SAndroid Build Coastguard Worker if (params[0] == spec_outdir_VarIndex)
3439*f6dc9357SAndroid Build Coastguard Worker {
3440*f6dc9357SAndroid Build Coastguard Worker spec_outdir_U.Empty();
3441*f6dc9357SAndroid Build Coastguard Worker spec_outdir_A.Empty();
3442*f6dc9357SAndroid Build Coastguard Worker if (IsVarStr(params[1], kVar_OUTDIR) &&
3443*f6dc9357SAndroid Build Coastguard Worker params[2] == 0 &&
3444*f6dc9357SAndroid Build Coastguard Worker params[3] == 0)
3445*f6dc9357SAndroid Build Coastguard Worker {
3446*f6dc9357SAndroid Build Coastguard Worker spec_outdir_U = UPrefixes.Back(); // outdir_U;
3447*f6dc9357SAndroid Build Coastguard Worker spec_outdir_A = APrefixes.Back(); // outdir_A;
3448*f6dc9357SAndroid Build Coastguard Worker }
3449*f6dc9357SAndroid Build Coastguard Worker }
3450*f6dc9357SAndroid Build Coastguard Worker
3451*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
3452*f6dc9357SAndroid Build Coastguard Worker
3453*f6dc9357SAndroid Build Coastguard Worker if (params[2] == 0 &&
3454*f6dc9357SAndroid Build Coastguard Worker params[3] == 0 &&
3455*f6dc9357SAndroid Build Coastguard Worker params[4] == 0 &&
3456*f6dc9357SAndroid Build Coastguard Worker params[5] == 0 &&
3457*f6dc9357SAndroid Build Coastguard Worker params[1] != 0 &&
3458*f6dc9357SAndroid Build Coastguard Worker params[1] < NumStringChars)
3459*f6dc9357SAndroid Build Coastguard Worker {
3460*f6dc9357SAndroid Build Coastguard Worker char sz[16];
3461*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToString(kkk + 1, sz);
3462*f6dc9357SAndroid Build Coastguard Worker if (IsDirectString_Equal(params[1], sz))
3463*f6dc9357SAndroid Build Coastguard Worker {
3464*f6dc9357SAndroid Build Coastguard Worker // we suppose that it's GetCurrentAddress command
3465*f6dc9357SAndroid Build Coastguard Worker // but there is probability that it's StrCpy command
3466*f6dc9357SAndroid Build Coastguard Worker s += "GetCurrentAddress";
3467*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
3468*f6dc9357SAndroid Build Coastguard Worker SmallSpaceComment();
3469*f6dc9357SAndroid Build Coastguard Worker }
3470*f6dc9357SAndroid Build Coastguard Worker }
3471*f6dc9357SAndroid Build Coastguard Worker s += "StrCpy";
3472*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
3473*f6dc9357SAndroid Build Coastguard Worker AddParam(params[1]);
3474*f6dc9357SAndroid Build Coastguard Worker
3475*f6dc9357SAndroid Build Coastguard Worker AddOptionalParams(params + 2, 2);
3476*f6dc9357SAndroid Build Coastguard Worker
3477*f6dc9357SAndroid Build Coastguard Worker #endif
3478*f6dc9357SAndroid Build Coastguard Worker
3479*f6dc9357SAndroid Build Coastguard Worker break;
3480*f6dc9357SAndroid Build Coastguard Worker }
3481*f6dc9357SAndroid Build Coastguard Worker
3482*f6dc9357SAndroid Build Coastguard Worker case EW_EXTRACTFILE:
3483*f6dc9357SAndroid Build Coastguard Worker {
3484*f6dc9357SAndroid Build Coastguard Worker CItem &item = Items.AddNew();
3485*f6dc9357SAndroid Build Coastguard Worker
3486*f6dc9357SAndroid Build Coastguard Worker UInt32 par1 = params[1];
3487*f6dc9357SAndroid Build Coastguard Worker
3488*f6dc9357SAndroid Build Coastguard Worker SetItemName(item, par1);
3489*f6dc9357SAndroid Build Coastguard Worker
3490*f6dc9357SAndroid Build Coastguard Worker item.Pos = params[2];
3491*f6dc9357SAndroid Build Coastguard Worker item.MTime.dwLowDateTime = params[3];
3492*f6dc9357SAndroid Build Coastguard Worker item.MTime.dwHighDateTime = params[4];
3493*f6dc9357SAndroid Build Coastguard Worker
3494*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
3495*f6dc9357SAndroid Build Coastguard Worker
3496*f6dc9357SAndroid Build Coastguard Worker {
3497*f6dc9357SAndroid Build Coastguard Worker UInt32 overwrite = params[0] & 0x7;
3498*f6dc9357SAndroid Build Coastguard Worker if (overwrite != overwrite_State)
3499*f6dc9357SAndroid Build Coastguard Worker {
3500*f6dc9357SAndroid Build Coastguard Worker s += "SetOverwrite ";
3501*f6dc9357SAndroid Build Coastguard Worker ADD_TYPE_FROM_LIST(k_SetOverwrite_Modes, overwrite);
3502*f6dc9357SAndroid Build Coastguard Worker overwrite_State = overwrite;
3503*f6dc9357SAndroid Build Coastguard Worker AddLF();
3504*f6dc9357SAndroid Build Coastguard Worker Tab(kkk < endCommentIndex);
3505*f6dc9357SAndroid Build Coastguard Worker }
3506*f6dc9357SAndroid Build Coastguard Worker }
3507*f6dc9357SAndroid Build Coastguard Worker
3508*f6dc9357SAndroid Build Coastguard Worker {
3509*f6dc9357SAndroid Build Coastguard Worker UInt32 nsisMB = params[0] >> 3;
3510*f6dc9357SAndroid Build Coastguard Worker if ((Int32)nsisMB != allowSkipFiles_State)
3511*f6dc9357SAndroid Build Coastguard Worker {
3512*f6dc9357SAndroid Build Coastguard Worker UInt32 mb = nsisMB & ((1 << 20) - 1); // old/new NSIS
3513*f6dc9357SAndroid Build Coastguard Worker UInt32 b1 = nsisMB >> 21; // NSIS 2.06+
3514*f6dc9357SAndroid Build Coastguard Worker UInt32 b2 = nsisMB >> 20; // NSIS old
3515*f6dc9357SAndroid Build Coastguard Worker Int32 asf = (Int32)nsisMB;
3516*f6dc9357SAndroid Build Coastguard Worker if (mb == (Z7_NSIS_WIN_MB_ABORTRETRYIGNORE | Z7_NSIS_WIN_MB_ICONSTOP) && (b1 == Z7_NSIS_WIN_IDIGNORE || b2 == Z7_NSIS_WIN_IDIGNORE))
3517*f6dc9357SAndroid Build Coastguard Worker asf = -1;
3518*f6dc9357SAndroid Build Coastguard Worker else if (mb == (Z7_NSIS_WIN_MB_RETRYCANCEL | Z7_NSIS_WIN_MB_ICONSTOP) && (b1 == Z7_NSIS_WIN_IDCANCEL || b2 == Z7_NSIS_WIN_IDCANCEL))
3519*f6dc9357SAndroid Build Coastguard Worker asf = -2;
3520*f6dc9357SAndroid Build Coastguard Worker else
3521*f6dc9357SAndroid Build Coastguard Worker {
3522*f6dc9357SAndroid Build Coastguard Worker AddCommentAndString("AllowSkipFiles [Overwrite]: ");
3523*f6dc9357SAndroid Build Coastguard Worker MessageBox_MB_Part(mb);
3524*f6dc9357SAndroid Build Coastguard Worker if (b1 != 0)
3525*f6dc9357SAndroid Build Coastguard Worker {
3526*f6dc9357SAndroid Build Coastguard Worker s += " /SD";
3527*f6dc9357SAndroid Build Coastguard Worker Add_ButtonID(b1);
3528*f6dc9357SAndroid Build Coastguard Worker }
3529*f6dc9357SAndroid Build Coastguard Worker }
3530*f6dc9357SAndroid Build Coastguard Worker if (asf != allowSkipFiles_State)
3531*f6dc9357SAndroid Build Coastguard Worker {
3532*f6dc9357SAndroid Build Coastguard Worker if (asf < 0)
3533*f6dc9357SAndroid Build Coastguard Worker {
3534*f6dc9357SAndroid Build Coastguard Worker s += "AllowSkipFiles ";
3535*f6dc9357SAndroid Build Coastguard Worker s += (asf == -1) ? "on" : "off";
3536*f6dc9357SAndroid Build Coastguard Worker }
3537*f6dc9357SAndroid Build Coastguard Worker AddLF();
3538*f6dc9357SAndroid Build Coastguard Worker Tab(kkk < endCommentIndex);
3539*f6dc9357SAndroid Build Coastguard Worker }
3540*f6dc9357SAndroid Build Coastguard Worker allowSkipFiles_State = (Int32)nsisMB;
3541*f6dc9357SAndroid Build Coastguard Worker }
3542*f6dc9357SAndroid Build Coastguard Worker }
3543*f6dc9357SAndroid Build Coastguard Worker
3544*f6dc9357SAndroid Build Coastguard Worker s += "File";
3545*f6dc9357SAndroid Build Coastguard Worker AddParam(params[1]);
3546*f6dc9357SAndroid Build Coastguard Worker
3547*f6dc9357SAndroid Build Coastguard Worker /* params[5] contains link to LangString (negative value)
3548*f6dc9357SAndroid Build Coastguard Worker with NLF_FILE_ERROR or NLF_FILE_ERROR_NOIGNORE message for MessageBox.
3549*f6dc9357SAndroid Build Coastguard Worker We don't need to print it. */
3550*f6dc9357SAndroid Build Coastguard Worker
3551*f6dc9357SAndroid Build Coastguard Worker #endif
3552*f6dc9357SAndroid Build Coastguard Worker
3553*f6dc9357SAndroid Build Coastguard Worker if (IsVarStr(par1, 10)) // is $R0
3554*f6dc9357SAndroid Build Coastguard Worker {
3555*f6dc9357SAndroid Build Coastguard Worker // we parse InstallLib macro in 7-Zip installers
3556*f6dc9357SAndroid Build Coastguard Worker unsigned kBackOffset = 28;
3557*f6dc9357SAndroid Build Coastguard Worker if (kkk > 1)
3558*f6dc9357SAndroid Build Coastguard Worker {
3559*f6dc9357SAndroid Build Coastguard Worker // detect old version of InstallLib macro
3560*f6dc9357SAndroid Build Coastguard Worker if (Get32(p - 1 * kCmdSize) == EW_NOP) // goto command
3561*f6dc9357SAndroid Build Coastguard Worker kBackOffset -= 2;
3562*f6dc9357SAndroid Build Coastguard Worker }
3563*f6dc9357SAndroid Build Coastguard Worker
3564*f6dc9357SAndroid Build Coastguard Worker if (kkk > kBackOffset)
3565*f6dc9357SAndroid Build Coastguard Worker {
3566*f6dc9357SAndroid Build Coastguard Worker const Byte *p2 = p - kBackOffset * kCmdSize;
3567*f6dc9357SAndroid Build Coastguard Worker UInt32 cmd = Get32(p2);
3568*f6dc9357SAndroid Build Coastguard Worker if (cmd == EW_ASSIGNVAR)
3569*f6dc9357SAndroid Build Coastguard Worker {
3570*f6dc9357SAndroid Build Coastguard Worker UInt32 pars[6];
3571*f6dc9357SAndroid Build Coastguard Worker for (int i = 0; i < 6; i++)
3572*f6dc9357SAndroid Build Coastguard Worker pars[i] = Get32(p2 + i * 4 + 4);
3573*f6dc9357SAndroid Build Coastguard Worker if (pars[0] == 10 + 4 && pars[2] == 0 && pars[3] == 0) // 10 + 4 means $R4
3574*f6dc9357SAndroid Build Coastguard Worker {
3575*f6dc9357SAndroid Build Coastguard Worker item.Prefix = -1;
3576*f6dc9357SAndroid Build Coastguard Worker item.NameA.Empty();
3577*f6dc9357SAndroid Build Coastguard Worker item.NameU.Empty();
3578*f6dc9357SAndroid Build Coastguard Worker SetItemName(item, pars[1]);
3579*f6dc9357SAndroid Build Coastguard Worker // maybe here we can restore original item name, if new name is empty
3580*f6dc9357SAndroid Build Coastguard Worker }
3581*f6dc9357SAndroid Build Coastguard Worker }
3582*f6dc9357SAndroid Build Coastguard Worker }
3583*f6dc9357SAndroid Build Coastguard Worker }
3584*f6dc9357SAndroid Build Coastguard Worker /* UInt32 allowIgnore = params[5]; */
3585*f6dc9357SAndroid Build Coastguard Worker break;
3586*f6dc9357SAndroid Build Coastguard Worker }
3587*f6dc9357SAndroid Build Coastguard Worker
3588*f6dc9357SAndroid Build Coastguard Worker case EW_SETFILEATTRIBUTES:
3589*f6dc9357SAndroid Build Coastguard Worker {
3590*f6dc9357SAndroid Build Coastguard Worker if (kkk > 0 && Get32(p - kCmdSize) == EW_EXTRACTFILE)
3591*f6dc9357SAndroid Build Coastguard Worker {
3592*f6dc9357SAndroid Build Coastguard Worker if (params[0] == Get32(p - kCmdSize + 4 + 4 * 1)) // compare with PrevCmd.Params[1]
3593*f6dc9357SAndroid Build Coastguard Worker {
3594*f6dc9357SAndroid Build Coastguard Worker CItem &item = Items.Back();
3595*f6dc9357SAndroid Build Coastguard Worker item.Attrib_Defined = true;
3596*f6dc9357SAndroid Build Coastguard Worker item.Attrib = params[1];
3597*f6dc9357SAndroid Build Coastguard Worker }
3598*f6dc9357SAndroid Build Coastguard Worker }
3599*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
3600*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
3601*f6dc9357SAndroid Build Coastguard Worker Space();
3602*f6dc9357SAndroid Build Coastguard Worker FlagsToString2(s, g_WinAttrib, Z7_ARRAY_SIZE(g_WinAttrib), params[1]);
3603*f6dc9357SAndroid Build Coastguard Worker #endif
3604*f6dc9357SAndroid Build Coastguard Worker break;
3605*f6dc9357SAndroid Build Coastguard Worker }
3606*f6dc9357SAndroid Build Coastguard Worker
3607*f6dc9357SAndroid Build Coastguard Worker case EW_WRITEUNINSTALLER:
3608*f6dc9357SAndroid Build Coastguard Worker {
3609*f6dc9357SAndroid Build Coastguard Worker /* NSIS 2.29+ writes alternative path to params[3]
3610*f6dc9357SAndroid Build Coastguard Worker "$INSTDIR\\" + Str(params[0])
3611*f6dc9357SAndroid Build Coastguard Worker NSIS installer uses alternative path, if main path
3612*f6dc9357SAndroid Build Coastguard Worker from params[0] is not absolute path */
3613*f6dc9357SAndroid Build Coastguard Worker
3614*f6dc9357SAndroid Build Coastguard Worker const bool pathOk = (params[0] > 0) && IsGoodString(params[0]);
3615*f6dc9357SAndroid Build Coastguard Worker
3616*f6dc9357SAndroid Build Coastguard Worker if (!pathOk)
3617*f6dc9357SAndroid Build Coastguard Worker {
3618*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
3619*f6dc9357SAndroid Build Coastguard Worker AddError("bad path");
3620*f6dc9357SAndroid Build Coastguard Worker #endif
3621*f6dc9357SAndroid Build Coastguard Worker break;
3622*f6dc9357SAndroid Build Coastguard Worker }
3623*f6dc9357SAndroid Build Coastguard Worker
3624*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
3625*f6dc9357SAndroid Build Coastguard Worker
3626*f6dc9357SAndroid Build Coastguard Worker bool altPathOk = true;
3627*f6dc9357SAndroid Build Coastguard Worker
3628*f6dc9357SAndroid Build Coastguard Worker const UInt32 altParam = params[3];
3629*f6dc9357SAndroid Build Coastguard Worker if (altParam != 0)
3630*f6dc9357SAndroid Build Coastguard Worker {
3631*f6dc9357SAndroid Build Coastguard Worker altPathOk = false;
3632*f6dc9357SAndroid Build Coastguard Worker UInt32 additional = 0;
3633*f6dc9357SAndroid Build Coastguard Worker if (GetVarIndexFinished(altParam, '\\', additional) == kVar_INSTDIR)
3634*f6dc9357SAndroid Build Coastguard Worker altPathOk = AreTwoParamStringsEqual(altParam + additional, params[0]);
3635*f6dc9357SAndroid Build Coastguard Worker }
3636*f6dc9357SAndroid Build Coastguard Worker
3637*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
3638*f6dc9357SAndroid Build Coastguard Worker
3639*f6dc9357SAndroid Build Coastguard Worker /*
3640*f6dc9357SAndroid Build Coastguard Worker for (int i = 1; i < 3; i++)
3641*f6dc9357SAndroid Build Coastguard Worker AddParam_UInt(params[i]);
3642*f6dc9357SAndroid Build Coastguard Worker */
3643*f6dc9357SAndroid Build Coastguard Worker
3644*f6dc9357SAndroid Build Coastguard Worker if (params[3] != 0)
3645*f6dc9357SAndroid Build Coastguard Worker {
3646*f6dc9357SAndroid Build Coastguard Worker SmallSpaceComment();
3647*f6dc9357SAndroid Build Coastguard Worker AddParam(params[3]);
3648*f6dc9357SAndroid Build Coastguard Worker }
3649*f6dc9357SAndroid Build Coastguard Worker
3650*f6dc9357SAndroid Build Coastguard Worker if (!altPathOk)
3651*f6dc9357SAndroid Build Coastguard Worker {
3652*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
3653*f6dc9357SAndroid Build Coastguard Worker AddError("alt path error");
3654*f6dc9357SAndroid Build Coastguard Worker #endif
3655*f6dc9357SAndroid Build Coastguard Worker }
3656*f6dc9357SAndroid Build Coastguard Worker
3657*f6dc9357SAndroid Build Coastguard Worker #endif
3658*f6dc9357SAndroid Build Coastguard Worker
3659*f6dc9357SAndroid Build Coastguard Worker if (BadCmd >= 0 && BadCmd <= EW_WRITEUNINSTALLER)
3660*f6dc9357SAndroid Build Coastguard Worker {
3661*f6dc9357SAndroid Build Coastguard Worker /* We don't support cases with incorrect installer commands.
3662*f6dc9357SAndroid Build Coastguard Worker Such bad installer item can break unpacking for other items. */
3663*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
3664*f6dc9357SAndroid Build Coastguard Worker AddError("SKIP possible BadCmd");
3665*f6dc9357SAndroid Build Coastguard Worker #endif
3666*f6dc9357SAndroid Build Coastguard Worker break;
3667*f6dc9357SAndroid Build Coastguard Worker }
3668*f6dc9357SAndroid Build Coastguard Worker
3669*f6dc9357SAndroid Build Coastguard Worker CItem &item = Items.AddNew();
3670*f6dc9357SAndroid Build Coastguard Worker
3671*f6dc9357SAndroid Build Coastguard Worker SetItemName(item, params[0]);
3672*f6dc9357SAndroid Build Coastguard Worker
3673*f6dc9357SAndroid Build Coastguard Worker item.Pos = params[1];
3674*f6dc9357SAndroid Build Coastguard Worker item.PatchSize = params[2];
3675*f6dc9357SAndroid Build Coastguard Worker item.IsUninstaller = true;
3676*f6dc9357SAndroid Build Coastguard Worker const UInt32 param3 = params[3];
3677*f6dc9357SAndroid Build Coastguard Worker if (param3 != 0 && item.Prefix != -1)
3678*f6dc9357SAndroid Build Coastguard Worker {
3679*f6dc9357SAndroid Build Coastguard Worker /* (item.Prefix != -1) case means that param[0] path was not absolute.
3680*f6dc9357SAndroid Build Coastguard Worker So we use params[3] in that case, as original nsis */
3681*f6dc9357SAndroid Build Coastguard Worker SetItemName(item, param3);
3682*f6dc9357SAndroid Build Coastguard Worker }
3683*f6dc9357SAndroid Build Coastguard Worker /* UNINSTALLER file doesn't use directory prefixes.
3684*f6dc9357SAndroid Build Coastguard Worker So we remove prefix: */
3685*f6dc9357SAndroid Build Coastguard Worker item.Prefix = -1;
3686*f6dc9357SAndroid Build Coastguard Worker
3687*f6dc9357SAndroid Build Coastguard Worker /*
3688*f6dc9357SAndroid Build Coastguard Worker // we can add second time to test the code
3689*f6dc9357SAndroid Build Coastguard Worker CItem item2 = item;
3690*f6dc9357SAndroid Build Coastguard Worker item2.NameU += L'2';
3691*f6dc9357SAndroid Build Coastguard Worker item2.NameA += '2';
3692*f6dc9357SAndroid Build Coastguard Worker Items.Add(item2);
3693*f6dc9357SAndroid Build Coastguard Worker */
3694*f6dc9357SAndroid Build Coastguard Worker
3695*f6dc9357SAndroid Build Coastguard Worker break;
3696*f6dc9357SAndroid Build Coastguard Worker }
3697*f6dc9357SAndroid Build Coastguard Worker
3698*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
3699*f6dc9357SAndroid Build Coastguard Worker
3700*f6dc9357SAndroid Build Coastguard Worker case EW_RET:
3701*f6dc9357SAndroid Build Coastguard Worker {
3702*f6dc9357SAndroid Build Coastguard Worker // bool needComment = false;
3703*f6dc9357SAndroid Build Coastguard Worker if (onFuncIsOpen)
3704*f6dc9357SAndroid Build Coastguard Worker {
3705*f6dc9357SAndroid Build Coastguard Worker if (kkk == bh.Num - 1 || IsProbablyEndOfFunc(labels[kkk + 1]))
3706*f6dc9357SAndroid Build Coastguard Worker {
3707*f6dc9357SAndroid Build Coastguard Worker AddStringLF("FunctionEnd");
3708*f6dc9357SAndroid Build Coastguard Worker
3709*f6dc9357SAndroid Build Coastguard Worker if ((int)kkk + 1 == InitPluginsDir_End)
3710*f6dc9357SAndroid Build Coastguard Worker CommentClose();
3711*f6dc9357SAndroid Build Coastguard Worker AddLF();
3712*f6dc9357SAndroid Build Coastguard Worker onFuncIsOpen = false;
3713*f6dc9357SAndroid Build Coastguard Worker // needComment = true;
3714*f6dc9357SAndroid Build Coastguard Worker break;
3715*f6dc9357SAndroid Build Coastguard Worker }
3716*f6dc9357SAndroid Build Coastguard Worker }
3717*f6dc9357SAndroid Build Coastguard Worker // if (!needComment)
3718*f6dc9357SAndroid Build Coastguard Worker if (IsSectionGroup)
3719*f6dc9357SAndroid Build Coastguard Worker break;
3720*f6dc9357SAndroid Build Coastguard Worker if (sectionIsOpen)
3721*f6dc9357SAndroid Build Coastguard Worker {
3722*f6dc9357SAndroid Build Coastguard Worker const CSection § = Sections[curSectionIndex];
3723*f6dc9357SAndroid Build Coastguard Worker if (sect.StartCmdIndex + sect.NumCommands == kkk)
3724*f6dc9357SAndroid Build Coastguard Worker {
3725*f6dc9357SAndroid Build Coastguard Worker PrintSectionEnd();
3726*f6dc9357SAndroid Build Coastguard Worker sectionIsOpen = false;
3727*f6dc9357SAndroid Build Coastguard Worker curSectionIndex++;
3728*f6dc9357SAndroid Build Coastguard Worker break;
3729*f6dc9357SAndroid Build Coastguard Worker }
3730*f6dc9357SAndroid Build Coastguard Worker
3731*f6dc9357SAndroid Build Coastguard Worker // needComment = true;
3732*f6dc9357SAndroid Build Coastguard Worker // break;
3733*f6dc9357SAndroid Build Coastguard Worker }
3734*f6dc9357SAndroid Build Coastguard Worker
3735*f6dc9357SAndroid Build Coastguard Worker /*
3736*f6dc9357SAndroid Build Coastguard Worker if (needComment)
3737*f6dc9357SAndroid Build Coastguard Worker s += " ;";
3738*f6dc9357SAndroid Build Coastguard Worker */
3739*f6dc9357SAndroid Build Coastguard Worker TabString("Return");
3740*f6dc9357SAndroid Build Coastguard Worker AddLF();
3741*f6dc9357SAndroid Build Coastguard Worker break;
3742*f6dc9357SAndroid Build Coastguard Worker }
3743*f6dc9357SAndroid Build Coastguard Worker
3744*f6dc9357SAndroid Build Coastguard Worker case EW_NOP:
3745*f6dc9357SAndroid Build Coastguard Worker {
3746*f6dc9357SAndroid Build Coastguard Worker if (params[0] == 0)
3747*f6dc9357SAndroid Build Coastguard Worker s += "Nop";
3748*f6dc9357SAndroid Build Coastguard Worker else
3749*f6dc9357SAndroid Build Coastguard Worker {
3750*f6dc9357SAndroid Build Coastguard Worker s += "Goto";
3751*f6dc9357SAndroid Build Coastguard Worker Add_GotoVar(params[0]);
3752*f6dc9357SAndroid Build Coastguard Worker }
3753*f6dc9357SAndroid Build Coastguard Worker break;
3754*f6dc9357SAndroid Build Coastguard Worker }
3755*f6dc9357SAndroid Build Coastguard Worker
3756*f6dc9357SAndroid Build Coastguard Worker case EW_ABORT:
3757*f6dc9357SAndroid Build Coastguard Worker {
3758*f6dc9357SAndroid Build Coastguard Worker AddOptionalParam(params[0]);
3759*f6dc9357SAndroid Build Coastguard Worker break;
3760*f6dc9357SAndroid Build Coastguard Worker }
3761*f6dc9357SAndroid Build Coastguard Worker
3762*f6dc9357SAndroid Build Coastguard Worker case EW_CALL:
3763*f6dc9357SAndroid Build Coastguard Worker {
3764*f6dc9357SAndroid Build Coastguard Worker if (kkk + 1 < bh.Num && GetCmd(Get32(p + kCmdSize)) == EW_EXTRACTFILE)
3765*f6dc9357SAndroid Build Coastguard Worker {
3766*f6dc9357SAndroid Build Coastguard Worker UInt32 par1 = GET_CMD_PARAM(p + kCmdSize, 1);
3767*f6dc9357SAndroid Build Coastguard Worker
3768*f6dc9357SAndroid Build Coastguard Worker UInt32 pluginPar = 0;
3769*f6dc9357SAndroid Build Coastguard Worker
3770*f6dc9357SAndroid Build Coastguard Worker if (GetVarIndexFinished(par1, '\\', pluginPar) == kVar_PLUGINSDIR)
3771*f6dc9357SAndroid Build Coastguard Worker {
3772*f6dc9357SAndroid Build Coastguard Worker pluginPar += par1;
3773*f6dc9357SAndroid Build Coastguard Worker UInt32 commandId2 = GetCmd(Get32(p + kCmdSize * 2));
3774*f6dc9357SAndroid Build Coastguard Worker if (commandId2 == EW_SETFLAG || commandId2 == EW_UPDATETEXT)
3775*f6dc9357SAndroid Build Coastguard Worker {
3776*f6dc9357SAndroid Build Coastguard Worker UInt32 i;
3777*f6dc9357SAndroid Build Coastguard Worker for (i = kkk + 3; i < bh.Num; i++)
3778*f6dc9357SAndroid Build Coastguard Worker {
3779*f6dc9357SAndroid Build Coastguard Worker const Byte *pCmd = p + kCmdSize * (i - kkk);
3780*f6dc9357SAndroid Build Coastguard Worker UInt32 commandId3 = GetCmd(Get32(pCmd));
3781*f6dc9357SAndroid Build Coastguard Worker if (commandId3 != EW_PUSHPOP
3782*f6dc9357SAndroid Build Coastguard Worker || GET_CMD_PARAM(pCmd, 1) != 0
3783*f6dc9357SAndroid Build Coastguard Worker || GET_CMD_PARAM(pCmd, 2) != 0)
3784*f6dc9357SAndroid Build Coastguard Worker break;
3785*f6dc9357SAndroid Build Coastguard Worker }
3786*f6dc9357SAndroid Build Coastguard Worker if (i < bh.Num)
3787*f6dc9357SAndroid Build Coastguard Worker {
3788*f6dc9357SAndroid Build Coastguard Worker const Byte *pCmd = p + kCmdSize * (i - kkk);
3789*f6dc9357SAndroid Build Coastguard Worker
3790*f6dc9357SAndroid Build Coastguard Worker // UInt32 callDll_Param = GET_CMD_PARAM(pCmd, 0);
3791*f6dc9357SAndroid Build Coastguard Worker // UInt32 file_Param = GET_CMD_PARAM(p + kCmdSize, 1);
3792*f6dc9357SAndroid Build Coastguard Worker
3793*f6dc9357SAndroid Build Coastguard Worker if (GetCmd(Get32(pCmd)) == EW_REGISTERDLL &&
3794*f6dc9357SAndroid Build Coastguard Worker AreTwoParamStringsEqual(
3795*f6dc9357SAndroid Build Coastguard Worker GET_CMD_PARAM(pCmd, 0),
3796*f6dc9357SAndroid Build Coastguard Worker GET_CMD_PARAM(p + kCmdSize, 1)))
3797*f6dc9357SAndroid Build Coastguard Worker {
3798*f6dc9357SAndroid Build Coastguard Worker // params[4] = 1 means GetModuleHandle attempt before default LoadLibraryEx;
3799*f6dc9357SAndroid Build Coastguard Worker /// new versions of NSIS use params[4] = 1 for Plugin command
3800*f6dc9357SAndroid Build Coastguard Worker if (GET_CMD_PARAM(pCmd, 2) == 0
3801*f6dc9357SAndroid Build Coastguard Worker // && GET_CMD_PARAM(pCmd, 4) != 0
3802*f6dc9357SAndroid Build Coastguard Worker )
3803*f6dc9357SAndroid Build Coastguard Worker {
3804*f6dc9357SAndroid Build Coastguard Worker {
3805*f6dc9357SAndroid Build Coastguard Worker AString s2;
3806*f6dc9357SAndroid Build Coastguard Worker ReadString2(s2, pluginPar);
3807*f6dc9357SAndroid Build Coastguard Worker if (s2.Len() >= 4 &&
3808*f6dc9357SAndroid Build Coastguard Worker StringsAreEqualNoCase_Ascii(s2.RightPtr(4), ".dll"))
3809*f6dc9357SAndroid Build Coastguard Worker s2.DeleteFrom(s2.Len() - 4);
3810*f6dc9357SAndroid Build Coastguard Worker s2 += "::";
3811*f6dc9357SAndroid Build Coastguard Worker AString func;
3812*f6dc9357SAndroid Build Coastguard Worker ReadString2(func, GET_CMD_PARAM(pCmd, 1));
3813*f6dc9357SAndroid Build Coastguard Worker s2 += func;
3814*f6dc9357SAndroid Build Coastguard Worker Add_QuStr(s2);
3815*f6dc9357SAndroid Build Coastguard Worker
3816*f6dc9357SAndroid Build Coastguard Worker if (GET_CMD_PARAM(pCmd, 3) == 1)
3817*f6dc9357SAndroid Build Coastguard Worker s += " /NOUNLOAD";
3818*f6dc9357SAndroid Build Coastguard Worker
3819*f6dc9357SAndroid Build Coastguard Worker for (UInt32 j = i - 1; j >= kkk + 3; j--)
3820*f6dc9357SAndroid Build Coastguard Worker {
3821*f6dc9357SAndroid Build Coastguard Worker const Byte *pCmd2 = p + kCmdSize * (j - kkk);
3822*f6dc9357SAndroid Build Coastguard Worker AddParam(GET_CMD_PARAM(pCmd2, 0));
3823*f6dc9357SAndroid Build Coastguard Worker }
3824*f6dc9357SAndroid Build Coastguard Worker NewLine();
3825*f6dc9357SAndroid Build Coastguard Worker Tab(true);
3826*f6dc9357SAndroid Build Coastguard Worker endCommentIndex = i + 1;
3827*f6dc9357SAndroid Build Coastguard Worker }
3828*f6dc9357SAndroid Build Coastguard Worker }
3829*f6dc9357SAndroid Build Coastguard Worker }
3830*f6dc9357SAndroid Build Coastguard Worker }
3831*f6dc9357SAndroid Build Coastguard Worker }
3832*f6dc9357SAndroid Build Coastguard Worker }
3833*f6dc9357SAndroid Build Coastguard Worker }
3834*f6dc9357SAndroid Build Coastguard Worker {
3835*f6dc9357SAndroid Build Coastguard Worker const Byte *nextCmd = p + kCmdSize;
3836*f6dc9357SAndroid Build Coastguard Worker UInt32 commandId2 = GetCmd(Get32(nextCmd));
3837*f6dc9357SAndroid Build Coastguard Worker if (commandId2 == EW_SETFLAG
3838*f6dc9357SAndroid Build Coastguard Worker && GET_CMD_PARAM(nextCmd, 0) == k_ExecFlags_DetailsPrint
3839*f6dc9357SAndroid Build Coastguard Worker && GET_CMD_PARAM(nextCmd, 2) != 0) // is "lastused"
3840*f6dc9357SAndroid Build Coastguard Worker // || commandId2 == EW_UPDATETEXT)
3841*f6dc9357SAndroid Build Coastguard Worker {
3842*f6dc9357SAndroid Build Coastguard Worker if ((Int32)params[0] > 0 && labels[params[0] - 1] & CMD_REF_InitPluginDir)
3843*f6dc9357SAndroid Build Coastguard Worker {
3844*f6dc9357SAndroid Build Coastguard Worker s += "InitPluginsDir";
3845*f6dc9357SAndroid Build Coastguard Worker AddLF();
3846*f6dc9357SAndroid Build Coastguard Worker Tab(true);
3847*f6dc9357SAndroid Build Coastguard Worker endCommentIndex = kkk + 2;
3848*f6dc9357SAndroid Build Coastguard Worker }
3849*f6dc9357SAndroid Build Coastguard Worker }
3850*f6dc9357SAndroid Build Coastguard Worker }
3851*f6dc9357SAndroid Build Coastguard Worker
3852*f6dc9357SAndroid Build Coastguard Worker s += "Call ";
3853*f6dc9357SAndroid Build Coastguard Worker if ((Int32)params[0] < 0)
3854*f6dc9357SAndroid Build Coastguard Worker Add_Var((UInt32)-((Int32)params[0] + 1));
3855*f6dc9357SAndroid Build Coastguard Worker else if (params[0] == 0)
3856*f6dc9357SAndroid Build Coastguard Worker s += '0';
3857*f6dc9357SAndroid Build Coastguard Worker else
3858*f6dc9357SAndroid Build Coastguard Worker {
3859*f6dc9357SAndroid Build Coastguard Worker const UInt32 val = params[0] - 1;
3860*f6dc9357SAndroid Build Coastguard Worker if (params[1] == 1) // it's Call :Label
3861*f6dc9357SAndroid Build Coastguard Worker {
3862*f6dc9357SAndroid Build Coastguard Worker s += ':';
3863*f6dc9357SAndroid Build Coastguard Worker Add_LabelName(val);
3864*f6dc9357SAndroid Build Coastguard Worker }
3865*f6dc9357SAndroid Build Coastguard Worker else // if (params[1] == 0) // it's Call Func
3866*f6dc9357SAndroid Build Coastguard Worker Add_FuncName(labels, val);
3867*f6dc9357SAndroid Build Coastguard Worker }
3868*f6dc9357SAndroid Build Coastguard Worker break;
3869*f6dc9357SAndroid Build Coastguard Worker }
3870*f6dc9357SAndroid Build Coastguard Worker
3871*f6dc9357SAndroid Build Coastguard Worker case EW_UPDATETEXT:
3872*f6dc9357SAndroid Build Coastguard Worker case EW_SLEEP:
3873*f6dc9357SAndroid Build Coastguard Worker {
3874*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
3875*f6dc9357SAndroid Build Coastguard Worker break;
3876*f6dc9357SAndroid Build Coastguard Worker }
3877*f6dc9357SAndroid Build Coastguard Worker
3878*f6dc9357SAndroid Build Coastguard Worker case EW_CHDETAILSVIEW:
3879*f6dc9357SAndroid Build Coastguard Worker {
3880*f6dc9357SAndroid Build Coastguard Worker if (params[0] == Z7_NSIS_WIN_SW_SHOWNA && params[1] == Z7_NSIS_WIN_SW_HIDE) s += " show";
3881*f6dc9357SAndroid Build Coastguard Worker else if (params[1] == Z7_NSIS_WIN_SW_SHOWNA && params[0] == Z7_NSIS_WIN_SW_HIDE) s += " hide";
3882*f6dc9357SAndroid Build Coastguard Worker else
3883*f6dc9357SAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
3884*f6dc9357SAndroid Build Coastguard Worker {
3885*f6dc9357SAndroid Build Coastguard Worker Space();
3886*f6dc9357SAndroid Build Coastguard Worker Add_ShowWindow_Cmd(params[i]);
3887*f6dc9357SAndroid Build Coastguard Worker }
3888*f6dc9357SAndroid Build Coastguard Worker break;
3889*f6dc9357SAndroid Build Coastguard Worker }
3890*f6dc9357SAndroid Build Coastguard Worker
3891*f6dc9357SAndroid Build Coastguard Worker case EW_IFFILEEXISTS:
3892*f6dc9357SAndroid Build Coastguard Worker {
3893*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
3894*f6dc9357SAndroid Build Coastguard Worker Add_GotoVars2(¶ms[1]);
3895*f6dc9357SAndroid Build Coastguard Worker break;
3896*f6dc9357SAndroid Build Coastguard Worker }
3897*f6dc9357SAndroid Build Coastguard Worker
3898*f6dc9357SAndroid Build Coastguard Worker case EW_SETFLAG:
3899*f6dc9357SAndroid Build Coastguard Worker {
3900*f6dc9357SAndroid Build Coastguard Worker AString temp;
3901*f6dc9357SAndroid Build Coastguard Worker ReadString2(temp, params[1]);
3902*f6dc9357SAndroid Build Coastguard Worker if (params[0] == k_ExecFlags_Errors && params[2] == 0)
3903*f6dc9357SAndroid Build Coastguard Worker {
3904*f6dc9357SAndroid Build Coastguard Worker s += (temp.Len() == 1 && temp[0] == '0') ? "ClearErrors" : "SetErrors";
3905*f6dc9357SAndroid Build Coastguard Worker break;
3906*f6dc9357SAndroid Build Coastguard Worker }
3907*f6dc9357SAndroid Build Coastguard Worker s += "Set";
3908*f6dc9357SAndroid Build Coastguard Worker Add_ExecFlags(params[0]);
3909*f6dc9357SAndroid Build Coastguard Worker
3910*f6dc9357SAndroid Build Coastguard Worker if (params[2] != 0)
3911*f6dc9357SAndroid Build Coastguard Worker {
3912*f6dc9357SAndroid Build Coastguard Worker s += " lastused";
3913*f6dc9357SAndroid Build Coastguard Worker break;
3914*f6dc9357SAndroid Build Coastguard Worker }
3915*f6dc9357SAndroid Build Coastguard Worker UInt32 v;
3916*f6dc9357SAndroid Build Coastguard Worker if (StringToUInt32(temp, v))
3917*f6dc9357SAndroid Build Coastguard Worker {
3918*f6dc9357SAndroid Build Coastguard Worker const char *s2 = NULL;
3919*f6dc9357SAndroid Build Coastguard Worker switch (params[0])
3920*f6dc9357SAndroid Build Coastguard Worker {
3921*f6dc9357SAndroid Build Coastguard Worker case k_ExecFlags_AutoClose:
3922*f6dc9357SAndroid Build Coastguard Worker case k_ExecFlags_RebootFlag:
3923*f6dc9357SAndroid Build Coastguard Worker if (v < 2) { s2 = (v == 0) ? "false" : "true"; } break;
3924*f6dc9357SAndroid Build Coastguard Worker case k_ExecFlags_ShellVarContext:
3925*f6dc9357SAndroid Build Coastguard Worker if (v < 2) { s2 = (v == 0) ? "current" : "all"; } break;
3926*f6dc9357SAndroid Build Coastguard Worker case k_ExecFlags_Silent:
3927*f6dc9357SAndroid Build Coastguard Worker if (v < 2) { s2 = (v == 0) ? "normal" : "silent"; } break;
3928*f6dc9357SAndroid Build Coastguard Worker case k_ExecFlags_RegView:
3929*f6dc9357SAndroid Build Coastguard Worker if (v == 0) s2 = "32";
3930*f6dc9357SAndroid Build Coastguard Worker else if (v == 256) s2 = "64";
3931*f6dc9357SAndroid Build Coastguard Worker break;
3932*f6dc9357SAndroid Build Coastguard Worker case k_ExecFlags_DetailsPrint:
3933*f6dc9357SAndroid Build Coastguard Worker if (v == 0) s2 = "both";
3934*f6dc9357SAndroid Build Coastguard Worker else if (v == 2) s2 = "textonly";
3935*f6dc9357SAndroid Build Coastguard Worker else if (v == 4) s2 = "listonly";
3936*f6dc9357SAndroid Build Coastguard Worker else if (v == 6) s2 = "none";
3937*f6dc9357SAndroid Build Coastguard Worker break;
3938*f6dc9357SAndroid Build Coastguard Worker }
3939*f6dc9357SAndroid Build Coastguard Worker if (s2)
3940*f6dc9357SAndroid Build Coastguard Worker {
3941*f6dc9357SAndroid Build Coastguard Worker s += ' ';
3942*f6dc9357SAndroid Build Coastguard Worker s += s2;
3943*f6dc9357SAndroid Build Coastguard Worker break;
3944*f6dc9357SAndroid Build Coastguard Worker }
3945*f6dc9357SAndroid Build Coastguard Worker }
3946*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(temp);
3947*f6dc9357SAndroid Build Coastguard Worker break;
3948*f6dc9357SAndroid Build Coastguard Worker }
3949*f6dc9357SAndroid Build Coastguard Worker
3950*f6dc9357SAndroid Build Coastguard Worker case EW_IFFLAG:
3951*f6dc9357SAndroid Build Coastguard Worker {
3952*f6dc9357SAndroid Build Coastguard Worker Add_ExecFlags(params[2]);
3953*f6dc9357SAndroid Build Coastguard Worker Add_GotoVars2(¶ms[0]);
3954*f6dc9357SAndroid Build Coastguard Worker /*
3955*f6dc9357SAndroid Build Coastguard Worker const unsigned kIfErrors = 2;
3956*f6dc9357SAndroid Build Coastguard Worker if (params[2] != kIfErrors && params[3] != 0xFFFFFFFF ||
3957*f6dc9357SAndroid Build Coastguard Worker params[2] == kIfErrors && params[3] != 0)
3958*f6dc9357SAndroid Build Coastguard Worker {
3959*f6dc9357SAndroid Build Coastguard Worker s += " # FLAG &= ";
3960*f6dc9357SAndroid Build Coastguard Worker AddParam_UInt(params[3]);
3961*f6dc9357SAndroid Build Coastguard Worker }
3962*f6dc9357SAndroid Build Coastguard Worker */
3963*f6dc9357SAndroid Build Coastguard Worker break;
3964*f6dc9357SAndroid Build Coastguard Worker }
3965*f6dc9357SAndroid Build Coastguard Worker
3966*f6dc9357SAndroid Build Coastguard Worker case EW_GETFLAG:
3967*f6dc9357SAndroid Build Coastguard Worker {
3968*f6dc9357SAndroid Build Coastguard Worker Add_ExecFlags(params[1]);
3969*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
3970*f6dc9357SAndroid Build Coastguard Worker break;
3971*f6dc9357SAndroid Build Coastguard Worker }
3972*f6dc9357SAndroid Build Coastguard Worker
3973*f6dc9357SAndroid Build Coastguard Worker case EW_RENAME:
3974*f6dc9357SAndroid Build Coastguard Worker {
3975*f6dc9357SAndroid Build Coastguard Worker if (params[2] != 0)
3976*f6dc9357SAndroid Build Coastguard Worker s += k_REBOOTOK;
3977*f6dc9357SAndroid Build Coastguard Worker AddParams(params, 2);
3978*f6dc9357SAndroid Build Coastguard Worker if (params[3] != 0)
3979*f6dc9357SAndroid Build Coastguard Worker {
3980*f6dc9357SAndroid Build Coastguard Worker SmallSpaceComment();
3981*f6dc9357SAndroid Build Coastguard Worker AddParam(params[3]); // rename comment for log file
3982*f6dc9357SAndroid Build Coastguard Worker }
3983*f6dc9357SAndroid Build Coastguard Worker break;
3984*f6dc9357SAndroid Build Coastguard Worker }
3985*f6dc9357SAndroid Build Coastguard Worker
3986*f6dc9357SAndroid Build Coastguard Worker case EW_GETFULLPATHNAME:
3987*f6dc9357SAndroid Build Coastguard Worker {
3988*f6dc9357SAndroid Build Coastguard Worker if (params[2] == 0)
3989*f6dc9357SAndroid Build Coastguard Worker s += " /SHORT";
3990*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[1]);
3991*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
3992*f6dc9357SAndroid Build Coastguard Worker break;
3993*f6dc9357SAndroid Build Coastguard Worker }
3994*f6dc9357SAndroid Build Coastguard Worker
3995*f6dc9357SAndroid Build Coastguard Worker case EW_SEARCHPATH:
3996*f6dc9357SAndroid Build Coastguard Worker case EW_STRLEN:
3997*f6dc9357SAndroid Build Coastguard Worker {
3998*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
3999*f6dc9357SAndroid Build Coastguard Worker AddParam(params[1]);
4000*f6dc9357SAndroid Build Coastguard Worker break;
4001*f6dc9357SAndroid Build Coastguard Worker }
4002*f6dc9357SAndroid Build Coastguard Worker
4003*f6dc9357SAndroid Build Coastguard Worker case EW_GETTEMPFILENAME:
4004*f6dc9357SAndroid Build Coastguard Worker {
4005*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4006*f6dc9357SAndroid Build Coastguard Worker AString temp;
4007*f6dc9357SAndroid Build Coastguard Worker ReadString2(temp, params[1]);
4008*f6dc9357SAndroid Build Coastguard Worker if (temp != "$TEMP")
4009*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(temp);
4010*f6dc9357SAndroid Build Coastguard Worker break;
4011*f6dc9357SAndroid Build Coastguard Worker }
4012*f6dc9357SAndroid Build Coastguard Worker
4013*f6dc9357SAndroid Build Coastguard Worker case EW_DELETEFILE:
4014*f6dc9357SAndroid Build Coastguard Worker {
4015*f6dc9357SAndroid Build Coastguard Worker UInt32 flag = params[1];
4016*f6dc9357SAndroid Build Coastguard Worker if ((flag & DEL_REBOOT) != 0)
4017*f6dc9357SAndroid Build Coastguard Worker s += k_REBOOTOK;
4018*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
4019*f6dc9357SAndroid Build Coastguard Worker break;
4020*f6dc9357SAndroid Build Coastguard Worker }
4021*f6dc9357SAndroid Build Coastguard Worker
4022*f6dc9357SAndroid Build Coastguard Worker case EW_MESSAGEBOX:
4023*f6dc9357SAndroid Build Coastguard Worker {
4024*f6dc9357SAndroid Build Coastguard Worker MessageBox_MB_Part(params[0]);
4025*f6dc9357SAndroid Build Coastguard Worker AddParam(params[1]);
4026*f6dc9357SAndroid Build Coastguard Worker {
4027*f6dc9357SAndroid Build Coastguard Worker UInt32 buttonID = (params[0] >> 21); // NSIS 2.06+
4028*f6dc9357SAndroid Build Coastguard Worker if (buttonID != 0)
4029*f6dc9357SAndroid Build Coastguard Worker {
4030*f6dc9357SAndroid Build Coastguard Worker s += " /SD";
4031*f6dc9357SAndroid Build Coastguard Worker Add_ButtonID(buttonID);
4032*f6dc9357SAndroid Build Coastguard Worker }
4033*f6dc9357SAndroid Build Coastguard Worker }
4034*f6dc9357SAndroid Build Coastguard Worker for (int i = 2; i < 6; i += 2)
4035*f6dc9357SAndroid Build Coastguard Worker if (params[i] != 0)
4036*f6dc9357SAndroid Build Coastguard Worker {
4037*f6dc9357SAndroid Build Coastguard Worker Add_ButtonID(params[i]);
4038*f6dc9357SAndroid Build Coastguard Worker Add_GotoVar1(params[i + 1]);
4039*f6dc9357SAndroid Build Coastguard Worker }
4040*f6dc9357SAndroid Build Coastguard Worker break;
4041*f6dc9357SAndroid Build Coastguard Worker }
4042*f6dc9357SAndroid Build Coastguard Worker
4043*f6dc9357SAndroid Build Coastguard Worker case EW_RMDIR:
4044*f6dc9357SAndroid Build Coastguard Worker {
4045*f6dc9357SAndroid Build Coastguard Worker UInt32 flag = params[1];
4046*f6dc9357SAndroid Build Coastguard Worker if ((flag & DEL_RECURSE) != 0)
4047*f6dc9357SAndroid Build Coastguard Worker s += " /r";
4048*f6dc9357SAndroid Build Coastguard Worker if ((flag & DEL_REBOOT) != 0)
4049*f6dc9357SAndroid Build Coastguard Worker s += k_REBOOTOK;
4050*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
4051*f6dc9357SAndroid Build Coastguard Worker break;
4052*f6dc9357SAndroid Build Coastguard Worker }
4053*f6dc9357SAndroid Build Coastguard Worker
4054*f6dc9357SAndroid Build Coastguard Worker case EW_STRCMP:
4055*f6dc9357SAndroid Build Coastguard Worker {
4056*f6dc9357SAndroid Build Coastguard Worker if (params[4] != 0)
4057*f6dc9357SAndroid Build Coastguard Worker s += 'S';
4058*f6dc9357SAndroid Build Coastguard Worker AddParams(params, 2);
4059*f6dc9357SAndroid Build Coastguard Worker Add_GotoVars2(¶ms[2]);
4060*f6dc9357SAndroid Build Coastguard Worker break;
4061*f6dc9357SAndroid Build Coastguard Worker }
4062*f6dc9357SAndroid Build Coastguard Worker
4063*f6dc9357SAndroid Build Coastguard Worker case EW_READENVSTR:
4064*f6dc9357SAndroid Build Coastguard Worker {
4065*f6dc9357SAndroid Build Coastguard Worker s += (params[2] != 0) ?
4066*f6dc9357SAndroid Build Coastguard Worker "ReadEnvStr" :
4067*f6dc9357SAndroid Build Coastguard Worker "ExpandEnvStrings";
4068*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4069*f6dc9357SAndroid Build Coastguard Worker AString temp;
4070*f6dc9357SAndroid Build Coastguard Worker ReadString2(temp, params[1]);
4071*f6dc9357SAndroid Build Coastguard Worker if (params[2] != 0 &&temp.Len() >= 2 && temp[0] == '%' && temp.Back() == '%')
4072*f6dc9357SAndroid Build Coastguard Worker {
4073*f6dc9357SAndroid Build Coastguard Worker temp.DeleteBack();
4074*f6dc9357SAndroid Build Coastguard Worker temp.Delete(0);
4075*f6dc9357SAndroid Build Coastguard Worker }
4076*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(temp);
4077*f6dc9357SAndroid Build Coastguard Worker break;
4078*f6dc9357SAndroid Build Coastguard Worker }
4079*f6dc9357SAndroid Build Coastguard Worker
4080*f6dc9357SAndroid Build Coastguard Worker case EW_INTCMP:
4081*f6dc9357SAndroid Build Coastguard Worker {
4082*f6dc9357SAndroid Build Coastguard Worker s += "Int";
4083*f6dc9357SAndroid Build Coastguard Worker const UInt32 param5 = params[5];
4084*f6dc9357SAndroid Build Coastguard Worker if (param5 & 0x8000)
4085*f6dc9357SAndroid Build Coastguard Worker s += "64"; // v3.03+
4086*f6dc9357SAndroid Build Coastguard Worker s += "Cmp";
4087*f6dc9357SAndroid Build Coastguard Worker if (IsNsis3_OrHigher() ? (param5 & 1) : (param5 != 0))
4088*f6dc9357SAndroid Build Coastguard Worker s += 'U';
4089*f6dc9357SAndroid Build Coastguard Worker AddParams(params, 2);
4090*f6dc9357SAndroid Build Coastguard Worker Add_GotoVar1(params[2]);
4091*f6dc9357SAndroid Build Coastguard Worker if (params[3] != 0 || params[4] != 0)
4092*f6dc9357SAndroid Build Coastguard Worker Add_GotoVars2(params + 3);
4093*f6dc9357SAndroid Build Coastguard Worker break;
4094*f6dc9357SAndroid Build Coastguard Worker }
4095*f6dc9357SAndroid Build Coastguard Worker
4096*f6dc9357SAndroid Build Coastguard Worker case EW_INTOP:
4097*f6dc9357SAndroid Build Coastguard Worker {
4098*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4099*f6dc9357SAndroid Build Coastguard Worker const char * const kOps = "+-*/|&^!|&%<>>"; // NSIS 2.01+
4100*f6dc9357SAndroid Build Coastguard Worker // "+-*/|&^!|&%"; // NSIS 2.0b4+
4101*f6dc9357SAndroid Build Coastguard Worker // "+-*/|&^~!|&%"; // NSIS old
4102*f6dc9357SAndroid Build Coastguard Worker const UInt32 opIndex = params[3];
4103*f6dc9357SAndroid Build Coastguard Worker const char c = (opIndex < 14) ? kOps[opIndex] : '?';
4104*f6dc9357SAndroid Build Coastguard Worker const char c2 = (opIndex < 8 || opIndex == 10) ? (char)0 : c;
4105*f6dc9357SAndroid Build Coastguard Worker const int numOps = (opIndex == 7) ? 1 : 2;
4106*f6dc9357SAndroid Build Coastguard Worker AddParam(params[1]);
4107*f6dc9357SAndroid Build Coastguard Worker if (numOps == 2 && c == '^' && IsDirectString_Equal(params[2], "0xFFFFFFFF"))
4108*f6dc9357SAndroid Build Coastguard Worker s += " ~ ;";
4109*f6dc9357SAndroid Build Coastguard Worker Space();
4110*f6dc9357SAndroid Build Coastguard Worker s += c;
4111*f6dc9357SAndroid Build Coastguard Worker if (numOps != 1)
4112*f6dc9357SAndroid Build Coastguard Worker {
4113*f6dc9357SAndroid Build Coastguard Worker if (opIndex == 13) // v3.03+ : operation ">>>"
4114*f6dc9357SAndroid Build Coastguard Worker s += c;
4115*f6dc9357SAndroid Build Coastguard Worker if (c2 != 0)
4116*f6dc9357SAndroid Build Coastguard Worker s += c2;
4117*f6dc9357SAndroid Build Coastguard Worker AddParam(params[2]);
4118*f6dc9357SAndroid Build Coastguard Worker }
4119*f6dc9357SAndroid Build Coastguard Worker break;
4120*f6dc9357SAndroid Build Coastguard Worker }
4121*f6dc9357SAndroid Build Coastguard Worker
4122*f6dc9357SAndroid Build Coastguard Worker case EW_INTFMT:
4123*f6dc9357SAndroid Build Coastguard Worker {
4124*f6dc9357SAndroid Build Coastguard Worker if (params[3])
4125*f6dc9357SAndroid Build Coastguard Worker s += "Int64Fmt"; // v3.03+
4126*f6dc9357SAndroid Build Coastguard Worker else
4127*f6dc9357SAndroid Build Coastguard Worker s += "IntFmt";
4128*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4129*f6dc9357SAndroid Build Coastguard Worker AddParams(params + 1, 2);
4130*f6dc9357SAndroid Build Coastguard Worker break;
4131*f6dc9357SAndroid Build Coastguard Worker }
4132*f6dc9357SAndroid Build Coastguard Worker
4133*f6dc9357SAndroid Build Coastguard Worker case EW_PUSHPOP:
4134*f6dc9357SAndroid Build Coastguard Worker {
4135*f6dc9357SAndroid Build Coastguard Worker if (params[2] != 0)
4136*f6dc9357SAndroid Build Coastguard Worker {
4137*f6dc9357SAndroid Build Coastguard Worker s += "Exch";
4138*f6dc9357SAndroid Build Coastguard Worker if (params[2] != 1)
4139*f6dc9357SAndroid Build Coastguard Worker AddParam_UInt(params[2]);
4140*f6dc9357SAndroid Build Coastguard Worker }
4141*f6dc9357SAndroid Build Coastguard Worker else if (params[1] != 0)
4142*f6dc9357SAndroid Build Coastguard Worker {
4143*f6dc9357SAndroid Build Coastguard Worker s += "Pop";
4144*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4145*f6dc9357SAndroid Build Coastguard Worker }
4146*f6dc9357SAndroid Build Coastguard Worker else
4147*f6dc9357SAndroid Build Coastguard Worker {
4148*f6dc9357SAndroid Build Coastguard Worker if (NoLabels(labels + kkk + 1, 2)
4149*f6dc9357SAndroid Build Coastguard Worker && Get32(p + kCmdSize) == EW_PUSHPOP // Exch"
4150*f6dc9357SAndroid Build Coastguard Worker && GET_CMD_PARAM(p + kCmdSize, 2) == 1
4151*f6dc9357SAndroid Build Coastguard Worker && Get32(p + kCmdSize * 2) == EW_PUSHPOP // Pop $VAR
4152*f6dc9357SAndroid Build Coastguard Worker && GET_CMD_PARAM(p + kCmdSize * 2, 1) != 0)
4153*f6dc9357SAndroid Build Coastguard Worker {
4154*f6dc9357SAndroid Build Coastguard Worker if (IsVarStr(params[0], GET_CMD_PARAM(p + kCmdSize * 2, 0)))
4155*f6dc9357SAndroid Build Coastguard Worker {
4156*f6dc9357SAndroid Build Coastguard Worker s += "Exch";
4157*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
4158*f6dc9357SAndroid Build Coastguard Worker NewLine();
4159*f6dc9357SAndroid Build Coastguard Worker Tab(true);
4160*f6dc9357SAndroid Build Coastguard Worker endCommentIndex = kkk + 3;
4161*f6dc9357SAndroid Build Coastguard Worker }
4162*f6dc9357SAndroid Build Coastguard Worker }
4163*f6dc9357SAndroid Build Coastguard Worker s += "Push";
4164*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
4165*f6dc9357SAndroid Build Coastguard Worker }
4166*f6dc9357SAndroid Build Coastguard Worker break;
4167*f6dc9357SAndroid Build Coastguard Worker }
4168*f6dc9357SAndroid Build Coastguard Worker
4169*f6dc9357SAndroid Build Coastguard Worker case EW_FINDWINDOW:
4170*f6dc9357SAndroid Build Coastguard Worker {
4171*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4172*f6dc9357SAndroid Build Coastguard Worker AddParam(params[1]);
4173*f6dc9357SAndroid Build Coastguard Worker AddOptionalParams(params + 2, 3);
4174*f6dc9357SAndroid Build Coastguard Worker break;
4175*f6dc9357SAndroid Build Coastguard Worker }
4176*f6dc9357SAndroid Build Coastguard Worker
4177*f6dc9357SAndroid Build Coastguard Worker case EW_SENDMESSAGE:
4178*f6dc9357SAndroid Build Coastguard Worker {
4179*f6dc9357SAndroid Build Coastguard Worker // SendMessage: 6 [output, hwnd, msg, wparam, lparam, [wparamstring?1:0 | lparamstring?2:0 | timeout<<2]
4180*f6dc9357SAndroid Build Coastguard Worker AddParam(params[1]);
4181*f6dc9357SAndroid Build Coastguard Worker
4182*f6dc9357SAndroid Build Coastguard Worker const char *w = NULL;
4183*f6dc9357SAndroid Build Coastguard Worker AString t;
4184*f6dc9357SAndroid Build Coastguard Worker ReadString2(t, params[2]);
4185*f6dc9357SAndroid Build Coastguard Worker UInt32 wm;
4186*f6dc9357SAndroid Build Coastguard Worker if (StringToUInt32(t, wm))
4187*f6dc9357SAndroid Build Coastguard Worker {
4188*f6dc9357SAndroid Build Coastguard Worker switch (wm)
4189*f6dc9357SAndroid Build Coastguard Worker {
4190*f6dc9357SAndroid Build Coastguard Worker case 0x0C: w = "SETTEXT"; break;
4191*f6dc9357SAndroid Build Coastguard Worker case 0x10: w = "CLOSE"; break;
4192*f6dc9357SAndroid Build Coastguard Worker case 0x30: w = "SETFONT"; break;
4193*f6dc9357SAndroid Build Coastguard Worker }
4194*f6dc9357SAndroid Build Coastguard Worker }
4195*f6dc9357SAndroid Build Coastguard Worker if (w)
4196*f6dc9357SAndroid Build Coastguard Worker {
4197*f6dc9357SAndroid Build Coastguard Worker s += " ${WM_";
4198*f6dc9357SAndroid Build Coastguard Worker s += w;
4199*f6dc9357SAndroid Build Coastguard Worker s += '}';
4200*f6dc9357SAndroid Build Coastguard Worker }
4201*f6dc9357SAndroid Build Coastguard Worker else
4202*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(t);
4203*f6dc9357SAndroid Build Coastguard Worker
4204*f6dc9357SAndroid Build Coastguard Worker UInt32 spec = params[5];
4205*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < 2; i++)
4206*f6dc9357SAndroid Build Coastguard Worker {
4207*f6dc9357SAndroid Build Coastguard Worker AString s2;
4208*f6dc9357SAndroid Build Coastguard Worker if (spec & ((UInt32)1 << i))
4209*f6dc9357SAndroid Build Coastguard Worker s2 += "STR:";
4210*f6dc9357SAndroid Build Coastguard Worker ReadString2(s2, params[3 + i]);
4211*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(s2);
4212*f6dc9357SAndroid Build Coastguard Worker }
4213*f6dc9357SAndroid Build Coastguard Worker
4214*f6dc9357SAndroid Build Coastguard Worker if ((Int32)params[0] >= 0)
4215*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4216*f6dc9357SAndroid Build Coastguard Worker
4217*f6dc9357SAndroid Build Coastguard Worker spec >>= 2;
4218*f6dc9357SAndroid Build Coastguard Worker if (spec != 0)
4219*f6dc9357SAndroid Build Coastguard Worker {
4220*f6dc9357SAndroid Build Coastguard Worker s += " /TIMEOUT=";
4221*f6dc9357SAndroid Build Coastguard Worker Add_UInt(spec);
4222*f6dc9357SAndroid Build Coastguard Worker }
4223*f6dc9357SAndroid Build Coastguard Worker break;
4224*f6dc9357SAndroid Build Coastguard Worker }
4225*f6dc9357SAndroid Build Coastguard Worker
4226*f6dc9357SAndroid Build Coastguard Worker case EW_ISWINDOW:
4227*f6dc9357SAndroid Build Coastguard Worker {
4228*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
4229*f6dc9357SAndroid Build Coastguard Worker Add_GotoVars2(¶ms[1]);
4230*f6dc9357SAndroid Build Coastguard Worker break;
4231*f6dc9357SAndroid Build Coastguard Worker }
4232*f6dc9357SAndroid Build Coastguard Worker
4233*f6dc9357SAndroid Build Coastguard Worker case EW_GETDLGITEM:
4234*f6dc9357SAndroid Build Coastguard Worker {
4235*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4236*f6dc9357SAndroid Build Coastguard Worker AddParams(params + 1, 2);
4237*f6dc9357SAndroid Build Coastguard Worker break;
4238*f6dc9357SAndroid Build Coastguard Worker }
4239*f6dc9357SAndroid Build Coastguard Worker
4240*f6dc9357SAndroid Build Coastguard Worker case EW_SETCTLCOLORS:
4241*f6dc9357SAndroid Build Coastguard Worker {
4242*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
4243*f6dc9357SAndroid Build Coastguard Worker
4244*f6dc9357SAndroid Build Coastguard Worker UInt32 offset = params[1];
4245*f6dc9357SAndroid Build Coastguard Worker
4246*f6dc9357SAndroid Build Coastguard Worker if (_size < bhCtlColors.Offset
4247*f6dc9357SAndroid Build Coastguard Worker || _size - bhCtlColors.Offset < offset
4248*f6dc9357SAndroid Build Coastguard Worker || _size - bhCtlColors.Offset - offset < GET_CtlColors_SIZE(Is64Bit))
4249*f6dc9357SAndroid Build Coastguard Worker {
4250*f6dc9357SAndroid Build Coastguard Worker AddError("bad offset");
4251*f6dc9357SAndroid Build Coastguard Worker break;
4252*f6dc9357SAndroid Build Coastguard Worker }
4253*f6dc9357SAndroid Build Coastguard Worker
4254*f6dc9357SAndroid Build Coastguard Worker const Byte *p2 = _data + bhCtlColors.Offset + offset;
4255*f6dc9357SAndroid Build Coastguard Worker CNsis_CtlColors colors;
4256*f6dc9357SAndroid Build Coastguard Worker colors.Parse(p2, Is64Bit);
4257*f6dc9357SAndroid Build Coastguard Worker
4258*f6dc9357SAndroid Build Coastguard Worker if ((colors.flags & kColorsFlags_BK_SYS) != 0 ||
4259*f6dc9357SAndroid Build Coastguard Worker (colors.flags & kColorsFlags_TEXT_SYS) != 0)
4260*f6dc9357SAndroid Build Coastguard Worker s += " /BRANDING";
4261*f6dc9357SAndroid Build Coastguard Worker
4262*f6dc9357SAndroid Build Coastguard Worker AString bk;
4263*f6dc9357SAndroid Build Coastguard Worker bool bkc = false;
4264*f6dc9357SAndroid Build Coastguard Worker if (colors.bkmode == Z7_NSIS_WIN_TRANSPARENT)
4265*f6dc9357SAndroid Build Coastguard Worker bk += " transparent";
4266*f6dc9357SAndroid Build Coastguard Worker else if (colors.flags & kColorsFlags_BKB)
4267*f6dc9357SAndroid Build Coastguard Worker {
4268*f6dc9357SAndroid Build Coastguard Worker if ((colors.flags & kColorsFlags_BK_SYS) == 0 &&
4269*f6dc9357SAndroid Build Coastguard Worker (colors.flags & kColorsFlags_BK) != 0)
4270*f6dc9357SAndroid Build Coastguard Worker bkc = true;
4271*f6dc9357SAndroid Build Coastguard Worker }
4272*f6dc9357SAndroid Build Coastguard Worker if ((colors.flags & kColorsFlags_TEXT) != 0 || !bk.IsEmpty() || bkc)
4273*f6dc9357SAndroid Build Coastguard Worker {
4274*f6dc9357SAndroid Build Coastguard Worker Space();
4275*f6dc9357SAndroid Build Coastguard Worker if ((colors.flags & kColorsFlags_TEXT_SYS) != 0 || (colors.flags & kColorsFlags_TEXT) == 0)
4276*f6dc9357SAndroid Build Coastguard Worker AddQuotes();
4277*f6dc9357SAndroid Build Coastguard Worker else
4278*f6dc9357SAndroid Build Coastguard Worker Add_Color(colors.text);
4279*f6dc9357SAndroid Build Coastguard Worker }
4280*f6dc9357SAndroid Build Coastguard Worker s += bk;
4281*f6dc9357SAndroid Build Coastguard Worker if (bkc)
4282*f6dc9357SAndroid Build Coastguard Worker {
4283*f6dc9357SAndroid Build Coastguard Worker Space();
4284*f6dc9357SAndroid Build Coastguard Worker Add_Color(colors.bkc);
4285*f6dc9357SAndroid Build Coastguard Worker }
4286*f6dc9357SAndroid Build Coastguard Worker
4287*f6dc9357SAndroid Build Coastguard Worker break;
4288*f6dc9357SAndroid Build Coastguard Worker }
4289*f6dc9357SAndroid Build Coastguard Worker
4290*f6dc9357SAndroid Build Coastguard Worker // case EW_LOADANDSETIMAGE:
4291*f6dc9357SAndroid Build Coastguard Worker case EW_SETBRANDINGIMAGE:
4292*f6dc9357SAndroid Build Coastguard Worker {
4293*f6dc9357SAndroid Build Coastguard Worker s += " /IMGID=";
4294*f6dc9357SAndroid Build Coastguard Worker Add_UInt(params[1]);
4295*f6dc9357SAndroid Build Coastguard Worker if (params[2] == 1)
4296*f6dc9357SAndroid Build Coastguard Worker s += " /RESIZETOFIT";
4297*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
4298*f6dc9357SAndroid Build Coastguard Worker break;
4299*f6dc9357SAndroid Build Coastguard Worker }
4300*f6dc9357SAndroid Build Coastguard Worker
4301*f6dc9357SAndroid Build Coastguard Worker case EW_CREATEFONT:
4302*f6dc9357SAndroid Build Coastguard Worker {
4303*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4304*f6dc9357SAndroid Build Coastguard Worker AddParam(params[1]);
4305*f6dc9357SAndroid Build Coastguard Worker AddOptionalParams(params + 2, 2);
4306*f6dc9357SAndroid Build Coastguard Worker if (params[4] & 1) s += " /ITALIC";
4307*f6dc9357SAndroid Build Coastguard Worker if (params[4] & 2) s += " /UNDERLINE";
4308*f6dc9357SAndroid Build Coastguard Worker if (params[4] & 4) s += " /STRIKE";
4309*f6dc9357SAndroid Build Coastguard Worker break;
4310*f6dc9357SAndroid Build Coastguard Worker }
4311*f6dc9357SAndroid Build Coastguard Worker
4312*f6dc9357SAndroid Build Coastguard Worker case EW_SHOWWINDOW:
4313*f6dc9357SAndroid Build Coastguard Worker {
4314*f6dc9357SAndroid Build Coastguard Worker AString hw, sw;
4315*f6dc9357SAndroid Build Coastguard Worker ReadString2(hw, params[0]);
4316*f6dc9357SAndroid Build Coastguard Worker ReadString2(sw, params[1]);
4317*f6dc9357SAndroid Build Coastguard Worker if (params[3] != 0)
4318*f6dc9357SAndroid Build Coastguard Worker s += "EnableWindow";
4319*f6dc9357SAndroid Build Coastguard Worker else
4320*f6dc9357SAndroid Build Coastguard Worker {
4321*f6dc9357SAndroid Build Coastguard Worker UInt32 val;
4322*f6dc9357SAndroid Build Coastguard Worker bool valDefined = false;
4323*f6dc9357SAndroid Build Coastguard Worker if (StringToUInt32(sw, val))
4324*f6dc9357SAndroid Build Coastguard Worker {
4325*f6dc9357SAndroid Build Coastguard Worker if (val < Z7_ARRAY_SIZE(kShowWindow_Commands))
4326*f6dc9357SAndroid Build Coastguard Worker {
4327*f6dc9357SAndroid Build Coastguard Worker sw.Empty();
4328*f6dc9357SAndroid Build Coastguard Worker sw += "${";
4329*f6dc9357SAndroid Build Coastguard Worker Add_ShowWindow_Cmd_2(sw, val);
4330*f6dc9357SAndroid Build Coastguard Worker sw += '}';
4331*f6dc9357SAndroid Build Coastguard Worker valDefined = true;
4332*f6dc9357SAndroid Build Coastguard Worker }
4333*f6dc9357SAndroid Build Coastguard Worker }
4334*f6dc9357SAndroid Build Coastguard Worker bool isHwndParent = IsVarStr(params[0], IsNsis225 ? kVar_HWNDPARENT_225 : kVar_HWNDPARENT);
4335*f6dc9357SAndroid Build Coastguard Worker if (params[2] != 0)
4336*f6dc9357SAndroid Build Coastguard Worker {
4337*f6dc9357SAndroid Build Coastguard Worker if (valDefined && val == 0 && isHwndParent)
4338*f6dc9357SAndroid Build Coastguard Worker {
4339*f6dc9357SAndroid Build Coastguard Worker s += "HideWindow";
4340*f6dc9357SAndroid Build Coastguard Worker break;
4341*f6dc9357SAndroid Build Coastguard Worker }
4342*f6dc9357SAndroid Build Coastguard Worker }
4343*f6dc9357SAndroid Build Coastguard Worker if (valDefined && val == 5 && isHwndParent &&
4344*f6dc9357SAndroid Build Coastguard Worker kkk + 1 < bh.Num && GetCmd(Get32(p + kCmdSize)) == EW_BRINGTOFRONT)
4345*f6dc9357SAndroid Build Coastguard Worker {
4346*f6dc9357SAndroid Build Coastguard Worker s += " ; ";
4347*f6dc9357SAndroid Build Coastguard Worker }
4348*f6dc9357SAndroid Build Coastguard Worker s += "ShowWindow";
4349*f6dc9357SAndroid Build Coastguard Worker }
4350*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(hw);
4351*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(sw);
4352*f6dc9357SAndroid Build Coastguard Worker break;
4353*f6dc9357SAndroid Build Coastguard Worker }
4354*f6dc9357SAndroid Build Coastguard Worker
4355*f6dc9357SAndroid Build Coastguard Worker case EW_SHELLEXEC:
4356*f6dc9357SAndroid Build Coastguard Worker {
4357*f6dc9357SAndroid Build Coastguard Worker AddParams(params, 2);
4358*f6dc9357SAndroid Build Coastguard Worker if (params[2] != 0 || params[3] != Z7_NSIS_WIN_SW_SHOWNORMAL)
4359*f6dc9357SAndroid Build Coastguard Worker {
4360*f6dc9357SAndroid Build Coastguard Worker AddParam(params[2]);
4361*f6dc9357SAndroid Build Coastguard Worker if (params[3] != Z7_NSIS_WIN_SW_SHOWNORMAL)
4362*f6dc9357SAndroid Build Coastguard Worker {
4363*f6dc9357SAndroid Build Coastguard Worker Space();
4364*f6dc9357SAndroid Build Coastguard Worker Add_ShowWindow_Cmd(params[3]);
4365*f6dc9357SAndroid Build Coastguard Worker }
4366*f6dc9357SAndroid Build Coastguard Worker }
4367*f6dc9357SAndroid Build Coastguard Worker if (params[5] != 0)
4368*f6dc9357SAndroid Build Coastguard Worker {
4369*f6dc9357SAndroid Build Coastguard Worker s += " ;";
4370*f6dc9357SAndroid Build Coastguard Worker AddParam(params[5]); // it's tatus text update
4371*f6dc9357SAndroid Build Coastguard Worker }
4372*f6dc9357SAndroid Build Coastguard Worker break;
4373*f6dc9357SAndroid Build Coastguard Worker }
4374*f6dc9357SAndroid Build Coastguard Worker
4375*f6dc9357SAndroid Build Coastguard Worker case EW_EXECUTE:
4376*f6dc9357SAndroid Build Coastguard Worker {
4377*f6dc9357SAndroid Build Coastguard Worker if (params[2] != 0)
4378*f6dc9357SAndroid Build Coastguard Worker s += "Wait";
4379*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
4380*f6dc9357SAndroid Build Coastguard Worker if (params[2] != 0)
4381*f6dc9357SAndroid Build Coastguard Worker if ((Int32)params[1] >= 0)
4382*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[1]);
4383*f6dc9357SAndroid Build Coastguard Worker break;
4384*f6dc9357SAndroid Build Coastguard Worker }
4385*f6dc9357SAndroid Build Coastguard Worker
4386*f6dc9357SAndroid Build Coastguard Worker case EW_GETFILETIME:
4387*f6dc9357SAndroid Build Coastguard Worker case EW_GETDLLVERSION:
4388*f6dc9357SAndroid Build Coastguard Worker {
4389*f6dc9357SAndroid Build Coastguard Worker if (commandId == EW_GETDLLVERSION)
4390*f6dc9357SAndroid Build Coastguard Worker if (params[3] == 2)
4391*f6dc9357SAndroid Build Coastguard Worker s += " /ProductVersion"; // v3.08+
4392*f6dc9357SAndroid Build Coastguard Worker AddParam(params[2]);
4393*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4394*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[1]);
4395*f6dc9357SAndroid Build Coastguard Worker break;
4396*f6dc9357SAndroid Build Coastguard Worker }
4397*f6dc9357SAndroid Build Coastguard Worker
4398*f6dc9357SAndroid Build Coastguard Worker case EW_REGISTERDLL:
4399*f6dc9357SAndroid Build Coastguard Worker {
4400*f6dc9357SAndroid Build Coastguard Worker AString func;
4401*f6dc9357SAndroid Build Coastguard Worker ReadString2(func, params[1]);
4402*f6dc9357SAndroid Build Coastguard Worker bool printFunc = true;
4403*f6dc9357SAndroid Build Coastguard Worker // params[4] = 1; for plugin command
4404*f6dc9357SAndroid Build Coastguard Worker if (params[2] == 0)
4405*f6dc9357SAndroid Build Coastguard Worker {
4406*f6dc9357SAndroid Build Coastguard Worker s += "CallInstDLL";
4407*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
4408*f6dc9357SAndroid Build Coastguard Worker if (params[3] == 1)
4409*f6dc9357SAndroid Build Coastguard Worker s += " /NOUNLOAD";
4410*f6dc9357SAndroid Build Coastguard Worker }
4411*f6dc9357SAndroid Build Coastguard Worker else
4412*f6dc9357SAndroid Build Coastguard Worker {
4413*f6dc9357SAndroid Build Coastguard Worker if (func == "DllUnregisterServer")
4414*f6dc9357SAndroid Build Coastguard Worker {
4415*f6dc9357SAndroid Build Coastguard Worker s += "UnRegDLL";
4416*f6dc9357SAndroid Build Coastguard Worker printFunc = false;
4417*f6dc9357SAndroid Build Coastguard Worker }
4418*f6dc9357SAndroid Build Coastguard Worker else
4419*f6dc9357SAndroid Build Coastguard Worker {
4420*f6dc9357SAndroid Build Coastguard Worker s += "RegDLL";
4421*f6dc9357SAndroid Build Coastguard Worker if (func == "DllRegisterServer")
4422*f6dc9357SAndroid Build Coastguard Worker printFunc = false;
4423*f6dc9357SAndroid Build Coastguard Worker }
4424*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
4425*f6dc9357SAndroid Build Coastguard Worker }
4426*f6dc9357SAndroid Build Coastguard Worker if (printFunc)
4427*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(func);
4428*f6dc9357SAndroid Build Coastguard Worker break;
4429*f6dc9357SAndroid Build Coastguard Worker }
4430*f6dc9357SAndroid Build Coastguard Worker
4431*f6dc9357SAndroid Build Coastguard Worker case EW_CREATESHORTCUT:
4432*f6dc9357SAndroid Build Coastguard Worker {
4433*f6dc9357SAndroid Build Coastguard Worker unsigned numParams;
4434*f6dc9357SAndroid Build Coastguard Worker #define IsNsis3d0b3_OrHigher() 0 // change it
4435*f6dc9357SAndroid Build Coastguard Worker const unsigned v3_0b3 = IsNsis3d0b3_OrHigher();
4436*f6dc9357SAndroid Build Coastguard Worker for (numParams = 6; numParams > 2; numParams--)
4437*f6dc9357SAndroid Build Coastguard Worker if (params[numParams - 1] != 0)
4438*f6dc9357SAndroid Build Coastguard Worker break;
4439*f6dc9357SAndroid Build Coastguard Worker
4440*f6dc9357SAndroid Build Coastguard Worker const UInt32 spec = params[4];
4441*f6dc9357SAndroid Build Coastguard Worker const unsigned sw_shift = v3_0b3 ? 12 : 8;
4442*f6dc9357SAndroid Build Coastguard Worker const UInt32 sw_mask = v3_0b3 ? 0x7000 : 0x7F;
4443*f6dc9357SAndroid Build Coastguard Worker if (spec & 0x8000) // NSIS 3.0b0
4444*f6dc9357SAndroid Build Coastguard Worker s += " /NoWorkingDir";
4445*f6dc9357SAndroid Build Coastguard Worker
4446*f6dc9357SAndroid Build Coastguard Worker AddParams(params, numParams > 4 ? 4 : numParams);
4447*f6dc9357SAndroid Build Coastguard Worker if (numParams <= 4)
4448*f6dc9357SAndroid Build Coastguard Worker break;
4449*f6dc9357SAndroid Build Coastguard Worker
4450*f6dc9357SAndroid Build Coastguard Worker UInt32 icon = (spec & (v3_0b3 ? 0xFFF : 0xFF));
4451*f6dc9357SAndroid Build Coastguard Worker Space();
4452*f6dc9357SAndroid Build Coastguard Worker if (icon != 0)
4453*f6dc9357SAndroid Build Coastguard Worker Add_UInt(icon);
4454*f6dc9357SAndroid Build Coastguard Worker else
4455*f6dc9357SAndroid Build Coastguard Worker AddQuotes();
4456*f6dc9357SAndroid Build Coastguard Worker
4457*f6dc9357SAndroid Build Coastguard Worker if ((spec >> sw_shift) == 0 && numParams < 6)
4458*f6dc9357SAndroid Build Coastguard Worker break;
4459*f6dc9357SAndroid Build Coastguard Worker UInt32 sw = (spec >> sw_shift) & sw_mask;
4460*f6dc9357SAndroid Build Coastguard Worker Space();
4461*f6dc9357SAndroid Build Coastguard Worker // NSIS encoder replaces these names:
4462*f6dc9357SAndroid Build Coastguard Worker if (sw == Z7_NSIS_WIN_SW_SHOWMINNOACTIVE)
4463*f6dc9357SAndroid Build Coastguard Worker sw = Z7_NSIS_WIN_SW_SHOWMINIMIZED;
4464*f6dc9357SAndroid Build Coastguard Worker if (sw == 0)
4465*f6dc9357SAndroid Build Coastguard Worker AddQuotes();
4466*f6dc9357SAndroid Build Coastguard Worker else
4467*f6dc9357SAndroid Build Coastguard Worker Add_ShowWindow_Cmd(sw);
4468*f6dc9357SAndroid Build Coastguard Worker
4469*f6dc9357SAndroid Build Coastguard Worker UInt32 modKey = spec >> 24;
4470*f6dc9357SAndroid Build Coastguard Worker UInt32 key = (spec >> 16) & 0xFF;
4471*f6dc9357SAndroid Build Coastguard Worker
4472*f6dc9357SAndroid Build Coastguard Worker if (modKey == 0 && key == 0)
4473*f6dc9357SAndroid Build Coastguard Worker {
4474*f6dc9357SAndroid Build Coastguard Worker if (numParams < 6)
4475*f6dc9357SAndroid Build Coastguard Worker break;
4476*f6dc9357SAndroid Build Coastguard Worker Space();
4477*f6dc9357SAndroid Build Coastguard Worker AddQuotes();
4478*f6dc9357SAndroid Build Coastguard Worker }
4479*f6dc9357SAndroid Build Coastguard Worker else
4480*f6dc9357SAndroid Build Coastguard Worker {
4481*f6dc9357SAndroid Build Coastguard Worker Space();
4482*f6dc9357SAndroid Build Coastguard Worker if (modKey & 1) s += "SHIFT|"; // HOTKEYF_SHIFT
4483*f6dc9357SAndroid Build Coastguard Worker if (modKey & 2) s += "CONTROL|";
4484*f6dc9357SAndroid Build Coastguard Worker if (modKey & 4) s += "ALT|";
4485*f6dc9357SAndroid Build Coastguard Worker if (modKey & 8) s += "EXT|";
4486*f6dc9357SAndroid Build Coastguard Worker
4487*f6dc9357SAndroid Build Coastguard Worker const unsigned kMy_VK_F1 = 0x70;
4488*f6dc9357SAndroid Build Coastguard Worker if (key >= kMy_VK_F1 && key <= kMy_VK_F1 + 23)
4489*f6dc9357SAndroid Build Coastguard Worker {
4490*f6dc9357SAndroid Build Coastguard Worker s += 'F';
4491*f6dc9357SAndroid Build Coastguard Worker Add_UInt(key - kMy_VK_F1 + 1);
4492*f6dc9357SAndroid Build Coastguard Worker }
4493*f6dc9357SAndroid Build Coastguard Worker else if ((key >= 'A' && key <= 'Z') || (key >= '0' && key <= '9'))
4494*f6dc9357SAndroid Build Coastguard Worker s += (char)key;
4495*f6dc9357SAndroid Build Coastguard Worker else
4496*f6dc9357SAndroid Build Coastguard Worker {
4497*f6dc9357SAndroid Build Coastguard Worker s += "Char_";
4498*f6dc9357SAndroid Build Coastguard Worker Add_UInt(key);
4499*f6dc9357SAndroid Build Coastguard Worker }
4500*f6dc9357SAndroid Build Coastguard Worker }
4501*f6dc9357SAndroid Build Coastguard Worker AddOptionalParam(params[5]); // description
4502*f6dc9357SAndroid Build Coastguard Worker break;
4503*f6dc9357SAndroid Build Coastguard Worker }
4504*f6dc9357SAndroid Build Coastguard Worker
4505*f6dc9357SAndroid Build Coastguard Worker case EW_COPYFILES:
4506*f6dc9357SAndroid Build Coastguard Worker {
4507*f6dc9357SAndroid Build Coastguard Worker if (params[2] & 0x04) s += " /SILENT"; // FOF_SILENT
4508*f6dc9357SAndroid Build Coastguard Worker if (params[2] & 0x80) s += " /FILESONLY"; // FOF_FILESONLY
4509*f6dc9357SAndroid Build Coastguard Worker AddParams(params, 2);
4510*f6dc9357SAndroid Build Coastguard Worker if (params[3] != 0)
4511*f6dc9357SAndroid Build Coastguard Worker {
4512*f6dc9357SAndroid Build Coastguard Worker s += " ;";
4513*f6dc9357SAndroid Build Coastguard Worker AddParam(params[3]); // status text update
4514*f6dc9357SAndroid Build Coastguard Worker }
4515*f6dc9357SAndroid Build Coastguard Worker break;
4516*f6dc9357SAndroid Build Coastguard Worker }
4517*f6dc9357SAndroid Build Coastguard Worker
4518*f6dc9357SAndroid Build Coastguard Worker case EW_REBOOT:
4519*f6dc9357SAndroid Build Coastguard Worker {
4520*f6dc9357SAndroid Build Coastguard Worker if (params[0] != 0xbadf00d)
4521*f6dc9357SAndroid Build Coastguard Worker s += " ; Corrupted ???";
4522*f6dc9357SAndroid Build Coastguard Worker else if (kkk + 1 < bh.Num && GetCmd(Get32(p + kCmdSize)) == EW_QUIT)
4523*f6dc9357SAndroid Build Coastguard Worker endCommentIndex = kkk + 2;
4524*f6dc9357SAndroid Build Coastguard Worker break;
4525*f6dc9357SAndroid Build Coastguard Worker }
4526*f6dc9357SAndroid Build Coastguard Worker
4527*f6dc9357SAndroid Build Coastguard Worker case EW_WRITEINI:
4528*f6dc9357SAndroid Build Coastguard Worker {
4529*f6dc9357SAndroid Build Coastguard Worker unsigned numAlwaysParams = 0;
4530*f6dc9357SAndroid Build Coastguard Worker if (params[0] == 0) // Section
4531*f6dc9357SAndroid Build Coastguard Worker s += "FlushINI";
4532*f6dc9357SAndroid Build Coastguard Worker else if (params[4] != 0)
4533*f6dc9357SAndroid Build Coastguard Worker {
4534*f6dc9357SAndroid Build Coastguard Worker s += "WriteINIStr";
4535*f6dc9357SAndroid Build Coastguard Worker numAlwaysParams = 3;
4536*f6dc9357SAndroid Build Coastguard Worker }
4537*f6dc9357SAndroid Build Coastguard Worker else
4538*f6dc9357SAndroid Build Coastguard Worker {
4539*f6dc9357SAndroid Build Coastguard Worker s += "DeleteINI";
4540*f6dc9357SAndroid Build Coastguard Worker s += (params[1] == 0) ? "Sec" : "Str";
4541*f6dc9357SAndroid Build Coastguard Worker numAlwaysParams = 1;
4542*f6dc9357SAndroid Build Coastguard Worker }
4543*f6dc9357SAndroid Build Coastguard Worker AddParam(params[3]); // filename
4544*f6dc9357SAndroid Build Coastguard Worker // Section, EntryName, Value
4545*f6dc9357SAndroid Build Coastguard Worker AddParams(params, numAlwaysParams);
4546*f6dc9357SAndroid Build Coastguard Worker AddOptionalParams(params + numAlwaysParams, 3 - numAlwaysParams);
4547*f6dc9357SAndroid Build Coastguard Worker break;
4548*f6dc9357SAndroid Build Coastguard Worker }
4549*f6dc9357SAndroid Build Coastguard Worker
4550*f6dc9357SAndroid Build Coastguard Worker case EW_READINISTR:
4551*f6dc9357SAndroid Build Coastguard Worker {
4552*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4553*f6dc9357SAndroid Build Coastguard Worker AddParam(params[3]); // FileName
4554*f6dc9357SAndroid Build Coastguard Worker AddParams(params +1, 2); // Section, EntryName
4555*f6dc9357SAndroid Build Coastguard Worker break;
4556*f6dc9357SAndroid Build Coastguard Worker }
4557*f6dc9357SAndroid Build Coastguard Worker
4558*f6dc9357SAndroid Build Coastguard Worker case EW_DELREG:
4559*f6dc9357SAndroid Build Coastguard Worker {
4560*f6dc9357SAndroid Build Coastguard Worker // NSIS 2.00 used another scheme!
4561*f6dc9357SAndroid Build Coastguard Worker
4562*f6dc9357SAndroid Build Coastguard Worker if (params[4] == 0)
4563*f6dc9357SAndroid Build Coastguard Worker s += "Value";
4564*f6dc9357SAndroid Build Coastguard Worker else
4565*f6dc9357SAndroid Build Coastguard Worker {
4566*f6dc9357SAndroid Build Coastguard Worker s += "Key";
4567*f6dc9357SAndroid Build Coastguard Worker if (params[4] & 2)
4568*f6dc9357SAndroid Build Coastguard Worker s += " /ifempty";
4569*f6dc9357SAndroid Build Coastguard Worker // TODO: /ifnosubkeys, /ifnovalues
4570*f6dc9357SAndroid Build Coastguard Worker }
4571*f6dc9357SAndroid Build Coastguard Worker AddRegRoot(params[1]);
4572*f6dc9357SAndroid Build Coastguard Worker AddParam(params[2]);
4573*f6dc9357SAndroid Build Coastguard Worker AddOptionalParam(params[3]);
4574*f6dc9357SAndroid Build Coastguard Worker break;
4575*f6dc9357SAndroid Build Coastguard Worker }
4576*f6dc9357SAndroid Build Coastguard Worker
4577*f6dc9357SAndroid Build Coastguard Worker case EW_WRITEREG:
4578*f6dc9357SAndroid Build Coastguard Worker {
4579*f6dc9357SAndroid Build Coastguard Worker const char *s2 = NULL;
4580*f6dc9357SAndroid Build Coastguard Worker switch (params[4])
4581*f6dc9357SAndroid Build Coastguard Worker {
4582*f6dc9357SAndroid Build Coastguard Worker case 1: s2 = "Str"; break;
4583*f6dc9357SAndroid Build Coastguard Worker case 2: s2 = "ExpandStr"; break; // maybe unused
4584*f6dc9357SAndroid Build Coastguard Worker case 3: s2 = "Bin"; break;
4585*f6dc9357SAndroid Build Coastguard Worker case 4: s2 = "DWORD"; break;
4586*f6dc9357SAndroid Build Coastguard Worker default:
4587*f6dc9357SAndroid Build Coastguard Worker s += '?';
4588*f6dc9357SAndroid Build Coastguard Worker Add_UInt(params[4]);
4589*f6dc9357SAndroid Build Coastguard Worker }
4590*f6dc9357SAndroid Build Coastguard Worker if (params[4] == 1 && params[5] == 2)
4591*f6dc9357SAndroid Build Coastguard Worker s2 = "ExpandStr";
4592*f6dc9357SAndroid Build Coastguard Worker if (params[4] == 3 && params[5] == 7)
4593*f6dc9357SAndroid Build Coastguard Worker s2 = "MultiStr"; // v3.02+
4594*f6dc9357SAndroid Build Coastguard Worker if (s2)
4595*f6dc9357SAndroid Build Coastguard Worker s += s2;
4596*f6dc9357SAndroid Build Coastguard Worker AddRegRoot(params[0]);
4597*f6dc9357SAndroid Build Coastguard Worker AddParams(params + 1, 2); // keyName, valueName
4598*f6dc9357SAndroid Build Coastguard Worker if (params[4] != 3)
4599*f6dc9357SAndroid Build Coastguard Worker AddParam(params[3]); // value
4600*f6dc9357SAndroid Build Coastguard Worker else
4601*f6dc9357SAndroid Build Coastguard Worker {
4602*f6dc9357SAndroid Build Coastguard Worker // Binary data.
4603*f6dc9357SAndroid Build Coastguard Worker Space();
4604*f6dc9357SAndroid Build Coastguard Worker UInt32 offset = params[3];
4605*f6dc9357SAndroid Build Coastguard Worker bool isSupported = false;
4606*f6dc9357SAndroid Build Coastguard Worker if (AfterHeaderSize >= 4
4607*f6dc9357SAndroid Build Coastguard Worker && bhData.Offset <= AfterHeaderSize - 4
4608*f6dc9357SAndroid Build Coastguard Worker && offset <= AfterHeaderSize - 4 - bhData.Offset)
4609*f6dc9357SAndroid Build Coastguard Worker {
4610*f6dc9357SAndroid Build Coastguard Worker // we support it for solid archives.
4611*f6dc9357SAndroid Build Coastguard Worker const Byte *p2 = _afterHeader + bhData.Offset + offset;
4612*f6dc9357SAndroid Build Coastguard Worker UInt32 size = Get32(p2);
4613*f6dc9357SAndroid Build Coastguard Worker if (size <= AfterHeaderSize - 4 - bhData.Offset - offset)
4614*f6dc9357SAndroid Build Coastguard Worker {
4615*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < size; i++)
4616*f6dc9357SAndroid Build Coastguard Worker {
4617*f6dc9357SAndroid Build Coastguard Worker Byte b = (p2 + 4)[i];
4618*f6dc9357SAndroid Build Coastguard Worker unsigned t;
4619*f6dc9357SAndroid Build Coastguard Worker t = (b >> 4); s += (char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))));
4620*f6dc9357SAndroid Build Coastguard Worker t = (b & 15); s += (char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))));
4621*f6dc9357SAndroid Build Coastguard Worker }
4622*f6dc9357SAndroid Build Coastguard Worker isSupported = true;
4623*f6dc9357SAndroid Build Coastguard Worker }
4624*f6dc9357SAndroid Build Coastguard Worker }
4625*f6dc9357SAndroid Build Coastguard Worker if (!isSupported)
4626*f6dc9357SAndroid Build Coastguard Worker {
4627*f6dc9357SAndroid Build Coastguard Worker // we must read from file here;
4628*f6dc9357SAndroid Build Coastguard Worker s += "data[";
4629*f6dc9357SAndroid Build Coastguard Worker Add_UInt(offset);
4630*f6dc9357SAndroid Build Coastguard Worker s += " ... ]";
4631*f6dc9357SAndroid Build Coastguard Worker s += " ; !!! Unsupported";
4632*f6dc9357SAndroid Build Coastguard Worker }
4633*f6dc9357SAndroid Build Coastguard Worker }
4634*f6dc9357SAndroid Build Coastguard Worker break;
4635*f6dc9357SAndroid Build Coastguard Worker }
4636*f6dc9357SAndroid Build Coastguard Worker
4637*f6dc9357SAndroid Build Coastguard Worker case EW_READREGSTR:
4638*f6dc9357SAndroid Build Coastguard Worker {
4639*f6dc9357SAndroid Build Coastguard Worker s += (params[4] == 1) ? "DWORD" : "Str";
4640*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4641*f6dc9357SAndroid Build Coastguard Worker AddRegRoot(params[1]);
4642*f6dc9357SAndroid Build Coastguard Worker AddParams(params + 2, 2);
4643*f6dc9357SAndroid Build Coastguard Worker break;
4644*f6dc9357SAndroid Build Coastguard Worker }
4645*f6dc9357SAndroid Build Coastguard Worker
4646*f6dc9357SAndroid Build Coastguard Worker case EW_REGENUM:
4647*f6dc9357SAndroid Build Coastguard Worker {
4648*f6dc9357SAndroid Build Coastguard Worker s += (params[4] != 0) ? "Key" : "Value";
4649*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4650*f6dc9357SAndroid Build Coastguard Worker AddRegRoot(params[1]);
4651*f6dc9357SAndroid Build Coastguard Worker AddParams(params + 2, 2);
4652*f6dc9357SAndroid Build Coastguard Worker break;
4653*f6dc9357SAndroid Build Coastguard Worker }
4654*f6dc9357SAndroid Build Coastguard Worker
4655*f6dc9357SAndroid Build Coastguard Worker case EW_FCLOSE:
4656*f6dc9357SAndroid Build Coastguard Worker case EW_FINDCLOSE:
4657*f6dc9357SAndroid Build Coastguard Worker {
4658*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4659*f6dc9357SAndroid Build Coastguard Worker break;
4660*f6dc9357SAndroid Build Coastguard Worker }
4661*f6dc9357SAndroid Build Coastguard Worker
4662*f6dc9357SAndroid Build Coastguard Worker #endif
4663*f6dc9357SAndroid Build Coastguard Worker
4664*f6dc9357SAndroid Build Coastguard Worker case EW_FOPEN:
4665*f6dc9357SAndroid Build Coastguard Worker {
4666*f6dc9357SAndroid Build Coastguard Worker /*
4667*f6dc9357SAndroid Build Coastguard Worker the pattern for empty files is following:
4668*f6dc9357SAndroid Build Coastguard Worker FileOpen $0 "file_name" w
4669*f6dc9357SAndroid Build Coastguard Worker FileClose $0
4670*f6dc9357SAndroid Build Coastguard Worker */
4671*f6dc9357SAndroid Build Coastguard Worker
4672*f6dc9357SAndroid Build Coastguard Worker const UInt32 acc = params[1]; // dwDesiredAccess
4673*f6dc9357SAndroid Build Coastguard Worker const UInt32 creat = params[2]; // dwCreationDisposition
4674*f6dc9357SAndroid Build Coastguard Worker if (creat == Z7_NSIS_WIN_CREATE_ALWAYS && acc == Z7_NSIS_WIN_GENERIC_WRITE)
4675*f6dc9357SAndroid Build Coastguard Worker {
4676*f6dc9357SAndroid Build Coastguard Worker if (kkk + 1 < bh.Num)
4677*f6dc9357SAndroid Build Coastguard Worker if (Get32(p + kCmdSize) == EW_FCLOSE)
4678*f6dc9357SAndroid Build Coastguard Worker if (Get32(p + kCmdSize + 4) == params[0])
4679*f6dc9357SAndroid Build Coastguard Worker {
4680*f6dc9357SAndroid Build Coastguard Worker CItem &item = Items.AddNew();
4681*f6dc9357SAndroid Build Coastguard Worker item.IsEmptyFile = true;
4682*f6dc9357SAndroid Build Coastguard Worker SetItemName(item, params[3]);
4683*f6dc9357SAndroid Build Coastguard Worker }
4684*f6dc9357SAndroid Build Coastguard Worker }
4685*f6dc9357SAndroid Build Coastguard Worker
4686*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
4687*f6dc9357SAndroid Build Coastguard Worker
4688*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4689*f6dc9357SAndroid Build Coastguard Worker AddParam(params[3]);
4690*f6dc9357SAndroid Build Coastguard Worker if (acc == 0 && creat == 0)
4691*f6dc9357SAndroid Build Coastguard Worker break;
4692*f6dc9357SAndroid Build Coastguard Worker char cc = 0;
4693*f6dc9357SAndroid Build Coastguard Worker if (creat == Z7_NSIS_WIN_OPEN_EXISTING && acc == Z7_NSIS_WIN_GENERIC_READ)
4694*f6dc9357SAndroid Build Coastguard Worker cc = 'r';
4695*f6dc9357SAndroid Build Coastguard Worker else if (creat == Z7_NSIS_WIN_CREATE_ALWAYS && acc == Z7_NSIS_WIN_GENERIC_WRITE)
4696*f6dc9357SAndroid Build Coastguard Worker cc = 'w';
4697*f6dc9357SAndroid Build Coastguard Worker else if (creat == Z7_NSIS_WIN_OPEN_ALWAYS && (acc == (Z7_NSIS_WIN_GENERIC_WRITE | Z7_NSIS_WIN_GENERIC_READ)))
4698*f6dc9357SAndroid Build Coastguard Worker cc = 'a';
4699*f6dc9357SAndroid Build Coastguard Worker // cc = 0;
4700*f6dc9357SAndroid Build Coastguard Worker if (cc != 0)
4701*f6dc9357SAndroid Build Coastguard Worker {
4702*f6dc9357SAndroid Build Coastguard Worker Space();
4703*f6dc9357SAndroid Build Coastguard Worker s += cc;
4704*f6dc9357SAndroid Build Coastguard Worker break;
4705*f6dc9357SAndroid Build Coastguard Worker }
4706*f6dc9357SAndroid Build Coastguard Worker
4707*f6dc9357SAndroid Build Coastguard Worker if (acc & Z7_NSIS_WIN_GENERIC_READ) s += " GENERIC_READ";
4708*f6dc9357SAndroid Build Coastguard Worker if (acc & Z7_NSIS_WIN_GENERIC_WRITE) s += " GENERIC_WRITE";
4709*f6dc9357SAndroid Build Coastguard Worker if (acc & Z7_NSIS_WIN_GENERIC_EXECUTE) s += " GENERIC_EXECUTE";
4710*f6dc9357SAndroid Build Coastguard Worker if (acc & Z7_NSIS_WIN_GENERIC_ALL) s += " GENERIC_ALL";
4711*f6dc9357SAndroid Build Coastguard Worker
4712*f6dc9357SAndroid Build Coastguard Worker const char *s2 = NULL;
4713*f6dc9357SAndroid Build Coastguard Worker switch (creat)
4714*f6dc9357SAndroid Build Coastguard Worker {
4715*f6dc9357SAndroid Build Coastguard Worker case Z7_NSIS_WIN_CREATE_NEW: s2 = "CREATE_NEW"; break;
4716*f6dc9357SAndroid Build Coastguard Worker case Z7_NSIS_WIN_CREATE_ALWAYS: s2 = "CREATE_ALWAYS"; break;
4717*f6dc9357SAndroid Build Coastguard Worker case Z7_NSIS_WIN_OPEN_EXISTING: s2 = "OPEN_EXISTING"; break;
4718*f6dc9357SAndroid Build Coastguard Worker case Z7_NSIS_WIN_OPEN_ALWAYS: s2 = "OPEN_ALWAYS"; break;
4719*f6dc9357SAndroid Build Coastguard Worker case Z7_NSIS_WIN_TRUNCATE_EXISTING: s2 = "TRUNCATE_EXISTING"; break;
4720*f6dc9357SAndroid Build Coastguard Worker }
4721*f6dc9357SAndroid Build Coastguard Worker Space();
4722*f6dc9357SAndroid Build Coastguard Worker if (s2)
4723*f6dc9357SAndroid Build Coastguard Worker s += s2;
4724*f6dc9357SAndroid Build Coastguard Worker else
4725*f6dc9357SAndroid Build Coastguard Worker Add_UInt(creat);
4726*f6dc9357SAndroid Build Coastguard Worker #endif
4727*f6dc9357SAndroid Build Coastguard Worker
4728*f6dc9357SAndroid Build Coastguard Worker break;
4729*f6dc9357SAndroid Build Coastguard Worker }
4730*f6dc9357SAndroid Build Coastguard Worker
4731*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
4732*f6dc9357SAndroid Build Coastguard Worker
4733*f6dc9357SAndroid Build Coastguard Worker case EW_FPUTS:
4734*f6dc9357SAndroid Build Coastguard Worker case EW_FPUTWS:
4735*f6dc9357SAndroid Build Coastguard Worker {
4736*f6dc9357SAndroid Build Coastguard Worker if (commandId == EW_FPUTWS)
4737*f6dc9357SAndroid Build Coastguard Worker s += (params[2] == 0) ? "UTF16LE" : "Word";
4738*f6dc9357SAndroid Build Coastguard Worker else if (params[2] != 0)
4739*f6dc9357SAndroid Build Coastguard Worker s += "Byte";
4740*f6dc9357SAndroid Build Coastguard Worker if (params[2] == 0 && params[3])
4741*f6dc9357SAndroid Build Coastguard Worker s += " /BOM"; // v3.0b3+
4742*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4743*f6dc9357SAndroid Build Coastguard Worker AddParam(params[1]);
4744*f6dc9357SAndroid Build Coastguard Worker break;
4745*f6dc9357SAndroid Build Coastguard Worker }
4746*f6dc9357SAndroid Build Coastguard Worker
4747*f6dc9357SAndroid Build Coastguard Worker case EW_FGETS:
4748*f6dc9357SAndroid Build Coastguard Worker case EW_FGETWS:
4749*f6dc9357SAndroid Build Coastguard Worker {
4750*f6dc9357SAndroid Build Coastguard Worker if (commandId == EW_FPUTWS)
4751*f6dc9357SAndroid Build Coastguard Worker s += (params[3] == 0) ? "UTF16LE" : "Word";
4752*f6dc9357SAndroid Build Coastguard Worker if (params[3] != 0)
4753*f6dc9357SAndroid Build Coastguard Worker s += "Byte";
4754*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4755*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[1]);
4756*f6dc9357SAndroid Build Coastguard Worker AString maxLenStr;
4757*f6dc9357SAndroid Build Coastguard Worker ReadString2(maxLenStr, params[2]);
4758*f6dc9357SAndroid Build Coastguard Worker UInt32 maxLen;
4759*f6dc9357SAndroid Build Coastguard Worker if (StringToUInt32(maxLenStr, maxLen))
4760*f6dc9357SAndroid Build Coastguard Worker {
4761*f6dc9357SAndroid Build Coastguard Worker if (maxLen == 1 && params[3] != 0)
4762*f6dc9357SAndroid Build Coastguard Worker break;
4763*f6dc9357SAndroid Build Coastguard Worker if (maxLen == 1023 && params[3] == 0) // NSIS_MAX_STRLEN - 1; can be other value!!
4764*f6dc9357SAndroid Build Coastguard Worker break;
4765*f6dc9357SAndroid Build Coastguard Worker }
4766*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(maxLenStr);
4767*f6dc9357SAndroid Build Coastguard Worker break;
4768*f6dc9357SAndroid Build Coastguard Worker }
4769*f6dc9357SAndroid Build Coastguard Worker
4770*f6dc9357SAndroid Build Coastguard Worker case EW_FSEEK:
4771*f6dc9357SAndroid Build Coastguard Worker {
4772*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4773*f6dc9357SAndroid Build Coastguard Worker AddParam(params[2]);
4774*f6dc9357SAndroid Build Coastguard Worker if (params[3] == 1) s += " CUR"; // FILE_CURRENT
4775*f6dc9357SAndroid Build Coastguard Worker if (params[3] == 2) s += " END"; // FILE_END
4776*f6dc9357SAndroid Build Coastguard Worker if ((Int32)params[1] >= 0)
4777*f6dc9357SAndroid Build Coastguard Worker {
4778*f6dc9357SAndroid Build Coastguard Worker if (params[3] == 0) s += " SET"; // FILE_BEGIN
4779*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[1]);
4780*f6dc9357SAndroid Build Coastguard Worker }
4781*f6dc9357SAndroid Build Coastguard Worker break;
4782*f6dc9357SAndroid Build Coastguard Worker }
4783*f6dc9357SAndroid Build Coastguard Worker
4784*f6dc9357SAndroid Build Coastguard Worker case EW_FINDNEXT:
4785*f6dc9357SAndroid Build Coastguard Worker {
4786*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[1]);
4787*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4788*f6dc9357SAndroid Build Coastguard Worker break;
4789*f6dc9357SAndroid Build Coastguard Worker }
4790*f6dc9357SAndroid Build Coastguard Worker
4791*f6dc9357SAndroid Build Coastguard Worker case EW_FINDFIRST:
4792*f6dc9357SAndroid Build Coastguard Worker {
4793*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[1]);
4794*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4795*f6dc9357SAndroid Build Coastguard Worker AddParam(params[2]);
4796*f6dc9357SAndroid Build Coastguard Worker break;
4797*f6dc9357SAndroid Build Coastguard Worker }
4798*f6dc9357SAndroid Build Coastguard Worker
4799*f6dc9357SAndroid Build Coastguard Worker case EW_LOG:
4800*f6dc9357SAndroid Build Coastguard Worker {
4801*f6dc9357SAndroid Build Coastguard Worker if (params[0] != 0)
4802*f6dc9357SAndroid Build Coastguard Worker {
4803*f6dc9357SAndroid Build Coastguard Worker s += "Set ";
4804*f6dc9357SAndroid Build Coastguard Worker s += (params[1] == 0) ? "off" : "on";
4805*f6dc9357SAndroid Build Coastguard Worker }
4806*f6dc9357SAndroid Build Coastguard Worker else
4807*f6dc9357SAndroid Build Coastguard Worker {
4808*f6dc9357SAndroid Build Coastguard Worker s += "Text";
4809*f6dc9357SAndroid Build Coastguard Worker AddParam(params[1]);
4810*f6dc9357SAndroid Build Coastguard Worker }
4811*f6dc9357SAndroid Build Coastguard Worker break;
4812*f6dc9357SAndroid Build Coastguard Worker }
4813*f6dc9357SAndroid Build Coastguard Worker
4814*f6dc9357SAndroid Build Coastguard Worker case EW_SECTIONSET:
4815*f6dc9357SAndroid Build Coastguard Worker {
4816*f6dc9357SAndroid Build Coastguard Worker if ((Int32)params[2] >= 0)
4817*f6dc9357SAndroid Build Coastguard Worker {
4818*f6dc9357SAndroid Build Coastguard Worker s += "Get";
4819*f6dc9357SAndroid Build Coastguard Worker Add_SectOp(params[2]);
4820*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
4821*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[1]);
4822*f6dc9357SAndroid Build Coastguard Worker }
4823*f6dc9357SAndroid Build Coastguard Worker else
4824*f6dc9357SAndroid Build Coastguard Worker {
4825*f6dc9357SAndroid Build Coastguard Worker s += "Set";
4826*f6dc9357SAndroid Build Coastguard Worker const UInt32 t = (UInt32)(-(Int32)params[2] - 1);
4827*f6dc9357SAndroid Build Coastguard Worker Add_SectOp(t);
4828*f6dc9357SAndroid Build Coastguard Worker AddParam(params[0]);
4829*f6dc9357SAndroid Build Coastguard Worker AddParam(params[t == 0 ? 4 : 1]);
4830*f6dc9357SAndroid Build Coastguard Worker
4831*f6dc9357SAndroid Build Coastguard Worker // params[3] != 0 means call SectionFlagsChanged in installer
4832*f6dc9357SAndroid Build Coastguard Worker // used by SECTIONSETFLAGS command
4833*f6dc9357SAndroid Build Coastguard Worker }
4834*f6dc9357SAndroid Build Coastguard Worker break;
4835*f6dc9357SAndroid Build Coastguard Worker }
4836*f6dc9357SAndroid Build Coastguard Worker
4837*f6dc9357SAndroid Build Coastguard Worker case EW_INSTTYPESET:
4838*f6dc9357SAndroid Build Coastguard Worker {
4839*f6dc9357SAndroid Build Coastguard Worker unsigned numQwParams = 0;
4840*f6dc9357SAndroid Build Coastguard Worker const char *s2;
4841*f6dc9357SAndroid Build Coastguard Worker if (params[3] == 0)
4842*f6dc9357SAndroid Build Coastguard Worker {
4843*f6dc9357SAndroid Build Coastguard Worker if (params[2] == 0)
4844*f6dc9357SAndroid Build Coastguard Worker {
4845*f6dc9357SAndroid Build Coastguard Worker s2 = "InstTypeGetText";
4846*f6dc9357SAndroid Build Coastguard Worker numQwParams = 1;
4847*f6dc9357SAndroid Build Coastguard Worker }
4848*f6dc9357SAndroid Build Coastguard Worker else
4849*f6dc9357SAndroid Build Coastguard Worker {
4850*f6dc9357SAndroid Build Coastguard Worker s2 = "InstTypeSetText";
4851*f6dc9357SAndroid Build Coastguard Worker numQwParams = 2;
4852*f6dc9357SAndroid Build Coastguard Worker }
4853*f6dc9357SAndroid Build Coastguard Worker }
4854*f6dc9357SAndroid Build Coastguard Worker else
4855*f6dc9357SAndroid Build Coastguard Worker {
4856*f6dc9357SAndroid Build Coastguard Worker if (params[2] == 0)
4857*f6dc9357SAndroid Build Coastguard Worker s2 = "GetCurInstType";
4858*f6dc9357SAndroid Build Coastguard Worker else
4859*f6dc9357SAndroid Build Coastguard Worker {
4860*f6dc9357SAndroid Build Coastguard Worker s2 = "SetCurInstType";
4861*f6dc9357SAndroid Build Coastguard Worker numQwParams = 1;
4862*f6dc9357SAndroid Build Coastguard Worker }
4863*f6dc9357SAndroid Build Coastguard Worker }
4864*f6dc9357SAndroid Build Coastguard Worker s += s2;
4865*f6dc9357SAndroid Build Coastguard Worker AddParams(params, numQwParams);
4866*f6dc9357SAndroid Build Coastguard Worker if (params[2] == 0)
4867*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[1]);
4868*f6dc9357SAndroid Build Coastguard Worker break;
4869*f6dc9357SAndroid Build Coastguard Worker }
4870*f6dc9357SAndroid Build Coastguard Worker
4871*f6dc9357SAndroid Build Coastguard Worker case EW_GETOSINFO:
4872*f6dc9357SAndroid Build Coastguard Worker {
4873*f6dc9357SAndroid Build Coastguard Worker if (IsNsis3_OrHigher())
4874*f6dc9357SAndroid Build Coastguard Worker {
4875*f6dc9357SAndroid Build Coastguard Worker // v3.06+
4876*f6dc9357SAndroid Build Coastguard Worker if (params[3] == 0) // GETOSINFO_KNOWNFOLDER
4877*f6dc9357SAndroid Build Coastguard Worker {
4878*f6dc9357SAndroid Build Coastguard Worker s += "GetKnownFolderPath";
4879*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[1]);
4880*f6dc9357SAndroid Build Coastguard Worker AddParam(params[2]);
4881*f6dc9357SAndroid Build Coastguard Worker break;
4882*f6dc9357SAndroid Build Coastguard Worker }
4883*f6dc9357SAndroid Build Coastguard Worker else if (params[3] == 1) // GETOSINFO_READMEMORY
4884*f6dc9357SAndroid Build Coastguard Worker {
4885*f6dc9357SAndroid Build Coastguard Worker s += "ReadMemory";
4886*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[1]);
4887*f6dc9357SAndroid Build Coastguard Worker AddParam(params[2]);
4888*f6dc9357SAndroid Build Coastguard Worker AddParam(params[4]);
4889*f6dc9357SAndroid Build Coastguard Worker // if (params[2] == "0") AddCommentAndString("GetWinVer");
4890*f6dc9357SAndroid Build Coastguard Worker }
4891*f6dc9357SAndroid Build Coastguard Worker else
4892*f6dc9357SAndroid Build Coastguard Worker s += "GetOsInfo";
4893*f6dc9357SAndroid Build Coastguard Worker break;
4894*f6dc9357SAndroid Build Coastguard Worker }
4895*f6dc9357SAndroid Build Coastguard Worker s += "GetLabelAddr"; // before v3.06+
4896*f6dc9357SAndroid Build Coastguard Worker break;
4897*f6dc9357SAndroid Build Coastguard Worker }
4898*f6dc9357SAndroid Build Coastguard Worker
4899*f6dc9357SAndroid Build Coastguard Worker case EW_LOCKWINDOW:
4900*f6dc9357SAndroid Build Coastguard Worker {
4901*f6dc9357SAndroid Build Coastguard Worker s += (params[0] == 0) ? " on" : " off";
4902*f6dc9357SAndroid Build Coastguard Worker break;
4903*f6dc9357SAndroid Build Coastguard Worker }
4904*f6dc9357SAndroid Build Coastguard Worker
4905*f6dc9357SAndroid Build Coastguard Worker case EW_FINDPROC:
4906*f6dc9357SAndroid Build Coastguard Worker {
4907*f6dc9357SAndroid Build Coastguard Worker AddParam_Var(params[0]);
4908*f6dc9357SAndroid Build Coastguard Worker AddParam(params[1]);
4909*f6dc9357SAndroid Build Coastguard Worker break;
4910*f6dc9357SAndroid Build Coastguard Worker }
4911*f6dc9357SAndroid Build Coastguard Worker
4912*f6dc9357SAndroid Build Coastguard Worker default:
4913*f6dc9357SAndroid Build Coastguard Worker {
4914*f6dc9357SAndroid Build Coastguard Worker numSkipParams = 0;
4915*f6dc9357SAndroid Build Coastguard Worker }
4916*f6dc9357SAndroid Build Coastguard Worker #endif
4917*f6dc9357SAndroid Build Coastguard Worker }
4918*f6dc9357SAndroid Build Coastguard Worker
4919*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
4920*f6dc9357SAndroid Build Coastguard Worker
4921*f6dc9357SAndroid Build Coastguard Worker unsigned numParams = kNumCommandParams;
4922*f6dc9357SAndroid Build Coastguard Worker
4923*f6dc9357SAndroid Build Coastguard Worker for (; numParams > 0; numParams--)
4924*f6dc9357SAndroid Build Coastguard Worker if (params[numParams - 1] != 0)
4925*f6dc9357SAndroid Build Coastguard Worker break;
4926*f6dc9357SAndroid Build Coastguard Worker
4927*f6dc9357SAndroid Build Coastguard Worker if (numParams > numSkipParams)
4928*f6dc9357SAndroid Build Coastguard Worker {
4929*f6dc9357SAndroid Build Coastguard Worker s += " ; !!!! Unknown Params: ";
4930*f6dc9357SAndroid Build Coastguard Worker unsigned i;
4931*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < numParams; i++)
4932*f6dc9357SAndroid Build Coastguard Worker AddParam(params[i]);
4933*f6dc9357SAndroid Build Coastguard Worker
4934*f6dc9357SAndroid Build Coastguard Worker s += " ;";
4935*f6dc9357SAndroid Build Coastguard Worker
4936*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < numParams; i++)
4937*f6dc9357SAndroid Build Coastguard Worker {
4938*f6dc9357SAndroid Build Coastguard Worker Space();
4939*f6dc9357SAndroid Build Coastguard Worker UInt32 v = params[i];
4940*f6dc9357SAndroid Build Coastguard Worker if (v > 0xFFF00000)
4941*f6dc9357SAndroid Build Coastguard Worker Add_SignedInt(s, (Int32)v);
4942*f6dc9357SAndroid Build Coastguard Worker else
4943*f6dc9357SAndroid Build Coastguard Worker Add_UInt(v);
4944*f6dc9357SAndroid Build Coastguard Worker }
4945*f6dc9357SAndroid Build Coastguard Worker }
4946*f6dc9357SAndroid Build Coastguard Worker
4947*f6dc9357SAndroid Build Coastguard Worker NewLine();
4948*f6dc9357SAndroid Build Coastguard Worker
4949*f6dc9357SAndroid Build Coastguard Worker #endif
4950*f6dc9357SAndroid Build Coastguard Worker }
4951*f6dc9357SAndroid Build Coastguard Worker
4952*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
4953*f6dc9357SAndroid Build Coastguard Worker
4954*f6dc9357SAndroid Build Coastguard Worker if (sectionIsOpen)
4955*f6dc9357SAndroid Build Coastguard Worker {
4956*f6dc9357SAndroid Build Coastguard Worker if (curSectionIndex < bhSections.Num)
4957*f6dc9357SAndroid Build Coastguard Worker {
4958*f6dc9357SAndroid Build Coastguard Worker const CSection § = Sections[curSectionIndex];
4959*f6dc9357SAndroid Build Coastguard Worker if (sect.StartCmdIndex + sect.NumCommands + 1 == kkk)
4960*f6dc9357SAndroid Build Coastguard Worker {
4961*f6dc9357SAndroid Build Coastguard Worker PrintSectionEnd();
4962*f6dc9357SAndroid Build Coastguard Worker sectionIsOpen = false;
4963*f6dc9357SAndroid Build Coastguard Worker // lastSectionEndCmd = kkk;
4964*f6dc9357SAndroid Build Coastguard Worker curSectionIndex++;
4965*f6dc9357SAndroid Build Coastguard Worker }
4966*f6dc9357SAndroid Build Coastguard Worker }
4967*f6dc9357SAndroid Build Coastguard Worker }
4968*f6dc9357SAndroid Build Coastguard Worker
4969*f6dc9357SAndroid Build Coastguard Worker while (curSectionIndex < bhSections.Num)
4970*f6dc9357SAndroid Build Coastguard Worker {
4971*f6dc9357SAndroid Build Coastguard Worker const CSection § = Sections[curSectionIndex];
4972*f6dc9357SAndroid Build Coastguard Worker if (sectionIsOpen)
4973*f6dc9357SAndroid Build Coastguard Worker {
4974*f6dc9357SAndroid Build Coastguard Worker if (sect.StartCmdIndex + sect.NumCommands != kkk)
4975*f6dc9357SAndroid Build Coastguard Worker AddErrorLF("SECTION ERROR");
4976*f6dc9357SAndroid Build Coastguard Worker PrintSectionEnd();
4977*f6dc9357SAndroid Build Coastguard Worker sectionIsOpen = false;
4978*f6dc9357SAndroid Build Coastguard Worker curSectionIndex++;
4979*f6dc9357SAndroid Build Coastguard Worker }
4980*f6dc9357SAndroid Build Coastguard Worker else
4981*f6dc9357SAndroid Build Coastguard Worker {
4982*f6dc9357SAndroid Build Coastguard Worker if (PrintSectionBegin(sect, curSectionIndex))
4983*f6dc9357SAndroid Build Coastguard Worker curSectionIndex++;
4984*f6dc9357SAndroid Build Coastguard Worker else
4985*f6dc9357SAndroid Build Coastguard Worker sectionIsOpen = true;
4986*f6dc9357SAndroid Build Coastguard Worker }
4987*f6dc9357SAndroid Build Coastguard Worker }
4988*f6dc9357SAndroid Build Coastguard Worker
4989*f6dc9357SAndroid Build Coastguard Worker #endif
4990*f6dc9357SAndroid Build Coastguard Worker
4991*f6dc9357SAndroid Build Coastguard Worker return S_OK;
4992*f6dc9357SAndroid Build Coastguard Worker }
4993*f6dc9357SAndroid Build Coastguard Worker
CompareItems(void * const * p1,void * const * p2,void * param)4994*f6dc9357SAndroid Build Coastguard Worker static int CompareItems(void *const *p1, void *const *p2, void *param)
4995*f6dc9357SAndroid Build Coastguard Worker {
4996*f6dc9357SAndroid Build Coastguard Worker const CItem &i1 = **(const CItem *const *)p1;
4997*f6dc9357SAndroid Build Coastguard Worker const CItem &i2 = **(const CItem *const *)p2;
4998*f6dc9357SAndroid Build Coastguard Worker RINOZ(MyCompare(i1.Pos, i2.Pos))
4999*f6dc9357SAndroid Build Coastguard Worker
5000*f6dc9357SAndroid Build Coastguard Worker /* In another code we check CItem::Pos after each solid item.
5001*f6dc9357SAndroid Build Coastguard Worker So here we place empty files before all non empty files */
5002*f6dc9357SAndroid Build Coastguard Worker if (i1.IsEmptyFile)
5003*f6dc9357SAndroid Build Coastguard Worker {
5004*f6dc9357SAndroid Build Coastguard Worker if (!i2.IsEmptyFile)
5005*f6dc9357SAndroid Build Coastguard Worker return -1;
5006*f6dc9357SAndroid Build Coastguard Worker }
5007*f6dc9357SAndroid Build Coastguard Worker else if (i2.IsEmptyFile)
5008*f6dc9357SAndroid Build Coastguard Worker return 1;
5009*f6dc9357SAndroid Build Coastguard Worker
5010*f6dc9357SAndroid Build Coastguard Worker const CInArchive *inArchive = (const CInArchive *)param;
5011*f6dc9357SAndroid Build Coastguard Worker if (inArchive->IsUnicode)
5012*f6dc9357SAndroid Build Coastguard Worker {
5013*f6dc9357SAndroid Build Coastguard Worker if (i1.Prefix != i2.Prefix)
5014*f6dc9357SAndroid Build Coastguard Worker {
5015*f6dc9357SAndroid Build Coastguard Worker if (i1.Prefix < 0) return -1;
5016*f6dc9357SAndroid Build Coastguard Worker if (i2.Prefix < 0) return 1;
5017*f6dc9357SAndroid Build Coastguard Worker RINOZ(
5018*f6dc9357SAndroid Build Coastguard Worker inArchive->UPrefixes[i1.Prefix].Compare(
5019*f6dc9357SAndroid Build Coastguard Worker inArchive->UPrefixes[i2.Prefix]))
5020*f6dc9357SAndroid Build Coastguard Worker }
5021*f6dc9357SAndroid Build Coastguard Worker RINOZ(i1.NameU.Compare(i2.NameU))
5022*f6dc9357SAndroid Build Coastguard Worker }
5023*f6dc9357SAndroid Build Coastguard Worker else
5024*f6dc9357SAndroid Build Coastguard Worker {
5025*f6dc9357SAndroid Build Coastguard Worker if (i1.Prefix != i2.Prefix)
5026*f6dc9357SAndroid Build Coastguard Worker {
5027*f6dc9357SAndroid Build Coastguard Worker if (i1.Prefix < 0) return -1;
5028*f6dc9357SAndroid Build Coastguard Worker if (i2.Prefix < 0) return 1;
5029*f6dc9357SAndroid Build Coastguard Worker RINOZ(strcmp(
5030*f6dc9357SAndroid Build Coastguard Worker inArchive->APrefixes[i1.Prefix],
5031*f6dc9357SAndroid Build Coastguard Worker inArchive->APrefixes[i2.Prefix]))
5032*f6dc9357SAndroid Build Coastguard Worker }
5033*f6dc9357SAndroid Build Coastguard Worker RINOZ(strcmp(i1.NameA, i2.NameA))
5034*f6dc9357SAndroid Build Coastguard Worker }
5035*f6dc9357SAndroid Build Coastguard Worker return 0;
5036*f6dc9357SAndroid Build Coastguard Worker }
5037*f6dc9357SAndroid Build Coastguard Worker
SortItems()5038*f6dc9357SAndroid Build Coastguard Worker HRESULT CInArchive::SortItems()
5039*f6dc9357SAndroid Build Coastguard Worker {
5040*f6dc9357SAndroid Build Coastguard Worker {
5041*f6dc9357SAndroid Build Coastguard Worker Items.Sort(CompareItems, (void *)this);
5042*f6dc9357SAndroid Build Coastguard Worker unsigned i;
5043*f6dc9357SAndroid Build Coastguard Worker
5044*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i + 1 < Items.Size(); i++)
5045*f6dc9357SAndroid Build Coastguard Worker {
5046*f6dc9357SAndroid Build Coastguard Worker const CItem &i1 = Items[i];
5047*f6dc9357SAndroid Build Coastguard Worker if (i1.IsEmptyFile)
5048*f6dc9357SAndroid Build Coastguard Worker continue;
5049*f6dc9357SAndroid Build Coastguard Worker const CItem &i2 = Items[i + 1];
5050*f6dc9357SAndroid Build Coastguard Worker if (i1.Pos != i2.Pos)
5051*f6dc9357SAndroid Build Coastguard Worker continue;
5052*f6dc9357SAndroid Build Coastguard Worker
5053*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
5054*f6dc9357SAndroid Build Coastguard Worker {
5055*f6dc9357SAndroid Build Coastguard Worker if (i1.NameU != i2.NameU) continue;
5056*f6dc9357SAndroid Build Coastguard Worker if (i1.Prefix != i2.Prefix)
5057*f6dc9357SAndroid Build Coastguard Worker {
5058*f6dc9357SAndroid Build Coastguard Worker if (i1.Prefix < 0 || i2.Prefix < 0) continue;
5059*f6dc9357SAndroid Build Coastguard Worker if (UPrefixes[i1.Prefix] != UPrefixes[i2.Prefix]) continue;
5060*f6dc9357SAndroid Build Coastguard Worker }
5061*f6dc9357SAndroid Build Coastguard Worker }
5062*f6dc9357SAndroid Build Coastguard Worker else
5063*f6dc9357SAndroid Build Coastguard Worker {
5064*f6dc9357SAndroid Build Coastguard Worker if (i1.NameA != i2.NameA) continue;
5065*f6dc9357SAndroid Build Coastguard Worker if (i1.Prefix != i2.Prefix)
5066*f6dc9357SAndroid Build Coastguard Worker {
5067*f6dc9357SAndroid Build Coastguard Worker if (i1.Prefix < 0 || i2.Prefix < 0) continue;
5068*f6dc9357SAndroid Build Coastguard Worker if (APrefixes[i1.Prefix] != APrefixes[i2.Prefix]) continue;
5069*f6dc9357SAndroid Build Coastguard Worker }
5070*f6dc9357SAndroid Build Coastguard Worker }
5071*f6dc9357SAndroid Build Coastguard Worker Items.Delete(i + 1);
5072*f6dc9357SAndroid Build Coastguard Worker i--;
5073*f6dc9357SAndroid Build Coastguard Worker }
5074*f6dc9357SAndroid Build Coastguard Worker
5075*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < Items.Size(); i++)
5076*f6dc9357SAndroid Build Coastguard Worker {
5077*f6dc9357SAndroid Build Coastguard Worker CItem &item = Items[i];
5078*f6dc9357SAndroid Build Coastguard Worker if (item.IsEmptyFile)
5079*f6dc9357SAndroid Build Coastguard Worker continue;
5080*f6dc9357SAndroid Build Coastguard Worker const UInt32 curPos = item.Pos + 4;
5081*f6dc9357SAndroid Build Coastguard Worker for (unsigned nextIndex = i + 1; nextIndex < Items.Size(); nextIndex++)
5082*f6dc9357SAndroid Build Coastguard Worker {
5083*f6dc9357SAndroid Build Coastguard Worker const CItem &nextItem = Items[nextIndex];
5084*f6dc9357SAndroid Build Coastguard Worker // if (nextItem.IsEmptyFile) continue;
5085*f6dc9357SAndroid Build Coastguard Worker const UInt32 nextPos = nextItem.Pos;
5086*f6dc9357SAndroid Build Coastguard Worker if (curPos <= nextPos)
5087*f6dc9357SAndroid Build Coastguard Worker {
5088*f6dc9357SAndroid Build Coastguard Worker item.EstimatedSize_Defined = true;
5089*f6dc9357SAndroid Build Coastguard Worker item.EstimatedSize = nextPos - curPos;
5090*f6dc9357SAndroid Build Coastguard Worker break;
5091*f6dc9357SAndroid Build Coastguard Worker }
5092*f6dc9357SAndroid Build Coastguard Worker }
5093*f6dc9357SAndroid Build Coastguard Worker }
5094*f6dc9357SAndroid Build Coastguard Worker
5095*f6dc9357SAndroid Build Coastguard Worker if (!IsSolid)
5096*f6dc9357SAndroid Build Coastguard Worker {
5097*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < Items.Size(); i++)
5098*f6dc9357SAndroid Build Coastguard Worker {
5099*f6dc9357SAndroid Build Coastguard Worker CItem &item = Items[i];
5100*f6dc9357SAndroid Build Coastguard Worker if (item.IsEmptyFile)
5101*f6dc9357SAndroid Build Coastguard Worker continue;
5102*f6dc9357SAndroid Build Coastguard Worker RINOK(SeekToNonSolidItem(i))
5103*f6dc9357SAndroid Build Coastguard Worker const UInt32 kSigSize = 4 + 1 + 1 + 4; // size,[flag],prop,dict
5104*f6dc9357SAndroid Build Coastguard Worker BYTE sig[kSigSize];
5105*f6dc9357SAndroid Build Coastguard Worker size_t processedSize = kSigSize;
5106*f6dc9357SAndroid Build Coastguard Worker RINOK(ReadStream(_stream, sig, &processedSize))
5107*f6dc9357SAndroid Build Coastguard Worker if (processedSize < 4)
5108*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5109*f6dc9357SAndroid Build Coastguard Worker UInt32 size = Get32(sig);
5110*f6dc9357SAndroid Build Coastguard Worker if ((size & kMask_IsCompressed) != 0)
5111*f6dc9357SAndroid Build Coastguard Worker {
5112*f6dc9357SAndroid Build Coastguard Worker item.IsCompressed = true;
5113*f6dc9357SAndroid Build Coastguard Worker size &= ~kMask_IsCompressed;
5114*f6dc9357SAndroid Build Coastguard Worker if (Method == NMethodType::kLZMA)
5115*f6dc9357SAndroid Build Coastguard Worker {
5116*f6dc9357SAndroid Build Coastguard Worker if (processedSize < 9)
5117*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5118*f6dc9357SAndroid Build Coastguard Worker /*
5119*f6dc9357SAndroid Build Coastguard Worker if (FilterFlag)
5120*f6dc9357SAndroid Build Coastguard Worker item.UseFilter = (sig[4] != 0);
5121*f6dc9357SAndroid Build Coastguard Worker */
5122*f6dc9357SAndroid Build Coastguard Worker item.DictionarySize = Get32(sig + 4 + 1 + (FilterFlag ? 1 : 0));
5123*f6dc9357SAndroid Build Coastguard Worker }
5124*f6dc9357SAndroid Build Coastguard Worker }
5125*f6dc9357SAndroid Build Coastguard Worker else
5126*f6dc9357SAndroid Build Coastguard Worker {
5127*f6dc9357SAndroid Build Coastguard Worker item.IsCompressed = false;
5128*f6dc9357SAndroid Build Coastguard Worker item.Size = size;
5129*f6dc9357SAndroid Build Coastguard Worker item.Size_Defined = true;
5130*f6dc9357SAndroid Build Coastguard Worker }
5131*f6dc9357SAndroid Build Coastguard Worker item.CompressedSize = size;
5132*f6dc9357SAndroid Build Coastguard Worker item.CompressedSize_Defined = true;
5133*f6dc9357SAndroid Build Coastguard Worker }
5134*f6dc9357SAndroid Build Coastguard Worker }
5135*f6dc9357SAndroid Build Coastguard Worker }
5136*f6dc9357SAndroid Build Coastguard Worker return S_OK;
5137*f6dc9357SAndroid Build Coastguard Worker }
5138*f6dc9357SAndroid Build Coastguard Worker
5139*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
5140*f6dc9357SAndroid Build Coastguard Worker // Flags for common_header.flags
5141*f6dc9357SAndroid Build Coastguard Worker // #define CH_FLAGS_DETAILS_SHOWDETAILS 1
5142*f6dc9357SAndroid Build Coastguard Worker // #define CH_FLAGS_DETAILS_NEVERSHOW 2
5143*f6dc9357SAndroid Build Coastguard Worker #define CH_FLAGS_PROGRESS_COLORED 4
5144*f6dc9357SAndroid Build Coastguard Worker #define CH_FLAGS_SILENT 8
5145*f6dc9357SAndroid Build Coastguard Worker #define CH_FLAGS_SILENT_LOG 16
5146*f6dc9357SAndroid Build Coastguard Worker #define CH_FLAGS_AUTO_CLOSE 32
5147*f6dc9357SAndroid Build Coastguard Worker // #define CH_FLAGS_DIR_NO_SHOW 64 // unused now
5148*f6dc9357SAndroid Build Coastguard Worker #define CH_FLAGS_NO_ROOT_DIR 128
5149*f6dc9357SAndroid Build Coastguard Worker #define CH_FLAGS_COMP_ONLY_ON_CUSTOM 256
5150*f6dc9357SAndroid Build Coastguard Worker #define CH_FLAGS_NO_CUSTOM 512
5151*f6dc9357SAndroid Build Coastguard Worker
5152*f6dc9357SAndroid Build Coastguard Worker static const char * const k_PostStrings[] =
5153*f6dc9357SAndroid Build Coastguard Worker {
5154*f6dc9357SAndroid Build Coastguard Worker "install_directory_auto_append"
5155*f6dc9357SAndroid Build Coastguard Worker , "uninstchild" // NSIS 2.25+, used by uninstaller:
5156*f6dc9357SAndroid Build Coastguard Worker , "uninstcmd" // NSIS 2.25+, used by uninstaller:
5157*f6dc9357SAndroid Build Coastguard Worker , "wininit" // NSIS 2.25+, used by move file on reboot
5158*f6dc9357SAndroid Build Coastguard Worker };
5159*f6dc9357SAndroid Build Coastguard Worker #endif
5160*f6dc9357SAndroid Build Coastguard Worker
5161*f6dc9357SAndroid Build Coastguard Worker
Parse(const Byte * p,unsigned bhoSize)5162*f6dc9357SAndroid Build Coastguard Worker void CBlockHeader::Parse(const Byte *p, unsigned bhoSize)
5163*f6dc9357SAndroid Build Coastguard Worker {
5164*f6dc9357SAndroid Build Coastguard Worker if (bhoSize == 12)
5165*f6dc9357SAndroid Build Coastguard Worker {
5166*f6dc9357SAndroid Build Coastguard Worker // UInt64 a = GetUi64(p);
5167*f6dc9357SAndroid Build Coastguard Worker if (GetUi32(p + 4) != 0)
5168*f6dc9357SAndroid Build Coastguard Worker throw 1;
5169*f6dc9357SAndroid Build Coastguard Worker }
5170*f6dc9357SAndroid Build Coastguard Worker Offset = GetUi32(p);
5171*f6dc9357SAndroid Build Coastguard Worker Num = GetUi32(p + bhoSize - 4);
5172*f6dc9357SAndroid Build Coastguard Worker }
5173*f6dc9357SAndroid Build Coastguard Worker
5174*f6dc9357SAndroid Build Coastguard Worker #define PARSE_BH(k, bh) bh.Parse (p1 + 4 + bhoSize * k, bhoSize)
5175*f6dc9357SAndroid Build Coastguard Worker
5176*f6dc9357SAndroid Build Coastguard Worker
Parse()5177*f6dc9357SAndroid Build Coastguard Worker HRESULT CInArchive::Parse()
5178*f6dc9357SAndroid Build Coastguard Worker {
5179*f6dc9357SAndroid Build Coastguard Worker // UInt32 offset = ReadUInt32();
5180*f6dc9357SAndroid Build Coastguard Worker // ???? offset == FirstHeader.HeaderSize
5181*f6dc9357SAndroid Build Coastguard Worker const Byte * const p1 = _data;
5182*f6dc9357SAndroid Build Coastguard Worker
5183*f6dc9357SAndroid Build Coastguard Worker if (_size < 4 + 12 * 8)
5184*f6dc9357SAndroid Build Coastguard Worker Is64Bit = false;
5185*f6dc9357SAndroid Build Coastguard Worker else
5186*f6dc9357SAndroid Build Coastguard Worker {
5187*f6dc9357SAndroid Build Coastguard Worker Is64Bit = true;
5188*f6dc9357SAndroid Build Coastguard Worker // here we test high 32-bit of possible UInt64 CBlockHeader::Offset field
5189*f6dc9357SAndroid Build Coastguard Worker for (int k = 0; k < 8; k++)
5190*f6dc9357SAndroid Build Coastguard Worker if (GetUi32(p1 + 4 + 12 * k + 4) != 0)
5191*f6dc9357SAndroid Build Coastguard Worker Is64Bit = false;
5192*f6dc9357SAndroid Build Coastguard Worker }
5193*f6dc9357SAndroid Build Coastguard Worker
5194*f6dc9357SAndroid Build Coastguard Worker const unsigned bhoSize = Is64Bit ? 12 : 8;
5195*f6dc9357SAndroid Build Coastguard Worker if (_size < 4 + bhoSize * 8)
5196*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5197*f6dc9357SAndroid Build Coastguard Worker
5198*f6dc9357SAndroid Build Coastguard Worker CBlockHeader bhEntries, bhStrings, bhLangTables;
5199*f6dc9357SAndroid Build Coastguard Worker
5200*f6dc9357SAndroid Build Coastguard Worker PARSE_BH (2, bhEntries);
5201*f6dc9357SAndroid Build Coastguard Worker PARSE_BH (3, bhStrings);
5202*f6dc9357SAndroid Build Coastguard Worker PARSE_BH (4, bhLangTables);
5203*f6dc9357SAndroid Build Coastguard Worker
5204*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
5205*f6dc9357SAndroid Build Coastguard Worker
5206*f6dc9357SAndroid Build Coastguard Worker CBlockHeader bhFont;
5207*f6dc9357SAndroid Build Coastguard Worker PARSE_BH (0, bhPages);
5208*f6dc9357SAndroid Build Coastguard Worker PARSE_BH (1, bhSections);
5209*f6dc9357SAndroid Build Coastguard Worker PARSE_BH (5, bhCtlColors);
5210*f6dc9357SAndroid Build Coastguard Worker PARSE_BH (6, bhFont);
5211*f6dc9357SAndroid Build Coastguard Worker PARSE_BH (7, bhData);
5212*f6dc9357SAndroid Build Coastguard Worker
5213*f6dc9357SAndroid Build Coastguard Worker #endif
5214*f6dc9357SAndroid Build Coastguard Worker
5215*f6dc9357SAndroid Build Coastguard Worker _stringsPos = bhStrings.Offset;
5216*f6dc9357SAndroid Build Coastguard Worker if (_stringsPos > _size
5217*f6dc9357SAndroid Build Coastguard Worker || bhLangTables.Offset > _size
5218*f6dc9357SAndroid Build Coastguard Worker || bhEntries.Offset > _size)
5219*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5220*f6dc9357SAndroid Build Coastguard Worker {
5221*f6dc9357SAndroid Build Coastguard Worker if (bhLangTables.Offset < bhStrings.Offset)
5222*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5223*f6dc9357SAndroid Build Coastguard Worker const UInt32 stringTableSize = bhLangTables.Offset - bhStrings.Offset;
5224*f6dc9357SAndroid Build Coastguard Worker if (stringTableSize < 2)
5225*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5226*f6dc9357SAndroid Build Coastguard Worker const Byte *strData = _data + _stringsPos;
5227*f6dc9357SAndroid Build Coastguard Worker if (strData[stringTableSize - 1] != 0)
5228*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5229*f6dc9357SAndroid Build Coastguard Worker IsUnicode = (Get16(strData) == 0);
5230*f6dc9357SAndroid Build Coastguard Worker NumStringChars = stringTableSize;
5231*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
5232*f6dc9357SAndroid Build Coastguard Worker {
5233*f6dc9357SAndroid Build Coastguard Worker if ((stringTableSize & 1) != 0)
5234*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5235*f6dc9357SAndroid Build Coastguard Worker NumStringChars >>= 1;
5236*f6dc9357SAndroid Build Coastguard Worker if (strData[stringTableSize - 2] != 0)
5237*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5238*f6dc9357SAndroid Build Coastguard Worker }
5239*f6dc9357SAndroid Build Coastguard Worker }
5240*f6dc9357SAndroid Build Coastguard Worker
5241*f6dc9357SAndroid Build Coastguard Worker if (bhEntries.Num > (1 << 25))
5242*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5243*f6dc9357SAndroid Build Coastguard Worker if (bhEntries.Num * kCmdSize > _size - bhEntries.Offset)
5244*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5245*f6dc9357SAndroid Build Coastguard Worker
5246*f6dc9357SAndroid Build Coastguard Worker DetectNsisType(bhEntries, _data + bhEntries.Offset);
5247*f6dc9357SAndroid Build Coastguard Worker
5248*f6dc9357SAndroid Build Coastguard Worker Decoder.IsNsisDeflate = (NsisType != k_NsisType_Nsis3);
5249*f6dc9357SAndroid Build Coastguard Worker
5250*f6dc9357SAndroid Build Coastguard Worker // some NSIS files (that are not detected as k_NsisType_Nsis3)
5251*f6dc9357SAndroid Build Coastguard Worker // use original (non-NSIS) Deflate
5252*f6dc9357SAndroid Build Coastguard Worker // How to detect these cases?
5253*f6dc9357SAndroid Build Coastguard Worker
5254*f6dc9357SAndroid Build Coastguard Worker // Decoder.IsNsisDeflate = false;
5255*f6dc9357SAndroid Build Coastguard Worker
5256*f6dc9357SAndroid Build Coastguard Worker
5257*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
5258*f6dc9357SAndroid Build Coastguard Worker
5259*f6dc9357SAndroid Build Coastguard Worker {
5260*f6dc9357SAndroid Build Coastguard Worker AddCommentAndString("NSIS script");
5261*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
5262*f6dc9357SAndroid Build Coastguard Worker Script += " (UTF-8)";
5263*f6dc9357SAndroid Build Coastguard Worker Space();
5264*f6dc9357SAndroid Build Coastguard Worker Script += GetFormatDescription();
5265*f6dc9357SAndroid Build Coastguard Worker AddLF();
5266*f6dc9357SAndroid Build Coastguard Worker }
5267*f6dc9357SAndroid Build Coastguard Worker {
5268*f6dc9357SAndroid Build Coastguard Worker AddCommentAndString(IsInstaller ? "Install" : "Uninstall");
5269*f6dc9357SAndroid Build Coastguard Worker AddLF();
5270*f6dc9357SAndroid Build Coastguard Worker }
5271*f6dc9357SAndroid Build Coastguard Worker
5272*f6dc9357SAndroid Build Coastguard Worker AddLF();
5273*f6dc9357SAndroid Build Coastguard Worker if (Is64Bit)
5274*f6dc9357SAndroid Build Coastguard Worker AddStringLF("Target AMD64-Unicode"); // TODO: Read PE machine type and use the correct CPU type
5275*f6dc9357SAndroid Build Coastguard Worker else if (IsUnicode)
5276*f6dc9357SAndroid Build Coastguard Worker AddStringLF("Unicode true");
5277*f6dc9357SAndroid Build Coastguard Worker else if (IsNsis3_OrHigher())
5278*f6dc9357SAndroid Build Coastguard Worker AddStringLF("Unicode false"); // Unicode is the default in 3.07+
5279*f6dc9357SAndroid Build Coastguard Worker
5280*f6dc9357SAndroid Build Coastguard Worker if (Method != NMethodType::kCopy)
5281*f6dc9357SAndroid Build Coastguard Worker {
5282*f6dc9357SAndroid Build Coastguard Worker const char *m = NULL;
5283*f6dc9357SAndroid Build Coastguard Worker switch ((int)Method)
5284*f6dc9357SAndroid Build Coastguard Worker {
5285*f6dc9357SAndroid Build Coastguard Worker case NMethodType::kDeflate: m = "zlib"; break;
5286*f6dc9357SAndroid Build Coastguard Worker case NMethodType::kBZip2: m = "bzip2"; break;
5287*f6dc9357SAndroid Build Coastguard Worker case NMethodType::kLZMA: m = "lzma"; break;
5288*f6dc9357SAndroid Build Coastguard Worker default: break;
5289*f6dc9357SAndroid Build Coastguard Worker }
5290*f6dc9357SAndroid Build Coastguard Worker Script += "SetCompressor";
5291*f6dc9357SAndroid Build Coastguard Worker if (IsSolid)
5292*f6dc9357SAndroid Build Coastguard Worker Script += " /SOLID";
5293*f6dc9357SAndroid Build Coastguard Worker if (m)
5294*f6dc9357SAndroid Build Coastguard Worker {
5295*f6dc9357SAndroid Build Coastguard Worker Space();
5296*f6dc9357SAndroid Build Coastguard Worker Script += m;
5297*f6dc9357SAndroid Build Coastguard Worker }
5298*f6dc9357SAndroid Build Coastguard Worker AddLF();
5299*f6dc9357SAndroid Build Coastguard Worker }
5300*f6dc9357SAndroid Build Coastguard Worker if (Method == NMethodType::kLZMA)
5301*f6dc9357SAndroid Build Coastguard Worker {
5302*f6dc9357SAndroid Build Coastguard Worker // if (DictionarySize != (8 << 20))
5303*f6dc9357SAndroid Build Coastguard Worker {
5304*f6dc9357SAndroid Build Coastguard Worker Script += "SetCompressorDictSize";
5305*f6dc9357SAndroid Build Coastguard Worker AddParam_UInt(DictionarySize >> 20);
5306*f6dc9357SAndroid Build Coastguard Worker AddLF();
5307*f6dc9357SAndroid Build Coastguard Worker }
5308*f6dc9357SAndroid Build Coastguard Worker }
5309*f6dc9357SAndroid Build Coastguard Worker
5310*f6dc9357SAndroid Build Coastguard Worker Separator();
5311*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("HEADER SIZE", FirstHeader.HeaderSize);
5312*f6dc9357SAndroid Build Coastguard Worker // if (bhPages.Offset != 300 && bhPages.Offset != 288)
5313*f6dc9357SAndroid Build Coastguard Worker if (bhPages.Offset != 0)
5314*f6dc9357SAndroid Build Coastguard Worker {
5315*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("START HEADER SIZE", bhPages.Offset);
5316*f6dc9357SAndroid Build Coastguard Worker }
5317*f6dc9357SAndroid Build Coastguard Worker
5318*f6dc9357SAndroid Build Coastguard Worker if (bhSections.Num > 0)
5319*f6dc9357SAndroid Build Coastguard Worker {
5320*f6dc9357SAndroid Build Coastguard Worker if (bhEntries.Offset < bhSections.Offset)
5321*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5322*f6dc9357SAndroid Build Coastguard Worker SectionSize = (bhEntries.Offset - bhSections.Offset) / bhSections.Num;
5323*f6dc9357SAndroid Build Coastguard Worker if (bhSections.Offset + bhSections.Num * SectionSize != bhEntries.Offset)
5324*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5325*f6dc9357SAndroid Build Coastguard Worker if (SectionSize < kSectionSize_base)
5326*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5327*f6dc9357SAndroid Build Coastguard Worker UInt32 maxStringLen = SectionSize - kSectionSize_base;
5328*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
5329*f6dc9357SAndroid Build Coastguard Worker {
5330*f6dc9357SAndroid Build Coastguard Worker if ((maxStringLen & 1) != 0)
5331*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5332*f6dc9357SAndroid Build Coastguard Worker maxStringLen >>= 1;
5333*f6dc9357SAndroid Build Coastguard Worker }
5334*f6dc9357SAndroid Build Coastguard Worker // if (maxStringLen != 1024)
5335*f6dc9357SAndroid Build Coastguard Worker {
5336*f6dc9357SAndroid Build Coastguard Worker if (maxStringLen == 0)
5337*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("SECTION SIZE", SectionSize);
5338*f6dc9357SAndroid Build Coastguard Worker else
5339*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("MAX STRING LENGTH", maxStringLen);
5340*f6dc9357SAndroid Build Coastguard Worker }
5341*f6dc9357SAndroid Build Coastguard Worker }
5342*f6dc9357SAndroid Build Coastguard Worker
5343*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("STRING CHARS", NumStringChars);
5344*f6dc9357SAndroid Build Coastguard Worker // PrintNumComment("LANG TABLE SIZE", bhCtlColors.Offset - bhLangTables.Offset);
5345*f6dc9357SAndroid Build Coastguard Worker
5346*f6dc9357SAndroid Build Coastguard Worker if (bhCtlColors.Offset > _size)
5347*f6dc9357SAndroid Build Coastguard Worker AddErrorLF("Bad COLORS TABLE");
5348*f6dc9357SAndroid Build Coastguard Worker // PrintNumComment("COLORS TABLE SIZE", bhFont.Offset - bhCtlColors.Offset);
5349*f6dc9357SAndroid Build Coastguard Worker if (bhCtlColors.Num != 0)
5350*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("COLORS Num", bhCtlColors.Num);
5351*f6dc9357SAndroid Build Coastguard Worker
5352*f6dc9357SAndroid Build Coastguard Worker // bhData uses offset in _afterHeader (not in _data)
5353*f6dc9357SAndroid Build Coastguard Worker // PrintNumComment("FONT TABLE SIZE", bhData.Offset - bhFont.Offset);
5354*f6dc9357SAndroid Build Coastguard Worker if (bhFont.Num != 0)
5355*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("FONTS Num", bhFont.Num);
5356*f6dc9357SAndroid Build Coastguard Worker
5357*f6dc9357SAndroid Build Coastguard Worker // PrintNumComment("DATA SIZE", FirstHeader.HeaderSize - bhData.Offset);
5358*f6dc9357SAndroid Build Coastguard Worker if (bhData.Num != 0)
5359*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("DATA NUM", bhData.Num);
5360*f6dc9357SAndroid Build Coastguard Worker
5361*f6dc9357SAndroid Build Coastguard Worker AddLF();
5362*f6dc9357SAndroid Build Coastguard Worker
5363*f6dc9357SAndroid Build Coastguard Worker AddStringLF("OutFile [NSIS].exe");
5364*f6dc9357SAndroid Build Coastguard Worker AddStringLF("!include WinMessages.nsh");
5365*f6dc9357SAndroid Build Coastguard Worker
5366*f6dc9357SAndroid Build Coastguard Worker AddLF();
5367*f6dc9357SAndroid Build Coastguard Worker
5368*f6dc9357SAndroid Build Coastguard Worker strUsed.Alloc(NumStringChars);
5369*f6dc9357SAndroid Build Coastguard Worker memset(strUsed, 0, NumStringChars);
5370*f6dc9357SAndroid Build Coastguard Worker
5371*f6dc9357SAndroid Build Coastguard Worker {
5372*f6dc9357SAndroid Build Coastguard Worker UInt32 ehFlags = Get32(p1);
5373*f6dc9357SAndroid Build Coastguard Worker UInt32 showDetails = ehFlags & 3;// CH_FLAGS_DETAILS_SHOWDETAILS & CH_FLAGS_DETAILS_NEVERSHOW;
5374*f6dc9357SAndroid Build Coastguard Worker if (showDetails >= 1 && showDetails <= 2)
5375*f6dc9357SAndroid Build Coastguard Worker {
5376*f6dc9357SAndroid Build Coastguard Worker Script += IsInstaller ? "ShowInstDetails" : "ShowUninstDetails";
5377*f6dc9357SAndroid Build Coastguard Worker Script += (showDetails == 1) ? " show" : " nevershow";
5378*f6dc9357SAndroid Build Coastguard Worker AddLF();
5379*f6dc9357SAndroid Build Coastguard Worker }
5380*f6dc9357SAndroid Build Coastguard Worker if (ehFlags & CH_FLAGS_PROGRESS_COLORED) AddStringLF("InstProgressFlags colored" );
5381*f6dc9357SAndroid Build Coastguard Worker if ((ehFlags & (CH_FLAGS_SILENT | CH_FLAGS_SILENT_LOG)) != 0)
5382*f6dc9357SAndroid Build Coastguard Worker {
5383*f6dc9357SAndroid Build Coastguard Worker Script += IsInstaller ? "SilentInstall " : "SilentUnInstall ";
5384*f6dc9357SAndroid Build Coastguard Worker Script += (ehFlags & CH_FLAGS_SILENT_LOG) ? "silentlog" : "silent";
5385*f6dc9357SAndroid Build Coastguard Worker AddLF();
5386*f6dc9357SAndroid Build Coastguard Worker }
5387*f6dc9357SAndroid Build Coastguard Worker if (ehFlags & CH_FLAGS_AUTO_CLOSE) AddStringLF("AutoCloseWindow true");
5388*f6dc9357SAndroid Build Coastguard Worker if ((ehFlags & CH_FLAGS_NO_ROOT_DIR) == 0) AddStringLF("AllowRootDirInstall true");
5389*f6dc9357SAndroid Build Coastguard Worker if (ehFlags & CH_FLAGS_NO_CUSTOM) AddStringLF("InstType /NOCUSTOM");
5390*f6dc9357SAndroid Build Coastguard Worker if (ehFlags & CH_FLAGS_COMP_ONLY_ON_CUSTOM) AddStringLF("InstType /COMPONENTSONLYONCUSTOM");
5391*f6dc9357SAndroid Build Coastguard Worker }
5392*f6dc9357SAndroid Build Coastguard Worker
5393*f6dc9357SAndroid Build Coastguard Worker // Separator();
5394*f6dc9357SAndroid Build Coastguard Worker // AddLF();
5395*f6dc9357SAndroid Build Coastguard Worker
5396*f6dc9357SAndroid Build Coastguard Worker Int32 licenseLangIndex = -1;
5397*f6dc9357SAndroid Build Coastguard Worker {
5398*f6dc9357SAndroid Build Coastguard Worker const Byte *pp = _data + bhPages.Offset;
5399*f6dc9357SAndroid Build Coastguard Worker
5400*f6dc9357SAndroid Build Coastguard Worker for (UInt32 pageIndex = 0; pageIndex < bhPages.Num; pageIndex++, pp += kPageSize)
5401*f6dc9357SAndroid Build Coastguard Worker {
5402*f6dc9357SAndroid Build Coastguard Worker UInt32 wndProcID = Get32(pp + 4);
5403*f6dc9357SAndroid Build Coastguard Worker UInt32 param1 = Get32(pp + 44 + 4 * 1);
5404*f6dc9357SAndroid Build Coastguard Worker if (wndProcID != PWP_LICENSE || param1 == 0)
5405*f6dc9357SAndroid Build Coastguard Worker continue;
5406*f6dc9357SAndroid Build Coastguard Worker if ((Int32)param1 < 0)
5407*f6dc9357SAndroid Build Coastguard Worker licenseLangIndex = - ((Int32)param1 + 1);
5408*f6dc9357SAndroid Build Coastguard Worker else
5409*f6dc9357SAndroid Build Coastguard Worker noParseStringIndexes.AddToUniqueSorted(param1);
5410*f6dc9357SAndroid Build Coastguard Worker }
5411*f6dc9357SAndroid Build Coastguard Worker }
5412*f6dc9357SAndroid Build Coastguard Worker
5413*f6dc9357SAndroid Build Coastguard Worker unsigned paramsOffset;
5414*f6dc9357SAndroid Build Coastguard Worker {
5415*f6dc9357SAndroid Build Coastguard Worker unsigned numBhs = 8;
5416*f6dc9357SAndroid Build Coastguard Worker // probably its for old NSIS?
5417*f6dc9357SAndroid Build Coastguard Worker if (bhoSize == 8 && bhPages.Offset == 276)
5418*f6dc9357SAndroid Build Coastguard Worker numBhs = 7;
5419*f6dc9357SAndroid Build Coastguard Worker paramsOffset = 4 + bhoSize * numBhs;
5420*f6dc9357SAndroid Build Coastguard Worker }
5421*f6dc9357SAndroid Build Coastguard Worker
5422*f6dc9357SAndroid Build Coastguard Worker const Byte *p2 = p1 + paramsOffset;
5423*f6dc9357SAndroid Build Coastguard Worker
5424*f6dc9357SAndroid Build Coastguard Worker {
5425*f6dc9357SAndroid Build Coastguard Worker UInt32 rootKey = Get32(p2); // (rootKey = -1) in uninstaller by default (the bug in NSIS)
5426*f6dc9357SAndroid Build Coastguard Worker UInt32 subKey = Get32(p2 + 4);
5427*f6dc9357SAndroid Build Coastguard Worker UInt32 value = Get32(p2 + 8);
5428*f6dc9357SAndroid Build Coastguard Worker if ((rootKey != 0 && rootKey != (UInt32)(Int32)-1) || subKey != 0 || value != 0)
5429*f6dc9357SAndroid Build Coastguard Worker {
5430*f6dc9357SAndroid Build Coastguard Worker Script += "InstallDirRegKey";
5431*f6dc9357SAndroid Build Coastguard Worker AddRegRoot(rootKey);
5432*f6dc9357SAndroid Build Coastguard Worker AddParam(subKey);
5433*f6dc9357SAndroid Build Coastguard Worker AddParam(value);
5434*f6dc9357SAndroid Build Coastguard Worker AddLF();
5435*f6dc9357SAndroid Build Coastguard Worker }
5436*f6dc9357SAndroid Build Coastguard Worker }
5437*f6dc9357SAndroid Build Coastguard Worker
5438*f6dc9357SAndroid Build Coastguard Worker
5439*f6dc9357SAndroid Build Coastguard Worker {
5440*f6dc9357SAndroid Build Coastguard Worker UInt32 bg_color1 = Get32(p2 + 12);
5441*f6dc9357SAndroid Build Coastguard Worker UInt32 bg_color2 = Get32(p2 + 16);
5442*f6dc9357SAndroid Build Coastguard Worker UInt32 bg_textcolor = Get32(p2 + 20);
5443*f6dc9357SAndroid Build Coastguard Worker if (bg_color1 != (UInt32)(Int32)-1 || bg_color2 != (UInt32)(Int32)-1 || bg_textcolor != (UInt32)(Int32)-1)
5444*f6dc9357SAndroid Build Coastguard Worker {
5445*f6dc9357SAndroid Build Coastguard Worker Script += "BGGradient";
5446*f6dc9357SAndroid Build Coastguard Worker if (bg_color1 != 0 || bg_color2 != 0xFF0000 || bg_textcolor != (UInt32)(Int32)-1)
5447*f6dc9357SAndroid Build Coastguard Worker {
5448*f6dc9357SAndroid Build Coastguard Worker Add_ColorParam(bg_color1);
5449*f6dc9357SAndroid Build Coastguard Worker Add_ColorParam(bg_color2);
5450*f6dc9357SAndroid Build Coastguard Worker if (bg_textcolor != (UInt32)(Int32)-1)
5451*f6dc9357SAndroid Build Coastguard Worker Add_ColorParam(bg_textcolor);
5452*f6dc9357SAndroid Build Coastguard Worker }
5453*f6dc9357SAndroid Build Coastguard Worker AddLF();
5454*f6dc9357SAndroid Build Coastguard Worker }
5455*f6dc9357SAndroid Build Coastguard Worker }
5456*f6dc9357SAndroid Build Coastguard Worker
5457*f6dc9357SAndroid Build Coastguard Worker {
5458*f6dc9357SAndroid Build Coastguard Worker UInt32 lb_bg = Get32(p2 + 24);
5459*f6dc9357SAndroid Build Coastguard Worker UInt32 lb_fg = Get32(p2 + 28);
5460*f6dc9357SAndroid Build Coastguard Worker if ((lb_bg != (UInt32)(Int32)-1 || lb_fg != (UInt32)(Int32)-1) &&
5461*f6dc9357SAndroid Build Coastguard Worker (lb_bg != 0 || lb_fg != 0xFF00))
5462*f6dc9357SAndroid Build Coastguard Worker {
5463*f6dc9357SAndroid Build Coastguard Worker Script += "InstallColors";
5464*f6dc9357SAndroid Build Coastguard Worker Add_ColorParam(lb_fg);
5465*f6dc9357SAndroid Build Coastguard Worker Add_ColorParam(lb_bg);
5466*f6dc9357SAndroid Build Coastguard Worker AddLF();
5467*f6dc9357SAndroid Build Coastguard Worker }
5468*f6dc9357SAndroid Build Coastguard Worker }
5469*f6dc9357SAndroid Build Coastguard Worker
5470*f6dc9357SAndroid Build Coastguard Worker UInt32 license_bg = Get32(p2 + 36);
5471*f6dc9357SAndroid Build Coastguard Worker if (license_bg != (UInt32)(Int32)-1 &&
5472*f6dc9357SAndroid Build Coastguard Worker license_bg != (UInt32)(Int32)-15) // COLOR_BTNFACE
5473*f6dc9357SAndroid Build Coastguard Worker {
5474*f6dc9357SAndroid Build Coastguard Worker Script += "LicenseBkColor";
5475*f6dc9357SAndroid Build Coastguard Worker if ((Int32)license_bg == -5) // COLOR_WINDOW
5476*f6dc9357SAndroid Build Coastguard Worker Script += " /windows";
5477*f6dc9357SAndroid Build Coastguard Worker /*
5478*f6dc9357SAndroid Build Coastguard Worker else if ((Int32)license_bg == -15)
5479*f6dc9357SAndroid Build Coastguard Worker Script += " /grey";
5480*f6dc9357SAndroid Build Coastguard Worker */
5481*f6dc9357SAndroid Build Coastguard Worker else
5482*f6dc9357SAndroid Build Coastguard Worker Add_ColorParam(license_bg);
5483*f6dc9357SAndroid Build Coastguard Worker AddLF();
5484*f6dc9357SAndroid Build Coastguard Worker }
5485*f6dc9357SAndroid Build Coastguard Worker
5486*f6dc9357SAndroid Build Coastguard Worker if (bhLangTables.Num > 0)
5487*f6dc9357SAndroid Build Coastguard Worker {
5488*f6dc9357SAndroid Build Coastguard Worker const UInt32 langtable_size = Get32(p2 + 32);
5489*f6dc9357SAndroid Build Coastguard Worker
5490*f6dc9357SAndroid Build Coastguard Worker if (langtable_size == (UInt32)(Int32)-1)
5491*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL; // maybe it's old NSIS archive()
5492*f6dc9357SAndroid Build Coastguard Worker
5493*f6dc9357SAndroid Build Coastguard Worker if (langtable_size < 10)
5494*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5495*f6dc9357SAndroid Build Coastguard Worker if (bhLangTables.Num > (_size - bhLangTables.Offset) / langtable_size)
5496*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5497*f6dc9357SAndroid Build Coastguard Worker
5498*f6dc9357SAndroid Build Coastguard Worker const UInt32 numStrings = (langtable_size - 10) / 4;
5499*f6dc9357SAndroid Build Coastguard Worker _numLangStrings = numStrings;
5500*f6dc9357SAndroid Build Coastguard Worker AddLF();
5501*f6dc9357SAndroid Build Coastguard Worker Separator();
5502*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("LANG TABLES", bhLangTables.Num);
5503*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("LANG STRINGS", numStrings);
5504*f6dc9357SAndroid Build Coastguard Worker AddLF();
5505*f6dc9357SAndroid Build Coastguard Worker
5506*f6dc9357SAndroid Build Coastguard Worker if (licenseLangIndex >= 0 && (unsigned)licenseLangIndex < numStrings)
5507*f6dc9357SAndroid Build Coastguard Worker {
5508*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < bhLangTables.Num; i++)
5509*f6dc9357SAndroid Build Coastguard Worker {
5510*f6dc9357SAndroid Build Coastguard Worker const Byte * const p = _data + bhLangTables.Offset + langtable_size * i;
5511*f6dc9357SAndroid Build Coastguard Worker const UInt16 langID = Get16(p);
5512*f6dc9357SAndroid Build Coastguard Worker UInt32 val = Get32(p + 10 + (UInt32)licenseLangIndex * 4);
5513*f6dc9357SAndroid Build Coastguard Worker if (val != 0)
5514*f6dc9357SAndroid Build Coastguard Worker {
5515*f6dc9357SAndroid Build Coastguard Worker Script += "LicenseLangString ";
5516*f6dc9357SAndroid Build Coastguard Worker Add_LangStr_Simple((UInt32)licenseLangIndex);
5517*f6dc9357SAndroid Build Coastguard Worker AddParam_UInt(langID);
5518*f6dc9357SAndroid Build Coastguard Worker AddLicense(val, langID);
5519*f6dc9357SAndroid Build Coastguard Worker noParseStringIndexes.AddToUniqueSorted(val);
5520*f6dc9357SAndroid Build Coastguard Worker NewLine();
5521*f6dc9357SAndroid Build Coastguard Worker }
5522*f6dc9357SAndroid Build Coastguard Worker }
5523*f6dc9357SAndroid Build Coastguard Worker AddLF();
5524*f6dc9357SAndroid Build Coastguard Worker }
5525*f6dc9357SAndroid Build Coastguard Worker
5526*f6dc9357SAndroid Build Coastguard Worker UInt32 names[3] = { 0 };
5527*f6dc9357SAndroid Build Coastguard Worker
5528*f6dc9357SAndroid Build Coastguard Worker UInt32 i;
5529*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < bhLangTables.Num; i++)
5530*f6dc9357SAndroid Build Coastguard Worker {
5531*f6dc9357SAndroid Build Coastguard Worker const Byte * const p = _data + bhLangTables.Offset + langtable_size * i;
5532*f6dc9357SAndroid Build Coastguard Worker const UInt16 langID = Get16(p);
5533*f6dc9357SAndroid Build Coastguard Worker if (i == 0 || langID == 1033)
5534*f6dc9357SAndroid Build Coastguard Worker _mainLang = p + 10;
5535*f6dc9357SAndroid Build Coastguard Worker for (unsigned k = 0; k < Z7_ARRAY_SIZE(names) && k < numStrings; k++)
5536*f6dc9357SAndroid Build Coastguard Worker {
5537*f6dc9357SAndroid Build Coastguard Worker UInt32 v = Get32(p + 10 + k * 4);
5538*f6dc9357SAndroid Build Coastguard Worker if (v != 0 && (langID == 1033 || names[k] == 0))
5539*f6dc9357SAndroid Build Coastguard Worker names[k] = v;
5540*f6dc9357SAndroid Build Coastguard Worker }
5541*f6dc9357SAndroid Build Coastguard Worker }
5542*f6dc9357SAndroid Build Coastguard Worker
5543*f6dc9357SAndroid Build Coastguard Worker const UInt32 name = names[2];
5544*f6dc9357SAndroid Build Coastguard Worker if (name != 0)
5545*f6dc9357SAndroid Build Coastguard Worker {
5546*f6dc9357SAndroid Build Coastguard Worker Script += "Name";
5547*f6dc9357SAndroid Build Coastguard Worker AddParam(name);
5548*f6dc9357SAndroid Build Coastguard Worker NewLine();
5549*f6dc9357SAndroid Build Coastguard Worker
5550*f6dc9357SAndroid Build Coastguard Worker ReadString2(Name, name);
5551*f6dc9357SAndroid Build Coastguard Worker }
5552*f6dc9357SAndroid Build Coastguard Worker
5553*f6dc9357SAndroid Build Coastguard Worker /*
5554*f6dc9357SAndroid Build Coastguard Worker const UInt32 caption = names[1];
5555*f6dc9357SAndroid Build Coastguard Worker if (caption != 0)
5556*f6dc9357SAndroid Build Coastguard Worker {
5557*f6dc9357SAndroid Build Coastguard Worker Script += "Caption";
5558*f6dc9357SAndroid Build Coastguard Worker AddParam(caption);
5559*f6dc9357SAndroid Build Coastguard Worker NewLine();
5560*f6dc9357SAndroid Build Coastguard Worker }
5561*f6dc9357SAndroid Build Coastguard Worker */
5562*f6dc9357SAndroid Build Coastguard Worker
5563*f6dc9357SAndroid Build Coastguard Worker const UInt32 brandingText = names[0];
5564*f6dc9357SAndroid Build Coastguard Worker if (brandingText != 0)
5565*f6dc9357SAndroid Build Coastguard Worker {
5566*f6dc9357SAndroid Build Coastguard Worker Script += "BrandingText";
5567*f6dc9357SAndroid Build Coastguard Worker AddParam(brandingText);
5568*f6dc9357SAndroid Build Coastguard Worker NewLine();
5569*f6dc9357SAndroid Build Coastguard Worker
5570*f6dc9357SAndroid Build Coastguard Worker ReadString2(BrandingText, brandingText);
5571*f6dc9357SAndroid Build Coastguard Worker }
5572*f6dc9357SAndroid Build Coastguard Worker
5573*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < bhLangTables.Num; i++)
5574*f6dc9357SAndroid Build Coastguard Worker {
5575*f6dc9357SAndroid Build Coastguard Worker const Byte * const p = _data + bhLangTables.Offset + langtable_size * i;
5576*f6dc9357SAndroid Build Coastguard Worker const UInt16 langID = Get16(p);
5577*f6dc9357SAndroid Build Coastguard Worker
5578*f6dc9357SAndroid Build Coastguard Worker AddLF();
5579*f6dc9357SAndroid Build Coastguard Worker AddCommentAndString("LANG:");
5580*f6dc9357SAndroid Build Coastguard Worker AddParam_UInt(langID);
5581*f6dc9357SAndroid Build Coastguard Worker /*
5582*f6dc9357SAndroid Build Coastguard Worker Script += " (";
5583*f6dc9357SAndroid Build Coastguard Worker LangId_To_String(Script, langID);
5584*f6dc9357SAndroid Build Coastguard Worker Script += ')';
5585*f6dc9357SAndroid Build Coastguard Worker */
5586*f6dc9357SAndroid Build Coastguard Worker AddLF();
5587*f6dc9357SAndroid Build Coastguard Worker // UInt32 dlg_offset = Get32(p + 2);
5588*f6dc9357SAndroid Build Coastguard Worker // UInt32 g_exec_flags_rtl = Get32(p + 6);
5589*f6dc9357SAndroid Build Coastguard Worker
5590*f6dc9357SAndroid Build Coastguard Worker
5591*f6dc9357SAndroid Build Coastguard Worker for (UInt32 j = 0; j < numStrings; j++)
5592*f6dc9357SAndroid Build Coastguard Worker {
5593*f6dc9357SAndroid Build Coastguard Worker UInt32 val = Get32(p + 10 + j * 4);
5594*f6dc9357SAndroid Build Coastguard Worker if (val != 0)
5595*f6dc9357SAndroid Build Coastguard Worker {
5596*f6dc9357SAndroid Build Coastguard Worker if ((Int32)j != licenseLangIndex)
5597*f6dc9357SAndroid Build Coastguard Worker {
5598*f6dc9357SAndroid Build Coastguard Worker Script += "LangString ";
5599*f6dc9357SAndroid Build Coastguard Worker Add_LangStr_Simple(j);
5600*f6dc9357SAndroid Build Coastguard Worker AddParam_UInt(langID);
5601*f6dc9357SAndroid Build Coastguard Worker AddParam(val);
5602*f6dc9357SAndroid Build Coastguard Worker AddLF();
5603*f6dc9357SAndroid Build Coastguard Worker }
5604*f6dc9357SAndroid Build Coastguard Worker }
5605*f6dc9357SAndroid Build Coastguard Worker }
5606*f6dc9357SAndroid Build Coastguard Worker AddLF();
5607*f6dc9357SAndroid Build Coastguard Worker }
5608*f6dc9357SAndroid Build Coastguard Worker ClearLangComment();
5609*f6dc9357SAndroid Build Coastguard Worker }
5610*f6dc9357SAndroid Build Coastguard Worker
5611*f6dc9357SAndroid Build Coastguard Worker {
5612*f6dc9357SAndroid Build Coastguard Worker unsigned numInternalVars = GET_NUM_INTERNAL_VARS;
5613*f6dc9357SAndroid Build Coastguard Worker UInt32 numUsedVars = GetNumUsedVars();
5614*f6dc9357SAndroid Build Coastguard Worker if (numUsedVars > numInternalVars)
5615*f6dc9357SAndroid Build Coastguard Worker {
5616*f6dc9357SAndroid Build Coastguard Worker Separator();
5617*f6dc9357SAndroid Build Coastguard Worker PrintNumComment("VARIABLES", numUsedVars - numInternalVars);
5618*f6dc9357SAndroid Build Coastguard Worker AddLF();
5619*f6dc9357SAndroid Build Coastguard Worker AString temp;
5620*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = numInternalVars; i < numUsedVars; i++)
5621*f6dc9357SAndroid Build Coastguard Worker {
5622*f6dc9357SAndroid Build Coastguard Worker Script += "Var ";
5623*f6dc9357SAndroid Build Coastguard Worker temp.Empty();
5624*f6dc9357SAndroid Build Coastguard Worker GetVar2(temp, i);
5625*f6dc9357SAndroid Build Coastguard Worker AddStringLF(temp);
5626*f6dc9357SAndroid Build Coastguard Worker }
5627*f6dc9357SAndroid Build Coastguard Worker AddLF();
5628*f6dc9357SAndroid Build Coastguard Worker }
5629*f6dc9357SAndroid Build Coastguard Worker }
5630*f6dc9357SAndroid Build Coastguard Worker
5631*f6dc9357SAndroid Build Coastguard Worker onFuncOffset = paramsOffset + 40;
5632*f6dc9357SAndroid Build Coastguard Worker numOnFunc = Z7_ARRAY_SIZE(kOnFunc);
5633*f6dc9357SAndroid Build Coastguard Worker if (bhPages.Offset == 276)
5634*f6dc9357SAndroid Build Coastguard Worker numOnFunc--;
5635*f6dc9357SAndroid Build Coastguard Worker p2 += 40 + numOnFunc * 4;
5636*f6dc9357SAndroid Build Coastguard Worker
5637*f6dc9357SAndroid Build Coastguard Worker #define NSIS_MAX_INST_TYPES 32
5638*f6dc9357SAndroid Build Coastguard Worker
5639*f6dc9357SAndroid Build Coastguard Worker AddLF();
5640*f6dc9357SAndroid Build Coastguard Worker
5641*f6dc9357SAndroid Build Coastguard Worker UInt32 i;
5642*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < NSIS_MAX_INST_TYPES + 1; i++, p2 += 4)
5643*f6dc9357SAndroid Build Coastguard Worker {
5644*f6dc9357SAndroid Build Coastguard Worker UInt32 instType = Get32(p2);
5645*f6dc9357SAndroid Build Coastguard Worker if (instType != 0)
5646*f6dc9357SAndroid Build Coastguard Worker {
5647*f6dc9357SAndroid Build Coastguard Worker Script += "InstType";
5648*f6dc9357SAndroid Build Coastguard Worker AString s2;
5649*f6dc9357SAndroid Build Coastguard Worker if (!IsInstaller)
5650*f6dc9357SAndroid Build Coastguard Worker s2 += "un.";
5651*f6dc9357SAndroid Build Coastguard Worker ReadString2(s2, instType);
5652*f6dc9357SAndroid Build Coastguard Worker SpaceQuStr(s2);
5653*f6dc9357SAndroid Build Coastguard Worker NewLine();
5654*f6dc9357SAndroid Build Coastguard Worker }
5655*f6dc9357SAndroid Build Coastguard Worker }
5656*f6dc9357SAndroid Build Coastguard Worker
5657*f6dc9357SAndroid Build Coastguard Worker {
5658*f6dc9357SAndroid Build Coastguard Worker UInt32 installDir = Get32(p2);
5659*f6dc9357SAndroid Build Coastguard Worker p2 += 4;
5660*f6dc9357SAndroid Build Coastguard Worker if (installDir != 0)
5661*f6dc9357SAndroid Build Coastguard Worker {
5662*f6dc9357SAndroid Build Coastguard Worker Script += "InstallDir";
5663*f6dc9357SAndroid Build Coastguard Worker AddParam(installDir);
5664*f6dc9357SAndroid Build Coastguard Worker NewLine();
5665*f6dc9357SAndroid Build Coastguard Worker }
5666*f6dc9357SAndroid Build Coastguard Worker }
5667*f6dc9357SAndroid Build Coastguard Worker
5668*f6dc9357SAndroid Build Coastguard Worker if (bhPages.Offset >= 288)
5669*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < 4; i++)
5670*f6dc9357SAndroid Build Coastguard Worker {
5671*f6dc9357SAndroid Build Coastguard Worker if (i != 0 && bhPages.Offset < 300)
5672*f6dc9357SAndroid Build Coastguard Worker break;
5673*f6dc9357SAndroid Build Coastguard Worker UInt32 param = Get32(p2 + 4 * i);
5674*f6dc9357SAndroid Build Coastguard Worker if (param == 0 || param == (UInt32)(Int32)-1)
5675*f6dc9357SAndroid Build Coastguard Worker continue;
5676*f6dc9357SAndroid Build Coastguard Worker
5677*f6dc9357SAndroid Build Coastguard Worker /*
5678*f6dc9357SAndroid Build Coastguard Worker uninstaller:
5679*f6dc9357SAndroid Build Coastguard Worker UInt32 uninstChild = Get32(p2 + 8); // "$TEMP\\$1u_.exe"
5680*f6dc9357SAndroid Build Coastguard Worker UInt32 uninstCmd = Get32(p2 + 12); // "\"$TEMP\\$1u_.exe\" $0 _?=$INSTDIR\\"
5681*f6dc9357SAndroid Build Coastguard Worker int str_wininit = Get32(p2 + 16); // "$WINDIR\\wininit.ini"
5682*f6dc9357SAndroid Build Coastguard Worker */
5683*f6dc9357SAndroid Build Coastguard Worker
5684*f6dc9357SAndroid Build Coastguard Worker AddCommentAndString(k_PostStrings[i]);
5685*f6dc9357SAndroid Build Coastguard Worker Script += " =";
5686*f6dc9357SAndroid Build Coastguard Worker AddParam(param);
5687*f6dc9357SAndroid Build Coastguard Worker NewLine();
5688*f6dc9357SAndroid Build Coastguard Worker }
5689*f6dc9357SAndroid Build Coastguard Worker
5690*f6dc9357SAndroid Build Coastguard Worker AddLF();
5691*f6dc9357SAndroid Build Coastguard Worker
5692*f6dc9357SAndroid Build Coastguard Worker #endif
5693*f6dc9357SAndroid Build Coastguard Worker
5694*f6dc9357SAndroid Build Coastguard Worker RINOK(ReadEntries(bhEntries))
5695*f6dc9357SAndroid Build Coastguard Worker
5696*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
5697*f6dc9357SAndroid Build Coastguard Worker
5698*f6dc9357SAndroid Build Coastguard Worker Separator();
5699*f6dc9357SAndroid Build Coastguard Worker AddCommentAndString("UNREFERENCED STRINGS:");
5700*f6dc9357SAndroid Build Coastguard Worker AddLF();
5701*f6dc9357SAndroid Build Coastguard Worker AddLF();
5702*f6dc9357SAndroid Build Coastguard Worker CommentOpen();
5703*f6dc9357SAndroid Build Coastguard Worker
5704*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < NumStringChars;)
5705*f6dc9357SAndroid Build Coastguard Worker {
5706*f6dc9357SAndroid Build Coastguard Worker if (!strUsed[i] && i != 0)
5707*f6dc9357SAndroid Build Coastguard Worker // Script += "!!! ";
5708*f6dc9357SAndroid Build Coastguard Worker {
5709*f6dc9357SAndroid Build Coastguard Worker Add_UInt(i);
5710*f6dc9357SAndroid Build Coastguard Worker AddParam(i);
5711*f6dc9357SAndroid Build Coastguard Worker NewLine();
5712*f6dc9357SAndroid Build Coastguard Worker }
5713*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
5714*f6dc9357SAndroid Build Coastguard Worker i += GetUi16Str_Len((const Byte *)_data + _stringsPos + i * 2);
5715*f6dc9357SAndroid Build Coastguard Worker else
5716*f6dc9357SAndroid Build Coastguard Worker i += (UInt32)strlen((const char *)(const Byte *)_data + _stringsPos + i);
5717*f6dc9357SAndroid Build Coastguard Worker i++;
5718*f6dc9357SAndroid Build Coastguard Worker }
5719*f6dc9357SAndroid Build Coastguard Worker CommentClose();
5720*f6dc9357SAndroid Build Coastguard Worker #endif
5721*f6dc9357SAndroid Build Coastguard Worker
5722*f6dc9357SAndroid Build Coastguard Worker return SortItems();
5723*f6dc9357SAndroid Build Coastguard Worker }
5724*f6dc9357SAndroid Build Coastguard Worker
IsLZMA(const Byte * p,UInt32 & dictionary)5725*f6dc9357SAndroid Build Coastguard Worker static bool IsLZMA(const Byte *p, UInt32 &dictionary)
5726*f6dc9357SAndroid Build Coastguard Worker {
5727*f6dc9357SAndroid Build Coastguard Worker dictionary = Get32(p + 1);
5728*f6dc9357SAndroid Build Coastguard Worker return (p[0] == 0x5D &&
5729*f6dc9357SAndroid Build Coastguard Worker p[1] == 0x00 && p[2] == 0x00 &&
5730*f6dc9357SAndroid Build Coastguard Worker p[5] == 0x00 && (p[6] & 0x80) == 0x00);
5731*f6dc9357SAndroid Build Coastguard Worker }
5732*f6dc9357SAndroid Build Coastguard Worker
IsLZMA(const Byte * p,UInt32 & dictionary,bool & thereIsFlag)5733*f6dc9357SAndroid Build Coastguard Worker static bool IsLZMA(const Byte *p, UInt32 &dictionary, bool &thereIsFlag)
5734*f6dc9357SAndroid Build Coastguard Worker {
5735*f6dc9357SAndroid Build Coastguard Worker if (IsLZMA(p, dictionary))
5736*f6dc9357SAndroid Build Coastguard Worker {
5737*f6dc9357SAndroid Build Coastguard Worker thereIsFlag = false;
5738*f6dc9357SAndroid Build Coastguard Worker return true;
5739*f6dc9357SAndroid Build Coastguard Worker }
5740*f6dc9357SAndroid Build Coastguard Worker if (p[0] <= 1 && IsLZMA(p + 1, dictionary))
5741*f6dc9357SAndroid Build Coastguard Worker {
5742*f6dc9357SAndroid Build Coastguard Worker thereIsFlag = true;
5743*f6dc9357SAndroid Build Coastguard Worker return true;
5744*f6dc9357SAndroid Build Coastguard Worker }
5745*f6dc9357SAndroid Build Coastguard Worker return false;
5746*f6dc9357SAndroid Build Coastguard Worker }
5747*f6dc9357SAndroid Build Coastguard Worker
IsBZip2(const Byte * p)5748*f6dc9357SAndroid Build Coastguard Worker static bool IsBZip2(const Byte *p)
5749*f6dc9357SAndroid Build Coastguard Worker {
5750*f6dc9357SAndroid Build Coastguard Worker return (p[0] == 0x31 && p[1] < 14);
5751*f6dc9357SAndroid Build Coastguard Worker }
5752*f6dc9357SAndroid Build Coastguard Worker
Open2(const Byte * sig,size_t size)5753*f6dc9357SAndroid Build Coastguard Worker HRESULT CInArchive::Open2(const Byte *sig, size_t size)
5754*f6dc9357SAndroid Build Coastguard Worker {
5755*f6dc9357SAndroid Build Coastguard Worker const UInt32 kSigSize = 4 + 1 + 5 + 2; // size, flag, 5 - lzma props, 2 - lzma first bytes
5756*f6dc9357SAndroid Build Coastguard Worker if (size < kSigSize)
5757*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5758*f6dc9357SAndroid Build Coastguard Worker
5759*f6dc9357SAndroid Build Coastguard Worker _headerIsCompressed = true;
5760*f6dc9357SAndroid Build Coastguard Worker IsSolid = true;
5761*f6dc9357SAndroid Build Coastguard Worker FilterFlag = false;
5762*f6dc9357SAndroid Build Coastguard Worker UseFilter = false;
5763*f6dc9357SAndroid Build Coastguard Worker DictionarySize = 1;
5764*f6dc9357SAndroid Build Coastguard Worker
5765*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
5766*f6dc9357SAndroid Build Coastguard Worker AfterHeaderSize = 0;
5767*f6dc9357SAndroid Build Coastguard Worker #endif
5768*f6dc9357SAndroid Build Coastguard Worker
5769*f6dc9357SAndroid Build Coastguard Worker UInt32 compressedHeaderSize = Get32(sig);
5770*f6dc9357SAndroid Build Coastguard Worker
5771*f6dc9357SAndroid Build Coastguard Worker
5772*f6dc9357SAndroid Build Coastguard Worker /*
5773*f6dc9357SAndroid Build Coastguard Worker XX XX XX XX XX XX XX XX == FirstHeader.HeaderSize, nonsolid, uncompressed
5774*f6dc9357SAndroid Build Coastguard Worker 5D 00 00 dd dd 00 solid LZMA
5775*f6dc9357SAndroid Build Coastguard Worker 00 5D 00 00 dd dd 00 solid LZMA, empty filter (there are no such archives)
5776*f6dc9357SAndroid Build Coastguard Worker 01 5D 00 00 dd dd 00 solid LZMA, BCJ filter (only 7-Zip installer used that format)
5777*f6dc9357SAndroid Build Coastguard Worker
5778*f6dc9357SAndroid Build Coastguard Worker SS SS SS 80 00 5D 00 00 dd dd 00 non-solid LZMA, empty filter
5779*f6dc9357SAndroid Build Coastguard Worker SS SS SS 80 01 5D 00 00 dd dd 00 non-solid LZMA, BCJ filte
5780*f6dc9357SAndroid Build Coastguard Worker SS SS SS 80 01 tt non-solid BZip (tt < 14
5781*f6dc9357SAndroid Build Coastguard Worker SS SS SS 80 non-solid deflate
5782*f6dc9357SAndroid Build Coastguard Worker
5783*f6dc9357SAndroid Build Coastguard Worker 01 tt solid BZip (tt < 14
5784*f6dc9357SAndroid Build Coastguard Worker other solid Deflate
5785*f6dc9357SAndroid Build Coastguard Worker */
5786*f6dc9357SAndroid Build Coastguard Worker
5787*f6dc9357SAndroid Build Coastguard Worker if (compressedHeaderSize == FirstHeader.HeaderSize)
5788*f6dc9357SAndroid Build Coastguard Worker {
5789*f6dc9357SAndroid Build Coastguard Worker _headerIsCompressed = false;
5790*f6dc9357SAndroid Build Coastguard Worker IsSolid = false;
5791*f6dc9357SAndroid Build Coastguard Worker Method = NMethodType::kCopy;
5792*f6dc9357SAndroid Build Coastguard Worker }
5793*f6dc9357SAndroid Build Coastguard Worker else if (IsLZMA(sig, DictionarySize, FilterFlag))
5794*f6dc9357SAndroid Build Coastguard Worker Method = NMethodType::kLZMA;
5795*f6dc9357SAndroid Build Coastguard Worker else if (sig[3] == 0x80)
5796*f6dc9357SAndroid Build Coastguard Worker {
5797*f6dc9357SAndroid Build Coastguard Worker IsSolid = false;
5798*f6dc9357SAndroid Build Coastguard Worker if (IsLZMA(sig + 4, DictionarySize, FilterFlag) && sig[3] == 0x80)
5799*f6dc9357SAndroid Build Coastguard Worker Method = NMethodType::kLZMA;
5800*f6dc9357SAndroid Build Coastguard Worker else if (IsBZip2(sig + 4))
5801*f6dc9357SAndroid Build Coastguard Worker Method = NMethodType::kBZip2;
5802*f6dc9357SAndroid Build Coastguard Worker else
5803*f6dc9357SAndroid Build Coastguard Worker Method = NMethodType::kDeflate;
5804*f6dc9357SAndroid Build Coastguard Worker }
5805*f6dc9357SAndroid Build Coastguard Worker else if (IsBZip2(sig))
5806*f6dc9357SAndroid Build Coastguard Worker Method = NMethodType::kBZip2;
5807*f6dc9357SAndroid Build Coastguard Worker else
5808*f6dc9357SAndroid Build Coastguard Worker Method = NMethodType::kDeflate;
5809*f6dc9357SAndroid Build Coastguard Worker
5810*f6dc9357SAndroid Build Coastguard Worker if (IsSolid)
5811*f6dc9357SAndroid Build Coastguard Worker {
5812*f6dc9357SAndroid Build Coastguard Worker RINOK(SeekTo_DataStreamOffset())
5813*f6dc9357SAndroid Build Coastguard Worker }
5814*f6dc9357SAndroid Build Coastguard Worker else
5815*f6dc9357SAndroid Build Coastguard Worker {
5816*f6dc9357SAndroid Build Coastguard Worker _headerIsCompressed = ((compressedHeaderSize & kMask_IsCompressed) != 0);
5817*f6dc9357SAndroid Build Coastguard Worker compressedHeaderSize &= ~kMask_IsCompressed;
5818*f6dc9357SAndroid Build Coastguard Worker _nonSolidStartOffset = compressedHeaderSize;
5819*f6dc9357SAndroid Build Coastguard Worker RINOK(SeekTo(DataStreamOffset + 4))
5820*f6dc9357SAndroid Build Coastguard Worker }
5821*f6dc9357SAndroid Build Coastguard Worker
5822*f6dc9357SAndroid Build Coastguard Worker if (FirstHeader.HeaderSize == 0)
5823*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5824*f6dc9357SAndroid Build Coastguard Worker
5825*f6dc9357SAndroid Build Coastguard Worker _data.Alloc(FirstHeader.HeaderSize);
5826*f6dc9357SAndroid Build Coastguard Worker _size = (size_t)FirstHeader.HeaderSize;
5827*f6dc9357SAndroid Build Coastguard Worker
5828*f6dc9357SAndroid Build Coastguard Worker Decoder.Method = Method;
5829*f6dc9357SAndroid Build Coastguard Worker Decoder.FilterFlag = FilterFlag;
5830*f6dc9357SAndroid Build Coastguard Worker Decoder.Solid = IsSolid;
5831*f6dc9357SAndroid Build Coastguard Worker
5832*f6dc9357SAndroid Build Coastguard Worker Decoder.IsNsisDeflate = true; // we need some smart check that NSIS is not NSIS3 here.
5833*f6dc9357SAndroid Build Coastguard Worker
5834*f6dc9357SAndroid Build Coastguard Worker Decoder.InputStream = _stream;
5835*f6dc9357SAndroid Build Coastguard Worker Decoder.Buffer.Alloc(kInputBufSize);
5836*f6dc9357SAndroid Build Coastguard Worker Decoder.StreamPos = 0;
5837*f6dc9357SAndroid Build Coastguard Worker
5838*f6dc9357SAndroid Build Coastguard Worker if (_headerIsCompressed)
5839*f6dc9357SAndroid Build Coastguard Worker {
5840*f6dc9357SAndroid Build Coastguard Worker RINOK(Decoder.Init(_stream, UseFilter))
5841*f6dc9357SAndroid Build Coastguard Worker if (IsSolid)
5842*f6dc9357SAndroid Build Coastguard Worker {
5843*f6dc9357SAndroid Build Coastguard Worker size_t processedSize = 4;
5844*f6dc9357SAndroid Build Coastguard Worker Byte buf[4];
5845*f6dc9357SAndroid Build Coastguard Worker RINOK(Decoder.Read(buf, &processedSize))
5846*f6dc9357SAndroid Build Coastguard Worker if (processedSize != 4)
5847*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5848*f6dc9357SAndroid Build Coastguard Worker if (Get32((const Byte *)buf) != FirstHeader.HeaderSize)
5849*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5850*f6dc9357SAndroid Build Coastguard Worker }
5851*f6dc9357SAndroid Build Coastguard Worker {
5852*f6dc9357SAndroid Build Coastguard Worker size_t processedSize = FirstHeader.HeaderSize;
5853*f6dc9357SAndroid Build Coastguard Worker RINOK(Decoder.Read(_data, &processedSize))
5854*f6dc9357SAndroid Build Coastguard Worker if (processedSize != FirstHeader.HeaderSize)
5855*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5856*f6dc9357SAndroid Build Coastguard Worker }
5857*f6dc9357SAndroid Build Coastguard Worker
5858*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
5859*f6dc9357SAndroid Build Coastguard Worker if (IsSolid)
5860*f6dc9357SAndroid Build Coastguard Worker {
5861*f6dc9357SAndroid Build Coastguard Worker /* we need additional bytes for data for WriteRegBin */
5862*f6dc9357SAndroid Build Coastguard Worker AfterHeaderSize = (1 << 12);
5863*f6dc9357SAndroid Build Coastguard Worker _afterHeader.Alloc(AfterHeaderSize);
5864*f6dc9357SAndroid Build Coastguard Worker size_t processedSize = AfterHeaderSize;
5865*f6dc9357SAndroid Build Coastguard Worker RINOK(Decoder.Read(_afterHeader, &processedSize))
5866*f6dc9357SAndroid Build Coastguard Worker AfterHeaderSize = (UInt32)processedSize;
5867*f6dc9357SAndroid Build Coastguard Worker }
5868*f6dc9357SAndroid Build Coastguard Worker #endif
5869*f6dc9357SAndroid Build Coastguard Worker }
5870*f6dc9357SAndroid Build Coastguard Worker else
5871*f6dc9357SAndroid Build Coastguard Worker {
5872*f6dc9357SAndroid Build Coastguard Worker size_t processedSize = FirstHeader.HeaderSize;
5873*f6dc9357SAndroid Build Coastguard Worker RINOK(ReadStream(_stream, (Byte *)_data, &processedSize))
5874*f6dc9357SAndroid Build Coastguard Worker if (processedSize < FirstHeader.HeaderSize)
5875*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5876*f6dc9357SAndroid Build Coastguard Worker }
5877*f6dc9357SAndroid Build Coastguard Worker
5878*f6dc9357SAndroid Build Coastguard Worker #ifdef NUM_SPEED_TESTS
5879*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < NUM_SPEED_TESTS; i++)
5880*f6dc9357SAndroid Build Coastguard Worker {
5881*f6dc9357SAndroid Build Coastguard Worker RINOK(Parse());
5882*f6dc9357SAndroid Build Coastguard Worker Clear2();
5883*f6dc9357SAndroid Build Coastguard Worker }
5884*f6dc9357SAndroid Build Coastguard Worker #endif
5885*f6dc9357SAndroid Build Coastguard Worker
5886*f6dc9357SAndroid Build Coastguard Worker return Parse();
5887*f6dc9357SAndroid Build Coastguard Worker }
5888*f6dc9357SAndroid Build Coastguard Worker
5889*f6dc9357SAndroid Build Coastguard Worker /*
5890*f6dc9357SAndroid Build Coastguard Worker NsisExe =
5891*f6dc9357SAndroid Build Coastguard Worker {
5892*f6dc9357SAndroid Build Coastguard Worker ExeStub
5893*f6dc9357SAndroid Build Coastguard Worker Archive // must start from 512 * N
5894*f6dc9357SAndroid Build Coastguard Worker #ifndef NSIS_CONFIG_CRC_ANAL
5895*f6dc9357SAndroid Build Coastguard Worker {
5896*f6dc9357SAndroid Build Coastguard Worker Some additional data
5897*f6dc9357SAndroid Build Coastguard Worker }
5898*f6dc9357SAndroid Build Coastguard Worker }
5899*f6dc9357SAndroid Build Coastguard Worker
5900*f6dc9357SAndroid Build Coastguard Worker Archive
5901*f6dc9357SAndroid Build Coastguard Worker {
5902*f6dc9357SAndroid Build Coastguard Worker FirstHeader
5903*f6dc9357SAndroid Build Coastguard Worker Data
5904*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_CONFIG_CRC_SUPPORT && FirstHeader.ThereIsCrc()
5905*f6dc9357SAndroid Build Coastguard Worker {
5906*f6dc9357SAndroid Build Coastguard Worker CRC
5907*f6dc9357SAndroid Build Coastguard Worker }
5908*f6dc9357SAndroid Build Coastguard Worker }
5909*f6dc9357SAndroid Build Coastguard Worker
5910*f6dc9357SAndroid Build Coastguard Worker FirstHeader
5911*f6dc9357SAndroid Build Coastguard Worker {
5912*f6dc9357SAndroid Build Coastguard Worker UInt32 Flags;
5913*f6dc9357SAndroid Build Coastguard Worker Byte Signature[16];
5914*f6dc9357SAndroid Build Coastguard Worker // points to the header+sections+entries+stringtable in the datablock
5915*f6dc9357SAndroid Build Coastguard Worker UInt32 HeaderSize;
5916*f6dc9357SAndroid Build Coastguard Worker UInt32 ArcSize;
5917*f6dc9357SAndroid Build Coastguard Worker }
5918*f6dc9357SAndroid Build Coastguard Worker */
5919*f6dc9357SAndroid Build Coastguard Worker
5920*f6dc9357SAndroid Build Coastguard Worker
5921*f6dc9357SAndroid Build Coastguard Worker // ---------- PE (EXE) parsing ----------
5922*f6dc9357SAndroid Build Coastguard Worker
5923*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_PE_StartSize = 0x40;
5924*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_PE_HeaderSize = 4 + 20;
5925*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_PE_OptHeader32_Size_MIN = 96;
5926*f6dc9357SAndroid Build Coastguard Worker
CheckPeOffset(UInt32 pe)5927*f6dc9357SAndroid Build Coastguard Worker static inline bool CheckPeOffset(UInt32 pe)
5928*f6dc9357SAndroid Build Coastguard Worker {
5929*f6dc9357SAndroid Build Coastguard Worker return (pe >= 0x40 && pe <= 0x1000 && (pe & 7) == 0);
5930*f6dc9357SAndroid Build Coastguard Worker }
5931*f6dc9357SAndroid Build Coastguard Worker
5932*f6dc9357SAndroid Build Coastguard Worker
IsArc_Pe(const Byte * p,size_t size)5933*f6dc9357SAndroid Build Coastguard Worker static bool IsArc_Pe(const Byte *p, size_t size)
5934*f6dc9357SAndroid Build Coastguard Worker {
5935*f6dc9357SAndroid Build Coastguard Worker if (size < 2)
5936*f6dc9357SAndroid Build Coastguard Worker return false;
5937*f6dc9357SAndroid Build Coastguard Worker if (p[0] != 'M' || p[1] != 'Z')
5938*f6dc9357SAndroid Build Coastguard Worker return false;
5939*f6dc9357SAndroid Build Coastguard Worker if (size < k_PE_StartSize)
5940*f6dc9357SAndroid Build Coastguard Worker return false; // k_IsArc_Res_NEED_MORE;
5941*f6dc9357SAndroid Build Coastguard Worker UInt32 pe = Get32(p + 0x3C);
5942*f6dc9357SAndroid Build Coastguard Worker if (!CheckPeOffset(pe))
5943*f6dc9357SAndroid Build Coastguard Worker return false;
5944*f6dc9357SAndroid Build Coastguard Worker if (pe + k_PE_HeaderSize > size)
5945*f6dc9357SAndroid Build Coastguard Worker return false; // k_IsArc_Res_NEED_MORE;
5946*f6dc9357SAndroid Build Coastguard Worker
5947*f6dc9357SAndroid Build Coastguard Worker p += pe;
5948*f6dc9357SAndroid Build Coastguard Worker if (Get32(p) != 0x00004550)
5949*f6dc9357SAndroid Build Coastguard Worker return false;
5950*f6dc9357SAndroid Build Coastguard Worker return Get16(p + 4 + 16) >= k_PE_OptHeader32_Size_MIN;
5951*f6dc9357SAndroid Build Coastguard Worker }
5952*f6dc9357SAndroid Build Coastguard Worker
Open(IInStream * inStream,const UInt64 * maxCheckStartPosition)5953*f6dc9357SAndroid Build Coastguard Worker HRESULT CInArchive::Open(IInStream *inStream, const UInt64 *maxCheckStartPosition)
5954*f6dc9357SAndroid Build Coastguard Worker {
5955*f6dc9357SAndroid Build Coastguard Worker Clear();
5956*f6dc9357SAndroid Build Coastguard Worker
5957*f6dc9357SAndroid Build Coastguard Worker RINOK(InStream_GetPos(inStream, StartOffset))
5958*f6dc9357SAndroid Build Coastguard Worker
5959*f6dc9357SAndroid Build Coastguard Worker const UInt32 kStartHeaderSize = 4 * 7;
5960*f6dc9357SAndroid Build Coastguard Worker const unsigned kStep = 512; // nsis start is aligned for 512
5961*f6dc9357SAndroid Build Coastguard Worker Byte buf[kStep];
5962*f6dc9357SAndroid Build Coastguard Worker UInt64 pos = StartOffset;
5963*f6dc9357SAndroid Build Coastguard Worker size_t bufSize = 0;
5964*f6dc9357SAndroid Build Coastguard Worker UInt64 pePos = (UInt64)(Int64)-1;
5965*f6dc9357SAndroid Build Coastguard Worker
5966*f6dc9357SAndroid Build Coastguard Worker for (;;)
5967*f6dc9357SAndroid Build Coastguard Worker {
5968*f6dc9357SAndroid Build Coastguard Worker bufSize = kStep;
5969*f6dc9357SAndroid Build Coastguard Worker RINOK(ReadStream(inStream, buf, &bufSize))
5970*f6dc9357SAndroid Build Coastguard Worker if (bufSize < kStartHeaderSize)
5971*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5972*f6dc9357SAndroid Build Coastguard Worker if (memcmp(buf + 4, kSignature, kSignatureSize) == 0)
5973*f6dc9357SAndroid Build Coastguard Worker break;
5974*f6dc9357SAndroid Build Coastguard Worker if (IsArc_Pe(buf, bufSize))
5975*f6dc9357SAndroid Build Coastguard Worker pePos = pos;
5976*f6dc9357SAndroid Build Coastguard Worker pos += kStep;
5977*f6dc9357SAndroid Build Coastguard Worker UInt64 proc = pos - StartOffset;
5978*f6dc9357SAndroid Build Coastguard Worker if (maxCheckStartPosition && proc > *maxCheckStartPosition)
5979*f6dc9357SAndroid Build Coastguard Worker {
5980*f6dc9357SAndroid Build Coastguard Worker if (pePos == 0)
5981*f6dc9357SAndroid Build Coastguard Worker {
5982*f6dc9357SAndroid Build Coastguard Worker if (proc > (1 << 20))
5983*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5984*f6dc9357SAndroid Build Coastguard Worker }
5985*f6dc9357SAndroid Build Coastguard Worker else
5986*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
5987*f6dc9357SAndroid Build Coastguard Worker }
5988*f6dc9357SAndroid Build Coastguard Worker }
5989*f6dc9357SAndroid Build Coastguard Worker
5990*f6dc9357SAndroid Build Coastguard Worker if (pePos == (UInt64)(Int64)-1)
5991*f6dc9357SAndroid Build Coastguard Worker {
5992*f6dc9357SAndroid Build Coastguard Worker UInt64 posCur = StartOffset;
5993*f6dc9357SAndroid Build Coastguard Worker for (;;)
5994*f6dc9357SAndroid Build Coastguard Worker {
5995*f6dc9357SAndroid Build Coastguard Worker if (posCur < kStep)
5996*f6dc9357SAndroid Build Coastguard Worker break;
5997*f6dc9357SAndroid Build Coastguard Worker posCur -= kStep;
5998*f6dc9357SAndroid Build Coastguard Worker if (pos - posCur > (1 << 20))
5999*f6dc9357SAndroid Build Coastguard Worker break;
6000*f6dc9357SAndroid Build Coastguard Worker bufSize = kStep;
6001*f6dc9357SAndroid Build Coastguard Worker RINOK(InStream_SeekSet(inStream, posCur))
6002*f6dc9357SAndroid Build Coastguard Worker RINOK(ReadStream(inStream, buf, &bufSize))
6003*f6dc9357SAndroid Build Coastguard Worker if (bufSize < kStep)
6004*f6dc9357SAndroid Build Coastguard Worker break;
6005*f6dc9357SAndroid Build Coastguard Worker if (IsArc_Pe(buf, bufSize))
6006*f6dc9357SAndroid Build Coastguard Worker {
6007*f6dc9357SAndroid Build Coastguard Worker pePos = posCur;
6008*f6dc9357SAndroid Build Coastguard Worker break;
6009*f6dc9357SAndroid Build Coastguard Worker }
6010*f6dc9357SAndroid Build Coastguard Worker }
6011*f6dc9357SAndroid Build Coastguard Worker
6012*f6dc9357SAndroid Build Coastguard Worker // restore buf to nsis header
6013*f6dc9357SAndroid Build Coastguard Worker bufSize = kStep;
6014*f6dc9357SAndroid Build Coastguard Worker RINOK(InStream_SeekSet(inStream, pos))
6015*f6dc9357SAndroid Build Coastguard Worker RINOK(ReadStream(inStream, buf, &bufSize))
6016*f6dc9357SAndroid Build Coastguard Worker if (bufSize < kStartHeaderSize)
6017*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
6018*f6dc9357SAndroid Build Coastguard Worker }
6019*f6dc9357SAndroid Build Coastguard Worker
6020*f6dc9357SAndroid Build Coastguard Worker StartOffset = pos;
6021*f6dc9357SAndroid Build Coastguard Worker UInt32 peSize = 0;
6022*f6dc9357SAndroid Build Coastguard Worker
6023*f6dc9357SAndroid Build Coastguard Worker if (pePos != (UInt64)(Int64)-1)
6024*f6dc9357SAndroid Build Coastguard Worker {
6025*f6dc9357SAndroid Build Coastguard Worker UInt64 peSize64 = (pos - pePos);
6026*f6dc9357SAndroid Build Coastguard Worker if (peSize64 < (1 << 20))
6027*f6dc9357SAndroid Build Coastguard Worker {
6028*f6dc9357SAndroid Build Coastguard Worker peSize = (UInt32)peSize64;
6029*f6dc9357SAndroid Build Coastguard Worker StartOffset = pePos;
6030*f6dc9357SAndroid Build Coastguard Worker }
6031*f6dc9357SAndroid Build Coastguard Worker }
6032*f6dc9357SAndroid Build Coastguard Worker
6033*f6dc9357SAndroid Build Coastguard Worker DataStreamOffset = pos + kStartHeaderSize;
6034*f6dc9357SAndroid Build Coastguard Worker FirstHeader.Flags = Get32(buf);
6035*f6dc9357SAndroid Build Coastguard Worker if ((FirstHeader.Flags & (~kFlagsMask)) != 0)
6036*f6dc9357SAndroid Build Coastguard Worker {
6037*f6dc9357SAndroid Build Coastguard Worker // return E_NOTIMPL;
6038*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
6039*f6dc9357SAndroid Build Coastguard Worker }
6040*f6dc9357SAndroid Build Coastguard Worker IsInstaller = (FirstHeader.Flags & NFlags::kUninstall) == 0;
6041*f6dc9357SAndroid Build Coastguard Worker
6042*f6dc9357SAndroid Build Coastguard Worker FirstHeader.HeaderSize = Get32(buf + kSignatureSize + 4);
6043*f6dc9357SAndroid Build Coastguard Worker FirstHeader.ArcSize = Get32(buf + kSignatureSize + 8);
6044*f6dc9357SAndroid Build Coastguard Worker if (FirstHeader.ArcSize <= kStartHeaderSize)
6045*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
6046*f6dc9357SAndroid Build Coastguard Worker
6047*f6dc9357SAndroid Build Coastguard Worker /*
6048*f6dc9357SAndroid Build Coastguard Worker if ((FirstHeader.Flags & NFlags::k_BI_ExternalFileSupport) != 0)
6049*f6dc9357SAndroid Build Coastguard Worker {
6050*f6dc9357SAndroid Build Coastguard Worker UInt32 datablock_low = Get32(buf + kSignatureSize + 12);
6051*f6dc9357SAndroid Build Coastguard Worker UInt32 datablock_high = Get32(buf + kSignatureSize + 16);
6052*f6dc9357SAndroid Build Coastguard Worker }
6053*f6dc9357SAndroid Build Coastguard Worker */
6054*f6dc9357SAndroid Build Coastguard Worker
6055*f6dc9357SAndroid Build Coastguard Worker RINOK(InStream_GetSize_SeekToEnd(inStream, _fileSize))
6056*f6dc9357SAndroid Build Coastguard Worker
6057*f6dc9357SAndroid Build Coastguard Worker IsArc = true;
6058*f6dc9357SAndroid Build Coastguard Worker
6059*f6dc9357SAndroid Build Coastguard Worker if (peSize != 0)
6060*f6dc9357SAndroid Build Coastguard Worker {
6061*f6dc9357SAndroid Build Coastguard Worker ExeStub.Alloc(peSize);
6062*f6dc9357SAndroid Build Coastguard Worker RINOK(InStream_SeekSet(inStream, pePos))
6063*f6dc9357SAndroid Build Coastguard Worker RINOK(ReadStream_FALSE(inStream, ExeStub, peSize))
6064*f6dc9357SAndroid Build Coastguard Worker }
6065*f6dc9357SAndroid Build Coastguard Worker
6066*f6dc9357SAndroid Build Coastguard Worker HRESULT res = S_FALSE;
6067*f6dc9357SAndroid Build Coastguard Worker try
6068*f6dc9357SAndroid Build Coastguard Worker {
6069*f6dc9357SAndroid Build Coastguard Worker CLimitedInStream *_limitedStreamSpec = new CLimitedInStream;
6070*f6dc9357SAndroid Build Coastguard Worker _stream = _limitedStreamSpec;
6071*f6dc9357SAndroid Build Coastguard Worker _limitedStreamSpec->SetStream(inStream);
6072*f6dc9357SAndroid Build Coastguard Worker _limitedStreamSpec->InitAndSeek(pos, FirstHeader.ArcSize);
6073*f6dc9357SAndroid Build Coastguard Worker DataStreamOffset -= pos;
6074*f6dc9357SAndroid Build Coastguard Worker res = Open2(buf + kStartHeaderSize, bufSize - kStartHeaderSize);
6075*f6dc9357SAndroid Build Coastguard Worker }
6076*f6dc9357SAndroid Build Coastguard Worker catch(...)
6077*f6dc9357SAndroid Build Coastguard Worker {
6078*f6dc9357SAndroid Build Coastguard Worker _stream.Release();
6079*f6dc9357SAndroid Build Coastguard Worker throw;
6080*f6dc9357SAndroid Build Coastguard Worker // res = S_FALSE;
6081*f6dc9357SAndroid Build Coastguard Worker }
6082*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK)
6083*f6dc9357SAndroid Build Coastguard Worker {
6084*f6dc9357SAndroid Build Coastguard Worker _stream.Release();
6085*f6dc9357SAndroid Build Coastguard Worker // Clear();
6086*f6dc9357SAndroid Build Coastguard Worker }
6087*f6dc9357SAndroid Build Coastguard Worker return res;
6088*f6dc9357SAndroid Build Coastguard Worker }
6089*f6dc9357SAndroid Build Coastguard Worker
ConvertToUnicode(const AString & s) const6090*f6dc9357SAndroid Build Coastguard Worker UString CInArchive::ConvertToUnicode(const AString &s) const
6091*f6dc9357SAndroid Build Coastguard Worker {
6092*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode)
6093*f6dc9357SAndroid Build Coastguard Worker {
6094*f6dc9357SAndroid Build Coastguard Worker UString res;
6095*f6dc9357SAndroid Build Coastguard Worker // if (
6096*f6dc9357SAndroid Build Coastguard Worker ConvertUTF8ToUnicode(s, res);
6097*f6dc9357SAndroid Build Coastguard Worker return res;
6098*f6dc9357SAndroid Build Coastguard Worker }
6099*f6dc9357SAndroid Build Coastguard Worker return MultiByteToUnicodeString(s);
6100*f6dc9357SAndroid Build Coastguard Worker }
6101*f6dc9357SAndroid Build Coastguard Worker
Clear2()6102*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Clear2()
6103*f6dc9357SAndroid Build Coastguard Worker {
6104*f6dc9357SAndroid Build Coastguard Worker IsUnicode = false;
6105*f6dc9357SAndroid Build Coastguard Worker NsisType = k_NsisType_Nsis2;
6106*f6dc9357SAndroid Build Coastguard Worker IsNsis225 = false;
6107*f6dc9357SAndroid Build Coastguard Worker IsNsis200 = false;
6108*f6dc9357SAndroid Build Coastguard Worker LogCmdIsEnabled = false;
6109*f6dc9357SAndroid Build Coastguard Worker BadCmd = -1;
6110*f6dc9357SAndroid Build Coastguard Worker Is64Bit = false;
6111*f6dc9357SAndroid Build Coastguard Worker
6112*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT
6113*f6dc9357SAndroid Build Coastguard Worker Name.Empty();
6114*f6dc9357SAndroid Build Coastguard Worker BrandingText.Empty();
6115*f6dc9357SAndroid Build Coastguard Worker Script.Empty();
6116*f6dc9357SAndroid Build Coastguard Worker LicenseFiles.Clear();
6117*f6dc9357SAndroid Build Coastguard Worker _numRootLicenses = 0;
6118*f6dc9357SAndroid Build Coastguard Worker _numLangStrings = 0;
6119*f6dc9357SAndroid Build Coastguard Worker langStrIDs.Clear();
6120*f6dc9357SAndroid Build Coastguard Worker LangComment.Empty();
6121*f6dc9357SAndroid Build Coastguard Worker noParseStringIndexes.Clear();
6122*f6dc9357SAndroid Build Coastguard Worker #endif
6123*f6dc9357SAndroid Build Coastguard Worker
6124*f6dc9357SAndroid Build Coastguard Worker APrefixes.Clear();
6125*f6dc9357SAndroid Build Coastguard Worker UPrefixes.Clear();
6126*f6dc9357SAndroid Build Coastguard Worker Items.Clear();
6127*f6dc9357SAndroid Build Coastguard Worker IsUnicode = false;
6128*f6dc9357SAndroid Build Coastguard Worker ExeStub.Free();
6129*f6dc9357SAndroid Build Coastguard Worker }
6130*f6dc9357SAndroid Build Coastguard Worker
Clear()6131*f6dc9357SAndroid Build Coastguard Worker void CInArchive::Clear()
6132*f6dc9357SAndroid Build Coastguard Worker {
6133*f6dc9357SAndroid Build Coastguard Worker Clear2();
6134*f6dc9357SAndroid Build Coastguard Worker IsArc = false;
6135*f6dc9357SAndroid Build Coastguard Worker _stream.Release();
6136*f6dc9357SAndroid Build Coastguard Worker }
6137*f6dc9357SAndroid Build Coastguard Worker
6138*f6dc9357SAndroid Build Coastguard Worker }}
6139