winget-cli

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

MsixManifest.cpp (3933B)


      1 // Copyright (c) Microsoft Corporation.
      2 // Licensed under the MIT License.
      3 #include <pch.h>
      4 #include <AppInstallerMsixInfo.h>
      5 #include <winget/MsixManifest.h>
      6 
      7 using namespace Microsoft::WRL;
      8 
      9 namespace AppInstaller::Msix
     10 {
     11     bool IsSupportedPlatform(MsixPackageManifestTargetDeviceFamily::Platform platform)
     12     {
     13         return platform == MsixPackageManifestTargetDeviceFamily::Platform::WindowsDesktop
     14             || platform == MsixPackageManifestTargetDeviceFamily::Platform::WindowsUniversal;
     15     }
     16 
     17     Utility::NormalizedString MsixPackageManifestIdentity::GetPackageFamilyName() const
     18     {
     19         wil::unique_cotaskmem_string familyName;
     20         THROW_IF_FAILED(m_packageId->GetPackageFamilyName(&familyName));
     21         return { familyName.get() };
     22     }
     23 
     24     PackageVersion MsixPackageManifestIdentity::GetVersion() const
     25     {
     26         UINT64 version = 0;
     27         THROW_IF_FAILED(m_packageId->GetVersion(&version));
     28         return PackageVersion{ version };
     29     }
     30 
     31     MsixPackageManifestIdentity MsixPackageManifest::GetIdentity() const
     32     {
     33         ComPtr<IAppxManifestPackageId> manifestPackageId;
     34         THROW_IF_FAILED(m_manifestReader->GetPackageId(&manifestPackageId));
     35         return MsixPackageManifestIdentity{ std::move(manifestPackageId) };
     36     }
     37 
     38     std::optional<OSVersion> MsixPackageManifest::GetMinimumOSVersionForSupportedPlatforms() const
     39     {
     40         std::optional<OSVersion> minOSVersion;
     41         auto targetDeviceFamilies = GetTargetDeviceFamilies();
     42 
     43         for (const auto& targetDeviceFamily : targetDeviceFamilies)
     44         {
     45             if (IsSupportedPlatform(targetDeviceFamily.GetPlatform()))
     46             {
     47                 auto targetDeviceFamilyMinVersion = targetDeviceFamily.GetMinVersion();
     48                 if (!minOSVersion.has_value() || targetDeviceFamilyMinVersion < minOSVersion.value())
     49                 {
     50                     minOSVersion = targetDeviceFamilyMinVersion;
     51                 }
     52             }
     53         }
     54 
     55         return minOSVersion;
     56     }
     57 
     58     std::vector<MsixPackageManifestTargetDeviceFamily> MsixPackageManifest::GetTargetDeviceFamilies() const
     59     {
     60         std::vector<MsixPackageManifestTargetDeviceFamily> targetDeviceFamilies;
     61         ComPtr<IAppxManifestReader3> manifestReader3;
     62         THROW_IF_FAILED(m_manifestReader.As(&manifestReader3));
     63 
     64         ComPtr<IAppxManifestTargetDeviceFamiliesEnumerator> targetDeviceFamiliesIter;
     65         THROW_IF_FAILED(manifestReader3->GetTargetDeviceFamilies(&targetDeviceFamiliesIter));
     66 
     67         BOOL hasCurrent = FALSE;
     68         THROW_IF_FAILED(targetDeviceFamiliesIter->GetHasCurrent(&hasCurrent));
     69         while (hasCurrent)
     70         {
     71             ComPtr<IAppxManifestTargetDeviceFamily> targetDeviceFamily;
     72             THROW_IF_FAILED(targetDeviceFamiliesIter->GetCurrent(&targetDeviceFamily));
     73 
     74             targetDeviceFamilies.emplace_back(std::move(targetDeviceFamily));
     75 
     76             THROW_IF_FAILED(targetDeviceFamiliesIter->MoveNext(&hasCurrent));
     77         }
     78 
     79         return targetDeviceFamilies;
     80     }
     81 
     82     std::string MsixPackageManifestTargetDeviceFamily::GetName() const
     83     {
     84         wil::unique_cotaskmem_string name;
     85         THROW_IF_FAILED(m_targetDeviceFamily->GetName(&name));
     86         return Utility::ConvertToUTF8(name.get());
     87     }
     88 
     89     OSVersion MsixPackageManifestTargetDeviceFamily::GetMinVersion() const
     90     {
     91         UINT64 minVersion = 0;
     92         THROW_IF_FAILED(m_targetDeviceFamily->GetMinVersion(&minVersion));
     93         return OSVersion{ minVersion };
     94     }
     95 
     96     MsixPackageManifestTargetDeviceFamily::Platform MsixPackageManifestTargetDeviceFamily::GetPlatform() const
     97     {
     98         auto name = GetName();
     99         if (Utility::CaseInsensitiveEquals(name, WindowsDesktopName))
    100         {
    101             return WindowsDesktop;
    102         }
    103 
    104         if (Utility::CaseInsensitiveEquals(name, WindowsUniversalName))
    105         {
    106             return WindowsUniversal;
    107         }
    108 
    109         return Other;
    110     }
    111 }