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