xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Common/ZipRegistry.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // ZipRegistry.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/StringToInt.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Registry.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker // #include "../Explorer/ContextMenuFlags.h"
15*f6dc9357SAndroid Build Coastguard Worker #include "ZipRegistry.h"
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
18*f6dc9357SAndroid Build Coastguard Worker using namespace NRegistry;
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker static NSynchronization::CCriticalSection g_CS;
21*f6dc9357SAndroid Build Coastguard Worker #define CS_LOCK NSynchronization::CCriticalSectionLock lock(g_CS);
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kCuPrefix = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-Zip") TEXT(STRING_PATH_SEPARATOR);
24*f6dc9357SAndroid Build Coastguard Worker 
GetKeyPath(LPCTSTR path)25*f6dc9357SAndroid Build Coastguard Worker static CSysString GetKeyPath(LPCTSTR path) { return kCuPrefix + (CSysString)path; }
26*f6dc9357SAndroid Build Coastguard Worker 
OpenMainKey(CKey & key,LPCTSTR keyName)27*f6dc9357SAndroid Build Coastguard Worker static LONG OpenMainKey(CKey &key, LPCTSTR keyName)
28*f6dc9357SAndroid Build Coastguard Worker {
29*f6dc9357SAndroid Build Coastguard Worker   return key.Open(HKEY_CURRENT_USER, GetKeyPath(keyName), KEY_READ);
30*f6dc9357SAndroid Build Coastguard Worker }
31*f6dc9357SAndroid Build Coastguard Worker 
CreateMainKey(CKey & key,LPCTSTR keyName)32*f6dc9357SAndroid Build Coastguard Worker static LONG CreateMainKey(CKey &key, LPCTSTR keyName)
33*f6dc9357SAndroid Build Coastguard Worker {
34*f6dc9357SAndroid Build Coastguard Worker   return key.Create(HKEY_CURRENT_USER, GetKeyPath(keyName));
35*f6dc9357SAndroid Build Coastguard Worker }
36*f6dc9357SAndroid Build Coastguard Worker 
Key_Set_UInt32(CKey & key,LPCTSTR name,UInt32 value)37*f6dc9357SAndroid Build Coastguard Worker static void Key_Set_UInt32(CKey &key, LPCTSTR name, UInt32 value)
38*f6dc9357SAndroid Build Coastguard Worker {
39*f6dc9357SAndroid Build Coastguard Worker   if (value == (UInt32)(Int32)-1)
40*f6dc9357SAndroid Build Coastguard Worker     key.DeleteValue(name);
41*f6dc9357SAndroid Build Coastguard Worker   else
42*f6dc9357SAndroid Build Coastguard Worker     key.SetValue(name, value);
43*f6dc9357SAndroid Build Coastguard Worker }
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker 
Key_Get_UInt32(CKey & key,LPCTSTR name,UInt32 & value)46*f6dc9357SAndroid Build Coastguard Worker static void Key_Get_UInt32(CKey &key, LPCTSTR name, UInt32 &value)
47*f6dc9357SAndroid Build Coastguard Worker {
48*f6dc9357SAndroid Build Coastguard Worker   value = (UInt32)(Int32)-1;
49*f6dc9357SAndroid Build Coastguard Worker   key.GetValue_UInt32_IfOk(name, value);
50*f6dc9357SAndroid Build Coastguard Worker }
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker 
Key_Set_BoolPair(CKey & key,LPCTSTR name,const CBoolPair & b)53*f6dc9357SAndroid Build Coastguard Worker static void Key_Set_BoolPair(CKey &key, LPCTSTR name, const CBoolPair &b)
54*f6dc9357SAndroid Build Coastguard Worker {
55*f6dc9357SAndroid Build Coastguard Worker   if (b.Def)
56*f6dc9357SAndroid Build Coastguard Worker     key.SetValue(name, b.Val);
57*f6dc9357SAndroid Build Coastguard Worker }
58*f6dc9357SAndroid Build Coastguard Worker 
Key_Set_bool_if_Changed(CKey & key,LPCTSTR name,bool val)59*f6dc9357SAndroid Build Coastguard Worker static void Key_Set_bool_if_Changed(CKey &key, LPCTSTR name, bool val)
60*f6dc9357SAndroid Build Coastguard Worker {
61*f6dc9357SAndroid Build Coastguard Worker   bool oldVal = false;
62*f6dc9357SAndroid Build Coastguard Worker   if (key.GetValue_bool_IfOk(name, oldVal) == ERROR_SUCCESS)
63*f6dc9357SAndroid Build Coastguard Worker     if (val == oldVal)
64*f6dc9357SAndroid Build Coastguard Worker       return;
65*f6dc9357SAndroid Build Coastguard Worker   key.SetValue(name, val);
66*f6dc9357SAndroid Build Coastguard Worker }
67*f6dc9357SAndroid Build Coastguard Worker 
Key_Set_BoolPair_Delete_IfNotDef(CKey & key,LPCTSTR name,const CBoolPair & b)68*f6dc9357SAndroid Build Coastguard Worker static void Key_Set_BoolPair_Delete_IfNotDef(CKey &key, LPCTSTR name, const CBoolPair &b)
69*f6dc9357SAndroid Build Coastguard Worker {
70*f6dc9357SAndroid Build Coastguard Worker   if (b.Def)
71*f6dc9357SAndroid Build Coastguard Worker     Key_Set_bool_if_Changed(key, name, b.Val);
72*f6dc9357SAndroid Build Coastguard Worker   else
73*f6dc9357SAndroid Build Coastguard Worker     key.DeleteValue(name);
74*f6dc9357SAndroid Build Coastguard Worker }
75*f6dc9357SAndroid Build Coastguard Worker 
Key_Get_BoolPair(CKey & key,LPCTSTR name,CBoolPair & b)76*f6dc9357SAndroid Build Coastguard Worker static void Key_Get_BoolPair(CKey &key, LPCTSTR name, CBoolPair &b)
77*f6dc9357SAndroid Build Coastguard Worker {
78*f6dc9357SAndroid Build Coastguard Worker   b.Val = false;
79*f6dc9357SAndroid Build Coastguard Worker   b.Def = (key.GetValue_bool_IfOk(name, b.Val) == ERROR_SUCCESS);
80*f6dc9357SAndroid Build Coastguard Worker }
81*f6dc9357SAndroid Build Coastguard Worker 
Key_Get_BoolPair_true(CKey & key,LPCTSTR name,CBoolPair & b)82*f6dc9357SAndroid Build Coastguard Worker static void Key_Get_BoolPair_true(CKey &key, LPCTSTR name, CBoolPair &b)
83*f6dc9357SAndroid Build Coastguard Worker {
84*f6dc9357SAndroid Build Coastguard Worker   b.Val = true;
85*f6dc9357SAndroid Build Coastguard Worker   b.Def = (key.GetValue_bool_IfOk(name, b.Val) == ERROR_SUCCESS);
86*f6dc9357SAndroid Build Coastguard Worker }
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker namespace NExtract
89*f6dc9357SAndroid Build Coastguard Worker {
90*f6dc9357SAndroid Build Coastguard Worker 
91*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kKeyName = TEXT("Extraction");
92*f6dc9357SAndroid Build Coastguard Worker 
93*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kExtractMode = TEXT("ExtractMode");
94*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kOverwriteMode = TEXT("OverwriteMode");
95*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kShowPassword = TEXT("ShowPassword");
96*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kPathHistory = TEXT("PathHistory");
97*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kSplitDest = TEXT("SplitDest");
98*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kElimDup = TEXT("ElimDup");
99*f6dc9357SAndroid Build Coastguard Worker // static LPCTSTR const kAltStreams = TEXT("AltStreams");
100*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kNtSecur = TEXT("Security");
101*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kMemLimit = TEXT("MemLimit");
102*f6dc9357SAndroid Build Coastguard Worker 
Save() const103*f6dc9357SAndroid Build Coastguard Worker void CInfo::Save() const
104*f6dc9357SAndroid Build Coastguard Worker {
105*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
106*f6dc9357SAndroid Build Coastguard Worker   CKey key;
107*f6dc9357SAndroid Build Coastguard Worker   CreateMainKey(key, kKeyName);
108*f6dc9357SAndroid Build Coastguard Worker 
109*f6dc9357SAndroid Build Coastguard Worker   if (PathMode_Force)
110*f6dc9357SAndroid Build Coastguard Worker     key.SetValue(kExtractMode, (UInt32)PathMode);
111*f6dc9357SAndroid Build Coastguard Worker   if (OverwriteMode_Force)
112*f6dc9357SAndroid Build Coastguard Worker     key.SetValue(kOverwriteMode, (UInt32)OverwriteMode);
113*f6dc9357SAndroid Build Coastguard Worker 
114*f6dc9357SAndroid Build Coastguard Worker   Key_Set_BoolPair(key, kSplitDest, SplitDest);
115*f6dc9357SAndroid Build Coastguard Worker   Key_Set_BoolPair(key, kElimDup, ElimDup);
116*f6dc9357SAndroid Build Coastguard Worker   // Key_Set_BoolPair(key, kAltStreams, AltStreams);
117*f6dc9357SAndroid Build Coastguard Worker   Key_Set_BoolPair(key, kNtSecur, NtSecurity);
118*f6dc9357SAndroid Build Coastguard Worker   Key_Set_BoolPair(key, kShowPassword, ShowPassword);
119*f6dc9357SAndroid Build Coastguard Worker 
120*f6dc9357SAndroid Build Coastguard Worker   key.RecurseDeleteKey(kPathHistory);
121*f6dc9357SAndroid Build Coastguard Worker   key.SetValue_Strings(kPathHistory, Paths);
122*f6dc9357SAndroid Build Coastguard Worker }
123*f6dc9357SAndroid Build Coastguard Worker 
Save_ShowPassword(bool showPassword)124*f6dc9357SAndroid Build Coastguard Worker void Save_ShowPassword(bool showPassword)
125*f6dc9357SAndroid Build Coastguard Worker {
126*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
127*f6dc9357SAndroid Build Coastguard Worker   CKey key;
128*f6dc9357SAndroid Build Coastguard Worker   CreateMainKey(key, kKeyName);
129*f6dc9357SAndroid Build Coastguard Worker   key.SetValue(kShowPassword, showPassword);
130*f6dc9357SAndroid Build Coastguard Worker }
131*f6dc9357SAndroid Build Coastguard Worker 
Save_LimitGB(UInt32 limit_GB)132*f6dc9357SAndroid Build Coastguard Worker void Save_LimitGB(UInt32 limit_GB)
133*f6dc9357SAndroid Build Coastguard Worker {
134*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
135*f6dc9357SAndroid Build Coastguard Worker   CKey key;
136*f6dc9357SAndroid Build Coastguard Worker   CreateMainKey(key, kKeyName);
137*f6dc9357SAndroid Build Coastguard Worker   Key_Set_UInt32(key, kMemLimit, limit_GB);
138*f6dc9357SAndroid Build Coastguard Worker }
139*f6dc9357SAndroid Build Coastguard Worker 
Load()140*f6dc9357SAndroid Build Coastguard Worker void CInfo::Load()
141*f6dc9357SAndroid Build Coastguard Worker {
142*f6dc9357SAndroid Build Coastguard Worker   PathMode = NPathMode::kCurPaths;
143*f6dc9357SAndroid Build Coastguard Worker   PathMode_Force = false;
144*f6dc9357SAndroid Build Coastguard Worker   OverwriteMode = NOverwriteMode::kAsk;
145*f6dc9357SAndroid Build Coastguard Worker   OverwriteMode_Force = false;
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker   SplitDest.Val = true;
148*f6dc9357SAndroid Build Coastguard Worker 
149*f6dc9357SAndroid Build Coastguard Worker   Paths.Clear();
150*f6dc9357SAndroid Build Coastguard Worker 
151*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
152*f6dc9357SAndroid Build Coastguard Worker   CKey key;
153*f6dc9357SAndroid Build Coastguard Worker   if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS)
154*f6dc9357SAndroid Build Coastguard Worker     return;
155*f6dc9357SAndroid Build Coastguard Worker 
156*f6dc9357SAndroid Build Coastguard Worker   key.GetValue_Strings(kPathHistory, Paths);
157*f6dc9357SAndroid Build Coastguard Worker   UInt32 v;
158*f6dc9357SAndroid Build Coastguard Worker   if (key.GetValue_UInt32_IfOk(kExtractMode, v) == ERROR_SUCCESS && v <= NPathMode::kAbsPaths)
159*f6dc9357SAndroid Build Coastguard Worker   {
160*f6dc9357SAndroid Build Coastguard Worker     PathMode = (NPathMode::EEnum)v;
161*f6dc9357SAndroid Build Coastguard Worker     PathMode_Force = true;
162*f6dc9357SAndroid Build Coastguard Worker   }
163*f6dc9357SAndroid Build Coastguard Worker   if (key.GetValue_UInt32_IfOk(kOverwriteMode, v) == ERROR_SUCCESS && v <= NOverwriteMode::kRenameExisting)
164*f6dc9357SAndroid Build Coastguard Worker   {
165*f6dc9357SAndroid Build Coastguard Worker     OverwriteMode = (NOverwriteMode::EEnum)v;
166*f6dc9357SAndroid Build Coastguard Worker     OverwriteMode_Force = true;
167*f6dc9357SAndroid Build Coastguard Worker   }
168*f6dc9357SAndroid Build Coastguard Worker 
169*f6dc9357SAndroid Build Coastguard Worker   Key_Get_BoolPair_true(key, kSplitDest, SplitDest);
170*f6dc9357SAndroid Build Coastguard Worker 
171*f6dc9357SAndroid Build Coastguard Worker   Key_Get_BoolPair(key, kElimDup, ElimDup);
172*f6dc9357SAndroid Build Coastguard Worker   // Key_Get_BoolPair(key, kAltStreams, AltStreams);
173*f6dc9357SAndroid Build Coastguard Worker   Key_Get_BoolPair(key, kNtSecur, NtSecurity);
174*f6dc9357SAndroid Build Coastguard Worker   Key_Get_BoolPair(key, kShowPassword, ShowPassword);
175*f6dc9357SAndroid Build Coastguard Worker }
176*f6dc9357SAndroid Build Coastguard Worker 
Read_ShowPassword()177*f6dc9357SAndroid Build Coastguard Worker bool Read_ShowPassword()
178*f6dc9357SAndroid Build Coastguard Worker {
179*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
180*f6dc9357SAndroid Build Coastguard Worker   CKey key;
181*f6dc9357SAndroid Build Coastguard Worker   bool showPassword = false;
182*f6dc9357SAndroid Build Coastguard Worker   if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS)
183*f6dc9357SAndroid Build Coastguard Worker     return showPassword;
184*f6dc9357SAndroid Build Coastguard Worker   key.GetValue_bool_IfOk(kShowPassword, showPassword);
185*f6dc9357SAndroid Build Coastguard Worker   return showPassword;
186*f6dc9357SAndroid Build Coastguard Worker }
187*f6dc9357SAndroid Build Coastguard Worker 
Read_LimitGB()188*f6dc9357SAndroid Build Coastguard Worker UInt32 Read_LimitGB()
189*f6dc9357SAndroid Build Coastguard Worker {
190*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
191*f6dc9357SAndroid Build Coastguard Worker   CKey key;
192*f6dc9357SAndroid Build Coastguard Worker   UInt32 v = (UInt32)(Int32)-1;
193*f6dc9357SAndroid Build Coastguard Worker   if (OpenMainKey(key, kKeyName) == ERROR_SUCCESS)
194*f6dc9357SAndroid Build Coastguard Worker     key.GetValue_UInt32_IfOk(kMemLimit, v);
195*f6dc9357SAndroid Build Coastguard Worker   return v;
196*f6dc9357SAndroid Build Coastguard Worker }
197*f6dc9357SAndroid Build Coastguard Worker 
198*f6dc9357SAndroid Build Coastguard Worker }
199*f6dc9357SAndroid Build Coastguard Worker 
200*f6dc9357SAndroid Build Coastguard Worker namespace NCompression
201*f6dc9357SAndroid Build Coastguard Worker {
202*f6dc9357SAndroid Build Coastguard Worker 
203*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kKeyName = TEXT("Compression");
204*f6dc9357SAndroid Build Coastguard Worker 
205*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kArcHistory = TEXT("ArcHistory");
206*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const kArchiver = L"Archiver";
207*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kShowPassword = TEXT("ShowPassword");
208*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kEncryptHeaders = TEXT("EncryptHeaders");
209*f6dc9357SAndroid Build Coastguard Worker 
210*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kOptionsKeyName = TEXT("Options");
211*f6dc9357SAndroid Build Coastguard Worker 
212*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kLevel = TEXT("Level");
213*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kDictionary = TEXT("Dictionary");
214*f6dc9357SAndroid Build Coastguard Worker // static LPCTSTR const kDictionaryChain = TEXT("DictionaryChain");
215*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kOrder = TEXT("Order");
216*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kBlockSize = TEXT("BlockSize");
217*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kNumThreads = TEXT("NumThreads");
218*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const kMethod = L"Method";
219*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const kOptions = L"Options";
220*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const kEncryptionMethod = L"EncryptionMethod";
221*f6dc9357SAndroid Build Coastguard Worker 
222*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kNtSecur = TEXT("Security");
223*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kAltStreams = TEXT("AltStreams");
224*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kHardLinks = TEXT("HardLinks");
225*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kSymLinks = TEXT("SymLinks");
226*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kPreserveATime = TEXT("PreserveATime");
227*f6dc9357SAndroid Build Coastguard Worker 
228*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kTimePrec = TEXT("TimePrec");
229*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kMTime = TEXT("MTime");
230*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kATime = TEXT("ATime");
231*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kCTime = TEXT("CTime");
232*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kSetArcMTime = TEXT("SetArcMTime");
233*f6dc9357SAndroid Build Coastguard Worker 
SetRegString(CKey & key,LPCWSTR name,const UString & value)234*f6dc9357SAndroid Build Coastguard Worker static void SetRegString(CKey &key, LPCWSTR name, const UString &value)
235*f6dc9357SAndroid Build Coastguard Worker {
236*f6dc9357SAndroid Build Coastguard Worker   if (value.IsEmpty())
237*f6dc9357SAndroid Build Coastguard Worker     key.DeleteValue(name);
238*f6dc9357SAndroid Build Coastguard Worker   else
239*f6dc9357SAndroid Build Coastguard Worker     key.SetValue(name, value);
240*f6dc9357SAndroid Build Coastguard Worker }
241*f6dc9357SAndroid Build Coastguard Worker 
GetRegString(CKey & key,LPCWSTR name,UString & value)242*f6dc9357SAndroid Build Coastguard Worker static void GetRegString(CKey &key, LPCWSTR name, UString &value)
243*f6dc9357SAndroid Build Coastguard Worker {
244*f6dc9357SAndroid Build Coastguard Worker   if (key.QueryValue(name, value) != ERROR_SUCCESS)
245*f6dc9357SAndroid Build Coastguard Worker     value.Empty();
246*f6dc9357SAndroid Build Coastguard Worker }
247*f6dc9357SAndroid Build Coastguard Worker 
248*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const kMemUse = L"MemUse"
249*f6dc9357SAndroid Build Coastguard Worker     #if defined(MY_CPU_SIZEOF_POINTER) && (MY_CPU_SIZEOF_POINTER == 4)
250*f6dc9357SAndroid Build Coastguard Worker       L"32";
251*f6dc9357SAndroid Build Coastguard Worker     #else
252*f6dc9357SAndroid Build Coastguard Worker       L"64";
253*f6dc9357SAndroid Build Coastguard Worker     #endif
254*f6dc9357SAndroid Build Coastguard Worker 
Save() const255*f6dc9357SAndroid Build Coastguard Worker void CInfo::Save() const
256*f6dc9357SAndroid Build Coastguard Worker {
257*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
258*f6dc9357SAndroid Build Coastguard Worker 
259*f6dc9357SAndroid Build Coastguard Worker   CKey key;
260*f6dc9357SAndroid Build Coastguard Worker   CreateMainKey(key, kKeyName);
261*f6dc9357SAndroid Build Coastguard Worker 
262*f6dc9357SAndroid Build Coastguard Worker   Key_Set_BoolPair_Delete_IfNotDef (key, kNtSecur, NtSecurity);
263*f6dc9357SAndroid Build Coastguard Worker   Key_Set_BoolPair_Delete_IfNotDef (key, kAltStreams, AltStreams);
264*f6dc9357SAndroid Build Coastguard Worker   Key_Set_BoolPair_Delete_IfNotDef (key, kHardLinks, HardLinks);
265*f6dc9357SAndroid Build Coastguard Worker   Key_Set_BoolPair_Delete_IfNotDef (key, kSymLinks, SymLinks);
266*f6dc9357SAndroid Build Coastguard Worker   Key_Set_BoolPair_Delete_IfNotDef (key, kPreserveATime, PreserveATime);
267*f6dc9357SAndroid Build Coastguard Worker 
268*f6dc9357SAndroid Build Coastguard Worker   key.SetValue(kShowPassword, ShowPassword);
269*f6dc9357SAndroid Build Coastguard Worker   key.SetValue(kLevel, (UInt32)Level);
270*f6dc9357SAndroid Build Coastguard Worker   key.SetValue(kArchiver, ArcType);
271*f6dc9357SAndroid Build Coastguard Worker   key.SetValue(kShowPassword, ShowPassword);
272*f6dc9357SAndroid Build Coastguard Worker   key.SetValue(kEncryptHeaders, EncryptHeaders);
273*f6dc9357SAndroid Build Coastguard Worker   key.RecurseDeleteKey(kArcHistory);
274*f6dc9357SAndroid Build Coastguard Worker   key.SetValue_Strings(kArcHistory, ArcPaths);
275*f6dc9357SAndroid Build Coastguard Worker 
276*f6dc9357SAndroid Build Coastguard Worker   key.RecurseDeleteKey(kOptionsKeyName);
277*f6dc9357SAndroid Build Coastguard Worker   {
278*f6dc9357SAndroid Build Coastguard Worker     CKey optionsKey;
279*f6dc9357SAndroid Build Coastguard Worker     optionsKey.Create(key, kOptionsKeyName);
280*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, Formats)
281*f6dc9357SAndroid Build Coastguard Worker     {
282*f6dc9357SAndroid Build Coastguard Worker       const CFormatOptions &fo = Formats[i];
283*f6dc9357SAndroid Build Coastguard Worker       CKey fk;
284*f6dc9357SAndroid Build Coastguard Worker       fk.Create(optionsKey, fo.FormatID);
285*f6dc9357SAndroid Build Coastguard Worker 
286*f6dc9357SAndroid Build Coastguard Worker       SetRegString(fk, kMethod, fo.Method);
287*f6dc9357SAndroid Build Coastguard Worker       SetRegString(fk, kOptions, fo.Options);
288*f6dc9357SAndroid Build Coastguard Worker       SetRegString(fk, kEncryptionMethod, fo.EncryptionMethod);
289*f6dc9357SAndroid Build Coastguard Worker       SetRegString(fk, kMemUse, fo.MemUse);
290*f6dc9357SAndroid Build Coastguard Worker 
291*f6dc9357SAndroid Build Coastguard Worker       Key_Set_UInt32(fk, kLevel, fo.Level);
292*f6dc9357SAndroid Build Coastguard Worker       Key_Set_UInt32(fk, kDictionary, fo.Dictionary);
293*f6dc9357SAndroid Build Coastguard Worker       // Key_Set_UInt32(fk, kDictionaryChain, fo.DictionaryChain);
294*f6dc9357SAndroid Build Coastguard Worker       Key_Set_UInt32(fk, kOrder, fo.Order);
295*f6dc9357SAndroid Build Coastguard Worker       Key_Set_UInt32(fk, kBlockSize, fo.BlockLogSize);
296*f6dc9357SAndroid Build Coastguard Worker       Key_Set_UInt32(fk, kNumThreads, fo.NumThreads);
297*f6dc9357SAndroid Build Coastguard Worker 
298*f6dc9357SAndroid Build Coastguard Worker       Key_Set_UInt32(fk, kTimePrec, fo.TimePrec);
299*f6dc9357SAndroid Build Coastguard Worker       Key_Set_BoolPair_Delete_IfNotDef (fk, kMTime, fo.MTime);
300*f6dc9357SAndroid Build Coastguard Worker       Key_Set_BoolPair_Delete_IfNotDef (fk, kATime, fo.ATime);
301*f6dc9357SAndroid Build Coastguard Worker       Key_Set_BoolPair_Delete_IfNotDef (fk, kCTime, fo.CTime);
302*f6dc9357SAndroid Build Coastguard Worker       Key_Set_BoolPair_Delete_IfNotDef (fk, kSetArcMTime, fo.SetArcMTime);
303*f6dc9357SAndroid Build Coastguard Worker     }
304*f6dc9357SAndroid Build Coastguard Worker   }
305*f6dc9357SAndroid Build Coastguard Worker }
306*f6dc9357SAndroid Build Coastguard Worker 
Load()307*f6dc9357SAndroid Build Coastguard Worker void CInfo::Load()
308*f6dc9357SAndroid Build Coastguard Worker {
309*f6dc9357SAndroid Build Coastguard Worker   ArcPaths.Clear();
310*f6dc9357SAndroid Build Coastguard Worker   Formats.Clear();
311*f6dc9357SAndroid Build Coastguard Worker 
312*f6dc9357SAndroid Build Coastguard Worker   Level = 5;
313*f6dc9357SAndroid Build Coastguard Worker   ArcType = L"7z";
314*f6dc9357SAndroid Build Coastguard Worker   ShowPassword = false;
315*f6dc9357SAndroid Build Coastguard Worker   EncryptHeaders = false;
316*f6dc9357SAndroid Build Coastguard Worker 
317*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
318*f6dc9357SAndroid Build Coastguard Worker   CKey key;
319*f6dc9357SAndroid Build Coastguard Worker 
320*f6dc9357SAndroid Build Coastguard Worker   if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS)
321*f6dc9357SAndroid Build Coastguard Worker     return;
322*f6dc9357SAndroid Build Coastguard Worker 
323*f6dc9357SAndroid Build Coastguard Worker   Key_Get_BoolPair(key, kNtSecur, NtSecurity);
324*f6dc9357SAndroid Build Coastguard Worker   Key_Get_BoolPair(key, kAltStreams, AltStreams);
325*f6dc9357SAndroid Build Coastguard Worker   Key_Get_BoolPair(key, kHardLinks, HardLinks);
326*f6dc9357SAndroid Build Coastguard Worker   Key_Get_BoolPair(key, kSymLinks, SymLinks);
327*f6dc9357SAndroid Build Coastguard Worker   Key_Get_BoolPair(key, kPreserveATime, PreserveATime);
328*f6dc9357SAndroid Build Coastguard Worker 
329*f6dc9357SAndroid Build Coastguard Worker   key.GetValue_Strings(kArcHistory, ArcPaths);
330*f6dc9357SAndroid Build Coastguard Worker 
331*f6dc9357SAndroid Build Coastguard Worker   {
332*f6dc9357SAndroid Build Coastguard Worker     CKey optionsKey;
333*f6dc9357SAndroid Build Coastguard Worker     if (optionsKey.Open(key, kOptionsKeyName, KEY_READ) == ERROR_SUCCESS)
334*f6dc9357SAndroid Build Coastguard Worker     {
335*f6dc9357SAndroid Build Coastguard Worker       CSysStringVector formatIDs;
336*f6dc9357SAndroid Build Coastguard Worker       optionsKey.EnumKeys(formatIDs);
337*f6dc9357SAndroid Build Coastguard Worker       FOR_VECTOR (i, formatIDs)
338*f6dc9357SAndroid Build Coastguard Worker       {
339*f6dc9357SAndroid Build Coastguard Worker         CKey fk;
340*f6dc9357SAndroid Build Coastguard Worker         CFormatOptions fo;
341*f6dc9357SAndroid Build Coastguard Worker         fo.FormatID = formatIDs[i];
342*f6dc9357SAndroid Build Coastguard Worker         if (fk.Open(optionsKey, fo.FormatID, KEY_READ) == ERROR_SUCCESS)
343*f6dc9357SAndroid Build Coastguard Worker         {
344*f6dc9357SAndroid Build Coastguard Worker           GetRegString(fk, kMethod, fo.Method);
345*f6dc9357SAndroid Build Coastguard Worker           GetRegString(fk, kOptions, fo.Options);
346*f6dc9357SAndroid Build Coastguard Worker           GetRegString(fk, kEncryptionMethod, fo.EncryptionMethod);
347*f6dc9357SAndroid Build Coastguard Worker           GetRegString(fk, kMemUse, fo.MemUse);
348*f6dc9357SAndroid Build Coastguard Worker 
349*f6dc9357SAndroid Build Coastguard Worker           Key_Get_UInt32(fk, kLevel, fo.Level);
350*f6dc9357SAndroid Build Coastguard Worker           Key_Get_UInt32(fk, kDictionary, fo.Dictionary);
351*f6dc9357SAndroid Build Coastguard Worker           // Key_Get_UInt32(fk, kDictionaryChain, fo.DictionaryChain);
352*f6dc9357SAndroid Build Coastguard Worker           Key_Get_UInt32(fk, kOrder, fo.Order);
353*f6dc9357SAndroid Build Coastguard Worker           Key_Get_UInt32(fk, kBlockSize, fo.BlockLogSize);
354*f6dc9357SAndroid Build Coastguard Worker           Key_Get_UInt32(fk, kNumThreads, fo.NumThreads);
355*f6dc9357SAndroid Build Coastguard Worker 
356*f6dc9357SAndroid Build Coastguard Worker           Key_Get_UInt32(fk, kTimePrec, fo.TimePrec);
357*f6dc9357SAndroid Build Coastguard Worker           Key_Get_BoolPair(fk, kMTime, fo.MTime);
358*f6dc9357SAndroid Build Coastguard Worker           Key_Get_BoolPair(fk, kATime, fo.ATime);
359*f6dc9357SAndroid Build Coastguard Worker           Key_Get_BoolPair(fk, kCTime, fo.CTime);
360*f6dc9357SAndroid Build Coastguard Worker           Key_Get_BoolPair(fk, kSetArcMTime, fo.SetArcMTime);
361*f6dc9357SAndroid Build Coastguard Worker 
362*f6dc9357SAndroid Build Coastguard Worker           Formats.Add(fo);
363*f6dc9357SAndroid Build Coastguard Worker         }
364*f6dc9357SAndroid Build Coastguard Worker       }
365*f6dc9357SAndroid Build Coastguard Worker     }
366*f6dc9357SAndroid Build Coastguard Worker   }
367*f6dc9357SAndroid Build Coastguard Worker 
368*f6dc9357SAndroid Build Coastguard Worker   UString a;
369*f6dc9357SAndroid Build Coastguard Worker   if (key.QueryValue(kArchiver, a) == ERROR_SUCCESS)
370*f6dc9357SAndroid Build Coastguard Worker     ArcType = a;
371*f6dc9357SAndroid Build Coastguard Worker   key.GetValue_UInt32_IfOk(kLevel, Level);
372*f6dc9357SAndroid Build Coastguard Worker   key.GetValue_bool_IfOk(kShowPassword, ShowPassword);
373*f6dc9357SAndroid Build Coastguard Worker   key.GetValue_bool_IfOk(kEncryptHeaders, EncryptHeaders);
374*f6dc9357SAndroid Build Coastguard Worker }
375*f6dc9357SAndroid Build Coastguard Worker 
376*f6dc9357SAndroid Build Coastguard Worker 
ParseMemUse(const wchar_t * s,CMemUse & mu)377*f6dc9357SAndroid Build Coastguard Worker static bool ParseMemUse(const wchar_t *s, CMemUse &mu)
378*f6dc9357SAndroid Build Coastguard Worker {
379*f6dc9357SAndroid Build Coastguard Worker   mu.Clear();
380*f6dc9357SAndroid Build Coastguard Worker 
381*f6dc9357SAndroid Build Coastguard Worker   bool percentMode = false;
382*f6dc9357SAndroid Build Coastguard Worker   {
383*f6dc9357SAndroid Build Coastguard Worker     const wchar_t c = *s;
384*f6dc9357SAndroid Build Coastguard Worker     if (MyCharLower_Ascii(c) == 'p')
385*f6dc9357SAndroid Build Coastguard Worker     {
386*f6dc9357SAndroid Build Coastguard Worker       percentMode = true;
387*f6dc9357SAndroid Build Coastguard Worker       s++;
388*f6dc9357SAndroid Build Coastguard Worker     }
389*f6dc9357SAndroid Build Coastguard Worker   }
390*f6dc9357SAndroid Build Coastguard Worker   const wchar_t *end;
391*f6dc9357SAndroid Build Coastguard Worker   UInt64 number = ConvertStringToUInt64(s, &end);
392*f6dc9357SAndroid Build Coastguard Worker   if (end == s)
393*f6dc9357SAndroid Build Coastguard Worker     return false;
394*f6dc9357SAndroid Build Coastguard Worker 
395*f6dc9357SAndroid Build Coastguard Worker   wchar_t c = *end;
396*f6dc9357SAndroid Build Coastguard Worker 
397*f6dc9357SAndroid Build Coastguard Worker   if (percentMode)
398*f6dc9357SAndroid Build Coastguard Worker   {
399*f6dc9357SAndroid Build Coastguard Worker     if (c != 0)
400*f6dc9357SAndroid Build Coastguard Worker       return false;
401*f6dc9357SAndroid Build Coastguard Worker     mu.IsPercent = true;
402*f6dc9357SAndroid Build Coastguard Worker     mu.Val = number;
403*f6dc9357SAndroid Build Coastguard Worker     return true;
404*f6dc9357SAndroid Build Coastguard Worker   }
405*f6dc9357SAndroid Build Coastguard Worker 
406*f6dc9357SAndroid Build Coastguard Worker   if (c == 0)
407*f6dc9357SAndroid Build Coastguard Worker   {
408*f6dc9357SAndroid Build Coastguard Worker     mu.Val = number;
409*f6dc9357SAndroid Build Coastguard Worker     return true;
410*f6dc9357SAndroid Build Coastguard Worker   }
411*f6dc9357SAndroid Build Coastguard Worker 
412*f6dc9357SAndroid Build Coastguard Worker   c = MyCharLower_Ascii(c);
413*f6dc9357SAndroid Build Coastguard Worker 
414*f6dc9357SAndroid Build Coastguard Worker   const wchar_t c1 = end[1];
415*f6dc9357SAndroid Build Coastguard Worker 
416*f6dc9357SAndroid Build Coastguard Worker   if (c == '%')
417*f6dc9357SAndroid Build Coastguard Worker   {
418*f6dc9357SAndroid Build Coastguard Worker     if (c1 != 0)
419*f6dc9357SAndroid Build Coastguard Worker       return false;
420*f6dc9357SAndroid Build Coastguard Worker     mu.IsPercent = true;
421*f6dc9357SAndroid Build Coastguard Worker     mu.Val = number;
422*f6dc9357SAndroid Build Coastguard Worker     return true;
423*f6dc9357SAndroid Build Coastguard Worker   }
424*f6dc9357SAndroid Build Coastguard Worker 
425*f6dc9357SAndroid Build Coastguard Worker   if (c == 'b')
426*f6dc9357SAndroid Build Coastguard Worker   {
427*f6dc9357SAndroid Build Coastguard Worker     if (c1 != 0)
428*f6dc9357SAndroid Build Coastguard Worker       return false;
429*f6dc9357SAndroid Build Coastguard Worker     mu.Val = number;
430*f6dc9357SAndroid Build Coastguard Worker     return true;
431*f6dc9357SAndroid Build Coastguard Worker   }
432*f6dc9357SAndroid Build Coastguard Worker 
433*f6dc9357SAndroid Build Coastguard Worker   if (c1 != 0)
434*f6dc9357SAndroid Build Coastguard Worker     if (MyCharLower_Ascii(c1) != 'b' || end[2] != 0)
435*f6dc9357SAndroid Build Coastguard Worker       return false;
436*f6dc9357SAndroid Build Coastguard Worker 
437*f6dc9357SAndroid Build Coastguard Worker   unsigned numBits;
438*f6dc9357SAndroid Build Coastguard Worker   switch (c)
439*f6dc9357SAndroid Build Coastguard Worker   {
440*f6dc9357SAndroid Build Coastguard Worker     case 'k': numBits = 10; break;
441*f6dc9357SAndroid Build Coastguard Worker     case 'm': numBits = 20; break;
442*f6dc9357SAndroid Build Coastguard Worker     case 'g': numBits = 30; break;
443*f6dc9357SAndroid Build Coastguard Worker     case 't': numBits = 40; break;
444*f6dc9357SAndroid Build Coastguard Worker     default: return false;
445*f6dc9357SAndroid Build Coastguard Worker   }
446*f6dc9357SAndroid Build Coastguard Worker   if (number >= ((UInt64)1 << (64 - numBits)))
447*f6dc9357SAndroid Build Coastguard Worker     return false;
448*f6dc9357SAndroid Build Coastguard Worker   mu.Val = number << numBits;
449*f6dc9357SAndroid Build Coastguard Worker   return true;
450*f6dc9357SAndroid Build Coastguard Worker }
451*f6dc9357SAndroid Build Coastguard Worker 
452*f6dc9357SAndroid Build Coastguard Worker 
Parse(const UString & s)453*f6dc9357SAndroid Build Coastguard Worker void CMemUse::Parse(const UString &s)
454*f6dc9357SAndroid Build Coastguard Worker {
455*f6dc9357SAndroid Build Coastguard Worker   IsDefined = ParseMemUse(s, *this);
456*f6dc9357SAndroid Build Coastguard Worker }
457*f6dc9357SAndroid Build Coastguard Worker 
458*f6dc9357SAndroid Build Coastguard Worker /*
459*f6dc9357SAndroid Build Coastguard Worker void MemLimit_Save(const UString &s)
460*f6dc9357SAndroid Build Coastguard Worker {
461*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
462*f6dc9357SAndroid Build Coastguard Worker   CKey key;
463*f6dc9357SAndroid Build Coastguard Worker   CreateMainKey(key, kKeyName);
464*f6dc9357SAndroid Build Coastguard Worker   SetRegString(key, kMemUse, s);
465*f6dc9357SAndroid Build Coastguard Worker }
466*f6dc9357SAndroid Build Coastguard Worker 
467*f6dc9357SAndroid Build Coastguard Worker bool MemLimit_Load(NCompression::CMemUse &mu)
468*f6dc9357SAndroid Build Coastguard Worker {
469*f6dc9357SAndroid Build Coastguard Worker   mu.Clear();
470*f6dc9357SAndroid Build Coastguard Worker   UString a;
471*f6dc9357SAndroid Build Coastguard Worker   {
472*f6dc9357SAndroid Build Coastguard Worker     CS_LOCK
473*f6dc9357SAndroid Build Coastguard Worker     CKey key;
474*f6dc9357SAndroid Build Coastguard Worker     if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS)
475*f6dc9357SAndroid Build Coastguard Worker       return false;
476*f6dc9357SAndroid Build Coastguard Worker     if (key.QueryValue(kMemUse, a) != ERROR_SUCCESS)
477*f6dc9357SAndroid Build Coastguard Worker       return false;
478*f6dc9357SAndroid Build Coastguard Worker   }
479*f6dc9357SAndroid Build Coastguard Worker   if (a.IsEmpty())
480*f6dc9357SAndroid Build Coastguard Worker     return false;
481*f6dc9357SAndroid Build Coastguard Worker   mu.Parse(a);
482*f6dc9357SAndroid Build Coastguard Worker   return mu.IsDefined;
483*f6dc9357SAndroid Build Coastguard Worker }
484*f6dc9357SAndroid Build Coastguard Worker */
485*f6dc9357SAndroid Build Coastguard Worker 
486*f6dc9357SAndroid Build Coastguard Worker }
487*f6dc9357SAndroid Build Coastguard Worker 
488*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kOptionsInfoKeyName = TEXT("Options");
489*f6dc9357SAndroid Build Coastguard Worker 
490*f6dc9357SAndroid Build Coastguard Worker namespace NWorkDir
491*f6dc9357SAndroid Build Coastguard Worker {
492*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kWorkDirType = TEXT("WorkDirType");
493*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const kWorkDirPath = L"WorkDirPath";
494*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kTempRemovableOnly = TEXT("TempRemovableOnly");
495*f6dc9357SAndroid Build Coastguard Worker 
496*f6dc9357SAndroid Build Coastguard Worker 
Save() const497*f6dc9357SAndroid Build Coastguard Worker void CInfo::Save()const
498*f6dc9357SAndroid Build Coastguard Worker {
499*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
500*f6dc9357SAndroid Build Coastguard Worker   CKey key;
501*f6dc9357SAndroid Build Coastguard Worker   CreateMainKey(key, kOptionsInfoKeyName);
502*f6dc9357SAndroid Build Coastguard Worker   key.SetValue(kWorkDirType, (UInt32)Mode);
503*f6dc9357SAndroid Build Coastguard Worker   key.SetValue(kWorkDirPath, fs2us(Path));
504*f6dc9357SAndroid Build Coastguard Worker   key.SetValue(kTempRemovableOnly, ForRemovableOnly);
505*f6dc9357SAndroid Build Coastguard Worker }
506*f6dc9357SAndroid Build Coastguard Worker 
Load()507*f6dc9357SAndroid Build Coastguard Worker void CInfo::Load()
508*f6dc9357SAndroid Build Coastguard Worker {
509*f6dc9357SAndroid Build Coastguard Worker   SetDefault();
510*f6dc9357SAndroid Build Coastguard Worker 
511*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
512*f6dc9357SAndroid Build Coastguard Worker   CKey key;
513*f6dc9357SAndroid Build Coastguard Worker   if (OpenMainKey(key, kOptionsInfoKeyName) != ERROR_SUCCESS)
514*f6dc9357SAndroid Build Coastguard Worker     return;
515*f6dc9357SAndroid Build Coastguard Worker 
516*f6dc9357SAndroid Build Coastguard Worker   UInt32 dirType;
517*f6dc9357SAndroid Build Coastguard Worker   if (key.GetValue_UInt32_IfOk(kWorkDirType, dirType) != ERROR_SUCCESS)
518*f6dc9357SAndroid Build Coastguard Worker     return;
519*f6dc9357SAndroid Build Coastguard Worker   switch (dirType)
520*f6dc9357SAndroid Build Coastguard Worker   {
521*f6dc9357SAndroid Build Coastguard Worker     case NMode::kSystem:
522*f6dc9357SAndroid Build Coastguard Worker     case NMode::kCurrent:
523*f6dc9357SAndroid Build Coastguard Worker     case NMode::kSpecified:
524*f6dc9357SAndroid Build Coastguard Worker       Mode = (NMode::EEnum)dirType;
525*f6dc9357SAndroid Build Coastguard Worker   }
526*f6dc9357SAndroid Build Coastguard Worker   UString pathU;
527*f6dc9357SAndroid Build Coastguard Worker   if (key.QueryValue(kWorkDirPath, pathU) == ERROR_SUCCESS)
528*f6dc9357SAndroid Build Coastguard Worker     Path = us2fs(pathU);
529*f6dc9357SAndroid Build Coastguard Worker   else
530*f6dc9357SAndroid Build Coastguard Worker   {
531*f6dc9357SAndroid Build Coastguard Worker     Path.Empty();
532*f6dc9357SAndroid Build Coastguard Worker     if (Mode == NMode::kSpecified)
533*f6dc9357SAndroid Build Coastguard Worker       Mode = NMode::kSystem;
534*f6dc9357SAndroid Build Coastguard Worker   }
535*f6dc9357SAndroid Build Coastguard Worker   key.GetValue_bool_IfOk(kTempRemovableOnly, ForRemovableOnly);
536*f6dc9357SAndroid Build Coastguard Worker }
537*f6dc9357SAndroid Build Coastguard Worker 
538*f6dc9357SAndroid Build Coastguard Worker }
539*f6dc9357SAndroid Build Coastguard Worker 
540*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kCascadedMenu = TEXT("CascadedMenu");
541*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kContextMenu = TEXT("ContextMenu");
542*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kMenuIcons = TEXT("MenuIcons");
543*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kElimDup = TEXT("ElimDupExtract");
544*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kWriteZoneId = TEXT("WriteZoneIdExtract");
545*f6dc9357SAndroid Build Coastguard Worker 
Save() const546*f6dc9357SAndroid Build Coastguard Worker void CContextMenuInfo::Save() const
547*f6dc9357SAndroid Build Coastguard Worker {
548*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
549*f6dc9357SAndroid Build Coastguard Worker   CKey key;
550*f6dc9357SAndroid Build Coastguard Worker   CreateMainKey(key, kOptionsInfoKeyName);
551*f6dc9357SAndroid Build Coastguard Worker 
552*f6dc9357SAndroid Build Coastguard Worker   Key_Set_BoolPair(key, kCascadedMenu, Cascaded);
553*f6dc9357SAndroid Build Coastguard Worker   Key_Set_BoolPair(key, kMenuIcons, MenuIcons);
554*f6dc9357SAndroid Build Coastguard Worker   Key_Set_BoolPair(key, kElimDup, ElimDup);
555*f6dc9357SAndroid Build Coastguard Worker 
556*f6dc9357SAndroid Build Coastguard Worker   Key_Set_UInt32(key, kWriteZoneId, WriteZone);
557*f6dc9357SAndroid Build Coastguard Worker 
558*f6dc9357SAndroid Build Coastguard Worker   if (Flags_Def)
559*f6dc9357SAndroid Build Coastguard Worker     key.SetValue(kContextMenu, Flags);
560*f6dc9357SAndroid Build Coastguard Worker }
561*f6dc9357SAndroid Build Coastguard Worker 
Load()562*f6dc9357SAndroid Build Coastguard Worker void CContextMenuInfo::Load()
563*f6dc9357SAndroid Build Coastguard Worker {
564*f6dc9357SAndroid Build Coastguard Worker   Cascaded.Val = true;
565*f6dc9357SAndroid Build Coastguard Worker   Cascaded.Def = false;
566*f6dc9357SAndroid Build Coastguard Worker 
567*f6dc9357SAndroid Build Coastguard Worker   MenuIcons.Val = false;
568*f6dc9357SAndroid Build Coastguard Worker   MenuIcons.Def = false;
569*f6dc9357SAndroid Build Coastguard Worker 
570*f6dc9357SAndroid Build Coastguard Worker   ElimDup.Val = true;
571*f6dc9357SAndroid Build Coastguard Worker   ElimDup.Def = false;
572*f6dc9357SAndroid Build Coastguard Worker 
573*f6dc9357SAndroid Build Coastguard Worker   WriteZone = (UInt32)(Int32)-1;
574*f6dc9357SAndroid Build Coastguard Worker 
575*f6dc9357SAndroid Build Coastguard Worker   /* we can disable email items by default,
576*f6dc9357SAndroid Build Coastguard Worker      because email code doesn't work in some systems */
577*f6dc9357SAndroid Build Coastguard Worker   Flags = (UInt32)(Int32)-1
578*f6dc9357SAndroid Build Coastguard Worker       /*
579*f6dc9357SAndroid Build Coastguard Worker       & ~NContextMenuFlags::kCompressEmail
580*f6dc9357SAndroid Build Coastguard Worker       & ~NContextMenuFlags::kCompressTo7zEmail
581*f6dc9357SAndroid Build Coastguard Worker       & ~NContextMenuFlags::kCompressToZipEmail
582*f6dc9357SAndroid Build Coastguard Worker       */
583*f6dc9357SAndroid Build Coastguard Worker       ;
584*f6dc9357SAndroid Build Coastguard Worker   Flags_Def = false;
585*f6dc9357SAndroid Build Coastguard Worker 
586*f6dc9357SAndroid Build Coastguard Worker   CS_LOCK
587*f6dc9357SAndroid Build Coastguard Worker 
588*f6dc9357SAndroid Build Coastguard Worker   CKey key;
589*f6dc9357SAndroid Build Coastguard Worker   if (OpenMainKey(key, kOptionsInfoKeyName) != ERROR_SUCCESS)
590*f6dc9357SAndroid Build Coastguard Worker     return;
591*f6dc9357SAndroid Build Coastguard Worker 
592*f6dc9357SAndroid Build Coastguard Worker   Key_Get_BoolPair_true(key, kCascadedMenu, Cascaded);
593*f6dc9357SAndroid Build Coastguard Worker   Key_Get_BoolPair_true(key, kElimDup, ElimDup);
594*f6dc9357SAndroid Build Coastguard Worker   Key_Get_BoolPair(key, kMenuIcons, MenuIcons);
595*f6dc9357SAndroid Build Coastguard Worker 
596*f6dc9357SAndroid Build Coastguard Worker   Key_Get_UInt32(key, kWriteZoneId, WriteZone);
597*f6dc9357SAndroid Build Coastguard Worker 
598*f6dc9357SAndroid Build Coastguard Worker   Flags_Def = (key.GetValue_UInt32_IfOk(kContextMenu, Flags) == ERROR_SUCCESS);
599*f6dc9357SAndroid Build Coastguard Worker }
600