xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/GUI/GUI.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // GUI.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/DllSecur.h"
7*f6dc9357SAndroid Build Coastguard Worker #endif
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyWindows.h"
10*f6dc9357SAndroid Build Coastguard Worker #if defined(__MINGW32__) || defined(__MINGW64__)
11*f6dc9357SAndroid Build Coastguard Worker #include <shlwapi.h>
12*f6dc9357SAndroid Build Coastguard Worker #else
13*f6dc9357SAndroid Build Coastguard Worker #include <Shlwapi.h>
14*f6dc9357SAndroid Build Coastguard Worker #endif
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyInitGuid.h"
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/CommandLineParser.h"
19*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyException.h"
20*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
23*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/NtCheck.h"
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ArchiveCommandLine.h"
26*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ExitCode.h"
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/StringUtils.h"
29*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/LangUtils.h"
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker #include "BenchmarkDialog.h"
32*f6dc9357SAndroid Build Coastguard Worker #include "ExtractGUI.h"
33*f6dc9357SAndroid Build Coastguard Worker #include "HashGUI.h"
34*f6dc9357SAndroid Build Coastguard Worker #include "UpdateGUI.h"
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker #include "ExtractRes.h"
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
39*f6dc9357SAndroid Build Coastguard Worker 
40*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
41*f6dc9357SAndroid Build Coastguard Worker extern
42*f6dc9357SAndroid Build Coastguard Worker const CExternalCodecs *g_ExternalCodecs_Ptr;
43*f6dc9357SAndroid Build Coastguard Worker const CExternalCodecs *g_ExternalCodecs_Ptr;
44*f6dc9357SAndroid Build Coastguard Worker #endif
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker extern
47*f6dc9357SAndroid Build Coastguard Worker HINSTANCE g_hInstance;
48*f6dc9357SAndroid Build Coastguard Worker HINSTANCE g_hInstance;
49*f6dc9357SAndroid Build Coastguard Worker extern
50*f6dc9357SAndroid Build Coastguard Worker bool g_DisableUserQuestions;
51*f6dc9357SAndroid Build Coastguard Worker bool g_DisableUserQuestions;
52*f6dc9357SAndroid Build Coastguard Worker 
53*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker #if !defined(Z7_WIN32_WINNT_MIN) || Z7_WIN32_WINNT_MIN < 0x0500  // win2000
56*f6dc9357SAndroid Build Coastguard Worker #define Z7_USE_DYN_ComCtl32Version
57*f6dc9357SAndroid Build Coastguard Worker #endif
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_DYN_ComCtl32Version
60*f6dc9357SAndroid Build Coastguard Worker Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker extern
63*f6dc9357SAndroid Build Coastguard Worker DWORD g_ComCtl32Version;
64*f6dc9357SAndroid Build Coastguard Worker DWORD g_ComCtl32Version;
65*f6dc9357SAndroid Build Coastguard Worker 
GetDllVersion(LPCTSTR dllName)66*f6dc9357SAndroid Build Coastguard Worker static DWORD GetDllVersion(LPCTSTR dllName)
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker   DWORD dwVersion = 0;
69*f6dc9357SAndroid Build Coastguard Worker   const HMODULE hmodule = LoadLibrary(dllName);
70*f6dc9357SAndroid Build Coastguard Worker   if (hmodule)
71*f6dc9357SAndroid Build Coastguard Worker   {
72*f6dc9357SAndroid Build Coastguard Worker     const
73*f6dc9357SAndroid Build Coastguard Worker      DLLGETVERSIONPROC f_DllGetVersion = Z7_GET_PROC_ADDRESS(
74*f6dc9357SAndroid Build Coastguard Worker      DLLGETVERSIONPROC, hmodule,
75*f6dc9357SAndroid Build Coastguard Worker     "DllGetVersion");
76*f6dc9357SAndroid Build Coastguard Worker     if (f_DllGetVersion)
77*f6dc9357SAndroid Build Coastguard Worker     {
78*f6dc9357SAndroid Build Coastguard Worker       DLLVERSIONINFO dvi;
79*f6dc9357SAndroid Build Coastguard Worker       ZeroMemory(&dvi, sizeof(dvi));
80*f6dc9357SAndroid Build Coastguard Worker       dvi.cbSize = sizeof(dvi);
81*f6dc9357SAndroid Build Coastguard Worker       const HRESULT hr = (*f_DllGetVersion)(&dvi);
82*f6dc9357SAndroid Build Coastguard Worker       if (SUCCEEDED(hr))
83*f6dc9357SAndroid Build Coastguard Worker         dwVersion = (DWORD)MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion);
84*f6dc9357SAndroid Build Coastguard Worker     }
85*f6dc9357SAndroid Build Coastguard Worker     FreeLibrary(hmodule);
86*f6dc9357SAndroid Build Coastguard Worker   }
87*f6dc9357SAndroid Build Coastguard Worker   return dwVersion;
88*f6dc9357SAndroid Build Coastguard Worker }
89*f6dc9357SAndroid Build Coastguard Worker 
90*f6dc9357SAndroid Build Coastguard Worker #endif
91*f6dc9357SAndroid Build Coastguard Worker #endif
92*f6dc9357SAndroid Build Coastguard Worker 
93*f6dc9357SAndroid Build Coastguard Worker extern
94*f6dc9357SAndroid Build Coastguard Worker bool g_LVN_ITEMACTIVATE_Support;
95*f6dc9357SAndroid Build Coastguard Worker bool g_LVN_ITEMACTIVATE_Support = true;
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker DECLARE_AND_SET_CLIENT_VERSION_VAR
98*f6dc9357SAndroid Build Coastguard Worker 
ErrorMessage(LPCWSTR message)99*f6dc9357SAndroid Build Coastguard Worker static void ErrorMessage(LPCWSTR message)
100*f6dc9357SAndroid Build Coastguard Worker {
101*f6dc9357SAndroid Build Coastguard Worker   if (!g_DisableUserQuestions)
102*f6dc9357SAndroid Build Coastguard Worker     MessageBoxW(NULL, message, L"7-Zip", MB_ICONERROR | MB_OK);
103*f6dc9357SAndroid Build Coastguard Worker }
104*f6dc9357SAndroid Build Coastguard Worker 
ErrorMessage(const char * s)105*f6dc9357SAndroid Build Coastguard Worker static void ErrorMessage(const char *s)
106*f6dc9357SAndroid Build Coastguard Worker {
107*f6dc9357SAndroid Build Coastguard Worker   ErrorMessage(GetUnicodeString(s));
108*f6dc9357SAndroid Build Coastguard Worker }
109*f6dc9357SAndroid Build Coastguard Worker 
ErrorLangMessage(UINT resourceID)110*f6dc9357SAndroid Build Coastguard Worker static void ErrorLangMessage(UINT resourceID)
111*f6dc9357SAndroid Build Coastguard Worker {
112*f6dc9357SAndroid Build Coastguard Worker   ErrorMessage(LangString(resourceID));
113*f6dc9357SAndroid Build Coastguard Worker }
114*f6dc9357SAndroid Build Coastguard Worker 
115*f6dc9357SAndroid Build Coastguard Worker static const char * const kNoFormats = "7-Zip cannot find the code that works with archives.";
116*f6dc9357SAndroid Build Coastguard Worker 
ShowMemErrorMessage()117*f6dc9357SAndroid Build Coastguard Worker static int ShowMemErrorMessage()
118*f6dc9357SAndroid Build Coastguard Worker {
119*f6dc9357SAndroid Build Coastguard Worker   ErrorLangMessage(IDS_MEM_ERROR);
120*f6dc9357SAndroid Build Coastguard Worker   return NExitCode::kMemoryError;
121*f6dc9357SAndroid Build Coastguard Worker }
122*f6dc9357SAndroid Build Coastguard Worker 
ShowSysErrorMessage(HRESULT errorCode)123*f6dc9357SAndroid Build Coastguard Worker static int ShowSysErrorMessage(HRESULT errorCode)
124*f6dc9357SAndroid Build Coastguard Worker {
125*f6dc9357SAndroid Build Coastguard Worker   if (errorCode == E_OUTOFMEMORY)
126*f6dc9357SAndroid Build Coastguard Worker     return ShowMemErrorMessage();
127*f6dc9357SAndroid Build Coastguard Worker   ErrorMessage(HResultToMessage(errorCode));
128*f6dc9357SAndroid Build Coastguard Worker   return NExitCode::kFatalError;
129*f6dc9357SAndroid Build Coastguard Worker }
130*f6dc9357SAndroid Build Coastguard Worker 
ThrowException_if_Error(HRESULT res)131*f6dc9357SAndroid Build Coastguard Worker static void ThrowException_if_Error(HRESULT res)
132*f6dc9357SAndroid Build Coastguard Worker {
133*f6dc9357SAndroid Build Coastguard Worker   if (res != S_OK)
134*f6dc9357SAndroid Build Coastguard Worker     throw CSystemException(res);
135*f6dc9357SAndroid Build Coastguard Worker }
136*f6dc9357SAndroid Build Coastguard Worker 
Main2()137*f6dc9357SAndroid Build Coastguard Worker static int Main2()
138*f6dc9357SAndroid Build Coastguard Worker {
139*f6dc9357SAndroid Build Coastguard Worker   UStringVector commandStrings;
140*f6dc9357SAndroid Build Coastguard Worker   NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);
141*f6dc9357SAndroid Build Coastguard Worker 
142*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
143*f6dc9357SAndroid Build Coastguard Worker   if (commandStrings.Size() > 0)
144*f6dc9357SAndroid Build Coastguard Worker     commandStrings.Delete(0);
145*f6dc9357SAndroid Build Coastguard Worker   #endif
146*f6dc9357SAndroid Build Coastguard Worker   if (commandStrings.Size() == 0)
147*f6dc9357SAndroid Build Coastguard Worker   {
148*f6dc9357SAndroid Build Coastguard Worker     MessageBoxW(NULL, L"Specify command", L"7-Zip", 0);
149*f6dc9357SAndroid Build Coastguard Worker     return 0;
150*f6dc9357SAndroid Build Coastguard Worker   }
151*f6dc9357SAndroid Build Coastguard Worker 
152*f6dc9357SAndroid Build Coastguard Worker   CArcCmdLineOptions options;
153*f6dc9357SAndroid Build Coastguard Worker   CArcCmdLineParser parser;
154*f6dc9357SAndroid Build Coastguard Worker 
155*f6dc9357SAndroid Build Coastguard Worker   parser.Parse1(commandStrings, options);
156*f6dc9357SAndroid Build Coastguard Worker   g_DisableUserQuestions = options.YesToAll;
157*f6dc9357SAndroid Build Coastguard Worker   parser.Parse2(options);
158*f6dc9357SAndroid Build Coastguard Worker 
159*f6dc9357SAndroid Build Coastguard Worker   CREATE_CODECS_OBJECT
160*f6dc9357SAndroid Build Coastguard Worker 
161*f6dc9357SAndroid Build Coastguard Worker   codecs->CaseSensitive_Change = options.CaseSensitive_Change;
162*f6dc9357SAndroid Build Coastguard Worker   codecs->CaseSensitive = options.CaseSensitive;
163*f6dc9357SAndroid Build Coastguard Worker   ThrowException_if_Error(codecs->Load());
164*f6dc9357SAndroid Build Coastguard Worker   Codecs_AddHashArcHandler(codecs);
165*f6dc9357SAndroid Build Coastguard Worker 
166*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
167*f6dc9357SAndroid Build Coastguard Worker   {
168*f6dc9357SAndroid Build Coastguard Worker     g_ExternalCodecs_Ptr = &_externalCodecs;
169*f6dc9357SAndroid Build Coastguard Worker     UString s;
170*f6dc9357SAndroid Build Coastguard Worker     codecs->GetCodecsErrorMessage(s);
171*f6dc9357SAndroid Build Coastguard Worker     if (!s.IsEmpty())
172*f6dc9357SAndroid Build Coastguard Worker     {
173*f6dc9357SAndroid Build Coastguard Worker       if (!g_DisableUserQuestions)
174*f6dc9357SAndroid Build Coastguard Worker         MessageBoxW(NULL, s, L"7-Zip", MB_ICONERROR);
175*f6dc9357SAndroid Build Coastguard Worker     }
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker   }
178*f6dc9357SAndroid Build Coastguard Worker   #endif
179*f6dc9357SAndroid Build Coastguard Worker 
180*f6dc9357SAndroid Build Coastguard Worker   const bool isExtractGroupCommand = options.Command.IsFromExtractGroup();
181*f6dc9357SAndroid Build Coastguard Worker 
182*f6dc9357SAndroid Build Coastguard Worker   if (codecs->Formats.Size() == 0 &&
183*f6dc9357SAndroid Build Coastguard Worker         (isExtractGroupCommand
184*f6dc9357SAndroid Build Coastguard Worker 
185*f6dc9357SAndroid Build Coastguard Worker         || options.Command.IsFromUpdateGroup()))
186*f6dc9357SAndroid Build Coastguard Worker   {
187*f6dc9357SAndroid Build Coastguard Worker     #ifdef Z7_EXTERNAL_CODECS
188*f6dc9357SAndroid Build Coastguard Worker     if (!codecs->MainDll_ErrorPath.IsEmpty())
189*f6dc9357SAndroid Build Coastguard Worker     {
190*f6dc9357SAndroid Build Coastguard Worker       UString s ("7-Zip cannot load module: ");
191*f6dc9357SAndroid Build Coastguard Worker       s += fs2us(codecs->MainDll_ErrorPath);
192*f6dc9357SAndroid Build Coastguard Worker       throw s;
193*f6dc9357SAndroid Build Coastguard Worker     }
194*f6dc9357SAndroid Build Coastguard Worker     #endif
195*f6dc9357SAndroid Build Coastguard Worker     throw kNoFormats;
196*f6dc9357SAndroid Build Coastguard Worker   }
197*f6dc9357SAndroid Build Coastguard Worker 
198*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<COpenType> formatIndices;
199*f6dc9357SAndroid Build Coastguard Worker   if (!ParseOpenTypes(*codecs, options.ArcType, formatIndices))
200*f6dc9357SAndroid Build Coastguard Worker   {
201*f6dc9357SAndroid Build Coastguard Worker     ErrorLangMessage(IDS_UNSUPPORTED_ARCHIVE_TYPE);
202*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kFatalError;
203*f6dc9357SAndroid Build Coastguard Worker   }
204*f6dc9357SAndroid Build Coastguard Worker 
205*f6dc9357SAndroid Build Coastguard Worker   CIntVector excludedFormats;
206*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (k, options.ExcludedArcTypes)
207*f6dc9357SAndroid Build Coastguard Worker   {
208*f6dc9357SAndroid Build Coastguard Worker     CIntVector tempIndices;
209*f6dc9357SAndroid Build Coastguard Worker     if (!codecs->FindFormatForArchiveType(options.ExcludedArcTypes[k], tempIndices)
210*f6dc9357SAndroid Build Coastguard Worker         || tempIndices.Size() != 1)
211*f6dc9357SAndroid Build Coastguard Worker     {
212*f6dc9357SAndroid Build Coastguard Worker       ErrorLangMessage(IDS_UNSUPPORTED_ARCHIVE_TYPE);
213*f6dc9357SAndroid Build Coastguard Worker       return NExitCode::kFatalError;
214*f6dc9357SAndroid Build Coastguard Worker     }
215*f6dc9357SAndroid Build Coastguard Worker     excludedFormats.AddToUniqueSorted(tempIndices[0]);
216*f6dc9357SAndroid Build Coastguard Worker     // excludedFormats.Sort();
217*f6dc9357SAndroid Build Coastguard Worker   }
218*f6dc9357SAndroid Build Coastguard Worker 
219*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
220*f6dc9357SAndroid Build Coastguard Worker   if (isExtractGroupCommand
221*f6dc9357SAndroid Build Coastguard Worker       || options.Command.IsFromUpdateGroup()
222*f6dc9357SAndroid Build Coastguard Worker       || options.Command.CommandType == NCommandType::kHash
223*f6dc9357SAndroid Build Coastguard Worker       || options.Command.CommandType == NCommandType::kBenchmark)
224*f6dc9357SAndroid Build Coastguard Worker     ThrowException_if_Error(_externalCodecs.Load());
225*f6dc9357SAndroid Build Coastguard Worker   #endif
226*f6dc9357SAndroid Build Coastguard Worker 
227*f6dc9357SAndroid Build Coastguard Worker   if (options.Command.CommandType == NCommandType::kBenchmark)
228*f6dc9357SAndroid Build Coastguard Worker   {
229*f6dc9357SAndroid Build Coastguard Worker     HRESULT res = Benchmark(
230*f6dc9357SAndroid Build Coastguard Worker         EXTERNAL_CODECS_VARS_L
231*f6dc9357SAndroid Build Coastguard Worker         options.Properties,
232*f6dc9357SAndroid Build Coastguard Worker         options.NumIterations_Defined ?
233*f6dc9357SAndroid Build Coastguard Worker           options.NumIterations :
234*f6dc9357SAndroid Build Coastguard Worker           k_NumBenchIterations_Default);
235*f6dc9357SAndroid Build Coastguard Worker     /*
236*f6dc9357SAndroid Build Coastguard Worker     if (res == S_FALSE)
237*f6dc9357SAndroid Build Coastguard Worker     {
238*f6dc9357SAndroid Build Coastguard Worker       stdStream << "\nDecoding Error\n";
239*f6dc9357SAndroid Build Coastguard Worker       return NExitCode::kFatalError;
240*f6dc9357SAndroid Build Coastguard Worker     }
241*f6dc9357SAndroid Build Coastguard Worker     */
242*f6dc9357SAndroid Build Coastguard Worker     ThrowException_if_Error(res);
243*f6dc9357SAndroid Build Coastguard Worker   }
244*f6dc9357SAndroid Build Coastguard Worker   else if (isExtractGroupCommand)
245*f6dc9357SAndroid Build Coastguard Worker   {
246*f6dc9357SAndroid Build Coastguard Worker     UStringVector ArchivePathsSorted;
247*f6dc9357SAndroid Build Coastguard Worker     UStringVector ArchivePathsFullSorted;
248*f6dc9357SAndroid Build Coastguard Worker 
249*f6dc9357SAndroid Build Coastguard Worker     CExtractCallbackImp *ecs = new CExtractCallbackImp;
250*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;
251*f6dc9357SAndroid Build Coastguard Worker 
252*f6dc9357SAndroid Build Coastguard Worker     #ifndef Z7_NO_CRYPTO
253*f6dc9357SAndroid Build Coastguard Worker     ecs->PasswordIsDefined = options.PasswordEnabled;
254*f6dc9357SAndroid Build Coastguard Worker     ecs->Password = options.Password;
255*f6dc9357SAndroid Build Coastguard Worker     #endif
256*f6dc9357SAndroid Build Coastguard Worker 
257*f6dc9357SAndroid Build Coastguard Worker     ecs->Init();
258*f6dc9357SAndroid Build Coastguard Worker 
259*f6dc9357SAndroid Build Coastguard Worker     CExtractOptions eo;
260*f6dc9357SAndroid Build Coastguard Worker     (CExtractOptionsBase &)eo = options.ExtractOptions;
261*f6dc9357SAndroid Build Coastguard Worker     eo.StdInMode = options.StdInMode;
262*f6dc9357SAndroid Build Coastguard Worker     eo.StdOutMode = options.StdOutMode;
263*f6dc9357SAndroid Build Coastguard Worker     eo.YesToAll = options.YesToAll;
264*f6dc9357SAndroid Build Coastguard Worker     ecs->YesToAll = options.YesToAll;
265*f6dc9357SAndroid Build Coastguard Worker     eo.TestMode = options.Command.IsTestCommand();
266*f6dc9357SAndroid Build Coastguard Worker     ecs->TestMode = eo.TestMode;
267*f6dc9357SAndroid Build Coastguard Worker 
268*f6dc9357SAndroid Build Coastguard Worker     #ifndef Z7_SFX
269*f6dc9357SAndroid Build Coastguard Worker     eo.Properties = options.Properties;
270*f6dc9357SAndroid Build Coastguard Worker     #endif
271*f6dc9357SAndroid Build Coastguard Worker 
272*f6dc9357SAndroid Build Coastguard Worker     bool messageWasDisplayed = false;
273*f6dc9357SAndroid Build Coastguard Worker 
274*f6dc9357SAndroid Build Coastguard Worker     #ifndef Z7_SFX
275*f6dc9357SAndroid Build Coastguard Worker     CHashBundle hb;
276*f6dc9357SAndroid Build Coastguard Worker     CHashBundle *hb_ptr = NULL;
277*f6dc9357SAndroid Build Coastguard Worker 
278*f6dc9357SAndroid Build Coastguard Worker     if (!options.HashMethods.IsEmpty())
279*f6dc9357SAndroid Build Coastguard Worker     {
280*f6dc9357SAndroid Build Coastguard Worker       hb_ptr = &hb;
281*f6dc9357SAndroid Build Coastguard Worker       ThrowException_if_Error(hb.SetMethods(EXTERNAL_CODECS_VARS_L options.HashMethods));
282*f6dc9357SAndroid Build Coastguard Worker     }
283*f6dc9357SAndroid Build Coastguard Worker     #endif
284*f6dc9357SAndroid Build Coastguard Worker 
285*f6dc9357SAndroid Build Coastguard Worker     {
286*f6dc9357SAndroid Build Coastguard Worker       CDirItemsStat st;
287*f6dc9357SAndroid Build Coastguard Worker       HRESULT hresultMain = EnumerateDirItemsAndSort(
288*f6dc9357SAndroid Build Coastguard Worker           options.arcCensor,
289*f6dc9357SAndroid Build Coastguard Worker           NWildcard::k_RelatPath,
290*f6dc9357SAndroid Build Coastguard Worker           UString(), // addPathPrefix
291*f6dc9357SAndroid Build Coastguard Worker           ArchivePathsSorted,
292*f6dc9357SAndroid Build Coastguard Worker           ArchivePathsFullSorted,
293*f6dc9357SAndroid Build Coastguard Worker           st,
294*f6dc9357SAndroid Build Coastguard Worker           NULL // &scan: change it!!!!
295*f6dc9357SAndroid Build Coastguard Worker           );
296*f6dc9357SAndroid Build Coastguard Worker       if (hresultMain != S_OK)
297*f6dc9357SAndroid Build Coastguard Worker       {
298*f6dc9357SAndroid Build Coastguard Worker         /*
299*f6dc9357SAndroid Build Coastguard Worker         if (hresultMain != E_ABORT && messageWasDisplayed)
300*f6dc9357SAndroid Build Coastguard Worker           return NExitCode::kFatalError;
301*f6dc9357SAndroid Build Coastguard Worker         */
302*f6dc9357SAndroid Build Coastguard Worker         throw CSystemException(hresultMain);
303*f6dc9357SAndroid Build Coastguard Worker       }
304*f6dc9357SAndroid Build Coastguard Worker     }
305*f6dc9357SAndroid Build Coastguard Worker 
306*f6dc9357SAndroid Build Coastguard Worker     ecs->MultiArcMode = (ArchivePathsSorted.Size() > 1);
307*f6dc9357SAndroid Build Coastguard Worker 
308*f6dc9357SAndroid Build Coastguard Worker     HRESULT result = ExtractGUI(
309*f6dc9357SAndroid Build Coastguard Worker           // EXTERNAL_CODECS_VARS_L
310*f6dc9357SAndroid Build Coastguard Worker           codecs,
311*f6dc9357SAndroid Build Coastguard Worker           formatIndices, excludedFormats,
312*f6dc9357SAndroid Build Coastguard Worker           ArchivePathsSorted,
313*f6dc9357SAndroid Build Coastguard Worker           ArchivePathsFullSorted,
314*f6dc9357SAndroid Build Coastguard Worker           options.Censor.Pairs.Front().Head,
315*f6dc9357SAndroid Build Coastguard Worker           eo,
316*f6dc9357SAndroid Build Coastguard Worker           #ifndef Z7_SFX
317*f6dc9357SAndroid Build Coastguard Worker           hb_ptr,
318*f6dc9357SAndroid Build Coastguard Worker           #endif
319*f6dc9357SAndroid Build Coastguard Worker           options.ShowDialog, messageWasDisplayed, ecs);
320*f6dc9357SAndroid Build Coastguard Worker     if (result != S_OK)
321*f6dc9357SAndroid Build Coastguard Worker     {
322*f6dc9357SAndroid Build Coastguard Worker       if (result != E_ABORT && messageWasDisplayed)
323*f6dc9357SAndroid Build Coastguard Worker         return NExitCode::kFatalError;
324*f6dc9357SAndroid Build Coastguard Worker       throw CSystemException(result);
325*f6dc9357SAndroid Build Coastguard Worker     }
326*f6dc9357SAndroid Build Coastguard Worker     if (!ecs->IsOK())
327*f6dc9357SAndroid Build Coastguard Worker       return NExitCode::kFatalError;
328*f6dc9357SAndroid Build Coastguard Worker   }
329*f6dc9357SAndroid Build Coastguard Worker   else if (options.Command.IsFromUpdateGroup())
330*f6dc9357SAndroid Build Coastguard Worker   {
331*f6dc9357SAndroid Build Coastguard Worker     #ifndef Z7_NO_CRYPTO
332*f6dc9357SAndroid Build Coastguard Worker     bool passwordIsDefined = options.PasswordEnabled && !options.Password.IsEmpty();
333*f6dc9357SAndroid Build Coastguard Worker     #endif
334*f6dc9357SAndroid Build Coastguard Worker 
335*f6dc9357SAndroid Build Coastguard Worker     CUpdateCallbackGUI callback;
336*f6dc9357SAndroid Build Coastguard Worker     // callback.EnablePercents = options.EnablePercents;
337*f6dc9357SAndroid Build Coastguard Worker 
338*f6dc9357SAndroid Build Coastguard Worker     #ifndef Z7_NO_CRYPTO
339*f6dc9357SAndroid Build Coastguard Worker     callback.PasswordIsDefined = passwordIsDefined;
340*f6dc9357SAndroid Build Coastguard Worker     callback.AskPassword = options.PasswordEnabled && options.Password.IsEmpty();
341*f6dc9357SAndroid Build Coastguard Worker     callback.Password = options.Password;
342*f6dc9357SAndroid Build Coastguard Worker     #endif
343*f6dc9357SAndroid Build Coastguard Worker 
344*f6dc9357SAndroid Build Coastguard Worker     // callback.StdOutMode = options.UpdateOptions.StdOutMode;
345*f6dc9357SAndroid Build Coastguard Worker     callback.Init();
346*f6dc9357SAndroid Build Coastguard Worker 
347*f6dc9357SAndroid Build Coastguard Worker     if (!options.UpdateOptions.InitFormatIndex(codecs, formatIndices, options.ArchiveName) ||
348*f6dc9357SAndroid Build Coastguard Worker         !options.UpdateOptions.SetArcPath(codecs, options.ArchiveName))
349*f6dc9357SAndroid Build Coastguard Worker     {
350*f6dc9357SAndroid Build Coastguard Worker       ErrorLangMessage(IDS_UPDATE_NOT_SUPPORTED);
351*f6dc9357SAndroid Build Coastguard Worker       return NExitCode::kFatalError;
352*f6dc9357SAndroid Build Coastguard Worker     }
353*f6dc9357SAndroid Build Coastguard Worker     bool messageWasDisplayed = false;
354*f6dc9357SAndroid Build Coastguard Worker     HRESULT result = UpdateGUI(
355*f6dc9357SAndroid Build Coastguard Worker         codecs, formatIndices,
356*f6dc9357SAndroid Build Coastguard Worker         options.ArchiveName,
357*f6dc9357SAndroid Build Coastguard Worker         options.Censor,
358*f6dc9357SAndroid Build Coastguard Worker         options.UpdateOptions,
359*f6dc9357SAndroid Build Coastguard Worker         options.ShowDialog,
360*f6dc9357SAndroid Build Coastguard Worker         messageWasDisplayed,
361*f6dc9357SAndroid Build Coastguard Worker         &callback);
362*f6dc9357SAndroid Build Coastguard Worker 
363*f6dc9357SAndroid Build Coastguard Worker     if (result != S_OK)
364*f6dc9357SAndroid Build Coastguard Worker     {
365*f6dc9357SAndroid Build Coastguard Worker       if (result != E_ABORT && messageWasDisplayed)
366*f6dc9357SAndroid Build Coastguard Worker         return NExitCode::kFatalError;
367*f6dc9357SAndroid Build Coastguard Worker       throw CSystemException(result);
368*f6dc9357SAndroid Build Coastguard Worker     }
369*f6dc9357SAndroid Build Coastguard Worker     if (callback.FailedFiles.Size() > 0)
370*f6dc9357SAndroid Build Coastguard Worker     {
371*f6dc9357SAndroid Build Coastguard Worker       if (!messageWasDisplayed)
372*f6dc9357SAndroid Build Coastguard Worker         throw CSystemException(E_FAIL);
373*f6dc9357SAndroid Build Coastguard Worker       return NExitCode::kWarning;
374*f6dc9357SAndroid Build Coastguard Worker     }
375*f6dc9357SAndroid Build Coastguard Worker   }
376*f6dc9357SAndroid Build Coastguard Worker   else if (options.Command.CommandType == NCommandType::kHash)
377*f6dc9357SAndroid Build Coastguard Worker   {
378*f6dc9357SAndroid Build Coastguard Worker     bool messageWasDisplayed = false;
379*f6dc9357SAndroid Build Coastguard Worker     HRESULT result = HashCalcGUI(EXTERNAL_CODECS_VARS_L
380*f6dc9357SAndroid Build Coastguard Worker         options.Censor, options.HashOptions, messageWasDisplayed);
381*f6dc9357SAndroid Build Coastguard Worker 
382*f6dc9357SAndroid Build Coastguard Worker     if (result != S_OK)
383*f6dc9357SAndroid Build Coastguard Worker     {
384*f6dc9357SAndroid Build Coastguard Worker       if (result != E_ABORT && messageWasDisplayed)
385*f6dc9357SAndroid Build Coastguard Worker         return NExitCode::kFatalError;
386*f6dc9357SAndroid Build Coastguard Worker       throw CSystemException(result);
387*f6dc9357SAndroid Build Coastguard Worker     }
388*f6dc9357SAndroid Build Coastguard Worker     /*
389*f6dc9357SAndroid Build Coastguard Worker     if (callback.FailedFiles.Size() > 0)
390*f6dc9357SAndroid Build Coastguard Worker     {
391*f6dc9357SAndroid Build Coastguard Worker       if (!messageWasDisplayed)
392*f6dc9357SAndroid Build Coastguard Worker         throw CSystemException(E_FAIL);
393*f6dc9357SAndroid Build Coastguard Worker       return NExitCode::kWarning;
394*f6dc9357SAndroid Build Coastguard Worker     }
395*f6dc9357SAndroid Build Coastguard Worker     */
396*f6dc9357SAndroid Build Coastguard Worker   }
397*f6dc9357SAndroid Build Coastguard Worker   else
398*f6dc9357SAndroid Build Coastguard Worker   {
399*f6dc9357SAndroid Build Coastguard Worker     throw "Unsupported command";
400*f6dc9357SAndroid Build Coastguard Worker   }
401*f6dc9357SAndroid Build Coastguard Worker   return 0;
402*f6dc9357SAndroid Build Coastguard Worker }
403*f6dc9357SAndroid Build Coastguard Worker 
404*f6dc9357SAndroid Build Coastguard Worker #if defined(_UNICODE) && !defined(_WIN64) && !defined(UNDER_CE)
405*f6dc9357SAndroid Build Coastguard Worker #define NT_CHECK_FAIL_ACTION ErrorMessage("Unsupported Windows version"); return NExitCode::kFatalError;
406*f6dc9357SAndroid Build Coastguard Worker #endif
407*f6dc9357SAndroid Build Coastguard Worker 
WinMain(HINSTANCE hInstance,HINSTANCE,LPWSTR,int)408*f6dc9357SAndroid Build Coastguard Worker int APIENTRY WinMain(HINSTANCE  hInstance, HINSTANCE /* hPrevInstance */,
409*f6dc9357SAndroid Build Coastguard Worker   #ifdef UNDER_CE
410*f6dc9357SAndroid Build Coastguard Worker   LPWSTR
411*f6dc9357SAndroid Build Coastguard Worker   #else
412*f6dc9357SAndroid Build Coastguard Worker   LPSTR
413*f6dc9357SAndroid Build Coastguard Worker   #endif
414*f6dc9357SAndroid Build Coastguard Worker   /* lpCmdLine */, int /* nCmdShow */)
415*f6dc9357SAndroid Build Coastguard Worker {
416*f6dc9357SAndroid Build Coastguard Worker   g_hInstance = hInstance;
417*f6dc9357SAndroid Build Coastguard Worker 
418*f6dc9357SAndroid Build Coastguard Worker   #ifdef _WIN32
419*f6dc9357SAndroid Build Coastguard Worker   NT_CHECK
420*f6dc9357SAndroid Build Coastguard Worker   #endif
421*f6dc9357SAndroid Build Coastguard Worker 
422*f6dc9357SAndroid Build Coastguard Worker   InitCommonControls();
423*f6dc9357SAndroid Build Coastguard Worker 
424*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_DYN_ComCtl32Version
425*f6dc9357SAndroid Build Coastguard Worker   g_ComCtl32Version = ::GetDllVersion(TEXT("comctl32.dll"));
426*f6dc9357SAndroid Build Coastguard Worker   g_LVN_ITEMACTIVATE_Support = (g_ComCtl32Version >= MAKELONG(71, 4));
427*f6dc9357SAndroid Build Coastguard Worker #endif
428*f6dc9357SAndroid Build Coastguard Worker 
429*f6dc9357SAndroid Build Coastguard Worker   // OleInitialize is required for ProgressBar in TaskBar.
430*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
431*f6dc9357SAndroid Build Coastguard Worker   OleInitialize(NULL);
432*f6dc9357SAndroid Build Coastguard Worker   #endif
433*f6dc9357SAndroid Build Coastguard Worker 
434*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_LANG
435*f6dc9357SAndroid Build Coastguard Worker   LoadLangOneTime();
436*f6dc9357SAndroid Build Coastguard Worker   #endif
437*f6dc9357SAndroid Build Coastguard Worker 
438*f6dc9357SAndroid Build Coastguard Worker   // setlocale(LC_COLLATE, ".ACP");
439*f6dc9357SAndroid Build Coastguard Worker   try
440*f6dc9357SAndroid Build Coastguard Worker   {
441*f6dc9357SAndroid Build Coastguard Worker     #ifdef _WIN32
442*f6dc9357SAndroid Build Coastguard Worker     My_SetDefaultDllDirectories();
443*f6dc9357SAndroid Build Coastguard Worker     #endif
444*f6dc9357SAndroid Build Coastguard Worker 
445*f6dc9357SAndroid Build Coastguard Worker     return Main2();
446*f6dc9357SAndroid Build Coastguard Worker   }
447*f6dc9357SAndroid Build Coastguard Worker   catch(const CNewException &)
448*f6dc9357SAndroid Build Coastguard Worker   {
449*f6dc9357SAndroid Build Coastguard Worker     return ShowMemErrorMessage();
450*f6dc9357SAndroid Build Coastguard Worker   }
451*f6dc9357SAndroid Build Coastguard Worker   catch(const CMessagePathException &e)
452*f6dc9357SAndroid Build Coastguard Worker   {
453*f6dc9357SAndroid Build Coastguard Worker     ErrorMessage(e);
454*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kUserError;
455*f6dc9357SAndroid Build Coastguard Worker   }
456*f6dc9357SAndroid Build Coastguard Worker   catch(const CSystemException &systemError)
457*f6dc9357SAndroid Build Coastguard Worker   {
458*f6dc9357SAndroid Build Coastguard Worker     if (systemError.ErrorCode == E_ABORT)
459*f6dc9357SAndroid Build Coastguard Worker       return NExitCode::kUserBreak;
460*f6dc9357SAndroid Build Coastguard Worker     return ShowSysErrorMessage(systemError.ErrorCode);
461*f6dc9357SAndroid Build Coastguard Worker   }
462*f6dc9357SAndroid Build Coastguard Worker   catch(const UString &s)
463*f6dc9357SAndroid Build Coastguard Worker   {
464*f6dc9357SAndroid Build Coastguard Worker     ErrorMessage(s);
465*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kFatalError;
466*f6dc9357SAndroid Build Coastguard Worker   }
467*f6dc9357SAndroid Build Coastguard Worker   catch(const AString &s)
468*f6dc9357SAndroid Build Coastguard Worker   {
469*f6dc9357SAndroid Build Coastguard Worker     ErrorMessage(s);
470*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kFatalError;
471*f6dc9357SAndroid Build Coastguard Worker   }
472*f6dc9357SAndroid Build Coastguard Worker   catch(const wchar_t *s)
473*f6dc9357SAndroid Build Coastguard Worker   {
474*f6dc9357SAndroid Build Coastguard Worker     ErrorMessage(s);
475*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kFatalError;
476*f6dc9357SAndroid Build Coastguard Worker   }
477*f6dc9357SAndroid Build Coastguard Worker   catch(const char *s)
478*f6dc9357SAndroid Build Coastguard Worker   {
479*f6dc9357SAndroid Build Coastguard Worker     ErrorMessage(s);
480*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kFatalError;
481*f6dc9357SAndroid Build Coastguard Worker   }
482*f6dc9357SAndroid Build Coastguard Worker   catch(int v)
483*f6dc9357SAndroid Build Coastguard Worker   {
484*f6dc9357SAndroid Build Coastguard Worker     AString e ("Error: ");
485*f6dc9357SAndroid Build Coastguard Worker     e.Add_UInt32((unsigned)v);
486*f6dc9357SAndroid Build Coastguard Worker     ErrorMessage(e);
487*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kFatalError;
488*f6dc9357SAndroid Build Coastguard Worker   }
489*f6dc9357SAndroid Build Coastguard Worker   catch(...)
490*f6dc9357SAndroid Build Coastguard Worker   {
491*f6dc9357SAndroid Build Coastguard Worker     ErrorMessage("Unknown error");
492*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kFatalError;
493*f6dc9357SAndroid Build Coastguard Worker   }
494*f6dc9357SAndroid Build Coastguard Worker }
495