1*f6dc9357SAndroid Build Coastguard Worker // Main.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/MyWindows.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #if defined(__MINGW32__) || defined(__MINGW64__)
8*f6dc9357SAndroid Build Coastguard Worker #include <shlwapi.h>
9*f6dc9357SAndroid Build Coastguard Worker #else
10*f6dc9357SAndroid Build Coastguard Worker #include <Shlwapi.h>
11*f6dc9357SAndroid Build Coastguard Worker #endif
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/DllSecur.h"
14*f6dc9357SAndroid Build Coastguard Worker
15*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyInitGuid.h"
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/CommandLineParser.h"
18*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
19*f6dc9357SAndroid Build Coastguard Worker
20*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/DLL.h"
21*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
22*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
23*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
24*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/NtCheck.h"
25*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ResourceString.h"
26*f6dc9357SAndroid Build Coastguard Worker
27*f6dc9357SAndroid Build Coastguard Worker #include "../../ICoder.h"
28*f6dc9357SAndroid Build Coastguard Worker #include "../../IPassword.h"
29*f6dc9357SAndroid Build Coastguard Worker #include "../../Archive/IArchive.h"
30*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/Common/Extract.h"
31*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/Common/ExitCode.h"
32*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/Explorer/MyMessages.h"
33*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/FileManager/MyWindowsNew.h"
34*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/GUI/ExtractGUI.h"
35*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/GUI/ExtractRes.h"
36*f6dc9357SAndroid Build Coastguard Worker
37*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
38*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
39*f6dc9357SAndroid Build Coastguard Worker using namespace NDir;
40*f6dc9357SAndroid Build Coastguard Worker
41*f6dc9357SAndroid Build Coastguard Worker extern
42*f6dc9357SAndroid Build Coastguard Worker HINSTANCE g_hInstance;
43*f6dc9357SAndroid Build Coastguard Worker HINSTANCE g_hInstance;
44*f6dc9357SAndroid Build Coastguard Worker extern
45*f6dc9357SAndroid Build Coastguard Worker bool g_DisableUserQuestions;
46*f6dc9357SAndroid Build Coastguard Worker bool g_DisableUserQuestions;
47*f6dc9357SAndroid Build Coastguard Worker
48*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
49*f6dc9357SAndroid Build Coastguard Worker
50*f6dc9357SAndroid Build Coastguard Worker #if !defined(Z7_WIN32_WINNT_MIN) || Z7_WIN32_WINNT_MIN < 0x0500 // win2000
51*f6dc9357SAndroid Build Coastguard Worker #define Z7_USE_DYN_ComCtl32Version
52*f6dc9357SAndroid Build Coastguard Worker #endif
53*f6dc9357SAndroid Build Coastguard Worker
54*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_DYN_ComCtl32Version
55*f6dc9357SAndroid Build Coastguard Worker Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
56*f6dc9357SAndroid Build Coastguard Worker
GetDllVersion(LPCTSTR dllName)57*f6dc9357SAndroid Build Coastguard Worker static DWORD GetDllVersion(LPCTSTR dllName)
58*f6dc9357SAndroid Build Coastguard Worker {
59*f6dc9357SAndroid Build Coastguard Worker DWORD dwVersion = 0;
60*f6dc9357SAndroid Build Coastguard Worker const HINSTANCE hinstDll = LoadLibrary(dllName);
61*f6dc9357SAndroid Build Coastguard Worker if (hinstDll)
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker const
64*f6dc9357SAndroid Build Coastguard Worker DLLGETVERSIONPROC func_DllGetVersion = Z7_GET_PROC_ADDRESS(
65*f6dc9357SAndroid Build Coastguard Worker DLLGETVERSIONPROC, hinstDll, "DllGetVersion");
66*f6dc9357SAndroid Build Coastguard Worker if (func_DllGetVersion)
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker DLLVERSIONINFO dvi;
69*f6dc9357SAndroid Build Coastguard Worker ZeroMemory(&dvi, sizeof(dvi));
70*f6dc9357SAndroid Build Coastguard Worker dvi.cbSize = sizeof(dvi);
71*f6dc9357SAndroid Build Coastguard Worker const HRESULT hr = func_DllGetVersion(&dvi);
72*f6dc9357SAndroid Build Coastguard Worker if (SUCCEEDED(hr))
73*f6dc9357SAndroid Build Coastguard Worker dwVersion = (DWORD)MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion);
74*f6dc9357SAndroid Build Coastguard Worker }
75*f6dc9357SAndroid Build Coastguard Worker FreeLibrary(hinstDll);
76*f6dc9357SAndroid Build Coastguard Worker }
77*f6dc9357SAndroid Build Coastguard Worker return dwVersion;
78*f6dc9357SAndroid Build Coastguard Worker }
79*f6dc9357SAndroid Build Coastguard Worker
80*f6dc9357SAndroid Build Coastguard Worker #endif
81*f6dc9357SAndroid Build Coastguard Worker #endif
82*f6dc9357SAndroid Build Coastguard Worker
83*f6dc9357SAndroid Build Coastguard Worker extern
84*f6dc9357SAndroid Build Coastguard Worker bool g_LVN_ITEMACTIVATE_Support;
85*f6dc9357SAndroid Build Coastguard Worker bool g_LVN_ITEMACTIVATE_Support = true;
86*f6dc9357SAndroid Build Coastguard Worker
87*f6dc9357SAndroid Build Coastguard Worker static const wchar_t * const kUnknownExceptionMessage = L"ERROR: Unknown Error!";
88*f6dc9357SAndroid Build Coastguard Worker
ErrorMessageForHRESULT(HRESULT res)89*f6dc9357SAndroid Build Coastguard Worker static void ErrorMessageForHRESULT(HRESULT res)
90*f6dc9357SAndroid Build Coastguard Worker {
91*f6dc9357SAndroid Build Coastguard Worker ShowErrorMessage(HResultToMessage(res));
92*f6dc9357SAndroid Build Coastguard Worker }
93*f6dc9357SAndroid Build Coastguard Worker
WinMain2()94*f6dc9357SAndroid Build Coastguard Worker static int APIENTRY WinMain2()
95*f6dc9357SAndroid Build Coastguard Worker {
96*f6dc9357SAndroid Build Coastguard Worker // OleInitialize is required for ProgressBar in TaskBar.
97*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
98*f6dc9357SAndroid Build Coastguard Worker OleInitialize(NULL);
99*f6dc9357SAndroid Build Coastguard Worker #endif
100*f6dc9357SAndroid Build Coastguard Worker
101*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
102*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_DYN_ComCtl32Version
103*f6dc9357SAndroid Build Coastguard Worker {
104*f6dc9357SAndroid Build Coastguard Worker const DWORD g_ComCtl32Version = ::GetDllVersion(TEXT("comctl32.dll"));
105*f6dc9357SAndroid Build Coastguard Worker g_LVN_ITEMACTIVATE_Support = (g_ComCtl32Version >= MAKELONG(71, 4));
106*f6dc9357SAndroid Build Coastguard Worker }
107*f6dc9357SAndroid Build Coastguard Worker #endif
108*f6dc9357SAndroid Build Coastguard Worker #endif
109*f6dc9357SAndroid Build Coastguard Worker
110*f6dc9357SAndroid Build Coastguard Worker UString password;
111*f6dc9357SAndroid Build Coastguard Worker bool assumeYes = false;
112*f6dc9357SAndroid Build Coastguard Worker bool outputFolderDefined = false;
113*f6dc9357SAndroid Build Coastguard Worker FString outputFolder;
114*f6dc9357SAndroid Build Coastguard Worker UStringVector commandStrings;
115*f6dc9357SAndroid Build Coastguard Worker NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);
116*f6dc9357SAndroid Build Coastguard Worker
117*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
118*f6dc9357SAndroid Build Coastguard Worker if (commandStrings.Size() > 0)
119*f6dc9357SAndroid Build Coastguard Worker commandStrings.Delete(0);
120*f6dc9357SAndroid Build Coastguard Worker #endif
121*f6dc9357SAndroid Build Coastguard Worker
122*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, commandStrings)
123*f6dc9357SAndroid Build Coastguard Worker {
124*f6dc9357SAndroid Build Coastguard Worker const UString &s = commandStrings[i];
125*f6dc9357SAndroid Build Coastguard Worker if (s.Len() > 1 && s[0] == '-')
126*f6dc9357SAndroid Build Coastguard Worker {
127*f6dc9357SAndroid Build Coastguard Worker const wchar_t c = MyCharLower_Ascii(s[1]);
128*f6dc9357SAndroid Build Coastguard Worker if (c == 'y')
129*f6dc9357SAndroid Build Coastguard Worker {
130*f6dc9357SAndroid Build Coastguard Worker assumeYes = true;
131*f6dc9357SAndroid Build Coastguard Worker if (s.Len() != 2)
132*f6dc9357SAndroid Build Coastguard Worker {
133*f6dc9357SAndroid Build Coastguard Worker ShowErrorMessage(L"Bad command");
134*f6dc9357SAndroid Build Coastguard Worker return 1;
135*f6dc9357SAndroid Build Coastguard Worker }
136*f6dc9357SAndroid Build Coastguard Worker }
137*f6dc9357SAndroid Build Coastguard Worker else if (c == 'o')
138*f6dc9357SAndroid Build Coastguard Worker {
139*f6dc9357SAndroid Build Coastguard Worker outputFolder = us2fs(s.Ptr(2));
140*f6dc9357SAndroid Build Coastguard Worker NName::NormalizeDirPathPrefix(outputFolder);
141*f6dc9357SAndroid Build Coastguard Worker outputFolderDefined = !outputFolder.IsEmpty();
142*f6dc9357SAndroid Build Coastguard Worker }
143*f6dc9357SAndroid Build Coastguard Worker else if (c == 'p')
144*f6dc9357SAndroid Build Coastguard Worker {
145*f6dc9357SAndroid Build Coastguard Worker password = s.Ptr(2);
146*f6dc9357SAndroid Build Coastguard Worker }
147*f6dc9357SAndroid Build Coastguard Worker }
148*f6dc9357SAndroid Build Coastguard Worker }
149*f6dc9357SAndroid Build Coastguard Worker
150*f6dc9357SAndroid Build Coastguard Worker g_DisableUserQuestions = assumeYes;
151*f6dc9357SAndroid Build Coastguard Worker
152*f6dc9357SAndroid Build Coastguard Worker FString path;
153*f6dc9357SAndroid Build Coastguard Worker NDLL::MyGetModuleFileName(path);
154*f6dc9357SAndroid Build Coastguard Worker
155*f6dc9357SAndroid Build Coastguard Worker FString fullPath;
156*f6dc9357SAndroid Build Coastguard Worker if (!MyGetFullPathName(path, fullPath))
157*f6dc9357SAndroid Build Coastguard Worker {
158*f6dc9357SAndroid Build Coastguard Worker ShowErrorMessage(L"Error 1329484");
159*f6dc9357SAndroid Build Coastguard Worker return 1;
160*f6dc9357SAndroid Build Coastguard Worker }
161*f6dc9357SAndroid Build Coastguard Worker
162*f6dc9357SAndroid Build Coastguard Worker CCodecs *codecs = new CCodecs;
163*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IUnknown> compressCodecsInfo = codecs;
164*f6dc9357SAndroid Build Coastguard Worker HRESULT result = codecs->Load();
165*f6dc9357SAndroid Build Coastguard Worker if (result != S_OK)
166*f6dc9357SAndroid Build Coastguard Worker {
167*f6dc9357SAndroid Build Coastguard Worker ErrorMessageForHRESULT(result);
168*f6dc9357SAndroid Build Coastguard Worker return 1;
169*f6dc9357SAndroid Build Coastguard Worker }
170*f6dc9357SAndroid Build Coastguard Worker
171*f6dc9357SAndroid Build Coastguard Worker // COpenCallbackGUI openCallback;
172*f6dc9357SAndroid Build Coastguard Worker
173*f6dc9357SAndroid Build Coastguard Worker // openCallback.PasswordIsDefined = !password.IsEmpty();
174*f6dc9357SAndroid Build Coastguard Worker // openCallback.Password = password;
175*f6dc9357SAndroid Build Coastguard Worker
176*f6dc9357SAndroid Build Coastguard Worker CExtractCallbackImp *ecs = new CExtractCallbackImp;
177*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;
178*f6dc9357SAndroid Build Coastguard Worker ecs->Init();
179*f6dc9357SAndroid Build Coastguard Worker
180*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
181*f6dc9357SAndroid Build Coastguard Worker ecs->PasswordIsDefined = !password.IsEmpty();
182*f6dc9357SAndroid Build Coastguard Worker ecs->Password = password;
183*f6dc9357SAndroid Build Coastguard Worker #endif
184*f6dc9357SAndroid Build Coastguard Worker
185*f6dc9357SAndroid Build Coastguard Worker CExtractOptions eo;
186*f6dc9357SAndroid Build Coastguard Worker
187*f6dc9357SAndroid Build Coastguard Worker FString dirPrefix;
188*f6dc9357SAndroid Build Coastguard Worker if (!GetOnlyDirPrefix(path, dirPrefix))
189*f6dc9357SAndroid Build Coastguard Worker {
190*f6dc9357SAndroid Build Coastguard Worker ShowErrorMessage(L"Error 1329485");
191*f6dc9357SAndroid Build Coastguard Worker return 1;
192*f6dc9357SAndroid Build Coastguard Worker }
193*f6dc9357SAndroid Build Coastguard Worker
194*f6dc9357SAndroid Build Coastguard Worker eo.OutputDir = outputFolderDefined ? outputFolder : dirPrefix;
195*f6dc9357SAndroid Build Coastguard Worker eo.YesToAll = assumeYes;
196*f6dc9357SAndroid Build Coastguard Worker eo.OverwriteMode = assumeYes ?
197*f6dc9357SAndroid Build Coastguard Worker NExtract::NOverwriteMode::kOverwrite :
198*f6dc9357SAndroid Build Coastguard Worker NExtract::NOverwriteMode::kAsk;
199*f6dc9357SAndroid Build Coastguard Worker eo.PathMode = NExtract::NPathMode::kFullPaths;
200*f6dc9357SAndroid Build Coastguard Worker eo.TestMode = false;
201*f6dc9357SAndroid Build Coastguard Worker
202*f6dc9357SAndroid Build Coastguard Worker UStringVector v1, v2;
203*f6dc9357SAndroid Build Coastguard Worker v1.Add(fs2us(fullPath));
204*f6dc9357SAndroid Build Coastguard Worker v2.Add(fs2us(fullPath));
205*f6dc9357SAndroid Build Coastguard Worker NWildcard::CCensorNode wildcardCensor;
206*f6dc9357SAndroid Build Coastguard Worker wildcardCensor.Add_Wildcard();
207*f6dc9357SAndroid Build Coastguard Worker
208*f6dc9357SAndroid Build Coastguard Worker bool messageWasDisplayed = false;
209*f6dc9357SAndroid Build Coastguard Worker result = ExtractGUI(codecs,
210*f6dc9357SAndroid Build Coastguard Worker CObjectVector<COpenType>(), CIntVector(),
211*f6dc9357SAndroid Build Coastguard Worker v1, v2,
212*f6dc9357SAndroid Build Coastguard Worker wildcardCensor, eo, (assumeYes ? false: true), messageWasDisplayed, ecs);
213*f6dc9357SAndroid Build Coastguard Worker
214*f6dc9357SAndroid Build Coastguard Worker if (result == S_OK)
215*f6dc9357SAndroid Build Coastguard Worker {
216*f6dc9357SAndroid Build Coastguard Worker if (!ecs->IsOK())
217*f6dc9357SAndroid Build Coastguard Worker return NExitCode::kFatalError;
218*f6dc9357SAndroid Build Coastguard Worker return 0;
219*f6dc9357SAndroid Build Coastguard Worker }
220*f6dc9357SAndroid Build Coastguard Worker if (result == E_ABORT)
221*f6dc9357SAndroid Build Coastguard Worker return NExitCode::kUserBreak;
222*f6dc9357SAndroid Build Coastguard Worker if (!messageWasDisplayed)
223*f6dc9357SAndroid Build Coastguard Worker {
224*f6dc9357SAndroid Build Coastguard Worker if (result == S_FALSE)
225*f6dc9357SAndroid Build Coastguard Worker ShowErrorMessage(L"Error in archive");
226*f6dc9357SAndroid Build Coastguard Worker else
227*f6dc9357SAndroid Build Coastguard Worker ErrorMessageForHRESULT(result);
228*f6dc9357SAndroid Build Coastguard Worker }
229*f6dc9357SAndroid Build Coastguard Worker if (result == E_OUTOFMEMORY)
230*f6dc9357SAndroid Build Coastguard Worker return NExitCode::kMemoryError;
231*f6dc9357SAndroid Build Coastguard Worker return NExitCode::kFatalError;
232*f6dc9357SAndroid Build Coastguard Worker }
233*f6dc9357SAndroid Build Coastguard Worker
234*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && defined(_UNICODE) && !defined(_WIN64) && !defined(UNDER_CE)
235*f6dc9357SAndroid Build Coastguard Worker #define NT_CHECK_FAIL_ACTION ShowErrorMessage(L"Unsupported Windows version"); return NExitCode::kFatalError;
236*f6dc9357SAndroid Build Coastguard Worker #endif
237*f6dc9357SAndroid Build Coastguard Worker
WinMain(HINSTANCE hInstance,HINSTANCE,LPWSTR,int)238*f6dc9357SAndroid Build Coastguard Worker int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */,
239*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
240*f6dc9357SAndroid Build Coastguard Worker LPWSTR
241*f6dc9357SAndroid Build Coastguard Worker #else
242*f6dc9357SAndroid Build Coastguard Worker LPSTR
243*f6dc9357SAndroid Build Coastguard Worker #endif
244*f6dc9357SAndroid Build Coastguard Worker /* lpCmdLine */, int /* nCmdShow */)
245*f6dc9357SAndroid Build Coastguard Worker {
246*f6dc9357SAndroid Build Coastguard Worker g_hInstance = (HINSTANCE)hInstance;
247*f6dc9357SAndroid Build Coastguard Worker
248*f6dc9357SAndroid Build Coastguard Worker NT_CHECK
249*f6dc9357SAndroid Build Coastguard Worker
250*f6dc9357SAndroid Build Coastguard Worker try
251*f6dc9357SAndroid Build Coastguard Worker {
252*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
253*f6dc9357SAndroid Build Coastguard Worker LoadSecurityDlls();
254*f6dc9357SAndroid Build Coastguard Worker #endif
255*f6dc9357SAndroid Build Coastguard Worker
256*f6dc9357SAndroid Build Coastguard Worker return WinMain2();
257*f6dc9357SAndroid Build Coastguard Worker }
258*f6dc9357SAndroid Build Coastguard Worker catch(const CNewException &)
259*f6dc9357SAndroid Build Coastguard Worker {
260*f6dc9357SAndroid Build Coastguard Worker ErrorMessageForHRESULT(E_OUTOFMEMORY);
261*f6dc9357SAndroid Build Coastguard Worker return NExitCode::kMemoryError;
262*f6dc9357SAndroid Build Coastguard Worker }
263*f6dc9357SAndroid Build Coastguard Worker catch(...)
264*f6dc9357SAndroid Build Coastguard Worker {
265*f6dc9357SAndroid Build Coastguard Worker ShowErrorMessage(kUnknownExceptionMessage);
266*f6dc9357SAndroid Build Coastguard Worker return NExitCode::kFatalError;
267*f6dc9357SAndroid Build Coastguard Worker }
268*f6dc9357SAndroid Build Coastguard Worker }
269