PortableARPEntry.cpp (4888B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 #include "pch.h" 4 #include "winget/PortableARPEntry.h" 5 #include "winget/Manifest.h" 6 7 using namespace AppInstaller::Utility; 8 9 #define VALUENAMECASE(valueName) case PortableValueName::valueName: return s_##valueName; 10 11 namespace AppInstaller::Registry::Portable 12 { 13 namespace 14 { 15 constexpr std::wstring_view s_UninstallRegistryX64 = L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; 16 constexpr std::wstring_view s_UninstallRegistryX86 = L"Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; 17 constexpr std::wstring_view s_DisplayName = L"DisplayName"; 18 constexpr std::wstring_view s_DisplayVersion = L"DisplayVersion"; 19 constexpr std::wstring_view s_Publisher = L"Publisher"; 20 constexpr std::wstring_view s_InstallDate = L"InstallDate"; 21 constexpr std::wstring_view s_URLInfoAbout = L"URLInfoAbout"; 22 constexpr std::wstring_view s_HelpLink = L"HelpLink"; 23 constexpr std::wstring_view s_UninstallString = L"UninstallString"; 24 constexpr std::wstring_view s_WinGetInstallerType = L"WinGetInstallerType"; 25 constexpr std::wstring_view s_InstallLocation = L"InstallLocation"; 26 constexpr std::wstring_view s_PortableTargetFullPath = L"TargetFullPath"; 27 constexpr std::wstring_view s_PortableSymlinkFullPath = L"SymlinkFullPath"; 28 constexpr std::wstring_view s_SHA256 = L"SHA256"; 29 constexpr std::wstring_view s_WinGetPackageIdentifier = L"WinGetPackageIdentifier"; 30 constexpr std::wstring_view s_WinGetSourceIdentifier = L"WinGetSourceIdentifier"; 31 constexpr std::wstring_view s_InstallDirectoryCreated = L"InstallDirectoryCreated"; 32 constexpr std::wstring_view s_InstallDirectoryAddedToPath = L"InstallDirectoryAddedToPath"; 33 } 34 35 PortableARPEntry::PortableARPEntry(Manifest::ScopeEnum scope, Utility::Architecture arch, const std::string& productCode) 36 { 37 m_scope = scope; 38 m_arch = arch; 39 m_productCode = productCode; 40 41 if (m_scope == Manifest::ScopeEnum::Machine) 42 { 43 m_root = HKEY_LOCAL_MACHINE; 44 if (m_arch == Utility::Architecture::X64) 45 { 46 m_subKey = s_UninstallRegistryX64; 47 m_samDesired = KEY_WOW64_64KEY; 48 } 49 else 50 { 51 m_subKey = s_UninstallRegistryX86; 52 m_samDesired = KEY_WOW64_32KEY; 53 } 54 } 55 else 56 { 57 // HKCU uninstall registry share the x64 registry view. 58 m_root = HKEY_CURRENT_USER; 59 m_subKey = s_UninstallRegistryX64; 60 m_samDesired = KEY_WOW64_64KEY; 61 } 62 63 m_subKey += L"\\" + ConvertToUTF16(m_productCode); 64 m_key = Key::OpenIfExists(m_root, m_subKey, 0, KEY_ALL_ACCESS); 65 if (m_key != NULL) 66 { 67 m_exists = true; 68 } 69 else 70 { 71 m_exists = false; 72 m_key = Key::Create(m_root, m_subKey); 73 } 74 } 75 76 std::wstring_view ToString(PortableValueName valueName) 77 { 78 switch (valueName) 79 { 80 VALUENAMECASE(DisplayName); 81 VALUENAMECASE(DisplayVersion); 82 VALUENAMECASE(Publisher); 83 VALUENAMECASE(InstallDate); 84 VALUENAMECASE(URLInfoAbout); 85 VALUENAMECASE(HelpLink); 86 VALUENAMECASE(UninstallString); 87 VALUENAMECASE(WinGetInstallerType); 88 VALUENAMECASE(InstallLocation); 89 VALUENAMECASE(PortableTargetFullPath); 90 VALUENAMECASE(PortableSymlinkFullPath); 91 VALUENAMECASE(SHA256); 92 VALUENAMECASE(WinGetPackageIdentifier); 93 VALUENAMECASE(WinGetSourceIdentifier); 94 VALUENAMECASE(InstallDirectoryCreated); 95 VALUENAMECASE(InstallDirectoryAddedToPath); 96 default: return {}; 97 } 98 } 99 100 std::optional<Value> PortableARPEntry::operator[](PortableValueName valueName) const 101 { 102 return m_key[std::wstring{ ToString(valueName) }]; 103 } 104 105 void PortableARPEntry::SetValue(PortableValueName valueName, const std::wstring& value) 106 { 107 m_key.SetValue(std::wstring{ ToString(valueName) }, value, REG_SZ); 108 } 109 110 void PortableARPEntry::SetValue(PortableValueName valueName, const std::string_view& value) 111 { 112 m_key.SetValue(std::wstring{ ToString(valueName) }, ConvertToUTF16(value), REG_SZ); 113 } 114 115 void PortableARPEntry::SetValue(PortableValueName valueName, bool& value) 116 { 117 m_key.SetValue(std::wstring{ ToString(valueName) }, value); 118 } 119 120 void PortableARPEntry::Delete() 121 { 122 Registry::Key::Delete(m_root, m_subKey, m_samDesired); 123 } 124 }