diff --git a/src/WinGetUtilInterop.UnitTests/ManifestUnitTest/V1ManifestReadTest.cs b/src/WinGetUtilInterop.UnitTests/ManifestUnitTest/V1ManifestReadTest.cs
index 9ab1c2a995..1fbbfe5051 100644
--- a/src/WinGetUtilInterop.UnitTests/ManifestUnitTest/V1ManifestReadTest.cs
+++ b/src/WinGetUtilInterop.UnitTests/ManifestUnitTest/V1ManifestReadTest.cs
@@ -33,6 +33,7 @@ private enum TestManifestVersion
{
V100,
V110,
+ V160,
}
///
@@ -51,6 +52,11 @@ public void ReadV1ManifestsAndVerifyContents()
Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "TestCollateral", ManifestStrings.V110ManifestMerged));
this.ValidateManifestFields(v110manifest, TestManifestVersion.V110);
+
+ Manifest v160manifest = Manifest.CreateManifestFromPath(
+ Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "TestCollateral", ManifestStrings.V160ManifestMerged));
+
+ this.ValidateManifestFields(v160manifest, TestManifestVersion.V160);
}
///
@@ -126,6 +132,7 @@ private void ValidateManifestFields(Manifest manifest, TestManifestVersion manif
Assert.Equal("Windows.Desktop", manifest.Platform[0]);
Assert.Equal("Windows.Universal", manifest.Platform[1]);
Assert.Equal("10.0.0.0", manifest.MinimumOSVersion);
+
Assert.Equal("zip", manifest.InstallerType);
Assert.Equal("machine", manifest.Scope);
Assert.Equal(3, manifest.InstallModes.Count);
@@ -193,9 +200,9 @@ private void ValidateManifestFields(Manifest manifest, TestManifestVersion manif
Assert.Equal("exe", manifest.AppsAndFeaturesEntries[0].InstallerType);
Assert.Single(manifest.Markets.AllowedMarkets);
Assert.Equal("US", manifest.Markets.AllowedMarkets[0]);
- Assert.Single(manifest.ExpectedReturnCodes);
- Assert.Equal(10, manifest.ExpectedReturnCodes[0].InstallerReturnCode);
- Assert.Equal("packageInUse", manifest.ExpectedReturnCodes[0].ReturnResponse);
+ Assert.Equal(2, manifest.ExpectedReturnCodes.Count);
+ Assert.Equal(2, manifest.ExpectedReturnCodes[0].InstallerReturnCode);
+ Assert.Equal("contactSupport", manifest.ExpectedReturnCodes[0].ReturnResponse);
}
Assert.Equal(2, manifest.Installers.Count);
@@ -303,6 +310,26 @@ private void ValidateManifestFields(Manifest manifest, TestManifestVersion manif
Assert.Equal("Text", localization1.Agreements[0].Agreement);
Assert.Equal("https://AgreementUrl.net", localization1.Agreements[0].AgreementUrl);
}
+
+ if (manifestVersion >= TestManifestVersion.V160)
+ {
+ Assert.Equal("msi", manifest.NestedInstallerType);
+ Assert.Single(manifest.NestedInstallerFiles);
+
+ InstallerNestedInstallerFile installerNestedInstallerFile = manifest.NestedInstallerFiles[0];
+ Assert.Equal("RelativeFilePath", installerNestedInstallerFile.RelativeFilePath);
+ Assert.Equal("PortableCommandAlias", installerNestedInstallerFile.PortableCommandAlias);
+
+ InstallerInstallationMetadata installerInstallationMetadata = manifest.InstallationMetadata;
+ Assert.Equal("%ProgramFiles%\\TestApp", installerInstallationMetadata.DefaultInstallLocation);
+ Assert.Single(installerInstallationMetadata.Files);
+
+ ManifestInstallerFile installerFile = installerInstallationMetadata.Files[0];
+ Assert.Equal("main.exe", installerFile.RelativeFilePath);
+ Assert.Equal("DisplayName", installerFile.DisplayName);
+ Assert.Equal("/arg", installerFile.InvocationParameter);
+ Assert.Equal("69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8C82", installerFile.FileSha256);
+ }
}
///
@@ -320,6 +347,11 @@ internal class ManifestStrings
///
public const string V110ManifestMerged = "V1_1ManifestMerged.yaml";
+ ///
+ /// Merged v1.1 manifest.
+ ///
+ public const string V160ManifestMerged = "V1_6ManifestMerged.yaml";
+
///
/// Merged v1 manifest without localization.
///
diff --git a/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_1ManifestMerged.yaml b/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_1ManifestMerged.yaml
index f646efa6e9..de6888aa7b 100644
--- a/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_1ManifestMerged.yaml
+++ b/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_1ManifestMerged.yaml
@@ -30,8 +30,11 @@ Dependencies:
Description: The MSIX SDK project is an effort to enable developers
ElevationRequirement: elevatesSelf
ExpectedReturnCodes:
-- InstallerReturnCode: 10
- ReturnResponse: packageInUse
+- InstallerReturnCode: 2
+ ReturnResponse: contactSupport
+- InstallerReturnCode: 3
+ ReturnResponse: custom
+ ReturnResponseUrl: https://defaultReturnResponseUrl.com
FileExtensions:
- appx
- msix
diff --git a/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_6ManifestMerged.yaml b/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_6ManifestMerged.yaml
new file mode 100644
index 0000000000..dda831944c
--- /dev/null
+++ b/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_6ManifestMerged.yaml
@@ -0,0 +1,222 @@
+PackageIdentifier: microsoft.msixsdk
+PackageVersion: 1.7.32
+PackageLocale: en-US
+Publisher: Microsoft
+PublisherUrl: https://www.microsoft.com
+PublisherSupportUrl: https://www.microsoft.com/support
+PrivacyUrl: https://www.microsoft.com/privacy
+Author: Microsoft
+PackageName: MSIX SDK
+PackageUrl: https://www.microsoft.com/msixsdk/home
+License: MIT License
+LicenseUrl: https://www.microsoft.com/msixsdk/license
+Copyright: Copyright Microsoft Corporation
+CopyrightUrl: https://www.microsoft.com/msixsdk/copyright
+ShortDescription: This is MSIX SDK
+Description: The MSIX SDK project is an effort to enable developers
+Moniker: msixsdk
+Tags:
+ - "appxsdk"
+ - "msixsdk"
+ReleaseNotes: Default release notes
+ReleaseNotesUrl: https://DefaultReleaseNotes.net
+PurchaseUrl: https://DefaultPurchaseUrl.com
+InstallationNotes: Default installation notes
+Documentations:
+ - DocumentLabel: Default document label
+ DocumentUrl: https://DefaultDocumentUrl.com
+Icons:
+ - IconUrl: https://testIcon
+ IconFileType: ico
+ IconResolution: custom
+ IconTheme: default
+ IconSha256: 69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8123
+Agreements:
+ - AgreementLabel: DefaultLabel
+ Agreement: DefaultText
+ AgreementUrl: https://DefaultAgreementUrl.net
+InstallerLocale: en-US
+Platform:
+ - Windows.Desktop
+ - Windows.Universal
+MinimumOSVersion: 10.0.0.0
+InstallerType: zip
+Scope: machine
+InstallModes:
+ - interactive
+ - silent
+ - silentWithProgress
+InstallerSwitches:
+ Custom: /custom
+ SilentWithProgress: /silentwithprogress
+ Silent: /silence
+ Interactive: /interactive
+ Log: /log=
+ InstallLocation: /dir=
+ Upgrade: /upgrade
+InstallerSuccessCodes:
+ - 1
+ - 0x80070005
+UpgradeBehavior: uninstallPrevious
+Commands:
+ - makemsix
+ - makeappx
+Protocols:
+ - protocol1
+ - protocol2
+FileExtensions:
+ - appx
+ - msix
+ - appxbundle
+ - msixbundle
+Dependencies:
+ WindowsFeatures:
+ - IIS
+ WindowsLibraries:
+ - VC Runtime
+ PackageDependencies:
+ - PackageIdentifier: Microsoft.MsixSdkDep
+ MinimumVersion: 1.0.0
+ ExternalDependencies:
+ - Outside dependencies
+Capabilities:
+ - internetClient
+RestrictedCapabilities:
+ - runFullTrust
+PackageFamilyName: Microsoft.DesktopAppInstaller_8wekyb3d8bbwe
+ProductCode: "{Foo}"
+ReleaseDate: 2021-01-01
+InstallerAbortsTerminal: true
+InstallLocationRequired: true
+RequireExplicitUpgrade: true
+DisplayInstallWarnings: true
+ElevationRequirement: elevatesSelf
+UnsupportedOSArchitectures:
+ - arm
+AppsAndFeaturesEntries:
+ - DisplayName: DisplayName
+ DisplayVersion: DisplayVersion
+ Publisher: Publisher
+ ProductCode: ProductCode
+ UpgradeCode: UpgradeCode
+ InstallerType: exe
+Markets:
+ AllowedMarkets:
+ - US
+ExpectedReturnCodes:
+ - InstallerReturnCode: 2
+ ReturnResponse: contactSupport
+ - InstallerReturnCode: 3
+ ReturnResponse: custom
+ ReturnResponseUrl: https://defaultReturnResponseUrl.com
+UnsupportedArguments:
+ - log
+NestedInstallerType: msi
+NestedInstallerFiles:
+ - RelativeFilePath: RelativeFilePath
+ PortableCommandAlias: PortableCommandAlias
+InstallationMetadata:
+ DefaultInstallLocation: "%ProgramFiles%\\TestApp"
+ Files:
+ - RelativeFilePath: "main.exe"
+ FileSha256: 69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8C82
+ FileType: launch
+ InvocationParameter: "/arg"
+ DisplayName: "DisplayName"
+DownloadCommandProhibited: true
+Localization:
+- Agreements:
+ - Agreement: Text
+ AgreementLabel: Label
+ AgreementUrl: https://AgreementUrl.net
+ Author: Microsoft UK
+ Copyright: Copyright Microsoft Corporation UK
+ CopyrightUrl: https://www.microsoft.com/msixsdk/copyright/UK
+ Description: The MSIX SDK project is an effort to enable developers UK
+ License: MIT License UK
+ LicenseUrl: https://www.microsoft.com/msixsdk/license/UK
+ PackageLocale: en-GB
+ PackageName: MSIX SDK UK
+ PackageUrl: https://www.microsoft.com/msixsdk/home/UK
+ PrivacyUrl: https://www.microsoft.com/privacy/UK
+ Publisher: Microsoft UK
+ PublisherSupportUrl: https://www.microsoft.com/support/UK
+ PublisherUrl: https://www.microsoft.com/UK
+ ReleaseNotes: Release notes
+ ReleaseNotesUrl: https://ReleaseNotes.net
+ ShortDescription: This is MSIX SDK UK
+ Tags:
+ - appxsdkUK
+ - msixsdkUK
+Installers:
+ - Architecture: x86
+ InstallerLocale: en-GB
+ Platform:
+ - Windows.Desktop
+ MinimumOSVersion: 10.0.1.0
+ InstallerType: msix
+ InstallerUrl: https://www.microsoft.com/msixsdk/msixsdkx86.msix
+ InstallerSha256: 69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8C82
+ SignatureSha256: 69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8C82
+ Scope: user
+ InstallModes:
+ - interactive
+ InstallerSwitches:
+ Custom: /c
+ SilentWithProgress: /sp
+ Silent: /s
+ Interactive: /i
+ Log: /l=
+ InstallLocation: /d=
+ Upgrade: /u
+ UpgradeBehavior: install
+ Commands:
+ - makemsixPreview
+ - makeappxPreview
+ Protocols:
+ - protocol1preview
+ - protocol2preview
+ FileExtensions:
+ - appxbundle
+ - msixbundle
+ - appx
+ - msix
+ Dependencies:
+ WindowsFeatures:
+ - PreviewIIS
+ WindowsLibraries:
+ - Preview VC Runtime
+ PackageDependencies:
+ - PackageIdentifier: Microsoft.MsixSdkDepPreview
+ MinimumVersion: 1.0.0
+ ExternalDependencies:
+ - Preview Outside dependencies
+ PackageFamilyName: Microsoft.DesktopAppInstallerPreview_8wekyb3d8bbwe
+ Capabilities:
+ - internetClientPreview
+ RestrictedCapabilities:
+ - runFullTrustPreview
+ ReleaseDate: 2021-02-02
+ InstallerAbortsTerminal: false
+ InstallLocationRequired: false
+ RequireExplicitUpgrade: false
+ DisplayInstallWarnings: false
+ ElevationRequirement: elevationRequired
+ UnsupportedArguments:
+ - location
+ UnsupportedOSArchitectures:
+ - arm64
+ Markets:
+ ExcludedMarkets:
+ - "US"
+ ExpectedReturnCodes:
+ - InstallerReturnCode: 2
+ ReturnResponse: contactSupport
+ DownloadCommandProhibited: false
+ - Architecture: x64
+ InstallerSha256: 69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8C82
+ InstallerUrl: https://www.microsoft.com/msixsdk/msixsdkx64.exe
+ InstallerType: exe
+ ProductCode: '{Bar}'
+ ManifestType: singleton
+ManifestVersion: 1.6.0
\ No newline at end of file
diff --git a/src/WinGetUtilInterop.UnitTests/WinGetUtilInterop.UnitTests.csproj b/src/WinGetUtilInterop.UnitTests/WinGetUtilInterop.UnitTests.csproj
index 553cbbc531..bd43371368 100644
--- a/src/WinGetUtilInterop.UnitTests/WinGetUtilInterop.UnitTests.csproj
+++ b/src/WinGetUtilInterop.UnitTests/WinGetUtilInterop.UnitTests.csproj
@@ -63,6 +63,9 @@
Always
+
+ Always
+
PreserveNewest
diff --git a/src/WinGetUtilInterop/Manifest/V1/Manifest.cs b/src/WinGetUtilInterop/Manifest/V1/Manifest.cs
index dd7e7066a7..66966a6724 100644
--- a/src/WinGetUtilInterop/Manifest/V1/Manifest.cs
+++ b/src/WinGetUtilInterop/Manifest/V1/Manifest.cs
@@ -137,12 +137,32 @@ public class Manifest
/// Gets or sets the release notes in default locale.
///
public string ReleaseNotes { get; set; }
+
+ ///
+ /// Gets or sets the manifest documentation.
+ ///
+ public ManifestDocumentation Documentation { get; set; }
+
+ ///
+ /// Gets or sets the manifest icon information.
+ ///
+ public ManifestIcon Icon { get; set; }
///
/// Gets or sets the release notes url in default locale.
///
public string ReleaseNotesUrl { get; set; }
+ ///
+ /// Gets or sets the purchase url of the package.
+ ///
+ public string PurchaseUrl { get; set; }
+
+ ///
+ /// Gets or sets the installation notes.
+ ///
+ public string InstallationNotes { get; set; }
+
// Installer fields
///
@@ -317,6 +337,11 @@ public class Manifest
///
public List Localization { get; set; }
+ ///
+ /// Gets or sets a value indicating whether the installer is prohibited from being downloaded for offline installation.
+ ///
+ public bool DownloadCommandProhibited { get; set; }
+
///
/// Deserialize a stream reader into a Manifest object.
///
diff --git a/src/WinGetUtilInterop/Manifest/V1/ManifestDocumentation.cs b/src/WinGetUtilInterop/Manifest/V1/ManifestDocumentation.cs
new file mode 100644
index 0000000000..ef0c2ccee4
--- /dev/null
+++ b/src/WinGetUtilInterop/Manifest/V1/ManifestDocumentation.cs
@@ -0,0 +1,26 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+// -----------------------------------------------------------------------
+
+namespace Microsoft.WinGetUtil.Models.V1
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Text;
+
+ public class ManifestDocumentation
+ {
+ ///
+ /// Gets or sets the document label.
+ ///
+ public string DocumentLabel { get; set; }
+
+ ///
+ /// Gets or sets the document url.
+ ///
+ public string DocumentUrl { get; set; }
+
+ }
+}
diff --git a/src/WinGetUtilInterop/Manifest/V1/ManifestIcon.cs b/src/WinGetUtilInterop/Manifest/V1/ManifestIcon.cs
new file mode 100644
index 0000000000..53eed758ff
--- /dev/null
+++ b/src/WinGetUtilInterop/Manifest/V1/ManifestIcon.cs
@@ -0,0 +1,40 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+// -----------------------------------------------------------------------
+
+namespace Microsoft.WinGetUtil.Models.V1
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Text;
+
+ public class ManifestIcon
+ {
+ ///
+ /// Gets or sets the icon url.
+ ///
+ public string IconUrl { get; set; }
+
+ ///
+ /// Gets or sets the icon file type.
+ ///
+ public string IconFileType { get; set; }
+
+ ///
+ /// Gets or sets the icon resolution.
+ ///
+ public string IconResolution { get; set; }
+
+ ///
+ /// Gets or sets the icon theme.
+ ///
+ public string IconTheme { get; set; }
+
+ ///
+ /// Gets or sets the icon sha256.
+ ///
+ public string IconSha56 { get; set; }
+ }
+}
diff --git a/src/WinGetUtilInterop/Manifest/V1/ManifestInstaller.cs b/src/WinGetUtilInterop/Manifest/V1/ManifestInstaller.cs
index d8ce4d1aa5..7c5536a9c5 100644
--- a/src/WinGetUtilInterop/Manifest/V1/ManifestInstaller.cs
+++ b/src/WinGetUtilInterop/Manifest/V1/ManifestInstaller.cs
@@ -199,6 +199,11 @@ public class ManifestInstaller
///
public bool DisplayInstallWarnings { get; set; }
+ ///
+ /// Gets or sets a value indicating whether the installer is prohibited from being downloaded for offline installation.
+ ///
+ public bool DownloadCommandProhibited { get; set; }
+
///
/// Returns a List of strings containing the URIs contained within this installer.
///
@@ -256,7 +261,12 @@ public bool Equals(ManifestInstaller other)
(this.InstallerLocale == other.InstallerLocale) &&
(this.Scope == other.Scope) &&
(this.InstallerType == other.InstallerType) &&
- (this.Switches == other.Switches);
+ (this.Switches == other.Switches) &&
+ (this.InstallationMetadata == other.InstallationMetadata) &&
+ (this.NestedInstallerType == other.NestedInstallerType) &&
+ (this.NestedInstallerFiles == other.NestedInstallerFiles) &&
+ (this.ExcludedMarkets == other.ExcludedMarkets) &&
+ (this.DisplayInstallWarnings == other.DisplayInstallWarnings);
}
///