Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / 7zip / UI / Common / ZipRegistry.cpp
1 // ZipRegistry.cpp\r
2 \r
3 #include "StdAfx.h"\r
4 \r
5 #include "Common/IntToString.h"\r
6 #include "Common/StringConvert.h"\r
7 \r
8 #include "Windows/FileDir.h"\r
9 #include "Windows/Registry.h"\r
10 #include "Windows/Synchronization.h"\r
11 \r
12 #include "ZipRegistry.h"\r
13 \r
14 using namespace NWindows;\r
15 using namespace NRegistry;\r
16 \r
17 static NSynchronization::CCriticalSection g_CS;\r
18 #define CS_LOCK NSynchronization::CCriticalSectionLock lock(g_CS);\r
19 \r
20 static const TCHAR *kCuPrefix = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-Zip") TEXT(STRING_PATH_SEPARATOR);\r
21 \r
22 static CSysString GetKeyPath(const CSysString &path) { return kCuPrefix + path; }\r
23 \r
24 static LONG OpenMainKey(CKey &key, LPCTSTR keyName)\r
25 {\r
26   return key.Open(HKEY_CURRENT_USER, GetKeyPath(keyName), KEY_READ);\r
27 }\r
28 \r
29 static LONG CreateMainKey(CKey &key, LPCTSTR keyName)\r
30 {\r
31   return key.Create(HKEY_CURRENT_USER, GetKeyPath(keyName));\r
32 }\r
33 \r
34 namespace NExtract\r
35 {\r
36 \r
37 static const TCHAR *kKeyName = TEXT("Extraction");\r
38 \r
39 static const TCHAR *kExtractMode = TEXT("ExtractMode");\r
40 static const TCHAR *kOverwriteMode = TEXT("OverwriteMode");\r
41 static const TCHAR *kShowPassword = TEXT("ShowPassword");\r
42 static const TCHAR *kPathHistory = TEXT("PathHistory");\r
43 \r
44 void CInfo::Save() const\r
45 {\r
46   CS_LOCK\r
47   CKey key;\r
48   CreateMainKey(key, kKeyName);\r
49   key.SetValue(kExtractMode, (UInt32)PathMode);\r
50   key.SetValue(kOverwriteMode, (UInt32)OverwriteMode);\r
51   key.SetValue(kShowPassword, ShowPassword);\r
52   key.RecurseDeleteKey(kPathHistory);\r
53   key.SetValue_Strings(kPathHistory, Paths);\r
54 }\r
55 \r
56 \r
57 void CInfo::Load()\r
58 {\r
59   PathMode = NPathMode::kCurrentPathnames;\r
60   OverwriteMode = NOverwriteMode::kAskBefore;\r
61   ShowPassword = false;\r
62   Paths.Clear();\r
63 \r
64   CS_LOCK\r
65   CKey key;\r
66   if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS)\r
67     return;\r
68   \r
69   key.GetValue_Strings(kPathHistory, Paths);\r
70   UInt32 v;\r
71   if (key.QueryValue(kExtractMode, v) == ERROR_SUCCESS && v <= NPathMode::kNoPathnames)\r
72     PathMode = (NPathMode::EEnum)v;\r
73   if (key.QueryValue(kOverwriteMode, v) == ERROR_SUCCESS && v <= NOverwriteMode::kAutoRenameExisting)\r
74     OverwriteMode = (NOverwriteMode::EEnum)v;\r
75   key.GetValue_IfOk(kShowPassword, ShowPassword);\r
76 }\r
77 \r
78 }\r
79 \r
80 namespace NCompression\r
81 {\r
82 \r
83 static const TCHAR *kKeyName = TEXT("Compression");\r
84 \r
85 static const TCHAR *kArcHistory = TEXT("ArcHistory");\r
86 static const WCHAR *kArchiver = L"Archiver";\r
87 static const TCHAR *kShowPassword = TEXT("ShowPassword");\r
88 static const TCHAR *kEncryptHeaders = TEXT("EncryptHeaders");\r
89 \r
90 static const TCHAR *kOptionsKeyName = TEXT("Options");\r
91 \r
92 static const TCHAR *kLevel = TEXT("Level");\r
93 static const TCHAR *kDictionary = TEXT("Dictionary");\r
94 static const TCHAR *kOrder = TEXT("Order");\r
95 static const TCHAR *kBlockSize = TEXT("BlockSize");\r
96 static const TCHAR *kNumThreads = TEXT("NumThreads");\r
97 static const WCHAR *kMethod = L"Method";\r
98 static const WCHAR *kOptions = L"Options";\r
99 static const WCHAR *kEncryptionMethod = L"EncryptionMethod";\r
100 \r
101 static void SetRegString(CKey &key, const WCHAR *name, const UString &value)\r
102 {\r
103   if (value.IsEmpty())\r
104     key.DeleteValue(name);\r
105   else\r
106     key.SetValue(name, value);\r
107 }\r
108 \r
109 static void SetRegUInt32(CKey &key, const TCHAR *name, UInt32 value)\r
110 {\r
111   if (value == (UInt32)-1)\r
112     key.DeleteValue(name);\r
113   else\r
114     key.SetValue(name, value);\r
115 }\r
116 \r
117 static void GetRegString(CKey &key, const WCHAR *name, UString &value)\r
118 {\r
119   if (key.QueryValue(name, value) != ERROR_SUCCESS)\r
120     value.Empty();\r
121 }\r
122 \r
123 static void GetRegUInt32(CKey &key, const TCHAR *name, UInt32 &value)\r
124 {\r
125   if (key.QueryValue(name, value) != ERROR_SUCCESS)\r
126     value = (UInt32)-1;\r
127 }\r
128 \r
129 void CInfo::Save() const\r
130 {\r
131   CS_LOCK\r
132 \r
133   CKey key;\r
134   CreateMainKey(key, kKeyName);\r
135   key.SetValue(kLevel, (UInt32)Level);\r
136   key.SetValue(kArchiver, ArcType);\r
137   key.SetValue(kShowPassword, ShowPassword);\r
138   key.SetValue(kEncryptHeaders, EncryptHeaders);\r
139   key.RecurseDeleteKey(kArcHistory);\r
140   key.SetValue_Strings(kArcHistory, ArcPaths);\r
141 \r
142   key.RecurseDeleteKey(kOptionsKeyName);\r
143   {\r
144     CKey optionsKey;\r
145     optionsKey.Create(key, kOptionsKeyName);\r
146     for (int i = 0; i < Formats.Size(); i++)\r
147     {\r
148       const CFormatOptions &fo = Formats[i];\r
149       CKey fk;\r
150       fk.Create(optionsKey, fo.FormatID);\r
151       \r
152       SetRegUInt32(fk, kLevel, fo.Level);\r
153       SetRegUInt32(fk, kDictionary, fo.Dictionary);\r
154       SetRegUInt32(fk, kOrder, fo.Order);\r
155       SetRegUInt32(fk, kBlockSize, fo.BlockLogSize);\r
156       SetRegUInt32(fk, kNumThreads, fo.NumThreads);\r
157 \r
158       SetRegString(fk, kMethod, fo.Method);\r
159       SetRegString(fk, kOptions, fo.Options);\r
160       SetRegString(fk, kEncryptionMethod, fo.EncryptionMethod);\r
161     }\r
162   }\r
163 }\r
164 \r
165 void CInfo::Load()\r
166 {\r
167   ArcPaths.Clear();\r
168   Formats.Clear();\r
169 \r
170   Level = 5;\r
171   ArcType = L"7z";\r
172   ShowPassword = false;\r
173   EncryptHeaders = false;\r
174 \r
175   CS_LOCK\r
176   CKey key;\r
177 \r
178   if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS)\r
179     return;\r
180 \r
181   key.GetValue_Strings(kArcHistory, ArcPaths);\r
182   \r
183   {\r
184     CKey optionsKey;\r
185     if (optionsKey.Open(key, kOptionsKeyName, KEY_READ) == ERROR_SUCCESS)\r
186     {\r
187       CSysStringVector formatIDs;\r
188       optionsKey.EnumKeys(formatIDs);\r
189       for (int i = 0; i < formatIDs.Size(); i++)\r
190       {\r
191         CKey fk;\r
192         CFormatOptions fo;\r
193         fo.FormatID = formatIDs[i];\r
194         if (fk.Open(optionsKey, fo.FormatID, KEY_READ) == ERROR_SUCCESS)\r
195         {\r
196           GetRegString(fk, kOptions, fo.Options);\r
197           GetRegString(fk, kMethod, fo.Method);\r
198           GetRegString(fk, kEncryptionMethod, fo.EncryptionMethod);\r
199 \r
200           GetRegUInt32(fk, kLevel, fo.Level);\r
201           GetRegUInt32(fk, kDictionary, fo.Dictionary);\r
202           GetRegUInt32(fk, kOrder, fo.Order);\r
203           GetRegUInt32(fk, kBlockSize, fo.BlockLogSize);\r
204           GetRegUInt32(fk, kNumThreads, fo.NumThreads);\r
205 \r
206           Formats.Add(fo);\r
207         }\r
208       }\r
209     }\r
210   }\r
211 \r
212   UString a;\r
213   if (key.QueryValue(kArchiver, a) == ERROR_SUCCESS)\r
214     ArcType = a;\r
215   key.GetValue_IfOk(kLevel, Level);\r
216   key.GetValue_IfOk(kShowPassword, ShowPassword);\r
217   key.GetValue_IfOk(kEncryptHeaders, EncryptHeaders);\r
218 }\r
219 \r
220 }\r
221 \r
222 static const TCHAR *kOptionsInfoKeyName = TEXT("Options");\r
223 \r
224 namespace NWorkDir\r
225 {\r
226 static const TCHAR *kWorkDirType = TEXT("WorkDirType");\r
227 static const WCHAR *kWorkDirPath = L"WorkDirPath";\r
228 static const TCHAR *kTempRemovableOnly = TEXT("TempRemovableOnly");\r
229 \r
230 \r
231 void CInfo::Save()const\r
232 {\r
233   CS_LOCK\r
234   CKey key;\r
235   CreateMainKey(key, kOptionsInfoKeyName);\r
236   key.SetValue(kWorkDirType, (UInt32)Mode);\r
237   key.SetValue(kWorkDirPath, Path);\r
238   key.SetValue(kTempRemovableOnly, ForRemovableOnly);\r
239 }\r
240 \r
241 void CInfo::Load()\r
242 {\r
243   SetDefault();\r
244 \r
245   CS_LOCK\r
246   CKey key;\r
247   if (OpenMainKey(key, kOptionsInfoKeyName) != ERROR_SUCCESS)\r
248     return;\r
249 \r
250   UInt32 dirType;\r
251   if (key.QueryValue(kWorkDirType, dirType) != ERROR_SUCCESS)\r
252     return;\r
253   switch (dirType)\r
254   {\r
255     case NMode::kSystem:\r
256     case NMode::kCurrent:\r
257     case NMode::kSpecified:\r
258       Mode = (NMode::EEnum)dirType;\r
259   }\r
260   if (key.QueryValue(kWorkDirPath, Path) != ERROR_SUCCESS)\r
261   {\r
262     Path.Empty();\r
263     if (Mode == NMode::kSpecified)\r
264       Mode = NMode::kSystem;\r
265   }\r
266   key.GetValue_IfOk(kTempRemovableOnly, ForRemovableOnly);\r
267 }\r
268 \r
269 }\r
270 \r
271 static const TCHAR *kCascadedMenu = TEXT("CascadedMenu");\r
272 static const TCHAR *kContextMenu = TEXT("ContextMenu");\r
273 \r
274 void CContextMenuInfo::Save() const\r
275 {\r
276   CS_LOCK\r
277   CKey key;\r
278   CreateMainKey(key, kOptionsInfoKeyName);\r
279   key.SetValue(kCascadedMenu, Cascaded);\r
280   key.SetValue(kContextMenu, Flags);\r
281 }\r
282 \r
283 void CContextMenuInfo::Load()\r
284 {\r
285   Cascaded = true;\r
286   Flags = (UInt32)-1;\r
287   CS_LOCK\r
288   CKey key;\r
289   if (OpenMainKey(key, kOptionsInfoKeyName) != ERROR_SUCCESS)\r
290     return;\r
291   key.GetValue_IfOk(kCascadedMenu, Cascaded);\r
292   key.GetValue_IfOk(kContextMenu, Flags);\r
293 }\r