5
#include "ZipRegistry.h"
7
#include "Common/IntToString.h"
8
#include "Common/StringConvert.h"
10
#include "Windows/Synchronization.h"
11
#include "Windows/Registry.h"
13
#include "Windows/FileDir.h"
15
using namespace NWindows;
16
using namespace NRegistry;
18
static const TCHAR *kCUBasePath = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-ZIP");
20
static NSynchronization::CCriticalSection g_RegistryOperationsCriticalSection;
22
//////////////////////
25
static const TCHAR *kExtractionKeyName = TEXT("Extraction");
27
static const TCHAR *kExtractionPathHistoryKeyName = TEXT("PathHistory");
28
static const TCHAR *kExtractionExtractModeValueName = TEXT("ExtarctMode");
29
static const TCHAR *kExtractionOverwriteModeValueName = TEXT("OverwriteMode");
30
static const TCHAR *kExtractionShowPasswordValueName = TEXT("ShowPassword");
32
static CSysString GetKeyPath(const CSysString &path)
34
return CSysString(kCUBasePath) + CSysString(CHAR_PATH_SEPARATOR) + path;
37
void SaveExtractionInfo(const NExtract::CInfo &info)
39
NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);
41
extractionKey.Create(HKEY_CURRENT_USER, GetKeyPath(kExtractionKeyName));
42
extractionKey.RecurseDeleteKey(kExtractionPathHistoryKeyName);
45
pathHistoryKey.Create(extractionKey, kExtractionPathHistoryKeyName);
46
for(int i = 0; i < info.Paths.Size(); i++)
48
wchar_t numberString[16];
49
ConvertUInt64ToString(i, numberString);
50
pathHistoryKey.SetValue(numberString, info.Paths[i]);
53
extractionKey.SetValue(kExtractionExtractModeValueName, UInt32(info.PathMode));
54
extractionKey.SetValue(kExtractionOverwriteModeValueName, UInt32(info.OverwriteMode));
55
extractionKey.SetValue(kExtractionShowPasswordValueName, info.ShowPassword);
58
void ReadExtractionInfo(NExtract::CInfo &info)
61
info.PathMode = NExtract::NPathMode::kCurrentPathnames;
62
info.OverwriteMode = NExtract::NOverwriteMode::kAskBefore;
63
info.ShowPassword = false;
65
NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);
67
if(extractionKey.Open(HKEY_CURRENT_USER, GetKeyPath(kExtractionKeyName), KEY_READ) != ERROR_SUCCESS)
72
if(pathHistoryKey.Open(extractionKey, kExtractionPathHistoryKeyName, KEY_READ) ==
77
wchar_t numberString[16];
78
ConvertUInt64ToString(info.Paths.Size(), numberString);
80
if (pathHistoryKey.QueryValue(numberString, path) != ERROR_SUCCESS)
86
UInt32 extractModeIndex;
87
if (extractionKey.QueryValue(kExtractionExtractModeValueName, extractModeIndex) == ERROR_SUCCESS)
89
switch (extractModeIndex)
91
case NExtract::NPathMode::kFullPathnames:
92
case NExtract::NPathMode::kCurrentPathnames:
93
case NExtract::NPathMode::kNoPathnames:
94
info.PathMode = NExtract::NPathMode::EEnum(extractModeIndex);
98
UInt32 overwriteModeIndex;
99
if (extractionKey.QueryValue(kExtractionOverwriteModeValueName, overwriteModeIndex) == ERROR_SUCCESS)
101
switch (overwriteModeIndex)
103
case NExtract::NOverwriteMode::kAskBefore:
104
case NExtract::NOverwriteMode::kWithoutPrompt:
105
case NExtract::NOverwriteMode::kSkipExisting:
106
case NExtract::NOverwriteMode::kAutoRename:
107
case NExtract::NOverwriteMode::kAutoRenameExisting:
108
info.OverwriteMode = NExtract::NOverwriteMode::EEnum(overwriteModeIndex);
112
if (extractionKey.QueryValue(kExtractionShowPasswordValueName,
113
info.ShowPassword) != ERROR_SUCCESS)
114
info.ShowPassword = false;
117
///////////////////////////////////
120
static const TCHAR *kCompressionKeyName = TEXT("Compression");
122
static const TCHAR *kCompressionHistoryArchivesKeyName = TEXT("ArcHistory");
123
static const TCHAR *kCompressionLevelValueName = TEXT("Level");
124
static const TCHAR *kCompressionLastFormatValueName = TEXT("Archiver");
125
static const TCHAR *kCompressionShowPasswordValueName = TEXT("ShowPassword");
126
static const TCHAR *kCompressionEncryptHeadersValueName = TEXT("EncryptHeaders");
128
static const TCHAR *kCompressionOptionsKeyName = TEXT("Options");
129
// static const TCHAR *kSolid = TEXT("Solid");
130
// static const TCHAR *kMultiThread = TEXT("Multithread");
132
static const WCHAR *kCompressionOptions = L"Options";
133
static const TCHAR *kCompressionLevel = TEXT("Level");
134
static const WCHAR *kCompressionMethod = L"Method";
135
static const WCHAR *kEncryptionMethod = L"EncryptionMethod";
136
static const TCHAR *kCompressionDictionary = TEXT("Dictionary");
137
static const TCHAR *kCompressionOrder = TEXT("Order");
138
static const TCHAR *kCompressionNumThreads = TEXT("NumThreads");
139
static const TCHAR *kCompressionBlockSize = TEXT("BlockSize");
142
static void SetRegString(CKey &key, const WCHAR *name, const UString &value)
145
key.DeleteValue(name);
147
key.SetValue(name, value);
150
static void SetRegUInt32(CKey &key, const TCHAR *name, UInt32 value)
152
if (value == (UInt32)-1)
153
key.DeleteValue(name);
155
key.SetValue(name, value);
158
static void GetRegString(CKey &key, const WCHAR *name, UString &value)
160
if (key.QueryValue(name, value) != ERROR_SUCCESS)
164
static void GetRegUInt32(CKey &key, const TCHAR *name, UInt32 &value)
166
if (key.QueryValue(name, value) != ERROR_SUCCESS)
170
void SaveCompressionInfo(const NCompression::CInfo &info)
172
NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);
175
compressionKey.Create(HKEY_CURRENT_USER, GetKeyPath(kCompressionKeyName));
176
compressionKey.RecurseDeleteKey(kCompressionHistoryArchivesKeyName);
178
CKey historyArchivesKey;
179
historyArchivesKey.Create(compressionKey, kCompressionHistoryArchivesKeyName);
180
for(int i = 0; i < info.HistoryArchives.Size(); i++)
182
wchar_t numberString[16];
183
ConvertUInt64ToString(i, numberString);
184
historyArchivesKey.SetValue(numberString, info.HistoryArchives[i]);
188
// compressionKey.SetValue(kSolid, info.Solid);
189
// compressionKey.SetValue(kMultiThread, info.MultiThread);
190
compressionKey.RecurseDeleteKey(kCompressionOptionsKeyName);
193
optionsKey.Create(compressionKey, kCompressionOptionsKeyName);
194
for(int i = 0; i < info.FormatOptionsVector.Size(); i++)
196
const NCompression::CFormatOptions &fo = info.FormatOptionsVector[i];
198
formatKey.Create(optionsKey, fo.FormatID);
200
SetRegString(formatKey, kCompressionOptions, fo.Options);
201
SetRegString(formatKey, kCompressionMethod, fo.Method);
202
SetRegString(formatKey, kEncryptionMethod, fo.EncryptionMethod);
204
SetRegUInt32(formatKey, kCompressionLevel, fo.Level);
205
SetRegUInt32(formatKey, kCompressionDictionary, fo.Dictionary);
206
SetRegUInt32(formatKey, kCompressionOrder, fo.Order);
207
SetRegUInt32(formatKey, kCompressionBlockSize, fo.BlockLogSize);
208
SetRegUInt32(formatKey, kCompressionNumThreads, fo.NumThreads);
212
compressionKey.SetValue(kCompressionLevelValueName, UInt32(info.Level));
213
compressionKey.SetValue(kCompressionLastFormatValueName, GetSystemString(info.ArchiveType));
215
compressionKey.SetValue(kCompressionShowPasswordValueName, info.ShowPassword);
216
compressionKey.SetValue(kCompressionEncryptHeadersValueName, info.EncryptHeaders);
217
// compressionKey.SetValue(kCompressionMaximizeValueName, info.Maximize);
220
void ReadCompressionInfo(NCompression::CInfo &info)
222
info.HistoryArchives.Clear();
224
// info.Solid = true;
225
// info.MultiThread = IsMultiProcessor();
226
info.FormatOptionsVector.Clear();
229
info.ArchiveType = L"7z";
230
// definedStatus.Maximize = false;
231
info.ShowPassword = false;
232
info.EncryptHeaders = false;
234
NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);
237
if(compressionKey.Open(HKEY_CURRENT_USER,
238
GetKeyPath(kCompressionKeyName), KEY_READ) != ERROR_SUCCESS)
242
CKey historyArchivesKey;
243
if(historyArchivesKey.Open(compressionKey, kCompressionHistoryArchivesKeyName, KEY_READ) ==
248
wchar_t numberString[16];
249
ConvertUInt64ToString(info.HistoryArchives.Size(), numberString);
251
if (historyArchivesKey.QueryValue(numberString, path) != ERROR_SUCCESS)
253
info.HistoryArchives.Add(path);
261
if (compressionKey.QueryValue(kSolid, solid) == ERROR_SUCCESS)
263
bool multiThread = false;
264
if (compressionKey.QueryValue(kMultiThread, multiThread) == ERROR_SUCCESS)
265
info.MultiThread = multiThread;
270
if(optionsKey.Open(compressionKey, kCompressionOptionsKeyName, KEY_READ) ==
273
CSysStringVector formatIDs;
274
optionsKey.EnumKeys(formatIDs);
275
for(int i = 0; i < formatIDs.Size(); i++)
278
NCompression::CFormatOptions fo;
279
fo.FormatID = formatIDs[i];
280
if(formatKey.Open(optionsKey, fo.FormatID, KEY_READ) == ERROR_SUCCESS)
282
GetRegString(formatKey, kCompressionOptions, fo.Options);
283
GetRegString(formatKey, kCompressionMethod, fo.Method);
284
GetRegString(formatKey, kEncryptionMethod, fo.EncryptionMethod);
286
GetRegUInt32(formatKey, kCompressionLevel, fo.Level);
287
GetRegUInt32(formatKey, kCompressionDictionary, fo.Dictionary);
288
GetRegUInt32(formatKey, kCompressionOrder, fo.Order);
289
GetRegUInt32(formatKey, kCompressionBlockSize, fo.BlockLogSize);
290
GetRegUInt32(formatKey, kCompressionNumThreads, fo.NumThreads);
292
info.FormatOptionsVector.Add(fo);
300
if (compressionKey.QueryValue(kCompressionLevelValueName, level) == ERROR_SUCCESS)
302
CSysString archiveType;
303
if (compressionKey.QueryValue(kCompressionLastFormatValueName, archiveType) == ERROR_SUCCESS)
304
info.ArchiveType = GetUnicodeString(archiveType);
305
if (compressionKey.QueryValue(kCompressionShowPasswordValueName,
306
info.ShowPassword) != ERROR_SUCCESS)
307
info.ShowPassword = false;
308
if (compressionKey.QueryValue(kCompressionEncryptHeadersValueName,
309
info.EncryptHeaders) != ERROR_SUCCESS)
310
info.EncryptHeaders = false;
312
if (compressionKey.QueryValue(kCompressionLevelValueName, info.Maximize) == ERROR_SUCCESS)
313
definedStatus.Maximize = true;
318
///////////////////////////////////
321
static const TCHAR *kOptionsInfoKeyName = TEXT("Options");
323
static const TCHAR *kWorkDirTypeValueName = TEXT("WorkDirType");
324
static const WCHAR *kWorkDirPathValueName = L"WorkDirPath";
325
static const TCHAR *kTempRemovableOnlyValueName = TEXT("TempRemovableOnly");
326
static const TCHAR *kCascadedMenuValueName = TEXT("CascadedMenu");
327
static const TCHAR *kContextMenuValueName = TEXT("ContextMenu");
329
void SaveWorkDirInfo(const NWorkDir::CInfo &info)
331
NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);
333
optionsKey.Create(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName));
334
optionsKey.SetValue(kWorkDirTypeValueName, UInt32(info.Mode));
335
optionsKey.SetValue(kWorkDirPathValueName, info.Path);
336
optionsKey.SetValue(kTempRemovableOnlyValueName, info.ForRemovableOnly);
339
void ReadWorkDirInfo(NWorkDir::CInfo &info)
343
NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);
345
if(optionsKey.Open(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName), KEY_READ) != ERROR_SUCCESS)
349
if (optionsKey.QueryValue(kWorkDirTypeValueName, dirType) != ERROR_SUCCESS)
353
case NWorkDir::NMode::kSystem:
354
case NWorkDir::NMode::kCurrent:
355
case NWorkDir::NMode::kSpecified:
356
info.Mode = NWorkDir::NMode::EEnum(dirType);
359
if (optionsKey.QueryValue(kWorkDirPathValueName, sysWorkDir) != ERROR_SUCCESS)
362
if (info.Mode == NWorkDir::NMode::kSpecified)
363
info.Mode = NWorkDir::NMode::kSystem;
365
info.Path = GetUnicodeString(sysWorkDir);
366
if (optionsKey.QueryValue(kTempRemovableOnlyValueName, info.ForRemovableOnly) != ERROR_SUCCESS)
367
info.SetForRemovableOnlyDefault();
370
static void SaveOption(const TCHAR *value, bool enabled)
372
NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);
374
optionsKey.Create(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName));
375
optionsKey.SetValue(value, enabled);
378
static bool ReadOption(const TCHAR *value, bool defaultValue)
380
NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);
382
if(optionsKey.Open(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName), KEY_READ) != ERROR_SUCCESS)
385
if (optionsKey.QueryValue(value, enabled) != ERROR_SUCCESS)
390
void SaveCascadedMenu(bool show)
391
{ SaveOption(kCascadedMenuValueName, show); }
392
bool ReadCascadedMenu()
393
{ return ReadOption(kCascadedMenuValueName, true); }
396
static void SaveValue(const TCHAR *value, UInt32 valueToWrite)
398
NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);
400
optionsKey.Create(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName));
401
optionsKey.SetValue(value, valueToWrite);
404
static bool ReadValue(const TCHAR *value, UInt32 &result)
406
NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);
408
if(optionsKey.Open(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName), KEY_READ) != ERROR_SUCCESS)
410
return (optionsKey.QueryValue(value, result) == ERROR_SUCCESS);
413
void SaveContextMenuStatus(UInt32 value)
414
{ SaveValue(kContextMenuValueName, value); }
416
bool ReadContextMenuStatus(UInt32 &value)
417
{ return ReadValue(kContextMenuValueName, value); }