diff --git a/WindowsAppRuntime.sln b/WindowsAppRuntime.sln index 0e802693e6..e9bd3244f5 100644 --- a/WindowsAppRuntime.sln +++ b/WindowsAppRuntime.sln @@ -192,10 +192,19 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CS", "CS", "{716C26A0-E6B0-4981-8412-D14A4D410531}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.ApplicationModel.DynamicDependency.Projection", "dev\Projections\CS\Microsoft.Windows.ApplicationModel.DynamicDependency\Microsoft.Windows.ApplicationModel.DynamicDependency.Projection.csproj", "{47D8D21D-F022-4D58-8DB2-8B467756E08C}" + ProjectSection(ProjectDependencies) = postProject + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.ApplicationModel.WindowsAppRuntime.Projection", "dev\Projections\CS\Microsoft.Windows.ApplicationModel.WindowsAppRuntime\Microsoft.Windows.ApplicationModel.WindowsAppRuntime.Projection.csproj", "{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}" + ProjectSection(ProjectDependencies) = postProject + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.AppLifecycle.Projection", "dev\Projections\CS\Microsoft.Windows.AppLifecycle\Microsoft.Windows.AppLifecycle.Projection.csproj", "{D417EDBE-D783-484F-83F3-710DEC7CB585}" + ProjectSection(ProjectDependencies) = postProject + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WindowsAppRuntime.Test.Singleton.Msix", "test\DynamicDependency\data\WindowsAppRuntime.Test.Singleton.Msix\WindowsAppRuntime.Test.Singleton.Msix.vcxproj", "{8F2C21F1-47AB-428C-A110-EE33FD7D9493}" EndProject @@ -220,10 +229,19 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.WindowsAppRuntime.Bootstrap.Net", "dev\Bootstrap\CS\Microsoft.WindowsAppRuntime.Bootstrap.Net\Microsoft.WindowsAppRuntime.Bootstrap.Net.csproj", "{D6574FD6-8D13-4412-9FCB-308D44063CDA}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.System.Power.Projection", "dev\Projections\CS\Microsoft.Windows.System.Power\Microsoft.Windows.System.Power.Projection.csproj", "{63ACBA4F-385A-4D04-98AD-263FED501A19}" + ProjectSection(ProjectDependencies) = postProject + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.System.Projection", "dev\Projections\CS\Microsoft.Windows.System\Microsoft.Windows.System.Projection.csproj", "{85E9BB46-7841-4732-A039-9C902B71DEC3}" + ProjectSection(ProjectDependencies) = postProject + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.PushNotifications.Projection", "dev\Projections\CS\Microsoft.Windows.PushNotifications.Projection\Microsoft.Windows.PushNotifications.Projection.csproj", "{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}" + ProjectSection(ProjectDependencies) = postProject + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Deployment", "Deployment", "{68E63911-6283-4212-BFFE-3F972AF8F835}" EndProject @@ -301,6 +319,9 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AppNotifications", "dev\AppNotifications\AppNotifications.vcxitems", "{B4824897-88E0-4927-8FB9-E60106F01ED9}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.AppNotifications.Projection", "dev\Projections\CS\Microsoft.Windows.AppNotifications.Projection\Microsoft.Windows.AppNotifications.Projection.csproj", "{2385A443-A1C2-4562-8D28-D0AD239EE5E7}" + ProjectSection(ProjectDependencies) = postProject + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{82A73181-EA4A-431A-B82B-BE6734604CC9}" EndProject @@ -344,6 +365,9 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AppNotificationBuilderTests", "test\AppNotificationBuilderTests\AppNotificationBuilderTests.vcxproj", "{131DE0C4-AA1E-4649-B5BC-7B43508FA93A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.Security.AccessControl.Projection", "dev\Projections\CS\Microsoft.Windows.Security.AccessControl.Projection\Microsoft.Windows.Security.AccessControl.Projection.csproj", "{E6D59245-696F-4D13-ACF6-7ECE6E653367}" + ProjectSection(ProjectDependencies) = postProject + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "API", "API", "{0D6B1FF3-A075-4194-9FC0-AF7BB89D0519}" EndProject @@ -401,6 +425,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test_DeploymentManagerAutoI EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.AppNotifications.Builder.Projection", "dev\Projections\CS\Microsoft.Windows.AppNotifications.Builder.Projection\Microsoft.Windows.AppNotifications.Builder.Projection.csproj", "{50BF3E96-3050-4053-B012-BF6993483DA5}" + ProjectSection(ProjectDependencies) = postProject + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NotificationTests", "NotificationTests", "{1FDC307C-2DB7-4B40-8F18-F1057E9E0969}" EndProject @@ -626,6 +653,9 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "KozaniRemoteManagerLauncher", "KozaniRemoteManagerLauncher", "{C5408A09-CDB4-41C1-8766-7677757EB7F2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KozaniRemoteManagerLauncher", "dev\Kozani\KozaniRemoteManagerLauncher\KozaniRemoteManagerLauncher.vcxproj", "{45C50DA4-F2C7-4A4B-8493-50E5DF17B527}" + ProjectSection(ProjectDependencies) = postProject + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KozaniRemoteManager.Msix", "test\Kozani\data\KozaniRemoteManager.Msix\KozaniRemoteManager.Msix.vcxproj", "{A18E00C4-3668-4289-ABFC-D1DF330DA6BF}" EndProject @@ -633,6 +663,46 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "KozaniProtocol", "KozaniPro EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KozaniProtocol", "dev\Kozani\KozaniProtocol\KozaniProtocol.vcxproj", "{3F28C3ED-2548-4530-8B6C-832FAE0E993D}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PackageManager", "PackageManager", "{380C8BE1-1868-4860-BD32-ADCD8683285D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "API", "API", "{CC969A0B-9B01-479D-A563-C9866BCC6F83}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PackageManager", "dev\PackageManager\API\PackageManager.vcxitems", "{8A9A0C85-65A8-4BCA-A49E-45FC4FDBC7D2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PackageManager", "PackageManager", "{B03C7C69-0A52-4553-B465-04C995161E42}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "API", "API", "{4B85FB26-28B6-4072-85C2-DB7B5FEB98BE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PackageManagerTests", "test\PackageManager\API\PackageManagerTests.vcxproj", "{4A38CB80-3580-4960-9B31-3301058B7AFE}" + ProjectSection(ProjectDependencies) = postProject + {09DDAE21-397F-4263-8561-7F2FF28127CF} = {09DDAE21-397F-4263-8561-7F2FF28127CF} + {4626E11F-A7A4-41A2-B22D-5A108BC369AC} = {4626E11F-A7A4-41A2-B22D-5A108BC369AC} + {58E95711-A12F-4C0E-A978-C6B4A0842AC8} = {58E95711-A12F-4C0E-A978-C6B4A0842AC8} + {66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3} = {66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3} + {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1} + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2} = {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2} + {F2946790-DAF7-4DFF-A754-BA471A12E494} = {F2946790-DAF7-4DFF-A754-BA471A12E494} + {FBAE1876-C50A-4EFC-A686-3008B6438731} = {FBAE1876-C50A-4EFC-A686-3008B6438731} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "data", "data", "{6213B1A3-E854-498F-AAFA-4CFC1E71023E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PackageManager.Test.F.Red.Msix", "PackageManager.Test.F.Red.Msix", "{5188EBDF-87AE-4CA1-AA44-AD743583FF2D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PackageManager.Test.F.Red.Msix", "test\PackageManager\data\PackageManager.Test.F.Red.Msix\PackageManager.Test.F.Red.Msix.vcxproj", "{F2946790-DAF7-4DFF-A754-BA471A12E494}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PackageManager.Test.F.Green.Msix", "PackageManager.Test.F.Green.Msix", "{266AE21F-0D59-4422-A95C-4B3D2BA32A4C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PackageManager.Test.F.Green.msix", "test\PackageManager\data\PackageManager.Test.F.Green.msix\PackageManager.Test.F.Green.msix.vcxproj", "{4626E11F-A7A4-41A2-B22D-5A108BC369AC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PackageManager.Test.F.Blue.Msix", "PackageManager.Test.F.Blue.Msix", "{39A17DBB-F1DB-4D0C-B90E-D5F9BEC2283A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PackageManager.Test.F.Blue.msix", "test\PackageManager\data\PackageManager.Test.F.Blue.msix\PackageManager.Test.F.Blue.msix.vcxproj", "{FBAE1876-C50A-4EFC-A686-3008B6438731}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PackageManager.Test.F.Redder.Msix", "PackageManager.Test.F.Redder.Msix", "{B6B68924-6A0B-457E-AD53-018696EC8889}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PackageManager.Test.F.Redder.msix", "test\PackageManager\data\PackageManager.Test.F.Redder.msix\PackageManager.Test.F.Redder.msix.vcxproj", "{D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -2243,6 +2313,86 @@ Global {3F28C3ED-2548-4530-8B6C-832FAE0E993D}.Release|x64.Build.0 = Release|x64 {3F28C3ED-2548-4530-8B6C-832FAE0E993D}.Release|x86.ActiveCfg = Release|Win32 {3F28C3ED-2548-4530-8B6C-832FAE0E993D}.Release|x86.Build.0 = Release|Win32 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Debug|Any CPU.ActiveCfg = Debug|x64 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Debug|Any CPU.Build.0 = Debug|x64 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Debug|ARM64.Build.0 = Debug|ARM64 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Debug|x64.ActiveCfg = Debug|x64 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Debug|x64.Build.0 = Debug|x64 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Debug|x86.ActiveCfg = Debug|Win32 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Debug|x86.Build.0 = Debug|Win32 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Release|Any CPU.ActiveCfg = Release|x64 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Release|Any CPU.Build.0 = Release|x64 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Release|ARM64.ActiveCfg = Release|ARM64 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Release|ARM64.Build.0 = Release|ARM64 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Release|x64.ActiveCfg = Release|x64 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Release|x64.Build.0 = Release|x64 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Release|x86.ActiveCfg = Release|Win32 + {4A38CB80-3580-4960-9B31-3301058B7AFE}.Release|x86.Build.0 = Release|Win32 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Debug|Any CPU.ActiveCfg = Debug|x64 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Debug|Any CPU.Build.0 = Debug|x64 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Debug|ARM64.Build.0 = Debug|ARM64 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Debug|x64.ActiveCfg = Debug|x64 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Debug|x64.Build.0 = Debug|x64 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Debug|x86.ActiveCfg = Debug|Win32 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Debug|x86.Build.0 = Debug|Win32 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Release|Any CPU.ActiveCfg = Release|x64 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Release|Any CPU.Build.0 = Release|x64 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Release|ARM64.ActiveCfg = Release|ARM64 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Release|ARM64.Build.0 = Release|ARM64 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Release|x64.ActiveCfg = Release|x64 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Release|x64.Build.0 = Release|x64 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Release|x86.ActiveCfg = Release|Win32 + {F2946790-DAF7-4DFF-A754-BA471A12E494}.Release|x86.Build.0 = Release|Win32 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Debug|Any CPU.ActiveCfg = Debug|x64 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Debug|Any CPU.Build.0 = Debug|x64 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Debug|ARM64.Build.0 = Debug|ARM64 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Debug|x64.ActiveCfg = Debug|x64 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Debug|x64.Build.0 = Debug|x64 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Debug|x86.ActiveCfg = Debug|Win32 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Debug|x86.Build.0 = Debug|Win32 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Release|Any CPU.ActiveCfg = Release|x64 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Release|Any CPU.Build.0 = Release|x64 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Release|ARM64.ActiveCfg = Release|ARM64 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Release|ARM64.Build.0 = Release|ARM64 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Release|x64.ActiveCfg = Release|x64 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Release|x64.Build.0 = Release|x64 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Release|x86.ActiveCfg = Release|Win32 + {4626E11F-A7A4-41A2-B22D-5A108BC369AC}.Release|x86.Build.0 = Release|Win32 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Debug|Any CPU.ActiveCfg = Debug|x64 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Debug|Any CPU.Build.0 = Debug|x64 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Debug|ARM64.Build.0 = Debug|ARM64 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Debug|x64.ActiveCfg = Debug|x64 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Debug|x64.Build.0 = Debug|x64 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Debug|x86.ActiveCfg = Debug|Win32 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Debug|x86.Build.0 = Debug|Win32 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Release|Any CPU.ActiveCfg = Release|x64 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Release|Any CPU.Build.0 = Release|x64 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Release|ARM64.ActiveCfg = Release|ARM64 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Release|ARM64.Build.0 = Release|ARM64 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Release|x64.ActiveCfg = Release|x64 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Release|x64.Build.0 = Release|x64 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Release|x86.ActiveCfg = Release|Win32 + {FBAE1876-C50A-4EFC-A686-3008B6438731}.Release|x86.Build.0 = Release|Win32 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Debug|Any CPU.ActiveCfg = Debug|x64 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Debug|Any CPU.Build.0 = Debug|x64 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Debug|ARM64.Build.0 = Debug|ARM64 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Debug|x64.ActiveCfg = Debug|x64 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Debug|x64.Build.0 = Debug|x64 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Debug|x86.ActiveCfg = Debug|Win32 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Debug|x86.Build.0 = Debug|Win32 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|Any CPU.ActiveCfg = Release|x64 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|Any CPU.Build.0 = Release|x64 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|ARM64.ActiveCfg = Release|ARM64 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|ARM64.Build.0 = Release|ARM64 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|x64.ActiveCfg = Release|x64 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|x64.Build.0 = Release|x64 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|x86.ActiveCfg = Release|Win32 + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2436,6 +2586,21 @@ Global {A18E00C4-3668-4289-ABFC-D1DF330DA6BF} = {9CE0ED94-078A-405F-8599-BFC2D8D6E537} {82197F64-3A88-4C48-AEF9-7E62E71D75BB} = {84F66485-4391-41C7-89CB-D5006EDF1383} {3F28C3ED-2548-4530-8B6C-832FAE0E993D} = {82197F64-3A88-4C48-AEF9-7E62E71D75BB} + {380C8BE1-1868-4860-BD32-ADCD8683285D} = {448ED2E5-0B37-4D97-9E6B-8C10A507976A} + {CC969A0B-9B01-479D-A563-C9866BCC6F83} = {380C8BE1-1868-4860-BD32-ADCD8683285D} + {8A9A0C85-65A8-4BCA-A49E-45FC4FDBC7D2} = {CC969A0B-9B01-479D-A563-C9866BCC6F83} + {B03C7C69-0A52-4553-B465-04C995161E42} = {8630F7AA-2969-4DC9-8700-9B468C1DC21D} + {4B85FB26-28B6-4072-85C2-DB7B5FEB98BE} = {B03C7C69-0A52-4553-B465-04C995161E42} + {4A38CB80-3580-4960-9B31-3301058B7AFE} = {4B85FB26-28B6-4072-85C2-DB7B5FEB98BE} + {6213B1A3-E854-498F-AAFA-4CFC1E71023E} = {B03C7C69-0A52-4553-B465-04C995161E42} + {5188EBDF-87AE-4CA1-AA44-AD743583FF2D} = {6213B1A3-E854-498F-AAFA-4CFC1E71023E} + {F2946790-DAF7-4DFF-A754-BA471A12E494} = {5188EBDF-87AE-4CA1-AA44-AD743583FF2D} + {266AE21F-0D59-4422-A95C-4B3D2BA32A4C} = {6213B1A3-E854-498F-AAFA-4CFC1E71023E} + {4626E11F-A7A4-41A2-B22D-5A108BC369AC} = {266AE21F-0D59-4422-A95C-4B3D2BA32A4C} + {39A17DBB-F1DB-4D0C-B90E-D5F9BEC2283A} = {6213B1A3-E854-498F-AAFA-4CFC1E71023E} + {FBAE1876-C50A-4EFC-A686-3008B6438731} = {39A17DBB-F1DB-4D0C-B90E-D5F9BEC2283A} + {B6B68924-6A0B-457E-AD53-018696EC8889} = {B03C7C69-0A52-4553-B465-04C995161E42} + {D0A1DFB8-8CEE-4CFC-B57B-B7C574B411C2} = {B6B68924-6A0B-457E-AD53-018696EC8889} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4B3D7591-CFEC-4762-9A07-ABE99938FB77} @@ -2454,6 +2619,7 @@ Global dev\Kozani\Common\Common.vcxitems*{829cdb09-eefe-4188-a045-3fc6be7bd96b}*SharedItemsImports = 4 dev\Common\Common.vcxitems*{8828053c-d6ec-4744-8624-f8c676c2d4df}*SharedItemsImports = 9 dev\Licensing\Licensing.vcxitems*{885a43fa-052d-4b0d-a2dc-13ee15796435}*SharedItemsImports = 9 + dev\PackageManager\API\PackageManager.vcxitems*{8a9a0c85-65a8-4bca-a49e-45fc4fdbc7d2}*SharedItemsImports = 9 test\inc\inc.vcxitems*{8e52d7ea-a200-4a6b-ba74-8efb49468caf}*SharedItemsImports = 4 dev\Kozani\Common\Common.vcxitems*{a11c6664-f26a-4e71-b440-2e4e1ba09a93}*SharedItemsImports = 4 dev\AppNotifications\AppNotifications.vcxitems*{b4824897-88e0-4927-8fb9-e60106f01ed9}*SharedItemsImports = 9 @@ -2461,6 +2627,7 @@ Global dev\Common\Common.vcxitems*{b73ad907-6164-4294-88fb-f3c9c10da1f1}*SharedItemsImports = 4 dev\DynamicDependency\API\DynamicDependency.vcxitems*{b73ad907-6164-4294-88fb-f3c9c10da1f1}*SharedItemsImports = 4 dev\Licensing\Licensing.vcxitems*{b73ad907-6164-4294-88fb-f3c9c10da1f1}*SharedItemsImports = 4 + dev\PackageManager\API\PackageManager.vcxitems*{b73ad907-6164-4294-88fb-f3c9c10da1f1}*SharedItemsImports = 4 dev\PowerNotifications\PowerNotifications.vcxitems*{b73ad907-6164-4294-88fb-f3c9c10da1f1}*SharedItemsImports = 4 dev\UndockedRegFreeWinRT\UndockedRegFreeWinRT.vcxitems*{b73ad907-6164-4294-88fb-f3c9c10da1f1}*SharedItemsImports = 4 dev\PowerNotifications\PowerNotifications.vcxitems*{b75c1b22-553c-40e4-b38e-6ab4d01fdb9d}*SharedItemsImports = 9 diff --git a/dev/Common/AppModel.Identity.h b/dev/Common/AppModel.Identity.h index d975c4e82f..fa0f646b29 100644 --- a/dev/Common/AppModel.Identity.h +++ b/dev/Common/AppModel.Identity.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #ifndef __APPMODEL_IDENTITY_H @@ -6,6 +6,9 @@ #include +#include +#include + namespace AppModel::Identity { inline bool IsPackagedProcess() @@ -46,6 +49,34 @@ constexpr PCWSTR GetCurrentArchitectureAsString() #endif } +constexpr PCWSTR GetArchitectureAsString(const std::uint32_t architecture) +{ + switch (architecture) + { + case PROCESSOR_ARCHITECTURE_AMD64: return L"x64"; + case PROCESSOR_ARCHITECTURE_ARM: return L"arm"; + case PROCESSOR_ARCHITECTURE_ARM64: return L"arm64"; + case PROCESSOR_ARCHITECTURE_IA32_ON_ARM64: return L"x86onArm64"; + case PROCESSOR_ARCHITECTURE_INTEL: return L"x86"; + case PROCESSOR_ARCHITECTURE_NEUTRAL: return L"neutral"; + case PROCESSOR_ARCHITECTURE_UNKNOWN: return L"unknown"; + default: THROW_HR_MSG(E_UNEXPECTED, "Unknown architecture 0x%X", architecture); + } +} + +constexpr PCWSTR GetArchitectureAsString(const winrt::Windows::System::ProcessorArchitecture architecture) +{ + static_assert(static_cast(winrt::Windows::System::ProcessorArchitecture::Arm) == static_cast(PROCESSOR_ARCHITECTURE_ARM), "winrt::Windows::System::ProcessorArchitecture::Arm != PROCESSOR_ARCHITECTURE_ARM"); + static_assert(static_cast(winrt::Windows::System::ProcessorArchitecture::Arm64) == static_cast(PROCESSOR_ARCHITECTURE_ARM64), "winrt::Windows::System::ProcessorArchitecture::Arm64 != PROCESSOR_ARCHITECTURE_ARM64"); + static_assert(static_cast(winrt::Windows::System::ProcessorArchitecture::Neutral) == static_cast(PROCESSOR_ARCHITECTURE_NEUTRAL), "winrt::Windows::System::ProcessorArchitecture::Neutral != PROCESSOR_ARCHITECTURE_NEUTRAL"); + static_assert(static_cast(winrt::Windows::System::ProcessorArchitecture::Unknown) == static_cast(PROCESSOR_ARCHITECTURE_UNKNOWN), "winrt::Windows::System::ProcessorArchitecture::Unknown != PROCESSOR_ARCHITECTURE_UNKNOWN"); + static_assert(static_cast(winrt::Windows::System::ProcessorArchitecture::X64) == static_cast(PROCESSOR_ARCHITECTURE_AMD64), "winrt::Windows::System::ProcessorArchitecture::X64 != PROCESSOR_ARCHITECTURE_AMD64"); + static_assert(static_cast(winrt::Windows::System::ProcessorArchitecture::X86) == static_cast(PROCESSOR_ARCHITECTURE_INTEL), "winrt::Windows::System::ProcessorArchitecture::X86 != PROCESSOR_ARCHITECTURE_INTEL"); + static_assert(static_cast(winrt::Windows::System::ProcessorArchitecture::X86OnArm64) == static_cast(PROCESSOR_ARCHITECTURE_IA32_ON_ARM64), "winrt::Windows::System::ProcessorArchitecture::X86OnArm64 != PROCESSOR_ARCHITECTURE_IA32_ON_ARM64"); + + return GetArchitectureAsString(static_cast(architecture)); +} + inline winrt::Windows::System::ProcessorArchitecture ParseArchitecture(_In_ PCWSTR architecture) { if (CompareStringOrdinal(architecture, -1, L"x64", -1, TRUE) == CSTR_EQUAL) @@ -109,6 +140,109 @@ inline winrt::Windows::System::ProcessorArchitecture ParseShortArchitecture(_In_ } } +class PackageVersion : public PACKAGE_VERSION +{ +public: + PackageVersion(const PackageVersion&) = default; + + // Create an instance with the value `major.minor.build.revision`. + PackageVersion(std::uint16_t major, std::uint16_t minor = 0, std::uint16_t build = 0, std::uint16_t revision = 0) : + PACKAGE_VERSION() + { + Major = major; + Minor = minor; + Build = build; + Revision = revision; + } + + // Create an instance from a version as a uint64. + PackageVersion(std::uint64_t version = 0) + { + Version = version; + } + + template + PackageVersion(TVersion const& t) : + PackageVersion(t.Major, t.Minor, t.Build, t.Revision) + { + } + +#if defined(WINRT_Windows_ApplicationModel_2_H) + PackageVersion(winrt::Windows::ApplicationModel::PackageVersion packageVersion) : + PACKAGE_VERSION() + { + Major = packageVersion.Major; + Minor = packageVersion.Minor; + Build = packageVersion.Build; + Revision = packageVersion.Revision; + } +#endif // defined(WINRT_Windows_ApplicationModel_2_H) + + PackageVersion& operator=(const PackageVersion&) = default; + + // Return the version as a uint64. + std::uint64_t ToVersion() const + { + return Version; + } + +#if defined(____x_ABI_CWindows_CApplicationModel_CIPackageId_INTERFACE_DEFINED__) + ABI::Windows::ApplicationModel::PackageVersion ToPackageVersion() const + { + return ABI::Windows::ApplicationModel::PackageVersion{ Major, Minor, Build, Revision }; + } +#endif // defined(____x_ABI_CWindows_CApplicationModel_CIPackageId_INTERFACE_DEFINED__) + +#if defined(WINRT_Windows_ApplicationModel_2_H) + winrt::Windows::ApplicationModel::PackageVersion ToWinrtPackageVersion() const + { + return winrt::Windows::ApplicationModel::PackageVersion{ Major, Minor, Build, Revision }; + } +#endif // defined(WINRT_Windows_ApplicationModel_2_H) + +#if defined(_XSTRING_) + // Return the string as a formatted value "major.minor.build.revision". + std::wstring ToString() const + { + return ToString(Major, Minor, Build, Revision); + } + + static std::wstring ToString(std::uint16_t major, std::uint16_t minor, std::uint16_t build, std::uint16_t revision) + { +#if (__cplusplus >= 202002L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 202002L)) + return std::format(L"{}.{}.{}.{}", major, minor, build, revision); +#else + return std::to_wstring(major) + L"." + std::to_wstring(minor) + L"." + std::to_wstring(build) + L"." + std::to_wstring(revision); +#endif + } +#endif defined(_XSTRING_) +}; + +inline bool operator==(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2) +{ + return packageVersion1.Version == packageVersion2.Version; +} +inline bool operator!=(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2) +{ + return packageVersion1.Version != packageVersion2.Version; +} +inline bool operator<(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2) +{ + return packageVersion1.Version < packageVersion2.Version; +} +inline bool operator<=(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2) +{ + return packageVersion1.Version <= packageVersion2.Version; +} +inline bool operator>(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2) +{ + return packageVersion1.Version > packageVersion2.Version; +} +inline bool operator>=(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2) +{ + return packageVersion1.Version >= packageVersion2.Version; +} + inline bool IsValidVersionShortTag( const std::wstring& versionShortTag) { diff --git a/dev/Common/AppModel.Package.h b/dev/Common/AppModel.Package.h index 1dd596db3b..772091840a 100644 --- a/dev/Common/AppModel.Package.h +++ b/dev/Common/AppModel.Package.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #ifndef __APPMODEL_PACKAGE_H @@ -6,6 +6,8 @@ #include +#include + namespace AppModel::Package { /// Find all Main+Framework packages in a package family registered to the current user @@ -52,6 +54,31 @@ inline PACKAGE_VERSION ToPackageVersion(winrt::Windows::ApplicationModel::Packag to.Revision = from.Revision; return to; } + +inline std::tuple ParsePackageFullName(PCWSTR packageFullName) +{ + BYTE buffer[ + sizeof(PACKAGE_ID) + + sizeof(WCHAR) * (PACKAGE_NAME_MAX_LENGTH + 1) + + sizeof(WCHAR) * (PACKAGE_VERSION_MAX_LENGTH + 1) + + sizeof(WCHAR) * (PACKAGE_ARCHITECTURE_MAX_LENGTH + 1) + + sizeof(WCHAR) * (PACKAGE_RESOURCEID_MAX_LENGTH + 1) + + sizeof(WCHAR) * (PACKAGE_PUBLISHERID_MAX_LENGTH + 1)]{}; + UINT32 bufferLength{ ARRAYSIZE(buffer) }; + THROW_IF_WIN32_ERROR_MSG(::PackageIdFromFullName(packageFullName, PACKAGE_INFORMATION_BASIC, &bufferLength, buffer), "%ls", packageFullName); + const auto& packageId{ *reinterpret_cast(buffer) }; + + WCHAR packageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; + UINT32 packageFamilyNameLength{ ARRAYSIZE(packageFamilyName) }; + THROW_IF_WIN32_ERROR_MSG(::PackageFamilyNameFromId(&packageId, &packageFamilyNameLength, packageFamilyName), "%ls", packageFullName); + + return { std::wstring(packageId.name), packageId.version, packageId.processorArchitecture, std::wstring(packageId.resourceId ? packageId.resourceId : L""), std::wstring(packageId.publisherId), std::wstring(packageFamilyName) }; +} + +inline std::tuple ParsePackageFullName(const std::wstring& packageFullName) +{ + return ParsePackageFullName(packageFullName.c_str()); +} } #endif // __APPMODEL_PACKAGE_H diff --git a/dev/Common/TerminalVelocityFeatures-PackageManager.h b/dev/Common/TerminalVelocityFeatures-PackageManager.h new file mode 100644 index 0000000000..99edf97bbd --- /dev/null +++ b/dev/Common/TerminalVelocityFeatures-PackageManager.h @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +// THIS FILE IS AUTOMATICALLY GENERATED; DO NOT EDIT IT + +// INPUT FILE: dev\common\TerminalVelocityFeatures-PackageManager.xml +// OPTIONS: -Channel Experimental -Language C++ -Namespace Microsoft.Windows.Management.Deployment -Path dev\common\TerminalVelocityFeatures-PackageManager.xml -Output dev\common\TerminalVelocityFeatures-PackageManager.h + +#if defined(__midlrt) +namespace features +{ + feature_name Feature_PackageManager = { DisabledByDefault, FALSE }; +} +#endif // defined(__midlrt) + +// Feature constants +#define WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEMANAGER_ENABLED 1 + +#if defined(__cplusplus) + +namespace Microsoft::Windows::Management::Deployment +{ + +__pragma(detect_mismatch("ODR_violation_WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEMANAGER_ENABLED_mismatch", "AlwaysEnabled")) +struct Feature_PackageManager +{ + static constexpr bool IsEnabled() { return WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEMANAGER_ENABLED == 1; } +}; + +} // namespace Microsoft.Windows.Management.Deployment + +#endif // defined(__cplusplus) diff --git a/dev/Common/TerminalVelocityFeatures-PackageManager.xml b/dev/Common/TerminalVelocityFeatures-PackageManager.xml new file mode 100644 index 0000000000..932aa39394 --- /dev/null +++ b/dev/Common/TerminalVelocityFeatures-PackageManager.xml @@ -0,0 +1,20 @@ + + + + + + + + + + Feature_PackageManager + Package Management APIs + AlwaysEnabled + + Preview + Stable + + + diff --git a/dev/DeploymentAgent/packages.config b/dev/DeploymentAgent/packages.config index 2305cb7181..9ba3aa91dd 100644 --- a/dev/DeploymentAgent/packages.config +++ b/dev/DeploymentAgent/packages.config @@ -1,5 +1,5 @@  - + diff --git a/dev/DynamicDependency/API/DynamicDependency.vcxitems b/dev/DynamicDependency/API/DynamicDependency.vcxitems index 55a450758f..e5f3fa55ae 100644 --- a/dev/DynamicDependency/API/DynamicDependency.vcxitems +++ b/dev/DynamicDependency/API/DynamicDependency.vcxitems @@ -23,6 +23,7 @@ + @@ -46,6 +47,7 @@ + @@ -69,8 +71,9 @@ + - \ No newline at end of file + diff --git a/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters b/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters index c42fe9ce16..293f21384c 100644 --- a/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters +++ b/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters @@ -50,6 +50,9 @@ Source Files + + Source Files + Source Files @@ -127,6 +130,9 @@ Header Files + + Header Files + Header Files @@ -152,4 +158,4 @@ - \ No newline at end of file + diff --git a/dev/DynamicDependency/API/MddWin11.cpp b/dev/DynamicDependency/API/MddWin11.cpp new file mode 100644 index 0000000000..cca5dad052 --- /dev/null +++ b/dev/DynamicDependency/API/MddWin11.cpp @@ -0,0 +1,256 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include + +#include "MddWin11.h" + +namespace MddCore::Win11 +{ +static HMODULE g_dllApisetAppmodelRuntime_1_6{}; +static decltype(&::TryCreatePackageDependency) g_win11TryCreatePackageDependency{}; +static decltype(&::DeletePackageDependency) g_win11DeletePackageDependency{}; +static decltype(&::AddPackageDependency) g_win11AddPackageDependency{}; +static decltype(&::RemovePackageDependency) g_win11RemovePackageDependency{}; +static decltype(&::GetResolvedPackageFullNameForPackageDependency) g_win11GetResolvedPackageFullNameForPackageDependency{}; +static decltype(&::GetIdForPackageDependencyContext) g_win11GetIdForPackageDependencyContext{}; +static decltype(&::GetPackageGraphRevisionId) g_win11GetPackageGraphRevisionId{}; + +constexpr PackageDependencyLifetimeKind ToLifetimeKind(MddPackageDependencyLifetimeKind lifetimeKind) +{ + switch (lifetimeKind) + { + case MddPackageDependencyLifetimeKind::Process: return PackageDependencyLifetimeKind_Process; + case MddPackageDependencyLifetimeKind::FilePath: return PackageDependencyLifetimeKind_FilePath; + case MddPackageDependencyLifetimeKind::RegistryKey: return PackageDependencyLifetimeKind_RegistryKey; + default: THROW_HR_MSG(E_UNEXPECTED, "Unknown MddPackageDependencyLifetimeKind (%d)", lifetimeKind); + }; +} + +constexpr PackageDependencyLifetimeKind ToLifetimeKind(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind lifetimeKind) +{ + switch (lifetimeKind) + { + case winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind::Process: return PackageDependencyLifetimeKind_Process; + case winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind::FilePath: return PackageDependencyLifetimeKind_FilePath; + case winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind::RegistryKey: return PackageDependencyLifetimeKind_RegistryKey; + default: THROW_HR_MSG(E_UNEXPECTED, "Unknown winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeKind (%d)", lifetimeKind); + }; +} +} + +HRESULT WINAPI MddWin11Initialize() noexcept +{ + if (!MddCore::Win11::IsSupported()) + { + return S_OK; + } + + HMODULE dllApisetAppmodelRuntime_1_6{ LoadLibraryExW(L"api-ms-win-appmodel-runtime-l1-1-6.dll", nullptr, 0) }; + FAIL_FAST_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), dllApisetAppmodelRuntime_1_6); + + auto win11TryCreatePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, TryCreatePackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11TryCreatePackageDependency); + auto win11DeletePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, DeletePackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11DeletePackageDependency); + auto win11AddPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, AddPackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11AddPackageDependency); + auto win11RemovePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, RemovePackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11RemovePackageDependency); + auto win11GetResolvedPackageFullNameForPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetResolvedPackageFullNameForPackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetResolvedPackageFullNameForPackageDependency); + auto win11GetIdForPackageDependencyContext{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetIdForPackageDependencyContext) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetIdForPackageDependencyContext); + auto win11GetPackageGraphRevisionId{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetPackageGraphRevisionId) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetPackageGraphRevisionId); + + MddCore::Win11::g_dllApisetAppmodelRuntime_1_6 = dllApisetAppmodelRuntime_1_6; + MddCore::Win11::g_win11TryCreatePackageDependency = win11TryCreatePackageDependency; + MddCore::Win11::g_win11DeletePackageDependency = win11DeletePackageDependency; + MddCore::Win11::g_win11AddPackageDependency = win11AddPackageDependency; + MddCore::Win11::g_win11RemovePackageDependency = win11RemovePackageDependency; + MddCore::Win11::g_win11GetResolvedPackageFullNameForPackageDependency = win11GetResolvedPackageFullNameForPackageDependency; + MddCore::Win11::g_win11GetIdForPackageDependencyContext = win11GetIdForPackageDependencyContext; + MddCore::Win11::g_win11GetPackageGraphRevisionId = win11GetPackageGraphRevisionId; + return S_OK; +} + +HRESULT WINAPI MddWin11Shutdown() noexcept +{ + if (MddCore::Win11::g_dllApisetAppmodelRuntime_1_6) + { + MddCore::Win11::g_win11TryCreatePackageDependency = nullptr; + MddCore::Win11::g_win11DeletePackageDependency = nullptr; + MddCore::Win11::g_win11AddPackageDependency = nullptr; + MddCore::Win11::g_win11RemovePackageDependency = nullptr; + MddCore::Win11::g_win11GetResolvedPackageFullNameForPackageDependency = nullptr; + MddCore::Win11::g_win11GetIdForPackageDependencyContext = nullptr; + MddCore::Win11::g_win11GetPackageGraphRevisionId = nullptr; + FreeLibrary(MddCore::Win11::g_dllApisetAppmodelRuntime_1_6); + MddCore::Win11::g_dllApisetAppmodelRuntime_1_6 = nullptr; + } + return S_OK; +} + +bool MddCore::Win11::IsSupported() +{ + static bool s_isSupported{ WindowsVersion::IsWindows11_22H2OrGreater() }; + return s_isSupported; +} + +HRESULT MddCore::Win11::TryCreatePackageDependency( + PSID user, + const winrt::hstring& packageFamilyName, + const winrt::Windows::ApplicationModel::PackageVersion& minVersion, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& options, + _Outptr_result_maybenull_ PWSTR* packageDependencyId) +{ + PCWSTR win11PackageFamilyName{ packageFamilyName.c_str() }; + + const ::AppModel::Identity::PackageVersion minPackageVersion{ minVersion }; + const PACKAGE_VERSION win11MinVersion{ minPackageVersion }; + + auto win11PackageDependencyProcessorArchitectures{ PackageDependencyProcessorArchitectures_None }; + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Neutral, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Neutral)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X64, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X64)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm64, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm64)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86A64, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86OnArm64)); + + const auto win11LifetimeKind{ ToLifetimeKind(options.LifetimeArtifactKind()) }; + + PCWSTR win11LifetimeArtifact{ options.LifetimeArtifact().c_str() }; + + auto win11Options{ CreatePackageDependencyOptions_None }; + WI_SetFlagIf(win11Options, CreatePackageDependencyOptions_DoNotVerifyDependencyResolution, !options.VerifyDependencyResolution()); + //TODO CreatePackageDependencyOptions_ScopeIsSystem + + RETURN_IF_FAILED(g_win11TryCreatePackageDependency(user, win11PackageFamilyName, win11MinVersion, + win11PackageDependencyProcessorArchitectures, win11LifetimeKind, win11LifetimeArtifact, + win11Options, packageDependencyId)); + return S_OK; +} + +HRESULT MddCore::Win11::TryCreatePackageDependency( + PSID user, + _In_ PCWSTR packageFamilyName, + PACKAGE_VERSION minVersion, + MddPackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, + MddPackageDependencyLifetimeKind lifetimeKind, + PCWSTR lifetimeArtifact, + MddCreatePackageDependencyOptions options, + _Outptr_result_maybenull_ PWSTR* packageDependencyId) +{ + const ::AppModel::Identity::PackageVersion win11MinVersion{ minVersion }; + + auto win11PackageDependencyProcessorArchitectures{ PackageDependencyProcessorArchitectures_None }; + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Neutral, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Neutral)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X86)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X64)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Arm)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Arm64)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86A64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X86OnArm64)); + + const auto win11LifetimeKind{ ToLifetimeKind(lifetimeKind) }; + + auto win11Options{ CreatePackageDependencyOptions_None }; + WI_SetFlagIf(win11Options, CreatePackageDependencyOptions_DoNotVerifyDependencyResolution, WI_IsFlagSet(options, MddCreatePackageDependencyOptions::DoNotVerifyDependencyResolution)); + WI_SetFlagIf(win11Options, CreatePackageDependencyOptions_ScopeIsSystem, WI_IsFlagSet(options, MddCreatePackageDependencyOptions::ScopeIsSystem)); + + RETURN_IF_FAILED(g_win11TryCreatePackageDependency(user, packageFamilyName, win11MinVersion, + win11PackageDependencyProcessorArchitectures, win11LifetimeKind, lifetimeArtifact, + win11Options, packageDependencyId)); + return S_OK; +} + +void MddCore::Win11::DeletePackageDependency( + const winrt::hstring& packageDependencyId) +{ + DeletePackageDependency(packageDependencyId.c_str()); +} + +void MddCore::Win11::DeletePackageDependency( + _In_ PCWSTR packageDependencyId) +{ + (void)LOG_IF_FAILED(g_win11DeletePackageDependency(packageDependencyId)); +} + +HRESULT MddCore::Win11::AddPackageDependency( + const winrt::hstring& packageDependencyId, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& options, + _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, + _Outptr_opt_result_maybenull_ PWSTR* packageFullName) +{ + PCWSTR win11PackageDependencyId{ packageDependencyId.c_str() }; + + const auto win11Rank{ options.Rank() }; + + auto win11Options{ AddPackageDependencyOptions_None }; + WI_SetFlagIf(win11Options, AddPackageDependencyOptions_PrependIfRankCollision, options.PrependIfRankCollision()); + + static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); + auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; + + RETURN_IF_FAILED(g_win11AddPackageDependency(win11PackageDependencyId, win11Rank, win11Options, win11PackageDependencyContext, packageFullName)); + return S_OK; +} + +HRESULT MddCore::Win11::AddPackageDependency( + _In_ PCWSTR packageDependencyId, + INT32 rank, + MddAddPackageDependencyOptions options, + _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, + _Outptr_opt_result_maybenull_ PWSTR* packageFullName) +{ + auto win11Options{ AddPackageDependencyOptions_None }; + WI_SetFlagIf(win11Options, AddPackageDependencyOptions_PrependIfRankCollision, WI_IsFlagSet(options, MddAddPackageDependencyOptions::PrependIfRankCollision)); + + static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); + auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; + + RETURN_IF_FAILED(g_win11AddPackageDependency(packageDependencyId, rank, win11Options, win11PackageDependencyContext, packageFullName)); + return S_OK; +} + +void MddCore::Win11::RemovePackageDependency( + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId packageDependencyContextId) +{ + return RemovePackageDependency(ToContext(packageDependencyContextId)); +} + +void MddCore::Win11::RemovePackageDependency( + _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext) +{ + static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); + auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; + + g_win11RemovePackageDependency(win11PackageDependencyContext); +} + +HRESULT MddCore::Win11::GetResolvedPackageFullNameForPackageDependency( + _In_ PCWSTR packageDependencyId, + _Outptr_result_maybenull_ PWSTR* packageFullName) +{ + RETURN_IF_FAILED(g_win11GetResolvedPackageFullNameForPackageDependency(packageDependencyId, packageFullName)); + return S_OK; +} + +HRESULT MddCore::Win11::GetIdForPackageDependencyContext( + _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext, + _Outptr_result_maybenull_ PWSTR* packageDependencyId) +{ + static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); + auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; + + RETURN_IF_FAILED(g_win11GetIdForPackageDependencyContext(win11PackageDependencyContext, packageDependencyId)); + return S_OK; +} + +UINT32 MddCore::Win11::GetPackageGraphRevisionId() +{ + return g_win11GetPackageGraphRevisionId(); +} diff --git a/dev/DynamicDependency/API/MddWin11.h b/dev/DynamicDependency/API/MddWin11.h new file mode 100644 index 0000000000..8b0f6bef92 --- /dev/null +++ b/dev/DynamicDependency/API/MddWin11.h @@ -0,0 +1,82 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#if !defined(MDDWIN11DYNAMICDEPENDENCY_H) +#define MDDWIN11DYNAMICDEPENDENCY_H + +#include +#include + +HRESULT WINAPI MddWin11Initialize() noexcept; + +HRESULT WINAPI MddWin11Shutdown() noexcept; + +namespace MddCore::Win11 +{ +bool IsSupported(); + +HRESULT TryCreatePackageDependency( + PSID user, + const winrt::hstring& packageFamilyName, + const winrt::Windows::ApplicationModel::PackageVersion& minVersion, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& options, + _Outptr_result_maybenull_ PWSTR* packageDependencyId); + +HRESULT TryCreatePackageDependency( + PSID user, + _In_ PCWSTR packageFamilyName, + PACKAGE_VERSION minVersion, + MddPackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, + MddPackageDependencyLifetimeKind lifetimeKind, + PCWSTR lifetimeArtifact, + MddCreatePackageDependencyOptions options, + _Outptr_result_maybenull_ PWSTR* packageDependencyId); + +void DeletePackageDependency( + const winrt::hstring& packageDependencyId); + +void DeletePackageDependency( + _In_ PCWSTR packageDependencyId); + +HRESULT AddPackageDependency( + const winrt::hstring& packageDependencyId, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& options, + _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, + _Outptr_opt_result_maybenull_ PWSTR* packageFullName); + +HRESULT AddPackageDependency( + _In_ PCWSTR packageDependencyId, + std::int32_t rank, + MddAddPackageDependencyOptions options, + _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, + _Outptr_opt_result_maybenull_ PWSTR* packageFullName); + +void RemovePackageDependency( + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId packageDependencyContextId); + +void RemovePackageDependency( + _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext); + +HRESULT GetResolvedPackageFullNameForPackageDependency( + _In_ PCWSTR packageDependencyId, + _Outptr_result_maybenull_ PWSTR* packageFullName); + +HRESULT GetIdForPackageDependencyContext( + _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext, + _Outptr_result_maybenull_ PWSTR* packageDependencyId); + +UINT32 GetPackageGraphRevisionId(); + +inline winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId ToContextId(MDD_PACKAGEDEPENDENCY_CONTEXT context) +{ + return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId{ static_cast(reinterpret_cast(context)) }; +} + +inline MDD_PACKAGEDEPENDENCY_CONTEXT ToContext(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId contextId) +{ + return reinterpret_cast(static_cast(contextId.Id)); +} +} + +#endif // MDDWIN11DYNAMICDEPENDENCY_H diff --git a/dev/Kozani/KozaniAppGraph/packages.config b/dev/Kozani/KozaniAppGraph/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/dev/Kozani/KozaniAppGraph/packages.config +++ b/dev/Kozani/KozaniAppGraph/packages.config @@ -3,6 +3,6 @@ - + diff --git a/dev/Kozani/KozaniHostRuntime/packages.config b/dev/Kozani/KozaniHostRuntime/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/dev/Kozani/KozaniHostRuntime/packages.config +++ b/dev/Kozani/KozaniHostRuntime/packages.config @@ -3,6 +3,6 @@ - + diff --git a/dev/Kozani/KozaniManager/packages.config b/dev/Kozani/KozaniManager/packages.config index ba003992c7..8d63d7f888 100644 --- a/dev/Kozani/KozaniManager/packages.config +++ b/dev/Kozani/KozaniManager/packages.config @@ -3,7 +3,7 @@ - + diff --git a/dev/Kozani/KozaniManagerRuntime/packages.config b/dev/Kozani/KozaniManagerRuntime/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/dev/Kozani/KozaniManagerRuntime/packages.config +++ b/dev/Kozani/KozaniManagerRuntime/packages.config @@ -3,6 +3,6 @@ - + diff --git a/dev/Kozani/KozaniPackage/packages.config b/dev/Kozani/KozaniPackage/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/dev/Kozani/KozaniPackage/packages.config +++ b/dev/Kozani/KozaniPackage/packages.config @@ -3,6 +3,6 @@ - + diff --git a/dev/Kozani/KozaniRemoteManager/packages.config b/dev/Kozani/KozaniRemoteManager/packages.config index ba003992c7..8d63d7f888 100644 --- a/dev/Kozani/KozaniRemoteManager/packages.config +++ b/dev/Kozani/KozaniRemoteManager/packages.config @@ -3,7 +3,7 @@ - + diff --git a/dev/Kozani/KozaniRemoteManagerLauncher/packages.config b/dev/Kozani/KozaniRemoteManagerLauncher/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/dev/Kozani/KozaniRemoteManagerLauncher/packages.config +++ b/dev/Kozani/KozaniRemoteManagerLauncher/packages.config @@ -3,6 +3,6 @@ - + diff --git a/dev/Kozani/KozaniSendToLocal/packages.config b/dev/Kozani/KozaniSendToLocal/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/dev/Kozani/KozaniSendToLocal/packages.config +++ b/dev/Kozani/KozaniSendToLocal/packages.config @@ -3,6 +3,6 @@ - + diff --git a/dev/Kozani/KozaniSendToRemote/packages.config b/dev/Kozani/KozaniSendToRemote/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/dev/Kozani/KozaniSendToRemote/packages.config +++ b/dev/Kozani/KozaniSendToRemote/packages.config @@ -3,6 +3,6 @@ - + diff --git a/dev/Kozani/KozaniSettings/packages.config b/dev/Kozani/KozaniSettings/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/dev/Kozani/KozaniSettings/packages.config +++ b/dev/Kozani/KozaniSettings/packages.config @@ -3,6 +3,6 @@ - + diff --git a/dev/Kozani/MakeMSIX/packages.config b/dev/Kozani/MakeMSIX/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/dev/Kozani/MakeMSIX/packages.config +++ b/dev/Kozani/MakeMSIX/packages.config @@ -3,6 +3,6 @@ - + diff --git a/dev/MRTCore/mrt/Core/unittests/packages.config b/dev/MRTCore/mrt/Core/unittests/packages.config index f11cc64c3e..1861ca894b 100644 --- a/dev/MRTCore/mrt/Core/unittests/packages.config +++ b/dev/MRTCore/mrt/Core/unittests/packages.config @@ -1,4 +1,4 @@  - + diff --git a/dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/UnpackagedTests/packages.config b/dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/UnpackagedTests/packages.config index e827484f00..11a9dacfc8 100644 --- a/dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/UnpackagedTests/packages.config +++ b/dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/UnpackagedTests/packages.config @@ -1,4 +1,4 @@  - + diff --git a/dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/packages.config b/dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/packages.config index 11a32940bf..9b45da6a85 100644 --- a/dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/packages.config +++ b/dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/packages.config @@ -3,5 +3,5 @@ - + diff --git a/dev/MRTCore/mrt/mrm/UnitTests/packages.config b/dev/MRTCore/mrt/mrm/UnitTests/packages.config index ef4201b12e..3a3c1cd7e9 100644 --- a/dev/MRTCore/mrt/mrm/UnitTests/packages.config +++ b/dev/MRTCore/mrt/mrm/UnitTests/packages.config @@ -1,5 +1,5 @@  - + diff --git a/dev/PackageManager/API/M.W.M.D.AddPackageOptions.cpp b/dev/PackageManager/API/M.W.M.D.AddPackageOptions.cpp new file mode 100644 index 0000000000..42566d9061 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.AddPackageOptions.cpp @@ -0,0 +1,171 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include + +#include "M.W.M.D.AddPackageOptions.h" +#include "Microsoft.Windows.Management.Deployment.AddPackageOptions.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + winrt::Microsoft::Windows::Management::Deployment::PackageVolume AddPackageOptions::TargetVolume() + { + return m_targetVolume; + } + void AddPackageOptions::TargetVolume(winrt::Microsoft::Windows::Management::Deployment::PackageVolume const& value) + { + m_targetVolume = value; + } + winrt::Windows::Foundation::Collections::IVector AddPackageOptions::DependencyPackageUris() + { + if (!m_dependencyPackageUris) + { + m_dependencyPackageUris = winrt::single_threaded_vector(); + } + return m_dependencyPackageUris; + } + winrt::Windows::Foundation::Collections::IVector AddPackageOptions::OptionalPackageFamilyNames() + { + if (!m_optionalPackageFamilyNames) + { + m_optionalPackageFamilyNames = winrt::single_threaded_vector(); + } + return m_optionalPackageFamilyNames; + } + winrt::Windows::Foundation::Collections::IVector AddPackageOptions::OptionalPackageUris() + { + if (!m_optionalPackageUris) + { + m_optionalPackageUris = winrt::single_threaded_vector(); + } + return m_optionalPackageUris; + } + winrt::Windows::Foundation::Collections::IVector AddPackageOptions::RelatedPackageUris() + { + if (!m_relatedPackageUris) + { + m_relatedPackageUris = winrt::single_threaded_vector(); + } + return m_relatedPackageUris; + } + winrt::Windows::Foundation::Uri AddPackageOptions::ExternalLocationUri() + { + return m_externalLocationUri; + } + void AddPackageOptions::ExternalLocationUri(winrt::Windows::Foundation::Uri const& value) + { + m_externalLocationUri = value; + } + winrt::Microsoft::Windows::Management::Deployment::StubPackageOption AddPackageOptions::StubPackageOption() + { + return m_stubPackageOption; + } + void AddPackageOptions::StubPackageOption(winrt::Microsoft::Windows::Management::Deployment::StubPackageOption const& value) + { + m_stubPackageOption = value; + } + bool AddPackageOptions::AllowUnsigned() + { + return m_allowUnsigned; + } + void AddPackageOptions::AllowUnsigned(bool value) + { + m_allowUnsigned = value; + } + bool AddPackageOptions::DeveloperMode() + { + return m_developerMode; + } + void AddPackageOptions::DeveloperMode(bool value) + { + m_developerMode = value; + } + bool AddPackageOptions::ForceAppShutdown() + { + return m_forceAppShutdown; + } + void AddPackageOptions::ForceAppShutdown(bool value) + { + m_forceAppShutdown = value; + } + bool AddPackageOptions::ForceTargetAppShutdown() + { + return m_forceTargetAppShutdown; + } + void AddPackageOptions::ForceTargetAppShutdown(bool value) + { + m_forceTargetAppShutdown = value; + } + bool AddPackageOptions::ForceUpdateFromAnyVersion() + { + return m_forceUpdateFromAnyVersion; + } + void AddPackageOptions::ForceUpdateFromAnyVersion(bool value) + { + m_forceUpdateFromAnyVersion = value; + } + bool AddPackageOptions::InstallAllResources() + { + return m_installAllResources; + } + void AddPackageOptions::InstallAllResources(bool value) + { + m_installAllResources = value; + } + bool AddPackageOptions::RequiredContentGroupOnly() + { + return m_requiredContentGroupOnly; + } + void AddPackageOptions::RequiredContentGroupOnly(bool value) + { + m_requiredContentGroupOnly = value; + } + bool AddPackageOptions::RetainFilesOnFailure() + { + return m_retainFilesOnFailure; + } + void AddPackageOptions::RetainFilesOnFailure(bool value) + { + m_retainFilesOnFailure = value; + } + bool AddPackageOptions::StageInPlace() + { + return m_stageInPlace; + } + void AddPackageOptions::StageInPlace(bool value) + { + m_stageInPlace = value; + } + bool AddPackageOptions::DeferRegistrationWhenPackagesAreInUse() + { + return m_deferRegistrationWhenPackagesAreInUse; + } + void AddPackageOptions::DeferRegistrationWhenPackagesAreInUse(bool value) + { + m_deferRegistrationWhenPackagesAreInUse = value; + } + bool AddPackageOptions::IsExpectedDigestsSupported() + { + // Requires Windows >= 10.0.22621.0 (aka Win11 22H2) + return WindowsVersion::IsWindows11_22H2OrGreater(); + } + winrt::Windows::Foundation::Collections::IMap AddPackageOptions::ExpectedDigests() + { + return m_expectedDigests; + } + bool AddPackageOptions::IsLimitToExistingPackagesSupported() + { + // Requires Windows >= 10.0.22621.0 (aka Win11 22H2) + return WindowsVersion::IsWindows11_22H2OrGreater(); + } + bool AddPackageOptions::LimitToExistingPackages() + { + return m_limitToExistingPackages; + } + void AddPackageOptions::LimitToExistingPackages(bool value) + { + m_limitToExistingPackages = value; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.AddPackageOptions.h b/dev/PackageManager/API/M.W.M.D.AddPackageOptions.h new file mode 100644 index 0000000000..a0a438473e --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.AddPackageOptions.h @@ -0,0 +1,78 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.AddPackageOptions.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct AddPackageOptions : AddPackageOptionsT + { + AddPackageOptions() = default; + + winrt::Microsoft::Windows::Management::Deployment::PackageVolume TargetVolume(); + void TargetVolume(winrt::Microsoft::Windows::Management::Deployment::PackageVolume const& value); + winrt::Windows::Foundation::Collections::IVector DependencyPackageUris(); + winrt::Windows::Foundation::Collections::IVector OptionalPackageFamilyNames(); + winrt::Windows::Foundation::Collections::IVector OptionalPackageUris(); + winrt::Windows::Foundation::Collections::IVector RelatedPackageUris(); + winrt::Windows::Foundation::Uri ExternalLocationUri(); + void ExternalLocationUri(winrt::Windows::Foundation::Uri const& value); + winrt::Microsoft::Windows::Management::Deployment::StubPackageOption StubPackageOption(); + void StubPackageOption(winrt::Microsoft::Windows::Management::Deployment::StubPackageOption const& value); + bool AllowUnsigned(); + void AllowUnsigned(bool value); + bool DeveloperMode(); + void DeveloperMode(bool value); + bool ForceAppShutdown(); + void ForceAppShutdown(bool value); + bool ForceTargetAppShutdown(); + void ForceTargetAppShutdown(bool value); + bool ForceUpdateFromAnyVersion(); + void ForceUpdateFromAnyVersion(bool value); + bool InstallAllResources(); + void InstallAllResources(bool value); + bool RequiredContentGroupOnly(); + void RequiredContentGroupOnly(bool value); + bool RetainFilesOnFailure(); + void RetainFilesOnFailure(bool value); + bool StageInPlace(); + void StageInPlace(bool value); + bool IsDeferRegistrationWhenPackagesAreInUseSupported(); + bool DeferRegistrationWhenPackagesAreInUse(); + void DeferRegistrationWhenPackagesAreInUse(bool value); + bool IsExpectedDigestsSupported(); + winrt::Windows::Foundation::Collections::IMap ExpectedDigests(); + bool IsLimitToExistingPackagesSupported(); + bool LimitToExistingPackages(); + void LimitToExistingPackages(bool value); + + private: + winrt::Microsoft::Windows::Management::Deployment::PackageVolume m_targetVolume{}; + winrt::Windows::Foundation::Collections::IVector m_dependencyPackageUris{}; + winrt::Windows::Foundation::Collections::IVector m_optionalPackageFamilyNames{}; + winrt::Windows::Foundation::Collections::IVector m_optionalPackageUris{}; + winrt::Windows::Foundation::Collections::IVector m_relatedPackageUris{}; + winrt::Windows::Foundation::Uri m_externalLocationUri{ nullptr }; + winrt::Microsoft::Windows::Management::Deployment::StubPackageOption m_stubPackageOption{}; + bool m_allowUnsigned{}; + bool m_developerMode{}; + bool m_forceAppShutdown{}; + bool m_forceTargetAppShutdown{}; + bool m_forceUpdateFromAnyVersion{}; + bool m_installAllResources{}; + bool m_requiredContentGroupOnly{}; + bool m_retainFilesOnFailure{}; + bool m_stageInPlace{}; + bool m_deferRegistrationWhenPackagesAreInUse{}; + winrt::Windows::Foundation::Collections::IMap m_expectedDigests; + bool m_limitToExistingPackages{}; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct AddPackageOptions : AddPackageOptionsT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.EnsureIsReadyOptions.cpp b/dev/PackageManager/API/M.W.M.D.EnsureIsReadyOptions.cpp new file mode 100644 index 0000000000..4b44c8b2c5 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.EnsureIsReadyOptions.cpp @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include + +#include "M.W.M.D.EnsureIsReadyOptions.h" +#include "Microsoft.Windows.Management.Deployment.EnsureIsReadyOptions.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + winrt::Microsoft::Windows::Management::Deployment::DeploymentProcessingModel EnsureIsReadyOptions::DeploymentProcessingModel() + { + return m_deploymentProcessingModel; + } + void EnsureIsReadyOptions::DeploymentProcessingModel(winrt::Microsoft::Windows::Management::Deployment::DeploymentProcessingModel const& value) + { + m_deploymentProcessingModel = value; + } + winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority EnsureIsReadyOptions::DeploymentPriority() + { + return m_deploymentPriority; + } + void EnsureIsReadyOptions::DeploymentPriority(winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority const& value) + { + m_deploymentPriority = value; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.EnsureIsReadyOptions.h b/dev/PackageManager/API/M.W.M.D.EnsureIsReadyOptions.h new file mode 100644 index 0000000000..9b0fe6c04c --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.EnsureIsReadyOptions.h @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.EnsureIsReadyOptions.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct EnsureIsReadyOptions : EnsureIsReadyOptionsT + { + EnsureIsReadyOptions() = default; + + winrt::Microsoft::Windows::Management::Deployment::DeploymentProcessingModel DeploymentProcessingModel(); + void DeploymentProcessingModel(winrt::Microsoft::Windows::Management::Deployment::DeploymentProcessingModel const& value); + winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority DeploymentPriority(); + void DeploymentPriority(winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority const& value); + + private: + winrt::Microsoft::Windows::Management::Deployment::DeploymentProcessingModel m_deploymentProcessingModel{}; + winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority m_deploymentPriority{ winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority::Normal }; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct EnsureIsReadyOptions : EnsureIsReadyOptionsT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.FindPackageSetOptions.cpp b/dev/PackageManager/API/M.W.M.D.FindPackageSetOptions.cpp new file mode 100644 index 0000000000..d1f49eb744 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.FindPackageSetOptions.cpp @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" +#include "M.W.M.D.FindPackageSetOptions.h" +#include "Microsoft.Windows.Management.Deployment.FindPackageSetOptions.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + bool FindPackageSetOptions::TODO_MustHaveAtLeastOneInterfaceOrStaticFactoryPlaceholder() + { + throw hresult_not_implemented(); + } + void FindPackageSetOptions::TODO_MustHaveAtLeastOneInterfaceOrStaticFactoryPlaceholder(bool value) + { + throw hresult_not_implemented(); + } +} diff --git a/dev/PackageManager/API/M.W.M.D.FindPackageSetOptions.h b/dev/PackageManager/API/M.W.M.D.FindPackageSetOptions.h new file mode 100644 index 0000000000..a4251fef49 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.FindPackageSetOptions.h @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.FindPackageSetOptions.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct FindPackageSetOptions : FindPackageSetOptionsT + { + FindPackageSetOptions() = default; + + bool TODO_MustHaveAtLeastOneInterfaceOrStaticFactoryPlaceholder(); + void TODO_MustHaveAtLeastOneInterfaceOrStaticFactoryPlaceholder(bool value); + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct FindPackageSetOptions : FindPackageSetOptionsT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp new file mode 100644 index 0000000000..74fbb9cc76 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp @@ -0,0 +1,450 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" +#include "M.W.M.D.PackageDeploymentManager.h" +#include "Microsoft.Windows.Management.Deployment.PackageDeploymentManager.g.cpp" + +#include "M.W.M.D.PackageDeploymentResult.h" +#include "M.W.M.D.PackageDeploymentProgress.h" +#include "M.W.M.D.PackageVolumeManager.h" +#include "MsixPackageManager.h" +#include "PackageDeploymentResolver.h" + +static_assert(static_cast(winrt::Microsoft::Windows::Management::Deployment::StubPackageOption::Default) == static_cast(winrt::Windows::Management::Deployment::StubPackageOption::Default), + "winrt::Microsoft::Windows::Management::Deployment::StubPackageOption::Default != winrt::Windows::Management::Deployment::StubPackageOption::Default"); +static_assert(static_cast(winrt::Microsoft::Windows::Management::Deployment::StubPackageOption::InstallFull) == static_cast(winrt::Windows::Management::Deployment::StubPackageOption::InstallFull), + "winrt::Microsoft::Windows::Management::Deployment::StubPackageOption::InstallFull != winrt::Windows::Management::Deployment::StubPackageOption::InstallFull"); +static_assert(static_cast(winrt::Microsoft::Windows::Management::Deployment::StubPackageOption::InstallStub) == static_cast(winrt::Windows::Management::Deployment::StubPackageOption::InstallStub), + "winrt::Microsoft::Windows::Management::Deployment::StubPackageOption::InstallStub != winrt::Windows::Management::Deployment::StubPackageOption::InstallStub"); +static_assert(static_cast(winrt::Microsoft::Windows::Management::Deployment::StubPackageOption::UsePreference) == static_cast(winrt::Windows::Management::Deployment::StubPackageOption::UsePreference), + "winrt::Microsoft::Windows::Management::Deployment::StubPackageOption::UsePreference != winrt::Windows::Management::Deployment::StubPackageOption::UsePreference"); + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager PackageDeploymentManager::GetDefault() + { + return winrt::make(); + } + bool PackageDeploymentManager::IsPackageSetReady(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet) + { + Validate(packageSet); + + for (const winrt::Microsoft::Windows::Management::Deployment::PackageSetItem& packageSetItem : packageSet.PackageSetItems()) + { + if (!IsReady(packageSetItem)) + { + (void)LOG_HR_MSG(MSIXPACKAGEMANAGER_E_PACKAGE_SCAN_FAILED, + "Id=%ls PackageFamilyName=%ls MinVersion=%hu.%hu.%hu.%hu ArchitectureFilter:0x%X", + packageSetItem.Id().c_str(), + packageSetItem.PackageFamilyName().c_str(), + packageSetItem.MinVersion().Major, + packageSetItem.MinVersion().Minor, + packageSetItem.MinVersion().Build, + packageSetItem.MinVersion().Revision, + packageSetItem.ProcessorArchitectureFilter()); + return false; + } + } + return true; + } + bool PackageDeploymentManager::IsPackageSetReadyById(hstring const& packageSetId) + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::IAsyncOperationWithProgress + PackageDeploymentManager::EnsurePackageSetIsReadyAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options) + { + //TODO auto logTelemetry{ PackageDeploymentTelemetry::CreateChannelAsync::Start(g_telemetryHelper, remoteId) }; + + auto strong = get_strong(); //TODO why? + + auto cancellation{ co_await winrt::get_cancellation_token() }; + cancellation.enable_propagation(true); + + //TODO logTelemetry.IgnoreCurrentThread(); + + // Allow to register the progress and complete handler + co_await resume_background(); + + //TODO auto logTelemetryContinuation = logTelemetry.ContinueOnCurrentThread(); + + auto progress{ co_await winrt::get_progress_token() }; + auto packageDeploymentProgress{ + winrt::make< + winrt::Microsoft::Windows::Management::Deployment::implementation::PackageDeploymentProgress>( + PackageDeploymentProgressStatus::Queued, 0) }; + progress(packageDeploymentProgress); + + // Check parameter(s) + Validate(packageSet); + + // Is there any work to do? + packageDeploymentProgress.status(PackageDeploymentProgressStatus::InProgress); + const double c_progressPercentageStartOfIsReady{ 0.01 }; + packageDeploymentProgress.percentage(c_progressPercentageStartOfIsReady); + progress(packageDeploymentProgress); + if (IsPackageSetReady(packageSet)) + { + co_return winrt::make( + PackageDeploymentStatus::CompletedSuccess, S_OK, true, /*TODO*/winrt::guid{}); + } + + const double c_progressPercentageStartOfInstalls{ 0.10 }; + packageDeploymentProgress.percentage(c_progressPercentageStartOfInstalls); + progress(packageDeploymentProgress); + auto packageSetItems{ packageSet.PackageSetItems() }; + const double progressIncrementPerPackageSetItem{ (1.0 - c_progressPercentageStartOfInstalls) / packageSetItems.Size() }; + for (const winrt::Microsoft::Windows::Management::Deployment::PackageSetItem& packageSetItem : packageSetItems) + { + try + { + EnsureIsReadyAsync(packageSetItem, options); + packageDeploymentProgress.percentage(packageDeploymentProgress.percentage() + progressIncrementPerPackageSetItem); + progress(packageDeploymentProgress); + } + catch (...) + { + auto exception{ hresult_error(to_hresult(), take_ownership_from_abi) }; + co_return winrt::make( + PackageDeploymentStatus::CompletedFailure, exception.code(), false, /*TODO*/winrt::guid{}); + } + } + + co_return winrt::make( + PackageDeploymentStatus::CompletedSuccess, S_OK, true, /*TODO*/winrt::guid{}); + + //TODO logTelemetry.Stop(); + } + winrt::Windows::Foundation::IAsyncOperationWithProgress + PackageDeploymentManager::EnsurePackageSetIsReadyByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options) + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::IAsyncOperationWithProgress + PackageDeploymentManager::AddPackageAsync(hstring package, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options) + { + const winrt::Windows::Foundation::Uri packageUri{ package }; + const auto packageAbsoluteUri{ packageUri.AbsoluteUri() }; + if (!packageAbsoluteUri.empty()) + { + const std::wstring packageAsString{ package.c_str() }; + if (packageAsString.ends_with(L".appinstaller")) + { + //TODO: return AddPackageByAppInstallerFileAsync(packageUri); + } + else + { + return AddPackageByUriAsync(packageUri, options); + } + } + THROW_HR_MSG(E_INVALIDARG, "%ls", package.c_str()); + } + winrt::Windows::Foundation::IAsyncOperationWithProgress + PackageDeploymentManager::AddPackageByUriAsync(winrt::Windows::Foundation::Uri packageUri, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options) + { + //TODO auto logTelemetry{ PackageDeploymentTelemetry::CreateChannelAsync::Start(g_telemetryHelper, remoteId) }; + + auto strong = get_strong(); //TODO why? + + auto cancellation{ co_await winrt::get_cancellation_token() }; + cancellation.enable_propagation(true); + + //TODO logTelemetry.IgnoreCurrentThread(); + + // Allow to register the progress and complete handler + co_await resume_background(); + + //TODO auto logTelemetryContinuation = logTelemetry.ContinueOnCurrentThread(); + + auto progress{ co_await winrt::get_progress_token() }; + auto packageDeploymentProgress{ + winrt::make< + winrt::Microsoft::Windows::Management::Deployment::implementation::PackageDeploymentProgress>( + PackageDeploymentProgressStatus::Queued, 0) }; + progress(packageDeploymentProgress); + + // Check parameter(s) + //TODO Validate(packageSet); + + winrt::Windows::Management::Deployment::AddPackageOptions addOptions/*TODO { ToOptions(options) }*/; + try + { + auto deploymentOperation{ m_packageManager.AddPackageByUriAsync(packageUri, addOptions) }; + deploymentOperation.get(); + const auto deploymentResult{ deploymentOperation.GetResults() }; + if (deploymentOperation.Status() != winrt::Windows::Foundation::AsyncStatus::Completed) + { + co_return winrt::make( + PackageDeploymentStatus::CompletedSuccess, S_OK, deploymentResult.IsRegistered(), /*TODO*/winrt::guid{}); + } + else if (deploymentOperation.Status() == winrt::Windows::Foundation::AsyncStatus::Error) + { + const winrt::hresult hr{ static_cast(deploymentOperation.ErrorCode()) }; + const winrt::hresult extendedHr{ deploymentResult.ExtendedErrorCode() }; + FAIL_FAST_HR_IF_MSG(E_UNEXPECTED, SUCCEEDED(hr) && SUCCEEDED(extendedHr), "%ls", packageUri.ToString().c_str()); + const winrt::hresult resultHr{ FAILED(hr) ? hr : extendedHr }; + co_return winrt::make( + PackageDeploymentStatus::CompletedFailure, resultHr, deploymentResult.IsRegistered(), /*TODO*/winrt::guid{}); + } + else if (deploymentOperation.Status() == winrt::Windows::Foundation::AsyncStatus::Canceled) + { + THROW_WIN32_MSG(ERROR_CANCELLED, "%ls", packageUri.ToString().c_str()); + } + FAIL_FAST_HR_MSG(E_UNEXPECTED, "Status:%d Uri:%ls", static_cast(deploymentOperation.Status()), packageUri.ToString().c_str()); + } + catch (...) + { + auto exception{ hresult_error(to_hresult(), take_ownership_from_abi) }; + (void)LOG_HR_MSG(exception.code(), "%ls", packageUri.ToString().c_str()); + co_return winrt::make( + PackageDeploymentStatus::CompletedFailure, exception.code(), false, /*TODO*/winrt::guid{}); + } + + //TODO logTelemetry.Stop(); + } + winrt::Windows::Foundation::IAsyncOperationWithProgress + PackageDeploymentManager::AddPackageSetAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options) + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::IAsyncOperationWithProgress + PackageDeploymentManager::AddPackageSetByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options) + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::IAsyncOperationWithProgress + PackageDeploymentManager::RemovePackageByFullNameNameAsync(hstring packageFullName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options) + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::IAsyncOperationWithProgress + PackageDeploymentManager::RemovePackageByFamilyNameNameAsync(hstring packageFamilyName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options) + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::IAsyncOperationWithProgress + PackageDeploymentManager::RemovePackageSetAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options) + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::IAsyncOperationWithProgress + PackageDeploymentManager::RemovePackageSetByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options) + { + throw hresult_not_implemented(); + } + + bool PackageDeploymentManager::IsReady(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem) + { + const AppModel::Identity::PackageVersion minVersion{ packageSetItem.MinVersion() }; + const auto processorArchitectureFilter{ packageSetItem.ProcessorArchitectureFilter() }; + return ::Microsoft::Windows::ApplicationModel::PackageDeploymentResolver::FindAny(m_packageManager, packageSetItem.PackageFamilyName(), minVersion, processorArchitectureFilter); + } + + void PackageDeploymentManager::Validate(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet) const + { + THROW_HR_IF(E_INVALIDARG, packageSet.Id().empty()); + const auto& packageSetItems{ packageSet.PackageSetItems() }; + THROW_HR_IF(E_INVALIDARG, packageSetItems.Size() == 0); + for (const winrt::Microsoft::Windows::Management::Deployment::PackageSetItem& packageSetItem : packageSetItems) + { + Validate(packageSetItem); + } + } + + void PackageDeploymentManager::Validate(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem) const + { + const auto packageFamilyName{ packageSetItem.PackageFamilyName() }; + THROW_IF_WIN32_ERROR_MSG(VerifyPackageFamilyName(packageFamilyName.c_str()), "PackageFamilyName:%ls", packageFamilyName.c_str()); + + const auto packageUri{ packageSetItem.PackageUri() }; + THROW_HR_IF_NULL_MSG(E_INVALIDARG, packageUri, "PackageUri:"); + } + + void PackageDeploymentManager::EnsureIsReadyAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem, winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions const& options) + { + if (IsReady(packageSetItem)) + { + return; + } + + auto packageUri{ packageSetItem.PackageUri() }; + winrt::Windows::Management::Deployment::AddPackageOptions addOptions/*TODO { ToOptions(options) }*/; + auto deploymentOperation{ m_packageManager.AddPackageByUriAsync(packageUri, addOptions) }; + deploymentOperation.get(); + try + { + const auto deploymentResult{ deploymentOperation.GetResults() }; + if (deploymentOperation.Status() == winrt::Windows::Foundation::AsyncStatus::Error) + { + const winrt::hresult hr{ static_cast(deploymentOperation.ErrorCode()) }; + THROW_IF_FAILED_MSG(hr, "%ls", packageUri.ToString().c_str()); + const winrt::hresult extendedHr{ deploymentResult.ExtendedErrorCode() }; + THROW_IF_FAILED_MSG(extendedHr, "%ls", packageUri.ToString().c_str()); + FAIL_FAST_HR_MSG(E_UNEXPECTED, "%ls", packageUri.ToString().c_str()); + } + else if (deploymentOperation.Status() == winrt::Windows::Foundation::AsyncStatus::Canceled) + { + THROW_WIN32_MSG(ERROR_CANCELLED, "%ls", packageUri.ToString().c_str()); + } + FAIL_FAST_HR_IF_MSG(E_UNEXPECTED, deploymentOperation.Status() != winrt::Windows::Foundation::AsyncStatus::Completed, "%ls", packageUri.ToString().c_str()); + } + catch (...) + { + auto exception{ hresult_error(to_hresult(), take_ownership_from_abi) }; + THROW_HR_MSG(exception.code(), "%ls", packageUri.ToString().c_str()); + } + } + + winrt::Windows::Management::Deployment::PackageVolume PackageDeploymentManager::ToPackageVolume(winrt::Microsoft::Windows::Management::Deployment::PackageVolume const& packageVolume) const + { + auto toPackageVolume{ m_packageManager.FindPackageVolume(packageVolume.Name()) }; + return toPackageVolume; + } + + winrt::Windows::Management::Deployment::AddPackageOptions PackageDeploymentManager::ToOptions(winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions const& options) const + { + winrt::Windows::Management::Deployment::AddPackageOptions toOptions; + if (options.TargetVolume()) + { + toOptions.TargetVolume(ToPackageVolume(options.TargetVolume())); + } + for (const auto uri : options.DependencyPackageUris()) + { + toOptions.DependencyPackageUris().Append(uri); + } + for (const auto packageFamilyName : options.OptionalPackageFamilyNames()) + { + toOptions.OptionalPackageFamilyNames().Append(packageFamilyName); + } + for (const auto uri : options.OptionalPackageUris()) + { + toOptions.OptionalPackageUris().Append(uri); + } + for (const auto uri : options.RelatedPackageUris()) + { + toOptions.RelatedPackageUris().Append(uri); + } + toOptions.ExternalLocationUri(options.ExternalLocationUri()); + toOptions.StubPackageOption(static_cast(options.StubPackageOption())); + toOptions.AllowUnsigned(options.AllowUnsigned()); + toOptions.DeveloperMode(options.DeveloperMode()); + toOptions.ForceAppShutdown(options.ForceAppShutdown()); + toOptions.ForceTargetAppShutdown(options.ForceTargetAppShutdown()); + toOptions.ForceUpdateFromAnyVersion(options.ForceUpdateFromAnyVersion()); + toOptions.InstallAllResources(options.InstallAllResources()); + toOptions.RequiredContentGroupOnly(options.RequiredContentGroupOnly()); + toOptions.RetainFilesOnFailure(options.RetainFilesOnFailure()); + toOptions.StageInPlace(options.StageInPlace()); + toOptions.DeferRegistrationWhenPackagesAreInUse(options.DeferRegistrationWhenPackagesAreInUse()); + if (options.IsExpectedDigestsSupported()) + { + auto toExpectedDigests = toOptions.ExpectedDigests(); + for (const auto expectedDigest : options.ExpectedDigests()) + { + toExpectedDigests.Insert(expectedDigest.Key(), expectedDigest.Value()); + } + } + if (options.IsLimitToExistingPackagesSupported()) + { + toOptions.LimitToExistingPackages(options.LimitToExistingPackages()); + } + return toOptions; + } + + winrt::Windows::Management::Deployment::StagePackageOptions PackageDeploymentManager::ToOptions(winrt::Microsoft::Windows::Management::Deployment::StagePackageOptions const& options) const + { + winrt::Windows::Management::Deployment::StagePackageOptions toOptions; + if (options.TargetVolume()) + { + toOptions.TargetVolume(ToPackageVolume(options.TargetVolume())); + } + for (const auto uri : options.DependencyPackageUris()) + { + toOptions.DependencyPackageUris().Append(uri); + } + for (const auto packageFamilyName : options.OptionalPackageFamilyNames()) + { + toOptions.OptionalPackageFamilyNames().Append(packageFamilyName); + } + for (const auto uri : options.OptionalPackageUris()) + { + toOptions.OptionalPackageUris().Append(uri); + } + for (const auto uri : options.RelatedPackageUris()) + { + toOptions.RelatedPackageUris().Append(uri); + } + toOptions.ExternalLocationUri(options.ExternalLocationUri()); + toOptions.StubPackageOption(static_cast(options.StubPackageOption())); + toOptions.DeveloperMode(options.DeveloperMode()); + toOptions.ForceUpdateFromAnyVersion(options.ForceUpdateFromAnyVersion()); + toOptions.InstallAllResources(options.InstallAllResources()); + toOptions.RequiredContentGroupOnly(options.RequiredContentGroupOnly()); + toOptions.StageInPlace(options.StageInPlace()); + toOptions.AllowUnsigned(options.AllowUnsigned()); + if (options.IsExpectedDigestsSupported()) + { + auto toExpectedDigests = toOptions.ExpectedDigests(); + for (const auto expectedDigest : options.ExpectedDigests()) + { + toExpectedDigests.Insert(expectedDigest.Key(), expectedDigest.Value()); + } + } + return toOptions; + } + + winrt::Windows::Management::Deployment::RegisterPackageOptions PackageDeploymentManager::ToOptions(winrt::Microsoft::Windows::Management::Deployment::RegisterPackageOptions const& options) const + { + winrt::Windows::Management::Deployment::RegisterPackageOptions toOptions; + if (options.AppDataVolume()) + { + toOptions.AppDataVolume(ToPackageVolume(options.AppDataVolume())); + } + for (const auto uri : options.DependencyPackageUris()) + { + toOptions.DependencyPackageUris().Append(uri); + } + for (const auto packageFamilyName : options.OptionalPackageFamilyNames()) + { + toOptions.OptionalPackageFamilyNames().Append(packageFamilyName); + } + toOptions.ExternalLocationUri(options.ExternalLocationUri()); + toOptions.DeveloperMode(options.DeveloperMode()); + toOptions.ForceAppShutdown(options.ForceAppShutdown()); + toOptions.ForceTargetAppShutdown(options.ForceTargetAppShutdown()); + toOptions.ForceUpdateFromAnyVersion(options.ForceUpdateFromAnyVersion()); + toOptions.InstallAllResources(options.InstallAllResources()); + toOptions.StageInPlace(options.StageInPlace()); + toOptions.AllowUnsigned(options.AllowUnsigned()); + toOptions.DeferRegistrationWhenPackagesAreInUse(options.DeferRegistrationWhenPackagesAreInUse()); + if (options.IsExpectedDigestsSupported()) + { + auto toExpectedDigests = toOptions.ExpectedDigests(); + for (const auto expectedDigest : options.ExpectedDigests()) + { + toExpectedDigests.Insert(expectedDigest.Key(), expectedDigest.Value()); + } + } + return toOptions; + } + + winrt::Windows::Management::Deployment::RemovalOptions PackageDeploymentManager::ToOptions(winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions const& options) const + { + auto toOptions{ winrt::Windows::Management::Deployment::RemovalOptions::None }; + if (options.PreserveApplicationData()) + { + toOptions |= winrt::Windows::Management::Deployment::RemovalOptions::PreserveApplicationData; + } + if (options.PreserveRoamableApplicationData()) + { + toOptions |= winrt::Windows::Management::Deployment::RemovalOptions::PreserveRoamableApplicationData; + } + if (options.RemoveForAllUsers()) + { + toOptions |= winrt::Windows::Management::Deployment::RemovalOptions::RemoveForAllUsers; + } + //TODO DeploymentPriority Priority; + return toOptions; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.h b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.h new file mode 100644 index 0000000000..5c1f7e4834 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.h @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.PackageDeploymentManager.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct PackageDeploymentManager : PackageDeploymentManagerT + { + PackageDeploymentManager() = default; + + static winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager GetDefault(); + bool IsPackageSetReady(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet); + bool IsPackageSetReadyById(hstring const& packageSetId); + winrt::Windows::Foundation::IAsyncOperationWithProgress EnsurePackageSetIsReadyAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress EnsurePackageSetIsReadyByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageAsync(hstring package, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageByUriAsync(winrt::Windows::Foundation::Uri packageUri, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageSetAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress AddPackageSetByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageByFullNameNameAsync(hstring packageFullName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageByFamilyNameNameAsync(hstring packageFamilyName, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageSetAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); + winrt::Windows::Foundation::IAsyncOperationWithProgress RemovePackageSetByIdAsync(hstring packageSetId, winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions options); + + private: + bool IsReady(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSet); + void Validate(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet) const; + void Validate(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem) const; + void EnsureIsReadyAsync(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem, winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions const& options); + winrt::Windows::Management::Deployment::PackageVolume ToPackageVolume(winrt::Microsoft::Windows::Management::Deployment::PackageVolume const& packageVolume) const; + winrt::Windows::Management::Deployment::AddPackageOptions ToOptions(winrt::Microsoft::Windows::Management::Deployment::AddPackageOptions const& options) const; + winrt::Windows::Management::Deployment::StagePackageOptions ToOptions(winrt::Microsoft::Windows::Management::Deployment::StagePackageOptions const& options) const; + winrt::Windows::Management::Deployment::RegisterPackageOptions ToOptions(winrt::Microsoft::Windows::Management::Deployment::RegisterPackageOptions const& options) const; + winrt::Windows::Management::Deployment::RemovalOptions ToOptions(winrt::Microsoft::Windows::Management::Deployment::RemovePackageOptions const& options) const; + + private: + winrt::Windows::Management::Deployment::PackageManager m_packageManager; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct PackageDeploymentManager : PackageDeploymentManagerT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageDeploymentProgress.cpp b/dev/PackageManager/API/M.W.M.D.PackageDeploymentProgress.cpp new file mode 100644 index 0000000000..51cb33ba92 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageDeploymentProgress.cpp @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" +#include "M.W.M.D.PackageDeploymentProgress.h" +#include "Microsoft.Windows.Management.Deployment.PackageDeploymentProgress.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + PackageDeploymentProgress::PackageDeploymentProgress( + winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentProgressStatus const& status, + double percentage) : + m_status(status), + m_percentage(percentage) + { + } + + winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentProgressStatus PackageDeploymentProgress::status() + { + return m_status; + } + void PackageDeploymentProgress::status(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentProgressStatus const& value) + { + m_status = value; + } + double PackageDeploymentProgress::percentage() + { + return m_percentage; + } + void PackageDeploymentProgress::percentage(double value) + { + m_percentage = value; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageDeploymentProgress.h b/dev/PackageManager/API/M.W.M.D.PackageDeploymentProgress.h new file mode 100644 index 0000000000..21da166ad2 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageDeploymentProgress.h @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.PackageDeploymentProgress.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct PackageDeploymentProgress : PackageDeploymentProgressT + { + PackageDeploymentProgress() = default; + + PackageDeploymentProgress( + winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentProgressStatus const& status, + double percentage); + + winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentProgressStatus status(); + void status(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentProgressStatus const& value); + double percentage(); + void percentage(double value); + + private: + winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentProgressStatus m_status{}; + double m_percentage{}; + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageDeploymentResult.cpp b/dev/PackageManager/API/M.W.M.D.PackageDeploymentResult.cpp new file mode 100644 index 0000000000..ba5bd56032 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageDeploymentResult.cpp @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" +#include "M.W.M.D.PackageDeploymentResult.h" +#include "Microsoft.Windows.Management.Deployment.PackageDeploymentResult.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + PackageDeploymentResult::PackageDeploymentResult(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus status, winrt::hresult const& extendedError, bool isRegistered, winrt::guid const& activityId) : + m_status(status), + m_extendedError(extendedError), + m_isRegistered(isRegistered), + m_activityId(activityId) + { + } + + winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus PackageDeploymentResult::Status() + { + return m_status; + } + winrt::hresult PackageDeploymentResult::ExtendedError() + { + return m_extendedError; + } + bool PackageDeploymentResult::IsRegistered() + { + return m_isRegistered; + } + winrt::guid PackageDeploymentResult::ActivityId() + { + return m_activityId; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageDeploymentResult.h b/dev/PackageManager/API/M.W.M.D.PackageDeploymentResult.h new file mode 100644 index 0000000000..ba865976d0 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageDeploymentResult.h @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.PackageDeploymentResult.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct PackageDeploymentResult : PackageDeploymentResultT + { + PackageDeploymentResult() = default; + PackageDeploymentResult(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus status, winrt::hresult const& extendedError, bool isRegistered, winrt::guid const& activityId); + + winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus Status(); + winrt::hresult ExtendedError(); + winrt::guid ActivityId(); + bool IsRegistered(); + + private: + PackageDeploymentStatus m_status{}; + winrt::hresult m_extendedError; + bool m_isRegistered{}; + winrt::guid m_activityId{}; + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageRuntimeManager.cpp b/dev/PackageManager/API/M.W.M.D.PackageRuntimeManager.cpp new file mode 100644 index 0000000000..cff2cbf024 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageRuntimeManager.cpp @@ -0,0 +1,125 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" +#include "M.W.M.D.PackageRuntimeManager.h" +#include "Microsoft.Windows.Management.Deployment.PackageRuntimeManager.g.cpp" + +#include "M.W.M.D.PackageSetItemRuntimeDisposition.h" +#include "M.W.M.D.PackageSetRuntimeDisposition.h" + +#include +#include +#include + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager PackageRuntimeManager::GetDefault() + { + return winrt::make(); + } + winrt::Microsoft::Windows::Management::Deployment::PackageSetRuntimeDisposition PackageRuntimeManager::AddPackageSet(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet) + { + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + return AddPackageSet(packageSet, createOptions, addOptions); + } + winrt::Microsoft::Windows::Management::Deployment::PackageSetRuntimeDisposition PackageRuntimeManager::AddPackageSet(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& createOptions, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& addOptions) + { + // Check parameter(s) + Validate(packageSet); + Validate(createOptions); + Validate(addOptions); + + winrt::Microsoft::Windows::Management::Deployment::PackageSetRuntimeDisposition packageSetRuntimeDisposition; + packageSetRuntimeDisposition.PackageSetId(packageSet.Id()); + auto packageSetItemRuntimeDispositions{ packageSetRuntimeDisposition.PackageSetItemRuntimeDispositions() }; + + const auto packageSetItems{ packageSet.PackageSetItems() }; + for (const winrt::Microsoft::Windows::Management::Deployment::PackageSetItem& packageSetItem : packageSetItems) + { + auto packageSetItemRuntimeDisposition{ AddPackageSetItem(packageSetItem, createOptions, addOptions) }; + packageSetItemRuntimeDispositions.Append(packageSetItemRuntimeDisposition); + } + + return packageSetRuntimeDisposition; + } + winrt::Microsoft::Windows::Management::Deployment::PackageSetRuntimeDisposition PackageRuntimeManager::AddPackageSetById(hstring const& packageSetId) + { + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + return AddPackageSetById(packageSetId, createOptions, addOptions); + } + winrt::Microsoft::Windows::Management::Deployment::PackageSetRuntimeDisposition PackageRuntimeManager::AddPackageSetById(hstring const& packageSetId, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& createOptions, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& addOptions) + { + throw hresult_not_implemented(); + } + void PackageRuntimeManager::RemovePackageSet(winrt::Microsoft::Windows::Management::Deployment::PackageSetRuntimeDisposition const& packageSetRuntimeDisposition) + { + const auto packageSetItemRuntimeDispositions{ packageSetRuntimeDisposition.PackageSetItemRuntimeDispositions() }; + for (const winrt::Microsoft::Windows::Management::Deployment::PackageSetItemRuntimeDisposition& packageSetItemRuntimeDisposition : packageSetItemRuntimeDispositions) + { + RemovePackageSetItem(packageSetItemRuntimeDisposition); + } + } + + winrt::Microsoft::Windows::Management::Deployment::PackageSetItemRuntimeDisposition PackageRuntimeManager::AddPackageSetItem(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& createOptions, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& addOptions) + { + auto createPackageDependencyOptions{ MddCreatePackageDependencyOptions::None }; + WI_SetFlagIf(createPackageDependencyOptions, MddCreatePackageDependencyOptions::DoNotVerifyDependencyResolution, !createOptions.VerifyDependencyResolution()); + wil::unique_process_heap_string packageDependencyId; + THROW_IF_FAILED(MddCore::Win11::TryCreatePackageDependency(nullptr, packageSetItem.PackageFamilyName(), + packageSetItem.MinVersion(), packageSetItem.ProcessorArchitectureFilter(), + createOptions, &packageDependencyId)); + + auto addPackageDependencyOptions{ MddAddPackageDependencyOptions::None }; + WI_SetFlagIf(addPackageDependencyOptions, MddAddPackageDependencyOptions::PrependIfRankCollision, addOptions.PrependIfRankCollision()); + wil::unique_mdd_package_dependency_context mddPackageDependencyContext{}; + wil::unique_process_heap_string packageFullName; + THROW_IF_FAILED(MddCore::Win11::AddPackageDependency(packageDependencyId.get(), addOptions, &mddPackageDependencyContext, &packageFullName)); + + auto packageSetItemRuntimeDisposition{ winrt::make( + packageSetItem.Id(), packageFullName.get(), packageDependencyId.get(), mddPackageDependencyContext.get()) }; + mddPackageDependencyContext.reset(); + return packageSetItemRuntimeDisposition; + } + + void PackageRuntimeManager::RemovePackageSetItem(winrt::Microsoft::Windows::Management::Deployment::PackageSetItemRuntimeDisposition const& packageSetItemRuntimeDisposition) + { + const auto packageDependencyContextId{ packageSetItemRuntimeDisposition.PackageDependencyContextId() }; + MddCore::Win11::RemovePackageDependency(packageDependencyContextId); + + const auto packageDependencyId{ packageSetItemRuntimeDisposition.PackageDependencyId() }; + MddCore::Win11::DeletePackageDependency(packageDependencyId); + } + + void PackageRuntimeManager::Validate(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet) const + { + THROW_HR_IF(E_INVALIDARG, packageSet.Id().empty()); + const auto& packageSetItems{ packageSet.PackageSetItems() }; + THROW_HR_IF(E_INVALIDARG, packageSetItems.Size() == 0); + for (const winrt::Microsoft::Windows::Management::Deployment::PackageSetItem& packageSetItem : packageSetItems) + { + Validate(packageSetItem); + } + } + + void PackageRuntimeManager::Validate(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem) const + { + const auto packageFamilyName{ packageSetItem.PackageFamilyName() }; + THROW_IF_WIN32_ERROR_MSG(VerifyPackageFamilyName(packageFamilyName.c_str()), "PackageFamilyName:%ls", packageFamilyName.c_str()); + + const auto packageUri{ packageSetItem.PackageUri() }; + THROW_HR_IF_NULL_MSG(E_INVALIDARG, packageUri, "PackageUri:"); + } + + void PackageRuntimeManager::Validate(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& options) const + { + // Nothing to do! + } + + void PackageRuntimeManager::Validate(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& options) const + { + // Nothing to do! + } +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageRuntimeManager.h b/dev/PackageManager/API/M.W.M.D.PackageRuntimeManager.h new file mode 100644 index 0000000000..18e65ad647 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageRuntimeManager.h @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.PackageRuntimeManager.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct PackageRuntimeManager : PackageRuntimeManagerT + { + PackageRuntimeManager() = default; + + static winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager GetDefault(); + winrt::Microsoft::Windows::Management::Deployment::PackageSetRuntimeDisposition AddPackageSet(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet); + winrt::Microsoft::Windows::Management::Deployment::PackageSetRuntimeDisposition AddPackageSet(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& createOptions, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& addOptions); + winrt::Microsoft::Windows::Management::Deployment::PackageSetRuntimeDisposition AddPackageSetById(hstring const& packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetRuntimeDisposition AddPackageSetById(hstring const& packageSetId, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& createOptions, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& addOptions); + void RemovePackageSet(winrt::Microsoft::Windows::Management::Deployment::PackageSetRuntimeDisposition const& packageSetRuntimeDisposition); + private: + winrt::Microsoft::Windows::Management::Deployment::PackageSetItemRuntimeDisposition AddPackageSetItem(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& createOptions, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& addOptions); + void RemovePackageSetItem(winrt::Microsoft::Windows::Management::Deployment::PackageSetItemRuntimeDisposition const& packageSetItemRuntimeDisposition); + void Validate(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet) const; + void Validate(winrt::Microsoft::Windows::Management::Deployment::PackageSetItem const& packageSetItem) const; + void Validate(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& options) const; + void Validate(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& options) const; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct PackageRuntimeManager : PackageRuntimeManagerT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageSet.cpp b/dev/PackageManager/API/M.W.M.D.PackageSet.cpp new file mode 100644 index 0000000000..9382a7c428 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageSet.cpp @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" +#include "M.W.M.D.PackageSet.h" +#include "Microsoft.Windows.Management.Deployment.PackageSet.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + hstring PackageSet::Id() + { + return m_id; + } + void PackageSet::Id(hstring const& value) + { + m_id = value; + } + winrt::Windows::Foundation::Collections::IVector PackageSet::PackageSetItems() + { + if (!m_packageSetItems) + { + m_packageSetItems = winrt::single_threaded_vector(); + } + return m_packageSetItems; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageSet.h b/dev/PackageManager/API/M.W.M.D.PackageSet.h new file mode 100644 index 0000000000..f38581041e --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageSet.h @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.PackageSet.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct PackageSet : PackageSetT + { + PackageSet() = default; + + hstring Id(); + void Id(hstring const& value); + winrt::Windows::Foundation::Collections::IVector PackageSetItems(); + + private: + hstring m_id; + winrt::Windows::Foundation::Collections::IVector m_packageSetItems; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct PackageSet : PackageSetT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageSetItem.cpp b/dev/PackageManager/API/M.W.M.D.PackageSetItem.cpp new file mode 100644 index 0000000000..ab8623dbfe --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageSetItem.cpp @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" +#include "M.W.M.D.PackageSetItem.h" +#include "Microsoft.Windows.Management.Deployment.PackageSetItem.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + hstring PackageSetItem::Id() + { + return m_id; + } + void PackageSetItem::Id(hstring const& value) + { + m_id = value; + } + hstring PackageSetItem::PackageFamilyName() + { + return m_packageFamilyName; + } + void PackageSetItem::PackageFamilyName(hstring const& value) + { + m_packageFamilyName = value; + } + winrt::Windows::ApplicationModel::PackageVersion PackageSetItem::MinVersion() + { + return m_minVersion; + } + void PackageSetItem::MinVersion(winrt::Windows::ApplicationModel::PackageVersion const& value) + { + m_minVersion = value; + } + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures PackageSetItem::ProcessorArchitectureFilter() + { + return m_processorArchitectureFilter; + } + void PackageSetItem::ProcessorArchitectureFilter(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures const& value) + { + m_processorArchitectureFilter = value; + } + winrt::Windows::Foundation::Uri PackageSetItem::PackageUri() + { + return m_packageUri; + } + void PackageSetItem::PackageUri(winrt::Windows::Foundation::Uri const& value) + { + m_packageUri = value; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageSetItem.h b/dev/PackageManager/API/M.W.M.D.PackageSetItem.h new file mode 100644 index 0000000000..00e98e04cc --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageSetItem.h @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.PackageSetItem.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct PackageSetItem : PackageSetItemT + { + PackageSetItem() = default; + + hstring Id(); + void Id(hstring const& value); + + hstring PackageFamilyName(); + void PackageFamilyName(hstring const& value); + winrt::Windows::ApplicationModel::PackageVersion MinVersion(); + void MinVersion(winrt::Windows::ApplicationModel::PackageVersion const& value); + + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures ProcessorArchitectureFilter(); + void ProcessorArchitectureFilter(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures const& value); + winrt::Windows::Foundation::Uri PackageUri(); + void PackageUri(winrt::Windows::Foundation::Uri const& value); + + private: + hstring m_id; + hstring m_packageFamilyName; + winrt::Windows::ApplicationModel::PackageVersion m_minVersion{}; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures m_processorArchitectureFilter{}; + winrt::Windows::Foundation::Uri m_packageUri{ nullptr }; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct PackageSetItem : PackageSetItemT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageSetItemRuntimeDisposition.cpp b/dev/PackageManager/API/M.W.M.D.PackageSetItemRuntimeDisposition.cpp new file mode 100644 index 0000000000..21fe846d79 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageSetItemRuntimeDisposition.cpp @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include "M.W.M.D.PackageSetItemRuntimeDisposition.h" +#include "Microsoft.Windows.Management.Deployment.PackageSetItemRuntimeDisposition.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + hstring PackageSetItemRuntimeDisposition::PackageSetItemId() + { + return m_packageSetItemId; + } + hstring PackageSetItemRuntimeDisposition::PackageFullName() + { + return m_packageFullName; + } + hstring PackageSetItemRuntimeDisposition::PackageDependencyId() + { + return m_packageDependencyId; + } + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId PackageSetItemRuntimeDisposition::PackageDependencyContextId() + { + return m_packageDependencyContextId; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageSetItemRuntimeDisposition.h b/dev/PackageManager/API/M.W.M.D.PackageSetItemRuntimeDisposition.h new file mode 100644 index 0000000000..34fec4a95c --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageSetItemRuntimeDisposition.h @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.PackageSetItemRuntimeDisposition.g.h" + +#include "MsixDynamicDependency.h" +#include + +#include "MddWin11.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct PackageSetItemRuntimeDisposition : PackageSetItemRuntimeDispositionT + { + PackageSetItemRuntimeDisposition() = default; + PackageSetItemRuntimeDisposition(winrt::hstring const& packageSetItemId, + winrt::hstring const& packageFullName, + winrt::hstring const& packageDependencyId, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId packageDependencyContextId) : + m_packageSetItemId(packageSetItemId), + m_packageFullName(packageFullName), + m_packageDependencyId(packageDependencyId), + m_packageDependencyContextId(packageDependencyContextId) + { + } + PackageSetItemRuntimeDisposition(winrt::hstring const& packageSetItemId, + winrt::hstring const& packageFullName, + winrt::hstring const& packageDependencyId, + MDD_PACKAGEDEPENDENCY_CONTEXT mddPackageDependencyContext) : + m_packageSetItemId(packageSetItemId), + m_packageFullName(packageFullName), + m_packageDependencyId(packageDependencyId), + m_packageDependencyContextId(MddCore::Win11::ToContextId(mddPackageDependencyContext)) + { + } + + hstring PackageSetItemId(); + hstring PackageFullName(); + hstring PackageDependencyId(); + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId PackageDependencyContextId(); + + private: + hstring m_packageSetItemId; + hstring m_packageFullName; + hstring m_packageDependencyId; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId m_packageDependencyContextId; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct PackageSetItemRuntimeDisposition : PackageSetItemRuntimeDispositionT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageSetManager.cpp b/dev/PackageManager/API/M.W.M.D.PackageSetManager.cpp new file mode 100644 index 0000000000..96006406b0 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageSetManager.cpp @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" +#include "M.W.M.D.PackageSetManager.h" +#include "Microsoft.Windows.Management.Deployment.PackageSetManager.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + winrt::Microsoft::Windows::Management::Deployment::PackageSetManager PackageSetManager::GetDefault() + { + throw hresult_not_implemented(); + } + void PackageSetManager::Add(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet) + { + throw hresult_not_implemented(); + } + void PackageSetManager::Update(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet) + { + throw hresult_not_implemented(); + } + void PackageSetManager::Remove(hstring const& packageSetId) + { + throw hresult_not_implemented(); + } + winrt::Microsoft::Windows::Management::Deployment::PackageSet PackageSetManager::Get(hstring const& packageSetId) + { + throw hresult_not_implemented(); + } + winrt::Windows::Foundation::Collections::IVector PackageSetManager::Find(winrt::Microsoft::Windows::Management::Deployment::FindPackageSetOptions const& options) + { + throw hresult_not_implemented(); + } +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageSetManager.h b/dev/PackageManager/API/M.W.M.D.PackageSetManager.h new file mode 100644 index 0000000000..192e0f7d29 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageSetManager.h @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.PackageSetManager.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct PackageSetManager : PackageSetManagerT + { + PackageSetManager() = default; + + static winrt::Microsoft::Windows::Management::Deployment::PackageSetManager GetDefault(); + void Add(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet); + void Update(winrt::Microsoft::Windows::Management::Deployment::PackageSet const& packageSet); + void Remove(hstring const& packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSet Get(hstring const& packageSetId); + winrt::Windows::Foundation::Collections::IVector Find(winrt::Microsoft::Windows::Management::Deployment::FindPackageSetOptions const& options); + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct PackageSetManager : PackageSetManagerT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageSetRuntimeDisposition.cpp b/dev/PackageManager/API/M.W.M.D.PackageSetRuntimeDisposition.cpp new file mode 100644 index 0000000000..0708139845 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageSetRuntimeDisposition.cpp @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include "M.W.M.D.PackageSetRuntimeDisposition.h" +#include "Microsoft.Windows.Management.Deployment.PackageSetRuntimeDisposition.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + hstring PackageSetRuntimeDisposition::PackageSetId() + { + return m_packageSetId; + } + void PackageSetRuntimeDisposition::PackageSetId(hstring const& value) + { + m_packageSetId = value; + } + winrt::Windows::Foundation::Collections::IVector PackageSetRuntimeDisposition::PackageSetItemRuntimeDispositions() + { + if (!m_packageSetItemRuntimeDispositions) + { + m_packageSetItemRuntimeDispositions = winrt::single_threaded_vector(); + } + return m_packageSetItemRuntimeDispositions; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageSetRuntimeDisposition.h b/dev/PackageManager/API/M.W.M.D.PackageSetRuntimeDisposition.h new file mode 100644 index 0000000000..c339c6d611 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageSetRuntimeDisposition.h @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "M.W.M.D.PackageSetRuntimeDisposition.h" +#include "Microsoft.Windows.Management.Deployment.PackageSetRuntimeDisposition.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct PackageSetRuntimeDisposition : PackageSetRuntimeDispositionT + { + PackageSetRuntimeDisposition() = default; +#if 0 + PackageSetRuntimeDisposition(winrt::hstring const& packageSetId) : + m_packageSetId(packageSetId) + { + } + PackageSetRuntimeDisposition(winrt::hstring const& packageSetId, winrt::Windows::Foundation::Collections::IVector& packageSetItemRuntimeDispositions) : + m_packageSetId(packageSetId), + m_packageSetItemRuntimeDispositions(packageSetItemRuntimeDispositions) + { + } +#endif + + hstring PackageSetId(); + void PackageSetId(hstring const& value); + winrt::Windows::Foundation::Collections::IVector PackageSetItemRuntimeDispositions(); + private: + hstring m_packageSetId; + winrt::Windows::Foundation::Collections::IVector m_packageSetItemRuntimeDispositions{}; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct PackageSetRuntimeDisposition : PackageSetRuntimeDispositionT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageVolume.cpp b/dev/PackageManager/API/M.W.M.D.PackageVolume.cpp new file mode 100644 index 0000000000..835e8aa25d --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageVolume.cpp @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" +#include "M.W.M.D.PackageVolume.h" +#include "Microsoft.Windows.Management.Deployment.PackageVolume.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + PackageVolume::PackageVolume(winrt::Windows::Management::Deployment::PackageVolume const& value) + { + m_isSystemVolume = value.IsSystemVolume(); + m_mountPoint = value.MountPoint(); + m_name = value.Name(); + m_packageStorePath = value.PackageStorePath(); + m_supportsHardLinks = value.SupportsHardLinks(); + m_isFullTrustPackageSupported = value.IsFullTrustPackageSupported(); + m_isAppxInstallSupported = value.IsAppxInstallSupported(); + //TODO m_packageStatus = value.Status(); + } + bool PackageVolume::IsSystemVolume() + { + return m_isSystemVolume; + } + hstring PackageVolume::MountPoint() + { + return m_mountPoint; + } + hstring PackageVolume::Name() + { + return m_name; + } + hstring PackageVolume::PackageStorePath() + { + return m_packageStorePath; + } + bool PackageVolume::SupportsHardLinks() + { + return m_supportsHardLinks; + } + bool PackageVolume::IsFullTrustPackageSupported() + { + return m_isFullTrustPackageSupported; + } + bool PackageVolume::IsAppxInstallSupported() + { + return m_isAppxInstallSupported; + } + winrt::Microsoft::Windows::Management::Deployment::PackageVolumeStatus PackageVolume::Status() + { + throw hresult_not_implemented(); + } + void PackageVolume::FixMe() + { + throw hresult_not_implemented(); + } +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageVolume.h b/dev/PackageManager/API/M.W.M.D.PackageVolume.h new file mode 100644 index 0000000000..9c09798084 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageVolume.h @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.PackageVolume.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct PackageVolume : PackageVolumeT + { + PackageVolume() = default; + PackageVolume(winrt::Windows::Management::Deployment::PackageVolume const& value); + + bool IsSystemVolume(); + hstring MountPoint(); + hstring Name(); + hstring PackageStorePath(); + bool SupportsHardLinks(); + bool IsFullTrustPackageSupported(); + bool IsAppxInstallSupported(); + winrt::Microsoft::Windows::Management::Deployment::PackageVolumeStatus Status(); + void FixMe(); + + private: + bool m_isSystemVolume{}; + hstring m_mountPoint; + hstring m_name; + hstring m_packageStorePath; + bool m_supportsHardLinks{}; + bool m_isFullTrustPackageSupported{}; + bool m_isAppxInstallSupported{}; + //TODO winrt::Microsoft::Windows::Management::Deployment::PackageVolumeStatus m_status{}; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct PackageVolume : PackageVolumeT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageVolumeManager.cpp b/dev/PackageManager/API/M.W.M.D.PackageVolumeManager.cpp new file mode 100644 index 0000000000..8a74361c2a --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageVolumeManager.cpp @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "pch.h" +#include "M.W.M.D.PackageVolumeManager.h" +#include "Microsoft.Windows.Management.Deployment.PackageVolumeManager.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + winrt::Windows::Foundation::Collections::IVector PackageVolumeManager::FindPackageVolumes() + { + winrt::Windows::Foundation::Collections::IVector microsoftPackageVolumes{ winrt::single_threaded_vector() }; + + winrt::Windows::Management::Deployment::PackageManager packageManager; + winrt::Windows::Foundation::Collections::IIterable windowsPackageVolumes{ packageManager.FindPackageVolumes() }; + for (winrt::Windows::Management::Deployment::PackageVolume windowsPackageVolume : windowsPackageVolumes) + { + auto microsoftPackageVolume{ winrt::make(windowsPackageVolume) }; + microsoftPackageVolumes.Append(microsoftPackageVolume); + } + return microsoftPackageVolumes; + } + winrt::Microsoft::Windows::Management::Deployment::PackageVolume PackageVolumeManager::FindPackageVolumeByPath(hstring const& path) + { + const auto c_volumePathNameMaxLength{ MAX_PATH }; + wchar_t volumePathName[c_volumePathNameMaxLength]{};//AKA volumeMountPoint + THROW_IF_WIN32_BOOL_FALSE_MSG(::GetVolumePathNameW(path.c_str(), volumePathName, ARRAYSIZE(volumePathName)), "Path:%ls", path.c_str()); + GUID mediaId{}; + const size_t c_volumeNameMaxLength{ 50 }; // "\\?\Volume{GUID}\" == 11 + 11111111-2222-3333-4444-555555555555 + 2 + null-terminator == 11 + 36 + 3 = 50 + wchar_t volumeName[c_volumeNameMaxLength]{}; + THROW_IF_WIN32_BOOL_FALSE_MSG(::GetVolumeNameForVolumeMountPoint(volumePathName, volumeName, ARRAYSIZE(volumeName)), "Path:%ls VolumePathName:%ls", path.c_str(), volumePathName); + const auto volumeNameLength{ wcslen(volumeName) }; + THROW_HR_IF_MSG(E_UNEXPECTED, volumeNameLength == 0, "Path:%ls VolumePathName:%ls", path.c_str(), volumePathName); + const auto offset{ volumeNameLength - 1 }; + if (volumeName[offset] == L'\\') + { + volumeName[offset] = L'\0'; + } + return FindPackageVolumeByName(winrt::hstring{ volumeName }); + } + winrt::Microsoft::Windows::Management::Deployment::PackageVolume PackageVolumeManager::FindPackageVolumeByMediaId(hstring const& mediaId) + { + winrt::Windows::Management::Deployment::PackageManager packageManager; + winrt::Windows::Management::Deployment::PackageVolume windowsPackageVolume{ packageManager.FindPackageVolume(mediaId) }; + return winrt::make(windowsPackageVolume); + } + winrt::Microsoft::Windows::Management::Deployment::PackageVolume PackageVolumeManager::FindPackageVolumeByName(hstring const& name) + { + throw hresult_not_implemented(); + } +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageVolumeManager.h b/dev/PackageManager/API/M.W.M.D.PackageVolumeManager.h new file mode 100644 index 0000000000..94e3db998a --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageVolumeManager.h @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.PackageVolumeManager.g.h" +#include "M.W.M.D.PackageVolume.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct PackageVolumeManager + { + PackageVolumeManager() = default; + + static winrt::Windows::Foundation::Collections::IVector FindPackageVolumes(); + static winrt::Microsoft::Windows::Management::Deployment::PackageVolume FindPackageVolumeByPath(hstring const& path); + static winrt::Microsoft::Windows::Management::Deployment::PackageVolume FindPackageVolumeByMediaId(hstring const& mediaId); + static winrt::Microsoft::Windows::Management::Deployment::PackageVolume FindPackageVolumeByName(hstring const& name); + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct PackageVolumeManager : PackageVolumeManagerT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageVolumeStatus.cpp b/dev/PackageManager/API/M.W.M.D.PackageVolumeStatus.cpp new file mode 100644 index 0000000000..828c54f668 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageVolumeStatus.cpp @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" +#include "M.W.M.D.PackageVolumeStatus.h" +#include "Microsoft.Windows.Management.Deployment.PackageVolumeStatus.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + bool PackageVolumeStatus::IsOK() + { + throw hresult_not_implemented(); + } + void PackageVolumeStatus::IsOK(bool value) + { + throw hresult_not_implemented(); + } + bool PackageVolumeStatus::IsOffline() + { + throw hresult_not_implemented(); + } + void PackageVolumeStatus::IsOffline(bool value) + { + throw hresult_not_implemented(); + } + bool PackageVolumeStatus::IsBroken() + { + throw hresult_not_implemented(); + } + void PackageVolumeStatus::IsBroken(bool value) + { + throw hresult_not_implemented(); + } +} diff --git a/dev/PackageManager/API/M.W.M.D.PackageVolumeStatus.h b/dev/PackageManager/API/M.W.M.D.PackageVolumeStatus.h new file mode 100644 index 0000000000..faa8169a91 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.PackageVolumeStatus.h @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.PackageVolumeStatus.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct PackageVolumeStatus : PackageVolumeStatusT + { + PackageVolumeStatus() = default; + + bool IsOK(); + void IsOK(bool value); + bool IsOffline(); + void IsOffline(bool value); + bool IsBroken(); + void IsBroken(bool value); + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct PackageVolumeStatus : PackageVolumeStatusT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.RegisterPackageOptions.cpp b/dev/PackageManager/API/M.W.M.D.RegisterPackageOptions.cpp new file mode 100644 index 0000000000..8015a759cf --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.RegisterPackageOptions.cpp @@ -0,0 +1,118 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include + +#include "M.W.M.D.RegisterPackageOptions.h" +#include "Microsoft.Windows.Management.Deployment.RegisterPackageOptions.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + winrt::Microsoft::Windows::Management::Deployment::PackageVolume RegisterPackageOptions::AppDataVolume() + { + return m_appDataVolume; + } + void RegisterPackageOptions::AppDataVolume(winrt::Microsoft::Windows::Management::Deployment::PackageVolume const& value) + { + m_appDataVolume = value; + } + winrt::Windows::Foundation::Collections::IVector RegisterPackageOptions::DependencyPackageUris() + { + if (!m_dependencyPackageUris) + { + m_dependencyPackageUris = winrt::single_threaded_vector(); + } + return m_dependencyPackageUris; + } + winrt::Windows::Foundation::Collections::IVector RegisterPackageOptions::OptionalPackageFamilyNames() + { + if (!m_optionalPackageFamilyNames) + { + m_optionalPackageFamilyNames = winrt::single_threaded_vector(); + } + return m_optionalPackageFamilyNames; + } + winrt::Windows::Foundation::Uri RegisterPackageOptions::ExternalLocationUri() + { + return m_externalLocationUri; + } + void RegisterPackageOptions::ExternalLocationUri(winrt::Windows::Foundation::Uri const& value) + { + m_externalLocationUri = value; + } + bool RegisterPackageOptions::DeveloperMode() + { + return m_developerMode; + } + void RegisterPackageOptions::DeveloperMode(bool value) + { + m_developerMode = value; + } + bool RegisterPackageOptions::ForceAppShutdown() + { + return m_forceAppShutdown; + } + void RegisterPackageOptions::ForceAppShutdown(bool value) + { + m_forceAppShutdown = value; + } + bool RegisterPackageOptions::ForceTargetAppShutdown() + { + return m_forceTargetAppShutdown; + } + void RegisterPackageOptions::ForceTargetAppShutdown(bool value) + { + m_forceTargetAppShutdown = value; + } + bool RegisterPackageOptions::ForceUpdateFromAnyVersion() + { + return m_forceUpdateFromAnyVersion; + } + void RegisterPackageOptions::ForceUpdateFromAnyVersion(bool value) + { + m_forceUpdateFromAnyVersion = value; + } + bool RegisterPackageOptions::InstallAllResources() + { + return m_installAllResources; + } + void RegisterPackageOptions::InstallAllResources(bool value) + { + m_installAllResources = value; + } + bool RegisterPackageOptions::StageInPlace() + { + return m_stageInPlace; + } + void RegisterPackageOptions::StageInPlace(bool value) + { + m_stageInPlace = value; + } + bool RegisterPackageOptions::AllowUnsigned() + { + return m_allowUnsigned; + } + void RegisterPackageOptions::AllowUnsigned(bool value) + { + m_allowUnsigned = value; + } + bool RegisterPackageOptions::DeferRegistrationWhenPackagesAreInUse() + { + return m_deferRegistrationWhenPackagesAreInUse; + } + void RegisterPackageOptions::DeferRegistrationWhenPackagesAreInUse(bool value) + { + m_deferRegistrationWhenPackagesAreInUse = value; + } + bool RegisterPackageOptions::IsExpectedDigestsSupported() + { + // Requires Windows >= 10.0.22621.0 (aka Win11 22H2) + return WindowsVersion::IsWindows11_22H2OrGreater(); + } + winrt::Windows::Foundation::Collections::IMap RegisterPackageOptions::ExpectedDigests() + { + return m_expectedDigests; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.RegisterPackageOptions.h b/dev/PackageManager/API/M.W.M.D.RegisterPackageOptions.h new file mode 100644 index 0000000000..27bb36d673 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.RegisterPackageOptions.h @@ -0,0 +1,61 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.RegisterPackageOptions.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct RegisterPackageOptions : RegisterPackageOptionsT + { + RegisterPackageOptions() = default; + + winrt::Microsoft::Windows::Management::Deployment::PackageVolume AppDataVolume(); + void AppDataVolume(winrt::Microsoft::Windows::Management::Deployment::PackageVolume const& value); + winrt::Windows::Foundation::Collections::IVector DependencyPackageUris(); + winrt::Windows::Foundation::Collections::IVector OptionalPackageFamilyNames(); + winrt::Windows::Foundation::Uri ExternalLocationUri(); + void ExternalLocationUri(winrt::Windows::Foundation::Uri const& value); + bool DeveloperMode(); + void DeveloperMode(bool value); + bool ForceAppShutdown(); + void ForceAppShutdown(bool value); + bool ForceTargetAppShutdown(); + void ForceTargetAppShutdown(bool value); + bool ForceUpdateFromAnyVersion(); + void ForceUpdateFromAnyVersion(bool value); + bool InstallAllResources(); + void InstallAllResources(bool value); + bool StageInPlace(); + void StageInPlace(bool value); + bool AllowUnsigned(); + void AllowUnsigned(bool value); + bool IsDeferRegistrationWhenPackagesAreInUseSupported(); + bool DeferRegistrationWhenPackagesAreInUse(); + void DeferRegistrationWhenPackagesAreInUse(bool value); + bool IsExpectedDigestsSupported(); + winrt::Windows::Foundation::Collections::IMap ExpectedDigests(); + + private: + winrt::Microsoft::Windows::Management::Deployment::PackageVolume m_appDataVolume{}; + winrt::Windows::Foundation::Collections::IVector m_dependencyPackageUris{}; + winrt::Windows::Foundation::Collections::IVector m_optionalPackageFamilyNames{}; + winrt::Windows::Foundation::Uri m_externalLocationUri{ nullptr }; + bool m_developerMode{}; + bool m_forceAppShutdown{}; + bool m_forceTargetAppShutdown{}; + bool m_forceUpdateFromAnyVersion{}; + bool m_installAllResources{}; + bool m_stageInPlace{}; + bool m_allowUnsigned{}; + bool m_deferRegistrationWhenPackagesAreInUse{}; + winrt::Windows::Foundation::Collections::IMap m_expectedDigests; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct RegisterPackageOptions : RegisterPackageOptionsT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.RemovePackageOptions.cpp b/dev/PackageManager/API/M.W.M.D.RemovePackageOptions.cpp new file mode 100644 index 0000000000..95cf0b69f6 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.RemovePackageOptions.cpp @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include "M.W.M.D.RemovePackageOptions.h" +#include "Microsoft.Windows.Management.Deployment.RemovePackageOptions.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + bool RemovePackageOptions::PreserveApplicationData() + { + return m_preserveApplicationData; + } + void RemovePackageOptions::PreserveApplicationData(bool value) + { + m_preserveApplicationData = value; + } + bool RemovePackageOptions::PreserveRoamableApplicationData() + { + return m_preserveRoamableApplicationData; + } + void RemovePackageOptions::PreserveRoamableApplicationData(bool value) + { + m_preserveRoamableApplicationData = value; + } + bool RemovePackageOptions::RemoveForAllUsers() + { + return m_removeForAllUsers; + } + void RemovePackageOptions::RemoveForAllUsers(bool value) + { + m_removeForAllUsers = value; + } + winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority RemovePackageOptions::Priority() + { + return m_priority; + } + void RemovePackageOptions::Priority(winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority const& value) + { + m_priority = value; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.RemovePackageOptions.h b/dev/PackageManager/API/M.W.M.D.RemovePackageOptions.h new file mode 100644 index 0000000000..523278f5c3 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.RemovePackageOptions.h @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.RemovePackageOptions.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct RemovePackageOptions : RemovePackageOptionsT + { + RemovePackageOptions() = default; + + bool PreserveApplicationData(); + void PreserveApplicationData(bool value); + bool PreserveRoamableApplicationData(); + void PreserveRoamableApplicationData(bool value); + bool RemoveForAllUsers(); + void RemoveForAllUsers(bool value); + winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority Priority(); + void Priority(winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority const& value); + + private: + bool m_preserveApplicationData{}; + bool m_preserveRoamableApplicationData{}; + bool m_removeForAllUsers{}; + winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority m_priority{ winrt::Microsoft::Windows::Management::Deployment::DeploymentPriority::Normal }; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct RemovePackageOptions : RemovePackageOptionsT + { + }; +} diff --git a/dev/PackageManager/API/M.W.M.D.StagePackageOptions.cpp b/dev/PackageManager/API/M.W.M.D.StagePackageOptions.cpp new file mode 100644 index 0000000000..a743fb09d7 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.StagePackageOptions.cpp @@ -0,0 +1,126 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include + +#include "M.W.M.D.StagePackageOptions.h" +#include "Microsoft.Windows.Management.Deployment.StagePackageOptions.g.cpp" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + winrt::Microsoft::Windows::Management::Deployment::PackageVolume StagePackageOptions::TargetVolume() + { + return m_targetVolume; + } + void StagePackageOptions::TargetVolume(winrt::Microsoft::Windows::Management::Deployment::PackageVolume const& value) + { + m_targetVolume = value; + } + winrt::Windows::Foundation::Collections::IVector StagePackageOptions::DependencyPackageUris() + { + if (!m_dependencyPackageUris) + { + m_dependencyPackageUris = winrt::single_threaded_vector(); + } + return m_dependencyPackageUris; + } + winrt::Windows::Foundation::Collections::IVector StagePackageOptions::OptionalPackageFamilyNames() + { + if (!m_optionalPackageFamilyNames) + { + m_optionalPackageFamilyNames = winrt::single_threaded_vector(); + } + return m_optionalPackageFamilyNames; + } + winrt::Windows::Foundation::Collections::IVector StagePackageOptions::OptionalPackageUris() + { + if (!m_optionalPackageUris) + { + m_optionalPackageUris = winrt::single_threaded_vector(); + } + return m_optionalPackageUris; + } + winrt::Windows::Foundation::Collections::IVector StagePackageOptions::RelatedPackageUris() + { + if (!m_relatedPackageUris) + { + m_relatedPackageUris = winrt::single_threaded_vector(); + } + return m_relatedPackageUris; + } + winrt::Windows::Foundation::Uri StagePackageOptions::ExternalLocationUri() + { + return m_externalLocationUri; + } + void StagePackageOptions::ExternalLocationUri(winrt::Windows::Foundation::Uri const& value) + { + m_externalLocationUri = value; + } + winrt::Microsoft::Windows::Management::Deployment::StubPackageOption StagePackageOptions::StubPackageOption() + { + return m_stubPackageOption; + } + void StagePackageOptions::StubPackageOption(winrt::Microsoft::Windows::Management::Deployment::StubPackageOption const& value) + { + m_stubPackageOption = value; + } + bool StagePackageOptions::DeveloperMode() + { + return m_developerMode; + } + void StagePackageOptions::DeveloperMode(bool value) + { + m_developerMode = value; + } + bool StagePackageOptions::ForceUpdateFromAnyVersion() + { + return m_forceUpdateFromAnyVersion; + } + void StagePackageOptions::ForceUpdateFromAnyVersion(bool value) + { + m_forceUpdateFromAnyVersion = value; + } + bool StagePackageOptions::InstallAllResources() + { + return m_installAllResources; + } + void StagePackageOptions::InstallAllResources(bool value) + { + m_installAllResources = value; + } + bool StagePackageOptions::RequiredContentGroupOnly() + { + return m_requiredContentGroupOnly; + } + void StagePackageOptions::RequiredContentGroupOnly(bool value) + { + m_requiredContentGroupOnly = value; + } + bool StagePackageOptions::StageInPlace() + { + return m_stageInPlace; + } + void StagePackageOptions::StageInPlace(bool value) + { + m_stageInPlace = value; + } + bool StagePackageOptions::AllowUnsigned() + { + return m_allowUnsigned; + } + void StagePackageOptions::AllowUnsigned(bool value) + { + m_allowUnsigned = value; + } + bool StagePackageOptions::IsExpectedDigestsSupported() + { + // Requires Windows >= 10.0.22621.0 (aka Win11 22H2) + return WindowsVersion::IsWindows11_22H2OrGreater(); + } + winrt::Windows::Foundation::Collections::IMap StagePackageOptions::ExpectedDigests() + { + return m_expectedDigests; + } +} diff --git a/dev/PackageManager/API/M.W.M.D.StagePackageOptions.h b/dev/PackageManager/API/M.W.M.D.StagePackageOptions.h new file mode 100644 index 0000000000..5ccd499753 --- /dev/null +++ b/dev/PackageManager/API/M.W.M.D.StagePackageOptions.h @@ -0,0 +1,61 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "Microsoft.Windows.Management.Deployment.StagePackageOptions.g.h" + +namespace winrt::Microsoft::Windows::Management::Deployment::implementation +{ + struct StagePackageOptions : StagePackageOptionsT + { + StagePackageOptions() = default; + + winrt::Microsoft::Windows::Management::Deployment::PackageVolume TargetVolume(); + void TargetVolume(winrt::Microsoft::Windows::Management::Deployment::PackageVolume const& value); + winrt::Windows::Foundation::Collections::IVector DependencyPackageUris(); + winrt::Windows::Foundation::Collections::IVector OptionalPackageFamilyNames(); + winrt::Windows::Foundation::Collections::IVector OptionalPackageUris(); + winrt::Windows::Foundation::Collections::IVector RelatedPackageUris(); + void ExternalLocationUri(winrt::Windows::Foundation::Uri const& value); + winrt::Windows::Foundation::Uri ExternalLocationUri(); + winrt::Microsoft::Windows::Management::Deployment::StubPackageOption StubPackageOption(); + void StubPackageOption(winrt::Microsoft::Windows::Management::Deployment::StubPackageOption const& value); + bool DeveloperMode(); + void DeveloperMode(bool value); + bool ForceUpdateFromAnyVersion(); + void ForceUpdateFromAnyVersion(bool value); + bool InstallAllResources(); + void InstallAllResources(bool value); + bool RequiredContentGroupOnly(); + void RequiredContentGroupOnly(bool value); + bool StageInPlace(); + void StageInPlace(bool value); + bool AllowUnsigned(); + void AllowUnsigned(bool value); + bool IsExpectedDigestsSupported(); + winrt::Windows::Foundation::Collections::IMap ExpectedDigests(); + + private: + winrt::Microsoft::Windows::Management::Deployment::PackageVolume m_targetVolume{}; + winrt::Windows::Foundation::Collections::IVector m_dependencyPackageUris{}; + winrt::Windows::Foundation::Collections::IVector m_optionalPackageFamilyNames{}; + winrt::Windows::Foundation::Collections::IVector m_optionalPackageUris{}; + winrt::Windows::Foundation::Collections::IVector m_relatedPackageUris{}; + winrt::Windows::Foundation::Uri m_externalLocationUri{ nullptr }; + winrt::Microsoft::Windows::Management::Deployment::StubPackageOption m_stubPackageOption{}; + bool m_developerMode{}; + bool m_forceUpdateFromAnyVersion{}; + bool m_installAllResources{}; + bool m_requiredContentGroupOnly{}; + bool m_stageInPlace{}; + bool m_allowUnsigned{}; + winrt::Windows::Foundation::Collections::IMap m_expectedDigests; + }; +} +namespace winrt::Microsoft::Windows::Management::Deployment::factory_implementation +{ + struct StagePackageOptions : StagePackageOptionsT + { + }; +} diff --git a/dev/PackageManager/API/MsixPackageManager.h b/dev/PackageManager/API/MsixPackageManager.h new file mode 100644 index 0000000000..c5bb365f42 --- /dev/null +++ b/dev/PackageManager/API/MsixPackageManager.h @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#if !defined(MSIXPACKAGEMANAGER_H) +#define MSIXPACKAGEMANAGER_H + +/// MSIX Package Manager: Scanning for an applicable package +#define MSIXPACKAGEMANAGER_E_PACKAGE_SCAN _HRESULT_TYPEDEF_(0x80040301L) + +/// MSIX Package Manager: Found a package but doesn't match the criteria +#define MSIXPACKAGEMANAGER_E_PACKAGE_SCAN_NOT_MATCH _HRESULT_TYPEDEF_(0x80040302L) + +/// MSIX Package Manager: Found a package that does match the criteria +#define MSIXPACKAGEMANAGER_E_PACKAGE_SCAN_MATCH _HRESULT_TYPEDEF_(0x80040303L) + +/// MSIX Package Manager: Found no applicable package matching the criteria +#define MSIXPACKAGEMANAGER_E_PACKAGE_SCAN_FAILED _HRESULT_TYPEDEF_(0x80040304L) + +#endif // MSIXPACKAGEMANAGER_H diff --git a/dev/PackageManager/API/PackageDeploymentResolver.cpp b/dev/PackageManager/API/PackageDeploymentResolver.cpp new file mode 100644 index 0000000000..1a1165f8f9 --- /dev/null +++ b/dev/PackageManager/API/PackageDeploymentResolver.cpp @@ -0,0 +1,272 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include + +#include "PackageDeploymentResolver.h" + +#include "MsixPackageManager.h" + +namespace Microsoft::Windows::ApplicationModel::PackageDeploymentResolver +{ +winrt::hstring Find( + const winrt::Windows::Management::Deployment::PackageManager& packageManager, + const winrt::hstring& packageFamilyName, + const AppModel::Identity::PackageVersion& minVersion, + const winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures processorArchitectureFilter, + bool stopOnFirstMatch); + +static winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures ToPackageDependencyProcessorArchitectures(const winrt::Windows::System::ProcessorArchitecture architecture) +{ + switch (architecture) + { + case winrt::Windows::System::ProcessorArchitecture::X86: return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86; + case winrt::Windows::System::ProcessorArchitecture::X64: return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X64; + case winrt::Windows::System::ProcessorArchitecture::Arm: return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm; + case winrt::Windows::System::ProcessorArchitecture::Arm64: return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm64; + case winrt::Windows::System::ProcessorArchitecture::X86OnArm64: return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86OnArm64; + case winrt::Windows::System::ProcessorArchitecture::Neutral: return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Neutral; + case winrt::Windows::System::ProcessorArchitecture::Unknown: THROW_HR_MSG(E_UNEXPECTED, "Unsupported architecture 0x%X", architecture); + default: THROW_HR_MSG(E_UNEXPECTED, "Unknown architecture 0x%X", architecture); + } +} + +static bool IsArchitectureInArchitectures( + const winrt::Windows::System::ProcessorArchitecture architecture, + const winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures architectures) +{ + const auto architectureAsArchitectures{ ToPackageDependencyProcessorArchitectures(architecture) }; + return WI_IsAnyFlagSet(architectures, architectureAsArchitectures); +} + +static USHORT GetSystemArchitecture() +{ + USHORT processMachine{ IMAGE_FILE_MACHINE_UNKNOWN }; + USHORT nativeMachine{ IMAGE_FILE_MACHINE_UNKNOWN }; + THROW_IF_WIN32_BOOL_FALSE(::IsWow64Process2(::GetCurrentProcess(), &processMachine, &nativeMachine)); + return nativeMachine; +} + +static winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures GetSystemSupportedArchitectures(const std::uint16_t nativeMachine) +{ + switch (nativeMachine) + { + case IMAGE_FILE_MACHINE_I386: + return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Neutral | + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86; + case IMAGE_FILE_MACHINE_AMD64: + return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Neutral | + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86 | + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X64; + case IMAGE_FILE_MACHINE_ARM: + return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Neutral | + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86 | + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X64 | + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm; + case IMAGE_FILE_MACHINE_ARM64: + return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Neutral | + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86 | + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X64 | + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm | + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm64 | + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86OnArm64; + default: + THROW_HR_MSG(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), "nativeMachine=%hu", nativeMachine); + } +} + +static winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures GetSystemSupportedArchitectures() +{ + const auto nativeMachine{ GetSystemArchitecture() }; + return GetSystemSupportedArchitectures(nativeMachine); +} + +static PCWSTR GetSystemArchitectureAsString(const std::uint16_t nativeMachine) +{ + switch (nativeMachine) + { + case IMAGE_FILE_MACHINE_I386: return L"x86"; + case IMAGE_FILE_MACHINE_AMD64:return L"x64"; + case IMAGE_FILE_MACHINE_ARM: return L"arm"; + case IMAGE_FILE_MACHINE_ARM64:return L"arm64"; + default: THROW_HR_MSG(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), "nativeMachine=%hu", nativeMachine); + } +} + +static PCWSTR GetSystemSupportedArchitecturesAsString(const std::uint16_t nativeMachine) +{ + switch (nativeMachine) + { + case IMAGE_FILE_MACHINE_I386: return L"neutral,x86"; + case IMAGE_FILE_MACHINE_AMD64:return L"neutral,x86,x64"; + case IMAGE_FILE_MACHINE_ARM: return L"neutral,x86,arm"; + case IMAGE_FILE_MACHINE_ARM64:return L"neutral,x86,x64,arm,arm64,x86onArm64"; + default: THROW_HR_MSG(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), "nativeMachine=%hu", nativeMachine); + } +} + +static PCWSTR GetSystemSupportedArchitecturesAsString() +{ + const auto nativeMachine{ GetSystemArchitecture() }; + return GetSystemSupportedArchitecturesAsString(nativeMachine); +} + +static bool IsArchitectureSupporedByHostMachine( + const winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures architecture) +{ + const auto supportedArchitectures{ GetSystemSupportedArchitectures() }; + return WI_IsAnyFlagSet(supportedArchitectures, architecture); +} + +static bool IsArchitectureSupporedByHostMachine( + const winrt::Windows::System::ProcessorArchitecture architecture) +{ + const auto architectureAsPackageDependencyProcessorArchitectures{ ToPackageDependencyProcessorArchitectures(architecture) }; + return IsArchitectureSupporedByHostMachine(architectureAsPackageDependencyProcessorArchitectures); +} +} + +winrt::hstring Microsoft::Windows::ApplicationModel::PackageDeploymentResolver::FindBestFit( + const winrt::Windows::Management::Deployment::PackageManager& packageManager, + const winrt::hstring& packageFamilyName, + const AppModel::Identity::PackageVersion& minVersion, + const winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures processorArchitectureFilter) +{ + return Find(packageManager, packageFamilyName, minVersion, processorArchitectureFilter, false); +} + +bool Microsoft::Windows::ApplicationModel::PackageDeploymentResolver::FindAny( + const winrt::Windows::Management::Deployment::PackageManager& packageManager, + const winrt::hstring& packageFamilyName, + const AppModel::Identity::PackageVersion& minVersion, + const winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures processorArchitectureFilter) +{ + winrt::hstring packageFullName{ Find(packageManager, packageFamilyName, minVersion, processorArchitectureFilter, true) }; + return !packageFullName.empty(); +} + +winrt::hstring Microsoft::Windows::ApplicationModel::PackageDeploymentResolver::Find( + const winrt::Windows::Management::Deployment::PackageManager& packageManager, + const winrt::hstring& packageFamilyName, + const AppModel::Identity::PackageVersion& minVersion, + const winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures processorArchitectureFilter, + bool stopOnFirstMatch) +{ + // Find the 'best fit' or 'first matching' package in the family (if any) + winrt::hstring bestFitPackageFullName; + AppModel::Identity::PackageVersion bestFitVersion; + + // Determine the packages in the family that could match + const auto packageTypes{ winrt::Windows::Management::Deployment::PackageTypes::Framework | + winrt::Windows::Management::Deployment::PackageTypes::Main }; + auto packages{ packageManager.FindPackagesForUserWithPackageTypes(winrt::hstring(), packageFamilyName, packageTypes) }; + + // Find the/any match + auto criteria{ wil::str_printf(L"PackageFamilyName=%ls MinVersion=%hu.%hu.%hu.%hu ArchitectureFilter:0x%X", + packageFamilyName.c_str(), + minVersion.Major, minVersion.Minor, + minVersion.Build, minVersion.Revision, + static_cast(processorArchitectureFilter)) }; + (void)LOG_HR_MSG(MSIXPACKAGEMANAGER_E_PACKAGE_SCAN, + "PackageDeploymentResolver: Scanning packages (%ls)", + criteria.get()); + if (packages) + { + for (const winrt::Windows::ApplicationModel::Package& candidate : packages) + { + // Do we already have a higher version under consideration? + auto packageId{ candidate.Id() }; + const AppModel::Identity::PackageVersion candidateVersion{ packageId.Version() }; + if (!bestFitPackageFullName.empty() && (bestFitVersion > candidateVersion)) + { + continue; + } + + // Package version must meet the minVersion filter + auto candidateFullName{ packageId.FullName() }; + if (candidateVersion < minVersion) + { + (void)LOG_HR_MSG(MSIXPACKAGEMANAGER_E_PACKAGE_SCAN_NOT_MATCH, + "PackageDeploymentResolver: %ls not applicable. Version doesn't match MinVersion criteria (%ls)", + candidateFullName.c_str(), criteria.get()); + continue; + } + + // Do we already have a higher version under consideration? + if (!bestFitPackageFullName.empty() && (bestFitVersion > candidateVersion)) + { + continue; + } + + // Package architecture must meet the architecture filter + // Filter=None ==> architecture must match system supported architectures + // Filter!=None => architecture must match one of the specified architectures + const auto candidateArchitecture{ packageId.Architecture() }; + if (processorArchitectureFilter == winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::None) + { + const auto nativeMachine{ GetSystemArchitecture() }; + const auto supportedArchitectures{ GetSystemSupportedArchitectures(nativeMachine) }; + if (!IsArchitectureInArchitectures(candidateArchitecture, supportedArchitectures)) + { + (void)LOG_HR_MSG(MSIXPACKAGEMANAGER_E_PACKAGE_SCAN_NOT_MATCH, + "PackageDeploymentResolver: %ls not applicable. Architecture (%ls) doesn't match system supported architectures (0x%X %ls)", + candidateFullName.c_str(), ::AppModel::Identity::GetArchitectureAsString(candidateArchitecture), + static_cast(supportedArchitectures), GetSystemSupportedArchitecturesAsString(nativeMachine)); + continue; + } + } + else + { + if (!IsArchitectureInArchitectures(candidateArchitecture, processorArchitectureFilter)) + { + (void)LOG_HR_MSG(MSIXPACKAGEMANAGER_E_PACKAGE_SCAN_NOT_MATCH, + "PackageDeploymentResolver: %ls not applicable. Architecture (%ls) doesn't match specified architectures (0x%X)", + candidateFullName.c_str(), ::AppModel::Identity::GetArchitectureAsString(candidateArchitecture), + static_cast(processorArchitectureFilter)); + continue; + } + } + + // Package status must be OK to use a package + winrt::hstring currentUser; + auto status{ candidate.Status() }; + if (!status.VerifyIsOK()) + { + (void)LOG_HR_MSG(MSIXPACKAGEMANAGER_E_PACKAGE_SCAN_NOT_MATCH, + "PackageDeploymentResolver: %ls not applicable. Status not OK (%ls)", + candidateFullName.c_str(), criteria.get()); + continue; + } + + // Are we looking for any match? + if (stopOnFirstMatch) + { + (void)LOG_HR_MSG(MSIXPACKAGEMANAGER_E_PACKAGE_SCAN_FAILED, + "PackageDeploymentResolver: Stopping on 1st match %ls (%ls)", + candidateFullName.c_str(), criteria.get()); + return candidateFullName; + } + + // The new candidate is better than the current champion + bestFitPackageFullName = std::move(candidateFullName); + bestFitVersion = candidateVersion; + } + } + + // Did we find what we're looking for? + if (bestFitPackageFullName.empty()) + { + (void)LOG_HR_MSG(MSIXPACKAGEMANAGER_E_PACKAGE_SCAN_FAILED, + "PackageDeploymentResolver: No match (%ls)", + criteria.get()); + } + else + { + (void)LOG_HR_MSG(MSIXPACKAGEMANAGER_E_PACKAGE_SCAN_MATCH, + "PackageDeploymentResolver: %ls is applicable (%ls)", + bestFitPackageFullName.c_str(), criteria.get()); + } + return bestFitPackageFullName; +} diff --git a/dev/PackageManager/API/PackageDeploymentResolver.h b/dev/PackageManager/API/PackageDeploymentResolver.h new file mode 100644 index 0000000000..142a53ed20 --- /dev/null +++ b/dev/PackageManager/API/PackageDeploymentResolver.h @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#if !defined(PACKAGERESOLVER_H) +#define PACKAGERESOLVER_H + +namespace Microsoft::Windows::ApplicationModel::PackageDeploymentResolver +{ + // Return the best fit package's full name (or .empty if no match found) + winrt::hstring FindBestFit( + const winrt::Windows::Management::Deployment::PackageManager& packageManager, + const winrt::hstring& packageFamilyName, + const AppModel::Identity::PackageVersion& minVersion, + const winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures processorArchitectureFilter); + + // Return true if any package meets the criteria + bool FindAny( + const winrt::Windows::Management::Deployment::PackageManager& packageManager, + const winrt::hstring& packageFamilyName, + const AppModel::Identity::PackageVersion& minVersion, + const winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures processorArchitectureFilter); +} + +#endif // PACKAGERESOLVER_H diff --git a/dev/PackageManager/API/PackageManager.idl b/dev/PackageManager/API/PackageManager.idl new file mode 100644 index 0000000000..f21ace0524 --- /dev/null +++ b/dev/PackageManager/API/PackageManager.idl @@ -0,0 +1,427 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include + +import "M.AM.DynamicDependency.idl"; + +namespace Microsoft.Windows.Management.Deployment +{ + runtimeclass PackageVolume; + + [feature(Feature_PackageManager)] + [contractversion(1)] + apicontract PackageDeploymentContract{}; + + // How should we handle deployment operations? + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + enum DeploymentProcessingModel + { + Sequential, + Parallel + }; + + // Do deployment operations need non-default priority? + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + enum DeploymentPriority + { + Low, + Normal, + Immediate + }; + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass PackageVolumeStatus + { + PackageVolumeStatus(); + + Boolean IsOK; + Boolean IsOffline; + Boolean IsBroken; + }; + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass PackageVolume + { + PackageVolume(); + + Boolean IsSystemVolume{ get; }; + String MountPoint{ get; }; + String Name{ get; }; + String PackageStorePath{ get; }; + Boolean SupportsHardLinks{ get; }; + Boolean IsFullTrustPackageSupported{ get; }; + Boolean IsAppxInstallSupported{ get; }; + + PackageVolumeStatus Status { get; }; + + void FixMe(); + }; + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass PackageVolumeManager + { + static IVector FindPackageVolumes(); + + static PackageVolume FindPackageVolumeByPath(String path); + + static PackageVolume FindPackageVolumeByMediaId(String mediaId); + + static PackageVolume FindPackageVolumeByName(String name); + }; + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass PackageSetItem + { + PackageSetItem(); + + // Unique id + String Id; //required + + // Package criteria to identify if a matching package is ready for use and to use at runtime + String PackageFamilyName; //required + Windows.ApplicationModel.PackageVersion MinVersion; //required + Microsoft.Windows.ApplicationModel.DynamicDependency.PackageDependencyProcessorArchitectures ProcessorArchitectureFilter; + + // Source where a package can be retrieved from if/when needed for install, remediation, etc + Windows.Foundation.Uri PackageUri; + + // ??? Additional info potentially needed for deployment operations + //TODO see AddPackageOptions + + // Additional info for runtime use + //TODO see CreatePackageDependencyOptions + //TODO see AddPackageDependencyOptions + } + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass PackageSet + { + PackageSet(); + + // Unique id + String Id; + + // Package(s) in the set + IVector PackageSetItems { get; }; + } + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass PackageSetItemRuntimeDisposition + { + PackageSetItemRuntimeDisposition(); + + String PackageSetItemId{ get; }; + String PackageFullName{ get; }; + String PackageDependencyId{ get; }; + Microsoft.Windows.ApplicationModel.DynamicDependency.PackageDependencyContextId PackageDependencyContextId{ get; }; + } + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass PackageSetRuntimeDisposition + { + PackageSetRuntimeDisposition(); + + String PackageSetId; + IVector PackageSetItemRuntimeDispositions { get; }; + } + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass FindPackageSetOptions + { + FindPackageSetOptions(); + + //TODO + Boolean TODO_MustHaveAtLeastOneInterfaceOrStaticFactoryPlaceholder; + } + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass PackageSetManager + { + static PackageSetManager GetDefault(); + + void Add(PackageSet packageSet); // Create/Write/Save + void Update(PackageSet packageSet); // Update/Write/Save + void Remove(String packageSetId); // Delete + PackageSet Get(String packageSetId); // Read/Load + IVector Find(FindPackageSetOptions options);// Enumerate + }; + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + enum PackageDeploymentStatus + { + InProgress = 0, // The request is in progress + CompletedSuccess = 1, // The request completed successfully + CompletedFailure = 2, // The request failed with some critical internal error. //TODO:Check ExtendedError for HRESULT + }; + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + enum PackageDeploymentProgressStatus + { + Queued = 0, // The request is queued + InProgress = 1, // The request is in progress + CompletedSuccess = 2, // The request completed successfully + CompletedFailure = 3, // The request failed with some critical internal error. //TODO:Check ExtendedError for HRESULT + }; + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass PackageDeploymentProgress + { + PackageDeploymentProgressStatus status; + Double percentage; + } + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass PackageDeploymentResult + { + PackageDeploymentStatus Status { get; }; + HRESULT ExtendedError { get; }; + Boolean IsRegistered{ get; }; + Guid ActivityId { get; }; + } + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass EnsureIsReadyOptions + { + EnsureIsReadyOptions(); + + // Options influencing deployment if/when needed + DeploymentProcessingModel DeploymentProcessingModel; + DeploymentPriority DeploymentPriority; + + // ??? Additional info potentially needed for deployment operations + //TODO see AddPackageOptions + //TODO see RegisterPackageOptions + //TODO see StagePackageOptions + + // Additional info for runtime use + //TODO see CreatePackageDependencyOptions + //TODO see AddPackageDependencyOptions + } + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + enum StubPackageOption + { + Default, + InstallFull, + InstallStub, + UsePreference, + }; + + // Requires Windows >- 10.0.19041.0 (aka 2004 aka 20H1) + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass AddPackageOptions + { + AddPackageOptions(); + + PackageVolume TargetVolume; + IVector DependencyPackageUris { get; }; + IVector OptionalPackageFamilyNames { get; }; + IVector OptionalPackageUris { get; }; + IVector RelatedPackageUris { get; }; + Windows.Foundation.Uri ExternalLocationUri; + Microsoft.Windows.Management.Deployment.StubPackageOption StubPackageOption; + Boolean AllowUnsigned; + Boolean DeveloperMode; + Boolean ForceAppShutdown; + Boolean ForceTargetAppShutdown; + Boolean ForceUpdateFromAnyVersion; + Boolean InstallAllResources; + Boolean RequiredContentGroupOnly; + Boolean RetainFilesOnFailure; + Boolean StageInPlace; + Boolean DeferRegistrationWhenPackagesAreInUse; + + Boolean IsExpectedDigestsSupported { get; }; // Requires Windows >= 10.0.22621.0 (aka Win11 22H2) + IMap ExpectedDigests{ get; }; + + Boolean IsLimitToExistingPackagesSupported { get; }; // Requires Windows >= 10.0.22621.0 (aka Win11 22H2) + Boolean LimitToExistingPackages; + } + + // Requires Windows >- 10.0.19041.0 (aka 2004 aka 20H1) + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass StagePackageOptions + { + StagePackageOptions(); + + PackageVolume TargetVolume; + IVector DependencyPackageUris { get; }; + IVector OptionalPackageFamilyNames { get; }; + IVector OptionalPackageUris { get; }; + IVector RelatedPackageUris { get; }; + Windows.Foundation.Uri ExternalLocationUri; + Microsoft.Windows.Management.Deployment.StubPackageOption StubPackageOption; + Boolean DeveloperMode; + Boolean ForceUpdateFromAnyVersion; + Boolean InstallAllResources; + Boolean RequiredContentGroupOnly; + Boolean StageInPlace; + Boolean AllowUnsigned; + + Boolean IsExpectedDigestsSupported { get; }; // Requires Windows >= 10.0.22621.0 (aka Win11 22H2) + IMap ExpectedDigests{ get; }; + } + + // Requires Windows >- 10.0.19041.0 (aka 2004 aka 20H1) + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass RegisterPackageOptions + { + RegisterPackageOptions(); + + PackageVolume AppDataVolume; + IVector DependencyPackageUris { get; }; + IVector OptionalPackageFamilyNames { get; }; + Windows.Foundation.Uri ExternalLocationUri; + Boolean DeveloperMode; + Boolean ForceAppShutdown; + Boolean ForceTargetAppShutdown; + Boolean ForceUpdateFromAnyVersion; + Boolean InstallAllResources; + Boolean StageInPlace; + Boolean AllowUnsigned; + Boolean DeferRegistrationWhenPackagesAreInUse; + + Boolean IsExpectedDigestsSupported { get; }; // Requires Windows >= 10.0.22621.0 (aka Win11 22H2) + IMap ExpectedDigests{ get; }; + } + + // Requires Windows >- 10.0.19041.0 (aka 2004 aka 20H1) + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass RemovePackageOptions + { + RemovePackageOptions(); + + Boolean PreserveApplicationData; + Boolean PreserveRoamableApplicationData; + Boolean RemoveForAllUsers; + DeploymentPriority Priority; + } + + // The API surface is strongly consistent: + // 1. Modification operations involving incoming packages... + // - PackageAsync (string, options) + // - PackageByUriAsync (uri, options) + // - PackageSetAsync (packageset, options) + // - PackageSetByIdAsync(id, options) + // where + // = Add | Register | Stage + // 2. Modification operations involving existing packages... + // - PackageAsync (string, options) + // - PackageByPackageFamilyNameAsync(string, options) + // - PackageByPackageFullNameAsync (string, options) + // where + // = Deprovision | Provision | Register | Remove + // + // TODO: AppInstaller + // TODO: Move + // TODO: Find + // TODO: Properties (Status, StubPreference) + // TODO: RequestAdd + // + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass PackageDeploymentManager + { + // Get an instance of the manager + static PackageDeploymentManager GetDefault(); + + // Return true if the necessary package(s) are present and available for use + Boolean IsPackageSetReady(PackageSet packageSet); + + Boolean IsPackageSetReadyById(String packageSetId); + + // Check if the necessary package(s) are present + // and available for use and if not then Make It So. + // If the necessary packages(s) are not present on the system + // then make them available (download, install, etc). + // If the necessary packages are present and available this is equivalent to IsReady(id). + Windows.Foundation.IAsyncOperationWithProgress + EnsurePackageSetIsReadyAsync(PackageSet packageSet, EnsureIsReadyOptions options); + + Windows.Foundation.IAsyncOperationWithProgress + EnsurePackageSetIsReadyByIdAsync(String packageSetId, EnsureIsReadyOptions options); + + // Add packages + Windows.Foundation.IAsyncOperationWithProgress + AddPackageByUriAsync(Windows.Foundation.Uri packageUri, AddPackageOptions options); + + Windows.Foundation.IAsyncOperationWithProgress + AddPackageSetAsync(PackageSet packageSet, AddPackageOptions options); + + Windows.Foundation.IAsyncOperationWithProgress + AddPackageSetByIdAsync(String packageSetId, AddPackageOptions options); + + // Remove packages + Windows.Foundation.IAsyncOperationWithProgress + RemovePackageByFullNameNameAsync(String packageFullName, RemovePackageOptions options); + + Windows.Foundation.IAsyncOperationWithProgress + RemovePackageByFamilyNameNameAsync(String packageFamilyName, RemovePackageOptions options); + + Windows.Foundation.IAsyncOperationWithProgress + RemovePackageSetAsync(PackageSet packageSet, RemovePackageOptions options); + + Windows.Foundation.IAsyncOperationWithProgress + RemovePackageSetByIdAsync(String packageSetId, RemovePackageOptions options); + + // Ditto PackageSet operations of Stage, Register, Repair, Reset + } + + [feature(Feature_PackageManager)] + [contract(PackageDeploymentContract, 1)] + runtimeclass PackageRuntimeManager + { + // Get an instance of the manager + static PackageRuntimeManager GetDefault(); + + // Make the package(s) in the package set available to the calling process + // i.e. dynamically add the package(s) in the package set to the caller's package graph. + // This is equivalent to + // FOREACH p IN PackageSetManager.Get(id).PackageSetItems + // pd = TryCreatePackageDependency(p) + // AddPackageDependency(pd) + + Microsoft.Windows.Management.Deployment.PackageSetRuntimeDisposition AddPackageSet( + PackageSet packageSet); + + [method_name("AddPackageSetWithOptions")] + Microsoft.Windows.Management.Deployment.PackageSetRuntimeDisposition AddPackageSet( + PackageSet packageSet, + Microsoft.Windows.ApplicationModel.DynamicDependency.CreatePackageDependencyOptions createOptions, + Microsoft.Windows.ApplicationModel.DynamicDependency.AddPackageDependencyOptions addOptions); + + Microsoft.Windows.Management.Deployment.PackageSetRuntimeDisposition AddPackageSetById( + String packageSetId); + + [method_name("AddPackageSetByIdWithOptions")] + Microsoft.Windows.Management.Deployment.PackageSetRuntimeDisposition AddPackageSetById( + String packageSetId, + Microsoft.Windows.ApplicationModel.DynamicDependency.CreatePackageDependencyOptions createOptions, + Microsoft.Windows.ApplicationModel.DynamicDependency.AddPackageDependencyOptions addOptions); + + void RemovePackageSet( + Microsoft.Windows.Management.Deployment.PackageSetRuntimeDisposition packageSetRuntimeDisposition); + } +} diff --git a/dev/PackageManager/API/PackageManager.vcxitems b/dev/PackageManager/API/PackageManager.vcxitems new file mode 100644 index 0000000000..82997a5f76 --- /dev/null +++ b/dev/PackageManager/API/PackageManager.vcxitems @@ -0,0 +1,67 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {8a9a0c85-65a8-4bca-a49e-45fc4fdbc7d2} + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %(AdditionalIncludeDirectories);$(RepoRoot)\dev\DynamicDependency\API;%(OutDir) + + + + + + diff --git a/dev/PackageManager/API/PackageManager.vcxitems.filters b/dev/PackageManager/API/PackageManager.vcxitems.filters new file mode 100644 index 0000000000..a0dac11ac4 --- /dev/null +++ b/dev/PackageManager/API/PackageManager.vcxitems.filters @@ -0,0 +1,137 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + + diff --git a/dev/PackageManager/API/pch.h b/dev/PackageManager/API/pch.h new file mode 100644 index 0000000000..3dcd1b1b1a --- /dev/null +++ b/dev/PackageManager/API/pch.h @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include + +#include +#include + +#include "MsixPackageManager.h" diff --git a/dev/PushNotifications/PushNotificationsLongRunningTask/packages.config b/dev/PushNotifications/PushNotificationsLongRunningTask/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/dev/PushNotifications/PushNotificationsLongRunningTask/packages.config +++ b/dev/PushNotifications/PushNotificationsLongRunningTask/packages.config @@ -3,6 +3,6 @@ - + diff --git a/dev/RestartAgent/packages.config b/dev/RestartAgent/packages.config index 2305cb7181..9ba3aa91dd 100644 --- a/dev/RestartAgent/packages.config +++ b/dev/RestartAgent/packages.config @@ -1,5 +1,5 @@  - + diff --git a/dev/WindowsAppRuntime_DLL/WindowsAppRuntime_DLL.vcxproj b/dev/WindowsAppRuntime_DLL/WindowsAppRuntime_DLL.vcxproj index df01b5362f..7c12d5d93e 100644 --- a/dev/WindowsAppRuntime_DLL/WindowsAppRuntime_DLL.vcxproj +++ b/dev/WindowsAppRuntime_DLL/WindowsAppRuntime_DLL.vcxproj @@ -97,6 +97,7 @@ + @@ -261,7 +262,7 @@ - + $(RepoRoot);%(AdditionalIncludeDirectories) diff --git a/dev/WindowsAppRuntime_DLL/dllmain.cpp b/dev/WindowsAppRuntime_DLL/dllmain.cpp index 9dff635ce0..cc0604d331 100644 --- a/dev/WindowsAppRuntime_DLL/dllmain.cpp +++ b/dev/WindowsAppRuntime_DLL/dllmain.cpp @@ -1,8 +1,9 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #include "pch.h" +#include #include #include @@ -30,6 +31,7 @@ static HRESULT DetoursInitialize() DetourRestoreAfterWith(); FAIL_FAST_IF_WIN32_ERROR(DetourTransactionBegin()); + FAIL_FAST_IF_FAILED(MddWin11Initialize()); FAIL_FAST_IF_FAILED(MddDetourPackageGraphInitialize()); FAIL_FAST_IF_FAILED(UrfwInitialize()); diff --git a/dev/WindowsAppRuntime_DLL/packages.config b/dev/WindowsAppRuntime_DLL/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/dev/WindowsAppRuntime_DLL/packages.config +++ b/dev/WindowsAppRuntime_DLL/packages.config @@ -3,6 +3,6 @@ - + diff --git a/eng/Version.Dependencies.xml b/eng/Version.Dependencies.xml index 1918283612..fba4803c9f 100644 --- a/eng/Version.Dependencies.xml +++ b/eng/Version.Dependencies.xml @@ -29,9 +29,9 @@ - + - + diff --git a/eng/common/DevCheck.ps1 b/eng/common/DevCheck.ps1 index 04bd1092d1..1289f0cf72 100644 --- a/eng/common/DevCheck.ps1 +++ b/eng/common/DevCheck.ps1 @@ -1,4 +1,4 @@ -# Copyright (c) Microsoft Corporation and Contributors. +# Copyright (c) Microsoft Corporation and Contributors. # Licensed under the MIT License. <# diff --git a/installer/dev/packages.config b/installer/dev/packages.config index 2305cb7181..9ba3aa91dd 100644 --- a/installer/dev/packages.config +++ b/installer/dev/packages.config @@ -1,5 +1,5 @@  - + diff --git a/installer/test/InstallerFunctionalTests/packages.config b/installer/test/InstallerFunctionalTests/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/installer/test/InstallerFunctionalTests/packages.config +++ b/installer/test/InstallerFunctionalTests/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/AccessControlTests/packages.config b/test/AccessControlTests/packages.config index c47d0469a5..3313efc9ef 100644 --- a/test/AccessControlTests/packages.config +++ b/test/AccessControlTests/packages.config @@ -1,5 +1,5 @@  - - + + diff --git a/test/AppLifecycle/packages.config b/test/AppLifecycle/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/AppLifecycle/packages.config +++ b/test/AppLifecycle/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/AppNotificationBuilderTests/packages.config b/test/AppNotificationBuilderTests/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/AppNotificationBuilderTests/packages.config +++ b/test/AppNotificationBuilderTests/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/AppNotificationTests/packages.config b/test/AppNotificationTests/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/AppNotificationTests/packages.config +++ b/test/AppNotificationTests/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/Common/packages.config b/test/Common/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/Common/packages.config +++ b/test/Common/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/Deployment/API/packages.config b/test/Deployment/API/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/Deployment/API/packages.config +++ b/test/Deployment/API/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Default/packages.config b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Default/packages.config index 2305cb7181..9ba3aa91dd 100644 --- a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Default/packages.config +++ b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Default/packages.config @@ -1,5 +1,5 @@  - + diff --git a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Default/packages.config b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Default/packages.config index 2305cb7181..9ba3aa91dd 100644 --- a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Default/packages.config +++ b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Default/packages.config @@ -1,5 +1,5 @@  - + diff --git a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Defined/packages.config b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Defined/packages.config index 2305cb7181..9ba3aa91dd 100644 --- a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Defined/packages.config +++ b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_Defined/packages.config @@ -1,5 +1,5 @@  - + diff --git a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_None/packages.config b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_None/packages.config index 2305cb7181..9ba3aa91dd 100644 --- a/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_None/packages.config +++ b/test/Deployment/Test_DeploymentManagerAutoInitialize/CPP/Test_DeploymentManagerAutoInitialize_CPP_Options_None/packages.config @@ -1,5 +1,5 @@  - + diff --git a/test/DynamicDependency/Test_Win32/packages.config b/test/DynamicDependency/Test_Win32/packages.config index f11cc64c3e..1861ca894b 100644 --- a/test/DynamicDependency/Test_Win32/packages.config +++ b/test/DynamicDependency/Test_Win32/packages.config @@ -1,4 +1,4 @@  - + diff --git a/test/DynamicDependency/Test_WinRT/packages.config b/test/DynamicDependency/Test_WinRT/packages.config index f11cc64c3e..1861ca894b 100644 --- a/test/DynamicDependency/Test_WinRT/packages.config +++ b/test/DynamicDependency/Test_WinRT/packages.config @@ -1,4 +1,4 @@  - + diff --git a/test/DynamicDependency/data/Framework.Widgets/packages.config b/test/DynamicDependency/data/Framework.Widgets/packages.config index 2305cb7181..9ba3aa91dd 100644 --- a/test/DynamicDependency/data/Framework.Widgets/packages.config +++ b/test/DynamicDependency/data/Framework.Widgets/packages.config @@ -1,5 +1,5 @@  - + diff --git a/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml b/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml index 1d4eb4e23a..4fa4b656b1 100644 --- a/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml +++ b/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml @@ -77,6 +77,28 @@ + + + Microsoft.WindowsAppRuntime.dll + + + + + + + + + + + + + + + + + + + Microsoft.WindowsAppRuntime.dll diff --git a/test/EnvironmentManagerTests/packages.config b/test/EnvironmentManagerTests/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/EnvironmentManagerTests/packages.config +++ b/test/EnvironmentManagerTests/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/Kozani/KozaniAppGraphTests/packages.config b/test/Kozani/KozaniAppGraphTests/packages.config index 54378eec74..ecebfdd18e 100644 --- a/test/Kozani/KozaniAppGraphTests/packages.config +++ b/test/Kozani/KozaniAppGraphTests/packages.config @@ -3,7 +3,7 @@ - - + + diff --git a/test/Kozani/KozaniHostRuntimeTests/packages.config b/test/Kozani/KozaniHostRuntimeTests/packages.config index 54378eec74..ecebfdd18e 100644 --- a/test/Kozani/KozaniHostRuntimeTests/packages.config +++ b/test/Kozani/KozaniHostRuntimeTests/packages.config @@ -3,7 +3,7 @@ - - + + diff --git a/test/Kozani/KozaniManagerRuntimeTests/KozaniManagerRuntimeTests.cpp b/test/Kozani/KozaniManagerRuntimeTests/KozaniManagerRuntimeTests.cpp index 3e135fb73f..01d6d6f0c6 100644 --- a/test/Kozani/KozaniManagerRuntimeTests/KozaniManagerRuntimeTests.cpp +++ b/test/Kozani/KozaniManagerRuntimeTests/KozaniManagerRuntimeTests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #include "pch.h" @@ -33,13 +33,13 @@ HRESULT RegisterDVCPluginIfNeeded() const HINSTANCE hInst{ ShellExecute(nullptr, nullptr, L"reg.exe", regCommand, nullptr, SW_SHOW) }; WEX::Logging::Log::Comment(WEX::Common::String().Format(L"ShellExecute reg add finished with code: %d", hInst)); - if ((int)hInst > 32) + if (reinterpret_cast(hInst) > 32) { WEX::Logging::Log::Comment(L"Successfully created DVC plugin key!"); } else { - const HRESULT hr{ HRESULT_FROM_WIN32(reinterpret_cast(hInst)) }; + const HRESULT hr{ HRESULT_FROM_WIN32(static_cast(reinterpret_cast(hInst))) }; WEX::Logging::Log::Comment(WEX::Common::String().Format(L"ShellExecute failed with: 0x%x", hr)); return hr; } diff --git a/test/Kozani/KozaniManagerRuntimeTests/packages.config b/test/Kozani/KozaniManagerRuntimeTests/packages.config index 54378eec74..ecebfdd18e 100644 --- a/test/Kozani/KozaniManagerRuntimeTests/packages.config +++ b/test/Kozani/KozaniManagerRuntimeTests/packages.config @@ -3,7 +3,7 @@ - - + + diff --git a/test/Kozani/KozaniManagerTests/packages.config b/test/Kozani/KozaniManagerTests/packages.config index 54378eec74..ecebfdd18e 100644 --- a/test/Kozani/KozaniManagerTests/packages.config +++ b/test/Kozani/KozaniManagerTests/packages.config @@ -3,7 +3,7 @@ - - + + diff --git a/test/Kozani/KozaniPackageTests/packages.config b/test/Kozani/KozaniPackageTests/packages.config index 54378eec74..ecebfdd18e 100644 --- a/test/Kozani/KozaniPackageTests/packages.config +++ b/test/Kozani/KozaniPackageTests/packages.config @@ -3,7 +3,7 @@ - - + + diff --git a/test/Kozani/KozaniRemoteManagerTests/packages.config b/test/Kozani/KozaniRemoteManagerTests/packages.config index 54378eec74..ecebfdd18e 100644 --- a/test/Kozani/KozaniRemoteManagerTests/packages.config +++ b/test/Kozani/KozaniRemoteManagerTests/packages.config @@ -3,7 +3,7 @@ - - + + diff --git a/test/Kozani/KozaniSendToLocalTests/packages.config b/test/Kozani/KozaniSendToLocalTests/packages.config index 54378eec74..ecebfdd18e 100644 --- a/test/Kozani/KozaniSendToLocalTests/packages.config +++ b/test/Kozani/KozaniSendToLocalTests/packages.config @@ -3,7 +3,7 @@ - - + + diff --git a/test/Kozani/KozaniSendToRemoteTests/packages.config b/test/Kozani/KozaniSendToRemoteTests/packages.config index 54378eec74..ecebfdd18e 100644 --- a/test/Kozani/KozaniSendToRemoteTests/packages.config +++ b/test/Kozani/KozaniSendToRemoteTests/packages.config @@ -3,7 +3,7 @@ - - + + diff --git a/test/Kozani/KozaniSettingsTests/packages.config b/test/Kozani/KozaniSettingsTests/packages.config index 54378eec74..ecebfdd18e 100644 --- a/test/Kozani/KozaniSettingsTests/packages.config +++ b/test/Kozani/KozaniSettingsTests/packages.config @@ -3,7 +3,7 @@ - - + + diff --git a/test/Kozani/MakeMSIXTests/packages.config b/test/Kozani/MakeMSIXTests/packages.config index 54378eec74..ecebfdd18e 100644 --- a/test/Kozani/MakeMSIXTests/packages.config +++ b/test/Kozani/MakeMSIXTests/packages.config @@ -3,7 +3,7 @@ - - + + diff --git a/test/LRPTests/packages.config b/test/LRPTests/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/LRPTests/packages.config +++ b/test/LRPTests/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/PackageManager/API/PackageDeploymentManagerTests.cpp b/test/PackageManager/API/PackageDeploymentManagerTests.cpp new file mode 100644 index 0000000000..6e6f69607c --- /dev/null +++ b/test/PackageManager/API/PackageDeploymentManagerTests.cpp @@ -0,0 +1,848 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include + +namespace TB = ::Test::Bootstrap; +namespace TP = ::Test::Packages; +namespace TPF = ::Test::Packages::Framework; +namespace TPMT = ::Test::PackageManager::Tests; + +namespace Test::PackageManager::Tests +{ + class PackageDeploymentManagerTests + { + public: + BEGIN_TEST_CLASS(PackageDeploymentManagerTests) + TEST_CLASS_PROPERTY(L"ThreadingModel", L"MTA") + END_TEST_CLASS() + + TEST_CLASS_SETUP(ClassSetup) + { + if (!::WindowsVersion::IsWindows10_20H1OrGreater()) + { + WEX::Logging::Log::Result(WEX::Logging::TestResults::Skipped, L"PackageDeploymentManager requires >= 20H1 (Vibranium). Skipping tests"); + return true; + } + RemovePackage_Blue(); + RemovePackage_Green(); + RemovePackage_Redder(); + RemovePackage_Red(); + ::TB::Setup(); + return true; + } + + TEST_CLASS_CLEANUP(ClassCleanup) + { + RemovePackage_Blue(); + RemovePackage_Green(); + RemovePackage_Redder(); + RemovePackage_Red(); + ::TB::Cleanup(); + return true; + } + + void SetPackageStatus(PCWSTR packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus status) + { + TPMT::SetPackageStatus(m_packageManager, packageFamilyName, status); + } + + void ClearPackageStatus(PCWSTR packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus status) + { + TPMT::ClearPackageStatus(m_packageManager, packageFamilyName, status); + } + + TEST_METHOD(IsPackageSetReady_InvalidParameter) + { + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + packageDeploymentManager.IsPackageSetReady(packageSet); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + + packageDeploymentManager.IsPackageSetReady(packageSet); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + packageSet.PackageSetItems().Append(packageSetItem); + + packageDeploymentManager.IsPackageSetReady(packageSet); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageFamilyName{ L"Not a valid Package Family Name" }; + packageSetItem.PackageFamilyName(c_packageFamilyName); + packageSet.PackageSetItems().Append(packageSetItem); + + packageDeploymentManager.IsPackageSetReady(packageSet); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageFamilyName{ L"Does.Not.Exist_1234567890abc" }; + packageSetItem.PackageFamilyName(c_packageFamilyName); + packageSet.PackageSetItems().Append(packageSetItem); + + packageDeploymentManager.IsPackageSetReady(packageSet); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageUriAsString{ L"https://doesnotexist.com/assemble.msix" }; + winrt::Windows::Foundation::Uri c_packageUri{ c_packageUriAsString }; + packageSetItem.PackageUri(c_packageUri); + packageSet.PackageSetItems().Append(packageSetItem); + + packageDeploymentManager.IsPackageSetReady(packageSet); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(IsPackageSetReady_1_NoSuchPackage_No) + { + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageFamilyName{ L"Does.Not.Exist_1234567890abc" }; + packageSetItem.PackageFamilyName(c_packageFamilyName); + PCWSTR c_packageUriAsString{ L"file://c:/does/not/exist.msix" }; + winrt::Windows::Foundation::Uri c_packageUri{ c_packageUriAsString }; + packageSetItem.PackageUri(c_packageUri); + packageSet.PackageSetItems().Append(packageSetItem); + + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(IsPackageSetReady_1_NotInstalled_No) + { + RemovePackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(IsPackageSetReady_1_Registered_Yes) + { + AddPackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(IsPackageSetReady_1_OlderRegistered_No) + { + AddPackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem redder{ Make_PackageSetItem(::TPF::Redder::GetPackageFullName(), ::TPF::Redder::c_packageDirName) }; + packageSet.PackageSetItems().Append(redder); + + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(IsPackageSetReady_1_NewerRegistered_Yes) + { + AddPackage_Redder(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + RemovePackage_Redder(); + } + + TEST_METHOD(IsPackageSetReady_1_RegisteredPackageStatusBad_No) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + AddPackage_Red(); + SetPackageStatus(::TPF::Red::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + ClearPackageStatus(::TPF::Red::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + } + + TEST_METHOD(IsPackageSetReady_N_NotInstalled_No) + { + RemovePackage_Red(); + RemovePackage_Green(); + RemovePackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(IsPackageSetReady_N_Registered_Yes) + { + AddPackage_Red(); + AddPackage_Green(); + AddPackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(IsPackageSetReady_N_OlderRegistered_No) + { + AddPackage_Red(); + AddPackage_Green(); + AddPackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem redder{ Make_PackageSetItem(::TPF::Redder::GetPackageFullName(), ::TPF::Redder::c_packageDirName) }; + packageSet.PackageSetItems().Append(redder); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(IsPackageSetReady_N_NewerRegistered_Yes) + { + AddPackage_Redder(); + AddPackage_Green(); + AddPackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + RemovePackage_Redder(); + } + + TEST_METHOD(IsPackageSetReady_N_RegisteredAndNotInstalled_No) + { + AddPackage_Red(); + RemovePackage_Green(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(IsPackageSetReady_N_No_NotAllPackageStatusOK) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + AddPackage_Red(); + AddPackage_Green(); + SetPackageStatus(::TPF::Green::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + ClearPackageStatus(::TPF::Green::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_InvalidParameter) + { + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + packageSet.PackageSetItems().Append(packageSetItem); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageFamilyName{ L"Not a valid Package Family Name" }; + packageSetItem.PackageFamilyName(c_packageFamilyName); + packageSet.PackageSetItems().Append(packageSetItem); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageFamilyName{ L"Does.Not.Exist_1234567890abc" }; + packageSetItem.PackageFamilyName(c_packageFamilyName); + packageSet.PackageSetItems().Append(packageSetItem); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageUriAsString{ L"file://c:/assemble.msix" }; + winrt::Windows::Foundation::Uri c_packageUri{ c_packageUriAsString }; + packageSetItem.PackageUri(c_packageUri); + packageSet.PackageSetItems().Append(packageSetItem); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_1_NoSuchPackage_Fail) + { + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageFamilyName{ L"Does.Not.Exist_1234567890abc" }; + packageSetItem.PackageFamilyName(c_packageFamilyName); + PCWSTR c_packageUriAsString{ L"file://c:/does/not/exist.msix" }; + winrt::Windows::Foundation::Uri c_packageUri{ c_packageUriAsString }; + packageSetItem.PackageUri(c_packageUri); + packageSet.PackageSetItems().Append(packageSetItem); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedFailure, deploymentResult.Status()); + VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_INSTALL_OPEN_PACKAGE_FAILED), deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_1_NotInstalled_Success) + { + RemovePackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_1_Staged_Success) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + StagePackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_1_Registered_Success) + { + AddPackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_1_OlderRegistered_Success) + { + AddPackage_Red(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem redder{ Make_PackageSetItem(::TPF::Redder::GetPackageFullName(), ::TPF::Redder::c_packageDirName) }; + packageSet.PackageSetItems().Append(redder); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + RemovePackage_Redder(); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_1_NewerRegistered_Success) + { + AddPackage_Redder(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + RemovePackage_Redder(); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_1_RegisteredPackageStatusBad_Success) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + AddPackage_Red(); + SetPackageStatus(::TPF::Red::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + //TODO REMOVE ClearPackageStatus(::TPF::Red::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_N_NotInstalled_Success) + { + RemovePackage_Red(); + RemovePackage_Green(); + RemovePackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_N_Registered_Success) + { + AddPackage_Red(); + AddPackage_Green(); + AddPackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_N_NewerRegistered_Success) + { + AddPackage_Redder(); + AddPackage_Green(); + AddPackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + RemovePackage_Redder(); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_N_OlderRegistered_Success) + { + AddPackage_Red(); + AddPackage_Green(); + AddPackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem redder{ Make_PackageSetItem(::TPF::Redder::GetPackageFullName(), ::TPF::Redder::c_packageDirName) }; + packageSet.PackageSetItems().Append(redder); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + RemovePackage_Redder(); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_N_RegisteredAndNotInstalled_Success) + { + AddPackage_Red(); + RemovePackage_Green(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_N_RegisteredAndNotInstalledAndStaged_Success) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + AddPackage_Red(); + RemovePackage_Green(); + StagePackage_Blue(); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + } + + TEST_METHOD(EnsurePackageSetIsReadyAsync_N_RegisteredPackageStatusOkAndBad_Success) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + AddPackage_Red(); + AddPackage_Green(); + SetPackageStatus(::TPF::Green::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + + winrt::Microsoft::Windows::Management::Deployment::EnsureIsReadyOptions options; + auto deploymentResult{ packageDeploymentManager.EnsurePackageSetIsReadyAsync(packageSet, options).get() }; + VERIFY_ARE_EQUAL(winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentStatus::CompletedSuccess, deploymentResult.Status()); + VERIFY_ARE_EQUAL(S_OK, deploymentResult.ExtendedError(), WEX::Common::String().Format(L"0x%X", deploymentResult.ExtendedError())); + + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + //TODO REMOVE ClearPackageStatus(::TPF::Green::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + } + + private: + winrt::Windows::Management::Deployment::PackageManager m_packageManager; + }; +} diff --git a/test/PackageManager/API/PackageManagerTests.Packages.h b/test/PackageManager/API/PackageManagerTests.Packages.h new file mode 100644 index 0000000000..4a8404a665 --- /dev/null +++ b/test/PackageManager/API/PackageManagerTests.Packages.h @@ -0,0 +1,209 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#ifndef __PACKAGEMANAGERTESTS_PACKAGES_H +#define __PACKAGEMANAGERTESTS_PACKAGES_H + +namespace Test::Packages::Framework +{ +namespace Red +{ + constexpr PCWSTR c_packageDirName = L"PackageManager.Test.F.Red"; + constexpr PCWSTR c_packageFamilyName = L"Test.PackageManager.F.Red_8wekyb3d8bbwe"; + constexpr PCWSTR c_packageFullName_x86 = L"Test.PackageManager.F.Red_1.2.3.4_x86__8wekyb3d8bbwe"; + constexpr PCWSTR c_packageFullName_x64 = L"Test.PackageManager.F.Red_1.2.3.4_x64__8wekyb3d8bbwe"; + constexpr PCWSTR c_packageFullName_arm64 = L"Test.PackageManager.F.Red_1.2.3.4_arm64__8wekyb3d8bbwe"; + constexpr inline PCWSTR GetPackageFullName() + { +#if defined(_M_ARM64) + return c_packageFullName_arm64; +#elif defined(_M_IX86) + return c_packageFullName_x86; +#elif defined(_M_X64) + return c_packageFullName_x64; +#else +# error "Unknown processor architecture" +#endif + } +} +namespace Redder +{ + constexpr PCWSTR c_packageDirName = L"PackageManager.Test.F.Redder"; + constexpr PCWSTR c_packageFamilyName = L"Test.PackageManager.F.Red_8wekyb3d8bbwe"; + constexpr PCWSTR c_packageFullName_x86 = L"Test.PackageManager.F.Red_2.4.6.8_x86__8wekyb3d8bbwe"; + constexpr PCWSTR c_packageFullName_x64 = L"Test.PackageManager.F.Red_2.4.6.8_x64__8wekyb3d8bbwe"; + constexpr PCWSTR c_packageFullName_arm64 = L"Test.PackageManager.F.Red_2.4.6.8_arm64__8wekyb3d8bbwe"; + constexpr inline PCWSTR GetPackageFullName() + { +#if defined(_M_ARM64) + return c_packageFullName_arm64; +#elif defined(_M_IX86) + return c_packageFullName_x86; +#elif defined(_M_X64) + return c_packageFullName_x64; +#else +# error "Unknown processor architecture" +#endif + } +} +namespace Green +{ + constexpr PCWSTR c_packageDirName = L"PackageManager.Test.F.Green"; + constexpr PCWSTR c_packageFamilyName = L"Test.PackageManager.F.Green_8wekyb3d8bbwe"; + constexpr PCWSTR c_packageFullName_x86 = L"Test.PackageManager.F.Green_1.2.3.4_x86__8wekyb3d8bbwe"; + constexpr PCWSTR c_packageFullName_x64 = L"Test.PackageManager.F.Green_1.2.3.4_x64__8wekyb3d8bbwe"; + constexpr PCWSTR c_packageFullName_arm64 = L"Test.PackageManager.F.Green_1.2.3.4_arm64__8wekyb3d8bbwe"; + constexpr inline PCWSTR GetPackageFullName() + { +#if defined(_M_ARM64) + return c_packageFullName_arm64; +#elif defined(_M_IX86) + return c_packageFullName_x86; +#elif defined(_M_X64) + return c_packageFullName_x64; +#else +# error "Unknown processor architecture" +#endif + } +} +namespace Blue +{ + constexpr PCWSTR c_packageDirName = L"PackageManager.Test.F.Blue"; + constexpr PCWSTR c_packageFamilyName = L"Test.PackageManager.F.Blue_8wekyb3d8bbwe"; + constexpr PCWSTR c_packageFullName_x86 = L"Test.PackageManager.F.Blue_1.2.3.4_x86__8wekyb3d8bbwe"; + constexpr PCWSTR c_packageFullName_x64 = L"Test.PackageManager.F.Blue_1.2.3.4_x64__8wekyb3d8bbwe"; + constexpr PCWSTR c_packageFullName_arm64 = L"Test.PackageManager.F.Blue_1.2.3.4_arm64__8wekyb3d8bbwe"; + constexpr inline PCWSTR GetPackageFullName() + { +#if defined(_M_ARM64) + return c_packageFullName_arm64; +#elif defined(_M_IX86) + return c_packageFullName_x86; +#elif defined(_M_X64) + return c_packageFullName_x64; +#else +# error "Unknown processor architecture" +#endif + } +} +} + +namespace Test::PackageManager::Tests +{ + namespace TP = ::Test::Packages; + namespace TPF = ::Test::Packages::Framework; + + inline winrt::Microsoft::Windows::Management::Deployment::PackageSetItem Make_PackageSetItem( + PCWSTR packageFullName, + PCWSTR packageDirName) + { + + WEX::Logging::Log::Comment(WEX::Common::String().Format(L"PackageSetItem: PackageFullName:%s Path:%s", packageFullName, packageDirName)); + const auto [packageName, packageVersion, packageArchitecture, packageResourceId, packagePublisherId, packageFamilyName]{ ::AppModel::Package::ParsePackageFullName(packageFullName) }; + + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem psi; + psi.PackageFamilyName(packageFamilyName); + psi.PackageUri(TP::GetMsixPackageUri(packageDirName)); + const ::AppModel::Identity::PackageVersion version{ packageVersion }; + psi.MinVersion(version.ToWinrtPackageVersion()); + return psi; + } + + inline void AddPackage_Red() + { + TP::AddPackageIfNecessary(Test::Packages::Framework::Red::c_packageDirName, TPF::Red::GetPackageFullName()); + } + inline void StagePackage_Red() + { + TP::StagePackageIfNecessary(Test::Packages::Framework::Red::c_packageDirName, TPF::Red::GetPackageFullName()); + } + inline void RemovePackage_Red() + { + // Best-effort removal. PackageManager.RemovePackage errors if the package + // is not registered, but if it's not registered we're good. "'Tis the destination + // that matters, not the journey" so regardless how much or little work + // we need do, we're happy as long as the package isn't registered when we're done + // + // Thus, do a *IfNecessary removal + TP::RemovePackageIfNecessary(TPF::Red::GetPackageFullName()); + } + + inline void AddPackage_Redder() + { + TP::AddPackageIfNecessary(Test::Packages::Framework::Redder::c_packageDirName, TPF::Redder::GetPackageFullName()); + } + inline void StagePackage_Redder() + { + TP::StagePackageIfNecessary(Test::Packages::Framework::Redder::c_packageDirName, TPF::Redder::GetPackageFullName()); + } + inline void RemovePackage_Redder() + { + // Best-effort removal. PackageManager.RemovePackage errors if the package + // is not registered, but if it's not registered we're good. "'Tis the destination + // that matters, not the journey" so regardless how much or little work + // we need do, we're happy as long as the package isn't registered when we're done + // + // Thus, do a *IfNecessary removal + TP::RemovePackageIfNecessary(TPF::Redder::GetPackageFullName()); + } + + inline void AddPackage_Green() + { + TP::AddPackageIfNecessary(Test::Packages::Framework::Green::c_packageDirName, TPF::Green::GetPackageFullName()); + } + inline void StagePackage_Green() + { + TP::StagePackageIfNecessary(Test::Packages::Framework::Green::c_packageDirName, TPF::Green::GetPackageFullName()); + } + inline void RemovePackage_Green() + { + // Best-effort removal. PackageManager.RemovePackage errors if the package + // is not registered, but if it's not registered we're good. "'Tis the destination + // that matters, not the journey" so regardless how much or little work + // we need do, we're happy as long as the package isn't registered when we're done + // + // Thus, do a *IfNecessary removal + TP::RemovePackageIfNecessary(TPF::Green::GetPackageFullName()); + } + + inline void AddPackage_Blue() + { + TP::AddPackageIfNecessary(Test::Packages::Framework::Blue::c_packageDirName, TPF::Blue::GetPackageFullName()); + } + inline void StagePackage_Blue() + { + TP::StagePackageIfNecessary(Test::Packages::Framework::Blue::c_packageDirName, TPF::Blue::GetPackageFullName()); + } + inline void RemovePackage_Blue() + { + // Best-effort removal. PackageManager.RemovePackage errors if the package + // is not registered, but if it's not registered we're good. "'Tis the destination + // that matters, not the journey" so regardless how much or little work + // we need do, we're happy as long as the package isn't registered when we're done + // + // Thus, do a *IfNecessary removal + TP::RemovePackageIfNecessary(TPF::Blue::GetPackageFullName()); + } + + inline void SetPackageStatus(winrt::Windows::Management::Deployment::PackageManager packageManager, PCWSTR packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus status) + { + const auto packageTypes{ winrt::Windows::Management::Deployment::PackageTypes::Framework }; + auto packages{ packageManager.FindPackagesForUserWithPackageTypes(winrt::hstring(), packageFamilyName, packageTypes) }; + for (const winrt::Windows::ApplicationModel::Package& package : packages) + { + packageManager.SetPackageStatus(package.Id().FullName(), status); + } + } + + inline void ClearPackageStatus(winrt::Windows::Management::Deployment::PackageManager packageManager, PCWSTR packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus status) + { + const auto packageTypes{ winrt::Windows::Management::Deployment::PackageTypes::Framework }; + auto packages{ packageManager.FindPackagesForUserWithPackageTypes(winrt::hstring(), packageFamilyName, packageTypes) }; + for (const winrt::Windows::ApplicationModel::Package& package : packages) + { + packageManager.ClearPackageStatus(package.Id().FullName(), status); + } + } +} + +#endif // __PACKAGEMANAGERTESTS_PACKAGES_H diff --git a/test/PackageManager/API/PackageManagerTests.vcxproj b/test/PackageManager/API/PackageManagerTests.vcxproj new file mode 100644 index 0000000000..a874267c5e --- /dev/null +++ b/test/PackageManager/API/PackageManagerTests.vcxproj @@ -0,0 +1,172 @@ + + + + + + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM64 + + + Release + ARM64 + + + + 16.0 + {4a38cb80-3580-4960-9b31-3301058b7afe} + Win32Proj + PackageManagerTests + 10.0 + NativeUnitTestProject + PackageManagerTests + + + DynamicLibrary + false + v143 + Unicode + + + true + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + Use + true + pch.h + $(RepoRoot)\test\inc;$(RepoRoot)\dev\common;$(VCInstallDir)UnitTest\include;$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;%(AdditionalIncludeDirectories) + $(RepoRoot);%(AdditionalIncludeDirectories) + + + Windows + onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;wex.common.lib;wex.logger.lib;te.common.lib;%(AdditionalDependencies) + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL + Microsoft.WindowsAppRuntime.Bootstrap.dll;%(DelayLoadDLLs) + + + + + _DEBUG;%(PreprocessorDefinitions) + + + + + NDEBUG;%(PreprocessorDefinitions) + + + + + WIN32;%(PreprocessorDefinitions) + + + + + Create + + + + + + + + + + + + + + $(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.Windows.Management.Deployment.winmd + true + + + + + $(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.Windows.ApplicationModel.DynamicDependency.winmd + true + + + + + $(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.Windows.ApplicationModel.WindowsAppRuntime.winmd + true + + + + + + + + {f76b776e-86f5-48c5-8fc7-d2795ecc9746} + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + + + + + diff --git a/test/PackageManager/API/PackageManagerTests.vcxproj.filters b/test/PackageManager/API/PackageManagerTests.vcxproj.filters new file mode 100644 index 0000000000..50298e2af0 --- /dev/null +++ b/test/PackageManager/API/PackageManagerTests.vcxproj.filters @@ -0,0 +1,39 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + + + + diff --git a/test/PackageManager/API/PackageRuntimeManagerTests.cpp b/test/PackageManager/API/PackageRuntimeManagerTests.cpp new file mode 100644 index 0000000000..9156b375ac --- /dev/null +++ b/test/PackageManager/API/PackageRuntimeManagerTests.cpp @@ -0,0 +1,582 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include + +namespace TB = ::Test::Bootstrap; +namespace TP = ::Test::Packages; +namespace TPF = ::Test::Packages::Framework; +namespace TPMT = ::Test::PackageManager::Tests; + +namespace Test::PackageManager::Tests +{ + class PackageRuntimeManagerTests + { + public: + BEGIN_TEST_CLASS(PackageRuntimeManagerTests) + TEST_CLASS_PROPERTY(L"ThreadingModel", L"MTA") + END_TEST_CLASS() + + TEST_CLASS_SETUP(ClassSetup) + { + if (!::WindowsVersion::IsWindows11_22H2OrGreater()) + { + WEX::Logging::Log::Result(WEX::Logging::TestResults::Skipped, L"PackageRuntimeManager requires >= 22H2 (Sun Valley 2). Skipping tests"); + return true; + } + RemovePackage_Blue(); + RemovePackage_Green(); + RemovePackage_Redder(); + RemovePackage_Red(); + ::TB::Setup(); + AddPackage_Red(); + AddPackage_Green(); + AddPackage_Blue(); + return true; + } + + TEST_CLASS_CLEANUP(ClassCleanup) + { + RemovePackage_Blue(); + RemovePackage_Green(); + RemovePackage_Redder(); + RemovePackage_Red(); + ::TB::Cleanup(); + return true; + } + + void SetPackageStatus(PCWSTR packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus status) + { + TPMT::SetPackageStatus(m_packageManager, packageFamilyName, status); + } + + void ClearPackageStatus(PCWSTR packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus status) + { + TPMT::ClearPackageStatus(m_packageManager, packageFamilyName, status); + } + + TEST_METHOD(AddPackageSet_InvalidParameter) + { + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + packageSet.PackageSetItems().Append(packageSetItem); + + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageFamilyName{ L"Not a valid Package Family Name" }; + packageSetItem.PackageFamilyName(c_packageFamilyName); + packageSet.PackageSetItems().Append(packageSetItem); + + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageFamilyName{ L"Does.Not.Exist_1234567890abc" }; + packageSetItem.PackageFamilyName(c_packageFamilyName); + packageSet.PackageSetItems().Append(packageSetItem); + + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + try + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageUriAsString{ L"file://c:/assemble.msix" }; + winrt::Windows::Foundation::Uri c_packageUri{ c_packageUriAsString }; + packageSetItem.PackageUri(c_packageUri); + packageSet.PackageSetItems().Append(packageSetItem); + + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(E_INVALIDARG, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(AddPackageSet_1_NoSuchPackage_Fail) + { + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"Does.Not.Exist" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem packageSetItem; + PCWSTR c_packageFamilyName{ L"Does.Not.Exist_1234567890abc" }; + packageSetItem.PackageFamilyName(c_packageFamilyName); + PCWSTR c_packageUriAsString{ L"file://c:/does/not/exist.msix" }; + winrt::Windows::Foundation::Uri c_packageUri{ c_packageUriAsString }; + packageSetItem.PackageUri(c_packageUri); + packageSet.PackageSetItems().Append(packageSetItem); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + try + { + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(AddPackageSet_1_NotInstalled_Fail) + { + RemovePackage_Red(); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + try + { + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(AddPackageSet_1_Staged_Fail) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + RemovePackage_Red(); + StagePackage_Red(); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + try + { + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(AddPackageSet_1_Registered_Success) + { + AddPackage_Red(); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + const auto packageSetRuntimeDisposition{ packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions) }; + + packageRuntimeManager.RemovePackageSet(packageSetRuntimeDisposition); + } + + TEST_METHOD(AddPackageSet_1_OlderRegistered_Fail) + { + RemovePackage_Redder(); + AddPackage_Red(); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem redder{ Make_PackageSetItem(::TPF::Redder::GetPackageFullName(), ::TPF::Redder::c_packageDirName) }; + packageSet.PackageSetItems().Append(redder); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + try + { + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(AddPackageSet_1_NewerRegistered_Success) + { + AddPackage_Redder(); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + const auto packageSetRuntimeDisposition{ packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions) }; + + packageRuntimeManager.RemovePackageSet(packageSetRuntimeDisposition); + RemovePackage_Redder(); + } + + TEST_METHOD(AddPackageSet_1_RegisteredPackageStatusBad_Fail) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + AddPackage_Red(); + SetPackageStatus(::TPF::Red::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + try + { + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + ClearPackageStatus(::TPF::Red::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + } + + TEST_METHOD(AddPackageSet_N_NotInstalled_Fail) + { + RemovePackage_Red(); + RemovePackage_Green(); + RemovePackage_Blue(); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + try + { + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(AddPackageSet_N_Registered_Success) + { + AddPackage_Red(); + AddPackage_Green(); + AddPackage_Blue(); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + const auto packageSetRuntimeDisposition{ packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions) }; + + packageRuntimeManager.RemovePackageSet(packageSetRuntimeDisposition); + } + + TEST_METHOD(AddPackageSet_N_NewerRegistered_Success) + { + AddPackage_Redder(); + AddPackage_Green(); + AddPackage_Blue(); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_TRUE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + const auto packageSetRuntimeDisposition{ packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions) }; + + packageRuntimeManager.RemovePackageSet(packageSetRuntimeDisposition); + RemovePackage_Redder(); + } + + TEST_METHOD(AddPackageSet_N_OlderRegistered_Fail) + { + AddPackage_Red(); + AddPackage_Green(); + AddPackage_Blue(); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem redder{ Make_PackageSetItem(::TPF::Redder::GetPackageFullName(), ::TPF::Redder::c_packageDirName) }; + packageSet.PackageSetItems().Append(redder); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Blue::GetPackageFullName(), ::TPF::Blue::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + try + { + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(AddPackageSet_N_RegisteredAndNotInstalled_Fail) + { + AddPackage_Red(); + RemovePackage_Green(); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + try + { + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(AddPackageSet_N_RegisteredAndNotInstalledAndStaged_Fail) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + AddPackage_Red(); + RemovePackage_Green(); + StagePackage_Blue(); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem blue{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(blue); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + try + { + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + } + + TEST_METHOD(AddPackageSet_N_RegisteredPackageStatusOkAndBad_Fail) + { + BEGIN_TEST_METHOD_PROPERTIES() + TEST_CLASS_PROPERTY(L"RunAs", L"ElevatedUser") + END_TEST_METHOD_PROPERTIES() + + AddPackage_Red(); + AddPackage_Green(); + SetPackageStatus(::TPF::Green::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + + winrt::Microsoft::Windows::Management::Deployment::PackageSet packageSet; + PCWSTR c_packageSetId{ L"RGB" }; + packageSet.Id(c_packageSetId); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem red{ Make_PackageSetItem(::TPF::Red::GetPackageFullName(), ::TPF::Red::c_packageDirName) }; + packageSet.PackageSetItems().Append(red); + winrt::Microsoft::Windows::Management::Deployment::PackageSetItem green{ Make_PackageSetItem(::TPF::Green::GetPackageFullName(), ::TPF::Green::c_packageDirName) }; + packageSet.PackageSetItems().Append(green); + auto packageDeploymentManager{ winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentManager::GetDefault() }; + VERIFY_IS_FALSE(packageDeploymentManager.IsPackageSetReady(packageSet)); + + try + { + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions createOptions; + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions addOptions; + auto packageRuntimeManager{ winrt::Microsoft::Windows::Management::Deployment::PackageRuntimeManager::GetDefault() }; + packageRuntimeManager.AddPackageSet(packageSet, createOptions, addOptions); + VERIFY_FAIL(L"Success is not expected"); + } + catch (winrt::hresult_error& e) + { + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, e.code(), WEX::Common::String().Format(L"0x%X %s", e.code(), e.message().c_str())); + } + + ClearPackageStatus(::TPF::Green::c_packageFamilyName, winrt::Windows::Management::Deployment::PackageStatus::Modified); + } + + private: + winrt::Windows::Management::Deployment::PackageManager m_packageManager; + }; +} diff --git a/test/PackageManager/API/Test.testdef b/test/PackageManager/API/Test.testdef new file mode 100644 index 0000000000..4f9f4e6de3 --- /dev/null +++ b/test/PackageManager/API/Test.testdef @@ -0,0 +1,11 @@ +{ + "Tests": [ + { + "Description": "PackageManagerTests tests for feature PackageManager (arm64 not currently enabled)", + "Filename": "PackageManagerTests.dll", + "Parameters": "", + "Architectures": ["x86", "x64"], + "Status": "Enabled" + } + ] +} diff --git a/test/PackageManager/API/packages.config b/test/PackageManager/API/packages.config new file mode 100644 index 0000000000..ecebfdd18e --- /dev/null +++ b/test/PackageManager/API/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/test/PackageManager/API/pch.cpp b/test/PackageManager/API/pch.cpp new file mode 100644 index 0000000000..f59e66e263 --- /dev/null +++ b/test/PackageManager/API/pch.cpp @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +// pch.cpp: source file corresponding to the pre-compiled header + +#include "pch.h" diff --git a/test/PackageManager/API/pch.h b/test/PackageManager/API/pch.h new file mode 100644 index 0000000000..6a5c7c20a6 --- /dev/null +++ b/test/PackageManager/API/pch.h @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#ifndef PCH_H +#define PCH_H + +#include + +#include + +#include +#include + +#include +#include + +#include +#include + +#include + +#include + +#include +#include +#include + +#include "PackageManagerTests.Packages.h" + +#endif //PCH_H diff --git a/test/PackageManager/data/PackageManager.Test.F.Blue.msix/PackageManager.Test.F.Blue.msix.vcxproj b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/PackageManager.Test.F.Blue.msix.vcxproj new file mode 100644 index 0000000000..36f92c6d49 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/PackageManager.Test.F.Blue.msix.vcxproj @@ -0,0 +1,130 @@ + + + + + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM64 + + + Release + ARM64 + + + + {FBAE1876-C50A-4EFC-A686-3008B6438731} + VCProjectVersion + PackageManager.Test.F.Blue.Msix + en-US + 16.0 + 10.0.22621.0 + 10.0.17763.0 + 10.0 + + + Utility + v143 + + + true + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(TargetName) + + + + appxmanifest.xml + + + appxmanifest.xml + + + appxmanifest.xml + + + + + $(RepoTestCertificatePFX) + $(RepoTestCertificatePassword) + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Blue.msix/PackageManager.Test.F.Blue.msix.vcxproj.filters b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/PackageManager.Test.F.Blue.msix.vcxproj.filters new file mode 100644 index 0000000000..3987f7c194 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/PackageManager.Test.F.Blue.msix.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + \ No newline at end of file diff --git a/test/PackageManager/data/PackageManager.Test.F.Blue.msix/PackageManager.Test.F.Blue.vcxproj.filters b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/PackageManager.Test.F.Blue.vcxproj.filters new file mode 100644 index 0000000000..2df21c891a --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/PackageManager.Test.F.Blue.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Blue.msix/appxmanifest-arm64.xml b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/appxmanifest-arm64.xml new file mode 100644 index 0000000000..07adf08379 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/appxmanifest-arm64.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Test.PackageManager.F.Blue + Microsoft Corporation + logo.png + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Blue.msix/appxmanifest-x64.xml b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/appxmanifest-x64.xml new file mode 100644 index 0000000000..26fb38fd09 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/appxmanifest-x64.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Test.PackageManager.F.Blue + Microsoft Corporation + logo.png + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Blue.msix/appxmanifest-x86.xml b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/appxmanifest-x86.xml new file mode 100644 index 0000000000..aa38863c63 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/appxmanifest-x86.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Test.PackageManager.F.Blue + Microsoft Corporation + logo.png + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Blue.msix/logo.png b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/logo.png new file mode 100644 index 0000000000..5bd7c0ce4d Binary files /dev/null and b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/logo.png differ diff --git a/test/PackageManager/data/PackageManager.Test.F.Blue.msix/packages.config b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/packages.config new file mode 100644 index 0000000000..d9db55a1b3 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Blue.msix/packages.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Green.msix/PackageManager.Test.F.Green.msix.vcxproj b/test/PackageManager/data/PackageManager.Test.F.Green.msix/PackageManager.Test.F.Green.msix.vcxproj new file mode 100644 index 0000000000..ec537a9085 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Green.msix/PackageManager.Test.F.Green.msix.vcxproj @@ -0,0 +1,130 @@ + + + + + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM64 + + + Release + ARM64 + + + + {4626E11F-A7A4-41A2-B22D-5A108BC369AC} + VCProjectVersion + PackageManager.Test.F.Green.Msix + en-US + 16.0 + 10.0.22621.0 + 10.0.17763.0 + 10.0 + + + Utility + v143 + + + true + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(TargetName) + + + + appxmanifest.xml + + + appxmanifest.xml + + + appxmanifest.xml + + + + + $(RepoTestCertificatePFX) + $(RepoTestCertificatePassword) + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Green.msix/PackageManager.Test.F.Green.msix.vcxproj.filters b/test/PackageManager/data/PackageManager.Test.F.Green.msix/PackageManager.Test.F.Green.msix.vcxproj.filters new file mode 100644 index 0000000000..3987f7c194 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Green.msix/PackageManager.Test.F.Green.msix.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + \ No newline at end of file diff --git a/test/PackageManager/data/PackageManager.Test.F.Green.msix/PackageManager.Test.F.Green.vcxproj.filters b/test/PackageManager/data/PackageManager.Test.F.Green.msix/PackageManager.Test.F.Green.vcxproj.filters new file mode 100644 index 0000000000..2df21c891a --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Green.msix/PackageManager.Test.F.Green.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Green.msix/appxmanifest-arm64.xml b/test/PackageManager/data/PackageManager.Test.F.Green.msix/appxmanifest-arm64.xml new file mode 100644 index 0000000000..dd67e588f8 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Green.msix/appxmanifest-arm64.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Test.PackageManager.F.Green + Microsoft Corporation + logo.png + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Green.msix/appxmanifest-x64.xml b/test/PackageManager/data/PackageManager.Test.F.Green.msix/appxmanifest-x64.xml new file mode 100644 index 0000000000..bcc4e0a65f --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Green.msix/appxmanifest-x64.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Test.PackageManager.F.Green + Microsoft Corporation + logo.png + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Green.msix/appxmanifest-x86.xml b/test/PackageManager/data/PackageManager.Test.F.Green.msix/appxmanifest-x86.xml new file mode 100644 index 0000000000..b9621318dd --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Green.msix/appxmanifest-x86.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Test.PackageManager.F.Green + Microsoft Corporation + logo.png + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Green.msix/logo.png b/test/PackageManager/data/PackageManager.Test.F.Green.msix/logo.png new file mode 100644 index 0000000000..5bd7c0ce4d Binary files /dev/null and b/test/PackageManager/data/PackageManager.Test.F.Green.msix/logo.png differ diff --git a/test/PackageManager/data/PackageManager.Test.F.Green.msix/packages.config b/test/PackageManager/data/PackageManager.Test.F.Green.msix/packages.config new file mode 100644 index 0000000000..d9db55a1b3 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Green.msix/packages.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Red.msix/PackageManager.Test.F.Red.msix.vcxproj b/test/PackageManager/data/PackageManager.Test.F.Red.msix/PackageManager.Test.F.Red.msix.vcxproj new file mode 100644 index 0000000000..5399098729 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Red.msix/PackageManager.Test.F.Red.msix.vcxproj @@ -0,0 +1,130 @@ + + + + + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM64 + + + Release + ARM64 + + + + {f2946790-daf7-4dff-a754-ba471a12e494} + VCProjectVersion + PackageManager.Test.F.Red.Msix + en-US + 16.0 + 10.0.22621.0 + 10.0.17763.0 + 10.0 + + + Utility + v143 + + + true + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(TargetName) + + + + appxmanifest.xml + + + appxmanifest.xml + + + appxmanifest.xml + + + + + $(RepoTestCertificatePFX) + $(RepoTestCertificatePassword) + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Red.msix/PackageManager.Test.F.Red.msix.vcxproj.filters b/test/PackageManager/data/PackageManager.Test.F.Red.msix/PackageManager.Test.F.Red.msix.vcxproj.filters new file mode 100644 index 0000000000..2df21c891a --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Red.msix/PackageManager.Test.F.Red.msix.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Red.msix/PackageManager.Test.F.Red.vcxproj.filters b/test/PackageManager/data/PackageManager.Test.F.Red.msix/PackageManager.Test.F.Red.vcxproj.filters new file mode 100644 index 0000000000..2df21c891a --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Red.msix/PackageManager.Test.F.Red.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Red.msix/appxmanifest-arm64.xml b/test/PackageManager/data/PackageManager.Test.F.Red.msix/appxmanifest-arm64.xml new file mode 100644 index 0000000000..508357f066 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Red.msix/appxmanifest-arm64.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Test.PackageManager.F.Red + Microsoft Corporation + logo.png + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Red.msix/appxmanifest-x64.xml b/test/PackageManager/data/PackageManager.Test.F.Red.msix/appxmanifest-x64.xml new file mode 100644 index 0000000000..fd238b8fd4 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Red.msix/appxmanifest-x64.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Test.PackageManager.F.Red + Microsoft Corporation + logo.png + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Red.msix/appxmanifest-x86.xml b/test/PackageManager/data/PackageManager.Test.F.Red.msix/appxmanifest-x86.xml new file mode 100644 index 0000000000..1f3b97b2e0 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Red.msix/appxmanifest-x86.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Test.PackageManager.F.Red + Microsoft Corporation + logo.png + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Red.msix/logo.png b/test/PackageManager/data/PackageManager.Test.F.Red.msix/logo.png new file mode 100644 index 0000000000..5bd7c0ce4d Binary files /dev/null and b/test/PackageManager/data/PackageManager.Test.F.Red.msix/logo.png differ diff --git a/test/PackageManager/data/PackageManager.Test.F.Red.msix/packages.config b/test/PackageManager/data/PackageManager.Test.F.Red.msix/packages.config new file mode 100644 index 0000000000..d9db55a1b3 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Red.msix/packages.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Redder.msix/PackageManager.Test.F.Redder.msix.vcxproj b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/PackageManager.Test.F.Redder.msix.vcxproj new file mode 100644 index 0000000000..c4ce1e0606 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/PackageManager.Test.F.Redder.msix.vcxproj @@ -0,0 +1,130 @@ + + + + + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM64 + + + Release + ARM64 + + + + {d0a1dfb8-8cee-4cfc-b57b-b7c574b411c2} + VCProjectVersion + PackageManager.Test.F.Redder.Msix + en-US + 16.0 + 10.0.22621.0 + 10.0.17763.0 + 10.0 + + + Utility + v143 + + + true + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(TargetName) + + + + appxmanifest.xml + + + appxmanifest.xml + + + appxmanifest.xml + + + + + $(RepoTestCertificatePFX) + $(RepoTestCertificatePassword) + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Redder.msix/PackageManager.Test.F.Redder.msix.vcxproj.filters b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/PackageManager.Test.F.Redder.msix.vcxproj.filters new file mode 100644 index 0000000000..2df21c891a --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/PackageManager.Test.F.Redder.msix.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Redder.msix/PackageManager.Test.F.Redder.vcxproj.filters b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/PackageManager.Test.F.Redder.vcxproj.filters new file mode 100644 index 0000000000..2df21c891a --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/PackageManager.Test.F.Redder.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Redder.msix/appxmanifest-arm64.xml b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/appxmanifest-arm64.xml new file mode 100644 index 0000000000..1ff95c6355 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/appxmanifest-arm64.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Test.PackageManager.F.Redder + Microsoft Corporation + logo.png + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Redder.msix/appxmanifest-x64.xml b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/appxmanifest-x64.xml new file mode 100644 index 0000000000..1d7385d32d --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/appxmanifest-x64.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Test.PackageManager.F.Redder + Microsoft Corporation + logo.png + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Redder.msix/appxmanifest-x86.xml b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/appxmanifest-x86.xml new file mode 100644 index 0000000000..5618a73163 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/appxmanifest-x86.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Test.PackageManager.F.Redder + Microsoft Corporation + logo.png + + + + + + + + + + diff --git a/test/PackageManager/data/PackageManager.Test.F.Redder.msix/logo.png b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/logo.png new file mode 100644 index 0000000000..5bd7c0ce4d Binary files /dev/null and b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/logo.png differ diff --git a/test/PackageManager/data/PackageManager.Test.F.Redder.msix/packages.config b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/packages.config new file mode 100644 index 0000000000..d9db55a1b3 --- /dev/null +++ b/test/PackageManager/data/PackageManager.Test.F.Redder.msix/packages.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/test/PowerNotifications/packages.config b/test/PowerNotifications/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/PowerNotifications/packages.config +++ b/test/PowerNotifications/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/PushNotificationTests/packages.config b/test/PushNotificationTests/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/PushNotificationTests/packages.config +++ b/test/PushNotificationTests/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/TestApps/AccessControlTestApp/packages.config b/test/TestApps/AccessControlTestApp/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/TestApps/AccessControlTestApp/packages.config +++ b/test/TestApps/AccessControlTestApp/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/TestApps/AppLifecycleTestApp/packages.config b/test/TestApps/AppLifecycleTestApp/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/TestApps/AppLifecycleTestApp/packages.config +++ b/test/TestApps/AppLifecycleTestApp/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/TestApps/ManualTestApp/packages.config b/test/TestApps/ManualTestApp/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/TestApps/ManualTestApp/packages.config +++ b/test/TestApps/ManualTestApp/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/TestApps/PushNotificationsDemoApp/packages.config b/test/TestApps/PushNotificationsDemoApp/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/TestApps/PushNotificationsDemoApp/packages.config +++ b/test/TestApps/PushNotificationsDemoApp/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/TestApps/PushNotificationsTestApp/packages.config b/test/TestApps/PushNotificationsTestApp/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/TestApps/PushNotificationsTestApp/packages.config +++ b/test/TestApps/PushNotificationsTestApp/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/TestApps/ToastNotificationsDemoApp/packages.config b/test/TestApps/ToastNotificationsDemoApp/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/TestApps/ToastNotificationsDemoApp/packages.config +++ b/test/TestApps/ToastNotificationsDemoApp/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/TestApps/ToastNotificationsTestApp/packages.config b/test/TestApps/ToastNotificationsTestApp/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/TestApps/ToastNotificationsTestApp/packages.config +++ b/test/TestApps/ToastNotificationsTestApp/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/VersionInfo/packages.config b/test/VersionInfo/packages.config index 9b3e6252ff..1117ac430f 100644 --- a/test/VersionInfo/packages.config +++ b/test/VersionInfo/packages.config @@ -1,6 +1,6 @@  - - + + diff --git a/test/inc/WindowsAppRuntime.Test.Metadata.h b/test/inc/WindowsAppRuntime.Test.Metadata.h index 34b60ad924..952857eba1 100644 --- a/test/inc/WindowsAppRuntime.Test.Metadata.h +++ b/test/inc/WindowsAppRuntime.Test.Metadata.h @@ -19,7 +19,8 @@ #define WINDOWSAPPRUNTIME_TEST_MSIX_SINGLETON_PACKAGE_NAME L"Microsoft.WindowsAppRuntime.Singleton" #define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAMEPREFIX L"WindowsAppRuntime.Test.DDLM" -#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION WINDOWSAPPRUNTIME_TEST_MSIX_MAIN_PACKAGE_NAME +#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION WINDOWSAPPRUNTIME_TEST_METADATA_VERSION +#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION_STRING WINDOWSAPPRUNTIME_TEST_METADATA_VERSION_STRING #define MSIX_PACKAGE_ARCHITECTURE_ARM L"arm" @@ -39,9 +40,9 @@ #else # error "Unknown processor architecture" #endif -#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAME WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAMEPREFIX L"-" WINDOWSAPPRUNTIME_TEST_METADATA_VERSION_STRING L"-" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE +#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAME WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAMEPREFIX L"-" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION_STRING L"-" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE #define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_PUBLISHERID WINDOWSAPPRUNTIME_TEST_MSIX_PUBLISHERID #define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_FAMILYNAME WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAME L"_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_PUBLISHERID -#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_FULLNAME WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAME L"_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION L"_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE L"__" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_PUBLISHERID +#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_FULLNAME WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAME L"_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION_STRING L"_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE L"__" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_PUBLISHERID #endif //__WINDOWSAPPRUNTIME_TEST_METADATA_H diff --git a/test/inc/WindowsAppRuntime.Test.Package.h b/test/inc/WindowsAppRuntime.Test.Package.h index 3d619a0450..a7f670cdea 100644 --- a/test/inc/WindowsAppRuntime.Test.Package.h +++ b/test/inc/WindowsAppRuntime.Test.Package.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #ifndef __WINDOWSAPPRUNTIME_TEST_PACKAGE_H @@ -30,22 +30,28 @@ #define WINDOWSAPPRUNTIME_TEST_MSIX_DEPLOYMENT_SINGLETON_PACKAGE_NAME L"Microsoft.WindowsAppRuntime.Singleton-Test" #define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAMEPREFIX L"WindowsAppRuntime.Test.DDLM" -#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION WINDOWSAPPRUNTIME_TEST_METADATA_VERSION_STRING +#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION WINDOWSAPPRUNTIME_TEST_METADATA_VERSION +#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION_STRING WINDOWSAPPRUNTIME_TEST_METADATA_VERSION_STRING +#define MSIX_PACKAGE_ARCHITECTURE_ARM L"arm" +#define MSIX_PACKAGE_ARCHITECTURE_ARM64 L"arm64" +#define MSIX_PACKAGE_ARCHITECTURE_NEUTRAL L"neutral" +#define MSIX_PACKAGE_ARCHITECTURE_X64 L"x64" +#define MSIX_PACKAGE_ARCHITECTURE_X86 L"x86" #if defined(_M_X64) -#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE L"x64" +#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE MSIX_PACKAGE_ARCHITECTURE_X64 #elif defined(_M_IX86) -#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE L"x86" +#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE MSIX_PACKAGE_ARCHITECTURE_X86 #elif defined(_M_ARM64) -#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE L"arm64" +#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE MSIX_PACKAGE_ARCHITECTURE_ARM64 #elif defined(_M_ARM) -#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE L"arm" +#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE MSIX_PACKAGE_ARCHITECTURE_ARM #else # error "Unknown processor architecture" #endif -#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAME WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAMEPREFIX L"-" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION L"-" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE +#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAME WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAMEPREFIX L"-" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION_STRING L"-" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE #define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_PUBLISHERID WINDOWSAPPRUNTIME_TEST_MSIX_PUBLISHERID #define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_FAMILYNAME WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAME L"_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_PUBLISHERID -#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_FULLNAME WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAME L"_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION L"_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE L"__" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_PUBLISHERID +#define WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_FULLNAME WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_NAME L"_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION_STRING L"_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE L"__" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_PUBLISHERID namespace Test::Packages { @@ -88,7 +94,7 @@ namespace DynamicDependencyDataStore constexpr PCWSTR c_PackageDirName = L"DynamicDependency.DataStore"; constexpr PCWSTR c_PackageNamePrefix = L"WindowsAppRuntime.Test.DynDep.DataStore"; constexpr PCWSTR c_PackageFamilyName = L"WindowsAppRuntime.Test.DynDep.DataStore-" WINDOWSAPPRUNTIME_TEST_METADATA_RELEASE_STRING "_" WINDOWSAPPRUNTIME_TEST_MSIX_PUBLISHERID; - constexpr PCWSTR c_PackageFullName = L"WindowsAppRuntime.Test.DynDep.DataStore-" WINDOWSAPPRUNTIME_TEST_METADATA_RELEASE_STRING "_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION L"_neutral__" WINDOWSAPPRUNTIME_TEST_MSIX_PUBLISHERID; + constexpr PCWSTR c_PackageFullName = L"WindowsAppRuntime.Test.DynDep.DataStore-" WINDOWSAPPRUNTIME_TEST_METADATA_RELEASE_STRING "_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION_STRING L"_neutral__" WINDOWSAPPRUNTIME_TEST_MSIX_PUBLISHERID; } namespace WindowsAppRuntimeMain = DynamicDependencyDataStore; @@ -96,7 +102,7 @@ namespace WindowsAppRuntimeSingleton { constexpr PCWSTR c_PackageDirName = L"WindowsAppRuntime.Test.Singleton"; constexpr PCWSTR c_PackageFamilyName = L"WindowsAppRuntime.Test.Singleton_" WINDOWSAPPRUNTIME_TEST_MSIX_PUBLISHERID; - constexpr PCWSTR c_PackageFullName = L"WindowsAppRuntime.Test.Singleton_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION L"_neutral__" WINDOWSAPPRUNTIME_TEST_MSIX_PUBLISHERID; + constexpr PCWSTR c_PackageFullName = L"WindowsAppRuntime.Test.Singleton_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_VERSION_STRING L"_neutral__" WINDOWSAPPRUNTIME_TEST_MSIX_PUBLISHERID; } namespace DeploymentWindowsAppRuntimeFramework @@ -149,7 +155,30 @@ inline bool IsPackageRegistered(PCWSTR packageFullName) return !path.empty(); } -inline void AddPackage(PCWSTR packageDirName, PCWSTR packageFullName) +inline bool IsPackageAvailable(PCWSTR packageFullName) +{ + // Check if the package is available for use + // This means registered to the current user OR staged + // NOTE: To check if a package is staged and not registered to the current user: + // bool isStaged = IsPackageAvailable(p) && !IsPackageRegistered(p) + if (IsPackageRegistered(packageFullName)) + { + return true; + } + PackageOrigin packageOrigin{}; + const auto rc{ GetStagedPackageOrigin(packageFullName, &packageOrigin) }; + if (rc == ERROR_SUCCESS) + { + return true; + } + else if (rc == ERROR_APP_DATA_NOT_FOUND) + { + return false; + } + THROW_WIN32(rc); +} + +inline std::filesystem::path GetMsixPackagePath(PCWSTR packageDirName) { // Build the target package's .msix filename. It's under the Solution's $(OutDir) // NOTE: It could live in ...\Something.msix\... or ...\Something\... @@ -179,7 +208,18 @@ inline void AddPackage(PCWSTR packageDirName, PCWSTR packageFullName) //VERIFY_IS_TRUE(std::filesystem::is_regular_file(msix)); } - auto msixUri = winrt::Windows::Foundation::Uri(msix.c_str()); + return msix.c_str(); +} + +inline winrt::Windows::Foundation::Uri GetMsixPackageUri(PCWSTR packageDirName) +{ + auto path{ GetMsixPackagePath(packageDirName) }; + return winrt::Windows::Foundation::Uri{ path.c_str() }; +} + +inline void AddPackage(PCWSTR packageDirName, PCWSTR packageFullName) +{ + auto msixUri{ GetMsixPackageUri(packageDirName) }; // Install the package winrt::Windows::Management::Deployment::PackageManager packageManager; @@ -190,12 +230,41 @@ inline void AddPackage(PCWSTR packageDirName, PCWSTR packageFullName) inline void AddPackageIfNecessary(PCWSTR packageDirName, PCWSTR packageFullName) { - if (!IsPackageRegistered(packageFullName)) + if (IsPackageRegistered(packageFullName)) + { + WEX::Logging::Log::Comment(WEX::Common::String().Format(L"AddPackageIfNecessary: %s already registered", packageFullName)); + } + else { + WEX::Logging::Log::Comment(WEX::Common::String().Format(L"AddPackageIfNecessary: %s not registered, adding...", packageFullName)); AddPackage(packageDirName, packageFullName); } } +inline void StagePackage(PCWSTR packageDirName, PCWSTR packageFullName) +{ + auto msixUri{ GetMsixPackageUri(packageDirName) }; + + // Install the package + winrt::Windows::Management::Deployment::PackageManager packageManager; + auto options{ winrt::Windows::Management::Deployment::DeploymentOptions::None }; + auto deploymentResult{ packageManager.StagePackageAsync(msixUri, nullptr, options).get() }; + VERIFY_SUCCEEDED(deploymentResult.ExtendedErrorCode(), WEX::Common::String().Format(L"StagePackageAsync('%s') = 0x%0X %s", packageFullName, deploymentResult.ExtendedErrorCode(), deploymentResult.ErrorText().c_str())); +} + +inline void StagePackageIfNecessary(PCWSTR packageDirName, PCWSTR packageFullName) +{ + if (IsPackageAvailable(packageFullName)) + { + WEX::Logging::Log::Comment(WEX::Common::String().Format(L"StagePackageIfNecessary: %s already staged", packageFullName)); + } + else + { + WEX::Logging::Log::Comment(WEX::Common::String().Format(L"StagePackageIfNecessary: %s not staged, staging...", packageFullName)); + StagePackage(packageDirName, packageFullName); + } +} + inline void RemovePackage(PCWSTR packageFullName) { winrt::Windows::Management::Deployment::PackageManager packageManager; diff --git a/tools/ProjectTemplates/dev.cpp.dll.winrt-client-server/packages.config b/tools/ProjectTemplates/dev.cpp.dll.winrt-client-server/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/tools/ProjectTemplates/dev.cpp.dll.winrt-client-server/packages.config +++ b/tools/ProjectTemplates/dev.cpp.dll.winrt-client-server/packages.config @@ -3,6 +3,6 @@ - + diff --git a/tools/ProjectTemplates/dev.cpp.dll.winrt-client/packages.config b/tools/ProjectTemplates/dev.cpp.dll.winrt-client/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/tools/ProjectTemplates/dev.cpp.dll.winrt-client/packages.config +++ b/tools/ProjectTemplates/dev.cpp.dll.winrt-client/packages.config @@ -3,6 +3,6 @@ - + diff --git a/tools/ProjectTemplates/dev.cpp.exe+dll.com-oopserver/PurojekutoTenpuret/packages.config b/tools/ProjectTemplates/dev.cpp.exe+dll.com-oopserver/PurojekutoTenpuret/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/tools/ProjectTemplates/dev.cpp.exe+dll.com-oopserver/PurojekutoTenpuret/packages.config +++ b/tools/ProjectTemplates/dev.cpp.exe+dll.com-oopserver/PurojekutoTenpuret/packages.config @@ -3,6 +3,6 @@ - + diff --git a/tools/ProjectTemplates/dev.cpp.exe.com-oopserver-main/packages.config b/tools/ProjectTemplates/dev.cpp.exe.com-oopserver-main/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/tools/ProjectTemplates/dev.cpp.exe.com-oopserver-main/packages.config +++ b/tools/ProjectTemplates/dev.cpp.exe.com-oopserver-main/packages.config @@ -3,6 +3,6 @@ - + diff --git a/tools/ProjectTemplates/dev.cpp.exe.console-winrt-client/packages.config b/tools/ProjectTemplates/dev.cpp.exe.console-winrt-client/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/tools/ProjectTemplates/dev.cpp.exe.console-winrt-client/packages.config +++ b/tools/ProjectTemplates/dev.cpp.exe.console-winrt-client/packages.config @@ -3,6 +3,6 @@ - + diff --git a/tools/ProjectTemplates/dev.cpp.exe.winmain-winrt-client/packages.config b/tools/ProjectTemplates/dev.cpp.exe.winmain-winrt-client/packages.config index 14efb7baf5..cd05427e9c 100644 --- a/tools/ProjectTemplates/dev.cpp.exe.winmain-winrt-client/packages.config +++ b/tools/ProjectTemplates/dev.cpp.exe.winmain-winrt-client/packages.config @@ -3,6 +3,6 @@ - + diff --git a/tools/ProjectTemplates/test.cpp.dll.taef/packages.config b/tools/ProjectTemplates/test.cpp.dll.taef/packages.config index 54378eec74..ecebfdd18e 100644 --- a/tools/ProjectTemplates/test.cpp.dll.taef/packages.config +++ b/tools/ProjectTemplates/test.cpp.dll.taef/packages.config @@ -3,7 +3,7 @@ - - + +