xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Common/CompressCall.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // CompressCall.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 <wchar.h>
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/Random.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/DLL.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
15*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileMapping.h"
16*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/MemoryLock.h"
17*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ProcessUtils.h"
18*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h"
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/RegistryUtils.h"
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker #include "CompressCall.h"
23*f6dc9357SAndroid Build Coastguard Worker 
24*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker #define MY_TRY_BEGIN try {
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker #define MY_TRY_FINISH } \
29*f6dc9357SAndroid Build Coastguard Worker   catch(...) { ErrorMessageHRESULT(E_FAIL); return E_FAIL; }
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker #define MY_TRY_FINISH_VOID } \
32*f6dc9357SAndroid Build Coastguard Worker   catch(...) { ErrorMessageHRESULT(E_FAIL); }
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker #define k7zGui  "7zG.exe"
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker // 21.07 : we can disable wildcard
37*f6dc9357SAndroid Build Coastguard Worker // #define ISWITCH_NO_WILDCARD_POSTFIX "w-"
38*f6dc9357SAndroid Build Coastguard Worker #define ISWITCH_NO_WILDCARD_POSTFIX
39*f6dc9357SAndroid Build Coastguard Worker 
40*f6dc9357SAndroid Build Coastguard Worker #define kShowDialogSwitch  " -ad"
41*f6dc9357SAndroid Build Coastguard Worker #define kEmailSwitch  " -seml."
42*f6dc9357SAndroid Build Coastguard Worker #define kArchiveTypeSwitch  " -t"
43*f6dc9357SAndroid Build Coastguard Worker #define kIncludeSwitch  " -i" ISWITCH_NO_WILDCARD_POSTFIX
44*f6dc9357SAndroid Build Coastguard Worker #define kArcIncludeSwitches  " -an -ai" ISWITCH_NO_WILDCARD_POSTFIX
45*f6dc9357SAndroid Build Coastguard Worker #define kHashIncludeSwitches  kIncludeSwitch
46*f6dc9357SAndroid Build Coastguard Worker #define kStopSwitchParsing  " --"
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker extern HWND g_HWND;
49*f6dc9357SAndroid Build Coastguard Worker 
GetQuotedString(const UString & s)50*f6dc9357SAndroid Build Coastguard Worker UString GetQuotedString(const UString &s)
51*f6dc9357SAndroid Build Coastguard Worker {
52*f6dc9357SAndroid Build Coastguard Worker   UString s2 ('\"');
53*f6dc9357SAndroid Build Coastguard Worker   s2 += s;
54*f6dc9357SAndroid Build Coastguard Worker   s2.Add_Char('\"');
55*f6dc9357SAndroid Build Coastguard Worker   return s2;
56*f6dc9357SAndroid Build Coastguard Worker }
57*f6dc9357SAndroid Build Coastguard Worker 
ErrorMessage(LPCWSTR message)58*f6dc9357SAndroid Build Coastguard Worker static void ErrorMessage(LPCWSTR message)
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker   MessageBoxW(g_HWND, message, L"7-Zip", MB_ICONERROR | MB_OK);
61*f6dc9357SAndroid Build Coastguard Worker }
62*f6dc9357SAndroid Build Coastguard Worker 
ErrorMessageHRESULT(HRESULT res,LPCWSTR s=NULL)63*f6dc9357SAndroid Build Coastguard Worker static void ErrorMessageHRESULT(HRESULT res, LPCWSTR s = NULL)
64*f6dc9357SAndroid Build Coastguard Worker {
65*f6dc9357SAndroid Build Coastguard Worker   UString s2 = NError::MyFormatMessage(res);
66*f6dc9357SAndroid Build Coastguard Worker   if (s)
67*f6dc9357SAndroid Build Coastguard Worker   {
68*f6dc9357SAndroid Build Coastguard Worker     s2.Add_LF();
69*f6dc9357SAndroid Build Coastguard Worker     s2 += s;
70*f6dc9357SAndroid Build Coastguard Worker   }
71*f6dc9357SAndroid Build Coastguard Worker   ErrorMessage(s2);
72*f6dc9357SAndroid Build Coastguard Worker }
73*f6dc9357SAndroid Build Coastguard Worker 
Call7zGui(const UString & params,bool waitFinish,NSynchronization::CBaseEvent * event)74*f6dc9357SAndroid Build Coastguard Worker static HRESULT Call7zGui(const UString &params,
75*f6dc9357SAndroid Build Coastguard Worker     // LPCWSTR curDir,
76*f6dc9357SAndroid Build Coastguard Worker     bool waitFinish,
77*f6dc9357SAndroid Build Coastguard Worker     NSynchronization::CBaseEvent *event)
78*f6dc9357SAndroid Build Coastguard Worker {
79*f6dc9357SAndroid Build Coastguard Worker   UString imageName = fs2us(NWindows::NDLL::GetModuleDirPrefix());
80*f6dc9357SAndroid Build Coastguard Worker   imageName += k7zGui;
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker   CProcess process;
83*f6dc9357SAndroid Build Coastguard Worker   const WRes wres = process.Create(imageName, params, NULL); // curDir);
84*f6dc9357SAndroid Build Coastguard Worker   if (wres != 0)
85*f6dc9357SAndroid Build Coastguard Worker   {
86*f6dc9357SAndroid Build Coastguard Worker     const HRESULT hres = HRESULT_FROM_WIN32(wres);
87*f6dc9357SAndroid Build Coastguard Worker     ErrorMessageHRESULT(hres, imageName);
88*f6dc9357SAndroid Build Coastguard Worker     return hres;
89*f6dc9357SAndroid Build Coastguard Worker   }
90*f6dc9357SAndroid Build Coastguard Worker   if (waitFinish)
91*f6dc9357SAndroid Build Coastguard Worker     process.Wait();
92*f6dc9357SAndroid Build Coastguard Worker   else if (event != NULL)
93*f6dc9357SAndroid Build Coastguard Worker   {
94*f6dc9357SAndroid Build Coastguard Worker     HANDLE handles[] = { process, *event };
95*f6dc9357SAndroid Build Coastguard Worker     ::WaitForMultipleObjects(Z7_ARRAY_SIZE(handles), handles, FALSE, INFINITE);
96*f6dc9357SAndroid Build Coastguard Worker   }
97*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
98*f6dc9357SAndroid Build Coastguard Worker }
99*f6dc9357SAndroid Build Coastguard Worker 
AddLagePagesSwitch(UString & params)100*f6dc9357SAndroid Build Coastguard Worker static void AddLagePagesSwitch(UString &params)
101*f6dc9357SAndroid Build Coastguard Worker {
102*f6dc9357SAndroid Build Coastguard Worker   if (ReadLockMemoryEnable())
103*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
104*f6dc9357SAndroid Build Coastguard Worker   if (NSecurity::Get_LargePages_RiskLevel() == 0)
105*f6dc9357SAndroid Build Coastguard Worker   #endif
106*f6dc9357SAndroid Build Coastguard Worker     params += " -slp";
107*f6dc9357SAndroid Build Coastguard Worker }
108*f6dc9357SAndroid Build Coastguard Worker 
109*f6dc9357SAndroid Build Coastguard Worker class CRandNameGenerator
110*f6dc9357SAndroid Build Coastguard Worker {
111*f6dc9357SAndroid Build Coastguard Worker   CRandom _random;
112*f6dc9357SAndroid Build Coastguard Worker public:
CRandNameGenerator()113*f6dc9357SAndroid Build Coastguard Worker   CRandNameGenerator() { _random.Init(); }
GenerateName(UString & s,const char * prefix)114*f6dc9357SAndroid Build Coastguard Worker   void GenerateName(UString &s, const char *prefix)
115*f6dc9357SAndroid Build Coastguard Worker   {
116*f6dc9357SAndroid Build Coastguard Worker     s += prefix;
117*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32((UInt32)(unsigned)_random.Generate());
118*f6dc9357SAndroid Build Coastguard Worker   }
119*f6dc9357SAndroid Build Coastguard Worker };
120*f6dc9357SAndroid Build Coastguard Worker 
CreateMap(const UStringVector & names,CFileMapping & fileMapping,NSynchronization::CManualResetEvent & event,UString & params)121*f6dc9357SAndroid Build Coastguard Worker static HRESULT CreateMap(const UStringVector &names,
122*f6dc9357SAndroid Build Coastguard Worker     CFileMapping &fileMapping, NSynchronization::CManualResetEvent &event,
123*f6dc9357SAndroid Build Coastguard Worker     UString &params)
124*f6dc9357SAndroid Build Coastguard Worker {
125*f6dc9357SAndroid Build Coastguard Worker   size_t totalSize = 1;
126*f6dc9357SAndroid Build Coastguard Worker   {
127*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, names)
128*f6dc9357SAndroid Build Coastguard Worker       totalSize += (names[i].Len() + 1);
129*f6dc9357SAndroid Build Coastguard Worker   }
130*f6dc9357SAndroid Build Coastguard Worker   totalSize *= sizeof(wchar_t);
131*f6dc9357SAndroid Build Coastguard Worker 
132*f6dc9357SAndroid Build Coastguard Worker   CRandNameGenerator random;
133*f6dc9357SAndroid Build Coastguard Worker 
134*f6dc9357SAndroid Build Coastguard Worker   UString mappingName;
135*f6dc9357SAndroid Build Coastguard Worker   for (;;)
136*f6dc9357SAndroid Build Coastguard Worker   {
137*f6dc9357SAndroid Build Coastguard Worker     random.GenerateName(mappingName, "7zMap");
138*f6dc9357SAndroid Build Coastguard Worker     const WRes wres = fileMapping.Create(PAGE_READWRITE, totalSize, GetSystemString(mappingName));
139*f6dc9357SAndroid Build Coastguard Worker     if (fileMapping.IsCreated() && wres == 0)
140*f6dc9357SAndroid Build Coastguard Worker       break;
141*f6dc9357SAndroid Build Coastguard Worker     if (wres != ERROR_ALREADY_EXISTS)
142*f6dc9357SAndroid Build Coastguard Worker       return HRESULT_FROM_WIN32(wres);
143*f6dc9357SAndroid Build Coastguard Worker     fileMapping.Close();
144*f6dc9357SAndroid Build Coastguard Worker   }
145*f6dc9357SAndroid Build Coastguard Worker 
146*f6dc9357SAndroid Build Coastguard Worker   UString eventName;
147*f6dc9357SAndroid Build Coastguard Worker   for (;;)
148*f6dc9357SAndroid Build Coastguard Worker   {
149*f6dc9357SAndroid Build Coastguard Worker     random.GenerateName(eventName, "7zEvent");
150*f6dc9357SAndroid Build Coastguard Worker     const WRes wres = event.CreateWithName(false, GetSystemString(eventName));
151*f6dc9357SAndroid Build Coastguard Worker     if (event.IsCreated() && wres == 0)
152*f6dc9357SAndroid Build Coastguard Worker       break;
153*f6dc9357SAndroid Build Coastguard Worker     if (wres != ERROR_ALREADY_EXISTS)
154*f6dc9357SAndroid Build Coastguard Worker       return HRESULT_FROM_WIN32(wres);
155*f6dc9357SAndroid Build Coastguard Worker     event.Close();
156*f6dc9357SAndroid Build Coastguard Worker   }
157*f6dc9357SAndroid Build Coastguard Worker 
158*f6dc9357SAndroid Build Coastguard Worker   params.Add_Char('#');
159*f6dc9357SAndroid Build Coastguard Worker   params += mappingName;
160*f6dc9357SAndroid Build Coastguard Worker   params.Add_Colon();
161*f6dc9357SAndroid Build Coastguard Worker   char temp[32];
162*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt64ToString(totalSize, temp);
163*f6dc9357SAndroid Build Coastguard Worker   params += temp;
164*f6dc9357SAndroid Build Coastguard Worker 
165*f6dc9357SAndroid Build Coastguard Worker   params.Add_Colon();
166*f6dc9357SAndroid Build Coastguard Worker   params += eventName;
167*f6dc9357SAndroid Build Coastguard Worker 
168*f6dc9357SAndroid Build Coastguard Worker   LPVOID data = fileMapping.Map(FILE_MAP_WRITE, 0, totalSize);
169*f6dc9357SAndroid Build Coastguard Worker   if (!data)
170*f6dc9357SAndroid Build Coastguard Worker     return E_FAIL;
171*f6dc9357SAndroid Build Coastguard Worker   CFileUnmapper unmapper(data);
172*f6dc9357SAndroid Build Coastguard Worker   {
173*f6dc9357SAndroid Build Coastguard Worker     wchar_t *cur = (wchar_t *)data;
174*f6dc9357SAndroid Build Coastguard Worker     *cur++ = 0; // it means wchar_t strings (UTF-16 in WIN32)
175*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, names)
176*f6dc9357SAndroid Build Coastguard Worker     {
177*f6dc9357SAndroid Build Coastguard Worker       const UString &s = names[i];
178*f6dc9357SAndroid Build Coastguard Worker       const unsigned len = s.Len() + 1;
179*f6dc9357SAndroid Build Coastguard Worker       wmemcpy(cur, (const wchar_t *)s, len);
180*f6dc9357SAndroid Build Coastguard Worker       cur += len;
181*f6dc9357SAndroid Build Coastguard Worker     }
182*f6dc9357SAndroid Build Coastguard Worker   }
183*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
184*f6dc9357SAndroid Build Coastguard Worker }
185*f6dc9357SAndroid Build Coastguard Worker 
CompressFiles(const UString & arcPathPrefix,const UString & arcName,const UString & arcType,bool addExtension,const UStringVector & names,bool email,bool showDialog,bool waitFinish)186*f6dc9357SAndroid Build Coastguard Worker HRESULT CompressFiles(
187*f6dc9357SAndroid Build Coastguard Worker     const UString &arcPathPrefix,
188*f6dc9357SAndroid Build Coastguard Worker     const UString &arcName,
189*f6dc9357SAndroid Build Coastguard Worker     const UString &arcType,
190*f6dc9357SAndroid Build Coastguard Worker     bool addExtension,
191*f6dc9357SAndroid Build Coastguard Worker     const UStringVector &names,
192*f6dc9357SAndroid Build Coastguard Worker     bool email, bool showDialog, bool waitFinish)
193*f6dc9357SAndroid Build Coastguard Worker {
194*f6dc9357SAndroid Build Coastguard Worker   MY_TRY_BEGIN
195*f6dc9357SAndroid Build Coastguard Worker   UString params ('a');
196*f6dc9357SAndroid Build Coastguard Worker 
197*f6dc9357SAndroid Build Coastguard Worker   CFileMapping fileMapping;
198*f6dc9357SAndroid Build Coastguard Worker   NSynchronization::CManualResetEvent event;
199*f6dc9357SAndroid Build Coastguard Worker   params += kIncludeSwitch;
200*f6dc9357SAndroid Build Coastguard Worker   RINOK(CreateMap(names, fileMapping, event, params))
201*f6dc9357SAndroid Build Coastguard Worker 
202*f6dc9357SAndroid Build Coastguard Worker   if (!arcType.IsEmpty())
203*f6dc9357SAndroid Build Coastguard Worker   {
204*f6dc9357SAndroid Build Coastguard Worker     params += kArchiveTypeSwitch;
205*f6dc9357SAndroid Build Coastguard Worker     params += arcType;
206*f6dc9357SAndroid Build Coastguard Worker   }
207*f6dc9357SAndroid Build Coastguard Worker 
208*f6dc9357SAndroid Build Coastguard Worker   if (email)
209*f6dc9357SAndroid Build Coastguard Worker     params += kEmailSwitch;
210*f6dc9357SAndroid Build Coastguard Worker 
211*f6dc9357SAndroid Build Coastguard Worker   if (showDialog)
212*f6dc9357SAndroid Build Coastguard Worker     params += kShowDialogSwitch;
213*f6dc9357SAndroid Build Coastguard Worker 
214*f6dc9357SAndroid Build Coastguard Worker   AddLagePagesSwitch(params);
215*f6dc9357SAndroid Build Coastguard Worker 
216*f6dc9357SAndroid Build Coastguard Worker   if (arcName.IsEmpty())
217*f6dc9357SAndroid Build Coastguard Worker     params += " -an";
218*f6dc9357SAndroid Build Coastguard Worker 
219*f6dc9357SAndroid Build Coastguard Worker   if (addExtension)
220*f6dc9357SAndroid Build Coastguard Worker     params += " -saa";
221*f6dc9357SAndroid Build Coastguard Worker   else
222*f6dc9357SAndroid Build Coastguard Worker     params += " -sae";
223*f6dc9357SAndroid Build Coastguard Worker 
224*f6dc9357SAndroid Build Coastguard Worker   params += kStopSwitchParsing;
225*f6dc9357SAndroid Build Coastguard Worker   params.Add_Space();
226*f6dc9357SAndroid Build Coastguard Worker 
227*f6dc9357SAndroid Build Coastguard Worker   if (!arcName.IsEmpty())
228*f6dc9357SAndroid Build Coastguard Worker   {
229*f6dc9357SAndroid Build Coastguard Worker     params += GetQuotedString(
230*f6dc9357SAndroid Build Coastguard Worker     // #ifdef UNDER_CE
231*f6dc9357SAndroid Build Coastguard Worker       arcPathPrefix +
232*f6dc9357SAndroid Build Coastguard Worker     // #endif
233*f6dc9357SAndroid Build Coastguard Worker     arcName);
234*f6dc9357SAndroid Build Coastguard Worker   }
235*f6dc9357SAndroid Build Coastguard Worker 
236*f6dc9357SAndroid Build Coastguard Worker   return Call7zGui(params,
237*f6dc9357SAndroid Build Coastguard Worker       // (arcPathPrefix.IsEmpty()? 0: (LPCWSTR)arcPathPrefix),
238*f6dc9357SAndroid Build Coastguard Worker       waitFinish, &event);
239*f6dc9357SAndroid Build Coastguard Worker   MY_TRY_FINISH
240*f6dc9357SAndroid Build Coastguard Worker }
241*f6dc9357SAndroid Build Coastguard Worker 
ExtractGroupCommand(const UStringVector & arcPaths,UString & params,bool isHash)242*f6dc9357SAndroid Build Coastguard Worker static void ExtractGroupCommand(const UStringVector &arcPaths, UString &params, bool isHash)
243*f6dc9357SAndroid Build Coastguard Worker {
244*f6dc9357SAndroid Build Coastguard Worker   AddLagePagesSwitch(params);
245*f6dc9357SAndroid Build Coastguard Worker   params += (isHash ? kHashIncludeSwitches : kArcIncludeSwitches);
246*f6dc9357SAndroid Build Coastguard Worker   CFileMapping fileMapping;
247*f6dc9357SAndroid Build Coastguard Worker   NSynchronization::CManualResetEvent event;
248*f6dc9357SAndroid Build Coastguard Worker   HRESULT result = CreateMap(arcPaths, fileMapping, event, params);
249*f6dc9357SAndroid Build Coastguard Worker   if (result == S_OK)
250*f6dc9357SAndroid Build Coastguard Worker     result = Call7zGui(params, false, &event);
251*f6dc9357SAndroid Build Coastguard Worker   if (result != S_OK)
252*f6dc9357SAndroid Build Coastguard Worker     ErrorMessageHRESULT(result);
253*f6dc9357SAndroid Build Coastguard Worker }
254*f6dc9357SAndroid Build Coastguard Worker 
ExtractArchives(const UStringVector & arcPaths,const UString & outFolder,bool showDialog,bool elimDup,UInt32 writeZone)255*f6dc9357SAndroid Build Coastguard Worker void ExtractArchives(const UStringVector &arcPaths, const UString &outFolder, bool showDialog, bool elimDup, UInt32 writeZone)
256*f6dc9357SAndroid Build Coastguard Worker {
257*f6dc9357SAndroid Build Coastguard Worker   MY_TRY_BEGIN
258*f6dc9357SAndroid Build Coastguard Worker   UString params ('x');
259*f6dc9357SAndroid Build Coastguard Worker   if (!outFolder.IsEmpty())
260*f6dc9357SAndroid Build Coastguard Worker   {
261*f6dc9357SAndroid Build Coastguard Worker     params += " -o";
262*f6dc9357SAndroid Build Coastguard Worker     params += GetQuotedString(outFolder);
263*f6dc9357SAndroid Build Coastguard Worker   }
264*f6dc9357SAndroid Build Coastguard Worker   if (elimDup)
265*f6dc9357SAndroid Build Coastguard Worker     params += " -spe";
266*f6dc9357SAndroid Build Coastguard Worker   if (writeZone != (UInt32)(Int32)-1)
267*f6dc9357SAndroid Build Coastguard Worker   {
268*f6dc9357SAndroid Build Coastguard Worker     params += " -snz";
269*f6dc9357SAndroid Build Coastguard Worker     params.Add_UInt32(writeZone);
270*f6dc9357SAndroid Build Coastguard Worker   }
271*f6dc9357SAndroid Build Coastguard Worker   if (showDialog)
272*f6dc9357SAndroid Build Coastguard Worker     params += kShowDialogSwitch;
273*f6dc9357SAndroid Build Coastguard Worker   ExtractGroupCommand(arcPaths, params, false);
274*f6dc9357SAndroid Build Coastguard Worker   MY_TRY_FINISH_VOID
275*f6dc9357SAndroid Build Coastguard Worker }
276*f6dc9357SAndroid Build Coastguard Worker 
277*f6dc9357SAndroid Build Coastguard Worker 
TestArchives(const UStringVector & arcPaths,bool hashMode)278*f6dc9357SAndroid Build Coastguard Worker void TestArchives(const UStringVector &arcPaths, bool hashMode)
279*f6dc9357SAndroid Build Coastguard Worker {
280*f6dc9357SAndroid Build Coastguard Worker   MY_TRY_BEGIN
281*f6dc9357SAndroid Build Coastguard Worker   UString params ('t');
282*f6dc9357SAndroid Build Coastguard Worker   if (hashMode)
283*f6dc9357SAndroid Build Coastguard Worker   {
284*f6dc9357SAndroid Build Coastguard Worker     params += kArchiveTypeSwitch;
285*f6dc9357SAndroid Build Coastguard Worker     params += "hash";
286*f6dc9357SAndroid Build Coastguard Worker   }
287*f6dc9357SAndroid Build Coastguard Worker   ExtractGroupCommand(arcPaths, params, false);
288*f6dc9357SAndroid Build Coastguard Worker   MY_TRY_FINISH_VOID
289*f6dc9357SAndroid Build Coastguard Worker }
290*f6dc9357SAndroid Build Coastguard Worker 
291*f6dc9357SAndroid Build Coastguard Worker 
CalcChecksum(const UStringVector & paths,const UString & methodName,const UString & arcPathPrefix,const UString & arcFileName)292*f6dc9357SAndroid Build Coastguard Worker void CalcChecksum(const UStringVector &paths,
293*f6dc9357SAndroid Build Coastguard Worker     const UString &methodName,
294*f6dc9357SAndroid Build Coastguard Worker     const UString &arcPathPrefix,
295*f6dc9357SAndroid Build Coastguard Worker     const UString &arcFileName)
296*f6dc9357SAndroid Build Coastguard Worker {
297*f6dc9357SAndroid Build Coastguard Worker   MY_TRY_BEGIN
298*f6dc9357SAndroid Build Coastguard Worker 
299*f6dc9357SAndroid Build Coastguard Worker   if (!arcFileName.IsEmpty())
300*f6dc9357SAndroid Build Coastguard Worker   {
301*f6dc9357SAndroid Build Coastguard Worker     CompressFiles(
302*f6dc9357SAndroid Build Coastguard Worker       arcPathPrefix,
303*f6dc9357SAndroid Build Coastguard Worker       arcFileName,
304*f6dc9357SAndroid Build Coastguard Worker       UString("hash"),
305*f6dc9357SAndroid Build Coastguard Worker       false, // addExtension,
306*f6dc9357SAndroid Build Coastguard Worker       paths,
307*f6dc9357SAndroid Build Coastguard Worker       false, // email,
308*f6dc9357SAndroid Build Coastguard Worker       false, // showDialog,
309*f6dc9357SAndroid Build Coastguard Worker       false  // waitFinish
310*f6dc9357SAndroid Build Coastguard Worker       );
311*f6dc9357SAndroid Build Coastguard Worker     return;
312*f6dc9357SAndroid Build Coastguard Worker   }
313*f6dc9357SAndroid Build Coastguard Worker 
314*f6dc9357SAndroid Build Coastguard Worker   UString params ('h');
315*f6dc9357SAndroid Build Coastguard Worker   if (!methodName.IsEmpty())
316*f6dc9357SAndroid Build Coastguard Worker   {
317*f6dc9357SAndroid Build Coastguard Worker     params += " -scrc";
318*f6dc9357SAndroid Build Coastguard Worker     params += methodName;
319*f6dc9357SAndroid Build Coastguard Worker     /*
320*f6dc9357SAndroid Build Coastguard Worker     if (!arcFileName.IsEmpty())
321*f6dc9357SAndroid Build Coastguard Worker     {
322*f6dc9357SAndroid Build Coastguard Worker       // not used alternate method of generating file
323*f6dc9357SAndroid Build Coastguard Worker       params += " -scrf=";
324*f6dc9357SAndroid Build Coastguard Worker       params += GetQuotedString(arcPathPrefix + arcFileName);
325*f6dc9357SAndroid Build Coastguard Worker     }
326*f6dc9357SAndroid Build Coastguard Worker     */
327*f6dc9357SAndroid Build Coastguard Worker   }
328*f6dc9357SAndroid Build Coastguard Worker   ExtractGroupCommand(paths, params, true);
329*f6dc9357SAndroid Build Coastguard Worker   MY_TRY_FINISH_VOID
330*f6dc9357SAndroid Build Coastguard Worker }
331*f6dc9357SAndroid Build Coastguard Worker 
Benchmark(bool totalMode)332*f6dc9357SAndroid Build Coastguard Worker void Benchmark(bool totalMode)
333*f6dc9357SAndroid Build Coastguard Worker {
334*f6dc9357SAndroid Build Coastguard Worker   MY_TRY_BEGIN
335*f6dc9357SAndroid Build Coastguard Worker   UString params ('b');
336*f6dc9357SAndroid Build Coastguard Worker   if (totalMode)
337*f6dc9357SAndroid Build Coastguard Worker     params += " -mm=*";
338*f6dc9357SAndroid Build Coastguard Worker   AddLagePagesSwitch(params);
339*f6dc9357SAndroid Build Coastguard Worker   const HRESULT result = Call7zGui(params, false, NULL);
340*f6dc9357SAndroid Build Coastguard Worker   if (result != S_OK)
341*f6dc9357SAndroid Build Coastguard Worker     ErrorMessageHRESULT(result);
342*f6dc9357SAndroid Build Coastguard Worker   MY_TRY_FINISH_VOID
343*f6dc9357SAndroid Build Coastguard Worker }
344