1*f6dc9357SAndroid Build Coastguard Worker // CompressDialog.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 "../../../../C/CpuArch.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
9*f6dc9357SAndroid Build Coastguard Worker
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/System.h"
13*f6dc9357SAndroid Build Coastguard Worker
14*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MethodProps.h"
15*f6dc9357SAndroid Build Coastguard Worker
16*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/BrowseDialog.h"
17*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/FormatUtils.h"
18*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/HelpUtils.h"
19*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/PropertyName.h"
20*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/SplitUtils.h"
21*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/resourceGui.h"
22*f6dc9357SAndroid Build Coastguard Worker
23*f6dc9357SAndroid Build Coastguard Worker #include "../Explorer/MyMessages.h"
24*f6dc9357SAndroid Build Coastguard Worker
25*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ZipRegistry.h"
26*f6dc9357SAndroid Build Coastguard Worker
27*f6dc9357SAndroid Build Coastguard Worker #include "CompressDialog.h"
28*f6dc9357SAndroid Build Coastguard Worker
29*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
30*f6dc9357SAndroid Build Coastguard Worker extern bool g_IsNT;
31*f6dc9357SAndroid Build Coastguard Worker #endif
32*f6dc9357SAndroid Build Coastguard Worker
33*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/LangUtils.h"
34*f6dc9357SAndroid Build Coastguard Worker
35*f6dc9357SAndroid Build Coastguard Worker #include "CompressDialogRes.h"
36*f6dc9357SAndroid Build Coastguard Worker #include "ExtractRes.h"
37*f6dc9357SAndroid Build Coastguard Worker #include "resource2.h"
38*f6dc9357SAndroid Build Coastguard Worker
39*f6dc9357SAndroid Build Coastguard Worker // #define PRINT_PARAMS
40*f6dc9357SAndroid Build Coastguard Worker
41*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
42*f6dc9357SAndroid Build Coastguard Worker
43*f6dc9357SAndroid Build Coastguard Worker // #define IDS_OPTIONS 2100
44*f6dc9357SAndroid Build Coastguard Worker
45*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLangIDs[] =
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_ARCHIVE,
48*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_UPDATE_MODE,
49*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_FORMAT,
50*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_LEVEL,
51*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_METHOD,
52*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_DICTIONARY,
53*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_ORDER,
54*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_SOLID,
55*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_THREADS,
56*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_PARAMETERS,
57*f6dc9357SAndroid Build Coastguard Worker
58*f6dc9357SAndroid Build Coastguard Worker IDB_COMPRESS_OPTIONS, // IDS_OPTIONS
59*f6dc9357SAndroid Build Coastguard Worker
60*f6dc9357SAndroid Build Coastguard Worker IDG_COMPRESS_OPTIONS,
61*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_SFX,
62*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_SHARED,
63*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_DEL,
64*f6dc9357SAndroid Build Coastguard Worker
65*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_MEMORY,
66*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_MEMORY_DE,
67*f6dc9357SAndroid Build Coastguard Worker
68*f6dc9357SAndroid Build Coastguard Worker IDG_COMPRESS_ENCRYPTION,
69*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_ENCRYPTION_METHOD,
70*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_ENCRYPT_FILE_NAMES,
71*f6dc9357SAndroid Build Coastguard Worker
72*f6dc9357SAndroid Build Coastguard Worker IDT_PASSWORD_ENTER,
73*f6dc9357SAndroid Build Coastguard Worker IDT_PASSWORD_REENTER,
74*f6dc9357SAndroid Build Coastguard Worker IDX_PASSWORD_SHOW,
75*f6dc9357SAndroid Build Coastguard Worker
76*f6dc9357SAndroid Build Coastguard Worker IDT_SPLIT_TO_VOLUMES,
77*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_PATH_MODE,
78*f6dc9357SAndroid Build Coastguard Worker };
79*f6dc9357SAndroid Build Coastguard Worker #endif
80*f6dc9357SAndroid Build Coastguard Worker
81*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
82*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
83*f6dc9357SAndroid Build Coastguard Worker using namespace NName;
84*f6dc9357SAndroid Build Coastguard Worker using namespace NDir;
85*f6dc9357SAndroid Build Coastguard Worker
86*f6dc9357SAndroid Build Coastguard Worker static const unsigned kHistorySize = 20;
87*f6dc9357SAndroid Build Coastguard Worker
88*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kSolidLog_NoSolid = 0;
89*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kSolidLog_FullSolid = 64;
90*f6dc9357SAndroid Build Coastguard Worker
91*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLzmaMaxDictSize = (UInt32)15 << 28;
92*f6dc9357SAndroid Build Coastguard Worker
93*f6dc9357SAndroid Build Coastguard Worker static const UINT k_Message_ArcChanged = WM_APP + 1;
94*f6dc9357SAndroid Build Coastguard Worker
95*f6dc9357SAndroid Build Coastguard Worker /*
96*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kZstd_MAX_DictSize = (UInt32)1 << MY_ZSTD_WINDOWLOG_MAX;
97*f6dc9357SAndroid Build Coastguard Worker */
98*f6dc9357SAndroid Build Coastguard Worker
99*f6dc9357SAndroid Build Coastguard Worker /* The top value for windowLog_Chain:
100*f6dc9357SAndroid Build Coastguard Worker (MY_ZSTD_CHAINLOG_MAX - 1): in BT mode
101*f6dc9357SAndroid Build Coastguard Worker (MY_ZSTD_CHAINLOG_MAX) : in non-BT mode. But such big value is useless in most cases.
102*f6dc9357SAndroid Build Coastguard Worker So we always reduce top value to (MY_ZSTD_CHAINLOG_MAX - 1) */
103*f6dc9357SAndroid Build Coastguard Worker /*
104*f6dc9357SAndroid Build Coastguard Worker static const unsigned kMaxDictChain = MY_ZSTD_CHAINLOG_MAX - 1;
105*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kZstd_MAX_DictSize_Chain = (UInt32)1 << kMaxDictChain;
106*f6dc9357SAndroid Build Coastguard Worker */
107*f6dc9357SAndroid Build Coastguard Worker
108*f6dc9357SAndroid Build Coastguard Worker static LPCSTR const kExeExt = ".exe";
109*f6dc9357SAndroid Build Coastguard Worker
110*f6dc9357SAndroid Build Coastguard Worker static const UInt32 g_Levels[] =
111*f6dc9357SAndroid Build Coastguard Worker {
112*f6dc9357SAndroid Build Coastguard Worker IDS_METHOD_STORE,
113*f6dc9357SAndroid Build Coastguard Worker IDS_METHOD_FASTEST,
114*f6dc9357SAndroid Build Coastguard Worker 0,
115*f6dc9357SAndroid Build Coastguard Worker IDS_METHOD_FAST,
116*f6dc9357SAndroid Build Coastguard Worker 0,
117*f6dc9357SAndroid Build Coastguard Worker IDS_METHOD_NORMAL,
118*f6dc9357SAndroid Build Coastguard Worker 0,
119*f6dc9357SAndroid Build Coastguard Worker IDS_METHOD_MAXIMUM,
120*f6dc9357SAndroid Build Coastguard Worker 0,
121*f6dc9357SAndroid Build Coastguard Worker IDS_METHOD_ULTRA
122*f6dc9357SAndroid Build Coastguard Worker };
123*f6dc9357SAndroid Build Coastguard Worker
124*f6dc9357SAndroid Build Coastguard Worker enum EMethodID
125*f6dc9357SAndroid Build Coastguard Worker {
126*f6dc9357SAndroid Build Coastguard Worker kCopy,
127*f6dc9357SAndroid Build Coastguard Worker kLZMA,
128*f6dc9357SAndroid Build Coastguard Worker kLZMA2,
129*f6dc9357SAndroid Build Coastguard Worker kPPMd,
130*f6dc9357SAndroid Build Coastguard Worker kBZip2,
131*f6dc9357SAndroid Build Coastguard Worker kDeflate,
132*f6dc9357SAndroid Build Coastguard Worker kDeflate64,
133*f6dc9357SAndroid Build Coastguard Worker kPPMdZip,
134*f6dc9357SAndroid Build Coastguard Worker // kZSTD,
135*f6dc9357SAndroid Build Coastguard Worker kSha256,
136*f6dc9357SAndroid Build Coastguard Worker kSha1,
137*f6dc9357SAndroid Build Coastguard Worker kCrc32,
138*f6dc9357SAndroid Build Coastguard Worker kCrc64,
139*f6dc9357SAndroid Build Coastguard Worker kGnu,
140*f6dc9357SAndroid Build Coastguard Worker kPosix
141*f6dc9357SAndroid Build Coastguard Worker };
142*f6dc9357SAndroid Build Coastguard Worker
143*f6dc9357SAndroid Build Coastguard Worker static LPCSTR const kMethodsNames[] =
144*f6dc9357SAndroid Build Coastguard Worker {
145*f6dc9357SAndroid Build Coastguard Worker "Copy"
146*f6dc9357SAndroid Build Coastguard Worker , "LZMA"
147*f6dc9357SAndroid Build Coastguard Worker , "LZMA2"
148*f6dc9357SAndroid Build Coastguard Worker , "PPMd"
149*f6dc9357SAndroid Build Coastguard Worker , "BZip2"
150*f6dc9357SAndroid Build Coastguard Worker , "Deflate"
151*f6dc9357SAndroid Build Coastguard Worker , "Deflate64"
152*f6dc9357SAndroid Build Coastguard Worker , "PPMd"
153*f6dc9357SAndroid Build Coastguard Worker // , "ZSTD"
154*f6dc9357SAndroid Build Coastguard Worker , "SHA256"
155*f6dc9357SAndroid Build Coastguard Worker , "SHA1"
156*f6dc9357SAndroid Build Coastguard Worker , "CRC32"
157*f6dc9357SAndroid Build Coastguard Worker , "CRC64"
158*f6dc9357SAndroid Build Coastguard Worker , "GNU"
159*f6dc9357SAndroid Build Coastguard Worker , "POSIX"
160*f6dc9357SAndroid Build Coastguard Worker };
161*f6dc9357SAndroid Build Coastguard Worker
162*f6dc9357SAndroid Build Coastguard Worker static const EMethodID g_7zMethods[] =
163*f6dc9357SAndroid Build Coastguard Worker {
164*f6dc9357SAndroid Build Coastguard Worker kLZMA2,
165*f6dc9357SAndroid Build Coastguard Worker kLZMA,
166*f6dc9357SAndroid Build Coastguard Worker kPPMd,
167*f6dc9357SAndroid Build Coastguard Worker kBZip2
168*f6dc9357SAndroid Build Coastguard Worker , kDeflate
169*f6dc9357SAndroid Build Coastguard Worker , kDeflate64
170*f6dc9357SAndroid Build Coastguard Worker // , kZSTD
171*f6dc9357SAndroid Build Coastguard Worker , kCopy
172*f6dc9357SAndroid Build Coastguard Worker };
173*f6dc9357SAndroid Build Coastguard Worker
174*f6dc9357SAndroid Build Coastguard Worker static const EMethodID g_7zSfxMethods[] =
175*f6dc9357SAndroid Build Coastguard Worker {
176*f6dc9357SAndroid Build Coastguard Worker kCopy,
177*f6dc9357SAndroid Build Coastguard Worker kLZMA,
178*f6dc9357SAndroid Build Coastguard Worker kLZMA2,
179*f6dc9357SAndroid Build Coastguard Worker kPPMd
180*f6dc9357SAndroid Build Coastguard Worker };
181*f6dc9357SAndroid Build Coastguard Worker
182*f6dc9357SAndroid Build Coastguard Worker static const EMethodID g_ZipMethods[] =
183*f6dc9357SAndroid Build Coastguard Worker {
184*f6dc9357SAndroid Build Coastguard Worker kDeflate,
185*f6dc9357SAndroid Build Coastguard Worker kDeflate64,
186*f6dc9357SAndroid Build Coastguard Worker kBZip2,
187*f6dc9357SAndroid Build Coastguard Worker kLZMA,
188*f6dc9357SAndroid Build Coastguard Worker kPPMdZip
189*f6dc9357SAndroid Build Coastguard Worker // , kZSTD
190*f6dc9357SAndroid Build Coastguard Worker };
191*f6dc9357SAndroid Build Coastguard Worker
192*f6dc9357SAndroid Build Coastguard Worker static const EMethodID g_GZipMethods[] =
193*f6dc9357SAndroid Build Coastguard Worker {
194*f6dc9357SAndroid Build Coastguard Worker kDeflate
195*f6dc9357SAndroid Build Coastguard Worker };
196*f6dc9357SAndroid Build Coastguard Worker
197*f6dc9357SAndroid Build Coastguard Worker static const EMethodID g_BZip2Methods[] =
198*f6dc9357SAndroid Build Coastguard Worker {
199*f6dc9357SAndroid Build Coastguard Worker kBZip2
200*f6dc9357SAndroid Build Coastguard Worker };
201*f6dc9357SAndroid Build Coastguard Worker
202*f6dc9357SAndroid Build Coastguard Worker static const EMethodID g_XzMethods[] =
203*f6dc9357SAndroid Build Coastguard Worker {
204*f6dc9357SAndroid Build Coastguard Worker kLZMA2
205*f6dc9357SAndroid Build Coastguard Worker };
206*f6dc9357SAndroid Build Coastguard Worker
207*f6dc9357SAndroid Build Coastguard Worker /*
208*f6dc9357SAndroid Build Coastguard Worker static const EMethodID g_ZstdMethods[] =
209*f6dc9357SAndroid Build Coastguard Worker {
210*f6dc9357SAndroid Build Coastguard Worker kZSTD
211*f6dc9357SAndroid Build Coastguard Worker };
212*f6dc9357SAndroid Build Coastguard Worker */
213*f6dc9357SAndroid Build Coastguard Worker
214*f6dc9357SAndroid Build Coastguard Worker /*
215*f6dc9357SAndroid Build Coastguard Worker static const EMethodID g_SwfcMethods[] =
216*f6dc9357SAndroid Build Coastguard Worker {
217*f6dc9357SAndroid Build Coastguard Worker kDeflate
218*f6dc9357SAndroid Build Coastguard Worker // kLZMA
219*f6dc9357SAndroid Build Coastguard Worker };
220*f6dc9357SAndroid Build Coastguard Worker */
221*f6dc9357SAndroid Build Coastguard Worker
222*f6dc9357SAndroid Build Coastguard Worker static const EMethodID g_TarMethods[] =
223*f6dc9357SAndroid Build Coastguard Worker {
224*f6dc9357SAndroid Build Coastguard Worker kGnu,
225*f6dc9357SAndroid Build Coastguard Worker kPosix
226*f6dc9357SAndroid Build Coastguard Worker };
227*f6dc9357SAndroid Build Coastguard Worker
228*f6dc9357SAndroid Build Coastguard Worker static const EMethodID g_HashMethods[] =
229*f6dc9357SAndroid Build Coastguard Worker {
230*f6dc9357SAndroid Build Coastguard Worker kSha256
231*f6dc9357SAndroid Build Coastguard Worker , kSha1
232*f6dc9357SAndroid Build Coastguard Worker // , kCrc32
233*f6dc9357SAndroid Build Coastguard Worker // , kCrc64
234*f6dc9357SAndroid Build Coastguard Worker };
235*f6dc9357SAndroid Build Coastguard Worker
236*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kFF_Filter = 1 << 0;
237*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kFF_Solid = 1 << 1;
238*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kFF_MultiThread = 1 << 2;
239*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kFF_Encrypt = 1 << 3;
240*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kFF_EncryptFileNames = 1 << 4;
241*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kFF_MemUse = 1 << 5;
242*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kFF_SFX = 1 << 6;
243*f6dc9357SAndroid Build Coastguard Worker
244*f6dc9357SAndroid Build Coastguard Worker /*
245*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kFF_Time_Win = 1 << 10;
246*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kFF_Time_Unix = 1 << 11;
247*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kFF_Time_DOS = 1 << 12;
248*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kFF_Time_1ns = 1 << 13;
249*f6dc9357SAndroid Build Coastguard Worker */
250*f6dc9357SAndroid Build Coastguard Worker
251*f6dc9357SAndroid Build Coastguard Worker struct CFormatInfo
252*f6dc9357SAndroid Build Coastguard Worker {
253*f6dc9357SAndroid Build Coastguard Worker LPCSTR Name;
254*f6dc9357SAndroid Build Coastguard Worker UInt32 LevelsMask;
255*f6dc9357SAndroid Build Coastguard Worker unsigned NumMethods;
256*f6dc9357SAndroid Build Coastguard Worker const EMethodID *MethodIDs;
257*f6dc9357SAndroid Build Coastguard Worker
258*f6dc9357SAndroid Build Coastguard Worker UInt32 Flags;
259*f6dc9357SAndroid Build Coastguard Worker
Filter_CFormatInfo260*f6dc9357SAndroid Build Coastguard Worker bool Filter_() const { return (Flags & kFF_Filter) != 0; }
Solid_CFormatInfo261*f6dc9357SAndroid Build Coastguard Worker bool Solid_() const { return (Flags & kFF_Solid) != 0; }
MultiThread_CFormatInfo262*f6dc9357SAndroid Build Coastguard Worker bool MultiThread_() const { return (Flags & kFF_MultiThread) != 0; }
Encrypt_CFormatInfo263*f6dc9357SAndroid Build Coastguard Worker bool Encrypt_() const { return (Flags & kFF_Encrypt) != 0; }
EncryptFileNames_CFormatInfo264*f6dc9357SAndroid Build Coastguard Worker bool EncryptFileNames_() const { return (Flags & kFF_EncryptFileNames) != 0; }
MemUse_CFormatInfo265*f6dc9357SAndroid Build Coastguard Worker bool MemUse_() const { return (Flags & kFF_MemUse) != 0; }
SFX_CFormatInfo266*f6dc9357SAndroid Build Coastguard Worker bool SFX_() const { return (Flags & kFF_SFX) != 0; }
267*f6dc9357SAndroid Build Coastguard Worker };
268*f6dc9357SAndroid Build Coastguard Worker
269*f6dc9357SAndroid Build Coastguard Worker #define METHODS_PAIR(x) Z7_ARRAY_SIZE(x), x
270*f6dc9357SAndroid Build Coastguard Worker
271*f6dc9357SAndroid Build Coastguard Worker static const CFormatInfo g_Formats[] =
272*f6dc9357SAndroid Build Coastguard Worker {
273*f6dc9357SAndroid Build Coastguard Worker {
274*f6dc9357SAndroid Build Coastguard Worker "",
275*f6dc9357SAndroid Build Coastguard Worker // (1 << 0) | (1 << 1) | (1 << 3) | (1 << 5) | (1 << 7) | (1 << 9),
276*f6dc9357SAndroid Build Coastguard Worker ((UInt32)1 << 10) - 1,
277*f6dc9357SAndroid Build Coastguard Worker // (UInt32)(Int32)-1,
278*f6dc9357SAndroid Build Coastguard Worker 0, NULL,
279*f6dc9357SAndroid Build Coastguard Worker kFF_MultiThread | kFF_MemUse
280*f6dc9357SAndroid Build Coastguard Worker },
281*f6dc9357SAndroid Build Coastguard Worker {
282*f6dc9357SAndroid Build Coastguard Worker "7z",
283*f6dc9357SAndroid Build Coastguard Worker // (1 << 0) | (1 << 1) | (1 << 3) | (1 << 5) | (1 << 7) | (1 << 9),
284*f6dc9357SAndroid Build Coastguard Worker (1 << 10) - 1,
285*f6dc9357SAndroid Build Coastguard Worker METHODS_PAIR(g_7zMethods),
286*f6dc9357SAndroid Build Coastguard Worker kFF_Filter | kFF_Solid | kFF_MultiThread | kFF_Encrypt |
287*f6dc9357SAndroid Build Coastguard Worker kFF_EncryptFileNames | kFF_MemUse | kFF_SFX
288*f6dc9357SAndroid Build Coastguard Worker // | kFF_Time_Win
289*f6dc9357SAndroid Build Coastguard Worker },
290*f6dc9357SAndroid Build Coastguard Worker {
291*f6dc9357SAndroid Build Coastguard Worker "Zip",
292*f6dc9357SAndroid Build Coastguard Worker (1 << 0) | (1 << 1) | (1 << 3) | (1 << 5) | (1 << 7) | (1 << 9),
293*f6dc9357SAndroid Build Coastguard Worker METHODS_PAIR(g_ZipMethods),
294*f6dc9357SAndroid Build Coastguard Worker kFF_MultiThread | kFF_Encrypt | kFF_MemUse
295*f6dc9357SAndroid Build Coastguard Worker // | kFF_Time_Win | kFF_Time_Unix | kFF_Time_DOS
296*f6dc9357SAndroid Build Coastguard Worker },
297*f6dc9357SAndroid Build Coastguard Worker {
298*f6dc9357SAndroid Build Coastguard Worker "GZip",
299*f6dc9357SAndroid Build Coastguard Worker (1 << 1) | (1 << 5) | (1 << 7) | (1 << 9),
300*f6dc9357SAndroid Build Coastguard Worker METHODS_PAIR(g_GZipMethods),
301*f6dc9357SAndroid Build Coastguard Worker kFF_MemUse
302*f6dc9357SAndroid Build Coastguard Worker // | kFF_Time_Unix
303*f6dc9357SAndroid Build Coastguard Worker },
304*f6dc9357SAndroid Build Coastguard Worker {
305*f6dc9357SAndroid Build Coastguard Worker "BZip2",
306*f6dc9357SAndroid Build Coastguard Worker (1 << 1) | (1 << 3) | (1 << 5) | (1 << 7) | (1 << 9),
307*f6dc9357SAndroid Build Coastguard Worker METHODS_PAIR(g_BZip2Methods),
308*f6dc9357SAndroid Build Coastguard Worker kFF_MultiThread | kFF_MemUse
309*f6dc9357SAndroid Build Coastguard Worker },
310*f6dc9357SAndroid Build Coastguard Worker {
311*f6dc9357SAndroid Build Coastguard Worker "xz",
312*f6dc9357SAndroid Build Coastguard Worker // (1 << 1) | (1 << 3) | (1 << 5) | (1 << 7) | (1 << 9),
313*f6dc9357SAndroid Build Coastguard Worker (1 << 10) - 1 - (1 << 0), // store (1 << 0) is not supported
314*f6dc9357SAndroid Build Coastguard Worker METHODS_PAIR(g_XzMethods),
315*f6dc9357SAndroid Build Coastguard Worker kFF_Solid | kFF_MultiThread | kFF_MemUse
316*f6dc9357SAndroid Build Coastguard Worker },
317*f6dc9357SAndroid Build Coastguard Worker /*
318*f6dc9357SAndroid Build Coastguard Worker {
319*f6dc9357SAndroid Build Coastguard Worker "zstd",
320*f6dc9357SAndroid Build Coastguard Worker // (1 << (MY_ZSTD_LEVEL_MAX + 1)) - 1,
321*f6dc9357SAndroid Build Coastguard Worker (1 << (9 + 1)) - 1,
322*f6dc9357SAndroid Build Coastguard Worker METHODS_PAIR(g_ZstdMethods),
323*f6dc9357SAndroid Build Coastguard Worker // kFF_Solid |
324*f6dc9357SAndroid Build Coastguard Worker kFF_MultiThread
325*f6dc9357SAndroid Build Coastguard Worker | kFF_MemUse
326*f6dc9357SAndroid Build Coastguard Worker },
327*f6dc9357SAndroid Build Coastguard Worker */
328*f6dc9357SAndroid Build Coastguard Worker /*
329*f6dc9357SAndroid Build Coastguard Worker {
330*f6dc9357SAndroid Build Coastguard Worker "Swfc",
331*f6dc9357SAndroid Build Coastguard Worker (1 << 1) | (1 << 3) | (1 << 5) | (1 << 7) | (1 << 9),
332*f6dc9357SAndroid Build Coastguard Worker METHODS_PAIR(g_SwfcMethods),
333*f6dc9357SAndroid Build Coastguard Worker 0
334*f6dc9357SAndroid Build Coastguard Worker },
335*f6dc9357SAndroid Build Coastguard Worker */
336*f6dc9357SAndroid Build Coastguard Worker {
337*f6dc9357SAndroid Build Coastguard Worker "Tar",
338*f6dc9357SAndroid Build Coastguard Worker (1 << 0),
339*f6dc9357SAndroid Build Coastguard Worker METHODS_PAIR(g_TarMethods),
340*f6dc9357SAndroid Build Coastguard Worker 0
341*f6dc9357SAndroid Build Coastguard Worker // kFF_Time_Unix | kFF_Time_Win // | kFF_Time_1ns
342*f6dc9357SAndroid Build Coastguard Worker },
343*f6dc9357SAndroid Build Coastguard Worker {
344*f6dc9357SAndroid Build Coastguard Worker "wim",
345*f6dc9357SAndroid Build Coastguard Worker (1 << 0),
346*f6dc9357SAndroid Build Coastguard Worker 0, NULL,
347*f6dc9357SAndroid Build Coastguard Worker 0
348*f6dc9357SAndroid Build Coastguard Worker // | kFF_Time_Win
349*f6dc9357SAndroid Build Coastguard Worker },
350*f6dc9357SAndroid Build Coastguard Worker {
351*f6dc9357SAndroid Build Coastguard Worker "Hash",
352*f6dc9357SAndroid Build Coastguard Worker (0 << 0),
353*f6dc9357SAndroid Build Coastguard Worker METHODS_PAIR(g_HashMethods),
354*f6dc9357SAndroid Build Coastguard Worker 0
355*f6dc9357SAndroid Build Coastguard Worker }
356*f6dc9357SAndroid Build Coastguard Worker };
357*f6dc9357SAndroid Build Coastguard Worker
IsMethodSupportedBySfx(int methodID)358*f6dc9357SAndroid Build Coastguard Worker static bool IsMethodSupportedBySfx(int methodID)
359*f6dc9357SAndroid Build Coastguard Worker {
360*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < Z7_ARRAY_SIZE(g_7zSfxMethods); i++)
361*f6dc9357SAndroid Build Coastguard Worker if (methodID == g_7zSfxMethods[i])
362*f6dc9357SAndroid Build Coastguard Worker return true;
363*f6dc9357SAndroid Build Coastguard Worker return false;
364*f6dc9357SAndroid Build Coastguard Worker }
365*f6dc9357SAndroid Build Coastguard Worker
366*f6dc9357SAndroid Build Coastguard Worker
367*f6dc9357SAndroid Build Coastguard Worker static const
368*f6dc9357SAndroid Build Coastguard Worker // NCompressDialog::NUpdateMode::EEnum
369*f6dc9357SAndroid Build Coastguard Worker int
370*f6dc9357SAndroid Build Coastguard Worker k_UpdateMode_Vals[] =
371*f6dc9357SAndroid Build Coastguard Worker {
372*f6dc9357SAndroid Build Coastguard Worker NCompressDialog::NUpdateMode::kAdd,
373*f6dc9357SAndroid Build Coastguard Worker NCompressDialog::NUpdateMode::kUpdate,
374*f6dc9357SAndroid Build Coastguard Worker NCompressDialog::NUpdateMode::kFresh,
375*f6dc9357SAndroid Build Coastguard Worker NCompressDialog::NUpdateMode::kSync
376*f6dc9357SAndroid Build Coastguard Worker };
377*f6dc9357SAndroid Build Coastguard Worker
378*f6dc9357SAndroid Build Coastguard Worker static const UInt32 k_UpdateMode_IDs[] =
379*f6dc9357SAndroid Build Coastguard Worker {
380*f6dc9357SAndroid Build Coastguard Worker IDS_COMPRESS_UPDATE_MODE_ADD,
381*f6dc9357SAndroid Build Coastguard Worker IDS_COMPRESS_UPDATE_MODE_UPDATE,
382*f6dc9357SAndroid Build Coastguard Worker IDS_COMPRESS_UPDATE_MODE_FRESH,
383*f6dc9357SAndroid Build Coastguard Worker IDS_COMPRESS_UPDATE_MODE_SYNC
384*f6dc9357SAndroid Build Coastguard Worker };
385*f6dc9357SAndroid Build Coastguard Worker
386*f6dc9357SAndroid Build Coastguard Worker static const
387*f6dc9357SAndroid Build Coastguard Worker // NWildcard::ECensorPathMode
388*f6dc9357SAndroid Build Coastguard Worker int
389*f6dc9357SAndroid Build Coastguard Worker k_PathMode_Vals[] =
390*f6dc9357SAndroid Build Coastguard Worker {
391*f6dc9357SAndroid Build Coastguard Worker NWildcard::k_RelatPath,
392*f6dc9357SAndroid Build Coastguard Worker NWildcard::k_FullPath,
393*f6dc9357SAndroid Build Coastguard Worker NWildcard::k_AbsPath,
394*f6dc9357SAndroid Build Coastguard Worker };
395*f6dc9357SAndroid Build Coastguard Worker
396*f6dc9357SAndroid Build Coastguard Worker static const UInt32 k_PathMode_IDs[] =
397*f6dc9357SAndroid Build Coastguard Worker {
398*f6dc9357SAndroid Build Coastguard Worker IDS_PATH_MODE_RELAT,
399*f6dc9357SAndroid Build Coastguard Worker IDS_EXTRACT_PATHS_FULL,
400*f6dc9357SAndroid Build Coastguard Worker IDS_EXTRACT_PATHS_ABS
401*f6dc9357SAndroid Build Coastguard Worker };
402*f6dc9357SAndroid Build Coastguard Worker
403*f6dc9357SAndroid Build Coastguard Worker void AddComboItems(NControl::CComboBox &combo, const UInt32 *langIDs, unsigned numItems, const int *values, int curVal);
404*f6dc9357SAndroid Build Coastguard Worker
SetMethods(const CObjectVector<CCodecInfoUser> & userCodecs)405*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetMethods(const CObjectVector<CCodecInfoUser> &userCodecs)
406*f6dc9357SAndroid Build Coastguard Worker {
407*f6dc9357SAndroid Build Coastguard Worker ExternalMethods.Clear();
408*f6dc9357SAndroid Build Coastguard Worker {
409*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, userCodecs)
410*f6dc9357SAndroid Build Coastguard Worker {
411*f6dc9357SAndroid Build Coastguard Worker const CCodecInfoUser &c = userCodecs[i];
412*f6dc9357SAndroid Build Coastguard Worker if (!c.EncoderIsAssigned
413*f6dc9357SAndroid Build Coastguard Worker || !c.IsFilter_Assigned
414*f6dc9357SAndroid Build Coastguard Worker || c.IsFilter
415*f6dc9357SAndroid Build Coastguard Worker || c.NumStreams != 1)
416*f6dc9357SAndroid Build Coastguard Worker continue;
417*f6dc9357SAndroid Build Coastguard Worker unsigned k;
418*f6dc9357SAndroid Build Coastguard Worker for (k = 0; k < Z7_ARRAY_SIZE(g_7zMethods); k++)
419*f6dc9357SAndroid Build Coastguard Worker if (c.Name.IsEqualTo_Ascii_NoCase(kMethodsNames[g_7zMethods[k]]))
420*f6dc9357SAndroid Build Coastguard Worker break;
421*f6dc9357SAndroid Build Coastguard Worker if (k != Z7_ARRAY_SIZE(g_7zMethods))
422*f6dc9357SAndroid Build Coastguard Worker continue;
423*f6dc9357SAndroid Build Coastguard Worker ExternalMethods.Add(c.Name);
424*f6dc9357SAndroid Build Coastguard Worker }
425*f6dc9357SAndroid Build Coastguard Worker }
426*f6dc9357SAndroid Build Coastguard Worker }
427*f6dc9357SAndroid Build Coastguard Worker
428*f6dc9357SAndroid Build Coastguard Worker
OnInit()429*f6dc9357SAndroid Build Coastguard Worker bool CCompressDialog::OnInit()
430*f6dc9357SAndroid Build Coastguard Worker {
431*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
432*f6dc9357SAndroid Build Coastguard Worker LangSetWindowText(*this, IDD_COMPRESS);
433*f6dc9357SAndroid Build Coastguard Worker LangSetDlgItems(*this, kLangIDs, Z7_ARRAY_SIZE(kLangIDs));
434*f6dc9357SAndroid Build Coastguard Worker // LangSetDlgItemText(*this, IDB_COMPRESS_OPTIONS, IDS_OPTIONS); // IDG_COMPRESS_OPTIONS
435*f6dc9357SAndroid Build Coastguard Worker #endif
436*f6dc9357SAndroid Build Coastguard Worker
437*f6dc9357SAndroid Build Coastguard Worker {
438*f6dc9357SAndroid Build Coastguard Worker size_t size = (size_t)sizeof(size_t) << 29;
439*f6dc9357SAndroid Build Coastguard Worker _ramSize_Defined = NSystem::GetRamSize(size);
440*f6dc9357SAndroid Build Coastguard Worker // size = (UInt64)3 << 62; // for debug only;
441*f6dc9357SAndroid Build Coastguard Worker {
442*f6dc9357SAndroid Build Coastguard Worker // we use reduced limit for 32-bit version:
443*f6dc9357SAndroid Build Coastguard Worker unsigned bits = sizeof(size_t) * 8;
444*f6dc9357SAndroid Build Coastguard Worker if (bits == 32)
445*f6dc9357SAndroid Build Coastguard Worker {
446*f6dc9357SAndroid Build Coastguard Worker const UInt32 limit2 = (UInt32)7 << 28;
447*f6dc9357SAndroid Build Coastguard Worker if (size > limit2)
448*f6dc9357SAndroid Build Coastguard Worker size = limit2;
449*f6dc9357SAndroid Build Coastguard Worker }
450*f6dc9357SAndroid Build Coastguard Worker }
451*f6dc9357SAndroid Build Coastguard Worker _ramSize = size;
452*f6dc9357SAndroid Build Coastguard Worker const size_t kMinUseSize = 1 << 26;
453*f6dc9357SAndroid Build Coastguard Worker if (size < kMinUseSize)
454*f6dc9357SAndroid Build Coastguard Worker size = kMinUseSize;
455*f6dc9357SAndroid Build Coastguard Worker _ramSize_Reduced = size;
456*f6dc9357SAndroid Build Coastguard Worker
457*f6dc9357SAndroid Build Coastguard Worker // 80% - is auto usage limit in handlers
458*f6dc9357SAndroid Build Coastguard Worker _ramUsage_Auto = Calc_From_Val_Percents(size, 80);
459*f6dc9357SAndroid Build Coastguard Worker }
460*f6dc9357SAndroid Build Coastguard Worker
461*f6dc9357SAndroid Build Coastguard Worker _password1Control.Attach(GetItem(IDE_COMPRESS_PASSWORD1));
462*f6dc9357SAndroid Build Coastguard Worker _password2Control.Attach(GetItem(IDE_COMPRESS_PASSWORD2));
463*f6dc9357SAndroid Build Coastguard Worker _password1Control.SetText(Info.Password);
464*f6dc9357SAndroid Build Coastguard Worker _password2Control.SetText(Info.Password);
465*f6dc9357SAndroid Build Coastguard Worker _encryptionMethod.Attach(GetItem(IDC_COMPRESS_ENCRYPTION_METHOD));
466*f6dc9357SAndroid Build Coastguard Worker _default_encryptionMethod_Index = -1;
467*f6dc9357SAndroid Build Coastguard Worker
468*f6dc9357SAndroid Build Coastguard Worker m_ArchivePath.Attach(GetItem(IDC_COMPRESS_ARCHIVE));
469*f6dc9357SAndroid Build Coastguard Worker m_Format.Attach(GetItem(IDC_COMPRESS_FORMAT)); // that combo has CBS_SORT style in resources
470*f6dc9357SAndroid Build Coastguard Worker m_Level.Attach(GetItem(IDC_COMPRESS_LEVEL));
471*f6dc9357SAndroid Build Coastguard Worker m_Method.Attach(GetItem(IDC_COMPRESS_METHOD));
472*f6dc9357SAndroid Build Coastguard Worker m_Dictionary.Attach(GetItem(IDC_COMPRESS_DICTIONARY));
473*f6dc9357SAndroid Build Coastguard Worker
474*f6dc9357SAndroid Build Coastguard Worker /*
475*f6dc9357SAndroid Build Coastguard Worker {
476*f6dc9357SAndroid Build Coastguard Worker RECT r;
477*f6dc9357SAndroid Build Coastguard Worker GetClientRectOfItem(IDC_COMPRESS_DICTIONARY, r);
478*f6dc9357SAndroid Build Coastguard Worker _dictionaryCombo_left = r.left;
479*f6dc9357SAndroid Build Coastguard Worker }
480*f6dc9357SAndroid Build Coastguard Worker */
481*f6dc9357SAndroid Build Coastguard Worker _dictionaryCombo_left = 0; // 230;
482*f6dc9357SAndroid Build Coastguard Worker
483*f6dc9357SAndroid Build Coastguard Worker // m_Dictionary_Chain.Attach(GetItem(IDC_COMPRESS_DICTIONARY2));
484*f6dc9357SAndroid Build Coastguard Worker m_Order.Attach(GetItem(IDC_COMPRESS_ORDER));
485*f6dc9357SAndroid Build Coastguard Worker m_Solid.Attach(GetItem(IDC_COMPRESS_SOLID));
486*f6dc9357SAndroid Build Coastguard Worker m_NumThreads.Attach(GetItem(IDC_COMPRESS_THREADS));
487*f6dc9357SAndroid Build Coastguard Worker m_MemUse.Attach(GetItem(IDC_COMPRESS_MEM_USE));
488*f6dc9357SAndroid Build Coastguard Worker
489*f6dc9357SAndroid Build Coastguard Worker m_UpdateMode.Attach(GetItem(IDC_COMPRESS_UPDATE_MODE));
490*f6dc9357SAndroid Build Coastguard Worker m_PathMode.Attach(GetItem(IDC_COMPRESS_PATH_MODE));
491*f6dc9357SAndroid Build Coastguard Worker
492*f6dc9357SAndroid Build Coastguard Worker m_Volume.Attach(GetItem(IDC_COMPRESS_VOLUME));
493*f6dc9357SAndroid Build Coastguard Worker m_Params.Attach(GetItem(IDE_COMPRESS_PARAMETERS));
494*f6dc9357SAndroid Build Coastguard Worker
495*f6dc9357SAndroid Build Coastguard Worker AddVolumeItems(m_Volume);
496*f6dc9357SAndroid Build Coastguard Worker
497*f6dc9357SAndroid Build Coastguard Worker m_RegistryInfo.Load();
498*f6dc9357SAndroid Build Coastguard Worker CheckButton(IDX_PASSWORD_SHOW, m_RegistryInfo.ShowPassword);
499*f6dc9357SAndroid Build Coastguard Worker CheckButton(IDX_COMPRESS_ENCRYPT_FILE_NAMES, m_RegistryInfo.EncryptHeaders);
500*f6dc9357SAndroid Build Coastguard Worker
501*f6dc9357SAndroid Build Coastguard Worker UpdatePasswordControl();
502*f6dc9357SAndroid Build Coastguard Worker
503*f6dc9357SAndroid Build Coastguard Worker {
504*f6dc9357SAndroid Build Coastguard Worker const bool needSetMain = (Info.FormatIndex < 0);
505*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR(i, ArcIndices)
506*f6dc9357SAndroid Build Coastguard Worker {
507*f6dc9357SAndroid Build Coastguard Worker const unsigned arcIndex = ArcIndices[i];
508*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = (*ArcFormats)[arcIndex];
509*f6dc9357SAndroid Build Coastguard Worker const int index = (int)m_Format.AddString(ai.Name);
510*f6dc9357SAndroid Build Coastguard Worker m_Format.SetItemData(index, (LPARAM)arcIndex);
511*f6dc9357SAndroid Build Coastguard Worker if (!needSetMain)
512*f6dc9357SAndroid Build Coastguard Worker {
513*f6dc9357SAndroid Build Coastguard Worker if (Info.FormatIndex == (int)arcIndex)
514*f6dc9357SAndroid Build Coastguard Worker m_Format.SetCurSel(index);
515*f6dc9357SAndroid Build Coastguard Worker continue;
516*f6dc9357SAndroid Build Coastguard Worker }
517*f6dc9357SAndroid Build Coastguard Worker if (i == 0 || ai.Name.IsEqualTo_NoCase(m_RegistryInfo.ArcType))
518*f6dc9357SAndroid Build Coastguard Worker {
519*f6dc9357SAndroid Build Coastguard Worker m_Format.SetCurSel(index);
520*f6dc9357SAndroid Build Coastguard Worker Info.FormatIndex = (int)arcIndex;
521*f6dc9357SAndroid Build Coastguard Worker }
522*f6dc9357SAndroid Build Coastguard Worker }
523*f6dc9357SAndroid Build Coastguard Worker }
524*f6dc9357SAndroid Build Coastguard Worker
525*f6dc9357SAndroid Build Coastguard Worker CheckButton(IDX_COMPRESS_SFX, Info.SFXMode);
526*f6dc9357SAndroid Build Coastguard Worker
527*f6dc9357SAndroid Build Coastguard Worker {
528*f6dc9357SAndroid Build Coastguard Worker UString fileName;
529*f6dc9357SAndroid Build Coastguard Worker SetArcPathFields(Info.ArcPath, fileName, true);
530*f6dc9357SAndroid Build Coastguard Worker StartDirPrefix = DirPrefix;
531*f6dc9357SAndroid Build Coastguard Worker SetArchiveName(fileName);
532*f6dc9357SAndroid Build Coastguard Worker }
533*f6dc9357SAndroid Build Coastguard Worker
534*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < m_RegistryInfo.ArcPaths.Size() && i < kHistorySize; i++)
535*f6dc9357SAndroid Build Coastguard Worker m_ArchivePath.AddString(m_RegistryInfo.ArcPaths[i]);
536*f6dc9357SAndroid Build Coastguard Worker
537*f6dc9357SAndroid Build Coastguard Worker AddComboItems(m_UpdateMode, k_UpdateMode_IDs, Z7_ARRAY_SIZE(k_UpdateMode_IDs),
538*f6dc9357SAndroid Build Coastguard Worker k_UpdateMode_Vals, Info.UpdateMode);
539*f6dc9357SAndroid Build Coastguard Worker
540*f6dc9357SAndroid Build Coastguard Worker AddComboItems(m_PathMode, k_PathMode_IDs, Z7_ARRAY_SIZE(k_PathMode_IDs),
541*f6dc9357SAndroid Build Coastguard Worker k_PathMode_Vals, Info.PathMode);
542*f6dc9357SAndroid Build Coastguard Worker
543*f6dc9357SAndroid Build Coastguard Worker
544*f6dc9357SAndroid Build Coastguard Worker TCHAR s[32] = { TEXT('/'), TEXT(' '), 0 };
545*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToString(NSystem::GetNumberOfProcessors(), s + 2);
546*f6dc9357SAndroid Build Coastguard Worker SetItemText(IDT_COMPRESS_HARDWARE_THREADS, s);
547*f6dc9357SAndroid Build Coastguard Worker
548*f6dc9357SAndroid Build Coastguard Worker CheckButton(IDX_COMPRESS_SHARED, Info.OpenShareForWrite);
549*f6dc9357SAndroid Build Coastguard Worker CheckButton(IDX_COMPRESS_DEL, Info.DeleteAfterCompressing);
550*f6dc9357SAndroid Build Coastguard Worker
551*f6dc9357SAndroid Build Coastguard Worker FormatChanged(false); // isChanged
552*f6dc9357SAndroid Build Coastguard Worker
553*f6dc9357SAndroid Build Coastguard Worker // OnButtonSFX();
554*f6dc9357SAndroid Build Coastguard Worker
555*f6dc9357SAndroid Build Coastguard Worker NormalizePosition();
556*f6dc9357SAndroid Build Coastguard Worker
557*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnInit();
558*f6dc9357SAndroid Build Coastguard Worker }
559*f6dc9357SAndroid Build Coastguard Worker
560*f6dc9357SAndroid Build Coastguard Worker /*
561*f6dc9357SAndroid Build Coastguard Worker namespace NCompressDialog
562*f6dc9357SAndroid Build Coastguard Worker {
563*f6dc9357SAndroid Build Coastguard Worker bool CInfo::GetFullPathName(UString &result) const
564*f6dc9357SAndroid Build Coastguard Worker {
565*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
566*f6dc9357SAndroid Build Coastguard Worker // NDirectory::MySetCurrentDirectory(CurrentDirPrefix);
567*f6dc9357SAndroid Build Coastguard Worker #endif
568*f6dc9357SAndroid Build Coastguard Worker FString resultF;
569*f6dc9357SAndroid Build Coastguard Worker bool res = MyGetFullPathName(us2fs(ArchiveName), resultF);
570*f6dc9357SAndroid Build Coastguard Worker result = fs2us(resultF);
571*f6dc9357SAndroid Build Coastguard Worker return res;
572*f6dc9357SAndroid Build Coastguard Worker }
573*f6dc9357SAndroid Build Coastguard Worker }
574*f6dc9357SAndroid Build Coastguard Worker */
575*f6dc9357SAndroid Build Coastguard Worker
UpdatePasswordControl()576*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::UpdatePasswordControl()
577*f6dc9357SAndroid Build Coastguard Worker {
578*f6dc9357SAndroid Build Coastguard Worker const bool showPassword = IsShowPasswordChecked();
579*f6dc9357SAndroid Build Coastguard Worker const TCHAR c = showPassword ? (TCHAR)0: TEXT('*');
580*f6dc9357SAndroid Build Coastguard Worker _password1Control.SetPasswordChar((WPARAM)c);
581*f6dc9357SAndroid Build Coastguard Worker _password2Control.SetPasswordChar((WPARAM)c);
582*f6dc9357SAndroid Build Coastguard Worker UString password;
583*f6dc9357SAndroid Build Coastguard Worker _password1Control.GetText(password);
584*f6dc9357SAndroid Build Coastguard Worker _password1Control.SetText(password);
585*f6dc9357SAndroid Build Coastguard Worker _password2Control.GetText(password);
586*f6dc9357SAndroid Build Coastguard Worker _password2Control.SetText(password);
587*f6dc9357SAndroid Build Coastguard Worker
588*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool(IDT_PASSWORD_REENTER, !showPassword);
589*f6dc9357SAndroid Build Coastguard Worker _password2Control.Show_Bool(!showPassword);
590*f6dc9357SAndroid Build Coastguard Worker }
591*f6dc9357SAndroid Build Coastguard Worker
OnButtonClicked(unsigned buttonID,HWND buttonHWND)592*f6dc9357SAndroid Build Coastguard Worker bool CCompressDialog::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
593*f6dc9357SAndroid Build Coastguard Worker {
594*f6dc9357SAndroid Build Coastguard Worker switch (buttonID)
595*f6dc9357SAndroid Build Coastguard Worker {
596*f6dc9357SAndroid Build Coastguard Worker case IDB_COMPRESS_SET_ARCHIVE:
597*f6dc9357SAndroid Build Coastguard Worker {
598*f6dc9357SAndroid Build Coastguard Worker OnButtonSetArchive();
599*f6dc9357SAndroid Build Coastguard Worker return true;
600*f6dc9357SAndroid Build Coastguard Worker }
601*f6dc9357SAndroid Build Coastguard Worker case IDX_COMPRESS_SFX:
602*f6dc9357SAndroid Build Coastguard Worker {
603*f6dc9357SAndroid Build Coastguard Worker SetMethod(GetMethodID());
604*f6dc9357SAndroid Build Coastguard Worker OnButtonSFX();
605*f6dc9357SAndroid Build Coastguard Worker SetMemoryUsage();
606*f6dc9357SAndroid Build Coastguard Worker return true;
607*f6dc9357SAndroid Build Coastguard Worker }
608*f6dc9357SAndroid Build Coastguard Worker case IDX_PASSWORD_SHOW:
609*f6dc9357SAndroid Build Coastguard Worker {
610*f6dc9357SAndroid Build Coastguard Worker UpdatePasswordControl();
611*f6dc9357SAndroid Build Coastguard Worker return true;
612*f6dc9357SAndroid Build Coastguard Worker }
613*f6dc9357SAndroid Build Coastguard Worker case IDB_COMPRESS_OPTIONS:
614*f6dc9357SAndroid Build Coastguard Worker {
615*f6dc9357SAndroid Build Coastguard Worker COptionsDialog dialog(this);
616*f6dc9357SAndroid Build Coastguard Worker if (dialog.Create(*this) == IDOK)
617*f6dc9357SAndroid Build Coastguard Worker ShowOptionsString();
618*f6dc9357SAndroid Build Coastguard Worker return true;
619*f6dc9357SAndroid Build Coastguard Worker }
620*f6dc9357SAndroid Build Coastguard Worker }
621*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnButtonClicked(buttonID, buttonHWND);
622*f6dc9357SAndroid Build Coastguard Worker }
623*f6dc9357SAndroid Build Coastguard Worker
CheckSFXControlsEnable()624*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::CheckSFXControlsEnable()
625*f6dc9357SAndroid Build Coastguard Worker {
626*f6dc9357SAndroid Build Coastguard Worker const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];
627*f6dc9357SAndroid Build Coastguard Worker bool enable = fi.SFX_();
628*f6dc9357SAndroid Build Coastguard Worker if (enable)
629*f6dc9357SAndroid Build Coastguard Worker {
630*f6dc9357SAndroid Build Coastguard Worker const int methodID = GetMethodID();
631*f6dc9357SAndroid Build Coastguard Worker enable = (methodID == -1 || IsMethodSupportedBySfx(methodID));
632*f6dc9357SAndroid Build Coastguard Worker }
633*f6dc9357SAndroid Build Coastguard Worker if (!enable)
634*f6dc9357SAndroid Build Coastguard Worker CheckButton(IDX_COMPRESS_SFX, false);
635*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDX_COMPRESS_SFX, enable);
636*f6dc9357SAndroid Build Coastguard Worker }
637*f6dc9357SAndroid Build Coastguard Worker
638*f6dc9357SAndroid Build Coastguard Worker /*
639*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::CheckVolumeEnable()
640*f6dc9357SAndroid Build Coastguard Worker {
641*f6dc9357SAndroid Build Coastguard Worker bool isSFX = IsSFX();
642*f6dc9357SAndroid Build Coastguard Worker m_Volume.Enable(!isSFX);
643*f6dc9357SAndroid Build Coastguard Worker if (isSFX)
644*f6dc9357SAndroid Build Coastguard Worker m_Volume.SetText(TEXT(""));
645*f6dc9357SAndroid Build Coastguard Worker }
646*f6dc9357SAndroid Build Coastguard Worker */
647*f6dc9357SAndroid Build Coastguard Worker
EnableMultiCombo(unsigned id)648*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::EnableMultiCombo(unsigned id)
649*f6dc9357SAndroid Build Coastguard Worker {
650*f6dc9357SAndroid Build Coastguard Worker NWindows::NControl::CComboBox combo;
651*f6dc9357SAndroid Build Coastguard Worker combo.Attach(GetItem(id));
652*f6dc9357SAndroid Build Coastguard Worker const bool enable = (combo.GetCount() > 1);
653*f6dc9357SAndroid Build Coastguard Worker EnableItem(id, enable);
654*f6dc9357SAndroid Build Coastguard Worker }
655*f6dc9357SAndroid Build Coastguard Worker
656*f6dc9357SAndroid Build Coastguard Worker static LRESULT ComboBox_AddStringAscii(NControl::CComboBox &cb, const char *s);
657*f6dc9357SAndroid Build Coastguard Worker
Combine_Two_BoolPairs(const CBoolPair & b1,const CBoolPair & b2,CBool1 & res)658*f6dc9357SAndroid Build Coastguard Worker static void Combine_Two_BoolPairs(const CBoolPair &b1, const CBoolPair &b2, CBool1 &res)
659*f6dc9357SAndroid Build Coastguard Worker {
660*f6dc9357SAndroid Build Coastguard Worker if (!b1.Def && b2.Def)
661*f6dc9357SAndroid Build Coastguard Worker res.Val = b2.Val;
662*f6dc9357SAndroid Build Coastguard Worker else
663*f6dc9357SAndroid Build Coastguard Worker res.Val = b1.Val;
664*f6dc9357SAndroid Build Coastguard Worker }
665*f6dc9357SAndroid Build Coastguard Worker
666*f6dc9357SAndroid Build Coastguard Worker #define SET_GUI_BOOL(name) \
667*f6dc9357SAndroid Build Coastguard Worker Combine_Two_BoolPairs(Info. name, m_RegistryInfo. name, name)
668*f6dc9357SAndroid Build Coastguard Worker
669*f6dc9357SAndroid Build Coastguard Worker
Set_Final_BoolPairs(const CBool1 & gui,CBoolPair & cmd,CBoolPair & reg)670*f6dc9357SAndroid Build Coastguard Worker static void Set_Final_BoolPairs(
671*f6dc9357SAndroid Build Coastguard Worker const CBool1 &gui,
672*f6dc9357SAndroid Build Coastguard Worker CBoolPair &cmd,
673*f6dc9357SAndroid Build Coastguard Worker CBoolPair ®)
674*f6dc9357SAndroid Build Coastguard Worker {
675*f6dc9357SAndroid Build Coastguard Worker if (!cmd.Def)
676*f6dc9357SAndroid Build Coastguard Worker {
677*f6dc9357SAndroid Build Coastguard Worker reg.Val = gui.Val;
678*f6dc9357SAndroid Build Coastguard Worker reg.Def = gui.Val;
679*f6dc9357SAndroid Build Coastguard Worker }
680*f6dc9357SAndroid Build Coastguard Worker if (gui.Supported)
681*f6dc9357SAndroid Build Coastguard Worker {
682*f6dc9357SAndroid Build Coastguard Worker cmd.Val = gui.Val;
683*f6dc9357SAndroid Build Coastguard Worker cmd.Def = gui.Val;
684*f6dc9357SAndroid Build Coastguard Worker }
685*f6dc9357SAndroid Build Coastguard Worker else
686*f6dc9357SAndroid Build Coastguard Worker cmd.Init();
687*f6dc9357SAndroid Build Coastguard Worker }
688*f6dc9357SAndroid Build Coastguard Worker
689*f6dc9357SAndroid Build Coastguard Worker #define SET_FINAL_BOOL_PAIRS(name) \
690*f6dc9357SAndroid Build Coastguard Worker Set_Final_BoolPairs(name, Info. name, m_RegistryInfo. name)
691*f6dc9357SAndroid Build Coastguard Worker
FormatChanged(bool isChanged)692*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::FormatChanged(bool isChanged)
693*f6dc9357SAndroid Build Coastguard Worker {
694*f6dc9357SAndroid Build Coastguard Worker SetLevel();
695*f6dc9357SAndroid Build Coastguard Worker SetSolidBlockSize();
696*f6dc9357SAndroid Build Coastguard Worker SetParams();
697*f6dc9357SAndroid Build Coastguard Worker SetMemUseCombo();
698*f6dc9357SAndroid Build Coastguard Worker SetNumThreads();
699*f6dc9357SAndroid Build Coastguard Worker
700*f6dc9357SAndroid Build Coastguard Worker const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];
701*f6dc9357SAndroid Build Coastguard Worker Info.SolidIsSpecified = fi.Solid_();
702*f6dc9357SAndroid Build Coastguard Worker Info.EncryptHeadersIsAllowed = fi.EncryptFileNames_();
703*f6dc9357SAndroid Build Coastguard Worker
704*f6dc9357SAndroid Build Coastguard Worker /*
705*f6dc9357SAndroid Build Coastguard Worker const bool multiThreadEnable = fi.MultiThread;
706*f6dc9357SAndroid Build Coastguard Worker Info.MultiThreadIsAllowed = multiThreadEnable;
707*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDC_COMPRESS_SOLID, fi.Solid);
708*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDC_COMPRESS_THREADS, multiThreadEnable);
709*f6dc9357SAndroid Build Coastguard Worker const bool methodEnable = (fi.MethodIDs != NULL);
710*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDC_COMPRESS_METHOD, methodEnable);
711*f6dc9357SAndroid Build Coastguard Worker EnableMultiCombo(IDC_COMPRESS_DICTIONARY, methodEnable);
712*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDC_COMPRESS_ORDER, methodEnable);
713*f6dc9357SAndroid Build Coastguard Worker */
714*f6dc9357SAndroid Build Coastguard Worker
715*f6dc9357SAndroid Build Coastguard Worker CheckSFXControlsEnable();
716*f6dc9357SAndroid Build Coastguard Worker
717*f6dc9357SAndroid Build Coastguard Worker {
718*f6dc9357SAndroid Build Coastguard Worker if (!isChanged)
719*f6dc9357SAndroid Build Coastguard Worker {
720*f6dc9357SAndroid Build Coastguard Worker SET_GUI_BOOL (SymLinks);
721*f6dc9357SAndroid Build Coastguard Worker SET_GUI_BOOL (HardLinks);
722*f6dc9357SAndroid Build Coastguard Worker SET_GUI_BOOL (AltStreams);
723*f6dc9357SAndroid Build Coastguard Worker SET_GUI_BOOL (NtSecurity);
724*f6dc9357SAndroid Build Coastguard Worker SET_GUI_BOOL (PreserveATime);
725*f6dc9357SAndroid Build Coastguard Worker }
726*f6dc9357SAndroid Build Coastguard Worker
727*f6dc9357SAndroid Build Coastguard Worker PreserveATime.Supported = true;
728*f6dc9357SAndroid Build Coastguard Worker
729*f6dc9357SAndroid Build Coastguard Worker {
730*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = Get_ArcInfoEx();
731*f6dc9357SAndroid Build Coastguard Worker SymLinks.Supported = ai.Flags_SymLinks();
732*f6dc9357SAndroid Build Coastguard Worker HardLinks.Supported = ai.Flags_HardLinks();
733*f6dc9357SAndroid Build Coastguard Worker AltStreams.Supported = ai.Flags_AltStreams();
734*f6dc9357SAndroid Build Coastguard Worker NtSecurity.Supported = ai.Flags_NtSecurity();
735*f6dc9357SAndroid Build Coastguard Worker }
736*f6dc9357SAndroid Build Coastguard Worker
737*f6dc9357SAndroid Build Coastguard Worker ShowOptionsString();
738*f6dc9357SAndroid Build Coastguard Worker }
739*f6dc9357SAndroid Build Coastguard Worker // CheckVolumeEnable();
740*f6dc9357SAndroid Build Coastguard Worker
741*f6dc9357SAndroid Build Coastguard Worker const bool encrypt = fi.Encrypt_();
742*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDG_COMPRESS_ENCRYPTION, encrypt);
743*f6dc9357SAndroid Build Coastguard Worker
744*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDT_PASSWORD_ENTER, encrypt);
745*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDT_PASSWORD_REENTER, encrypt);
746*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDE_COMPRESS_PASSWORD1, encrypt);
747*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDE_COMPRESS_PASSWORD2, encrypt);
748*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDX_PASSWORD_SHOW, encrypt);
749*f6dc9357SAndroid Build Coastguard Worker
750*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDT_COMPRESS_ENCRYPTION_METHOD, encrypt);
751*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDC_COMPRESS_ENCRYPTION_METHOD, encrypt);
752*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDX_COMPRESS_ENCRYPT_FILE_NAMES, fi.EncryptFileNames_());
753*f6dc9357SAndroid Build Coastguard Worker
754*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool(IDX_COMPRESS_ENCRYPT_FILE_NAMES, fi.EncryptFileNames_());
755*f6dc9357SAndroid Build Coastguard Worker
756*f6dc9357SAndroid Build Coastguard Worker SetEncryptionMethod();
757*f6dc9357SAndroid Build Coastguard Worker SetMemoryUsage();
758*f6dc9357SAndroid Build Coastguard Worker }
759*f6dc9357SAndroid Build Coastguard Worker
760*f6dc9357SAndroid Build Coastguard Worker
IsSFX()761*f6dc9357SAndroid Build Coastguard Worker bool CCompressDialog::IsSFX()
762*f6dc9357SAndroid Build Coastguard Worker {
763*f6dc9357SAndroid Build Coastguard Worker return IsWindowEnabled(GetItem(IDX_COMPRESS_SFX))
764*f6dc9357SAndroid Build Coastguard Worker && IsButtonCheckedBool(IDX_COMPRESS_SFX);
765*f6dc9357SAndroid Build Coastguard Worker }
766*f6dc9357SAndroid Build Coastguard Worker
GetExtDotPos(const UString & s)767*f6dc9357SAndroid Build Coastguard Worker static int GetExtDotPos(const UString &s)
768*f6dc9357SAndroid Build Coastguard Worker {
769*f6dc9357SAndroid Build Coastguard Worker const int dotPos = s.ReverseFind_Dot();
770*f6dc9357SAndroid Build Coastguard Worker if (dotPos > s.ReverseFind_PathSepar() + 1)
771*f6dc9357SAndroid Build Coastguard Worker return dotPos;
772*f6dc9357SAndroid Build Coastguard Worker return -1;
773*f6dc9357SAndroid Build Coastguard Worker }
774*f6dc9357SAndroid Build Coastguard Worker
OnButtonSFX()775*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::OnButtonSFX()
776*f6dc9357SAndroid Build Coastguard Worker {
777*f6dc9357SAndroid Build Coastguard Worker UString fileName;
778*f6dc9357SAndroid Build Coastguard Worker m_ArchivePath.GetText(fileName);
779*f6dc9357SAndroid Build Coastguard Worker const int dotPos = GetExtDotPos(fileName);
780*f6dc9357SAndroid Build Coastguard Worker if (IsSFX())
781*f6dc9357SAndroid Build Coastguard Worker {
782*f6dc9357SAndroid Build Coastguard Worker if (dotPos >= 0)
783*f6dc9357SAndroid Build Coastguard Worker fileName.DeleteFrom(dotPos);
784*f6dc9357SAndroid Build Coastguard Worker fileName += kExeExt;
785*f6dc9357SAndroid Build Coastguard Worker m_ArchivePath.SetText(fileName);
786*f6dc9357SAndroid Build Coastguard Worker }
787*f6dc9357SAndroid Build Coastguard Worker else
788*f6dc9357SAndroid Build Coastguard Worker {
789*f6dc9357SAndroid Build Coastguard Worker if (dotPos >= 0)
790*f6dc9357SAndroid Build Coastguard Worker {
791*f6dc9357SAndroid Build Coastguard Worker const UString ext = fileName.Ptr(dotPos);
792*f6dc9357SAndroid Build Coastguard Worker if (ext.IsEqualTo_Ascii_NoCase(kExeExt))
793*f6dc9357SAndroid Build Coastguard Worker {
794*f6dc9357SAndroid Build Coastguard Worker fileName.DeleteFrom(dotPos);
795*f6dc9357SAndroid Build Coastguard Worker m_ArchivePath.SetText(fileName);
796*f6dc9357SAndroid Build Coastguard Worker }
797*f6dc9357SAndroid Build Coastguard Worker }
798*f6dc9357SAndroid Build Coastguard Worker SetArchiveName2(false); // it's for OnInit
799*f6dc9357SAndroid Build Coastguard Worker }
800*f6dc9357SAndroid Build Coastguard Worker
801*f6dc9357SAndroid Build Coastguard Worker // CheckVolumeEnable();
802*f6dc9357SAndroid Build Coastguard Worker }
803*f6dc9357SAndroid Build Coastguard Worker
804*f6dc9357SAndroid Build Coastguard Worker
GetFinalPath_Smart(UString & resPath) const805*f6dc9357SAndroid Build Coastguard Worker bool CCompressDialog::GetFinalPath_Smart(UString &resPath) const
806*f6dc9357SAndroid Build Coastguard Worker {
807*f6dc9357SAndroid Build Coastguard Worker resPath.Empty();
808*f6dc9357SAndroid Build Coastguard Worker UString name;
809*f6dc9357SAndroid Build Coastguard Worker m_ArchivePath.GetText(name);
810*f6dc9357SAndroid Build Coastguard Worker name.Trim();
811*f6dc9357SAndroid Build Coastguard Worker FString fullPath;
812*f6dc9357SAndroid Build Coastguard Worker UString dirPrefx = DirPrefix;
813*f6dc9357SAndroid Build Coastguard Worker if (dirPrefx.IsEmpty())
814*f6dc9357SAndroid Build Coastguard Worker dirPrefx = StartDirPrefix;
815*f6dc9357SAndroid Build Coastguard Worker const bool res = !dirPrefx.IsEmpty() ?
816*f6dc9357SAndroid Build Coastguard Worker NName::GetFullPath(us2fs(dirPrefx), us2fs(name), fullPath):
817*f6dc9357SAndroid Build Coastguard Worker NName::GetFullPath( us2fs(name), fullPath);
818*f6dc9357SAndroid Build Coastguard Worker if (res)
819*f6dc9357SAndroid Build Coastguard Worker resPath = fs2us(fullPath);
820*f6dc9357SAndroid Build Coastguard Worker return res;
821*f6dc9357SAndroid Build Coastguard Worker }
822*f6dc9357SAndroid Build Coastguard Worker
823*f6dc9357SAndroid Build Coastguard Worker
SetArcPathFields(const UString & path)824*f6dc9357SAndroid Build Coastguard Worker bool CCompressDialog::SetArcPathFields(const UString &path)
825*f6dc9357SAndroid Build Coastguard Worker {
826*f6dc9357SAndroid Build Coastguard Worker UString name;
827*f6dc9357SAndroid Build Coastguard Worker return SetArcPathFields(path, name, true); // always
828*f6dc9357SAndroid Build Coastguard Worker }
829*f6dc9357SAndroid Build Coastguard Worker
830*f6dc9357SAndroid Build Coastguard Worker
SetArcPathFields(const UString & path,UString & name,bool always)831*f6dc9357SAndroid Build Coastguard Worker bool CCompressDialog::SetArcPathFields(const UString &path, UString &name, bool always)
832*f6dc9357SAndroid Build Coastguard Worker {
833*f6dc9357SAndroid Build Coastguard Worker FString resDirPrefix;
834*f6dc9357SAndroid Build Coastguard Worker FString resFileName;
835*f6dc9357SAndroid Build Coastguard Worker const bool res = GetFullPathAndSplit(us2fs(path), resDirPrefix, resFileName);
836*f6dc9357SAndroid Build Coastguard Worker if (res)
837*f6dc9357SAndroid Build Coastguard Worker {
838*f6dc9357SAndroid Build Coastguard Worker DirPrefix = fs2us(resDirPrefix);
839*f6dc9357SAndroid Build Coastguard Worker name = fs2us(resFileName);
840*f6dc9357SAndroid Build Coastguard Worker }
841*f6dc9357SAndroid Build Coastguard Worker else
842*f6dc9357SAndroid Build Coastguard Worker {
843*f6dc9357SAndroid Build Coastguard Worker if (!always)
844*f6dc9357SAndroid Build Coastguard Worker return false;
845*f6dc9357SAndroid Build Coastguard Worker DirPrefix.Empty();
846*f6dc9357SAndroid Build Coastguard Worker name = path;
847*f6dc9357SAndroid Build Coastguard Worker }
848*f6dc9357SAndroid Build Coastguard Worker SetItemText(IDT_COMPRESS_ARCHIVE_FOLDER, DirPrefix);
849*f6dc9357SAndroid Build Coastguard Worker m_ArchivePath.SetText(name);
850*f6dc9357SAndroid Build Coastguard Worker return res;
851*f6dc9357SAndroid Build Coastguard Worker }
852*f6dc9357SAndroid Build Coastguard Worker
853*f6dc9357SAndroid Build Coastguard Worker
854*f6dc9357SAndroid Build Coastguard Worker static const wchar_t * const k_IncorrectPathMessage = L"Incorrect archive path";
855*f6dc9357SAndroid Build Coastguard Worker
AddFilter(CObjectVector<CBrowseFilterInfo> & filters,const UString & description,const UString & ext)856*f6dc9357SAndroid Build Coastguard Worker static void AddFilter(CObjectVector<CBrowseFilterInfo> &filters,
857*f6dc9357SAndroid Build Coastguard Worker const UString &description, const UString &ext)
858*f6dc9357SAndroid Build Coastguard Worker {
859*f6dc9357SAndroid Build Coastguard Worker CBrowseFilterInfo &f = filters.AddNew();
860*f6dc9357SAndroid Build Coastguard Worker UString mask ("*.");
861*f6dc9357SAndroid Build Coastguard Worker mask += ext;
862*f6dc9357SAndroid Build Coastguard Worker f.Masks.Add(mask);
863*f6dc9357SAndroid Build Coastguard Worker f.Description = description;
864*f6dc9357SAndroid Build Coastguard Worker f.Description += " (";
865*f6dc9357SAndroid Build Coastguard Worker f.Description += mask;
866*f6dc9357SAndroid Build Coastguard Worker f.Description += ")";
867*f6dc9357SAndroid Build Coastguard Worker }
868*f6dc9357SAndroid Build Coastguard Worker
869*f6dc9357SAndroid Build Coastguard Worker
870*f6dc9357SAndroid Build Coastguard Worker static const char * const k_DontSave_Exts =
871*f6dc9357SAndroid Build Coastguard Worker "xpi odt ods docx xlsx ";
872*f6dc9357SAndroid Build Coastguard Worker
OnButtonSetArchive()873*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::OnButtonSetArchive()
874*f6dc9357SAndroid Build Coastguard Worker {
875*f6dc9357SAndroid Build Coastguard Worker UString path;
876*f6dc9357SAndroid Build Coastguard Worker if (!GetFinalPath_Smart(path))
877*f6dc9357SAndroid Build Coastguard Worker {
878*f6dc9357SAndroid Build Coastguard Worker ShowErrorMessage(*this, k_IncorrectPathMessage);
879*f6dc9357SAndroid Build Coastguard Worker return;
880*f6dc9357SAndroid Build Coastguard Worker }
881*f6dc9357SAndroid Build Coastguard Worker
882*f6dc9357SAndroid Build Coastguard Worker int filterIndex;
883*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CBrowseFilterInfo> filters;
884*f6dc9357SAndroid Build Coastguard Worker unsigned numFormats = 0;
885*f6dc9357SAndroid Build Coastguard Worker
886*f6dc9357SAndroid Build Coastguard Worker const bool isSFX = IsSFX();
887*f6dc9357SAndroid Build Coastguard Worker if (isSFX)
888*f6dc9357SAndroid Build Coastguard Worker {
889*f6dc9357SAndroid Build Coastguard Worker filterIndex = 0;
890*f6dc9357SAndroid Build Coastguard Worker const UString ext ("exe");
891*f6dc9357SAndroid Build Coastguard Worker AddFilter(filters, ext, ext);
892*f6dc9357SAndroid Build Coastguard Worker }
893*f6dc9357SAndroid Build Coastguard Worker else
894*f6dc9357SAndroid Build Coastguard Worker {
895*f6dc9357SAndroid Build Coastguard Worker filterIndex = m_Format.GetCurSel();
896*f6dc9357SAndroid Build Coastguard Worker numFormats = (unsigned)m_Format.GetCount();
897*f6dc9357SAndroid Build Coastguard Worker
898*f6dc9357SAndroid Build Coastguard Worker // filters [0, ... numFormats - 1] corresponds to items in m_Format combo
899*f6dc9357SAndroid Build Coastguard Worker UString desc;
900*f6dc9357SAndroid Build Coastguard Worker UStringVector masks;
901*f6dc9357SAndroid Build Coastguard Worker CStringFinder finder;
902*f6dc9357SAndroid Build Coastguard Worker
903*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < numFormats; i++)
904*f6dc9357SAndroid Build Coastguard Worker {
905*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = (*ArcFormats)[(unsigned)m_Format.GetItemData(i)];
906*f6dc9357SAndroid Build Coastguard Worker CBrowseFilterInfo &f = filters.AddNew();
907*f6dc9357SAndroid Build Coastguard Worker f.Description = ai.Name;
908*f6dc9357SAndroid Build Coastguard Worker f.Description += " (";
909*f6dc9357SAndroid Build Coastguard Worker bool needSpace_desc = false;
910*f6dc9357SAndroid Build Coastguard Worker
911*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (k, ai.Exts)
912*f6dc9357SAndroid Build Coastguard Worker {
913*f6dc9357SAndroid Build Coastguard Worker const UString &ext = ai.Exts[k].Ext;
914*f6dc9357SAndroid Build Coastguard Worker UString mask ("*.");
915*f6dc9357SAndroid Build Coastguard Worker mask += ext;
916*f6dc9357SAndroid Build Coastguard Worker
917*f6dc9357SAndroid Build Coastguard Worker if (finder.FindWord_In_LowCaseAsciiList_NoCase(k_DontSave_Exts, ext))
918*f6dc9357SAndroid Build Coastguard Worker continue;
919*f6dc9357SAndroid Build Coastguard Worker
920*f6dc9357SAndroid Build Coastguard Worker f.Masks.Add(mask);
921*f6dc9357SAndroid Build Coastguard Worker masks.Add(mask);
922*f6dc9357SAndroid Build Coastguard Worker if (needSpace_desc)
923*f6dc9357SAndroid Build Coastguard Worker f.Description.Add_Space();
924*f6dc9357SAndroid Build Coastguard Worker needSpace_desc = true;
925*f6dc9357SAndroid Build Coastguard Worker f.Description += ext;
926*f6dc9357SAndroid Build Coastguard Worker }
927*f6dc9357SAndroid Build Coastguard Worker f.Description += ")";
928*f6dc9357SAndroid Build Coastguard Worker // we use only main ext in desc to reduce the size of list
929*f6dc9357SAndroid Build Coastguard Worker if (i != 0)
930*f6dc9357SAndroid Build Coastguard Worker desc.Add_Space();
931*f6dc9357SAndroid Build Coastguard Worker desc += ai.GetMainExt();
932*f6dc9357SAndroid Build Coastguard Worker }
933*f6dc9357SAndroid Build Coastguard Worker
934*f6dc9357SAndroid Build Coastguard Worker CBrowseFilterInfo &f = filters.AddNew();
935*f6dc9357SAndroid Build Coastguard Worker f.Description = LangString(IDT_COMPRESS_ARCHIVE); // IDS_ARCHIVES_COLON;
936*f6dc9357SAndroid Build Coastguard Worker if (f.Description.IsEmpty())
937*f6dc9357SAndroid Build Coastguard Worker GetItemText(IDT_COMPRESS_ARCHIVE, f.Description);
938*f6dc9357SAndroid Build Coastguard Worker f.Description.RemoveChar(L'&');
939*f6dc9357SAndroid Build Coastguard Worker // f.Description = "archive";
940*f6dc9357SAndroid Build Coastguard Worker f.Description += " (";
941*f6dc9357SAndroid Build Coastguard Worker f.Description += desc;
942*f6dc9357SAndroid Build Coastguard Worker f.Description += ")";
943*f6dc9357SAndroid Build Coastguard Worker f.Masks = masks;
944*f6dc9357SAndroid Build Coastguard Worker }
945*f6dc9357SAndroid Build Coastguard Worker
946*f6dc9357SAndroid Build Coastguard Worker AddFilter(filters, LangString(IDS_OPEN_TYPE_ALL_FILES), UString("*"));
947*f6dc9357SAndroid Build Coastguard Worker if (filterIndex < 0)
948*f6dc9357SAndroid Build Coastguard Worker filterIndex = (int)filters.Size() - 1;
949*f6dc9357SAndroid Build Coastguard Worker
950*f6dc9357SAndroid Build Coastguard Worker const UString title = LangString(IDS_COMPRESS_SET_ARCHIVE_BROWSE);
951*f6dc9357SAndroid Build Coastguard Worker CBrowseInfo bi;
952*f6dc9357SAndroid Build Coastguard Worker bi.lpstrTitle = title;
953*f6dc9357SAndroid Build Coastguard Worker bi.SaveMode = true;
954*f6dc9357SAndroid Build Coastguard Worker bi.FilterIndex = filterIndex;
955*f6dc9357SAndroid Build Coastguard Worker bi.hwndOwner = *this;
956*f6dc9357SAndroid Build Coastguard Worker bi.FilePath = path;
957*f6dc9357SAndroid Build Coastguard Worker
958*f6dc9357SAndroid Build Coastguard Worker if (!bi.BrowseForFile(filters))
959*f6dc9357SAndroid Build Coastguard Worker return;
960*f6dc9357SAndroid Build Coastguard Worker
961*f6dc9357SAndroid Build Coastguard Worker path = bi.FilePath;
962*f6dc9357SAndroid Build Coastguard Worker
963*f6dc9357SAndroid Build Coastguard Worker if (isSFX)
964*f6dc9357SAndroid Build Coastguard Worker {
965*f6dc9357SAndroid Build Coastguard Worker const int dotPos = GetExtDotPos(path);
966*f6dc9357SAndroid Build Coastguard Worker if (dotPos >= 0)
967*f6dc9357SAndroid Build Coastguard Worker path.DeleteFrom(dotPos);
968*f6dc9357SAndroid Build Coastguard Worker path += kExeExt;
969*f6dc9357SAndroid Build Coastguard Worker }
970*f6dc9357SAndroid Build Coastguard Worker else
971*f6dc9357SAndroid Build Coastguard Worker // if (bi.FilterIndex >= 0)
972*f6dc9357SAndroid Build Coastguard Worker // if (bi.FilterIndex != filterIndex)
973*f6dc9357SAndroid Build Coastguard Worker if ((unsigned)bi.FilterIndex < numFormats)
974*f6dc9357SAndroid Build Coastguard Worker {
975*f6dc9357SAndroid Build Coastguard Worker // archive format was confirmed. So we try to set format extension
976*f6dc9357SAndroid Build Coastguard Worker bool needAddExt = true;
977*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = (*ArcFormats)[(unsigned)m_Format.GetItemData((unsigned)bi.FilterIndex)];
978*f6dc9357SAndroid Build Coastguard Worker const int dotPos = GetExtDotPos(path);
979*f6dc9357SAndroid Build Coastguard Worker if (dotPos >= 0)
980*f6dc9357SAndroid Build Coastguard Worker {
981*f6dc9357SAndroid Build Coastguard Worker const UString ext = path.Ptr(dotPos + 1);
982*f6dc9357SAndroid Build Coastguard Worker if (ai.FindExtension(ext) >= 0)
983*f6dc9357SAndroid Build Coastguard Worker needAddExt = false;
984*f6dc9357SAndroid Build Coastguard Worker }
985*f6dc9357SAndroid Build Coastguard Worker if (needAddExt)
986*f6dc9357SAndroid Build Coastguard Worker {
987*f6dc9357SAndroid Build Coastguard Worker if (path.IsEmpty() || path.Back() != '.')
988*f6dc9357SAndroid Build Coastguard Worker path.Add_Dot();
989*f6dc9357SAndroid Build Coastguard Worker path += ai.GetMainExt();
990*f6dc9357SAndroid Build Coastguard Worker }
991*f6dc9357SAndroid Build Coastguard Worker }
992*f6dc9357SAndroid Build Coastguard Worker
993*f6dc9357SAndroid Build Coastguard Worker SetArcPathFields(path);
994*f6dc9357SAndroid Build Coastguard Worker
995*f6dc9357SAndroid Build Coastguard Worker if (!isSFX)
996*f6dc9357SAndroid Build Coastguard Worker if ((unsigned)bi.FilterIndex < numFormats)
997*f6dc9357SAndroid Build Coastguard Worker if (bi.FilterIndex != m_Format.GetCurSel())
998*f6dc9357SAndroid Build Coastguard Worker {
999*f6dc9357SAndroid Build Coastguard Worker m_Format.SetCurSel(bi.FilterIndex);
1000*f6dc9357SAndroid Build Coastguard Worker SaveOptionsInMem();
1001*f6dc9357SAndroid Build Coastguard Worker FormatChanged(true); // isChanged
1002*f6dc9357SAndroid Build Coastguard Worker return;
1003*f6dc9357SAndroid Build Coastguard Worker }
1004*f6dc9357SAndroid Build Coastguard Worker
1005*f6dc9357SAndroid Build Coastguard Worker ArcPath_WasChanged(path);
1006*f6dc9357SAndroid Build Coastguard Worker }
1007*f6dc9357SAndroid Build Coastguard Worker
1008*f6dc9357SAndroid Build Coastguard Worker
1009*f6dc9357SAndroid Build Coastguard Worker // in ExtractDialog.cpp
1010*f6dc9357SAndroid Build Coastguard Worker extern void AddUniqueString(UStringVector &strings, const UString &srcString);
1011*f6dc9357SAndroid Build Coastguard Worker
IsAsciiString(const UString & s)1012*f6dc9357SAndroid Build Coastguard Worker static bool IsAsciiString(const UString &s)
1013*f6dc9357SAndroid Build Coastguard Worker {
1014*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < s.Len(); i++)
1015*f6dc9357SAndroid Build Coastguard Worker {
1016*f6dc9357SAndroid Build Coastguard Worker const wchar_t c = s[i];
1017*f6dc9357SAndroid Build Coastguard Worker if (c < 0x20 || c > 0x7F)
1018*f6dc9357SAndroid Build Coastguard Worker return false;
1019*f6dc9357SAndroid Build Coastguard Worker }
1020*f6dc9357SAndroid Build Coastguard Worker return true;
1021*f6dc9357SAndroid Build Coastguard Worker }
1022*f6dc9357SAndroid Build Coastguard Worker
1023*f6dc9357SAndroid Build Coastguard Worker
AddSize_MB(UString & s,UInt64 size)1024*f6dc9357SAndroid Build Coastguard Worker static void AddSize_MB(UString &s, UInt64 size)
1025*f6dc9357SAndroid Build Coastguard Worker {
1026*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1027*f6dc9357SAndroid Build Coastguard Worker const UInt64 v2 = size + ((UInt32)1 << 20) - 1;
1028*f6dc9357SAndroid Build Coastguard Worker if (size < v2)
1029*f6dc9357SAndroid Build Coastguard Worker size = v2;
1030*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt64(size >> 20);
1031*f6dc9357SAndroid Build Coastguard Worker s += " MB : ";
1032*f6dc9357SAndroid Build Coastguard Worker }
1033*f6dc9357SAndroid Build Coastguard Worker
AddSize_MB_id(UString & s,UInt64 size,UInt32 id)1034*f6dc9357SAndroid Build Coastguard Worker static void AddSize_MB_id(UString &s, UInt64 size, UInt32 id)
1035*f6dc9357SAndroid Build Coastguard Worker {
1036*f6dc9357SAndroid Build Coastguard Worker AddSize_MB(s, size);
1037*f6dc9357SAndroid Build Coastguard Worker AddLangString(s, id);
1038*f6dc9357SAndroid Build Coastguard Worker }
1039*f6dc9357SAndroid Build Coastguard Worker
1040*f6dc9357SAndroid Build Coastguard Worker void SetErrorMessage_MemUsage(UString &s, UInt64 reqSize, UInt64 ramSize, UInt64 ramLimit, const UString &usageString);
SetErrorMessage_MemUsage(UString & s,UInt64 reqSize,UInt64 ramSize,UInt64 ramLimit,const UString & usageString)1041*f6dc9357SAndroid Build Coastguard Worker void SetErrorMessage_MemUsage(UString &s, UInt64 reqSize, UInt64 ramSize, UInt64 ramLimit, const UString &usageString)
1042*f6dc9357SAndroid Build Coastguard Worker {
1043*f6dc9357SAndroid Build Coastguard Worker AddLangString(s, IDS_MEM_OPERATION_BLOCKED);
1044*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1045*f6dc9357SAndroid Build Coastguard Worker AddLangString(s, IDS_MEM_REQUIRES_BIG_MEM);
1046*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1047*f6dc9357SAndroid Build Coastguard Worker AddSize_MB(s, reqSize);
1048*f6dc9357SAndroid Build Coastguard Worker s += usageString;
1049*f6dc9357SAndroid Build Coastguard Worker AddSize_MB_id(s, ramSize, IDS_MEM_RAM_SIZE);
1050*f6dc9357SAndroid Build Coastguard Worker // if (ramLimit != 0)
1051*f6dc9357SAndroid Build Coastguard Worker {
1052*f6dc9357SAndroid Build Coastguard Worker AddSize_MB_id(s, ramLimit, IDS_MEM_USAGE_LIMIT_SET_BY_7ZIP);
1053*f6dc9357SAndroid Build Coastguard Worker }
1054*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1055*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1056*f6dc9357SAndroid Build Coastguard Worker AddLangString(s, IDS_MEM_ERROR);
1057*f6dc9357SAndroid Build Coastguard Worker }
1058*f6dc9357SAndroid Build Coastguard Worker
1059*f6dc9357SAndroid Build Coastguard Worker
OnOK()1060*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::OnOK()
1061*f6dc9357SAndroid Build Coastguard Worker {
1062*f6dc9357SAndroid Build Coastguard Worker _password1Control.GetText(Info.Password);
1063*f6dc9357SAndroid Build Coastguard Worker if (IsZipFormat())
1064*f6dc9357SAndroid Build Coastguard Worker {
1065*f6dc9357SAndroid Build Coastguard Worker if (!IsAsciiString(Info.Password))
1066*f6dc9357SAndroid Build Coastguard Worker {
1067*f6dc9357SAndroid Build Coastguard Worker ShowErrorMessageHwndRes(*this, IDS_PASSWORD_USE_ASCII);
1068*f6dc9357SAndroid Build Coastguard Worker return;
1069*f6dc9357SAndroid Build Coastguard Worker }
1070*f6dc9357SAndroid Build Coastguard Worker UString method = GetEncryptionMethodSpec();
1071*f6dc9357SAndroid Build Coastguard Worker if (method.IsPrefixedBy_Ascii_NoCase("aes"))
1072*f6dc9357SAndroid Build Coastguard Worker {
1073*f6dc9357SAndroid Build Coastguard Worker if (Info.Password.Len() > 99)
1074*f6dc9357SAndroid Build Coastguard Worker {
1075*f6dc9357SAndroid Build Coastguard Worker ShowErrorMessageHwndRes(*this, IDS_PASSWORD_TOO_LONG);
1076*f6dc9357SAndroid Build Coastguard Worker return;
1077*f6dc9357SAndroid Build Coastguard Worker }
1078*f6dc9357SAndroid Build Coastguard Worker }
1079*f6dc9357SAndroid Build Coastguard Worker }
1080*f6dc9357SAndroid Build Coastguard Worker if (!IsShowPasswordChecked())
1081*f6dc9357SAndroid Build Coastguard Worker {
1082*f6dc9357SAndroid Build Coastguard Worker UString password2;
1083*f6dc9357SAndroid Build Coastguard Worker _password2Control.GetText(password2);
1084*f6dc9357SAndroid Build Coastguard Worker if (password2 != Info.Password)
1085*f6dc9357SAndroid Build Coastguard Worker {
1086*f6dc9357SAndroid Build Coastguard Worker ShowErrorMessageHwndRes(*this, IDS_PASSWORD_NOT_MATCH);
1087*f6dc9357SAndroid Build Coastguard Worker return;
1088*f6dc9357SAndroid Build Coastguard Worker }
1089*f6dc9357SAndroid Build Coastguard Worker }
1090*f6dc9357SAndroid Build Coastguard Worker
1091*f6dc9357SAndroid Build Coastguard Worker {
1092*f6dc9357SAndroid Build Coastguard Worker UInt64 decompressMem;
1093*f6dc9357SAndroid Build Coastguard Worker const UInt64 memUsage = GetMemoryUsage_DecompMem(decompressMem);
1094*f6dc9357SAndroid Build Coastguard Worker if (memUsage != (UInt64)(Int64)-1)
1095*f6dc9357SAndroid Build Coastguard Worker {
1096*f6dc9357SAndroid Build Coastguard Worker const UInt64 limit = Get_MemUse_Bytes();
1097*f6dc9357SAndroid Build Coastguard Worker if (memUsage > limit)
1098*f6dc9357SAndroid Build Coastguard Worker {
1099*f6dc9357SAndroid Build Coastguard Worker UString s2;
1100*f6dc9357SAndroid Build Coastguard Worker LangString_OnlyFromLangFile(IDS_MEM_REQUIRED_MEM_SIZE, s2);
1101*f6dc9357SAndroid Build Coastguard Worker if (s2.IsEmpty())
1102*f6dc9357SAndroid Build Coastguard Worker {
1103*f6dc9357SAndroid Build Coastguard Worker s2 = LangString(IDT_COMPRESS_MEMORY);
1104*f6dc9357SAndroid Build Coastguard Worker if (s2.IsEmpty())
1105*f6dc9357SAndroid Build Coastguard Worker GetItemText(IDT_COMPRESS_MEMORY, s2);
1106*f6dc9357SAndroid Build Coastguard Worker s2.RemoveChar(L':');
1107*f6dc9357SAndroid Build Coastguard Worker }
1108*f6dc9357SAndroid Build Coastguard Worker UString s;
1109*f6dc9357SAndroid Build Coastguard Worker SetErrorMessage_MemUsage(s, memUsage, _ramSize, limit, s2);
1110*f6dc9357SAndroid Build Coastguard Worker MessageBoxError(s);
1111*f6dc9357SAndroid Build Coastguard Worker return;
1112*f6dc9357SAndroid Build Coastguard Worker }
1113*f6dc9357SAndroid Build Coastguard Worker }
1114*f6dc9357SAndroid Build Coastguard Worker }
1115*f6dc9357SAndroid Build Coastguard Worker
1116*f6dc9357SAndroid Build Coastguard Worker SaveOptionsInMem();
1117*f6dc9357SAndroid Build Coastguard Worker
1118*f6dc9357SAndroid Build Coastguard Worker UStringVector arcPaths;
1119*f6dc9357SAndroid Build Coastguard Worker {
1120*f6dc9357SAndroid Build Coastguard Worker UString s;
1121*f6dc9357SAndroid Build Coastguard Worker if (!GetFinalPath_Smart(s))
1122*f6dc9357SAndroid Build Coastguard Worker {
1123*f6dc9357SAndroid Build Coastguard Worker ShowErrorMessage(*this, k_IncorrectPathMessage);
1124*f6dc9357SAndroid Build Coastguard Worker return;
1125*f6dc9357SAndroid Build Coastguard Worker }
1126*f6dc9357SAndroid Build Coastguard Worker Info.ArcPath = s;
1127*f6dc9357SAndroid Build Coastguard Worker AddUniqueString(arcPaths, s);
1128*f6dc9357SAndroid Build Coastguard Worker }
1129*f6dc9357SAndroid Build Coastguard Worker
1130*f6dc9357SAndroid Build Coastguard Worker Info.UpdateMode = (NCompressDialog::NUpdateMode::EEnum)k_UpdateMode_Vals[m_UpdateMode.GetCurSel()];
1131*f6dc9357SAndroid Build Coastguard Worker Info.PathMode = (NWildcard::ECensorPathMode)k_PathMode_Vals[m_PathMode.GetCurSel()];
1132*f6dc9357SAndroid Build Coastguard Worker
1133*f6dc9357SAndroid Build Coastguard Worker Info.Level = GetLevelSpec();
1134*f6dc9357SAndroid Build Coastguard Worker Info.Dict64 = GetDictSpec();
1135*f6dc9357SAndroid Build Coastguard Worker // Info.Dict64_Chain = GetDictChainSpec();
1136*f6dc9357SAndroid Build Coastguard Worker Info.Order = GetOrderSpec();
1137*f6dc9357SAndroid Build Coastguard Worker Info.OrderMode = GetOrderMode();
1138*f6dc9357SAndroid Build Coastguard Worker Info.NumThreads = GetNumThreadsSpec();
1139*f6dc9357SAndroid Build Coastguard Worker
1140*f6dc9357SAndroid Build Coastguard Worker Info.MemUsage.Clear();
1141*f6dc9357SAndroid Build Coastguard Worker {
1142*f6dc9357SAndroid Build Coastguard Worker const UString mus = Get_MemUse_Spec();
1143*f6dc9357SAndroid Build Coastguard Worker if (!mus.IsEmpty())
1144*f6dc9357SAndroid Build Coastguard Worker {
1145*f6dc9357SAndroid Build Coastguard Worker NCompression::CMemUse mu;
1146*f6dc9357SAndroid Build Coastguard Worker mu.Parse(mus);
1147*f6dc9357SAndroid Build Coastguard Worker if (mu.IsDefined)
1148*f6dc9357SAndroid Build Coastguard Worker Info.MemUsage = mu;
1149*f6dc9357SAndroid Build Coastguard Worker }
1150*f6dc9357SAndroid Build Coastguard Worker }
1151*f6dc9357SAndroid Build Coastguard Worker
1152*f6dc9357SAndroid Build Coastguard Worker {
1153*f6dc9357SAndroid Build Coastguard Worker // Info.SolidIsSpecified = g_Formats[GetStaticFormatIndex()].Solid;
1154*f6dc9357SAndroid Build Coastguard Worker const UInt32 solidLogSize = GetBlockSizeSpec();
1155*f6dc9357SAndroid Build Coastguard Worker Info.SolidBlockSize = 0;
1156*f6dc9357SAndroid Build Coastguard Worker if (solidLogSize == (UInt32)(Int32)-1)
1157*f6dc9357SAndroid Build Coastguard Worker Info.SolidIsSpecified = false;
1158*f6dc9357SAndroid Build Coastguard Worker else if (solidLogSize > 0)
1159*f6dc9357SAndroid Build Coastguard Worker Info.SolidBlockSize = (solidLogSize >= 64) ?
1160*f6dc9357SAndroid Build Coastguard Worker (UInt64)(Int64)-1 :
1161*f6dc9357SAndroid Build Coastguard Worker ((UInt64)1 << solidLogSize);
1162*f6dc9357SAndroid Build Coastguard Worker }
1163*f6dc9357SAndroid Build Coastguard Worker
1164*f6dc9357SAndroid Build Coastguard Worker Info.Method = GetMethodSpec();
1165*f6dc9357SAndroid Build Coastguard Worker Info.EncryptionMethod = GetEncryptionMethodSpec();
1166*f6dc9357SAndroid Build Coastguard Worker Info.FormatIndex = (int)GetFormatIndex();
1167*f6dc9357SAndroid Build Coastguard Worker Info.SFXMode = IsSFX();
1168*f6dc9357SAndroid Build Coastguard Worker Info.OpenShareForWrite = IsButtonCheckedBool(IDX_COMPRESS_SHARED);
1169*f6dc9357SAndroid Build Coastguard Worker Info.DeleteAfterCompressing = IsButtonCheckedBool(IDX_COMPRESS_DEL);
1170*f6dc9357SAndroid Build Coastguard Worker
1171*f6dc9357SAndroid Build Coastguard Worker m_RegistryInfo.EncryptHeaders =
1172*f6dc9357SAndroid Build Coastguard Worker Info.EncryptHeaders = IsButtonCheckedBool(IDX_COMPRESS_ENCRYPT_FILE_NAMES);
1173*f6dc9357SAndroid Build Coastguard Worker
1174*f6dc9357SAndroid Build Coastguard Worker
1175*f6dc9357SAndroid Build Coastguard Worker /* (Info) is for saving to registry:
1176*f6dc9357SAndroid Build Coastguard Worker (CBoolPair::Val) will be set as (false), if it was (false)
1177*f6dc9357SAndroid Build Coastguard Worker in registry at dialog creation, and user didn't click checkbox.
1178*f6dc9357SAndroid Build Coastguard Worker in another case (CBoolPair::Val) will be set as (true) */
1179*f6dc9357SAndroid Build Coastguard Worker
1180*f6dc9357SAndroid Build Coastguard Worker {
1181*f6dc9357SAndroid Build Coastguard Worker /* Info properties could be for another archive types.
1182*f6dc9357SAndroid Build Coastguard Worker so we disable unsupported properties in Info */
1183*f6dc9357SAndroid Build Coastguard Worker // const CArcInfoEx &ai = Get_ArcInfoEx();
1184*f6dc9357SAndroid Build Coastguard Worker
1185*f6dc9357SAndroid Build Coastguard Worker SET_FINAL_BOOL_PAIRS (SymLinks);
1186*f6dc9357SAndroid Build Coastguard Worker SET_FINAL_BOOL_PAIRS (HardLinks);
1187*f6dc9357SAndroid Build Coastguard Worker SET_FINAL_BOOL_PAIRS (AltStreams);
1188*f6dc9357SAndroid Build Coastguard Worker SET_FINAL_BOOL_PAIRS (NtSecurity);
1189*f6dc9357SAndroid Build Coastguard Worker
1190*f6dc9357SAndroid Build Coastguard Worker SET_FINAL_BOOL_PAIRS (PreserveATime);
1191*f6dc9357SAndroid Build Coastguard Worker }
1192*f6dc9357SAndroid Build Coastguard Worker
1193*f6dc9357SAndroid Build Coastguard Worker {
1194*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = Get_FormatOptions();
1195*f6dc9357SAndroid Build Coastguard Worker
1196*f6dc9357SAndroid Build Coastguard Worker Info.TimePrec = fo.TimePrec;
1197*f6dc9357SAndroid Build Coastguard Worker Info.MTime = fo.MTime;
1198*f6dc9357SAndroid Build Coastguard Worker Info.CTime = fo.CTime;
1199*f6dc9357SAndroid Build Coastguard Worker Info.ATime = fo.ATime;
1200*f6dc9357SAndroid Build Coastguard Worker Info.SetArcMTime = fo.SetArcMTime;
1201*f6dc9357SAndroid Build Coastguard Worker }
1202*f6dc9357SAndroid Build Coastguard Worker
1203*f6dc9357SAndroid Build Coastguard Worker m_Params.GetText(Info.Options);
1204*f6dc9357SAndroid Build Coastguard Worker
1205*f6dc9357SAndroid Build Coastguard Worker UString volumeString;
1206*f6dc9357SAndroid Build Coastguard Worker m_Volume.GetText(volumeString);
1207*f6dc9357SAndroid Build Coastguard Worker volumeString.Trim();
1208*f6dc9357SAndroid Build Coastguard Worker Info.VolumeSizes.Clear();
1209*f6dc9357SAndroid Build Coastguard Worker
1210*f6dc9357SAndroid Build Coastguard Worker if (!volumeString.IsEmpty())
1211*f6dc9357SAndroid Build Coastguard Worker {
1212*f6dc9357SAndroid Build Coastguard Worker if (!ParseVolumeSizes(volumeString, Info.VolumeSizes))
1213*f6dc9357SAndroid Build Coastguard Worker {
1214*f6dc9357SAndroid Build Coastguard Worker ShowErrorMessageHwndRes(*this, IDS_INCORRECT_VOLUME_SIZE);
1215*f6dc9357SAndroid Build Coastguard Worker return;
1216*f6dc9357SAndroid Build Coastguard Worker }
1217*f6dc9357SAndroid Build Coastguard Worker if (!Info.VolumeSizes.IsEmpty())
1218*f6dc9357SAndroid Build Coastguard Worker {
1219*f6dc9357SAndroid Build Coastguard Worker const UInt64 volumeSize = Info.VolumeSizes.Back();
1220*f6dc9357SAndroid Build Coastguard Worker if (volumeSize < (100 << 10))
1221*f6dc9357SAndroid Build Coastguard Worker {
1222*f6dc9357SAndroid Build Coastguard Worker wchar_t s[32];
1223*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToString(volumeSize, s);
1224*f6dc9357SAndroid Build Coastguard Worker if (::MessageBoxW(*this, MyFormatNew(IDS_SPLIT_CONFIRM, s),
1225*f6dc9357SAndroid Build Coastguard Worker L"7-Zip", MB_YESNOCANCEL | MB_ICONQUESTION) != IDYES)
1226*f6dc9357SAndroid Build Coastguard Worker return;
1227*f6dc9357SAndroid Build Coastguard Worker }
1228*f6dc9357SAndroid Build Coastguard Worker }
1229*f6dc9357SAndroid Build Coastguard Worker }
1230*f6dc9357SAndroid Build Coastguard Worker
1231*f6dc9357SAndroid Build Coastguard Worker if (Info.FormatIndex >= 0)
1232*f6dc9357SAndroid Build Coastguard Worker m_RegistryInfo.ArcType = (*ArcFormats)[Info.FormatIndex].Name;
1233*f6dc9357SAndroid Build Coastguard Worker m_RegistryInfo.ShowPassword = IsShowPasswordChecked();
1234*f6dc9357SAndroid Build Coastguard Worker
1235*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, m_RegistryInfo.ArcPaths)
1236*f6dc9357SAndroid Build Coastguard Worker {
1237*f6dc9357SAndroid Build Coastguard Worker if (arcPaths.Size() >= kHistorySize)
1238*f6dc9357SAndroid Build Coastguard Worker break;
1239*f6dc9357SAndroid Build Coastguard Worker AddUniqueString(arcPaths, m_RegistryInfo.ArcPaths[i]);
1240*f6dc9357SAndroid Build Coastguard Worker }
1241*f6dc9357SAndroid Build Coastguard Worker m_RegistryInfo.ArcPaths = arcPaths;
1242*f6dc9357SAndroid Build Coastguard Worker
1243*f6dc9357SAndroid Build Coastguard Worker m_RegistryInfo.Save();
1244*f6dc9357SAndroid Build Coastguard Worker
1245*f6dc9357SAndroid Build Coastguard Worker CModalDialog::OnOK();
1246*f6dc9357SAndroid Build Coastguard Worker }
1247*f6dc9357SAndroid Build Coastguard Worker
1248*f6dc9357SAndroid Build Coastguard Worker #define kHelpTopic "fm/plugins/7-zip/add.htm"
1249*f6dc9357SAndroid Build Coastguard Worker #define kHelpTopic_Options "fm/plugins/7-zip/add.htm#options"
1250*f6dc9357SAndroid Build Coastguard Worker
OnHelp()1251*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::OnHelp()
1252*f6dc9357SAndroid Build Coastguard Worker {
1253*f6dc9357SAndroid Build Coastguard Worker ShowHelpWindow(kHelpTopic);
1254*f6dc9357SAndroid Build Coastguard Worker }
1255*f6dc9357SAndroid Build Coastguard Worker
1256*f6dc9357SAndroid Build Coastguard Worker
ArcPath_WasChanged(const UString & path)1257*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::ArcPath_WasChanged(const UString &path)
1258*f6dc9357SAndroid Build Coastguard Worker {
1259*f6dc9357SAndroid Build Coastguard Worker const int dotPos = GetExtDotPos(path);
1260*f6dc9357SAndroid Build Coastguard Worker if (dotPos < 0)
1261*f6dc9357SAndroid Build Coastguard Worker return;
1262*f6dc9357SAndroid Build Coastguard Worker const UString ext = path.Ptr(dotPos + 1);
1263*f6dc9357SAndroid Build Coastguard Worker {
1264*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = Get_ArcInfoEx();
1265*f6dc9357SAndroid Build Coastguard Worker if (ai.FindExtension(ext) >= 0)
1266*f6dc9357SAndroid Build Coastguard Worker return;
1267*f6dc9357SAndroid Build Coastguard Worker }
1268*f6dc9357SAndroid Build Coastguard Worker
1269*f6dc9357SAndroid Build Coastguard Worker const unsigned count = (unsigned)m_Format.GetCount();
1270*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < count; i++)
1271*f6dc9357SAndroid Build Coastguard Worker {
1272*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = (*ArcFormats)[(unsigned)m_Format.GetItemData(i)];
1273*f6dc9357SAndroid Build Coastguard Worker if (ai.FindExtension(ext) >= 0)
1274*f6dc9357SAndroid Build Coastguard Worker {
1275*f6dc9357SAndroid Build Coastguard Worker m_Format.SetCurSel(i);
1276*f6dc9357SAndroid Build Coastguard Worker SaveOptionsInMem();
1277*f6dc9357SAndroid Build Coastguard Worker FormatChanged(true); // isChanged
1278*f6dc9357SAndroid Build Coastguard Worker return;
1279*f6dc9357SAndroid Build Coastguard Worker }
1280*f6dc9357SAndroid Build Coastguard Worker }
1281*f6dc9357SAndroid Build Coastguard Worker }
1282*f6dc9357SAndroid Build Coastguard Worker
1283*f6dc9357SAndroid Build Coastguard Worker
OnMessage(UINT message,WPARAM wParam,LPARAM lParam)1284*f6dc9357SAndroid Build Coastguard Worker bool CCompressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
1285*f6dc9357SAndroid Build Coastguard Worker {
1286*f6dc9357SAndroid Build Coastguard Worker switch (message)
1287*f6dc9357SAndroid Build Coastguard Worker {
1288*f6dc9357SAndroid Build Coastguard Worker case k_Message_ArcChanged:
1289*f6dc9357SAndroid Build Coastguard Worker {
1290*f6dc9357SAndroid Build Coastguard Worker // UString path;
1291*f6dc9357SAndroid Build Coastguard Worker // m_ArchivePath.GetText(path);
1292*f6dc9357SAndroid Build Coastguard Worker const int select = m_ArchivePath.GetCurSel();
1293*f6dc9357SAndroid Build Coastguard Worker if ((unsigned)select < m_RegistryInfo.ArcPaths.Size())
1294*f6dc9357SAndroid Build Coastguard Worker // if (path == m_RegistryInfo.ArcPaths[select])
1295*f6dc9357SAndroid Build Coastguard Worker {
1296*f6dc9357SAndroid Build Coastguard Worker const UString &path = m_RegistryInfo.ArcPaths[select];
1297*f6dc9357SAndroid Build Coastguard Worker SetArcPathFields(path);
1298*f6dc9357SAndroid Build Coastguard Worker // ArcPath_WasChanged(path);
1299*f6dc9357SAndroid Build Coastguard Worker }
1300*f6dc9357SAndroid Build Coastguard Worker return 0;
1301*f6dc9357SAndroid Build Coastguard Worker }
1302*f6dc9357SAndroid Build Coastguard Worker }
1303*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnMessage(message, wParam, lParam);
1304*f6dc9357SAndroid Build Coastguard Worker }
1305*f6dc9357SAndroid Build Coastguard Worker
1306*f6dc9357SAndroid Build Coastguard Worker
OnCommand(unsigned code,unsigned itemID,LPARAM lParam)1307*f6dc9357SAndroid Build Coastguard Worker bool CCompressDialog::OnCommand(unsigned code, unsigned itemID, LPARAM lParam)
1308*f6dc9357SAndroid Build Coastguard Worker {
1309*f6dc9357SAndroid Build Coastguard Worker if (code == CBN_SELCHANGE)
1310*f6dc9357SAndroid Build Coastguard Worker {
1311*f6dc9357SAndroid Build Coastguard Worker switch (itemID)
1312*f6dc9357SAndroid Build Coastguard Worker {
1313*f6dc9357SAndroid Build Coastguard Worker case IDC_COMPRESS_ARCHIVE:
1314*f6dc9357SAndroid Build Coastguard Worker {
1315*f6dc9357SAndroid Build Coastguard Worker /* CBN_SELCHANGE is called before actual value of combo text will be changed.
1316*f6dc9357SAndroid Build Coastguard Worker So GetText() here returns old value (before change) of combo text.
1317*f6dc9357SAndroid Build Coastguard Worker So here we can change all controls except of m_ArchivePath.
1318*f6dc9357SAndroid Build Coastguard Worker */
1319*f6dc9357SAndroid Build Coastguard Worker const int select = m_ArchivePath.GetCurSel();
1320*f6dc9357SAndroid Build Coastguard Worker if ((unsigned)select < m_RegistryInfo.ArcPaths.Size())
1321*f6dc9357SAndroid Build Coastguard Worker {
1322*f6dc9357SAndroid Build Coastguard Worker // DirPrefix.Empty();
1323*f6dc9357SAndroid Build Coastguard Worker // SetItemText(IDT_COMPRESS_ARCHIVE_FOLDER, DirPrefix);
1324*f6dc9357SAndroid Build Coastguard Worker const UString &path = m_RegistryInfo.ArcPaths[select];
1325*f6dc9357SAndroid Build Coastguard Worker // SetArcPathFields(path);
1326*f6dc9357SAndroid Build Coastguard Worker ArcPath_WasChanged(path);
1327*f6dc9357SAndroid Build Coastguard Worker // we use PostMessage(k_Message_ArcChanged) here that later will change m_ArchivePath control
1328*f6dc9357SAndroid Build Coastguard Worker PostMsg(k_Message_ArcChanged);
1329*f6dc9357SAndroid Build Coastguard Worker }
1330*f6dc9357SAndroid Build Coastguard Worker return true;
1331*f6dc9357SAndroid Build Coastguard Worker }
1332*f6dc9357SAndroid Build Coastguard Worker
1333*f6dc9357SAndroid Build Coastguard Worker case IDC_COMPRESS_FORMAT:
1334*f6dc9357SAndroid Build Coastguard Worker {
1335*f6dc9357SAndroid Build Coastguard Worker const bool isSFX = IsSFX();
1336*f6dc9357SAndroid Build Coastguard Worker SaveOptionsInMem();
1337*f6dc9357SAndroid Build Coastguard Worker FormatChanged(true); // isChanged
1338*f6dc9357SAndroid Build Coastguard Worker SetArchiveName2(isSFX);
1339*f6dc9357SAndroid Build Coastguard Worker return true;
1340*f6dc9357SAndroid Build Coastguard Worker }
1341*f6dc9357SAndroid Build Coastguard Worker
1342*f6dc9357SAndroid Build Coastguard Worker case IDC_COMPRESS_LEVEL:
1343*f6dc9357SAndroid Build Coastguard Worker {
1344*f6dc9357SAndroid Build Coastguard Worker Get_FormatOptions().ResetForLevelChange();
1345*f6dc9357SAndroid Build Coastguard Worker
1346*f6dc9357SAndroid Build Coastguard Worker SetMethod(); // call it if level changes method
1347*f6dc9357SAndroid Build Coastguard Worker
1348*f6dc9357SAndroid Build Coastguard Worker // call the following if level change keeps old method
1349*f6dc9357SAndroid Build Coastguard Worker /*
1350*f6dc9357SAndroid Build Coastguard Worker {
1351*f6dc9357SAndroid Build Coastguard Worker // try to keep old method
1352*f6dc9357SAndroid Build Coastguard Worker SetMethod(GetMethodID());
1353*f6dc9357SAndroid Build Coastguard Worker MethodChanged();
1354*f6dc9357SAndroid Build Coastguard Worker }
1355*f6dc9357SAndroid Build Coastguard Worker */
1356*f6dc9357SAndroid Build Coastguard Worker
1357*f6dc9357SAndroid Build Coastguard Worker SetSolidBlockSize();
1358*f6dc9357SAndroid Build Coastguard Worker SetNumThreads();
1359*f6dc9357SAndroid Build Coastguard Worker CheckSFXNameChange();
1360*f6dc9357SAndroid Build Coastguard Worker SetMemoryUsage();
1361*f6dc9357SAndroid Build Coastguard Worker return true;
1362*f6dc9357SAndroid Build Coastguard Worker }
1363*f6dc9357SAndroid Build Coastguard Worker
1364*f6dc9357SAndroid Build Coastguard Worker case IDC_COMPRESS_METHOD:
1365*f6dc9357SAndroid Build Coastguard Worker {
1366*f6dc9357SAndroid Build Coastguard Worker MethodChanged();
1367*f6dc9357SAndroid Build Coastguard Worker SetSolidBlockSize();
1368*f6dc9357SAndroid Build Coastguard Worker SetNumThreads();
1369*f6dc9357SAndroid Build Coastguard Worker CheckSFXNameChange();
1370*f6dc9357SAndroid Build Coastguard Worker SetMemoryUsage();
1371*f6dc9357SAndroid Build Coastguard Worker if (Get_ArcInfoEx().Flags_HashHandler())
1372*f6dc9357SAndroid Build Coastguard Worker SetArchiveName2(false);
1373*f6dc9357SAndroid Build Coastguard Worker
1374*f6dc9357SAndroid Build Coastguard Worker return true;
1375*f6dc9357SAndroid Build Coastguard Worker }
1376*f6dc9357SAndroid Build Coastguard Worker
1377*f6dc9357SAndroid Build Coastguard Worker case IDC_COMPRESS_DICTIONARY:
1378*f6dc9357SAndroid Build Coastguard Worker // case IDC_COMPRESS_DICTIONARY2:
1379*f6dc9357SAndroid Build Coastguard Worker {
1380*f6dc9357SAndroid Build Coastguard Worker /* we want to change the reported threads for Auto line
1381*f6dc9357SAndroid Build Coastguard Worker and keep selected NumThreads option
1382*f6dc9357SAndroid Build Coastguard Worker So we save selected NumThreads option in memory */
1383*f6dc9357SAndroid Build Coastguard Worker SaveOptionsInMem();
1384*f6dc9357SAndroid Build Coastguard Worker const UInt32 blockSizeLog = GetBlockSizeSpec();
1385*f6dc9357SAndroid Build Coastguard Worker if (// blockSizeLog != (UInt32)(Int32)-1 &&
1386*f6dc9357SAndroid Build Coastguard Worker blockSizeLog != kSolidLog_NoSolid
1387*f6dc9357SAndroid Build Coastguard Worker && blockSizeLog != kSolidLog_FullSolid)
1388*f6dc9357SAndroid Build Coastguard Worker {
1389*f6dc9357SAndroid Build Coastguard Worker Get_FormatOptions().Reset_BlockLogSize();
1390*f6dc9357SAndroid Build Coastguard Worker // SetSolidBlockSize(true);
1391*f6dc9357SAndroid Build Coastguard Worker }
1392*f6dc9357SAndroid Build Coastguard Worker
1393*f6dc9357SAndroid Build Coastguard Worker SetDictionary2();
1394*f6dc9357SAndroid Build Coastguard Worker SetSolidBlockSize();
1395*f6dc9357SAndroid Build Coastguard Worker SetNumThreads(); // we want to change the reported threads for Auto line only
1396*f6dc9357SAndroid Build Coastguard Worker SetMemoryUsage();
1397*f6dc9357SAndroid Build Coastguard Worker return true;
1398*f6dc9357SAndroid Build Coastguard Worker }
1399*f6dc9357SAndroid Build Coastguard Worker
1400*f6dc9357SAndroid Build Coastguard Worker case IDC_COMPRESS_ORDER:
1401*f6dc9357SAndroid Build Coastguard Worker {
1402*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_PARAMS
1403*f6dc9357SAndroid Build Coastguard Worker Print_Params();
1404*f6dc9357SAndroid Build Coastguard Worker #endif
1405*f6dc9357SAndroid Build Coastguard Worker return true;
1406*f6dc9357SAndroid Build Coastguard Worker }
1407*f6dc9357SAndroid Build Coastguard Worker
1408*f6dc9357SAndroid Build Coastguard Worker case IDC_COMPRESS_SOLID:
1409*f6dc9357SAndroid Build Coastguard Worker {
1410*f6dc9357SAndroid Build Coastguard Worker SetMemoryUsage();
1411*f6dc9357SAndroid Build Coastguard Worker return true;
1412*f6dc9357SAndroid Build Coastguard Worker }
1413*f6dc9357SAndroid Build Coastguard Worker
1414*f6dc9357SAndroid Build Coastguard Worker case IDC_COMPRESS_THREADS:
1415*f6dc9357SAndroid Build Coastguard Worker {
1416*f6dc9357SAndroid Build Coastguard Worker SetMemoryUsage();
1417*f6dc9357SAndroid Build Coastguard Worker return true;
1418*f6dc9357SAndroid Build Coastguard Worker }
1419*f6dc9357SAndroid Build Coastguard Worker
1420*f6dc9357SAndroid Build Coastguard Worker case IDC_COMPRESS_MEM_USE:
1421*f6dc9357SAndroid Build Coastguard Worker {
1422*f6dc9357SAndroid Build Coastguard Worker /* we want to change the reported threads for Auto line
1423*f6dc9357SAndroid Build Coastguard Worker and keep selected NumThreads option
1424*f6dc9357SAndroid Build Coastguard Worker So we save selected NumThreads option in memory */
1425*f6dc9357SAndroid Build Coastguard Worker SaveOptionsInMem();
1426*f6dc9357SAndroid Build Coastguard Worker
1427*f6dc9357SAndroid Build Coastguard Worker SetNumThreads(); // we want to change the reported threads for Auto line only
1428*f6dc9357SAndroid Build Coastguard Worker SetMemoryUsage();
1429*f6dc9357SAndroid Build Coastguard Worker return true;
1430*f6dc9357SAndroid Build Coastguard Worker }
1431*f6dc9357SAndroid Build Coastguard Worker }
1432*f6dc9357SAndroid Build Coastguard Worker }
1433*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnCommand(code, itemID, lParam);
1434*f6dc9357SAndroid Build Coastguard Worker }
1435*f6dc9357SAndroid Build Coastguard Worker
CheckSFXNameChange()1436*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::CheckSFXNameChange()
1437*f6dc9357SAndroid Build Coastguard Worker {
1438*f6dc9357SAndroid Build Coastguard Worker const bool isSFX = IsSFX();
1439*f6dc9357SAndroid Build Coastguard Worker CheckSFXControlsEnable();
1440*f6dc9357SAndroid Build Coastguard Worker if (isSFX != IsSFX())
1441*f6dc9357SAndroid Build Coastguard Worker SetArchiveName2(isSFX);
1442*f6dc9357SAndroid Build Coastguard Worker }
1443*f6dc9357SAndroid Build Coastguard Worker
SetArchiveName2(bool prevWasSFX)1444*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetArchiveName2(bool prevWasSFX)
1445*f6dc9357SAndroid Build Coastguard Worker {
1446*f6dc9357SAndroid Build Coastguard Worker UString fileName;
1447*f6dc9357SAndroid Build Coastguard Worker m_ArchivePath.GetText(fileName);
1448*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &prevArchiverInfo = (*ArcFormats)[m_PrevFormat];
1449*f6dc9357SAndroid Build Coastguard Worker if (prevArchiverInfo.Flags_KeepName() || Info.KeepName)
1450*f6dc9357SAndroid Build Coastguard Worker {
1451*f6dc9357SAndroid Build Coastguard Worker UString prevExtension;
1452*f6dc9357SAndroid Build Coastguard Worker if (prevWasSFX)
1453*f6dc9357SAndroid Build Coastguard Worker prevExtension = kExeExt;
1454*f6dc9357SAndroid Build Coastguard Worker else
1455*f6dc9357SAndroid Build Coastguard Worker {
1456*f6dc9357SAndroid Build Coastguard Worker prevExtension.Add_Dot();
1457*f6dc9357SAndroid Build Coastguard Worker prevExtension += prevArchiverInfo.GetMainExt();
1458*f6dc9357SAndroid Build Coastguard Worker }
1459*f6dc9357SAndroid Build Coastguard Worker const unsigned prevExtensionLen = prevExtension.Len();
1460*f6dc9357SAndroid Build Coastguard Worker if (fileName.Len() >= prevExtensionLen)
1461*f6dc9357SAndroid Build Coastguard Worker if (StringsAreEqualNoCase(fileName.RightPtr(prevExtensionLen), prevExtension))
1462*f6dc9357SAndroid Build Coastguard Worker fileName.DeleteFrom(fileName.Len() - prevExtensionLen);
1463*f6dc9357SAndroid Build Coastguard Worker }
1464*f6dc9357SAndroid Build Coastguard Worker SetArchiveName(fileName);
1465*f6dc9357SAndroid Build Coastguard Worker }
1466*f6dc9357SAndroid Build Coastguard Worker
1467*f6dc9357SAndroid Build Coastguard Worker // if type.KeepName then use OriginalFileName
1468*f6dc9357SAndroid Build Coastguard Worker // else if !KeepName remove extension
1469*f6dc9357SAndroid Build Coastguard Worker // add new extension
1470*f6dc9357SAndroid Build Coastguard Worker
SetArchiveName(const UString & name)1471*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetArchiveName(const UString &name)
1472*f6dc9357SAndroid Build Coastguard Worker {
1473*f6dc9357SAndroid Build Coastguard Worker UString fileName = name;
1474*f6dc9357SAndroid Build Coastguard Worker Info.FormatIndex = (int)GetFormatIndex();
1475*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = (*ArcFormats)[Info.FormatIndex];
1476*f6dc9357SAndroid Build Coastguard Worker m_PrevFormat = Info.FormatIndex;
1477*f6dc9357SAndroid Build Coastguard Worker if (ai.Flags_KeepName())
1478*f6dc9357SAndroid Build Coastguard Worker {
1479*f6dc9357SAndroid Build Coastguard Worker fileName = OriginalFileName;
1480*f6dc9357SAndroid Build Coastguard Worker }
1481*f6dc9357SAndroid Build Coastguard Worker else
1482*f6dc9357SAndroid Build Coastguard Worker {
1483*f6dc9357SAndroid Build Coastguard Worker if (!Info.KeepName)
1484*f6dc9357SAndroid Build Coastguard Worker {
1485*f6dc9357SAndroid Build Coastguard Worker int dotPos = GetExtDotPos(fileName);
1486*f6dc9357SAndroid Build Coastguard Worker if (dotPos >= 0)
1487*f6dc9357SAndroid Build Coastguard Worker fileName.DeleteFrom(dotPos);
1488*f6dc9357SAndroid Build Coastguard Worker }
1489*f6dc9357SAndroid Build Coastguard Worker }
1490*f6dc9357SAndroid Build Coastguard Worker
1491*f6dc9357SAndroid Build Coastguard Worker if (IsSFX())
1492*f6dc9357SAndroid Build Coastguard Worker fileName += kExeExt;
1493*f6dc9357SAndroid Build Coastguard Worker else
1494*f6dc9357SAndroid Build Coastguard Worker {
1495*f6dc9357SAndroid Build Coastguard Worker fileName.Add_Dot();
1496*f6dc9357SAndroid Build Coastguard Worker UString ext = ai.GetMainExt();
1497*f6dc9357SAndroid Build Coastguard Worker if (ai.Flags_HashHandler())
1498*f6dc9357SAndroid Build Coastguard Worker {
1499*f6dc9357SAndroid Build Coastguard Worker UString estimatedName;
1500*f6dc9357SAndroid Build Coastguard Worker GetMethodSpec(estimatedName);
1501*f6dc9357SAndroid Build Coastguard Worker if (!estimatedName.IsEmpty())
1502*f6dc9357SAndroid Build Coastguard Worker {
1503*f6dc9357SAndroid Build Coastguard Worker ext = estimatedName;
1504*f6dc9357SAndroid Build Coastguard Worker ext.MakeLower_Ascii();
1505*f6dc9357SAndroid Build Coastguard Worker }
1506*f6dc9357SAndroid Build Coastguard Worker }
1507*f6dc9357SAndroid Build Coastguard Worker fileName += ext;
1508*f6dc9357SAndroid Build Coastguard Worker }
1509*f6dc9357SAndroid Build Coastguard Worker m_ArchivePath.SetText(fileName);
1510*f6dc9357SAndroid Build Coastguard Worker }
1511*f6dc9357SAndroid Build Coastguard Worker
1512*f6dc9357SAndroid Build Coastguard Worker
FindRegistryFormat(const UString & name)1513*f6dc9357SAndroid Build Coastguard Worker int CCompressDialog::FindRegistryFormat(const UString &name)
1514*f6dc9357SAndroid Build Coastguard Worker {
1515*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, m_RegistryInfo.Formats)
1516*f6dc9357SAndroid Build Coastguard Worker {
1517*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[i];
1518*f6dc9357SAndroid Build Coastguard Worker if (name.IsEqualTo_NoCase(GetUnicodeString(fo.FormatID)))
1519*f6dc9357SAndroid Build Coastguard Worker return (int)i;
1520*f6dc9357SAndroid Build Coastguard Worker }
1521*f6dc9357SAndroid Build Coastguard Worker return -1;
1522*f6dc9357SAndroid Build Coastguard Worker }
1523*f6dc9357SAndroid Build Coastguard Worker
1524*f6dc9357SAndroid Build Coastguard Worker
FindRegistryFormat_Always(const UString & name)1525*f6dc9357SAndroid Build Coastguard Worker unsigned CCompressDialog::FindRegistryFormat_Always(const UString &name)
1526*f6dc9357SAndroid Build Coastguard Worker {
1527*f6dc9357SAndroid Build Coastguard Worker const int index = FindRegistryFormat(name);
1528*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
1529*f6dc9357SAndroid Build Coastguard Worker return (unsigned)index;
1530*f6dc9357SAndroid Build Coastguard Worker {
1531*f6dc9357SAndroid Build Coastguard Worker NCompression::CFormatOptions fo;
1532*f6dc9357SAndroid Build Coastguard Worker fo.FormatID = GetSystemString(name);
1533*f6dc9357SAndroid Build Coastguard Worker return m_RegistryInfo.Formats.Add(fo);
1534*f6dc9357SAndroid Build Coastguard Worker }
1535*f6dc9357SAndroid Build Coastguard Worker }
1536*f6dc9357SAndroid Build Coastguard Worker
1537*f6dc9357SAndroid Build Coastguard Worker
Get_FormatOptions()1538*f6dc9357SAndroid Build Coastguard Worker NCompression::CFormatOptions &CCompressDialog::Get_FormatOptions()
1539*f6dc9357SAndroid Build Coastguard Worker {
1540*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = Get_ArcInfoEx();
1541*f6dc9357SAndroid Build Coastguard Worker return m_RegistryInfo.Formats[FindRegistryFormat_Always(ai.Name)];
1542*f6dc9357SAndroid Build Coastguard Worker }
1543*f6dc9357SAndroid Build Coastguard Worker
1544*f6dc9357SAndroid Build Coastguard Worker
GetStaticFormatIndex()1545*f6dc9357SAndroid Build Coastguard Worker unsigned CCompressDialog::GetStaticFormatIndex()
1546*f6dc9357SAndroid Build Coastguard Worker {
1547*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = Get_ArcInfoEx();
1548*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < Z7_ARRAY_SIZE(g_Formats); i++)
1549*f6dc9357SAndroid Build Coastguard Worker if (ai.Name.IsEqualTo_Ascii_NoCase(g_Formats[i].Name))
1550*f6dc9357SAndroid Build Coastguard Worker return i;
1551*f6dc9357SAndroid Build Coastguard Worker return 0; // -1;
1552*f6dc9357SAndroid Build Coastguard Worker }
1553*f6dc9357SAndroid Build Coastguard Worker
SetNearestSelectComboBox(NControl::CComboBox & comboBox,UInt32 value)1554*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetNearestSelectComboBox(NControl::CComboBox &comboBox, UInt32 value)
1555*f6dc9357SAndroid Build Coastguard Worker {
1556*f6dc9357SAndroid Build Coastguard Worker for (int i = comboBox.GetCount() - 1; i >= 0; i--)
1557*f6dc9357SAndroid Build Coastguard Worker if ((UInt32)comboBox.GetItemData(i) <= value)
1558*f6dc9357SAndroid Build Coastguard Worker {
1559*f6dc9357SAndroid Build Coastguard Worker comboBox.SetCurSel(i);
1560*f6dc9357SAndroid Build Coastguard Worker return;
1561*f6dc9357SAndroid Build Coastguard Worker }
1562*f6dc9357SAndroid Build Coastguard Worker if (comboBox.GetCount() > 0)
1563*f6dc9357SAndroid Build Coastguard Worker comboBox.SetCurSel(0);
1564*f6dc9357SAndroid Build Coastguard Worker }
1565*f6dc9357SAndroid Build Coastguard Worker
SetLevel2()1566*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetLevel2()
1567*f6dc9357SAndroid Build Coastguard Worker {
1568*f6dc9357SAndroid Build Coastguard Worker m_Level.ResetContent();
1569*f6dc9357SAndroid Build Coastguard Worker const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];
1570*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = Get_ArcInfoEx();
1571*f6dc9357SAndroid Build Coastguard Worker UInt32 level = 5;
1572*f6dc9357SAndroid Build Coastguard Worker {
1573*f6dc9357SAndroid Build Coastguard Worker int index = FindRegistryFormat(ai.Name);
1574*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
1575*f6dc9357SAndroid Build Coastguard Worker {
1576*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index];
1577*f6dc9357SAndroid Build Coastguard Worker if (fo.Level <= 9)
1578*f6dc9357SAndroid Build Coastguard Worker level = fo.Level;
1579*f6dc9357SAndroid Build Coastguard Worker else if (fo.Level == (UInt32)(Int32)-1)
1580*f6dc9357SAndroid Build Coastguard Worker level = 5;
1581*f6dc9357SAndroid Build Coastguard Worker else
1582*f6dc9357SAndroid Build Coastguard Worker level = 9;
1583*f6dc9357SAndroid Build Coastguard Worker }
1584*f6dc9357SAndroid Build Coastguard Worker }
1585*f6dc9357SAndroid Build Coastguard Worker
1586*f6dc9357SAndroid Build Coastguard Worker const bool isZstd = ai.Is_Zstd();
1587*f6dc9357SAndroid Build Coastguard Worker
1588*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < sizeof(UInt32) * 8; i++)
1589*f6dc9357SAndroid Build Coastguard Worker {
1590*f6dc9357SAndroid Build Coastguard Worker const UInt32 mask = fi.LevelsMask >> i;
1591*f6dc9357SAndroid Build Coastguard Worker // if (mask == 0) break;
1592*f6dc9357SAndroid Build Coastguard Worker if (mask & 1)
1593*f6dc9357SAndroid Build Coastguard Worker {
1594*f6dc9357SAndroid Build Coastguard Worker UString s;
1595*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32(i);
1596*f6dc9357SAndroid Build Coastguard Worker if (i < Z7_ARRAY_SIZE(g_Levels))
1597*f6dc9357SAndroid Build Coastguard Worker {
1598*f6dc9357SAndroid Build Coastguard Worker const UInt32 langID = g_Levels[i];
1599*f6dc9357SAndroid Build Coastguard Worker // if (fi.LevelsMask < (1 << (MY_ZSTD_LEVEL_MAX + 1)) - 1)
1600*f6dc9357SAndroid Build Coastguard Worker if (langID)
1601*f6dc9357SAndroid Build Coastguard Worker if (i != 0 || !isZstd)
1602*f6dc9357SAndroid Build Coastguard Worker {
1603*f6dc9357SAndroid Build Coastguard Worker s += " - ";
1604*f6dc9357SAndroid Build Coastguard Worker AddLangString(s, langID);
1605*f6dc9357SAndroid Build Coastguard Worker }
1606*f6dc9357SAndroid Build Coastguard Worker }
1607*f6dc9357SAndroid Build Coastguard Worker const int index = (int)m_Level.AddString(s);
1608*f6dc9357SAndroid Build Coastguard Worker m_Level.SetItemData(index, (LPARAM)i);
1609*f6dc9357SAndroid Build Coastguard Worker }
1610*f6dc9357SAndroid Build Coastguard Worker }
1611*f6dc9357SAndroid Build Coastguard Worker SetNearestSelectComboBox(m_Level, level);
1612*f6dc9357SAndroid Build Coastguard Worker }
1613*f6dc9357SAndroid Build Coastguard Worker
1614*f6dc9357SAndroid Build Coastguard Worker
ComboBox_AddStringAscii(NControl::CComboBox & cb,const char * s)1615*f6dc9357SAndroid Build Coastguard Worker static LRESULT ComboBox_AddStringAscii(NControl::CComboBox &cb, const char *s)
1616*f6dc9357SAndroid Build Coastguard Worker {
1617*f6dc9357SAndroid Build Coastguard Worker return cb.AddString((CSysString)s);
1618*f6dc9357SAndroid Build Coastguard Worker }
1619*f6dc9357SAndroid Build Coastguard Worker
1620*f6dc9357SAndroid Build Coastguard Worker static const char *k_Auto_Prefix = "* ";
1621*f6dc9357SAndroid Build Coastguard Worker
Modify_Auto(AString & s)1622*f6dc9357SAndroid Build Coastguard Worker static void Modify_Auto(AString &s)
1623*f6dc9357SAndroid Build Coastguard Worker {
1624*f6dc9357SAndroid Build Coastguard Worker s.Insert(0, k_Auto_Prefix);
1625*f6dc9357SAndroid Build Coastguard Worker }
1626*f6dc9357SAndroid Build Coastguard Worker
SetMethod2(int keepMethodId)1627*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetMethod2(int keepMethodId)
1628*f6dc9357SAndroid Build Coastguard Worker {
1629*f6dc9357SAndroid Build Coastguard Worker m_Method.ResetContent();
1630*f6dc9357SAndroid Build Coastguard Worker _auto_MethodId = -1;
1631*f6dc9357SAndroid Build Coastguard Worker const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];
1632*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = Get_ArcInfoEx();
1633*f6dc9357SAndroid Build Coastguard Worker if (GetLevel() == 0 && !ai.Flags_HashHandler())
1634*f6dc9357SAndroid Build Coastguard Worker {
1635*f6dc9357SAndroid Build Coastguard Worker if (!ai.Is_Tar() &&
1636*f6dc9357SAndroid Build Coastguard Worker !ai.Is_Zstd())
1637*f6dc9357SAndroid Build Coastguard Worker {
1638*f6dc9357SAndroid Build Coastguard Worker MethodChanged();
1639*f6dc9357SAndroid Build Coastguard Worker return;
1640*f6dc9357SAndroid Build Coastguard Worker }
1641*f6dc9357SAndroid Build Coastguard Worker }
1642*f6dc9357SAndroid Build Coastguard Worker UString defaultMethod;
1643*f6dc9357SAndroid Build Coastguard Worker {
1644*f6dc9357SAndroid Build Coastguard Worker const int index = FindRegistryFormat(ai.Name);
1645*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
1646*f6dc9357SAndroid Build Coastguard Worker {
1647*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index];
1648*f6dc9357SAndroid Build Coastguard Worker defaultMethod = fo.Method;
1649*f6dc9357SAndroid Build Coastguard Worker }
1650*f6dc9357SAndroid Build Coastguard Worker }
1651*f6dc9357SAndroid Build Coastguard Worker const bool isSfx = IsSFX();
1652*f6dc9357SAndroid Build Coastguard Worker bool weUseSameMethod = false;
1653*f6dc9357SAndroid Build Coastguard Worker
1654*f6dc9357SAndroid Build Coastguard Worker const bool is7z = ai.Is_7z();
1655*f6dc9357SAndroid Build Coastguard Worker
1656*f6dc9357SAndroid Build Coastguard Worker for (unsigned m = 0;; m++)
1657*f6dc9357SAndroid Build Coastguard Worker {
1658*f6dc9357SAndroid Build Coastguard Worker int methodID;
1659*f6dc9357SAndroid Build Coastguard Worker const char *method;
1660*f6dc9357SAndroid Build Coastguard Worker if (m < fi.NumMethods)
1661*f6dc9357SAndroid Build Coastguard Worker {
1662*f6dc9357SAndroid Build Coastguard Worker methodID = fi.MethodIDs[m];
1663*f6dc9357SAndroid Build Coastguard Worker method = kMethodsNames[methodID];
1664*f6dc9357SAndroid Build Coastguard Worker if (is7z)
1665*f6dc9357SAndroid Build Coastguard Worker if (methodID == kCopy
1666*f6dc9357SAndroid Build Coastguard Worker || methodID == kDeflate
1667*f6dc9357SAndroid Build Coastguard Worker || methodID == kDeflate64
1668*f6dc9357SAndroid Build Coastguard Worker )
1669*f6dc9357SAndroid Build Coastguard Worker continue;
1670*f6dc9357SAndroid Build Coastguard Worker }
1671*f6dc9357SAndroid Build Coastguard Worker else
1672*f6dc9357SAndroid Build Coastguard Worker {
1673*f6dc9357SAndroid Build Coastguard Worker if (!is7z)
1674*f6dc9357SAndroid Build Coastguard Worker break;
1675*f6dc9357SAndroid Build Coastguard Worker const unsigned extIndex = m - fi.NumMethods;
1676*f6dc9357SAndroid Build Coastguard Worker if (extIndex >= ExternalMethods.Size())
1677*f6dc9357SAndroid Build Coastguard Worker break;
1678*f6dc9357SAndroid Build Coastguard Worker methodID = (int)(Z7_ARRAY_SIZE(kMethodsNames) + extIndex);
1679*f6dc9357SAndroid Build Coastguard Worker method = ExternalMethods[extIndex].Ptr();
1680*f6dc9357SAndroid Build Coastguard Worker }
1681*f6dc9357SAndroid Build Coastguard Worker if (isSfx)
1682*f6dc9357SAndroid Build Coastguard Worker if (!IsMethodSupportedBySfx(methodID))
1683*f6dc9357SAndroid Build Coastguard Worker continue;
1684*f6dc9357SAndroid Build Coastguard Worker
1685*f6dc9357SAndroid Build Coastguard Worker AString s (method);
1686*f6dc9357SAndroid Build Coastguard Worker int writtenMethodId = methodID;
1687*f6dc9357SAndroid Build Coastguard Worker if (m == 0)
1688*f6dc9357SAndroid Build Coastguard Worker {
1689*f6dc9357SAndroid Build Coastguard Worker _auto_MethodId = methodID;
1690*f6dc9357SAndroid Build Coastguard Worker writtenMethodId = -1;
1691*f6dc9357SAndroid Build Coastguard Worker Modify_Auto(s);
1692*f6dc9357SAndroid Build Coastguard Worker }
1693*f6dc9357SAndroid Build Coastguard Worker const int itemIndex = (int)ComboBox_AddStringAscii(m_Method, s);
1694*f6dc9357SAndroid Build Coastguard Worker m_Method.SetItemData(itemIndex, writtenMethodId);
1695*f6dc9357SAndroid Build Coastguard Worker if (keepMethodId == methodID)
1696*f6dc9357SAndroid Build Coastguard Worker {
1697*f6dc9357SAndroid Build Coastguard Worker m_Method.SetCurSel(itemIndex);
1698*f6dc9357SAndroid Build Coastguard Worker weUseSameMethod = true;
1699*f6dc9357SAndroid Build Coastguard Worker continue;
1700*f6dc9357SAndroid Build Coastguard Worker }
1701*f6dc9357SAndroid Build Coastguard Worker if ((defaultMethod.IsEqualTo_Ascii_NoCase(method) || m == 0) && !weUseSameMethod)
1702*f6dc9357SAndroid Build Coastguard Worker m_Method.SetCurSel(itemIndex);
1703*f6dc9357SAndroid Build Coastguard Worker }
1704*f6dc9357SAndroid Build Coastguard Worker
1705*f6dc9357SAndroid Build Coastguard Worker if (!weUseSameMethod)
1706*f6dc9357SAndroid Build Coastguard Worker MethodChanged();
1707*f6dc9357SAndroid Build Coastguard Worker }
1708*f6dc9357SAndroid Build Coastguard Worker
1709*f6dc9357SAndroid Build Coastguard Worker
1710*f6dc9357SAndroid Build Coastguard Worker
IsZipFormat()1711*f6dc9357SAndroid Build Coastguard Worker bool CCompressDialog::IsZipFormat()
1712*f6dc9357SAndroid Build Coastguard Worker {
1713*f6dc9357SAndroid Build Coastguard Worker return Get_ArcInfoEx().Is_Zip();
1714*f6dc9357SAndroid Build Coastguard Worker }
1715*f6dc9357SAndroid Build Coastguard Worker
IsXzFormat()1716*f6dc9357SAndroid Build Coastguard Worker bool CCompressDialog::IsXzFormat()
1717*f6dc9357SAndroid Build Coastguard Worker {
1718*f6dc9357SAndroid Build Coastguard Worker return Get_ArcInfoEx().Is_Xz();
1719*f6dc9357SAndroid Build Coastguard Worker }
1720*f6dc9357SAndroid Build Coastguard Worker
SetEncryptionMethod()1721*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetEncryptionMethod()
1722*f6dc9357SAndroid Build Coastguard Worker {
1723*f6dc9357SAndroid Build Coastguard Worker _encryptionMethod.ResetContent();
1724*f6dc9357SAndroid Build Coastguard Worker _default_encryptionMethod_Index = -1;
1725*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = Get_ArcInfoEx();
1726*f6dc9357SAndroid Build Coastguard Worker if (ai.Is_7z())
1727*f6dc9357SAndroid Build Coastguard Worker {
1728*f6dc9357SAndroid Build Coastguard Worker ComboBox_AddStringAscii(_encryptionMethod, "AES-256");
1729*f6dc9357SAndroid Build Coastguard Worker _encryptionMethod.SetCurSel(0);
1730*f6dc9357SAndroid Build Coastguard Worker _default_encryptionMethod_Index = 0;
1731*f6dc9357SAndroid Build Coastguard Worker }
1732*f6dc9357SAndroid Build Coastguard Worker else if (ai.Is_Zip())
1733*f6dc9357SAndroid Build Coastguard Worker {
1734*f6dc9357SAndroid Build Coastguard Worker int index = FindRegistryFormat(ai.Name);
1735*f6dc9357SAndroid Build Coastguard Worker UString encryptionMethod;
1736*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
1737*f6dc9357SAndroid Build Coastguard Worker {
1738*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index];
1739*f6dc9357SAndroid Build Coastguard Worker encryptionMethod = fo.EncryptionMethod;
1740*f6dc9357SAndroid Build Coastguard Worker }
1741*f6dc9357SAndroid Build Coastguard Worker int sel = 0;
1742*f6dc9357SAndroid Build Coastguard Worker // if (ZipCryptoIsAllowed)
1743*f6dc9357SAndroid Build Coastguard Worker {
1744*f6dc9357SAndroid Build Coastguard Worker ComboBox_AddStringAscii(_encryptionMethod, "ZipCrypto");
1745*f6dc9357SAndroid Build Coastguard Worker sel = (encryptionMethod.IsPrefixedBy_Ascii_NoCase("aes") ? 1 : 0);
1746*f6dc9357SAndroid Build Coastguard Worker _default_encryptionMethod_Index = 0;
1747*f6dc9357SAndroid Build Coastguard Worker }
1748*f6dc9357SAndroid Build Coastguard Worker ComboBox_AddStringAscii(_encryptionMethod, "AES-256");
1749*f6dc9357SAndroid Build Coastguard Worker _encryptionMethod.SetCurSel(sel);
1750*f6dc9357SAndroid Build Coastguard Worker }
1751*f6dc9357SAndroid Build Coastguard Worker }
1752*f6dc9357SAndroid Build Coastguard Worker
1753*f6dc9357SAndroid Build Coastguard Worker
GetMethodID_RAW()1754*f6dc9357SAndroid Build Coastguard Worker int CCompressDialog::GetMethodID_RAW()
1755*f6dc9357SAndroid Build Coastguard Worker {
1756*f6dc9357SAndroid Build Coastguard Worker if (m_Method.GetCount() <= 0)
1757*f6dc9357SAndroid Build Coastguard Worker return -1;
1758*f6dc9357SAndroid Build Coastguard Worker return (int)(Int32)(UInt32)m_Method.GetItemData_of_CurSel();
1759*f6dc9357SAndroid Build Coastguard Worker }
1760*f6dc9357SAndroid Build Coastguard Worker
GetMethodID()1761*f6dc9357SAndroid Build Coastguard Worker int CCompressDialog::GetMethodID()
1762*f6dc9357SAndroid Build Coastguard Worker {
1763*f6dc9357SAndroid Build Coastguard Worker int raw = GetMethodID_RAW();
1764*f6dc9357SAndroid Build Coastguard Worker if (raw < 0)
1765*f6dc9357SAndroid Build Coastguard Worker return _auto_MethodId;
1766*f6dc9357SAndroid Build Coastguard Worker return raw;
1767*f6dc9357SAndroid Build Coastguard Worker }
1768*f6dc9357SAndroid Build Coastguard Worker
1769*f6dc9357SAndroid Build Coastguard Worker
GetMethodSpec(UString & estimatedName)1770*f6dc9357SAndroid Build Coastguard Worker UString CCompressDialog::GetMethodSpec(UString &estimatedName)
1771*f6dc9357SAndroid Build Coastguard Worker {
1772*f6dc9357SAndroid Build Coastguard Worker estimatedName.Empty();
1773*f6dc9357SAndroid Build Coastguard Worker if (m_Method.GetCount() < 1)
1774*f6dc9357SAndroid Build Coastguard Worker return estimatedName;
1775*f6dc9357SAndroid Build Coastguard Worker const int methodIdRaw = GetMethodID_RAW();
1776*f6dc9357SAndroid Build Coastguard Worker int methodId = methodIdRaw;
1777*f6dc9357SAndroid Build Coastguard Worker if (methodIdRaw < 0)
1778*f6dc9357SAndroid Build Coastguard Worker methodId = _auto_MethodId;
1779*f6dc9357SAndroid Build Coastguard Worker UString s;
1780*f6dc9357SAndroid Build Coastguard Worker if (methodId >= 0)
1781*f6dc9357SAndroid Build Coastguard Worker {
1782*f6dc9357SAndroid Build Coastguard Worker if ((unsigned)methodId < Z7_ARRAY_SIZE(kMethodsNames))
1783*f6dc9357SAndroid Build Coastguard Worker estimatedName = kMethodsNames[methodId];
1784*f6dc9357SAndroid Build Coastguard Worker else
1785*f6dc9357SAndroid Build Coastguard Worker estimatedName = ExternalMethods[(unsigned)methodId - (unsigned)Z7_ARRAY_SIZE(kMethodsNames)];
1786*f6dc9357SAndroid Build Coastguard Worker if (methodIdRaw >= 0)
1787*f6dc9357SAndroid Build Coastguard Worker s = estimatedName;
1788*f6dc9357SAndroid Build Coastguard Worker }
1789*f6dc9357SAndroid Build Coastguard Worker return s;
1790*f6dc9357SAndroid Build Coastguard Worker }
1791*f6dc9357SAndroid Build Coastguard Worker
1792*f6dc9357SAndroid Build Coastguard Worker
GetMethodSpec()1793*f6dc9357SAndroid Build Coastguard Worker UString CCompressDialog::GetMethodSpec()
1794*f6dc9357SAndroid Build Coastguard Worker {
1795*f6dc9357SAndroid Build Coastguard Worker UString estimatedName;
1796*f6dc9357SAndroid Build Coastguard Worker UString s = GetMethodSpec(estimatedName);
1797*f6dc9357SAndroid Build Coastguard Worker return s;
1798*f6dc9357SAndroid Build Coastguard Worker }
1799*f6dc9357SAndroid Build Coastguard Worker
IsMethodEqualTo(const UString & s)1800*f6dc9357SAndroid Build Coastguard Worker bool CCompressDialog::IsMethodEqualTo(const UString &s)
1801*f6dc9357SAndroid Build Coastguard Worker {
1802*f6dc9357SAndroid Build Coastguard Worker UString estimatedName;
1803*f6dc9357SAndroid Build Coastguard Worker const UString shortName = GetMethodSpec(estimatedName);
1804*f6dc9357SAndroid Build Coastguard Worker if (s.IsEmpty())
1805*f6dc9357SAndroid Build Coastguard Worker return shortName.IsEmpty();
1806*f6dc9357SAndroid Build Coastguard Worker return s.IsEqualTo_NoCase(estimatedName);
1807*f6dc9357SAndroid Build Coastguard Worker }
1808*f6dc9357SAndroid Build Coastguard Worker
1809*f6dc9357SAndroid Build Coastguard Worker
GetEncryptionMethodSpec()1810*f6dc9357SAndroid Build Coastguard Worker UString CCompressDialog::GetEncryptionMethodSpec()
1811*f6dc9357SAndroid Build Coastguard Worker {
1812*f6dc9357SAndroid Build Coastguard Worker UString s;
1813*f6dc9357SAndroid Build Coastguard Worker if (_encryptionMethod.GetCount() > 0
1814*f6dc9357SAndroid Build Coastguard Worker && _encryptionMethod.GetCurSel() != _default_encryptionMethod_Index)
1815*f6dc9357SAndroid Build Coastguard Worker {
1816*f6dc9357SAndroid Build Coastguard Worker _encryptionMethod.GetText(s);
1817*f6dc9357SAndroid Build Coastguard Worker s.RemoveChar(L'-');
1818*f6dc9357SAndroid Build Coastguard Worker }
1819*f6dc9357SAndroid Build Coastguard Worker return s;
1820*f6dc9357SAndroid Build Coastguard Worker }
1821*f6dc9357SAndroid Build Coastguard Worker
1822*f6dc9357SAndroid Build Coastguard Worker
1823*f6dc9357SAndroid Build Coastguard Worker static const size_t k_Auto_Dict = (size_t)0 - 1;
1824*f6dc9357SAndroid Build Coastguard Worker
Combo_AddDict2(NWindows::NControl::CComboBox & cb,size_t sizeReal,size_t sizeShow)1825*f6dc9357SAndroid Build Coastguard Worker static int Combo_AddDict2(NWindows::NControl::CComboBox &cb, size_t sizeReal, size_t sizeShow)
1826*f6dc9357SAndroid Build Coastguard Worker {
1827*f6dc9357SAndroid Build Coastguard Worker char c = 0;
1828*f6dc9357SAndroid Build Coastguard Worker unsigned moveBits = 0;
1829*f6dc9357SAndroid Build Coastguard Worker if ((sizeShow & 0xFFFFF) == 0) { moveBits = 20; c = 'M'; }
1830*f6dc9357SAndroid Build Coastguard Worker else if ((sizeShow & 0x3FF) == 0) { moveBits = 10; c = 'K'; }
1831*f6dc9357SAndroid Build Coastguard Worker AString s;
1832*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt64(sizeShow >> moveBits);
1833*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
1834*f6dc9357SAndroid Build Coastguard Worker if (c != 0)
1835*f6dc9357SAndroid Build Coastguard Worker s.Add_Char(c);
1836*f6dc9357SAndroid Build Coastguard Worker s.Add_Char('B');
1837*f6dc9357SAndroid Build Coastguard Worker if (sizeReal == k_Auto_Dict)
1838*f6dc9357SAndroid Build Coastguard Worker Modify_Auto(s);
1839*f6dc9357SAndroid Build Coastguard Worker const int index = (int)ComboBox_AddStringAscii(cb, s);
1840*f6dc9357SAndroid Build Coastguard Worker cb.SetItemData(index, (LPARAM)sizeReal);
1841*f6dc9357SAndroid Build Coastguard Worker return index;
1842*f6dc9357SAndroid Build Coastguard Worker }
1843*f6dc9357SAndroid Build Coastguard Worker
AddDict2(size_t sizeReal,size_t sizeShow)1844*f6dc9357SAndroid Build Coastguard Worker int CCompressDialog::AddDict2(size_t sizeReal, size_t sizeShow)
1845*f6dc9357SAndroid Build Coastguard Worker {
1846*f6dc9357SAndroid Build Coastguard Worker return Combo_AddDict2(m_Dictionary, sizeReal, sizeShow);
1847*f6dc9357SAndroid Build Coastguard Worker }
1848*f6dc9357SAndroid Build Coastguard Worker
AddDict(size_t size)1849*f6dc9357SAndroid Build Coastguard Worker int CCompressDialog::AddDict(size_t size)
1850*f6dc9357SAndroid Build Coastguard Worker {
1851*f6dc9357SAndroid Build Coastguard Worker return AddDict2(size, size);
1852*f6dc9357SAndroid Build Coastguard Worker }
1853*f6dc9357SAndroid Build Coastguard Worker
1854*f6dc9357SAndroid Build Coastguard Worker /*
1855*f6dc9357SAndroid Build Coastguard Worker int CCompressDialog::AddDict_Chain(size_t size)
1856*f6dc9357SAndroid Build Coastguard Worker {
1857*f6dc9357SAndroid Build Coastguard Worker return Combo_AddDict2(m_Dictionary_Chain, size, size);
1858*f6dc9357SAndroid Build Coastguard Worker }
1859*f6dc9357SAndroid Build Coastguard Worker */
1860*f6dc9357SAndroid Build Coastguard Worker
SetDictionary2()1861*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetDictionary2()
1862*f6dc9357SAndroid Build Coastguard Worker {
1863*f6dc9357SAndroid Build Coastguard Worker m_Dictionary.ResetContent();
1864*f6dc9357SAndroid Build Coastguard Worker // m_Dictionary_Chain.ResetContent();
1865*f6dc9357SAndroid Build Coastguard Worker
1866*f6dc9357SAndroid Build Coastguard Worker // _auto_Dict = (UInt32)1 << 24; // we can use this dictSize to calculate _auto_Solid for unknown method for 7z
1867*f6dc9357SAndroid Build Coastguard Worker _auto_Dict = (UInt32)(Int32)-1; // for debug
1868*f6dc9357SAndroid Build Coastguard Worker // _auto_Dict_Chain = (UInt32)(Int32)-1; // for debug
1869*f6dc9357SAndroid Build Coastguard Worker
1870*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = Get_ArcInfoEx();
1871*f6dc9357SAndroid Build Coastguard Worker UInt32 defaultDict = (UInt32)(Int32)-1;
1872*f6dc9357SAndroid Build Coastguard Worker // UInt32 defaultDict_Chain = (UInt32)(Int32)-1;
1873*f6dc9357SAndroid Build Coastguard Worker {
1874*f6dc9357SAndroid Build Coastguard Worker const int index = FindRegistryFormat(ai.Name);
1875*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
1876*f6dc9357SAndroid Build Coastguard Worker {
1877*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index];
1878*f6dc9357SAndroid Build Coastguard Worker if (IsMethodEqualTo(fo.Method))
1879*f6dc9357SAndroid Build Coastguard Worker {
1880*f6dc9357SAndroid Build Coastguard Worker defaultDict = fo.Dictionary;
1881*f6dc9357SAndroid Build Coastguard Worker // defaultDict_Chain = fo.DictionaryChain;
1882*f6dc9357SAndroid Build Coastguard Worker }
1883*f6dc9357SAndroid Build Coastguard Worker }
1884*f6dc9357SAndroid Build Coastguard Worker }
1885*f6dc9357SAndroid Build Coastguard Worker
1886*f6dc9357SAndroid Build Coastguard Worker const int methodID = GetMethodID();
1887*f6dc9357SAndroid Build Coastguard Worker const UInt32 level = GetLevel2();
1888*f6dc9357SAndroid Build Coastguard Worker
1889*f6dc9357SAndroid Build Coastguard Worker {
1890*f6dc9357SAndroid Build Coastguard Worker RECT r, rLabel;
1891*f6dc9357SAndroid Build Coastguard Worker GetClientRectOfItem(IDT_COMPRESS_DICTIONARY, rLabel);
1892*f6dc9357SAndroid Build Coastguard Worker GetClientRectOfItem(IDC_COMPRESS_DICTIONARY, r);
1893*f6dc9357SAndroid Build Coastguard Worker if (_dictionaryCombo_left == 0)
1894*f6dc9357SAndroid Build Coastguard Worker _dictionaryCombo_left = r.left;
1895*f6dc9357SAndroid Build Coastguard Worker
1896*f6dc9357SAndroid Build Coastguard Worker // bool showDict2;
1897*f6dc9357SAndroid Build Coastguard Worker int newLableRight;
1898*f6dc9357SAndroid Build Coastguard Worker int newDictLeft;
1899*f6dc9357SAndroid Build Coastguard Worker
1900*f6dc9357SAndroid Build Coastguard Worker /*
1901*f6dc9357SAndroid Build Coastguard Worker if (methodID == kZSTD)
1902*f6dc9357SAndroid Build Coastguard Worker {
1903*f6dc9357SAndroid Build Coastguard Worker showDict2 = true;
1904*f6dc9357SAndroid Build Coastguard Worker newDictLeft = _dictionaryCombo_left;
1905*f6dc9357SAndroid Build Coastguard Worker RECT r2;
1906*f6dc9357SAndroid Build Coastguard Worker GetClientRectOfItem(IDC_COMPRESS_DICTIONARY2, r2);
1907*f6dc9357SAndroid Build Coastguard Worker newLableRight = r2.left;
1908*f6dc9357SAndroid Build Coastguard Worker }
1909*f6dc9357SAndroid Build Coastguard Worker else
1910*f6dc9357SAndroid Build Coastguard Worker */
1911*f6dc9357SAndroid Build Coastguard Worker {
1912*f6dc9357SAndroid Build Coastguard Worker // showDict2 = false;
1913*f6dc9357SAndroid Build Coastguard Worker RECT rBig;
1914*f6dc9357SAndroid Build Coastguard Worker GetClientRectOfItem(IDC_COMPRESS_METHOD, rBig);
1915*f6dc9357SAndroid Build Coastguard Worker newDictLeft= rBig.left;
1916*f6dc9357SAndroid Build Coastguard Worker newLableRight = newDictLeft;
1917*f6dc9357SAndroid Build Coastguard Worker }
1918*f6dc9357SAndroid Build Coastguard Worker
1919*f6dc9357SAndroid Build Coastguard Worker if (newLableRight != rLabel.right)
1920*f6dc9357SAndroid Build Coastguard Worker {
1921*f6dc9357SAndroid Build Coastguard Worker rLabel.right = newLableRight;
1922*f6dc9357SAndroid Build Coastguard Worker MoveItem_RECT(IDT_COMPRESS_DICTIONARY, rLabel);
1923*f6dc9357SAndroid Build Coastguard Worker InvalidateRect(&rLabel);
1924*f6dc9357SAndroid Build Coastguard Worker }
1925*f6dc9357SAndroid Build Coastguard Worker if (newDictLeft != r.left)
1926*f6dc9357SAndroid Build Coastguard Worker {
1927*f6dc9357SAndroid Build Coastguard Worker r.left = newDictLeft;
1928*f6dc9357SAndroid Build Coastguard Worker MoveItem_RECT(IDC_COMPRESS_DICTIONARY, r);
1929*f6dc9357SAndroid Build Coastguard Worker // InvalidateRect(&r);
1930*f6dc9357SAndroid Build Coastguard Worker }
1931*f6dc9357SAndroid Build Coastguard Worker // ShowItem_Bool(IDC_COMPRESS_DICTIONARY2, showDict2);
1932*f6dc9357SAndroid Build Coastguard Worker }
1933*f6dc9357SAndroid Build Coastguard Worker
1934*f6dc9357SAndroid Build Coastguard Worker if (methodID < 0)
1935*f6dc9357SAndroid Build Coastguard Worker return;
1936*f6dc9357SAndroid Build Coastguard Worker
1937*f6dc9357SAndroid Build Coastguard Worker switch (methodID)
1938*f6dc9357SAndroid Build Coastguard Worker {
1939*f6dc9357SAndroid Build Coastguard Worker case kLZMA:
1940*f6dc9357SAndroid Build Coastguard Worker case kLZMA2:
1941*f6dc9357SAndroid Build Coastguard Worker {
1942*f6dc9357SAndroid Build Coastguard Worker {
1943*f6dc9357SAndroid Build Coastguard Worker _auto_Dict = level <= 4 ?
1944*f6dc9357SAndroid Build Coastguard Worker (UInt32)1 << (level * 2 + 16) :
1945*f6dc9357SAndroid Build Coastguard Worker level <= sizeof(size_t) / 2 + 4 ?
1946*f6dc9357SAndroid Build Coastguard Worker (UInt32)1 << (level + 20) :
1947*f6dc9357SAndroid Build Coastguard Worker (UInt32)1 << (sizeof(size_t) / 2 + 24);
1948*f6dc9357SAndroid Build Coastguard Worker }
1949*f6dc9357SAndroid Build Coastguard Worker
1950*f6dc9357SAndroid Build Coastguard Worker // we use threshold 3.75 GiB to switch to kLzmaMaxDictSize.
1951*f6dc9357SAndroid Build Coastguard Worker if (defaultDict != (UInt32)(Int32)-1
1952*f6dc9357SAndroid Build Coastguard Worker && defaultDict >= ((UInt32)15 << 28))
1953*f6dc9357SAndroid Build Coastguard Worker defaultDict = kLzmaMaxDictSize;
1954*f6dc9357SAndroid Build Coastguard Worker
1955*f6dc9357SAndroid Build Coastguard Worker const size_t kLzmaMaxDictSize_Up = (size_t)1 << (20 + sizeof(size_t) / 4 * 6);
1956*f6dc9357SAndroid Build Coastguard Worker
1957*f6dc9357SAndroid Build Coastguard Worker int curSel = AddDict2(k_Auto_Dict, _auto_Dict);
1958*f6dc9357SAndroid Build Coastguard Worker
1959*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = (16 - 1) * 2; i <= (32 - 1) * 2; i++)
1960*f6dc9357SAndroid Build Coastguard Worker {
1961*f6dc9357SAndroid Build Coastguard Worker if (i < (20 - 1) * 2
1962*f6dc9357SAndroid Build Coastguard Worker && i != (16 - 1) * 2
1963*f6dc9357SAndroid Build Coastguard Worker && i != (18 - 1) * 2)
1964*f6dc9357SAndroid Build Coastguard Worker continue;
1965*f6dc9357SAndroid Build Coastguard Worker if (i == (20 - 1) * 2 + 1)
1966*f6dc9357SAndroid Build Coastguard Worker continue;
1967*f6dc9357SAndroid Build Coastguard Worker const size_t dict_up = (size_t)(2 + (i & 1)) << (i / 2);
1968*f6dc9357SAndroid Build Coastguard Worker size_t dict = dict_up;
1969*f6dc9357SAndroid Build Coastguard Worker if (dict_up >= kLzmaMaxDictSize)
1970*f6dc9357SAndroid Build Coastguard Worker dict = kLzmaMaxDictSize; // we reduce dictionary
1971*f6dc9357SAndroid Build Coastguard Worker
1972*f6dc9357SAndroid Build Coastguard Worker const int index = AddDict(dict);
1973*f6dc9357SAndroid Build Coastguard Worker // AddDict2(dict, dict_up); // for debug : we show 4 GB
1974*f6dc9357SAndroid Build Coastguard Worker
1975*f6dc9357SAndroid Build Coastguard Worker // const UInt32 numThreads = 2;
1976*f6dc9357SAndroid Build Coastguard Worker // const UInt64 memUsage = GetMemoryUsageComp_Threads_Dict(numThreads, dict);
1977*f6dc9357SAndroid Build Coastguard Worker if (defaultDict != (UInt32)(Int32)-1)
1978*f6dc9357SAndroid Build Coastguard Worker if (dict <= defaultDict || curSel <= 0)
1979*f6dc9357SAndroid Build Coastguard Worker // if (!maxRamSize_Defined || memUsage <= maxRamSize)
1980*f6dc9357SAndroid Build Coastguard Worker curSel = index;
1981*f6dc9357SAndroid Build Coastguard Worker if (dict_up >= kLzmaMaxDictSize_Up)
1982*f6dc9357SAndroid Build Coastguard Worker break;
1983*f6dc9357SAndroid Build Coastguard Worker }
1984*f6dc9357SAndroid Build Coastguard Worker
1985*f6dc9357SAndroid Build Coastguard Worker m_Dictionary.SetCurSel(curSel);
1986*f6dc9357SAndroid Build Coastguard Worker break;
1987*f6dc9357SAndroid Build Coastguard Worker }
1988*f6dc9357SAndroid Build Coastguard Worker
1989*f6dc9357SAndroid Build Coastguard Worker /*
1990*f6dc9357SAndroid Build Coastguard Worker case kZSTD:
1991*f6dc9357SAndroid Build Coastguard Worker {
1992*f6dc9357SAndroid Build Coastguard Worker if (defaultDict != (UInt32)(Int32)-1 &&
1993*f6dc9357SAndroid Build Coastguard Worker defaultDict > kZstd_MAX_DictSize)
1994*f6dc9357SAndroid Build Coastguard Worker defaultDict = kZstd_MAX_DictSize;
1995*f6dc9357SAndroid Build Coastguard Worker
1996*f6dc9357SAndroid Build Coastguard Worker if (defaultDict_Chain != (UInt32)(Int32)-1 &&
1997*f6dc9357SAndroid Build Coastguard Worker defaultDict_Chain > kZstd_MAX_DictSize_Chain)
1998*f6dc9357SAndroid Build Coastguard Worker defaultDict_Chain = kZstd_MAX_DictSize_Chain;
1999*f6dc9357SAndroid Build Coastguard Worker
2000*f6dc9357SAndroid Build Coastguard Worker {
2001*f6dc9357SAndroid Build Coastguard Worker CZstdEncProps props;
2002*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_Init(&props);
2003*f6dc9357SAndroid Build Coastguard Worker // props.level_zstd = level;
2004*f6dc9357SAndroid Build Coastguard Worker props.level_7z = level;
2005*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_Set_WindowSize(&props, defaultDict != (UInt32)(Int32)-1 ? defaultDict: 0);
2006*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_NormalizeFull(&props);
2007*f6dc9357SAndroid Build Coastguard Worker _auto_Dict_Chain = (UInt32)1 << props.windowLog_Chain;
2008*f6dc9357SAndroid Build Coastguard Worker }
2009*f6dc9357SAndroid Build Coastguard Worker {
2010*f6dc9357SAndroid Build Coastguard Worker CZstdEncProps props;
2011*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_Init(&props);
2012*f6dc9357SAndroid Build Coastguard Worker // props.level_zstd = level;
2013*f6dc9357SAndroid Build Coastguard Worker props.level_7z = level;
2014*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_Set_WindowChainSize(&props, defaultDict_Chain != (UInt32)(Int32)-1 ? defaultDict_Chain: 0);
2015*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_NormalizeFull(&props);
2016*f6dc9357SAndroid Build Coastguard Worker _auto_Dict = (UInt32)1 << props.windowLog;
2017*f6dc9357SAndroid Build Coastguard Worker }
2018*f6dc9357SAndroid Build Coastguard Worker
2019*f6dc9357SAndroid Build Coastguard Worker // if there is collision of two window sizes, we reduce dict_Chain
2020*f6dc9357SAndroid Build Coastguard Worker if (defaultDict != (UInt32)(Int32)-1 &&
2021*f6dc9357SAndroid Build Coastguard Worker defaultDict_Chain != (UInt32)(Int32)-1 &&
2022*f6dc9357SAndroid Build Coastguard Worker defaultDict < defaultDict_Chain)
2023*f6dc9357SAndroid Build Coastguard Worker defaultDict_Chain = defaultDict;
2024*f6dc9357SAndroid Build Coastguard Worker
2025*f6dc9357SAndroid Build Coastguard Worker {
2026*f6dc9357SAndroid Build Coastguard Worker int curSel = AddDict2(k_Auto_Dict, _auto_Dict);
2027*f6dc9357SAndroid Build Coastguard Worker
2028*f6dc9357SAndroid Build Coastguard Worker // defaultDict = 12 << 10; // for debug
2029*f6dc9357SAndroid Build Coastguard Worker const UInt32 kWinStart = 18;
2030*f6dc9357SAndroid Build Coastguard Worker if (defaultDict != 0 && defaultDict < ((UInt32)1 << kWinStart))
2031*f6dc9357SAndroid Build Coastguard Worker curSel = AddDict(defaultDict);
2032*f6dc9357SAndroid Build Coastguard Worker
2033*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = kWinStart; i <= MY_ZSTD_WINDOWLOG_MAX; i++)
2034*f6dc9357SAndroid Build Coastguard Worker {
2035*f6dc9357SAndroid Build Coastguard Worker const size_t dict = (size_t)1 << i;
2036*f6dc9357SAndroid Build Coastguard Worker const int index = AddDict(dict);
2037*f6dc9357SAndroid Build Coastguard Worker if (defaultDict != (UInt32)(Int32)-1)
2038*f6dc9357SAndroid Build Coastguard Worker if (dict <= defaultDict || curSel <= 0)
2039*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2040*f6dc9357SAndroid Build Coastguard Worker }
2041*f6dc9357SAndroid Build Coastguard Worker m_Dictionary.SetCurSel(curSel);
2042*f6dc9357SAndroid Build Coastguard Worker }
2043*f6dc9357SAndroid Build Coastguard Worker
2044*f6dc9357SAndroid Build Coastguard Worker {
2045*f6dc9357SAndroid Build Coastguard Worker int curSel = Combo_AddDict2(m_Dictionary_Chain, k_Auto_Dict, _auto_Dict_Chain);
2046*f6dc9357SAndroid Build Coastguard Worker
2047*f6dc9357SAndroid Build Coastguard Worker // defaultDict_Chain = 10 << 10; // for debug
2048*f6dc9357SAndroid Build Coastguard Worker const UInt32 kWinChainStart = 15;
2049*f6dc9357SAndroid Build Coastguard Worker if (defaultDict_Chain != 0 && defaultDict_Chain < ((UInt32)1 << kWinChainStart))
2050*f6dc9357SAndroid Build Coastguard Worker curSel = AddDict_Chain(defaultDict_Chain);
2051*f6dc9357SAndroid Build Coastguard Worker
2052*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = kWinChainStart; i <= kMaxDictChain; i++)
2053*f6dc9357SAndroid Build Coastguard Worker {
2054*f6dc9357SAndroid Build Coastguard Worker const size_t dict = (size_t)1 << i;
2055*f6dc9357SAndroid Build Coastguard Worker if (defaultDict != (UInt32)(Int32)-1 && dict > defaultDict)
2056*f6dc9357SAndroid Build Coastguard Worker break;
2057*f6dc9357SAndroid Build Coastguard Worker const int index = AddDict_Chain(dict);
2058*f6dc9357SAndroid Build Coastguard Worker if (defaultDict_Chain != (UInt32)(Int32)-1)
2059*f6dc9357SAndroid Build Coastguard Worker if (dict <= defaultDict_Chain || curSel <= 0)
2060*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2061*f6dc9357SAndroid Build Coastguard Worker }
2062*f6dc9357SAndroid Build Coastguard Worker m_Dictionary_Chain.SetCurSel(curSel);
2063*f6dc9357SAndroid Build Coastguard Worker }
2064*f6dc9357SAndroid Build Coastguard Worker
2065*f6dc9357SAndroid Build Coastguard Worker break;
2066*f6dc9357SAndroid Build Coastguard Worker }
2067*f6dc9357SAndroid Build Coastguard Worker */
2068*f6dc9357SAndroid Build Coastguard Worker
2069*f6dc9357SAndroid Build Coastguard Worker case kPPMd:
2070*f6dc9357SAndroid Build Coastguard Worker {
2071*f6dc9357SAndroid Build Coastguard Worker _auto_Dict = (UInt32)1 << (level + 19);
2072*f6dc9357SAndroid Build Coastguard Worker
2073*f6dc9357SAndroid Build Coastguard Worker const UInt32 kPpmd_Default_4g = (UInt32)0 - ((UInt32)1 << 10);
2074*f6dc9357SAndroid Build Coastguard Worker const size_t kPpmd_MaxDictSize_Up = (size_t)1 << (29 + sizeof(size_t) / 8);
2075*f6dc9357SAndroid Build Coastguard Worker
2076*f6dc9357SAndroid Build Coastguard Worker if (defaultDict != (UInt32)(Int32)-1
2077*f6dc9357SAndroid Build Coastguard Worker && defaultDict >= ((UInt32)15 << 28)) // threshold
2078*f6dc9357SAndroid Build Coastguard Worker defaultDict = kPpmd_Default_4g;
2079*f6dc9357SAndroid Build Coastguard Worker
2080*f6dc9357SAndroid Build Coastguard Worker int curSel = AddDict2(k_Auto_Dict, _auto_Dict);
2081*f6dc9357SAndroid Build Coastguard Worker
2082*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = (20 - 1) * 2; i <= (32 - 1) * 2; i++)
2083*f6dc9357SAndroid Build Coastguard Worker {
2084*f6dc9357SAndroid Build Coastguard Worker if (i == (20 - 1) * 2 + 1)
2085*f6dc9357SAndroid Build Coastguard Worker continue;
2086*f6dc9357SAndroid Build Coastguard Worker
2087*f6dc9357SAndroid Build Coastguard Worker const size_t dict_up = (size_t)(2 + (i & 1)) << (i / 2);
2088*f6dc9357SAndroid Build Coastguard Worker size_t dict = dict_up;
2089*f6dc9357SAndroid Build Coastguard Worker if (dict_up >= kPpmd_Default_4g)
2090*f6dc9357SAndroid Build Coastguard Worker dict = kPpmd_Default_4g;
2091*f6dc9357SAndroid Build Coastguard Worker
2092*f6dc9357SAndroid Build Coastguard Worker const int index = AddDict2(dict, dict_up);
2093*f6dc9357SAndroid Build Coastguard Worker // AddDict2((UInt32)((UInt32)0 - 2), dict_up); // for debug
2094*f6dc9357SAndroid Build Coastguard Worker // AddDict(dict_up); // for debug
2095*f6dc9357SAndroid Build Coastguard Worker // const UInt64 memUsage = GetMemoryUsageComp_Threads_Dict(1, dict);
2096*f6dc9357SAndroid Build Coastguard Worker if (defaultDict != (UInt32)(Int32)-1)
2097*f6dc9357SAndroid Build Coastguard Worker if (dict <= defaultDict || curSel <= 0)
2098*f6dc9357SAndroid Build Coastguard Worker // if (!maxRamSize_Defined || memUsage <= maxRamSize)
2099*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2100*f6dc9357SAndroid Build Coastguard Worker if (dict_up >= kPpmd_MaxDictSize_Up)
2101*f6dc9357SAndroid Build Coastguard Worker break;
2102*f6dc9357SAndroid Build Coastguard Worker }
2103*f6dc9357SAndroid Build Coastguard Worker m_Dictionary.SetCurSel(curSel);
2104*f6dc9357SAndroid Build Coastguard Worker break;
2105*f6dc9357SAndroid Build Coastguard Worker }
2106*f6dc9357SAndroid Build Coastguard Worker
2107*f6dc9357SAndroid Build Coastguard Worker case kPPMdZip:
2108*f6dc9357SAndroid Build Coastguard Worker {
2109*f6dc9357SAndroid Build Coastguard Worker _auto_Dict = (UInt32)1 << (level + 19);
2110*f6dc9357SAndroid Build Coastguard Worker
2111*f6dc9357SAndroid Build Coastguard Worker int curSel = AddDict2(k_Auto_Dict, _auto_Dict);
2112*f6dc9357SAndroid Build Coastguard Worker
2113*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 20; i <= 28; i++)
2114*f6dc9357SAndroid Build Coastguard Worker {
2115*f6dc9357SAndroid Build Coastguard Worker const UInt32 dict = (UInt32)1 << i;
2116*f6dc9357SAndroid Build Coastguard Worker const int index = AddDict(dict);
2117*f6dc9357SAndroid Build Coastguard Worker // const UInt64 memUsage = GetMemoryUsageComp_Threads_Dict(1, dict);
2118*f6dc9357SAndroid Build Coastguard Worker if (defaultDict != (UInt32)(Int32)-1)
2119*f6dc9357SAndroid Build Coastguard Worker if (dict <= defaultDict || curSel <= 0)
2120*f6dc9357SAndroid Build Coastguard Worker // if (!maxRamSize_Defined || memUsage <= maxRamSize)
2121*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2122*f6dc9357SAndroid Build Coastguard Worker }
2123*f6dc9357SAndroid Build Coastguard Worker m_Dictionary.SetCurSel(curSel);
2124*f6dc9357SAndroid Build Coastguard Worker break;
2125*f6dc9357SAndroid Build Coastguard Worker }
2126*f6dc9357SAndroid Build Coastguard Worker
2127*f6dc9357SAndroid Build Coastguard Worker case kDeflate:
2128*f6dc9357SAndroid Build Coastguard Worker case kDeflate64:
2129*f6dc9357SAndroid Build Coastguard Worker {
2130*f6dc9357SAndroid Build Coastguard Worker const UInt32 dict = (methodID == kDeflate ? (UInt32)(1 << 15) : (UInt32)(1 << 16));
2131*f6dc9357SAndroid Build Coastguard Worker _auto_Dict = dict;
2132*f6dc9357SAndroid Build Coastguard Worker AddDict2(k_Auto_Dict, _auto_Dict);
2133*f6dc9357SAndroid Build Coastguard Worker m_Dictionary.SetCurSel(0);
2134*f6dc9357SAndroid Build Coastguard Worker // EnableItem(IDC_COMPRESS_DICTIONARY, false);
2135*f6dc9357SAndroid Build Coastguard Worker break;
2136*f6dc9357SAndroid Build Coastguard Worker }
2137*f6dc9357SAndroid Build Coastguard Worker
2138*f6dc9357SAndroid Build Coastguard Worker case kBZip2:
2139*f6dc9357SAndroid Build Coastguard Worker {
2140*f6dc9357SAndroid Build Coastguard Worker {
2141*f6dc9357SAndroid Build Coastguard Worker if (level >= 5) _auto_Dict = (900 << 10);
2142*f6dc9357SAndroid Build Coastguard Worker else if (level >= 3) _auto_Dict = (500 << 10);
2143*f6dc9357SAndroid Build Coastguard Worker else _auto_Dict = (100 << 10);
2144*f6dc9357SAndroid Build Coastguard Worker }
2145*f6dc9357SAndroid Build Coastguard Worker
2146*f6dc9357SAndroid Build Coastguard Worker int curSel = AddDict2(k_Auto_Dict, _auto_Dict);
2147*f6dc9357SAndroid Build Coastguard Worker
2148*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 1; i <= 9; i++)
2149*f6dc9357SAndroid Build Coastguard Worker {
2150*f6dc9357SAndroid Build Coastguard Worker const UInt32 dict = ((UInt32)i * 100) << 10;
2151*f6dc9357SAndroid Build Coastguard Worker AddDict(dict);
2152*f6dc9357SAndroid Build Coastguard Worker // AddDict2(i * 100000, dict);
2153*f6dc9357SAndroid Build Coastguard Worker if (defaultDict != (UInt32)(Int32)-1)
2154*f6dc9357SAndroid Build Coastguard Worker if (i <= defaultDict / 100000 || curSel <= 0)
2155*f6dc9357SAndroid Build Coastguard Worker curSel = m_Dictionary.GetCount() - 1;
2156*f6dc9357SAndroid Build Coastguard Worker }
2157*f6dc9357SAndroid Build Coastguard Worker m_Dictionary.SetCurSel(curSel);
2158*f6dc9357SAndroid Build Coastguard Worker break;
2159*f6dc9357SAndroid Build Coastguard Worker }
2160*f6dc9357SAndroid Build Coastguard Worker
2161*f6dc9357SAndroid Build Coastguard Worker case kCopy:
2162*f6dc9357SAndroid Build Coastguard Worker {
2163*f6dc9357SAndroid Build Coastguard Worker _auto_Dict = 0;
2164*f6dc9357SAndroid Build Coastguard Worker AddDict(0);
2165*f6dc9357SAndroid Build Coastguard Worker m_Dictionary.SetCurSel(0);
2166*f6dc9357SAndroid Build Coastguard Worker break;
2167*f6dc9357SAndroid Build Coastguard Worker }
2168*f6dc9357SAndroid Build Coastguard Worker }
2169*f6dc9357SAndroid Build Coastguard Worker }
2170*f6dc9357SAndroid Build Coastguard Worker
2171*f6dc9357SAndroid Build Coastguard Worker
GetComboValue(NWindows::NControl::CComboBox & c,int defMax)2172*f6dc9357SAndroid Build Coastguard Worker UInt32 CCompressDialog::GetComboValue(NWindows::NControl::CComboBox &c, int defMax)
2173*f6dc9357SAndroid Build Coastguard Worker {
2174*f6dc9357SAndroid Build Coastguard Worker if (c.GetCount() <= defMax)
2175*f6dc9357SAndroid Build Coastguard Worker return (UInt32)(Int32)-1;
2176*f6dc9357SAndroid Build Coastguard Worker return (UInt32)c.GetItemData_of_CurSel();
2177*f6dc9357SAndroid Build Coastguard Worker }
2178*f6dc9357SAndroid Build Coastguard Worker
2179*f6dc9357SAndroid Build Coastguard Worker
GetComboValue_64(NWindows::NControl::CComboBox & c,int defMax)2180*f6dc9357SAndroid Build Coastguard Worker UInt64 CCompressDialog::GetComboValue_64(NWindows::NControl::CComboBox &c, int defMax)
2181*f6dc9357SAndroid Build Coastguard Worker {
2182*f6dc9357SAndroid Build Coastguard Worker if (c.GetCount() <= defMax)
2183*f6dc9357SAndroid Build Coastguard Worker return (UInt64)(Int64)-1;
2184*f6dc9357SAndroid Build Coastguard Worker // LRESULT is signed. so we cast it to unsigned size_t at first:
2185*f6dc9357SAndroid Build Coastguard Worker LRESULT val = c.GetItemData_of_CurSel();
2186*f6dc9357SAndroid Build Coastguard Worker if (val == (LPARAM)(INT_PTR)(-1))
2187*f6dc9357SAndroid Build Coastguard Worker return (UInt64)(Int64)-1;
2188*f6dc9357SAndroid Build Coastguard Worker return (UInt64)(size_t)c.GetItemData_of_CurSel();
2189*f6dc9357SAndroid Build Coastguard Worker }
2190*f6dc9357SAndroid Build Coastguard Worker
GetLevel2()2191*f6dc9357SAndroid Build Coastguard Worker UInt32 CCompressDialog::GetLevel2()
2192*f6dc9357SAndroid Build Coastguard Worker {
2193*f6dc9357SAndroid Build Coastguard Worker UInt32 level = GetLevel();
2194*f6dc9357SAndroid Build Coastguard Worker if (level == (UInt32)(Int32)-1)
2195*f6dc9357SAndroid Build Coastguard Worker level = 5;
2196*f6dc9357SAndroid Build Coastguard Worker return level;
2197*f6dc9357SAndroid Build Coastguard Worker }
2198*f6dc9357SAndroid Build Coastguard Worker
2199*f6dc9357SAndroid Build Coastguard Worker
AddOrder(UInt32 size)2200*f6dc9357SAndroid Build Coastguard Worker int CCompressDialog::AddOrder(UInt32 size)
2201*f6dc9357SAndroid Build Coastguard Worker {
2202*f6dc9357SAndroid Build Coastguard Worker char s[32];
2203*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToString(size, s);
2204*f6dc9357SAndroid Build Coastguard Worker const int index = (int)ComboBox_AddStringAscii(m_Order, s);
2205*f6dc9357SAndroid Build Coastguard Worker m_Order.SetItemData(index, (LPARAM)size);
2206*f6dc9357SAndroid Build Coastguard Worker return index;
2207*f6dc9357SAndroid Build Coastguard Worker }
2208*f6dc9357SAndroid Build Coastguard Worker
AddOrder_Auto()2209*f6dc9357SAndroid Build Coastguard Worker int CCompressDialog::AddOrder_Auto()
2210*f6dc9357SAndroid Build Coastguard Worker {
2211*f6dc9357SAndroid Build Coastguard Worker AString s;
2212*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32(_auto_Order);
2213*f6dc9357SAndroid Build Coastguard Worker Modify_Auto(s);
2214*f6dc9357SAndroid Build Coastguard Worker int index = (int)ComboBox_AddStringAscii(m_Order, s);
2215*f6dc9357SAndroid Build Coastguard Worker m_Order.SetItemData(index, (LPARAM)(INT_PTR)(-1));
2216*f6dc9357SAndroid Build Coastguard Worker return index;
2217*f6dc9357SAndroid Build Coastguard Worker }
2218*f6dc9357SAndroid Build Coastguard Worker
SetOrder2()2219*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetOrder2()
2220*f6dc9357SAndroid Build Coastguard Worker {
2221*f6dc9357SAndroid Build Coastguard Worker m_Order.ResetContent();
2222*f6dc9357SAndroid Build Coastguard Worker
2223*f6dc9357SAndroid Build Coastguard Worker _auto_Order = 1;
2224*f6dc9357SAndroid Build Coastguard Worker
2225*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = Get_ArcInfoEx();
2226*f6dc9357SAndroid Build Coastguard Worker UInt32 defaultOrder = (UInt32)(Int32)-1;
2227*f6dc9357SAndroid Build Coastguard Worker
2228*f6dc9357SAndroid Build Coastguard Worker {
2229*f6dc9357SAndroid Build Coastguard Worker const int index = FindRegistryFormat(ai.Name);
2230*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
2231*f6dc9357SAndroid Build Coastguard Worker {
2232*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index];
2233*f6dc9357SAndroid Build Coastguard Worker if (IsMethodEqualTo(fo.Method))
2234*f6dc9357SAndroid Build Coastguard Worker defaultOrder = fo.Order;
2235*f6dc9357SAndroid Build Coastguard Worker }
2236*f6dc9357SAndroid Build Coastguard Worker }
2237*f6dc9357SAndroid Build Coastguard Worker
2238*f6dc9357SAndroid Build Coastguard Worker const int methodID = GetMethodID();
2239*f6dc9357SAndroid Build Coastguard Worker const UInt32 level = GetLevel2();
2240*f6dc9357SAndroid Build Coastguard Worker if (methodID < 0)
2241*f6dc9357SAndroid Build Coastguard Worker return;
2242*f6dc9357SAndroid Build Coastguard Worker
2243*f6dc9357SAndroid Build Coastguard Worker switch (methodID)
2244*f6dc9357SAndroid Build Coastguard Worker {
2245*f6dc9357SAndroid Build Coastguard Worker case kLZMA:
2246*f6dc9357SAndroid Build Coastguard Worker case kLZMA2:
2247*f6dc9357SAndroid Build Coastguard Worker {
2248*f6dc9357SAndroid Build Coastguard Worker _auto_Order = (level < 7 ? 32 : 64);
2249*f6dc9357SAndroid Build Coastguard Worker int curSel = AddOrder_Auto();
2250*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 2 * 2; i < 8 * 2; i++)
2251*f6dc9357SAndroid Build Coastguard Worker {
2252*f6dc9357SAndroid Build Coastguard Worker UInt32 order = ((UInt32)(2 + (i & 1)) << (i / 2));
2253*f6dc9357SAndroid Build Coastguard Worker if (order > 256)
2254*f6dc9357SAndroid Build Coastguard Worker order = 273;
2255*f6dc9357SAndroid Build Coastguard Worker const int index = AddOrder(order);
2256*f6dc9357SAndroid Build Coastguard Worker if (defaultOrder != (UInt32)(Int32)-1)
2257*f6dc9357SAndroid Build Coastguard Worker if (order <= defaultOrder || curSel <= 0)
2258*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2259*f6dc9357SAndroid Build Coastguard Worker }
2260*f6dc9357SAndroid Build Coastguard Worker m_Order.SetCurSel(curSel);
2261*f6dc9357SAndroid Build Coastguard Worker break;
2262*f6dc9357SAndroid Build Coastguard Worker }
2263*f6dc9357SAndroid Build Coastguard Worker
2264*f6dc9357SAndroid Build Coastguard Worker /*
2265*f6dc9357SAndroid Build Coastguard Worker case kZSTD:
2266*f6dc9357SAndroid Build Coastguard Worker {
2267*f6dc9357SAndroid Build Coastguard Worker {
2268*f6dc9357SAndroid Build Coastguard Worker CZstdEncProps props;
2269*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_Init(&props);
2270*f6dc9357SAndroid Build Coastguard Worker // props.level_zstd = level;
2271*f6dc9357SAndroid Build Coastguard Worker props.level_7z = level;
2272*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_NormalizeFull(&props);
2273*f6dc9357SAndroid Build Coastguard Worker _auto_Order = props.targetLength;
2274*f6dc9357SAndroid Build Coastguard Worker if (props.strategy < ZSTD_strategy_btopt)
2275*f6dc9357SAndroid Build Coastguard Worker {
2276*f6dc9357SAndroid Build Coastguard Worker // ZSTD_strategy_fast uses targetLength to change fast level.
2277*f6dc9357SAndroid Build Coastguard Worker // targetLength probably is used only in ZSTD_strategy_btopt and higher
2278*f6dc9357SAndroid Build Coastguard Worker break;
2279*f6dc9357SAndroid Build Coastguard Worker }
2280*f6dc9357SAndroid Build Coastguard Worker }
2281*f6dc9357SAndroid Build Coastguard Worker int curSel = AddOrder_Auto();
2282*f6dc9357SAndroid Build Coastguard Worker
2283*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 6; i <= 9 * 2; i++)
2284*f6dc9357SAndroid Build Coastguard Worker {
2285*f6dc9357SAndroid Build Coastguard Worker UInt32 order = ((UInt32)(2 + (i & 1)) << (i / 2));
2286*f6dc9357SAndroid Build Coastguard Worker // if (order > 999) order = 999;
2287*f6dc9357SAndroid Build Coastguard Worker const int index = AddOrder(order);
2288*f6dc9357SAndroid Build Coastguard Worker if (defaultOrder != (UInt32)(Int32)-1)
2289*f6dc9357SAndroid Build Coastguard Worker if (order <= defaultOrder || curSel <= 0)
2290*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2291*f6dc9357SAndroid Build Coastguard Worker }
2292*f6dc9357SAndroid Build Coastguard Worker m_Order.SetCurSel(curSel);
2293*f6dc9357SAndroid Build Coastguard Worker break;
2294*f6dc9357SAndroid Build Coastguard Worker }
2295*f6dc9357SAndroid Build Coastguard Worker */
2296*f6dc9357SAndroid Build Coastguard Worker
2297*f6dc9357SAndroid Build Coastguard Worker case kDeflate:
2298*f6dc9357SAndroid Build Coastguard Worker case kDeflate64:
2299*f6dc9357SAndroid Build Coastguard Worker {
2300*f6dc9357SAndroid Build Coastguard Worker {
2301*f6dc9357SAndroid Build Coastguard Worker if (level >= 9) _auto_Order = 128;
2302*f6dc9357SAndroid Build Coastguard Worker else if (level >= 7) _auto_Order = 64;
2303*f6dc9357SAndroid Build Coastguard Worker else _auto_Order = 32;
2304*f6dc9357SAndroid Build Coastguard Worker }
2305*f6dc9357SAndroid Build Coastguard Worker int curSel = AddOrder_Auto();
2306*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 2 * 2; i < 8 * 2; i++)
2307*f6dc9357SAndroid Build Coastguard Worker {
2308*f6dc9357SAndroid Build Coastguard Worker UInt32 order = ((UInt32)(2 + (i & 1)) << (i / 2));
2309*f6dc9357SAndroid Build Coastguard Worker if (order > 256)
2310*f6dc9357SAndroid Build Coastguard Worker order = (methodID == kDeflate64 ? 257 : 258);
2311*f6dc9357SAndroid Build Coastguard Worker const int index = AddOrder(order);
2312*f6dc9357SAndroid Build Coastguard Worker if (defaultOrder != (UInt32)(Int32)-1)
2313*f6dc9357SAndroid Build Coastguard Worker if (order <= defaultOrder || curSel <= 0)
2314*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2315*f6dc9357SAndroid Build Coastguard Worker }
2316*f6dc9357SAndroid Build Coastguard Worker
2317*f6dc9357SAndroid Build Coastguard Worker m_Order.SetCurSel(curSel);
2318*f6dc9357SAndroid Build Coastguard Worker break;
2319*f6dc9357SAndroid Build Coastguard Worker }
2320*f6dc9357SAndroid Build Coastguard Worker
2321*f6dc9357SAndroid Build Coastguard Worker case kPPMd:
2322*f6dc9357SAndroid Build Coastguard Worker {
2323*f6dc9357SAndroid Build Coastguard Worker {
2324*f6dc9357SAndroid Build Coastguard Worker if (level >= 9) _auto_Order = 32;
2325*f6dc9357SAndroid Build Coastguard Worker else if (level >= 7) _auto_Order = 16;
2326*f6dc9357SAndroid Build Coastguard Worker else if (level >= 5) _auto_Order = 6;
2327*f6dc9357SAndroid Build Coastguard Worker else _auto_Order = 4;
2328*f6dc9357SAndroid Build Coastguard Worker }
2329*f6dc9357SAndroid Build Coastguard Worker
2330*f6dc9357SAndroid Build Coastguard Worker int curSel = AddOrder_Auto();
2331*f6dc9357SAndroid Build Coastguard Worker
2332*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0;; i++)
2333*f6dc9357SAndroid Build Coastguard Worker {
2334*f6dc9357SAndroid Build Coastguard Worker UInt32 order = i + 2;
2335*f6dc9357SAndroid Build Coastguard Worker if (i >= 2)
2336*f6dc9357SAndroid Build Coastguard Worker order = (4 + ((i - 2) & 3)) << ((i - 2) / 4);
2337*f6dc9357SAndroid Build Coastguard Worker const int index = AddOrder(order);
2338*f6dc9357SAndroid Build Coastguard Worker if (defaultOrder != (UInt32)(Int32)-1)
2339*f6dc9357SAndroid Build Coastguard Worker if (order <= defaultOrder || curSel <= 0)
2340*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2341*f6dc9357SAndroid Build Coastguard Worker if (order >= 32)
2342*f6dc9357SAndroid Build Coastguard Worker break;
2343*f6dc9357SAndroid Build Coastguard Worker }
2344*f6dc9357SAndroid Build Coastguard Worker m_Order.SetCurSel(curSel);
2345*f6dc9357SAndroid Build Coastguard Worker break;
2346*f6dc9357SAndroid Build Coastguard Worker }
2347*f6dc9357SAndroid Build Coastguard Worker
2348*f6dc9357SAndroid Build Coastguard Worker case kPPMdZip:
2349*f6dc9357SAndroid Build Coastguard Worker {
2350*f6dc9357SAndroid Build Coastguard Worker _auto_Order = level + 3;
2351*f6dc9357SAndroid Build Coastguard Worker int curSel = AddOrder_Auto();
2352*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 2; i <= 16; i++)
2353*f6dc9357SAndroid Build Coastguard Worker {
2354*f6dc9357SAndroid Build Coastguard Worker const int index = AddOrder(i);
2355*f6dc9357SAndroid Build Coastguard Worker if (defaultOrder != (UInt32)(Int32)-1)
2356*f6dc9357SAndroid Build Coastguard Worker if (i <= defaultOrder || curSel <= 0)
2357*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2358*f6dc9357SAndroid Build Coastguard Worker }
2359*f6dc9357SAndroid Build Coastguard Worker m_Order.SetCurSel(curSel);
2360*f6dc9357SAndroid Build Coastguard Worker break;
2361*f6dc9357SAndroid Build Coastguard Worker }
2362*f6dc9357SAndroid Build Coastguard Worker
2363*f6dc9357SAndroid Build Coastguard Worker // case kBZip2:
2364*f6dc9357SAndroid Build Coastguard Worker default:
2365*f6dc9357SAndroid Build Coastguard Worker break;
2366*f6dc9357SAndroid Build Coastguard Worker }
2367*f6dc9357SAndroid Build Coastguard Worker }
2368*f6dc9357SAndroid Build Coastguard Worker
GetOrderMode()2369*f6dc9357SAndroid Build Coastguard Worker bool CCompressDialog::GetOrderMode()
2370*f6dc9357SAndroid Build Coastguard Worker {
2371*f6dc9357SAndroid Build Coastguard Worker switch (GetMethodID())
2372*f6dc9357SAndroid Build Coastguard Worker {
2373*f6dc9357SAndroid Build Coastguard Worker case kPPMd:
2374*f6dc9357SAndroid Build Coastguard Worker case kPPMdZip:
2375*f6dc9357SAndroid Build Coastguard Worker return true;
2376*f6dc9357SAndroid Build Coastguard Worker }
2377*f6dc9357SAndroid Build Coastguard Worker return false;
2378*f6dc9357SAndroid Build Coastguard Worker }
2379*f6dc9357SAndroid Build Coastguard Worker
2380*f6dc9357SAndroid Build Coastguard Worker
Get_Lzma2_ChunkSize(UInt64 dict)2381*f6dc9357SAndroid Build Coastguard Worker static UInt64 Get_Lzma2_ChunkSize(UInt64 dict)
2382*f6dc9357SAndroid Build Coastguard Worker {
2383*f6dc9357SAndroid Build Coastguard Worker // we use same default chunk sizes as defined in 7z encoder and lzma2 encoder
2384*f6dc9357SAndroid Build Coastguard Worker UInt64 cs = (UInt64)dict << 2;
2385*f6dc9357SAndroid Build Coastguard Worker const UInt32 kMinSize = (UInt32)1 << 20;
2386*f6dc9357SAndroid Build Coastguard Worker const UInt32 kMaxSize = (UInt32)1 << 28;
2387*f6dc9357SAndroid Build Coastguard Worker if (cs < kMinSize) cs = kMinSize;
2388*f6dc9357SAndroid Build Coastguard Worker if (cs > kMaxSize) cs = kMaxSize;
2389*f6dc9357SAndroid Build Coastguard Worker if (cs < dict) cs = dict;
2390*f6dc9357SAndroid Build Coastguard Worker cs += (kMinSize - 1);
2391*f6dc9357SAndroid Build Coastguard Worker cs &= ~(UInt64)(kMinSize - 1);
2392*f6dc9357SAndroid Build Coastguard Worker return cs;
2393*f6dc9357SAndroid Build Coastguard Worker }
2394*f6dc9357SAndroid Build Coastguard Worker
2395*f6dc9357SAndroid Build Coastguard Worker
Add_Size(AString & s,UInt64 val)2396*f6dc9357SAndroid Build Coastguard Worker static void Add_Size(AString &s, UInt64 val)
2397*f6dc9357SAndroid Build Coastguard Worker {
2398*f6dc9357SAndroid Build Coastguard Worker unsigned moveBits = 0;
2399*f6dc9357SAndroid Build Coastguard Worker char c = 0;
2400*f6dc9357SAndroid Build Coastguard Worker if ((val & 0x3FFFFFFF) == 0) { moveBits = 30; c = 'G'; }
2401*f6dc9357SAndroid Build Coastguard Worker else if ((val & 0xFFFFF) == 0) { moveBits = 20; c = 'M'; }
2402*f6dc9357SAndroid Build Coastguard Worker else if ((val & 0x3FF) == 0) { moveBits = 10; c = 'K'; }
2403*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt64(val >> moveBits);
2404*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
2405*f6dc9357SAndroid Build Coastguard Worker if (moveBits != 0)
2406*f6dc9357SAndroid Build Coastguard Worker s.Add_Char(c);
2407*f6dc9357SAndroid Build Coastguard Worker s.Add_Char('B');
2408*f6dc9357SAndroid Build Coastguard Worker }
2409*f6dc9357SAndroid Build Coastguard Worker
2410*f6dc9357SAndroid Build Coastguard Worker
SetSolidBlockSize2()2411*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetSolidBlockSize2()
2412*f6dc9357SAndroid Build Coastguard Worker {
2413*f6dc9357SAndroid Build Coastguard Worker m_Solid.ResetContent();
2414*f6dc9357SAndroid Build Coastguard Worker _auto_Solid = 1 << 20;
2415*f6dc9357SAndroid Build Coastguard Worker
2416*f6dc9357SAndroid Build Coastguard Worker const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];
2417*f6dc9357SAndroid Build Coastguard Worker if (!fi.Solid_())
2418*f6dc9357SAndroid Build Coastguard Worker return;
2419*f6dc9357SAndroid Build Coastguard Worker
2420*f6dc9357SAndroid Build Coastguard Worker const UInt32 level = GetLevel2();
2421*f6dc9357SAndroid Build Coastguard Worker if (level == 0)
2422*f6dc9357SAndroid Build Coastguard Worker return;
2423*f6dc9357SAndroid Build Coastguard Worker
2424*f6dc9357SAndroid Build Coastguard Worker UInt64 dict = GetDict2();
2425*f6dc9357SAndroid Build Coastguard Worker if (dict == (UInt64)(Int64)-1)
2426*f6dc9357SAndroid Build Coastguard Worker {
2427*f6dc9357SAndroid Build Coastguard Worker dict = 1 << 25; // default dict for unknown methods
2428*f6dc9357SAndroid Build Coastguard Worker // return;
2429*f6dc9357SAndroid Build Coastguard Worker }
2430*f6dc9357SAndroid Build Coastguard Worker
2431*f6dc9357SAndroid Build Coastguard Worker
2432*f6dc9357SAndroid Build Coastguard Worker UInt32 defaultBlockSize = (UInt32)(Int32)-1;
2433*f6dc9357SAndroid Build Coastguard Worker
2434*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = Get_ArcInfoEx();
2435*f6dc9357SAndroid Build Coastguard Worker
2436*f6dc9357SAndroid Build Coastguard Worker /*
2437*f6dc9357SAndroid Build Coastguard Worker if (usePrevDictionary)
2438*f6dc9357SAndroid Build Coastguard Worker defaultBlockSize = GetBlockSizeSpec();
2439*f6dc9357SAndroid Build Coastguard Worker else
2440*f6dc9357SAndroid Build Coastguard Worker */
2441*f6dc9357SAndroid Build Coastguard Worker {
2442*f6dc9357SAndroid Build Coastguard Worker const int index = FindRegistryFormat(ai.Name);
2443*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
2444*f6dc9357SAndroid Build Coastguard Worker {
2445*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index];
2446*f6dc9357SAndroid Build Coastguard Worker if (IsMethodEqualTo(fo.Method))
2447*f6dc9357SAndroid Build Coastguard Worker defaultBlockSize = fo.BlockLogSize;
2448*f6dc9357SAndroid Build Coastguard Worker }
2449*f6dc9357SAndroid Build Coastguard Worker }
2450*f6dc9357SAndroid Build Coastguard Worker
2451*f6dc9357SAndroid Build Coastguard Worker const bool is7z = ai.Is_7z();
2452*f6dc9357SAndroid Build Coastguard Worker
2453*f6dc9357SAndroid Build Coastguard Worker const UInt64 cs = Get_Lzma2_ChunkSize(dict);
2454*f6dc9357SAndroid Build Coastguard Worker
2455*f6dc9357SAndroid Build Coastguard Worker // Solid Block Size
2456*f6dc9357SAndroid Build Coastguard Worker UInt64 blockSize = cs; // for xz
2457*f6dc9357SAndroid Build Coastguard Worker
2458*f6dc9357SAndroid Build Coastguard Worker if (is7z)
2459*f6dc9357SAndroid Build Coastguard Worker {
2460*f6dc9357SAndroid Build Coastguard Worker // we use same default block sizes as defined in 7z encoder
2461*f6dc9357SAndroid Build Coastguard Worker UInt64 kMaxSize = (UInt64)1 << 32;
2462*f6dc9357SAndroid Build Coastguard Worker const int methodId = GetMethodID();
2463*f6dc9357SAndroid Build Coastguard Worker if (methodId == kLZMA2)
2464*f6dc9357SAndroid Build Coastguard Worker {
2465*f6dc9357SAndroid Build Coastguard Worker blockSize = cs << 6;
2466*f6dc9357SAndroid Build Coastguard Worker kMaxSize = (UInt64)1 << 34;
2467*f6dc9357SAndroid Build Coastguard Worker }
2468*f6dc9357SAndroid Build Coastguard Worker else
2469*f6dc9357SAndroid Build Coastguard Worker {
2470*f6dc9357SAndroid Build Coastguard Worker UInt64 dict2 = dict;
2471*f6dc9357SAndroid Build Coastguard Worker if (methodId == kBZip2)
2472*f6dc9357SAndroid Build Coastguard Worker {
2473*f6dc9357SAndroid Build Coastguard Worker dict2 /= 100000;
2474*f6dc9357SAndroid Build Coastguard Worker if (dict2 < 1)
2475*f6dc9357SAndroid Build Coastguard Worker dict2 = 1;
2476*f6dc9357SAndroid Build Coastguard Worker dict2 *= 100000;
2477*f6dc9357SAndroid Build Coastguard Worker }
2478*f6dc9357SAndroid Build Coastguard Worker blockSize = dict2 << 7;
2479*f6dc9357SAndroid Build Coastguard Worker }
2480*f6dc9357SAndroid Build Coastguard Worker
2481*f6dc9357SAndroid Build Coastguard Worker const UInt32 kMinSize = (UInt32)1 << 24;
2482*f6dc9357SAndroid Build Coastguard Worker if (blockSize < kMinSize) blockSize = kMinSize;
2483*f6dc9357SAndroid Build Coastguard Worker if (blockSize > kMaxSize) blockSize = kMaxSize;
2484*f6dc9357SAndroid Build Coastguard Worker }
2485*f6dc9357SAndroid Build Coastguard Worker
2486*f6dc9357SAndroid Build Coastguard Worker _auto_Solid = blockSize;
2487*f6dc9357SAndroid Build Coastguard Worker
2488*f6dc9357SAndroid Build Coastguard Worker int curSel;
2489*f6dc9357SAndroid Build Coastguard Worker {
2490*f6dc9357SAndroid Build Coastguard Worker AString s;
2491*f6dc9357SAndroid Build Coastguard Worker Add_Size(s, _auto_Solid);
2492*f6dc9357SAndroid Build Coastguard Worker Modify_Auto(s);
2493*f6dc9357SAndroid Build Coastguard Worker const int index = (int)ComboBox_AddStringAscii(m_Solid, s);
2494*f6dc9357SAndroid Build Coastguard Worker m_Solid.SetItemData(index, (LPARAM)(UInt32)(Int32)-1);
2495*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2496*f6dc9357SAndroid Build Coastguard Worker }
2497*f6dc9357SAndroid Build Coastguard Worker
2498*f6dc9357SAndroid Build Coastguard Worker if (is7z)
2499*f6dc9357SAndroid Build Coastguard Worker {
2500*f6dc9357SAndroid Build Coastguard Worker UString s ('-');
2501*f6dc9357SAndroid Build Coastguard Worker // kSolidLog_NoSolid = 0 for xz means default blockSize
2502*f6dc9357SAndroid Build Coastguard Worker if (is7z)
2503*f6dc9357SAndroid Build Coastguard Worker LangString(IDS_COMPRESS_NON_SOLID, s);
2504*f6dc9357SAndroid Build Coastguard Worker const int index = (int)m_Solid.AddString(s);
2505*f6dc9357SAndroid Build Coastguard Worker m_Solid.SetItemData(index, (LPARAM)(UInt32)kSolidLog_NoSolid);
2506*f6dc9357SAndroid Build Coastguard Worker if (defaultBlockSize == kSolidLog_NoSolid)
2507*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2508*f6dc9357SAndroid Build Coastguard Worker }
2509*f6dc9357SAndroid Build Coastguard Worker
2510*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 20; i <= 36; i++)
2511*f6dc9357SAndroid Build Coastguard Worker {
2512*f6dc9357SAndroid Build Coastguard Worker AString s;
2513*f6dc9357SAndroid Build Coastguard Worker Add_Size(s, (UInt64)1 << i);
2514*f6dc9357SAndroid Build Coastguard Worker const int index = (int)ComboBox_AddStringAscii(m_Solid, s);
2515*f6dc9357SAndroid Build Coastguard Worker m_Solid.SetItemData(index, (LPARAM)(UInt32)i);
2516*f6dc9357SAndroid Build Coastguard Worker if (defaultBlockSize != (UInt32)(Int32)-1)
2517*f6dc9357SAndroid Build Coastguard Worker if (i <= defaultBlockSize || index <= 1)
2518*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2519*f6dc9357SAndroid Build Coastguard Worker }
2520*f6dc9357SAndroid Build Coastguard Worker
2521*f6dc9357SAndroid Build Coastguard Worker {
2522*f6dc9357SAndroid Build Coastguard Worker const int index = (int)m_Solid.AddString(LangString(IDS_COMPRESS_SOLID));
2523*f6dc9357SAndroid Build Coastguard Worker m_Solid.SetItemData(index, (LPARAM)kSolidLog_FullSolid);
2524*f6dc9357SAndroid Build Coastguard Worker if (defaultBlockSize == kSolidLog_FullSolid)
2525*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2526*f6dc9357SAndroid Build Coastguard Worker }
2527*f6dc9357SAndroid Build Coastguard Worker
2528*f6dc9357SAndroid Build Coastguard Worker m_Solid.SetCurSel(curSel);
2529*f6dc9357SAndroid Build Coastguard Worker }
2530*f6dc9357SAndroid Build Coastguard Worker
2531*f6dc9357SAndroid Build Coastguard Worker
2532*f6dc9357SAndroid Build Coastguard Worker /*
2533*f6dc9357SAndroid Build Coastguard Worker static void ZstdEncProps_SetDictProps_From_CompressDialog(CZstdEncProps *props, CCompressDialog &cd)
2534*f6dc9357SAndroid Build Coastguard Worker {
2535*f6dc9357SAndroid Build Coastguard Worker {
2536*f6dc9357SAndroid Build Coastguard Worker const UInt64 d64 = cd.GetDictSpec();
2537*f6dc9357SAndroid Build Coastguard Worker UInt32 d32 = 0; // 0 is default for ZstdEncProps::windowLog
2538*f6dc9357SAndroid Build Coastguard Worker if (d64 != (UInt64)(Int64)-1)
2539*f6dc9357SAndroid Build Coastguard Worker {
2540*f6dc9357SAndroid Build Coastguard Worker d32 = (UInt32)d64;
2541*f6dc9357SAndroid Build Coastguard Worker if (d32 != d64)
2542*f6dc9357SAndroid Build Coastguard Worker d32 = (UInt32)(Int32)-2;
2543*f6dc9357SAndroid Build Coastguard Worker }
2544*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_Set_WindowSize(props, d32);
2545*f6dc9357SAndroid Build Coastguard Worker }
2546*f6dc9357SAndroid Build Coastguard Worker {
2547*f6dc9357SAndroid Build Coastguard Worker const UInt64 d64 = cd.GetDictChainSpec();
2548*f6dc9357SAndroid Build Coastguard Worker UInt32 d32 = 0; // 0 is default for ZstdEncProps::windowLog_Chain
2549*f6dc9357SAndroid Build Coastguard Worker if (d64 != (UInt64)(Int64)-1)
2550*f6dc9357SAndroid Build Coastguard Worker {
2551*f6dc9357SAndroid Build Coastguard Worker d32 = (UInt32)d64;
2552*f6dc9357SAndroid Build Coastguard Worker if (d32 != d64)
2553*f6dc9357SAndroid Build Coastguard Worker d32 = (UInt32)(Int32)-2;
2554*f6dc9357SAndroid Build Coastguard Worker }
2555*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_Set_WindowChainSize(props, d32);
2556*f6dc9357SAndroid Build Coastguard Worker }
2557*f6dc9357SAndroid Build Coastguard Worker }
2558*f6dc9357SAndroid Build Coastguard Worker
2559*f6dc9357SAndroid Build Coastguard Worker static bool Is_Zstd_Mt_Supported()
2560*f6dc9357SAndroid Build Coastguard Worker {
2561*f6dc9357SAndroid Build Coastguard Worker if (!GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "InitializeConditionVariable"))
2562*f6dc9357SAndroid Build Coastguard Worker return false;
2563*f6dc9357SAndroid Build Coastguard Worker return true;
2564*f6dc9357SAndroid Build Coastguard Worker }
2565*f6dc9357SAndroid Build Coastguard Worker */
2566*f6dc9357SAndroid Build Coastguard Worker
2567*f6dc9357SAndroid Build Coastguard Worker static const char *k_ST_Threads = " (ST)";
2568*f6dc9357SAndroid Build Coastguard Worker
SetNumThreads2()2569*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetNumThreads2()
2570*f6dc9357SAndroid Build Coastguard Worker {
2571*f6dc9357SAndroid Build Coastguard Worker _auto_NumThreads = 1;
2572*f6dc9357SAndroid Build Coastguard Worker
2573*f6dc9357SAndroid Build Coastguard Worker m_NumThreads.ResetContent();
2574*f6dc9357SAndroid Build Coastguard Worker const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];
2575*f6dc9357SAndroid Build Coastguard Worker if (!fi.MultiThread_())
2576*f6dc9357SAndroid Build Coastguard Worker return;
2577*f6dc9357SAndroid Build Coastguard Worker
2578*f6dc9357SAndroid Build Coastguard Worker const UInt32 numHardwareThreads = NSystem::GetNumberOfProcessors();
2579*f6dc9357SAndroid Build Coastguard Worker // 64; // for debug:
2580*f6dc9357SAndroid Build Coastguard Worker
2581*f6dc9357SAndroid Build Coastguard Worker UInt32 defaultValue = numHardwareThreads;
2582*f6dc9357SAndroid Build Coastguard Worker bool useAutoThreads = true;
2583*f6dc9357SAndroid Build Coastguard Worker
2584*f6dc9357SAndroid Build Coastguard Worker {
2585*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = Get_ArcInfoEx();
2586*f6dc9357SAndroid Build Coastguard Worker int index = FindRegistryFormat(ai.Name);
2587*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
2588*f6dc9357SAndroid Build Coastguard Worker {
2589*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index];
2590*f6dc9357SAndroid Build Coastguard Worker if (IsMethodEqualTo(fo.Method) && fo.NumThreads != (UInt32)(Int32)-1)
2591*f6dc9357SAndroid Build Coastguard Worker {
2592*f6dc9357SAndroid Build Coastguard Worker defaultValue = fo.NumThreads;
2593*f6dc9357SAndroid Build Coastguard Worker useAutoThreads = false;
2594*f6dc9357SAndroid Build Coastguard Worker }
2595*f6dc9357SAndroid Build Coastguard Worker }
2596*f6dc9357SAndroid Build Coastguard Worker }
2597*f6dc9357SAndroid Build Coastguard Worker
2598*f6dc9357SAndroid Build Coastguard Worker // const UInt32 num_ZSTD_threads_MAX = Is_Zstd_Mt_Supported() ? MY_ZSTDMT_NBWORKERS_MAX : 0;
2599*f6dc9357SAndroid Build Coastguard Worker
2600*f6dc9357SAndroid Build Coastguard Worker UInt32 numAlgoThreadsMax = numHardwareThreads * 2;
2601*f6dc9357SAndroid Build Coastguard Worker const int methodID = GetMethodID();
2602*f6dc9357SAndroid Build Coastguard Worker
2603*f6dc9357SAndroid Build Coastguard Worker switch (methodID)
2604*f6dc9357SAndroid Build Coastguard Worker {
2605*f6dc9357SAndroid Build Coastguard Worker case kLZMA: numAlgoThreadsMax = 2; break;
2606*f6dc9357SAndroid Build Coastguard Worker case kLZMA2: numAlgoThreadsMax = 256; break;
2607*f6dc9357SAndroid Build Coastguard Worker case kBZip2: numAlgoThreadsMax = 32; break;
2608*f6dc9357SAndroid Build Coastguard Worker // case kZSTD: numAlgoThreadsMax = num_ZSTD_threads_MAX; break;
2609*f6dc9357SAndroid Build Coastguard Worker case kCopy:
2610*f6dc9357SAndroid Build Coastguard Worker case kPPMd:
2611*f6dc9357SAndroid Build Coastguard Worker case kDeflate:
2612*f6dc9357SAndroid Build Coastguard Worker case kDeflate64:
2613*f6dc9357SAndroid Build Coastguard Worker case kPPMdZip:
2614*f6dc9357SAndroid Build Coastguard Worker numAlgoThreadsMax = 1;
2615*f6dc9357SAndroid Build Coastguard Worker }
2616*f6dc9357SAndroid Build Coastguard Worker const bool isZip = IsZipFormat();
2617*f6dc9357SAndroid Build Coastguard Worker if (isZip)
2618*f6dc9357SAndroid Build Coastguard Worker {
2619*f6dc9357SAndroid Build Coastguard Worker numAlgoThreadsMax =
2620*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
2621*f6dc9357SAndroid Build Coastguard Worker 64; // _WIN32 supports only 64 threads in one group. So no need for more threads here
2622*f6dc9357SAndroid Build Coastguard Worker #else
2623*f6dc9357SAndroid Build Coastguard Worker 128;
2624*f6dc9357SAndroid Build Coastguard Worker #endif
2625*f6dc9357SAndroid Build Coastguard Worker }
2626*f6dc9357SAndroid Build Coastguard Worker
2627*f6dc9357SAndroid Build Coastguard Worker UInt32 autoThreads = numHardwareThreads;
2628*f6dc9357SAndroid Build Coastguard Worker if (autoThreads > numAlgoThreadsMax)
2629*f6dc9357SAndroid Build Coastguard Worker autoThreads = numAlgoThreadsMax;
2630*f6dc9357SAndroid Build Coastguard Worker
2631*f6dc9357SAndroid Build Coastguard Worker const UInt64 memUse_Limit = Get_MemUse_Bytes();
2632*f6dc9357SAndroid Build Coastguard Worker
2633*f6dc9357SAndroid Build Coastguard Worker if (_ramSize_Defined)
2634*f6dc9357SAndroid Build Coastguard Worker if (autoThreads > 1
2635*f6dc9357SAndroid Build Coastguard Worker // || (autoThreads == 0 && methodID == kZSTD)
2636*f6dc9357SAndroid Build Coastguard Worker )
2637*f6dc9357SAndroid Build Coastguard Worker {
2638*f6dc9357SAndroid Build Coastguard Worker if (isZip)
2639*f6dc9357SAndroid Build Coastguard Worker {
2640*f6dc9357SAndroid Build Coastguard Worker for (; autoThreads > 1; autoThreads--)
2641*f6dc9357SAndroid Build Coastguard Worker {
2642*f6dc9357SAndroid Build Coastguard Worker const UInt64 dict64 = GetDict2();
2643*f6dc9357SAndroid Build Coastguard Worker UInt64 decompressMemory;
2644*f6dc9357SAndroid Build Coastguard Worker const UInt64 usage = GetMemoryUsage_Threads_Dict_DecompMem(autoThreads, dict64, decompressMemory);
2645*f6dc9357SAndroid Build Coastguard Worker if (usage <= memUse_Limit)
2646*f6dc9357SAndroid Build Coastguard Worker break;
2647*f6dc9357SAndroid Build Coastguard Worker }
2648*f6dc9357SAndroid Build Coastguard Worker }
2649*f6dc9357SAndroid Build Coastguard Worker else if (methodID == kLZMA2)
2650*f6dc9357SAndroid Build Coastguard Worker {
2651*f6dc9357SAndroid Build Coastguard Worker const UInt64 dict64 = GetDict2();
2652*f6dc9357SAndroid Build Coastguard Worker const UInt32 numThreads1 = (GetLevel2() >= 5 ? 2 : 1);
2653*f6dc9357SAndroid Build Coastguard Worker UInt32 numBlockThreads = autoThreads / numThreads1;
2654*f6dc9357SAndroid Build Coastguard Worker for (; numBlockThreads > 1; numBlockThreads--)
2655*f6dc9357SAndroid Build Coastguard Worker {
2656*f6dc9357SAndroid Build Coastguard Worker autoThreads = numBlockThreads * numThreads1;
2657*f6dc9357SAndroid Build Coastguard Worker UInt64 decompressMemory;
2658*f6dc9357SAndroid Build Coastguard Worker const UInt64 usage = GetMemoryUsage_Threads_Dict_DecompMem(autoThreads, dict64, decompressMemory);
2659*f6dc9357SAndroid Build Coastguard Worker if (usage <= memUse_Limit)
2660*f6dc9357SAndroid Build Coastguard Worker break;
2661*f6dc9357SAndroid Build Coastguard Worker }
2662*f6dc9357SAndroid Build Coastguard Worker autoThreads = numBlockThreads * numThreads1;
2663*f6dc9357SAndroid Build Coastguard Worker }
2664*f6dc9357SAndroid Build Coastguard Worker /*
2665*f6dc9357SAndroid Build Coastguard Worker else if (methodID == kZSTD)
2666*f6dc9357SAndroid Build Coastguard Worker {
2667*f6dc9357SAndroid Build Coastguard Worker if (num_ZSTD_threads_MAX != 0)
2668*f6dc9357SAndroid Build Coastguard Worker {
2669*f6dc9357SAndroid Build Coastguard Worker CZstdEncProps props;
2670*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_Init(&props);
2671*f6dc9357SAndroid Build Coastguard Worker // props.level_zstd = level;
2672*f6dc9357SAndroid Build Coastguard Worker props.level_7z = GetLevel2();
2673*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_SetDictProps_From_CompressDialog(&props, *this);
2674*f6dc9357SAndroid Build Coastguard Worker autoThreads = ZstdEncProps_GetNumThreads_for_MemUsageLimit(&props, memUse_Limit, autoThreads);
2675*f6dc9357SAndroid Build Coastguard Worker }
2676*f6dc9357SAndroid Build Coastguard Worker }
2677*f6dc9357SAndroid Build Coastguard Worker */
2678*f6dc9357SAndroid Build Coastguard Worker }
2679*f6dc9357SAndroid Build Coastguard Worker
2680*f6dc9357SAndroid Build Coastguard Worker _auto_NumThreads = autoThreads;
2681*f6dc9357SAndroid Build Coastguard Worker
2682*f6dc9357SAndroid Build Coastguard Worker int curSel = -1;
2683*f6dc9357SAndroid Build Coastguard Worker {
2684*f6dc9357SAndroid Build Coastguard Worker AString s;
2685*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32(autoThreads);
2686*f6dc9357SAndroid Build Coastguard Worker if (autoThreads == 0) s += k_ST_Threads;
2687*f6dc9357SAndroid Build Coastguard Worker Modify_Auto(s);
2688*f6dc9357SAndroid Build Coastguard Worker const int index = (int)ComboBox_AddStringAscii(m_NumThreads, s);
2689*f6dc9357SAndroid Build Coastguard Worker m_NumThreads.SetItemData(index, (LPARAM)(INT_PTR)(-1));
2690*f6dc9357SAndroid Build Coastguard Worker // m_NumThreads.SetItemData(index, autoThreads);
2691*f6dc9357SAndroid Build Coastguard Worker if (useAutoThreads)
2692*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2693*f6dc9357SAndroid Build Coastguard Worker }
2694*f6dc9357SAndroid Build Coastguard Worker
2695*f6dc9357SAndroid Build Coastguard Worker if (numAlgoThreadsMax != autoThreads || autoThreads != 1)
2696*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i =
2697*f6dc9357SAndroid Build Coastguard Worker // (methodID == kZSTD) ? 0 :
2698*f6dc9357SAndroid Build Coastguard Worker 1;
2699*f6dc9357SAndroid Build Coastguard Worker i <= numHardwareThreads * 2 && i <= numAlgoThreadsMax; i++)
2700*f6dc9357SAndroid Build Coastguard Worker {
2701*f6dc9357SAndroid Build Coastguard Worker AString s;
2702*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32(i);
2703*f6dc9357SAndroid Build Coastguard Worker if (i == 0) s += k_ST_Threads;
2704*f6dc9357SAndroid Build Coastguard Worker const int index = (int)ComboBox_AddStringAscii(m_NumThreads, s);
2705*f6dc9357SAndroid Build Coastguard Worker m_NumThreads.SetItemData(index, (LPARAM)(UInt32)i);
2706*f6dc9357SAndroid Build Coastguard Worker if (!useAutoThreads && i == defaultValue)
2707*f6dc9357SAndroid Build Coastguard Worker curSel = index;
2708*f6dc9357SAndroid Build Coastguard Worker }
2709*f6dc9357SAndroid Build Coastguard Worker
2710*f6dc9357SAndroid Build Coastguard Worker m_NumThreads.SetCurSel(curSel);
2711*f6dc9357SAndroid Build Coastguard Worker }
2712*f6dc9357SAndroid Build Coastguard Worker
2713*f6dc9357SAndroid Build Coastguard Worker
AddMemSize(UString & res,UInt64 size)2714*f6dc9357SAndroid Build Coastguard Worker static void AddMemSize(UString &res, UInt64 size)
2715*f6dc9357SAndroid Build Coastguard Worker {
2716*f6dc9357SAndroid Build Coastguard Worker char c;
2717*f6dc9357SAndroid Build Coastguard Worker unsigned moveBits = 0;
2718*f6dc9357SAndroid Build Coastguard Worker if (size >= ((UInt64)1 << 31) && (size & 0x3FFFFFFF) == 0)
2719*f6dc9357SAndroid Build Coastguard Worker { moveBits = 30; c = 'G'; }
2720*f6dc9357SAndroid Build Coastguard Worker else // if (size >= ((UInt32)1 << 21) && (size & 0xFFFFF) == 0)
2721*f6dc9357SAndroid Build Coastguard Worker { moveBits = 20; c = 'M'; }
2722*f6dc9357SAndroid Build Coastguard Worker // else { moveBits = 10; c = 'K'; }
2723*f6dc9357SAndroid Build Coastguard Worker res.Add_UInt64(size >> moveBits);
2724*f6dc9357SAndroid Build Coastguard Worker res.Add_Space();
2725*f6dc9357SAndroid Build Coastguard Worker if (moveBits != 0)
2726*f6dc9357SAndroid Build Coastguard Worker res.Add_Char(c);
2727*f6dc9357SAndroid Build Coastguard Worker res.Add_Char('B');
2728*f6dc9357SAndroid Build Coastguard Worker }
2729*f6dc9357SAndroid Build Coastguard Worker
2730*f6dc9357SAndroid Build Coastguard Worker
AddMemComboItem(UInt64 val,bool isPercent,bool isDefault)2731*f6dc9357SAndroid Build Coastguard Worker int CCompressDialog::AddMemComboItem(UInt64 val, bool isPercent, bool isDefault)
2732*f6dc9357SAndroid Build Coastguard Worker {
2733*f6dc9357SAndroid Build Coastguard Worker UString sUser;
2734*f6dc9357SAndroid Build Coastguard Worker UString sRegistry;
2735*f6dc9357SAndroid Build Coastguard Worker if (isPercent)
2736*f6dc9357SAndroid Build Coastguard Worker {
2737*f6dc9357SAndroid Build Coastguard Worker UString s;
2738*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt64(val);
2739*f6dc9357SAndroid Build Coastguard Worker s.Add_Char('%');
2740*f6dc9357SAndroid Build Coastguard Worker if (isDefault)
2741*f6dc9357SAndroid Build Coastguard Worker sUser = k_Auto_Prefix;
2742*f6dc9357SAndroid Build Coastguard Worker else
2743*f6dc9357SAndroid Build Coastguard Worker sRegistry = s;
2744*f6dc9357SAndroid Build Coastguard Worker sUser += s;
2745*f6dc9357SAndroid Build Coastguard Worker }
2746*f6dc9357SAndroid Build Coastguard Worker else
2747*f6dc9357SAndroid Build Coastguard Worker {
2748*f6dc9357SAndroid Build Coastguard Worker AddMemSize(sUser, val);
2749*f6dc9357SAndroid Build Coastguard Worker sRegistry = sUser;
2750*f6dc9357SAndroid Build Coastguard Worker for (;;)
2751*f6dc9357SAndroid Build Coastguard Worker {
2752*f6dc9357SAndroid Build Coastguard Worker const int pos = sRegistry.Find(L' ');
2753*f6dc9357SAndroid Build Coastguard Worker if (pos < 0)
2754*f6dc9357SAndroid Build Coastguard Worker break;
2755*f6dc9357SAndroid Build Coastguard Worker sRegistry.Delete(pos);
2756*f6dc9357SAndroid Build Coastguard Worker }
2757*f6dc9357SAndroid Build Coastguard Worker if (!sRegistry.IsEmpty())
2758*f6dc9357SAndroid Build Coastguard Worker if (sRegistry.Back() == 'B')
2759*f6dc9357SAndroid Build Coastguard Worker sRegistry.DeleteBack();
2760*f6dc9357SAndroid Build Coastguard Worker }
2761*f6dc9357SAndroid Build Coastguard Worker const unsigned dataIndex = _memUse_Strings.Add(sRegistry);
2762*f6dc9357SAndroid Build Coastguard Worker const int index = (int)m_MemUse.AddString(sUser);
2763*f6dc9357SAndroid Build Coastguard Worker m_MemUse.SetItemData(index, (LPARAM)dataIndex);
2764*f6dc9357SAndroid Build Coastguard Worker return index;
2765*f6dc9357SAndroid Build Coastguard Worker }
2766*f6dc9357SAndroid Build Coastguard Worker
2767*f6dc9357SAndroid Build Coastguard Worker
2768*f6dc9357SAndroid Build Coastguard Worker
SetMemUseCombo()2769*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetMemUseCombo()
2770*f6dc9357SAndroid Build Coastguard Worker {
2771*f6dc9357SAndroid Build Coastguard Worker _memUse_Strings.Clear();
2772*f6dc9357SAndroid Build Coastguard Worker m_MemUse.ResetContent();
2773*f6dc9357SAndroid Build Coastguard Worker const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];
2774*f6dc9357SAndroid Build Coastguard Worker
2775*f6dc9357SAndroid Build Coastguard Worker {
2776*f6dc9357SAndroid Build Coastguard Worker const bool enable = fi.MemUse_();
2777*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool(IDT_COMPRESS_MEMORY, enable);
2778*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool(IDT_COMPRESS_MEMORY_VALUE, enable);
2779*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool(IDT_COMPRESS_MEMORY_DE, enable);
2780*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool(IDT_COMPRESS_MEMORY_DE_VALUE, enable);
2781*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool(IDC_COMPRESS_MEM_USE, enable);
2782*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDC_COMPRESS_MEM_USE, enable);
2783*f6dc9357SAndroid Build Coastguard Worker if (!enable)
2784*f6dc9357SAndroid Build Coastguard Worker return;
2785*f6dc9357SAndroid Build Coastguard Worker }
2786*f6dc9357SAndroid Build Coastguard Worker
2787*f6dc9357SAndroid Build Coastguard Worker UInt64 curMem_Bytes = 0;
2788*f6dc9357SAndroid Build Coastguard Worker UInt64 curMem_Percents = 0;
2789*f6dc9357SAndroid Build Coastguard Worker bool needSetCur_Bytes = false;
2790*f6dc9357SAndroid Build Coastguard Worker bool needSetCur_Percents = false;
2791*f6dc9357SAndroid Build Coastguard Worker {
2792*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = Get_FormatOptions();
2793*f6dc9357SAndroid Build Coastguard Worker if (!fo.MemUse.IsEmpty())
2794*f6dc9357SAndroid Build Coastguard Worker {
2795*f6dc9357SAndroid Build Coastguard Worker NCompression::CMemUse mu;
2796*f6dc9357SAndroid Build Coastguard Worker mu.Parse(fo.MemUse);
2797*f6dc9357SAndroid Build Coastguard Worker if (mu.IsDefined)
2798*f6dc9357SAndroid Build Coastguard Worker {
2799*f6dc9357SAndroid Build Coastguard Worker if (mu.IsPercent)
2800*f6dc9357SAndroid Build Coastguard Worker {
2801*f6dc9357SAndroid Build Coastguard Worker curMem_Percents = mu.Val;
2802*f6dc9357SAndroid Build Coastguard Worker needSetCur_Percents = true;
2803*f6dc9357SAndroid Build Coastguard Worker }
2804*f6dc9357SAndroid Build Coastguard Worker else
2805*f6dc9357SAndroid Build Coastguard Worker {
2806*f6dc9357SAndroid Build Coastguard Worker curMem_Bytes = mu.GetBytes(_ramSize_Reduced);
2807*f6dc9357SAndroid Build Coastguard Worker needSetCur_Bytes = true;
2808*f6dc9357SAndroid Build Coastguard Worker }
2809*f6dc9357SAndroid Build Coastguard Worker }
2810*f6dc9357SAndroid Build Coastguard Worker }
2811*f6dc9357SAndroid Build Coastguard Worker }
2812*f6dc9357SAndroid Build Coastguard Worker
2813*f6dc9357SAndroid Build Coastguard Worker
2814*f6dc9357SAndroid Build Coastguard Worker // 80% - is auto usage limit in handlers
2815*f6dc9357SAndroid Build Coastguard Worker AddMemComboItem(80, true, true);
2816*f6dc9357SAndroid Build Coastguard Worker m_MemUse.SetCurSel(0);
2817*f6dc9357SAndroid Build Coastguard Worker
2818*f6dc9357SAndroid Build Coastguard Worker {
2819*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 10;; i += 10)
2820*f6dc9357SAndroid Build Coastguard Worker {
2821*f6dc9357SAndroid Build Coastguard Worker UInt64 size = i;
2822*f6dc9357SAndroid Build Coastguard Worker if (i > 100)
2823*f6dc9357SAndroid Build Coastguard Worker size = (UInt64)(Int64)-1;
2824*f6dc9357SAndroid Build Coastguard Worker if (needSetCur_Percents && size >= curMem_Percents)
2825*f6dc9357SAndroid Build Coastguard Worker {
2826*f6dc9357SAndroid Build Coastguard Worker const int index = AddMemComboItem(curMem_Percents, true);
2827*f6dc9357SAndroid Build Coastguard Worker m_MemUse.SetCurSel(index);
2828*f6dc9357SAndroid Build Coastguard Worker needSetCur_Percents = false;
2829*f6dc9357SAndroid Build Coastguard Worker if (size == curMem_Percents)
2830*f6dc9357SAndroid Build Coastguard Worker continue;
2831*f6dc9357SAndroid Build Coastguard Worker }
2832*f6dc9357SAndroid Build Coastguard Worker if (size == (UInt64)(Int64)-1)
2833*f6dc9357SAndroid Build Coastguard Worker break;
2834*f6dc9357SAndroid Build Coastguard Worker AddMemComboItem(size, true);
2835*f6dc9357SAndroid Build Coastguard Worker }
2836*f6dc9357SAndroid Build Coastguard Worker }
2837*f6dc9357SAndroid Build Coastguard Worker {
2838*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = (27) * 2;; i++)
2839*f6dc9357SAndroid Build Coastguard Worker {
2840*f6dc9357SAndroid Build Coastguard Worker UInt64 size = (UInt64)(2 + (i & 1)) << (i / 2);
2841*f6dc9357SAndroid Build Coastguard Worker if (i > (20 + sizeof(size_t) * 3 - 1) * 2)
2842*f6dc9357SAndroid Build Coastguard Worker size = (UInt64)(Int64)-1;
2843*f6dc9357SAndroid Build Coastguard Worker if (needSetCur_Bytes && size >= curMem_Bytes)
2844*f6dc9357SAndroid Build Coastguard Worker {
2845*f6dc9357SAndroid Build Coastguard Worker const int index = AddMemComboItem(curMem_Bytes);
2846*f6dc9357SAndroid Build Coastguard Worker m_MemUse.SetCurSel(index);
2847*f6dc9357SAndroid Build Coastguard Worker needSetCur_Bytes = false;
2848*f6dc9357SAndroid Build Coastguard Worker if (size == curMem_Bytes)
2849*f6dc9357SAndroid Build Coastguard Worker continue;
2850*f6dc9357SAndroid Build Coastguard Worker }
2851*f6dc9357SAndroid Build Coastguard Worker if (size == (UInt64)(Int64)-1)
2852*f6dc9357SAndroid Build Coastguard Worker break;
2853*f6dc9357SAndroid Build Coastguard Worker AddMemComboItem(size);
2854*f6dc9357SAndroid Build Coastguard Worker }
2855*f6dc9357SAndroid Build Coastguard Worker }
2856*f6dc9357SAndroid Build Coastguard Worker }
2857*f6dc9357SAndroid Build Coastguard Worker
2858*f6dc9357SAndroid Build Coastguard Worker
Get_MemUse_Spec()2859*f6dc9357SAndroid Build Coastguard Worker UString CCompressDialog::Get_MemUse_Spec()
2860*f6dc9357SAndroid Build Coastguard Worker {
2861*f6dc9357SAndroid Build Coastguard Worker if (m_MemUse.GetCount() < 1)
2862*f6dc9357SAndroid Build Coastguard Worker return UString();
2863*f6dc9357SAndroid Build Coastguard Worker return _memUse_Strings[(unsigned)m_MemUse.GetItemData_of_CurSel()];
2864*f6dc9357SAndroid Build Coastguard Worker }
2865*f6dc9357SAndroid Build Coastguard Worker
2866*f6dc9357SAndroid Build Coastguard Worker
Get_MemUse_Bytes()2867*f6dc9357SAndroid Build Coastguard Worker UInt64 CCompressDialog::Get_MemUse_Bytes()
2868*f6dc9357SAndroid Build Coastguard Worker {
2869*f6dc9357SAndroid Build Coastguard Worker const UString mus = Get_MemUse_Spec();
2870*f6dc9357SAndroid Build Coastguard Worker NCompression::CMemUse mu;
2871*f6dc9357SAndroid Build Coastguard Worker if (!mus.IsEmpty())
2872*f6dc9357SAndroid Build Coastguard Worker {
2873*f6dc9357SAndroid Build Coastguard Worker mu.Parse(mus);
2874*f6dc9357SAndroid Build Coastguard Worker if (mu.IsDefined)
2875*f6dc9357SAndroid Build Coastguard Worker return mu.GetBytes(_ramSize_Reduced);
2876*f6dc9357SAndroid Build Coastguard Worker }
2877*f6dc9357SAndroid Build Coastguard Worker return _ramUsage_Auto; // _ramSize_Reduced; // _ramSize;;
2878*f6dc9357SAndroid Build Coastguard Worker }
2879*f6dc9357SAndroid Build Coastguard Worker
2880*f6dc9357SAndroid Build Coastguard Worker
2881*f6dc9357SAndroid Build Coastguard Worker
GetMemoryUsage_DecompMem(UInt64 & decompressMemory)2882*f6dc9357SAndroid Build Coastguard Worker UInt64 CCompressDialog::GetMemoryUsage_DecompMem(UInt64 &decompressMemory)
2883*f6dc9357SAndroid Build Coastguard Worker {
2884*f6dc9357SAndroid Build Coastguard Worker return GetMemoryUsage_Dict_DecompMem(GetDict2(), decompressMemory);
2885*f6dc9357SAndroid Build Coastguard Worker }
2886*f6dc9357SAndroid Build Coastguard Worker
2887*f6dc9357SAndroid Build Coastguard Worker
2888*f6dc9357SAndroid Build Coastguard Worker /*
2889*f6dc9357SAndroid Build Coastguard Worker we could use that function to reduce the dictionary if small RAM
2890*f6dc9357SAndroid Build Coastguard Worker UInt64 CCompressDialog::GetMemoryUsageComp_Threads_Dict(UInt32 numThreads, UInt64 dict64)
2891*f6dc9357SAndroid Build Coastguard Worker {
2892*f6dc9357SAndroid Build Coastguard Worker UInt64 decompressMemory;
2893*f6dc9357SAndroid Build Coastguard Worker return GetMemoryUsage_Threads_Dict_DecompMem(numThreads, dict64, decompressMemory);
2894*f6dc9357SAndroid Build Coastguard Worker }
2895*f6dc9357SAndroid Build Coastguard Worker */
2896*f6dc9357SAndroid Build Coastguard Worker
2897*f6dc9357SAndroid Build Coastguard Worker
GetMemoryUsage_Dict_DecompMem(UInt64 dict64,UInt64 & decompressMemory)2898*f6dc9357SAndroid Build Coastguard Worker UInt64 CCompressDialog::GetMemoryUsage_Dict_DecompMem(UInt64 dict64, UInt64 &decompressMemory)
2899*f6dc9357SAndroid Build Coastguard Worker {
2900*f6dc9357SAndroid Build Coastguard Worker return GetMemoryUsage_Threads_Dict_DecompMem(GetNumThreads2(), dict64, decompressMemory);
2901*f6dc9357SAndroid Build Coastguard Worker }
2902*f6dc9357SAndroid Build Coastguard Worker
GetMemoryUsage_Threads_Dict_DecompMem(UInt32 numThreads,UInt64 dict64,UInt64 & decompressMemory)2903*f6dc9357SAndroid Build Coastguard Worker UInt64 CCompressDialog::GetMemoryUsage_Threads_Dict_DecompMem(UInt32 numThreads, UInt64 dict64, UInt64 &decompressMemory)
2904*f6dc9357SAndroid Build Coastguard Worker {
2905*f6dc9357SAndroid Build Coastguard Worker decompressMemory = (UInt64)(Int64)-1;
2906*f6dc9357SAndroid Build Coastguard Worker
2907*f6dc9357SAndroid Build Coastguard Worker const UInt32 level = GetLevel2();
2908*f6dc9357SAndroid Build Coastguard Worker if (level == 0 && !Get_ArcInfoEx().Is_Zstd())
2909*f6dc9357SAndroid Build Coastguard Worker {
2910*f6dc9357SAndroid Build Coastguard Worker decompressMemory = (1 << 20);
2911*f6dc9357SAndroid Build Coastguard Worker return decompressMemory;
2912*f6dc9357SAndroid Build Coastguard Worker }
2913*f6dc9357SAndroid Build Coastguard Worker UInt64 size = 0;
2914*f6dc9357SAndroid Build Coastguard Worker
2915*f6dc9357SAndroid Build Coastguard Worker const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];
2916*f6dc9357SAndroid Build Coastguard Worker if (fi.Filter_() && level >= 9)
2917*f6dc9357SAndroid Build Coastguard Worker size += (12 << 20) * 2 + (5 << 20);
2918*f6dc9357SAndroid Build Coastguard Worker // UInt32 numThreads = GetNumThreads2();
2919*f6dc9357SAndroid Build Coastguard Worker
2920*f6dc9357SAndroid Build Coastguard Worker UInt32 numMainZipThreads = 1;
2921*f6dc9357SAndroid Build Coastguard Worker
2922*f6dc9357SAndroid Build Coastguard Worker if (IsZipFormat())
2923*f6dc9357SAndroid Build Coastguard Worker {
2924*f6dc9357SAndroid Build Coastguard Worker UInt32 numSubThreads = 1;
2925*f6dc9357SAndroid Build Coastguard Worker if (GetMethodID() == kLZMA && numThreads > 1 && level >= 5)
2926*f6dc9357SAndroid Build Coastguard Worker numSubThreads = 2;
2927*f6dc9357SAndroid Build Coastguard Worker numMainZipThreads = numThreads / numSubThreads;
2928*f6dc9357SAndroid Build Coastguard Worker if (numMainZipThreads > 1)
2929*f6dc9357SAndroid Build Coastguard Worker size += (UInt64)numMainZipThreads * ((size_t)sizeof(size_t) << 23);
2930*f6dc9357SAndroid Build Coastguard Worker else
2931*f6dc9357SAndroid Build Coastguard Worker numMainZipThreads = 1;
2932*f6dc9357SAndroid Build Coastguard Worker }
2933*f6dc9357SAndroid Build Coastguard Worker
2934*f6dc9357SAndroid Build Coastguard Worker const int methodId = GetMethodID();
2935*f6dc9357SAndroid Build Coastguard Worker
2936*f6dc9357SAndroid Build Coastguard Worker if (dict64 == (UInt64)(Int64)-1
2937*f6dc9357SAndroid Build Coastguard Worker // && methodId != kZSTD
2938*f6dc9357SAndroid Build Coastguard Worker )
2939*f6dc9357SAndroid Build Coastguard Worker return (UInt64)(Int64)-1;
2940*f6dc9357SAndroid Build Coastguard Worker
2941*f6dc9357SAndroid Build Coastguard Worker
2942*f6dc9357SAndroid Build Coastguard Worker switch (methodId)
2943*f6dc9357SAndroid Build Coastguard Worker {
2944*f6dc9357SAndroid Build Coastguard Worker case kLZMA:
2945*f6dc9357SAndroid Build Coastguard Worker case kLZMA2:
2946*f6dc9357SAndroid Build Coastguard Worker {
2947*f6dc9357SAndroid Build Coastguard Worker const UInt32 dict = (dict64 >= kLzmaMaxDictSize ? kLzmaMaxDictSize : (UInt32)dict64);
2948*f6dc9357SAndroid Build Coastguard Worker UInt32 hs = dict - 1;
2949*f6dc9357SAndroid Build Coastguard Worker hs |= (hs >> 1);
2950*f6dc9357SAndroid Build Coastguard Worker hs |= (hs >> 2);
2951*f6dc9357SAndroid Build Coastguard Worker hs |= (hs >> 4);
2952*f6dc9357SAndroid Build Coastguard Worker hs |= (hs >> 8);
2953*f6dc9357SAndroid Build Coastguard Worker hs >>= 1;
2954*f6dc9357SAndroid Build Coastguard Worker if (hs >= (1 << 24))
2955*f6dc9357SAndroid Build Coastguard Worker hs >>= 1;
2956*f6dc9357SAndroid Build Coastguard Worker hs |= (1 << 16) - 1;
2957*f6dc9357SAndroid Build Coastguard Worker // if (numHashBytes >= 5)
2958*f6dc9357SAndroid Build Coastguard Worker if (level < 5)
2959*f6dc9357SAndroid Build Coastguard Worker hs |= (256 << 10) - 1;
2960*f6dc9357SAndroid Build Coastguard Worker hs++;
2961*f6dc9357SAndroid Build Coastguard Worker UInt64 size1 = (UInt64)hs * 4;
2962*f6dc9357SAndroid Build Coastguard Worker size1 += (UInt64)dict * 4;
2963*f6dc9357SAndroid Build Coastguard Worker if (level >= 5)
2964*f6dc9357SAndroid Build Coastguard Worker size1 += (UInt64)dict * 4;
2965*f6dc9357SAndroid Build Coastguard Worker size1 += (2 << 20);
2966*f6dc9357SAndroid Build Coastguard Worker
2967*f6dc9357SAndroid Build Coastguard Worker UInt32 numThreads1 = 1;
2968*f6dc9357SAndroid Build Coastguard Worker if (numThreads > 1 && level >= 5)
2969*f6dc9357SAndroid Build Coastguard Worker {
2970*f6dc9357SAndroid Build Coastguard Worker size1 += (2 << 20) + (4 << 20);
2971*f6dc9357SAndroid Build Coastguard Worker numThreads1 = 2;
2972*f6dc9357SAndroid Build Coastguard Worker }
2973*f6dc9357SAndroid Build Coastguard Worker
2974*f6dc9357SAndroid Build Coastguard Worker UInt32 numBlockThreads = numThreads / numThreads1;
2975*f6dc9357SAndroid Build Coastguard Worker
2976*f6dc9357SAndroid Build Coastguard Worker UInt64 chunkSize = 0; // it's solid chunk
2977*f6dc9357SAndroid Build Coastguard Worker
2978*f6dc9357SAndroid Build Coastguard Worker if (methodId != kLZMA && numBlockThreads != 1)
2979*f6dc9357SAndroid Build Coastguard Worker {
2980*f6dc9357SAndroid Build Coastguard Worker chunkSize = Get_Lzma2_ChunkSize(dict);
2981*f6dc9357SAndroid Build Coastguard Worker
2982*f6dc9357SAndroid Build Coastguard Worker if (IsXzFormat())
2983*f6dc9357SAndroid Build Coastguard Worker {
2984*f6dc9357SAndroid Build Coastguard Worker UInt32 blockSizeLog = GetBlockSizeSpec();
2985*f6dc9357SAndroid Build Coastguard Worker if (blockSizeLog != (UInt32)(Int32)-1)
2986*f6dc9357SAndroid Build Coastguard Worker {
2987*f6dc9357SAndroid Build Coastguard Worker if (blockSizeLog == kSolidLog_FullSolid)
2988*f6dc9357SAndroid Build Coastguard Worker {
2989*f6dc9357SAndroid Build Coastguard Worker numBlockThreads = 1;
2990*f6dc9357SAndroid Build Coastguard Worker chunkSize = 0;
2991*f6dc9357SAndroid Build Coastguard Worker }
2992*f6dc9357SAndroid Build Coastguard Worker else if (blockSizeLog != kSolidLog_NoSolid)
2993*f6dc9357SAndroid Build Coastguard Worker chunkSize = (UInt64)1 << blockSizeLog;
2994*f6dc9357SAndroid Build Coastguard Worker }
2995*f6dc9357SAndroid Build Coastguard Worker }
2996*f6dc9357SAndroid Build Coastguard Worker }
2997*f6dc9357SAndroid Build Coastguard Worker
2998*f6dc9357SAndroid Build Coastguard Worker if (chunkSize == 0)
2999*f6dc9357SAndroid Build Coastguard Worker {
3000*f6dc9357SAndroid Build Coastguard Worker const UInt32 kBlockSizeMax = (UInt32)0 - (UInt32)(1 << 16);
3001*f6dc9357SAndroid Build Coastguard Worker UInt64 blockSize = (UInt64)dict + (1 << 16)
3002*f6dc9357SAndroid Build Coastguard Worker + (numThreads1 > 1 ? (1 << 20) : 0);
3003*f6dc9357SAndroid Build Coastguard Worker blockSize += (blockSize >> (blockSize < ((UInt32)1 << 30) ? 1 : 2));
3004*f6dc9357SAndroid Build Coastguard Worker if (blockSize >= kBlockSizeMax)
3005*f6dc9357SAndroid Build Coastguard Worker blockSize = kBlockSizeMax;
3006*f6dc9357SAndroid Build Coastguard Worker size += numBlockThreads * (size1 + blockSize);
3007*f6dc9357SAndroid Build Coastguard Worker }
3008*f6dc9357SAndroid Build Coastguard Worker else
3009*f6dc9357SAndroid Build Coastguard Worker {
3010*f6dc9357SAndroid Build Coastguard Worker size += numBlockThreads * (size1 + chunkSize);
3011*f6dc9357SAndroid Build Coastguard Worker UInt32 numPackChunks = numBlockThreads + (numBlockThreads / 8) + 1;
3012*f6dc9357SAndroid Build Coastguard Worker if (chunkSize < ((UInt32)1 << 26)) numBlockThreads++;
3013*f6dc9357SAndroid Build Coastguard Worker if (chunkSize < ((UInt32)1 << 24)) numBlockThreads++;
3014*f6dc9357SAndroid Build Coastguard Worker if (chunkSize < ((UInt32)1 << 22)) numBlockThreads++;
3015*f6dc9357SAndroid Build Coastguard Worker size += numPackChunks * chunkSize;
3016*f6dc9357SAndroid Build Coastguard Worker }
3017*f6dc9357SAndroid Build Coastguard Worker
3018*f6dc9357SAndroid Build Coastguard Worker decompressMemory = dict + (2 << 20);
3019*f6dc9357SAndroid Build Coastguard Worker return size;
3020*f6dc9357SAndroid Build Coastguard Worker }
3021*f6dc9357SAndroid Build Coastguard Worker
3022*f6dc9357SAndroid Build Coastguard Worker /*
3023*f6dc9357SAndroid Build Coastguard Worker case kZSTD:
3024*f6dc9357SAndroid Build Coastguard Worker {
3025*f6dc9357SAndroid Build Coastguard Worker CZstdEncProps props;
3026*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_Init(&props);
3027*f6dc9357SAndroid Build Coastguard Worker // props.level_zstd = level;
3028*f6dc9357SAndroid Build Coastguard Worker props.level_7z = level;
3029*f6dc9357SAndroid Build Coastguard Worker props.nbWorkers = numThreads;
3030*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_SetDictProps_From_CompressDialog(&props, *this);
3031*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_NormalizeFull(&props);
3032*f6dc9357SAndroid Build Coastguard Worker size = ZstdEncProps_GetMemUsage(&props);
3033*f6dc9357SAndroid Build Coastguard Worker decompressMemory = (UInt64)1 << props.windowLog;
3034*f6dc9357SAndroid Build Coastguard Worker return size;
3035*f6dc9357SAndroid Build Coastguard Worker }
3036*f6dc9357SAndroid Build Coastguard Worker */
3037*f6dc9357SAndroid Build Coastguard Worker
3038*f6dc9357SAndroid Build Coastguard Worker case kPPMd:
3039*f6dc9357SAndroid Build Coastguard Worker {
3040*f6dc9357SAndroid Build Coastguard Worker decompressMemory = dict64 + (2 << 20);
3041*f6dc9357SAndroid Build Coastguard Worker return size + decompressMemory;
3042*f6dc9357SAndroid Build Coastguard Worker }
3043*f6dc9357SAndroid Build Coastguard Worker
3044*f6dc9357SAndroid Build Coastguard Worker case kDeflate:
3045*f6dc9357SAndroid Build Coastguard Worker case kDeflate64:
3046*f6dc9357SAndroid Build Coastguard Worker {
3047*f6dc9357SAndroid Build Coastguard Worker UInt64 size1 = 3 << 20;
3048*f6dc9357SAndroid Build Coastguard Worker // if (level >= 7)
3049*f6dc9357SAndroid Build Coastguard Worker size1 += (1 << 20);
3050*f6dc9357SAndroid Build Coastguard Worker size += size1 * numMainZipThreads;
3051*f6dc9357SAndroid Build Coastguard Worker decompressMemory = (2 << 20);
3052*f6dc9357SAndroid Build Coastguard Worker return size;
3053*f6dc9357SAndroid Build Coastguard Worker }
3054*f6dc9357SAndroid Build Coastguard Worker
3055*f6dc9357SAndroid Build Coastguard Worker case kBZip2:
3056*f6dc9357SAndroid Build Coastguard Worker {
3057*f6dc9357SAndroid Build Coastguard Worker decompressMemory = (7 << 20);
3058*f6dc9357SAndroid Build Coastguard Worker UInt64 memForOneThread = (10 << 20);
3059*f6dc9357SAndroid Build Coastguard Worker return size + memForOneThread * numThreads;
3060*f6dc9357SAndroid Build Coastguard Worker }
3061*f6dc9357SAndroid Build Coastguard Worker
3062*f6dc9357SAndroid Build Coastguard Worker case kPPMdZip:
3063*f6dc9357SAndroid Build Coastguard Worker {
3064*f6dc9357SAndroid Build Coastguard Worker decompressMemory = dict64 + (2 << 20);
3065*f6dc9357SAndroid Build Coastguard Worker return size + (UInt64)decompressMemory * numThreads;
3066*f6dc9357SAndroid Build Coastguard Worker }
3067*f6dc9357SAndroid Build Coastguard Worker }
3068*f6dc9357SAndroid Build Coastguard Worker
3069*f6dc9357SAndroid Build Coastguard Worker return (UInt64)(Int64)-1;
3070*f6dc9357SAndroid Build Coastguard Worker }
3071*f6dc9357SAndroid Build Coastguard Worker
3072*f6dc9357SAndroid Build Coastguard Worker
3073*f6dc9357SAndroid Build Coastguard Worker
AddMemUsage(UString & s,UInt64 v)3074*f6dc9357SAndroid Build Coastguard Worker static void AddMemUsage(UString &s, UInt64 v)
3075*f6dc9357SAndroid Build Coastguard Worker {
3076*f6dc9357SAndroid Build Coastguard Worker const char *post;
3077*f6dc9357SAndroid Build Coastguard Worker if (v <= ((UInt64)16 << 30))
3078*f6dc9357SAndroid Build Coastguard Worker {
3079*f6dc9357SAndroid Build Coastguard Worker v = (v + (1 << 20) - 1) >> 20;
3080*f6dc9357SAndroid Build Coastguard Worker post = "MB";
3081*f6dc9357SAndroid Build Coastguard Worker }
3082*f6dc9357SAndroid Build Coastguard Worker else if (v <= ((UInt64)64 << 40))
3083*f6dc9357SAndroid Build Coastguard Worker {
3084*f6dc9357SAndroid Build Coastguard Worker v = (v + (1 << 30) - 1) >> 30;
3085*f6dc9357SAndroid Build Coastguard Worker post = "GB";
3086*f6dc9357SAndroid Build Coastguard Worker }
3087*f6dc9357SAndroid Build Coastguard Worker else
3088*f6dc9357SAndroid Build Coastguard Worker {
3089*f6dc9357SAndroid Build Coastguard Worker const UInt64 v2 = v + ((UInt64)1 << 40) - 1;
3090*f6dc9357SAndroid Build Coastguard Worker if (v <= v2)
3091*f6dc9357SAndroid Build Coastguard Worker v = v2;
3092*f6dc9357SAndroid Build Coastguard Worker v >>= 40;
3093*f6dc9357SAndroid Build Coastguard Worker post = "TB";
3094*f6dc9357SAndroid Build Coastguard Worker }
3095*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt64(v);
3096*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
3097*f6dc9357SAndroid Build Coastguard Worker s += post;
3098*f6dc9357SAndroid Build Coastguard Worker }
3099*f6dc9357SAndroid Build Coastguard Worker
3100*f6dc9357SAndroid Build Coastguard Worker
PrintMemUsage(UINT res,UInt64 value)3101*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::PrintMemUsage(UINT res, UInt64 value)
3102*f6dc9357SAndroid Build Coastguard Worker {
3103*f6dc9357SAndroid Build Coastguard Worker if (value == (UInt64)(Int64)-1)
3104*f6dc9357SAndroid Build Coastguard Worker {
3105*f6dc9357SAndroid Build Coastguard Worker SetItemText(res, TEXT("?"));
3106*f6dc9357SAndroid Build Coastguard Worker return;
3107*f6dc9357SAndroid Build Coastguard Worker }
3108*f6dc9357SAndroid Build Coastguard Worker UString s;
3109*f6dc9357SAndroid Build Coastguard Worker AddMemUsage(s, value);
3110*f6dc9357SAndroid Build Coastguard Worker if (res == IDT_COMPRESS_MEMORY_VALUE)
3111*f6dc9357SAndroid Build Coastguard Worker {
3112*f6dc9357SAndroid Build Coastguard Worker const UString mus = Get_MemUse_Spec();
3113*f6dc9357SAndroid Build Coastguard Worker NCompression::CMemUse mu;
3114*f6dc9357SAndroid Build Coastguard Worker if (!mus.IsEmpty())
3115*f6dc9357SAndroid Build Coastguard Worker mu.Parse(mus);
3116*f6dc9357SAndroid Build Coastguard Worker if (mu.IsDefined)
3117*f6dc9357SAndroid Build Coastguard Worker {
3118*f6dc9357SAndroid Build Coastguard Worker s += " / ";
3119*f6dc9357SAndroid Build Coastguard Worker AddMemUsage(s, mu.GetBytes(_ramSize_Reduced));
3120*f6dc9357SAndroid Build Coastguard Worker }
3121*f6dc9357SAndroid Build Coastguard Worker else if (_ramSize_Defined)
3122*f6dc9357SAndroid Build Coastguard Worker {
3123*f6dc9357SAndroid Build Coastguard Worker s += " / ";
3124*f6dc9357SAndroid Build Coastguard Worker AddMemUsage(s, _ramUsage_Auto);
3125*f6dc9357SAndroid Build Coastguard Worker }
3126*f6dc9357SAndroid Build Coastguard Worker
3127*f6dc9357SAndroid Build Coastguard Worker if (_ramSize_Defined)
3128*f6dc9357SAndroid Build Coastguard Worker {
3129*f6dc9357SAndroid Build Coastguard Worker s += " / ";
3130*f6dc9357SAndroid Build Coastguard Worker AddMemUsage(s, _ramSize);
3131*f6dc9357SAndroid Build Coastguard Worker }
3132*f6dc9357SAndroid Build Coastguard Worker }
3133*f6dc9357SAndroid Build Coastguard Worker SetItemText(res, s);
3134*f6dc9357SAndroid Build Coastguard Worker }
3135*f6dc9357SAndroid Build Coastguard Worker
3136*f6dc9357SAndroid Build Coastguard Worker
SetMemoryUsage()3137*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetMemoryUsage()
3138*f6dc9357SAndroid Build Coastguard Worker {
3139*f6dc9357SAndroid Build Coastguard Worker UInt64 decompressMem;
3140*f6dc9357SAndroid Build Coastguard Worker const UInt64 memUsage = GetMemoryUsage_DecompMem(decompressMem);
3141*f6dc9357SAndroid Build Coastguard Worker PrintMemUsage(IDT_COMPRESS_MEMORY_VALUE, memUsage);
3142*f6dc9357SAndroid Build Coastguard Worker PrintMemUsage(IDT_COMPRESS_MEMORY_DE_VALUE, decompressMem);
3143*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_PARAMS
3144*f6dc9357SAndroid Build Coastguard Worker Print_Params();
3145*f6dc9357SAndroid Build Coastguard Worker #endif
3146*f6dc9357SAndroid Build Coastguard Worker }
3147*f6dc9357SAndroid Build Coastguard Worker
3148*f6dc9357SAndroid Build Coastguard Worker
3149*f6dc9357SAndroid Build Coastguard Worker
3150*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_PARAMS
3151*f6dc9357SAndroid Build Coastguard Worker
3152*f6dc9357SAndroid Build Coastguard Worker static const char kPropDelimeter = ' '; // ':'
3153*f6dc9357SAndroid Build Coastguard Worker
AddPropName(AString & s,const char * name)3154*f6dc9357SAndroid Build Coastguard Worker static void AddPropName(AString &s, const char *name)
3155*f6dc9357SAndroid Build Coastguard Worker {
3156*f6dc9357SAndroid Build Coastguard Worker if (!s.IsEmpty())
3157*f6dc9357SAndroid Build Coastguard Worker s += kPropDelimeter;
3158*f6dc9357SAndroid Build Coastguard Worker s += name;
3159*f6dc9357SAndroid Build Coastguard Worker }
3160*f6dc9357SAndroid Build Coastguard Worker
AddProp(AString & s,const char * name,unsigned v)3161*f6dc9357SAndroid Build Coastguard Worker static void AddProp(AString &s, const char *name, unsigned v)
3162*f6dc9357SAndroid Build Coastguard Worker {
3163*f6dc9357SAndroid Build Coastguard Worker AddPropName(s, name);
3164*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32(v);
3165*f6dc9357SAndroid Build Coastguard Worker }
3166*f6dc9357SAndroid Build Coastguard Worker
AddProp_switch(AString & s,const char * name,E_ZSTD_paramSwitch_e e)3167*f6dc9357SAndroid Build Coastguard Worker static void AddProp_switch(AString &s, const char *name, E_ZSTD_paramSwitch_e e)
3168*f6dc9357SAndroid Build Coastguard Worker {
3169*f6dc9357SAndroid Build Coastguard Worker AddPropName(s, name);
3170*f6dc9357SAndroid Build Coastguard Worker s += e == k_ZSTD_ps_enable ? "" : "-";
3171*f6dc9357SAndroid Build Coastguard Worker }
3172*f6dc9357SAndroid Build Coastguard Worker
PrintPropAsLog(AString & s,const char * name,size_t v)3173*f6dc9357SAndroid Build Coastguard Worker static void PrintPropAsLog(AString &s, const char *name, size_t v)
3174*f6dc9357SAndroid Build Coastguard Worker {
3175*f6dc9357SAndroid Build Coastguard Worker AddPropName(s, name);
3176*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < sizeof(size_t) * 8; i++)
3177*f6dc9357SAndroid Build Coastguard Worker {
3178*f6dc9357SAndroid Build Coastguard Worker if (((size_t)1 << i) == v)
3179*f6dc9357SAndroid Build Coastguard Worker {
3180*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32(i);
3181*f6dc9357SAndroid Build Coastguard Worker return;
3182*f6dc9357SAndroid Build Coastguard Worker }
3183*f6dc9357SAndroid Build Coastguard Worker }
3184*f6dc9357SAndroid Build Coastguard Worker char c = 'b';
3185*f6dc9357SAndroid Build Coastguard Worker if ((v & 0x3FFFFFFF) == 0) { v >>= 30; c = 'G'; }
3186*f6dc9357SAndroid Build Coastguard Worker else if ((v & 0xFFFFF) == 0) { v >>= 20; c = 'M'; }
3187*f6dc9357SAndroid Build Coastguard Worker else if ((v & 0x3FF) == 0) { v >>= 10; c = 'K'; }
3188*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt64(v);
3189*f6dc9357SAndroid Build Coastguard Worker s += c;
3190*f6dc9357SAndroid Build Coastguard Worker }
3191*f6dc9357SAndroid Build Coastguard Worker
ZstdEncProps_Print(CZstdEncProps * props,AString & s)3192*f6dc9357SAndroid Build Coastguard Worker static void ZstdEncProps_Print(CZstdEncProps *props, AString &s)
3193*f6dc9357SAndroid Build Coastguard Worker {
3194*f6dc9357SAndroid Build Coastguard Worker if (props->level_zstd >= 0)
3195*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "zx", props->level_zstd);
3196*f6dc9357SAndroid Build Coastguard Worker else
3197*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "zf", -(props->level_zstd));
3198*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "a", props->strategy);
3199*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "d", props->windowLog);
3200*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "zclog", props->chainLog);
3201*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "zhb", props->hashLog);
3202*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "mml", props->minMatch);
3203*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "mcb", props->searchLog);
3204*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "fb", props->targetLength);
3205*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "mt", props->nbWorkers);
3206*f6dc9357SAndroid Build Coastguard Worker PrintPropAsLog(s, "c", props->jobSize);
3207*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "zov", props->overlapLog);
3208*f6dc9357SAndroid Build Coastguard Worker PrintPropAsLog(s, "ztps", props->targetPrefixSize);
3209*f6dc9357SAndroid Build Coastguard Worker AddProp_switch(s, "zmfr", props->useRowMatchFinder);
3210*f6dc9357SAndroid Build Coastguard Worker if (props->ldmParams.enableLdm == k_ZSTD_ps_enable)
3211*f6dc9357SAndroid Build Coastguard Worker {
3212*f6dc9357SAndroid Build Coastguard Worker AddProp_switch(s, "zle", props->ldmParams.enableLdm);
3213*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "zlhb", props->ldmParams.hashLog);
3214*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "zlbb", props->ldmParams.bucketSizeLog);
3215*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "zlmml", props->ldmParams.minMatchLength);
3216*f6dc9357SAndroid Build Coastguard Worker AddProp(s, "zlhrb", props->ldmParams.hashRateLog);
3217*f6dc9357SAndroid Build Coastguard Worker }
3218*f6dc9357SAndroid Build Coastguard Worker }
3219*f6dc9357SAndroid Build Coastguard Worker
Print_Params()3220*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::Print_Params()
3221*f6dc9357SAndroid Build Coastguard Worker {
3222*f6dc9357SAndroid Build Coastguard Worker {
3223*f6dc9357SAndroid Build Coastguard Worker CZstdEncProps props;
3224*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_Init(&props);
3225*f6dc9357SAndroid Build Coastguard Worker // props.level_zstd = level;
3226*f6dc9357SAndroid Build Coastguard Worker props.level_7z = GetLevel2();
3227*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_SetDictProps_From_CompressDialog(&props, *this);
3228*f6dc9357SAndroid Build Coastguard Worker {
3229*f6dc9357SAndroid Build Coastguard Worker UInt32 order = GetOrderSpec();
3230*f6dc9357SAndroid Build Coastguard Worker if (order != (UInt32)(Int32)-1)
3231*f6dc9357SAndroid Build Coastguard Worker props.targetLength = GetOrderSpec();
3232*f6dc9357SAndroid Build Coastguard Worker }
3233*f6dc9357SAndroid Build Coastguard Worker props.nbWorkers = GetNumThreads2();
3234*f6dc9357SAndroid Build Coastguard Worker // props.windowLog = 18; // for debug
3235*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_NormalizeFull(&props);
3236*f6dc9357SAndroid Build Coastguard Worker AString s;
3237*f6dc9357SAndroid Build Coastguard Worker ZstdEncProps_Print(&props, s);
3238*f6dc9357SAndroid Build Coastguard Worker SetItemTextA(IDT_COMPRESS_PARAMS_INFO, s);
3239*f6dc9357SAndroid Build Coastguard Worker }
3240*f6dc9357SAndroid Build Coastguard Worker }
3241*f6dc9357SAndroid Build Coastguard Worker
3242*f6dc9357SAndroid Build Coastguard Worker #endif // PRINT_PARAMS
3243*f6dc9357SAndroid Build Coastguard Worker
3244*f6dc9357SAndroid Build Coastguard Worker
3245*f6dc9357SAndroid Build Coastguard Worker
SetParams()3246*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SetParams()
3247*f6dc9357SAndroid Build Coastguard Worker {
3248*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = Get_ArcInfoEx();
3249*f6dc9357SAndroid Build Coastguard Worker m_Params.SetText(TEXT(""));
3250*f6dc9357SAndroid Build Coastguard Worker const int index = FindRegistryFormat(ai.Name);
3251*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
3252*f6dc9357SAndroid Build Coastguard Worker {
3253*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index];
3254*f6dc9357SAndroid Build Coastguard Worker m_Params.SetText(fo.Options);
3255*f6dc9357SAndroid Build Coastguard Worker }
3256*f6dc9357SAndroid Build Coastguard Worker }
3257*f6dc9357SAndroid Build Coastguard Worker
SaveOptionsInMem()3258*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::SaveOptionsInMem()
3259*f6dc9357SAndroid Build Coastguard Worker {
3260*f6dc9357SAndroid Build Coastguard Worker /* these options are for (Info.FormatIndex).
3261*f6dc9357SAndroid Build Coastguard Worker If it's called just after format changing,
3262*f6dc9357SAndroid Build Coastguard Worker then it's format that was selected before format changing
3263*f6dc9357SAndroid Build Coastguard Worker So we store previous format properties */
3264*f6dc9357SAndroid Build Coastguard Worker
3265*f6dc9357SAndroid Build Coastguard Worker m_Params.GetText(Info.Options);
3266*f6dc9357SAndroid Build Coastguard Worker Info.Options.Trim();
3267*f6dc9357SAndroid Build Coastguard Worker
3268*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = (*ArcFormats)[Info.FormatIndex];
3269*f6dc9357SAndroid Build Coastguard Worker const unsigned index = FindRegistryFormat_Always(ai.Name);
3270*f6dc9357SAndroid Build Coastguard Worker NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index];
3271*f6dc9357SAndroid Build Coastguard Worker fo.Options = Info.Options;
3272*f6dc9357SAndroid Build Coastguard Worker fo.Level = GetLevelSpec();
3273*f6dc9357SAndroid Build Coastguard Worker {
3274*f6dc9357SAndroid Build Coastguard Worker const UInt64 dict64 = GetDictSpec();
3275*f6dc9357SAndroid Build Coastguard Worker UInt32 dict32;
3276*f6dc9357SAndroid Build Coastguard Worker if (dict64 == (UInt64)(Int64)-1)
3277*f6dc9357SAndroid Build Coastguard Worker dict32 = (UInt32)(Int32)-1;
3278*f6dc9357SAndroid Build Coastguard Worker else
3279*f6dc9357SAndroid Build Coastguard Worker {
3280*f6dc9357SAndroid Build Coastguard Worker dict32 = (UInt32)dict64;
3281*f6dc9357SAndroid Build Coastguard Worker if (dict64 != dict32)
3282*f6dc9357SAndroid Build Coastguard Worker {
3283*f6dc9357SAndroid Build Coastguard Worker /* here we must write 32-bit value for registry that indicates big_value
3284*f6dc9357SAndroid Build Coastguard Worker (UInt32)(Int32)-1 : is used as marker for default size
3285*f6dc9357SAndroid Build Coastguard Worker (UInt32)(Int32)-2 : it can be used to indicate big value (4 GiB)
3286*f6dc9357SAndroid Build Coastguard Worker the value must be larger than threshold
3287*f6dc9357SAndroid Build Coastguard Worker */
3288*f6dc9357SAndroid Build Coastguard Worker dict32 = (UInt32)(Int32)-2;
3289*f6dc9357SAndroid Build Coastguard Worker // dict32 = kLzmaMaxDictSize; // it must be larger than threshold
3290*f6dc9357SAndroid Build Coastguard Worker }
3291*f6dc9357SAndroid Build Coastguard Worker }
3292*f6dc9357SAndroid Build Coastguard Worker fo.Dictionary = dict32;
3293*f6dc9357SAndroid Build Coastguard Worker }
3294*f6dc9357SAndroid Build Coastguard Worker /*
3295*f6dc9357SAndroid Build Coastguard Worker {
3296*f6dc9357SAndroid Build Coastguard Worker const UInt64 dict64 = GetDictChainSpec();
3297*f6dc9357SAndroid Build Coastguard Worker UInt32 dict32;
3298*f6dc9357SAndroid Build Coastguard Worker if (dict64 == (UInt64)(Int64)-1)
3299*f6dc9357SAndroid Build Coastguard Worker dict32 = (UInt32)(Int32)-1;
3300*f6dc9357SAndroid Build Coastguard Worker else
3301*f6dc9357SAndroid Build Coastguard Worker {
3302*f6dc9357SAndroid Build Coastguard Worker dict32 = (UInt32)dict64;
3303*f6dc9357SAndroid Build Coastguard Worker if (dict64 != dict32)
3304*f6dc9357SAndroid Build Coastguard Worker {
3305*f6dc9357SAndroid Build Coastguard Worker dict32 = (UInt32)(Int32)-2;
3306*f6dc9357SAndroid Build Coastguard Worker // dict32 = k_Zstd_MAX_DictSize; // it must be larger than threshold
3307*f6dc9357SAndroid Build Coastguard Worker }
3308*f6dc9357SAndroid Build Coastguard Worker }
3309*f6dc9357SAndroid Build Coastguard Worker fo.DictionaryChain = dict32;
3310*f6dc9357SAndroid Build Coastguard Worker }
3311*f6dc9357SAndroid Build Coastguard Worker */
3312*f6dc9357SAndroid Build Coastguard Worker
3313*f6dc9357SAndroid Build Coastguard Worker fo.Order = GetOrderSpec();
3314*f6dc9357SAndroid Build Coastguard Worker fo.Method = GetMethodSpec();
3315*f6dc9357SAndroid Build Coastguard Worker fo.EncryptionMethod = GetEncryptionMethodSpec();
3316*f6dc9357SAndroid Build Coastguard Worker fo.NumThreads = GetNumThreadsSpec();
3317*f6dc9357SAndroid Build Coastguard Worker fo.BlockLogSize = GetBlockSizeSpec();
3318*f6dc9357SAndroid Build Coastguard Worker fo.MemUse = Get_MemUse_Spec();
3319*f6dc9357SAndroid Build Coastguard Worker }
3320*f6dc9357SAndroid Build Coastguard Worker
3321*f6dc9357SAndroid Build Coastguard Worker
GetFormatIndex()3322*f6dc9357SAndroid Build Coastguard Worker unsigned CCompressDialog::GetFormatIndex()
3323*f6dc9357SAndroid Build Coastguard Worker {
3324*f6dc9357SAndroid Build Coastguard Worker return (unsigned)m_Format.GetItemData_of_CurSel();
3325*f6dc9357SAndroid Build Coastguard Worker }
3326*f6dc9357SAndroid Build Coastguard Worker
3327*f6dc9357SAndroid Build Coastguard Worker
3328*f6dc9357SAndroid Build Coastguard Worker
AddText_from_BoolPair(AString & s,const char * name,const CBoolPair & bp)3329*f6dc9357SAndroid Build Coastguard Worker static void AddText_from_BoolPair(AString &s, const char *name, const CBoolPair &bp)
3330*f6dc9357SAndroid Build Coastguard Worker {
3331*f6dc9357SAndroid Build Coastguard Worker if (bp.Def)
3332*f6dc9357SAndroid Build Coastguard Worker {
3333*f6dc9357SAndroid Build Coastguard Worker s.Add_OptSpaced(name);
3334*f6dc9357SAndroid Build Coastguard Worker if (!bp.Val)
3335*f6dc9357SAndroid Build Coastguard Worker s += "-";
3336*f6dc9357SAndroid Build Coastguard Worker }
3337*f6dc9357SAndroid Build Coastguard Worker /*
3338*f6dc9357SAndroid Build Coastguard Worker else if (bp.Val)
3339*f6dc9357SAndroid Build Coastguard Worker {
3340*f6dc9357SAndroid Build Coastguard Worker s.Add_OptSpaced("[");
3341*f6dc9357SAndroid Build Coastguard Worker s += name;
3342*f6dc9357SAndroid Build Coastguard Worker s += "]";
3343*f6dc9357SAndroid Build Coastguard Worker }
3344*f6dc9357SAndroid Build Coastguard Worker */
3345*f6dc9357SAndroid Build Coastguard Worker }
3346*f6dc9357SAndroid Build Coastguard Worker
3347*f6dc9357SAndroid Build Coastguard Worker
AddText_from_Bool1(AString & s,const char * name,const CBool1 & b)3348*f6dc9357SAndroid Build Coastguard Worker static void AddText_from_Bool1(AString &s, const char *name, const CBool1 &b)
3349*f6dc9357SAndroid Build Coastguard Worker {
3350*f6dc9357SAndroid Build Coastguard Worker if (b.Supported && b.Val)
3351*f6dc9357SAndroid Build Coastguard Worker s.Add_OptSpaced(name);
3352*f6dc9357SAndroid Build Coastguard Worker }
3353*f6dc9357SAndroid Build Coastguard Worker
3354*f6dc9357SAndroid Build Coastguard Worker
ShowOptionsString()3355*f6dc9357SAndroid Build Coastguard Worker void CCompressDialog::ShowOptionsString()
3356*f6dc9357SAndroid Build Coastguard Worker {
3357*f6dc9357SAndroid Build Coastguard Worker NCompression::CFormatOptions &fo = Get_FormatOptions();
3358*f6dc9357SAndroid Build Coastguard Worker
3359*f6dc9357SAndroid Build Coastguard Worker AString s;
3360*f6dc9357SAndroid Build Coastguard Worker if (fo.IsSet_TimePrec())
3361*f6dc9357SAndroid Build Coastguard Worker {
3362*f6dc9357SAndroid Build Coastguard Worker s.Add_OptSpaced("tp");
3363*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32(fo.TimePrec);
3364*f6dc9357SAndroid Build Coastguard Worker }
3365*f6dc9357SAndroid Build Coastguard Worker AddText_from_BoolPair(s, "tm", fo.MTime);
3366*f6dc9357SAndroid Build Coastguard Worker AddText_from_BoolPair(s, "tc", fo.CTime);
3367*f6dc9357SAndroid Build Coastguard Worker AddText_from_BoolPair(s, "ta", fo.ATime);
3368*f6dc9357SAndroid Build Coastguard Worker AddText_from_BoolPair(s, "-stl", fo.SetArcMTime);
3369*f6dc9357SAndroid Build Coastguard Worker
3370*f6dc9357SAndroid Build Coastguard Worker // const CArcInfoEx &ai = Get_ArcInfoEx();
3371*f6dc9357SAndroid Build Coastguard Worker AddText_from_Bool1(s, "SL", SymLinks);
3372*f6dc9357SAndroid Build Coastguard Worker AddText_from_Bool1(s, "HL", HardLinks);
3373*f6dc9357SAndroid Build Coastguard Worker AddText_from_Bool1(s, "AS", AltStreams);
3374*f6dc9357SAndroid Build Coastguard Worker AddText_from_Bool1(s, "Sec", NtSecurity);
3375*f6dc9357SAndroid Build Coastguard Worker
3376*f6dc9357SAndroid Build Coastguard Worker // AddText_from_Bool1(s, "Preserve", PreserveATime);
3377*f6dc9357SAndroid Build Coastguard Worker
3378*f6dc9357SAndroid Build Coastguard Worker SetItemText(IDT_COMPRESS_OPTIONS, GetUnicodeString(s));
3379*f6dc9357SAndroid Build Coastguard Worker }
3380*f6dc9357SAndroid Build Coastguard Worker
3381*f6dc9357SAndroid Build Coastguard Worker
3382*f6dc9357SAndroid Build Coastguard Worker
3383*f6dc9357SAndroid Build Coastguard Worker
3384*f6dc9357SAndroid Build Coastguard Worker
3385*f6dc9357SAndroid Build Coastguard Worker // ---------- OPTIONS ----------
3386*f6dc9357SAndroid Build Coastguard Worker
3387*f6dc9357SAndroid Build Coastguard Worker
CheckButton_Bool1(UINT id,const CBool1 & b1)3388*f6dc9357SAndroid Build Coastguard Worker void COptionsDialog::CheckButton_Bool1(UINT id, const CBool1 &b1)
3389*f6dc9357SAndroid Build Coastguard Worker {
3390*f6dc9357SAndroid Build Coastguard Worker CheckButton(id, b1.Val);
3391*f6dc9357SAndroid Build Coastguard Worker }
3392*f6dc9357SAndroid Build Coastguard Worker
GetButton_Bool1(UINT id,CBool1 & b1)3393*f6dc9357SAndroid Build Coastguard Worker void COptionsDialog::GetButton_Bool1(UINT id, CBool1 &b1)
3394*f6dc9357SAndroid Build Coastguard Worker {
3395*f6dc9357SAndroid Build Coastguard Worker b1.Val = IsButtonCheckedBool(id);
3396*f6dc9357SAndroid Build Coastguard Worker }
3397*f6dc9357SAndroid Build Coastguard Worker
3398*f6dc9357SAndroid Build Coastguard Worker
CheckButton_BoolBox(bool supported,const CBoolPair & b2,CBoolBox & bb)3399*f6dc9357SAndroid Build Coastguard Worker void COptionsDialog::CheckButton_BoolBox(
3400*f6dc9357SAndroid Build Coastguard Worker bool supported, const CBoolPair &b2, CBoolBox &bb)
3401*f6dc9357SAndroid Build Coastguard Worker {
3402*f6dc9357SAndroid Build Coastguard Worker const bool isSet = b2.Def;
3403*f6dc9357SAndroid Build Coastguard Worker const bool val = isSet ? b2.Val : bb.DefaultVal;
3404*f6dc9357SAndroid Build Coastguard Worker
3405*f6dc9357SAndroid Build Coastguard Worker bb.IsSupported = supported;
3406*f6dc9357SAndroid Build Coastguard Worker
3407*f6dc9357SAndroid Build Coastguard Worker CheckButton (bb.Set_Id, isSet);
3408*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool (bb.Set_Id, supported);
3409*f6dc9357SAndroid Build Coastguard Worker CheckButton (bb.Id, val);
3410*f6dc9357SAndroid Build Coastguard Worker EnableItem (bb.Id, isSet);
3411*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool (bb.Id, supported);
3412*f6dc9357SAndroid Build Coastguard Worker }
3413*f6dc9357SAndroid Build Coastguard Worker
GetButton_BoolBox(CBoolBox & bb)3414*f6dc9357SAndroid Build Coastguard Worker void COptionsDialog::GetButton_BoolBox(CBoolBox &bb)
3415*f6dc9357SAndroid Build Coastguard Worker {
3416*f6dc9357SAndroid Build Coastguard Worker // we save value for invisible buttons too
3417*f6dc9357SAndroid Build Coastguard Worker bb.BoolPair.Val = IsButtonCheckedBool (bb.Id);
3418*f6dc9357SAndroid Build Coastguard Worker bb.BoolPair.Def = IsButtonCheckedBool (bb.Set_Id);
3419*f6dc9357SAndroid Build Coastguard Worker }
3420*f6dc9357SAndroid Build Coastguard Worker
3421*f6dc9357SAndroid Build Coastguard Worker
Store_TimeBoxes()3422*f6dc9357SAndroid Build Coastguard Worker void COptionsDialog::Store_TimeBoxes()
3423*f6dc9357SAndroid Build Coastguard Worker {
3424*f6dc9357SAndroid Build Coastguard Worker TimePrec = GetPrecSpec();
3425*f6dc9357SAndroid Build Coastguard Worker GetButton_BoolBox (MTime);
3426*f6dc9357SAndroid Build Coastguard Worker GetButton_BoolBox (CTime);
3427*f6dc9357SAndroid Build Coastguard Worker GetButton_BoolBox (ATime);
3428*f6dc9357SAndroid Build Coastguard Worker GetButton_BoolBox (ZTime);
3429*f6dc9357SAndroid Build Coastguard Worker }
3430*f6dc9357SAndroid Build Coastguard Worker
3431*f6dc9357SAndroid Build Coastguard Worker
GetComboValue(NWindows::NControl::CComboBox & c,int defMax)3432*f6dc9357SAndroid Build Coastguard Worker UInt32 COptionsDialog::GetComboValue(NWindows::NControl::CComboBox &c, int defMax)
3433*f6dc9357SAndroid Build Coastguard Worker {
3434*f6dc9357SAndroid Build Coastguard Worker if (c.GetCount() <= defMax)
3435*f6dc9357SAndroid Build Coastguard Worker return (UInt32)(Int32)-1;
3436*f6dc9357SAndroid Build Coastguard Worker return (UInt32)c.GetItemData_of_CurSel();
3437*f6dc9357SAndroid Build Coastguard Worker }
3438*f6dc9357SAndroid Build Coastguard Worker
3439*f6dc9357SAndroid Build Coastguard Worker static const unsigned kTimePrec_Win = 0;
3440*f6dc9357SAndroid Build Coastguard Worker static const unsigned kTimePrec_Unix = 1;
3441*f6dc9357SAndroid Build Coastguard Worker static const unsigned kTimePrec_DOS = 2;
3442*f6dc9357SAndroid Build Coastguard Worker static const unsigned kTimePrec_1ns = 3;
3443*f6dc9357SAndroid Build Coastguard Worker
AddTimeOption(UString & s,UInt32 val,const UString & unit,const char * sys=NULL)3444*f6dc9357SAndroid Build Coastguard Worker static void AddTimeOption(UString &s, UInt32 val, const UString &unit, const char *sys = NULL)
3445*f6dc9357SAndroid Build Coastguard Worker {
3446*f6dc9357SAndroid Build Coastguard Worker // s += " : ";
3447*f6dc9357SAndroid Build Coastguard Worker {
3448*f6dc9357SAndroid Build Coastguard Worker AString s2;
3449*f6dc9357SAndroid Build Coastguard Worker s2.Add_UInt32(val);
3450*f6dc9357SAndroid Build Coastguard Worker s += s2;
3451*f6dc9357SAndroid Build Coastguard Worker }
3452*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
3453*f6dc9357SAndroid Build Coastguard Worker s += unit;
3454*f6dc9357SAndroid Build Coastguard Worker if (sys)
3455*f6dc9357SAndroid Build Coastguard Worker {
3456*f6dc9357SAndroid Build Coastguard Worker s += " : ";
3457*f6dc9357SAndroid Build Coastguard Worker s += sys;
3458*f6dc9357SAndroid Build Coastguard Worker }
3459*f6dc9357SAndroid Build Coastguard Worker }
3460*f6dc9357SAndroid Build Coastguard Worker
AddPrec(unsigned prec,bool isDefault)3461*f6dc9357SAndroid Build Coastguard Worker int COptionsDialog::AddPrec(unsigned prec, bool isDefault)
3462*f6dc9357SAndroid Build Coastguard Worker {
3463*f6dc9357SAndroid Build Coastguard Worker UString s;
3464*f6dc9357SAndroid Build Coastguard Worker UInt32 writePrec = prec;
3465*f6dc9357SAndroid Build Coastguard Worker if (isDefault)
3466*f6dc9357SAndroid Build Coastguard Worker {
3467*f6dc9357SAndroid Build Coastguard Worker // s += "* ";
3468*f6dc9357SAndroid Build Coastguard Worker // writePrec = (UInt32)(Int32)-1;
3469*f6dc9357SAndroid Build Coastguard Worker }
3470*f6dc9357SAndroid Build Coastguard Worker if (prec == kTimePrec_Win) AddTimeOption(s, 100, NsString, "Windows");
3471*f6dc9357SAndroid Build Coastguard Worker else if (prec == kTimePrec_Unix) AddTimeOption(s, 1, SecString, "Unix");
3472*f6dc9357SAndroid Build Coastguard Worker else if (prec == kTimePrec_DOS) AddTimeOption(s, 2, SecString, "DOS");
3473*f6dc9357SAndroid Build Coastguard Worker else if (prec == kTimePrec_1ns) AddTimeOption(s, 1, NsString, "Linux");
3474*f6dc9357SAndroid Build Coastguard Worker else if (prec == k_PropVar_TimePrec_Base) AddTimeOption(s, 1, SecString);
3475*f6dc9357SAndroid Build Coastguard Worker else if (prec >= k_PropVar_TimePrec_Base)
3476*f6dc9357SAndroid Build Coastguard Worker {
3477*f6dc9357SAndroid Build Coastguard Worker UInt32 d = 1;
3478*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = prec; i < k_PropVar_TimePrec_Base + 9; i++)
3479*f6dc9357SAndroid Build Coastguard Worker d *= 10;
3480*f6dc9357SAndroid Build Coastguard Worker AddTimeOption(s, d, NsString);
3481*f6dc9357SAndroid Build Coastguard Worker }
3482*f6dc9357SAndroid Build Coastguard Worker else
3483*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32(prec);
3484*f6dc9357SAndroid Build Coastguard Worker const int index = (int)m_Prec.AddString(s);
3485*f6dc9357SAndroid Build Coastguard Worker m_Prec.SetItemData(index, (LPARAM)writePrec);
3486*f6dc9357SAndroid Build Coastguard Worker return index;
3487*f6dc9357SAndroid Build Coastguard Worker }
3488*f6dc9357SAndroid Build Coastguard Worker
3489*f6dc9357SAndroid Build Coastguard Worker
SetPrec()3490*f6dc9357SAndroid Build Coastguard Worker void COptionsDialog::SetPrec()
3491*f6dc9357SAndroid Build Coastguard Worker {
3492*f6dc9357SAndroid Build Coastguard Worker // const CFormatInfo &fi = g_Formats[cd->GetStaticFormatIndex()];
3493*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = cd->Get_ArcInfoEx();
3494*f6dc9357SAndroid Build Coastguard Worker
3495*f6dc9357SAndroid Build Coastguard Worker // UInt32 flags = fi.Flags;
3496*f6dc9357SAndroid Build Coastguard Worker
3497*f6dc9357SAndroid Build Coastguard Worker UInt32 flags = ai.Get_TimePrecFlags();
3498*f6dc9357SAndroid Build Coastguard Worker UInt32 defaultPrec = ai.Get_DefaultTimePrec();
3499*f6dc9357SAndroid Build Coastguard Worker if (defaultPrec != 0)
3500*f6dc9357SAndroid Build Coastguard Worker flags |= ((UInt32)1 << defaultPrec);
3501*f6dc9357SAndroid Build Coastguard Worker
3502*f6dc9357SAndroid Build Coastguard Worker // const NCompression::CFormatOptions &fo = cd->Get_FormatOptions();
3503*f6dc9357SAndroid Build Coastguard Worker
3504*f6dc9357SAndroid Build Coastguard Worker // unsigned defaultPrec = kTimePrec_Win;
3505*f6dc9357SAndroid Build Coastguard Worker
3506*f6dc9357SAndroid Build Coastguard Worker if (ai.Is_GZip())
3507*f6dc9357SAndroid Build Coastguard Worker defaultPrec = kTimePrec_Unix;
3508*f6dc9357SAndroid Build Coastguard Worker
3509*f6dc9357SAndroid Build Coastguard Worker {
3510*f6dc9357SAndroid Build Coastguard Worker UString s;
3511*f6dc9357SAndroid Build Coastguard Worker s += GetNameOfProperty(kpidType, L"type");
3512*f6dc9357SAndroid Build Coastguard Worker s += ": ";
3513*f6dc9357SAndroid Build Coastguard Worker s += ai.Name;
3514*f6dc9357SAndroid Build Coastguard Worker if (ai.Is_Tar())
3515*f6dc9357SAndroid Build Coastguard Worker {
3516*f6dc9357SAndroid Build Coastguard Worker const int methodID = cd->GetMethodID();
3517*f6dc9357SAndroid Build Coastguard Worker
3518*f6dc9357SAndroid Build Coastguard Worker // for debug
3519*f6dc9357SAndroid Build Coastguard Worker // defaultPrec = kTimePrec_Unix;
3520*f6dc9357SAndroid Build Coastguard Worker // flags = (UInt32)1 << kTimePrec_Unix;
3521*f6dc9357SAndroid Build Coastguard Worker
3522*f6dc9357SAndroid Build Coastguard Worker s.Add_Colon();
3523*f6dc9357SAndroid Build Coastguard Worker if (methodID >= 0 && (unsigned)methodID < Z7_ARRAY_SIZE(kMethodsNames))
3524*f6dc9357SAndroid Build Coastguard Worker s += kMethodsNames[methodID];
3525*f6dc9357SAndroid Build Coastguard Worker if (methodID == kPosix)
3526*f6dc9357SAndroid Build Coastguard Worker {
3527*f6dc9357SAndroid Build Coastguard Worker // for debug
3528*f6dc9357SAndroid Build Coastguard Worker // flags |= (UInt32)1 << kTimePrec_Win;
3529*f6dc9357SAndroid Build Coastguard Worker // flags |= (UInt32)1 << kTimePrec_1ns;
3530*f6dc9357SAndroid Build Coastguard Worker }
3531*f6dc9357SAndroid Build Coastguard Worker }
3532*f6dc9357SAndroid Build Coastguard Worker else
3533*f6dc9357SAndroid Build Coastguard Worker {
3534*f6dc9357SAndroid Build Coastguard Worker // if (is_for_MethodChanging) return;
3535*f6dc9357SAndroid Build Coastguard Worker }
3536*f6dc9357SAndroid Build Coastguard Worker
3537*f6dc9357SAndroid Build Coastguard Worker SetItemText(IDT_COMPRESS_TIME_INFO, s);
3538*f6dc9357SAndroid Build Coastguard Worker }
3539*f6dc9357SAndroid Build Coastguard Worker
3540*f6dc9357SAndroid Build Coastguard Worker m_Prec.ResetContent();
3541*f6dc9357SAndroid Build Coastguard Worker _auto_Prec = defaultPrec;
3542*f6dc9357SAndroid Build Coastguard Worker
3543*f6dc9357SAndroid Build Coastguard Worker unsigned selectedPrec = defaultPrec;
3544*f6dc9357SAndroid Build Coastguard Worker {
3545*f6dc9357SAndroid Build Coastguard Worker // if (TimePrec >= kTimePrec_Win && TimePrec <= kTimePrec_DOS)
3546*f6dc9357SAndroid Build Coastguard Worker if ((Int32)TimePrec >= 0)
3547*f6dc9357SAndroid Build Coastguard Worker selectedPrec = TimePrec;
3548*f6dc9357SAndroid Build Coastguard Worker }
3549*f6dc9357SAndroid Build Coastguard Worker
3550*f6dc9357SAndroid Build Coastguard Worker int curSel = -1;
3551*f6dc9357SAndroid Build Coastguard Worker int defaultPrecIndex = -1;
3552*f6dc9357SAndroid Build Coastguard Worker for (unsigned prec = 0;
3553*f6dc9357SAndroid Build Coastguard Worker // prec <= k_PropVar_TimePrec_HighPrec;
3554*f6dc9357SAndroid Build Coastguard Worker prec <= k_PropVar_TimePrec_1ns;
3555*f6dc9357SAndroid Build Coastguard Worker prec++)
3556*f6dc9357SAndroid Build Coastguard Worker {
3557*f6dc9357SAndroid Build Coastguard Worker if (((flags >> prec) & 1) == 0)
3558*f6dc9357SAndroid Build Coastguard Worker continue;
3559*f6dc9357SAndroid Build Coastguard Worker const bool isDefault = (defaultPrec == prec);
3560*f6dc9357SAndroid Build Coastguard Worker const int index = AddPrec(prec, isDefault);
3561*f6dc9357SAndroid Build Coastguard Worker if (isDefault)
3562*f6dc9357SAndroid Build Coastguard Worker defaultPrecIndex = index;
3563*f6dc9357SAndroid Build Coastguard Worker if (selectedPrec == prec)
3564*f6dc9357SAndroid Build Coastguard Worker curSel = index;
3565*f6dc9357SAndroid Build Coastguard Worker }
3566*f6dc9357SAndroid Build Coastguard Worker
3567*f6dc9357SAndroid Build Coastguard Worker if (curSel < 0 && selectedPrec > kTimePrec_DOS)
3568*f6dc9357SAndroid Build Coastguard Worker curSel = AddPrec(selectedPrec, false); // isDefault
3569*f6dc9357SAndroid Build Coastguard Worker if (curSel < 0)
3570*f6dc9357SAndroid Build Coastguard Worker curSel = defaultPrecIndex;
3571*f6dc9357SAndroid Build Coastguard Worker if (curSel >= 0)
3572*f6dc9357SAndroid Build Coastguard Worker m_Prec.SetCurSel(curSel);
3573*f6dc9357SAndroid Build Coastguard Worker
3574*f6dc9357SAndroid Build Coastguard Worker {
3575*f6dc9357SAndroid Build Coastguard Worker const bool isSet = IsSet_TimePrec();
3576*f6dc9357SAndroid Build Coastguard Worker const int count = m_Prec.GetCount();
3577*f6dc9357SAndroid Build Coastguard Worker const bool showPrec = (count != 0);
3578*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool(IDC_COMPRESS_TIME_PREC, showPrec);
3579*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool(IDT_COMPRESS_TIME_PREC, showPrec);
3580*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDC_COMPRESS_TIME_PREC, isSet && (count > 1));
3581*f6dc9357SAndroid Build Coastguard Worker
3582*f6dc9357SAndroid Build Coastguard Worker CheckButton(IDX_COMPRESS_PREC_SET, isSet);
3583*f6dc9357SAndroid Build Coastguard Worker const bool setIsSupported = isSet || (count > 1);
3584*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDX_COMPRESS_PREC_SET, setIsSupported);
3585*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool(IDX_COMPRESS_PREC_SET, setIsSupported);
3586*f6dc9357SAndroid Build Coastguard Worker }
3587*f6dc9357SAndroid Build Coastguard Worker
3588*f6dc9357SAndroid Build Coastguard Worker SetTimeMAC();
3589*f6dc9357SAndroid Build Coastguard Worker }
3590*f6dc9357SAndroid Build Coastguard Worker
3591*f6dc9357SAndroid Build Coastguard Worker
SetTimeMAC()3592*f6dc9357SAndroid Build Coastguard Worker void COptionsDialog::SetTimeMAC()
3593*f6dc9357SAndroid Build Coastguard Worker {
3594*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &ai = cd->Get_ArcInfoEx();
3595*f6dc9357SAndroid Build Coastguard Worker
3596*f6dc9357SAndroid Build Coastguard Worker const
3597*f6dc9357SAndroid Build Coastguard Worker bool m_allow = ai.Flags_MTime();
3598*f6dc9357SAndroid Build Coastguard Worker bool c_allow = ai.Flags_CTime();
3599*f6dc9357SAndroid Build Coastguard Worker bool a_allow = ai.Flags_ATime();
3600*f6dc9357SAndroid Build Coastguard Worker
3601*f6dc9357SAndroid Build Coastguard Worker if (ai.Is_Tar())
3602*f6dc9357SAndroid Build Coastguard Worker {
3603*f6dc9357SAndroid Build Coastguard Worker const int methodID = cd->GetMethodID();
3604*f6dc9357SAndroid Build Coastguard Worker c_allow = false;
3605*f6dc9357SAndroid Build Coastguard Worker a_allow = false;
3606*f6dc9357SAndroid Build Coastguard Worker if (methodID == kPosix)
3607*f6dc9357SAndroid Build Coastguard Worker {
3608*f6dc9357SAndroid Build Coastguard Worker // c_allow = true; // do we need it as change time ?
3609*f6dc9357SAndroid Build Coastguard Worker a_allow = true;
3610*f6dc9357SAndroid Build Coastguard Worker }
3611*f6dc9357SAndroid Build Coastguard Worker }
3612*f6dc9357SAndroid Build Coastguard Worker
3613*f6dc9357SAndroid Build Coastguard Worker if (ai.Is_Zip())
3614*f6dc9357SAndroid Build Coastguard Worker {
3615*f6dc9357SAndroid Build Coastguard Worker // const int methodID = GetMethodID();
3616*f6dc9357SAndroid Build Coastguard Worker UInt32 prec = GetPrec();
3617*f6dc9357SAndroid Build Coastguard Worker if (prec == (UInt32)(Int32)-1)
3618*f6dc9357SAndroid Build Coastguard Worker prec = _auto_Prec;
3619*f6dc9357SAndroid Build Coastguard Worker if (prec != kTimePrec_Win)
3620*f6dc9357SAndroid Build Coastguard Worker {
3621*f6dc9357SAndroid Build Coastguard Worker c_allow = false;
3622*f6dc9357SAndroid Build Coastguard Worker a_allow = false;
3623*f6dc9357SAndroid Build Coastguard Worker }
3624*f6dc9357SAndroid Build Coastguard Worker }
3625*f6dc9357SAndroid Build Coastguard Worker
3626*f6dc9357SAndroid Build Coastguard Worker
3627*f6dc9357SAndroid Build Coastguard Worker /*
3628*f6dc9357SAndroid Build Coastguard Worker MTime.DefaultVal = true;
3629*f6dc9357SAndroid Build Coastguard Worker CTime.DefaultVal = false;
3630*f6dc9357SAndroid Build Coastguard Worker ATime.DefaultVal = false;
3631*f6dc9357SAndroid Build Coastguard Worker */
3632*f6dc9357SAndroid Build Coastguard Worker
3633*f6dc9357SAndroid Build Coastguard Worker MTime.DefaultVal = ai.Flags_MTime_Default();
3634*f6dc9357SAndroid Build Coastguard Worker CTime.DefaultVal = ai.Flags_CTime_Default();
3635*f6dc9357SAndroid Build Coastguard Worker ATime.DefaultVal = ai.Flags_ATime_Default();
3636*f6dc9357SAndroid Build Coastguard Worker
3637*f6dc9357SAndroid Build Coastguard Worker ZTime.DefaultVal = false;
3638*f6dc9357SAndroid Build Coastguard Worker
3639*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = cd->Get_FormatOptions();
3640*f6dc9357SAndroid Build Coastguard Worker
3641*f6dc9357SAndroid Build Coastguard Worker CheckButton_BoolBox (m_allow, fo.MTime, MTime );
3642*f6dc9357SAndroid Build Coastguard Worker CheckButton_BoolBox (c_allow, fo.CTime, CTime );
3643*f6dc9357SAndroid Build Coastguard Worker CheckButton_BoolBox (a_allow, fo.ATime, ATime );
3644*f6dc9357SAndroid Build Coastguard Worker CheckButton_BoolBox (true, fo.SetArcMTime, ZTime);
3645*f6dc9357SAndroid Build Coastguard Worker
3646*f6dc9357SAndroid Build Coastguard Worker if (m_allow && !fo.MTime.Def)
3647*f6dc9357SAndroid Build Coastguard Worker {
3648*f6dc9357SAndroid Build Coastguard Worker const bool isSingleFile = ai.Flags_KeepName();
3649*f6dc9357SAndroid Build Coastguard Worker if (!isSingleFile)
3650*f6dc9357SAndroid Build Coastguard Worker {
3651*f6dc9357SAndroid Build Coastguard Worker // we can hide changing checkboxes for MTime here:
3652*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool (MTime.Set_Id, false);
3653*f6dc9357SAndroid Build Coastguard Worker EnableItem (MTime.Id, false);
3654*f6dc9357SAndroid Build Coastguard Worker }
3655*f6dc9357SAndroid Build Coastguard Worker }
3656*f6dc9357SAndroid Build Coastguard Worker // On_CheckBoxSet_Prec_Clicked();
3657*f6dc9357SAndroid Build Coastguard Worker // const bool isSingleFile = ai.Flags_KeepName();
3658*f6dc9357SAndroid Build Coastguard Worker // mtime for Gz can be
3659*f6dc9357SAndroid Build Coastguard Worker }
3660*f6dc9357SAndroid Build Coastguard Worker
3661*f6dc9357SAndroid Build Coastguard Worker
3662*f6dc9357SAndroid Build Coastguard Worker
On_CheckBoxSet_Prec_Clicked()3663*f6dc9357SAndroid Build Coastguard Worker void COptionsDialog::On_CheckBoxSet_Prec_Clicked()
3664*f6dc9357SAndroid Build Coastguard Worker {
3665*f6dc9357SAndroid Build Coastguard Worker const bool isSet = IsButtonCheckedBool(IDX_COMPRESS_PREC_SET);
3666*f6dc9357SAndroid Build Coastguard Worker if (!isSet)
3667*f6dc9357SAndroid Build Coastguard Worker {
3668*f6dc9357SAndroid Build Coastguard Worker // We save current MAC boxes to memory before SetPrec()
3669*f6dc9357SAndroid Build Coastguard Worker Store_TimeBoxes();
3670*f6dc9357SAndroid Build Coastguard Worker Reset_TimePrec();
3671*f6dc9357SAndroid Build Coastguard Worker SetPrec();
3672*f6dc9357SAndroid Build Coastguard Worker }
3673*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDC_COMPRESS_TIME_PREC, isSet);
3674*f6dc9357SAndroid Build Coastguard Worker }
3675*f6dc9357SAndroid Build Coastguard Worker
On_CheckBoxSet_Clicked(const CBoolBox & bb)3676*f6dc9357SAndroid Build Coastguard Worker void COptionsDialog::On_CheckBoxSet_Clicked(const CBoolBox &bb)
3677*f6dc9357SAndroid Build Coastguard Worker {
3678*f6dc9357SAndroid Build Coastguard Worker const bool isSet = IsButtonCheckedBool(bb.Set_Id);
3679*f6dc9357SAndroid Build Coastguard Worker if (!isSet)
3680*f6dc9357SAndroid Build Coastguard Worker CheckButton(bb.Id, bb.DefaultVal);
3681*f6dc9357SAndroid Build Coastguard Worker EnableItem(bb.Id, isSet);
3682*f6dc9357SAndroid Build Coastguard Worker }
3683*f6dc9357SAndroid Build Coastguard Worker
3684*f6dc9357SAndroid Build Coastguard Worker
3685*f6dc9357SAndroid Build Coastguard Worker
3686*f6dc9357SAndroid Build Coastguard Worker
3687*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
3688*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLangIDs_Options[] =
3689*f6dc9357SAndroid Build Coastguard Worker {
3690*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_NT_SYM_LINKS,
3691*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_NT_HARD_LINKS,
3692*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_NT_ALT_STREAMS,
3693*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_NT_SECUR,
3694*f6dc9357SAndroid Build Coastguard Worker
3695*f6dc9357SAndroid Build Coastguard Worker IDG_COMPRESS_TIME,
3696*f6dc9357SAndroid Build Coastguard Worker IDT_COMPRESS_TIME_PREC,
3697*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_MTIME,
3698*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_CTIME,
3699*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_ATIME,
3700*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_ZTIME,
3701*f6dc9357SAndroid Build Coastguard Worker IDX_COMPRESS_PRESERVE_ATIME
3702*f6dc9357SAndroid Build Coastguard Worker };
3703*f6dc9357SAndroid Build Coastguard Worker #endif
3704*f6dc9357SAndroid Build Coastguard Worker
3705*f6dc9357SAndroid Build Coastguard Worker
OnInit()3706*f6dc9357SAndroid Build Coastguard Worker bool COptionsDialog::OnInit()
3707*f6dc9357SAndroid Build Coastguard Worker {
3708*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
3709*f6dc9357SAndroid Build Coastguard Worker LangSetWindowText(*this, IDB_COMPRESS_OPTIONS); // IDS_OPTIONS
3710*f6dc9357SAndroid Build Coastguard Worker LangSetDlgItems(*this, kLangIDs_Options, Z7_ARRAY_SIZE(kLangIDs_Options));
3711*f6dc9357SAndroid Build Coastguard Worker // LangSetDlgItemText(*this, IDB_COMPRESS_TIME_DEFAULT, IDB_COMPRESS_TIME_DEFAULT);
3712*f6dc9357SAndroid Build Coastguard Worker // LangSetDlgItemText(*this, IDX_COMPRESS_TIME_DEFAULT, IDX_COMPRESS_TIME_DEFAULT);
3713*f6dc9357SAndroid Build Coastguard Worker #endif
3714*f6dc9357SAndroid Build Coastguard Worker
3715*f6dc9357SAndroid Build Coastguard Worker LangString(IDS_COMPRESS_SEC, SecString);
3716*f6dc9357SAndroid Build Coastguard Worker if (SecString.IsEmpty())
3717*f6dc9357SAndroid Build Coastguard Worker SecString = "sec";
3718*f6dc9357SAndroid Build Coastguard Worker LangString(IDS_COMPRESS_NS, NsString);
3719*f6dc9357SAndroid Build Coastguard Worker if (NsString.IsEmpty())
3720*f6dc9357SAndroid Build Coastguard Worker NsString = "ns";
3721*f6dc9357SAndroid Build Coastguard Worker
3722*f6dc9357SAndroid Build Coastguard Worker {
3723*f6dc9357SAndroid Build Coastguard Worker // const CArcInfoEx &ai = cd->Get_ArcInfoEx();
3724*f6dc9357SAndroid Build Coastguard Worker
3725*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool ( IDX_COMPRESS_NT_SYM_LINKS, cd->SymLinks.Supported);
3726*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool ( IDX_COMPRESS_NT_HARD_LINKS, cd->HardLinks.Supported);
3727*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool ( IDX_COMPRESS_NT_ALT_STREAMS, cd->AltStreams.Supported);
3728*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool ( IDX_COMPRESS_NT_SECUR, cd->NtSecurity.Supported);
3729*f6dc9357SAndroid Build Coastguard Worker
3730*f6dc9357SAndroid Build Coastguard Worker ShowItem_Bool ( IDG_COMPRESS_NTFS,
3731*f6dc9357SAndroid Build Coastguard Worker cd->SymLinks.Supported
3732*f6dc9357SAndroid Build Coastguard Worker || cd->HardLinks.Supported
3733*f6dc9357SAndroid Build Coastguard Worker || cd->AltStreams.Supported
3734*f6dc9357SAndroid Build Coastguard Worker || cd->NtSecurity.Supported);
3735*f6dc9357SAndroid Build Coastguard Worker }
3736*f6dc9357SAndroid Build Coastguard Worker
3737*f6dc9357SAndroid Build Coastguard Worker /* we read property from two sources:
3738*f6dc9357SAndroid Build Coastguard Worker 1) command line : (Info)
3739*f6dc9357SAndroid Build Coastguard Worker 2) registry : (m_RegistryInfo)
3740*f6dc9357SAndroid Build Coastguard Worker (Info) has priority, if both are no defined */
3741*f6dc9357SAndroid Build Coastguard Worker
3742*f6dc9357SAndroid Build Coastguard Worker CheckButton_Bool1 ( IDX_COMPRESS_NT_SYM_LINKS, cd->SymLinks);
3743*f6dc9357SAndroid Build Coastguard Worker CheckButton_Bool1 ( IDX_COMPRESS_NT_HARD_LINKS, cd->HardLinks);
3744*f6dc9357SAndroid Build Coastguard Worker CheckButton_Bool1 ( IDX_COMPRESS_NT_ALT_STREAMS, cd->AltStreams);
3745*f6dc9357SAndroid Build Coastguard Worker CheckButton_Bool1 ( IDX_COMPRESS_NT_SECUR, cd->NtSecurity);
3746*f6dc9357SAndroid Build Coastguard Worker
3747*f6dc9357SAndroid Build Coastguard Worker CheckButton_Bool1 (IDX_COMPRESS_PRESERVE_ATIME, cd->PreserveATime);
3748*f6dc9357SAndroid Build Coastguard Worker
3749*f6dc9357SAndroid Build Coastguard Worker m_Prec.Attach (GetItem(IDC_COMPRESS_TIME_PREC));
3750*f6dc9357SAndroid Build Coastguard Worker
3751*f6dc9357SAndroid Build Coastguard Worker MTime.SetIDs ( IDX_COMPRESS_MTIME, IDX_COMPRESS_MTIME_SET);
3752*f6dc9357SAndroid Build Coastguard Worker CTime.SetIDs ( IDX_COMPRESS_CTIME, IDX_COMPRESS_CTIME_SET);
3753*f6dc9357SAndroid Build Coastguard Worker ATime.SetIDs ( IDX_COMPRESS_ATIME, IDX_COMPRESS_ATIME_SET);
3754*f6dc9357SAndroid Build Coastguard Worker ZTime.SetIDs ( IDX_COMPRESS_ZTIME, IDX_COMPRESS_ZTIME_SET);
3755*f6dc9357SAndroid Build Coastguard Worker
3756*f6dc9357SAndroid Build Coastguard Worker {
3757*f6dc9357SAndroid Build Coastguard Worker const NCompression::CFormatOptions &fo = cd->Get_FormatOptions();
3758*f6dc9357SAndroid Build Coastguard Worker TimePrec = fo.TimePrec;
3759*f6dc9357SAndroid Build Coastguard Worker MTime.BoolPair = fo.MTime;
3760*f6dc9357SAndroid Build Coastguard Worker CTime.BoolPair = fo.CTime;
3761*f6dc9357SAndroid Build Coastguard Worker ATime.BoolPair = fo.ATime;
3762*f6dc9357SAndroid Build Coastguard Worker ZTime.BoolPair = fo.SetArcMTime;
3763*f6dc9357SAndroid Build Coastguard Worker }
3764*f6dc9357SAndroid Build Coastguard Worker
3765*f6dc9357SAndroid Build Coastguard Worker SetPrec();
3766*f6dc9357SAndroid Build Coastguard Worker
3767*f6dc9357SAndroid Build Coastguard Worker NormalizePosition();
3768*f6dc9357SAndroid Build Coastguard Worker
3769*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnInit();
3770*f6dc9357SAndroid Build Coastguard Worker }
3771*f6dc9357SAndroid Build Coastguard Worker
3772*f6dc9357SAndroid Build Coastguard Worker
OnCommand(unsigned code,unsigned itemID,LPARAM lParam)3773*f6dc9357SAndroid Build Coastguard Worker bool COptionsDialog::OnCommand(unsigned code, unsigned itemID, LPARAM lParam)
3774*f6dc9357SAndroid Build Coastguard Worker {
3775*f6dc9357SAndroid Build Coastguard Worker if (code == CBN_SELCHANGE)
3776*f6dc9357SAndroid Build Coastguard Worker {
3777*f6dc9357SAndroid Build Coastguard Worker switch (itemID)
3778*f6dc9357SAndroid Build Coastguard Worker {
3779*f6dc9357SAndroid Build Coastguard Worker case IDC_COMPRESS_TIME_PREC:
3780*f6dc9357SAndroid Build Coastguard Worker {
3781*f6dc9357SAndroid Build Coastguard Worker Store_TimeBoxes();
3782*f6dc9357SAndroid Build Coastguard Worker SetTimeMAC(); // for zip/tar
3783*f6dc9357SAndroid Build Coastguard Worker return true;
3784*f6dc9357SAndroid Build Coastguard Worker }
3785*f6dc9357SAndroid Build Coastguard Worker }
3786*f6dc9357SAndroid Build Coastguard Worker }
3787*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnCommand(code, itemID, lParam);
3788*f6dc9357SAndroid Build Coastguard Worker }
3789*f6dc9357SAndroid Build Coastguard Worker
3790*f6dc9357SAndroid Build Coastguard Worker
OnButtonClicked(unsigned buttonID,HWND buttonHWND)3791*f6dc9357SAndroid Build Coastguard Worker bool COptionsDialog::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
3792*f6dc9357SAndroid Build Coastguard Worker {
3793*f6dc9357SAndroid Build Coastguard Worker switch (buttonID)
3794*f6dc9357SAndroid Build Coastguard Worker {
3795*f6dc9357SAndroid Build Coastguard Worker case IDX_COMPRESS_PREC_SET: { On_CheckBoxSet_Prec_Clicked(); return true; }
3796*f6dc9357SAndroid Build Coastguard Worker case IDX_COMPRESS_MTIME_SET: { On_CheckBoxSet_Clicked (MTime); return true; }
3797*f6dc9357SAndroid Build Coastguard Worker case IDX_COMPRESS_CTIME_SET: { On_CheckBoxSet_Clicked (CTime); return true; }
3798*f6dc9357SAndroid Build Coastguard Worker case IDX_COMPRESS_ATIME_SET: { On_CheckBoxSet_Clicked (ATime); return true; }
3799*f6dc9357SAndroid Build Coastguard Worker case IDX_COMPRESS_ZTIME_SET: { On_CheckBoxSet_Clicked (ZTime); return true; }
3800*f6dc9357SAndroid Build Coastguard Worker }
3801*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnButtonClicked(buttonID, buttonHWND);
3802*f6dc9357SAndroid Build Coastguard Worker }
3803*f6dc9357SAndroid Build Coastguard Worker
3804*f6dc9357SAndroid Build Coastguard Worker
OnOK()3805*f6dc9357SAndroid Build Coastguard Worker void COptionsDialog::OnOK()
3806*f6dc9357SAndroid Build Coastguard Worker {
3807*f6dc9357SAndroid Build Coastguard Worker GetButton_Bool1 (IDX_COMPRESS_NT_SYM_LINKS, cd->SymLinks);
3808*f6dc9357SAndroid Build Coastguard Worker GetButton_Bool1 (IDX_COMPRESS_NT_HARD_LINKS, cd->HardLinks);
3809*f6dc9357SAndroid Build Coastguard Worker GetButton_Bool1 (IDX_COMPRESS_NT_ALT_STREAMS, cd->AltStreams);
3810*f6dc9357SAndroid Build Coastguard Worker GetButton_Bool1 (IDX_COMPRESS_NT_SECUR, cd->NtSecurity);
3811*f6dc9357SAndroid Build Coastguard Worker GetButton_Bool1 (IDX_COMPRESS_PRESERVE_ATIME, cd->PreserveATime);
3812*f6dc9357SAndroid Build Coastguard Worker
3813*f6dc9357SAndroid Build Coastguard Worker Store_TimeBoxes();
3814*f6dc9357SAndroid Build Coastguard Worker {
3815*f6dc9357SAndroid Build Coastguard Worker NCompression::CFormatOptions &fo = cd->Get_FormatOptions();
3816*f6dc9357SAndroid Build Coastguard Worker fo.TimePrec = TimePrec;
3817*f6dc9357SAndroid Build Coastguard Worker fo.MTime = MTime.BoolPair;
3818*f6dc9357SAndroid Build Coastguard Worker fo.CTime = CTime.BoolPair;
3819*f6dc9357SAndroid Build Coastguard Worker fo.ATime = ATime.BoolPair;
3820*f6dc9357SAndroid Build Coastguard Worker fo.SetArcMTime = ZTime.BoolPair;
3821*f6dc9357SAndroid Build Coastguard Worker }
3822*f6dc9357SAndroid Build Coastguard Worker
3823*f6dc9357SAndroid Build Coastguard Worker CModalDialog::OnOK();
3824*f6dc9357SAndroid Build Coastguard Worker }
3825*f6dc9357SAndroid Build Coastguard Worker
OnHelp()3826*f6dc9357SAndroid Build Coastguard Worker void COptionsDialog::OnHelp()
3827*f6dc9357SAndroid Build Coastguard Worker {
3828*f6dc9357SAndroid Build Coastguard Worker ShowHelpWindow(kHelpTopic_Options);
3829*f6dc9357SAndroid Build Coastguard Worker }
3830