5 #include "Common/IntToString.h"
\r
6 #include "Common/StringConvert.h"
\r
8 #include "Windows/FileDir.h"
\r
9 #include "Windows/Registry.h"
\r
10 #include "Windows/Synchronization.h"
\r
12 #include "ZipRegistry.h"
\r
14 using namespace NWindows;
\r
15 using namespace NRegistry;
\r
17 static NSynchronization::CCriticalSection g_CS;
\r
18 #define CS_LOCK NSynchronization::CCriticalSectionLock lock(g_CS);
\r
20 static const TCHAR *kCuPrefix = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-Zip") TEXT(STRING_PATH_SEPARATOR);
\r
22 static CSysString GetKeyPath(const CSysString &path) { return kCuPrefix + path; }
\r
24 static LONG OpenMainKey(CKey &key, LPCTSTR keyName)
\r
26 return key.Open(HKEY_CURRENT_USER, GetKeyPath(keyName), KEY_READ);
\r
29 static LONG CreateMainKey(CKey &key, LPCTSTR keyName)
\r
31 return key.Create(HKEY_CURRENT_USER, GetKeyPath(keyName));
\r
37 static const TCHAR *kKeyName = TEXT("Extraction");
\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
44 void CInfo::Save() const
\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
59 PathMode = NPathMode::kCurrentPathnames;
\r
60 OverwriteMode = NOverwriteMode::kAskBefore;
\r
61 ShowPassword = false;
\r
66 if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS)
\r
69 key.GetValue_Strings(kPathHistory, Paths);
\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
80 namespace NCompression
\r
83 static const TCHAR *kKeyName = TEXT("Compression");
\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
90 static const TCHAR *kOptionsKeyName = TEXT("Options");
\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
101 static void SetRegString(CKey &key, const WCHAR *name, const UString &value)
\r
103 if (value.IsEmpty())
\r
104 key.DeleteValue(name);
\r
106 key.SetValue(name, value);
\r
109 static void SetRegUInt32(CKey &key, const TCHAR *name, UInt32 value)
\r
111 if (value == (UInt32)-1)
\r
112 key.DeleteValue(name);
\r
114 key.SetValue(name, value);
\r
117 static void GetRegString(CKey &key, const WCHAR *name, UString &value)
\r
119 if (key.QueryValue(name, value) != ERROR_SUCCESS)
\r
123 static void GetRegUInt32(CKey &key, const TCHAR *name, UInt32 &value)
\r
125 if (key.QueryValue(name, value) != ERROR_SUCCESS)
\r
126 value = (UInt32)-1;
\r
129 void CInfo::Save() const
\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
142 key.RecurseDeleteKey(kOptionsKeyName);
\r
145 optionsKey.Create(key, kOptionsKeyName);
\r
146 for (int i = 0; i < Formats.Size(); i++)
\r
148 const CFormatOptions &fo = Formats[i];
\r
150 fk.Create(optionsKey, fo.FormatID);
\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
158 SetRegString(fk, kMethod, fo.Method);
\r
159 SetRegString(fk, kOptions, fo.Options);
\r
160 SetRegString(fk, kEncryptionMethod, fo.EncryptionMethod);
\r
172 ShowPassword = false;
\r
173 EncryptHeaders = false;
\r
178 if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS)
\r
181 key.GetValue_Strings(kArcHistory, ArcPaths);
\r
185 if (optionsKey.Open(key, kOptionsKeyName, KEY_READ) == ERROR_SUCCESS)
\r
187 CSysStringVector formatIDs;
\r
188 optionsKey.EnumKeys(formatIDs);
\r
189 for (int i = 0; i < formatIDs.Size(); i++)
\r
193 fo.FormatID = formatIDs[i];
\r
194 if (fk.Open(optionsKey, fo.FormatID, KEY_READ) == ERROR_SUCCESS)
\r
196 GetRegString(fk, kOptions, fo.Options);
\r
197 GetRegString(fk, kMethod, fo.Method);
\r
198 GetRegString(fk, kEncryptionMethod, fo.EncryptionMethod);
\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
213 if (key.QueryValue(kArchiver, a) == ERROR_SUCCESS)
\r
215 key.GetValue_IfOk(kLevel, Level);
\r
216 key.GetValue_IfOk(kShowPassword, ShowPassword);
\r
217 key.GetValue_IfOk(kEncryptHeaders, EncryptHeaders);
\r
222 static const TCHAR *kOptionsInfoKeyName = TEXT("Options");
\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
231 void CInfo::Save()const
\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
247 if (OpenMainKey(key, kOptionsInfoKeyName) != ERROR_SUCCESS)
\r
251 if (key.QueryValue(kWorkDirType, dirType) != ERROR_SUCCESS)
\r
255 case NMode::kSystem:
\r
256 case NMode::kCurrent:
\r
257 case NMode::kSpecified:
\r
258 Mode = (NMode::EEnum)dirType;
\r
260 if (key.QueryValue(kWorkDirPath, Path) != ERROR_SUCCESS)
\r
263 if (Mode == NMode::kSpecified)
\r
264 Mode = NMode::kSystem;
\r
266 key.GetValue_IfOk(kTempRemovableOnly, ForRemovableOnly);
\r
271 static const TCHAR *kCascadedMenu = TEXT("CascadedMenu");
\r
272 static const TCHAR *kContextMenu = TEXT("ContextMenu");
\r
274 void CContextMenuInfo::Save() const
\r
278 CreateMainKey(key, kOptionsInfoKeyName);
\r
279 key.SetValue(kCascadedMenu, Cascaded);
\r
280 key.SetValue(kContextMenu, Flags);
\r
283 void CContextMenuInfo::Load()
\r
286 Flags = (UInt32)-1;
\r
289 if (OpenMainKey(key, kOptionsInfoKeyName) != ERROR_SUCCESS)
\r
291 key.GetValue_IfOk(kCascadedMenu, Cascaded);
\r
292 key.GetValue_IfOk(kContextMenu, Flags);
\r