1*f6dc9357SAndroid Build Coastguard Worker // RegistryAssociations.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 "../../../Common/IntToString.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringToInt.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Registry.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #include "RegistryAssociations.h"
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
14*f6dc9357SAndroid Build Coastguard Worker using namespace NRegistry;
15*f6dc9357SAndroid Build Coastguard Worker
16*f6dc9357SAndroid Build Coastguard Worker namespace NRegistryAssoc {
17*f6dc9357SAndroid Build Coastguard Worker
18*f6dc9357SAndroid Build Coastguard Worker // static NSynchronization::CCriticalSection g_CriticalSection;
19*f6dc9357SAndroid Build Coastguard Worker
20*f6dc9357SAndroid Build Coastguard Worker static const TCHAR * const kClasses = TEXT("Software\\Classes\\");
21*f6dc9357SAndroid Build Coastguard Worker // static const TCHAR * const kShellNewKeyName = TEXT("ShellNew");
22*f6dc9357SAndroid Build Coastguard Worker // static const TCHAR * const kShellNewDataValueName = TEXT("Data");
23*f6dc9357SAndroid Build Coastguard Worker static const TCHAR * const kDefaultIconKeyName = TEXT("DefaultIcon");
24*f6dc9357SAndroid Build Coastguard Worker static const TCHAR * const kShellKeyName = TEXT("shell");
25*f6dc9357SAndroid Build Coastguard Worker static const TCHAR * const kOpenKeyName = TEXT("open");
26*f6dc9357SAndroid Build Coastguard Worker static const TCHAR * const kCommandKeyName = TEXT("command");
27*f6dc9357SAndroid Build Coastguard Worker static const char * const k7zipPrefix = "7-Zip.";
28*f6dc9357SAndroid Build Coastguard Worker
GetExtProgramKeyName(const CSysString & ext)29*f6dc9357SAndroid Build Coastguard Worker static CSysString GetExtProgramKeyName(const CSysString &ext)
30*f6dc9357SAndroid Build Coastguard Worker {
31*f6dc9357SAndroid Build Coastguard Worker return CSysString(k7zipPrefix) + ext;
32*f6dc9357SAndroid Build Coastguard Worker }
33*f6dc9357SAndroid Build Coastguard Worker
GetFullKeyPath(HKEY hkey,const CSysString & name)34*f6dc9357SAndroid Build Coastguard Worker static CSysString GetFullKeyPath(HKEY hkey, const CSysString &name)
35*f6dc9357SAndroid Build Coastguard Worker {
36*f6dc9357SAndroid Build Coastguard Worker CSysString s;
37*f6dc9357SAndroid Build Coastguard Worker if (hkey != HKEY_CLASSES_ROOT)
38*f6dc9357SAndroid Build Coastguard Worker s = kClasses;
39*f6dc9357SAndroid Build Coastguard Worker return s + name;
40*f6dc9357SAndroid Build Coastguard Worker }
41*f6dc9357SAndroid Build Coastguard Worker
GetExtKeyPath(HKEY hkey,const CSysString & ext)42*f6dc9357SAndroid Build Coastguard Worker static CSysString GetExtKeyPath(HKEY hkey, const CSysString &ext)
43*f6dc9357SAndroid Build Coastguard Worker {
44*f6dc9357SAndroid Build Coastguard Worker return GetFullKeyPath(hkey, (TEXT(".")) + ext);
45*f6dc9357SAndroid Build Coastguard Worker }
46*f6dc9357SAndroid Build Coastguard Worker
ReadFromRegistry(HKEY hkey,const CSysString & ext)47*f6dc9357SAndroid Build Coastguard Worker bool CShellExtInfo::ReadFromRegistry(HKEY hkey, const CSysString &ext)
48*f6dc9357SAndroid Build Coastguard Worker {
49*f6dc9357SAndroid Build Coastguard Worker ProgramKey.Empty();
50*f6dc9357SAndroid Build Coastguard Worker IconPath.Empty();
51*f6dc9357SAndroid Build Coastguard Worker IconIndex = -1;
52*f6dc9357SAndroid Build Coastguard Worker // NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
53*f6dc9357SAndroid Build Coastguard Worker {
54*f6dc9357SAndroid Build Coastguard Worker CKey extKey;
55*f6dc9357SAndroid Build Coastguard Worker if (extKey.Open(hkey, GetExtKeyPath(hkey, ext), KEY_READ) != ERROR_SUCCESS)
56*f6dc9357SAndroid Build Coastguard Worker return false;
57*f6dc9357SAndroid Build Coastguard Worker if (extKey.QueryValue(NULL, ProgramKey) != ERROR_SUCCESS)
58*f6dc9357SAndroid Build Coastguard Worker return false;
59*f6dc9357SAndroid Build Coastguard Worker }
60*f6dc9357SAndroid Build Coastguard Worker {
61*f6dc9357SAndroid Build Coastguard Worker CKey iconKey;
62*f6dc9357SAndroid Build Coastguard Worker
63*f6dc9357SAndroid Build Coastguard Worker if (iconKey.Open(hkey, GetFullKeyPath(hkey, ProgramKey + CSysString(CHAR_PATH_SEPARATOR) + kDefaultIconKeyName), KEY_READ) == ERROR_SUCCESS)
64*f6dc9357SAndroid Build Coastguard Worker {
65*f6dc9357SAndroid Build Coastguard Worker UString value;
66*f6dc9357SAndroid Build Coastguard Worker if (iconKey.QueryValue(NULL, value) == ERROR_SUCCESS)
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker const int pos = value.ReverseFind(L',');
69*f6dc9357SAndroid Build Coastguard Worker IconPath = value;
70*f6dc9357SAndroid Build Coastguard Worker if (pos >= 0)
71*f6dc9357SAndroid Build Coastguard Worker {
72*f6dc9357SAndroid Build Coastguard Worker const wchar_t *end;
73*f6dc9357SAndroid Build Coastguard Worker const Int32 index = ConvertStringToInt32((const wchar_t *)value + pos + 1, &end);
74*f6dc9357SAndroid Build Coastguard Worker if (*end == 0)
75*f6dc9357SAndroid Build Coastguard Worker {
76*f6dc9357SAndroid Build Coastguard Worker // 9.31: if there is no icon index, we use -1. Is it OK?
77*f6dc9357SAndroid Build Coastguard Worker if (pos != (int)value.Len() - 1)
78*f6dc9357SAndroid Build Coastguard Worker IconIndex = (int)index;
79*f6dc9357SAndroid Build Coastguard Worker IconPath.SetFrom(value, (unsigned)pos);
80*f6dc9357SAndroid Build Coastguard Worker }
81*f6dc9357SAndroid Build Coastguard Worker }
82*f6dc9357SAndroid Build Coastguard Worker }
83*f6dc9357SAndroid Build Coastguard Worker }
84*f6dc9357SAndroid Build Coastguard Worker }
85*f6dc9357SAndroid Build Coastguard Worker return true;
86*f6dc9357SAndroid Build Coastguard Worker }
87*f6dc9357SAndroid Build Coastguard Worker
IsIt7Zip() const88*f6dc9357SAndroid Build Coastguard Worker bool CShellExtInfo::IsIt7Zip() const
89*f6dc9357SAndroid Build Coastguard Worker {
90*f6dc9357SAndroid Build Coastguard Worker return ProgramKey.IsPrefixedBy_Ascii_NoCase(k7zipPrefix);
91*f6dc9357SAndroid Build Coastguard Worker }
92*f6dc9357SAndroid Build Coastguard Worker
DeleteShellExtensionInfo(HKEY hkey,const CSysString & ext)93*f6dc9357SAndroid Build Coastguard Worker LONG DeleteShellExtensionInfo(HKEY hkey, const CSysString &ext)
94*f6dc9357SAndroid Build Coastguard Worker {
95*f6dc9357SAndroid Build Coastguard Worker // NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
96*f6dc9357SAndroid Build Coastguard Worker CKey rootKey;
97*f6dc9357SAndroid Build Coastguard Worker rootKey.Attach(hkey);
98*f6dc9357SAndroid Build Coastguard Worker LONG res = rootKey.RecurseDeleteKey(GetExtKeyPath(hkey, ext));
99*f6dc9357SAndroid Build Coastguard Worker // then we delete only 7-Zip.* key.
100*f6dc9357SAndroid Build Coastguard Worker rootKey.RecurseDeleteKey(GetFullKeyPath(hkey, GetExtProgramKeyName(ext)));
101*f6dc9357SAndroid Build Coastguard Worker rootKey.Detach();
102*f6dc9357SAndroid Build Coastguard Worker return res;
103*f6dc9357SAndroid Build Coastguard Worker }
104*f6dc9357SAndroid Build Coastguard Worker
AddShellExtensionInfo(HKEY hkey,const CSysString & ext,const UString & programTitle,const UString & programOpenCommand,const UString & iconPath,int iconIndex)105*f6dc9357SAndroid Build Coastguard Worker LONG AddShellExtensionInfo(HKEY hkey,
106*f6dc9357SAndroid Build Coastguard Worker const CSysString &ext,
107*f6dc9357SAndroid Build Coastguard Worker const UString &programTitle,
108*f6dc9357SAndroid Build Coastguard Worker const UString &programOpenCommand,
109*f6dc9357SAndroid Build Coastguard Worker const UString &iconPath, int iconIndex
110*f6dc9357SAndroid Build Coastguard Worker // , const void *shellNewData, int shellNewDataSize
111*f6dc9357SAndroid Build Coastguard Worker )
112*f6dc9357SAndroid Build Coastguard Worker {
113*f6dc9357SAndroid Build Coastguard Worker LONG res = 0;
114*f6dc9357SAndroid Build Coastguard Worker DeleteShellExtensionInfo(hkey, ext);
115*f6dc9357SAndroid Build Coastguard Worker // NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
116*f6dc9357SAndroid Build Coastguard Worker CSysString programKeyName;
117*f6dc9357SAndroid Build Coastguard Worker {
118*f6dc9357SAndroid Build Coastguard Worker CSysString ext2 (ext);
119*f6dc9357SAndroid Build Coastguard Worker if (iconIndex < 0)
120*f6dc9357SAndroid Build Coastguard Worker ext2 = "*";
121*f6dc9357SAndroid Build Coastguard Worker programKeyName = GetExtProgramKeyName(ext2);
122*f6dc9357SAndroid Build Coastguard Worker }
123*f6dc9357SAndroid Build Coastguard Worker {
124*f6dc9357SAndroid Build Coastguard Worker CKey extKey;
125*f6dc9357SAndroid Build Coastguard Worker res = extKey.Create(hkey, GetExtKeyPath(hkey, ext));
126*f6dc9357SAndroid Build Coastguard Worker extKey.SetValue(NULL, programKeyName);
127*f6dc9357SAndroid Build Coastguard Worker /*
128*f6dc9357SAndroid Build Coastguard Worker if (shellNewData != NULL)
129*f6dc9357SAndroid Build Coastguard Worker {
130*f6dc9357SAndroid Build Coastguard Worker CKey shellNewKey;
131*f6dc9357SAndroid Build Coastguard Worker shellNewKey.Create(extKey, kShellNewKeyName);
132*f6dc9357SAndroid Build Coastguard Worker shellNewKey.SetValue(kShellNewDataValueName, shellNewData, shellNewDataSize);
133*f6dc9357SAndroid Build Coastguard Worker }
134*f6dc9357SAndroid Build Coastguard Worker */
135*f6dc9357SAndroid Build Coastguard Worker }
136*f6dc9357SAndroid Build Coastguard Worker CKey programKey;
137*f6dc9357SAndroid Build Coastguard Worker programKey.Create(hkey, GetFullKeyPath(hkey, programKeyName));
138*f6dc9357SAndroid Build Coastguard Worker programKey.SetValue(NULL, programTitle);
139*f6dc9357SAndroid Build Coastguard Worker {
140*f6dc9357SAndroid Build Coastguard Worker CKey iconKey;
141*f6dc9357SAndroid Build Coastguard Worker UString iconPathFull = iconPath;
142*f6dc9357SAndroid Build Coastguard Worker if (iconIndex < 0)
143*f6dc9357SAndroid Build Coastguard Worker iconIndex = 0;
144*f6dc9357SAndroid Build Coastguard Worker // if (iconIndex >= 0)
145*f6dc9357SAndroid Build Coastguard Worker {
146*f6dc9357SAndroid Build Coastguard Worker iconPathFull.Add_Char(',');
147*f6dc9357SAndroid Build Coastguard Worker iconPathFull.Add_UInt32((UInt32)iconIndex);
148*f6dc9357SAndroid Build Coastguard Worker }
149*f6dc9357SAndroid Build Coastguard Worker iconKey.Create(programKey, kDefaultIconKeyName);
150*f6dc9357SAndroid Build Coastguard Worker iconKey.SetValue(NULL, iconPathFull);
151*f6dc9357SAndroid Build Coastguard Worker }
152*f6dc9357SAndroid Build Coastguard Worker
153*f6dc9357SAndroid Build Coastguard Worker CKey shellKey;
154*f6dc9357SAndroid Build Coastguard Worker shellKey.Create(programKey, kShellKeyName);
155*f6dc9357SAndroid Build Coastguard Worker shellKey.SetValue(NULL, TEXT(""));
156*f6dc9357SAndroid Build Coastguard Worker
157*f6dc9357SAndroid Build Coastguard Worker CKey openKey;
158*f6dc9357SAndroid Build Coastguard Worker openKey.Create(shellKey, kOpenKeyName);
159*f6dc9357SAndroid Build Coastguard Worker openKey.SetValue(NULL, TEXT(""));
160*f6dc9357SAndroid Build Coastguard Worker
161*f6dc9357SAndroid Build Coastguard Worker CKey commandKey;
162*f6dc9357SAndroid Build Coastguard Worker commandKey.Create(openKey, kCommandKeyName);
163*f6dc9357SAndroid Build Coastguard Worker commandKey.SetValue(NULL, programOpenCommand);
164*f6dc9357SAndroid Build Coastguard Worker return res;
165*f6dc9357SAndroid Build Coastguard Worker }
166*f6dc9357SAndroid Build Coastguard Worker
167*f6dc9357SAndroid Build Coastguard Worker }
168