xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/RegistryAssociations.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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