winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }