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 }