diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/WixToolsetTest.Dependency/DependencyExtensionFixture.cs | 3 | ||||
| -rw-r--r-- | src/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.wxs | 23 | ||||
| -rw-r--r-- | src/test/WixToolsetTest.Dependency/TestData/UsingProvides/PackageComponents.wxs | 12 | ||||
| -rw-r--r-- | src/test/WixToolsetTest.Dependency/TestData/UsingProvides/example.txt | 1 | ||||
| -rw-r--r-- | src/test/WixToolsetTest.Dependency/WixToolsetTest.Dependency.csproj | 5 | ||||
| -rw-r--r-- | src/wixext/DependencyCommon.cs | 26 | ||||
| -rw-r--r-- | src/wixext/DependencyCompiler.cs | 542 | ||||
| -rw-r--r-- | src/wixext/DependencyErrors.cs | 37 | ||||
| -rw-r--r-- | src/wixext/DependencyExtensionData.cs | 11 | ||||
| -rw-r--r-- | src/wixext/DependencyExtensionFactory.cs | 1 | ||||
| -rw-r--r-- | src/wixext/DependencyTableDefinitions.cs | 57 | ||||
| -rw-r--r-- | src/wixext/DependencyWarnings.cs | 60 | ||||
| -rw-r--r-- | src/wixext/DependencyWindowsInstallerBackendBinderExtension.cs | 168 | ||||
| -rw-r--r-- | src/wixext/Symbols/DependencySymbolDefinitions.cs | 43 | ||||
| -rw-r--r-- | src/wixext/Symbols/WixDependencyRefSymbol.cs | 55 | ||||
| -rw-r--r-- | src/wixext/Symbols/WixDependencySymbol.cs | 71 |
16 files changed, 32 insertions, 1083 deletions
diff --git a/src/test/WixToolsetTest.Dependency/DependencyExtensionFixture.cs b/src/test/WixToolsetTest.Dependency/DependencyExtensionFixture.cs index 0f729534..968b8de6 100644 --- a/src/test/WixToolsetTest.Dependency/DependencyExtensionFixture.cs +++ b/src/test/WixToolsetTest.Dependency/DependencyExtensionFixture.cs | |||
| @@ -15,9 +15,10 @@ namespace WixToolsetTest.Dependency | |||
| 15 | var folder = TestData.Get(@"TestData\UsingProvides"); | 15 | var folder = TestData.Get(@"TestData\UsingProvides"); |
| 16 | var build = new Builder(folder, typeof(DependencyExtensionFactory), new[] { folder }); | 16 | var build = new Builder(folder, typeof(DependencyExtensionFactory), new[] { folder }); |
| 17 | 17 | ||
| 18 | var results = build.BuildAndQuery(Build, "WixDependencyProvider"); | 18 | var results = build.BuildAndQuery(Build, "CustomAction", "WixDependencyProvider"); |
| 19 | Assert.Equal(new[] | 19 | Assert.Equal(new[] |
| 20 | { | 20 | { |
| 21 | "CustomAction:Wix4DependencyCheck_X86\t1\tDependencyCA_X86\tWixDependencyCheck\t", | ||
| 21 | "WixDependencyProvider:dep74OfIcniaqxA7EprRGBw4Oyy3r8\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tUsingProvides\t\t\t", | 22 | "WixDependencyProvider:dep74OfIcniaqxA7EprRGBw4Oyy3r8\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tUsingProvides\t\t\t", |
| 22 | }, results); | 23 | }, results); |
| 23 | } | 24 | } |
diff --git a/src/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.wxs b/src/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.wxs index 44820bdd..b15ae8da 100644 --- a/src/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.wxs +++ b/src/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.wxs | |||
| @@ -1,21 +1,16 @@ | |||
| 1 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | 1 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" |
| 2 | xmlns:dep="http://wixtoolset.org/schemas/v4/wxs/dependency"> | ||
| 2 | <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200"> | 3 | <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200"> |
| 3 | |||
| 4 | |||
| 5 | <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" /> | 4 | <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" /> |
| 6 | |||
| 7 | 5 | ||
| 6 | <Directory Id="INSTALLFOLDER" Name="ProgramFilesFolder:\MsiPackage" /> | ||
| 7 | |||
| 8 | <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)"> | 8 | <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)"> |
| 9 | <ComponentGroupRef Id="ProductComponents" /> | 9 | <Component Directory="INSTALLFOLDER"> |
| 10 | <File Name="example.txt" Source="Package.wxs" /> | ||
| 11 | <Provides Key="UsingProvides" dep:Check="yes" /> | ||
| 12 | </Component> | ||
| 10 | </Feature> | 13 | </Feature> |
| 11 | |||
| 12 | </Package> | ||
| 13 | 14 | ||
| 14 | <Fragment> | 15 | </Package> |
| 15 | <Directory Id="TARGETDIR" Name="SourceDir"> | ||
| 16 | <Directory Id="ProgramFilesFolder"> | ||
| 17 | <Directory Id="INSTALLFOLDER" Name="MsiPackage" /> | ||
| 18 | </Directory> | ||
| 19 | </Directory> | ||
| 20 | </Fragment> | ||
| 21 | </Wix> | 16 | </Wix> |
diff --git a/src/test/WixToolsetTest.Dependency/TestData/UsingProvides/PackageComponents.wxs b/src/test/WixToolsetTest.Dependency/TestData/UsingProvides/PackageComponents.wxs deleted file mode 100644 index e241fb17..00000000 --- a/src/test/WixToolsetTest.Dependency/TestData/UsingProvides/PackageComponents.wxs +++ /dev/null | |||
| @@ -1,12 +0,0 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" | ||
| 3 | xmlns:dep="http://wixtoolset.org/schemas/v4/wxs/dependency"> | ||
| 4 | <Fragment> | ||
| 5 | <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> | ||
| 6 | <Component> | ||
| 7 | <File Source="example.txt" /> | ||
| 8 | <dep:Provides Key="UsingProvides" /> | ||
| 9 | </Component> | ||
| 10 | </ComponentGroup> | ||
| 11 | </Fragment> | ||
| 12 | </Wix> | ||
diff --git a/src/test/WixToolsetTest.Dependency/TestData/UsingProvides/example.txt b/src/test/WixToolsetTest.Dependency/TestData/UsingProvides/example.txt deleted file mode 100644 index 1b4ffe8a..00000000 --- a/src/test/WixToolsetTest.Dependency/TestData/UsingProvides/example.txt +++ /dev/null | |||
| @@ -1 +0,0 @@ | |||
| 1 | This is example.txt. \ No newline at end of file | ||
diff --git a/src/test/WixToolsetTest.Dependency/WixToolsetTest.Dependency.csproj b/src/test/WixToolsetTest.Dependency/WixToolsetTest.Dependency.csproj index 7bedc47d..2d3e40c3 100644 --- a/src/test/WixToolsetTest.Dependency/WixToolsetTest.Dependency.csproj +++ b/src/test/WixToolsetTest.Dependency/WixToolsetTest.Dependency.csproj | |||
| @@ -12,10 +12,7 @@ | |||
| 12 | </PropertyGroup> | 12 | </PropertyGroup> |
| 13 | 13 | ||
| 14 | <ItemGroup> | 14 | <ItemGroup> |
| 15 | <Content Include="TestData\UsingProvides\example.txt" CopyToOutputDirectory="PreserveNewest" /> | 15 | <Content Include="TestData\**" CopyToOutputDirectory="PreserveNewest" /> |
| 16 | <Content Include="TestData\UsingProvides\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" /> | ||
| 17 | <Content Include="TestData\UsingProvides\Package.wxs" CopyToOutputDirectory="PreserveNewest" /> | ||
| 18 | <Content Include="TestData\UsingProvides\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" /> | ||
| 19 | </ItemGroup> | 16 | </ItemGroup> |
| 20 | 17 | ||
| 21 | <ItemGroup> | 18 | <ItemGroup> |
diff --git a/src/wixext/DependencyCommon.cs b/src/wixext/DependencyCommon.cs deleted file mode 100644 index cb36be36..00000000 --- a/src/wixext/DependencyCommon.cs +++ /dev/null | |||
| @@ -1,26 +0,0 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Dependency | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | using WixToolset; | ||
| 7 | |||
| 8 | internal static class DependencyCommon | ||
| 9 | { | ||
| 10 | // Bundle attributes are in the upper 32-bits. | ||
| 11 | internal const int ProvidesAttributesBundle = 0x10000; | ||
| 12 | |||
| 13 | // Same values as for the Upgrade table in Windows Installer. | ||
| 14 | internal const int RequiresAttributesMinVersionInclusive = 256; | ||
| 15 | internal const int RequiresAttributesMaxVersionInclusive = 512; | ||
| 16 | |||
| 17 | // The root registry key for the dependency extension. We write to Software\Classes explicitly | ||
| 18 | // based on the current security context instead of HKCR. See | ||
| 19 | // http://msdn.microsoft.com/en-us/library/ms724475(VS.85).aspx for more information. | ||
| 20 | internal static readonly string RegistryRoot = @"Software\Classes\Installer\Dependencies\"; | ||
| 21 | internal static readonly string RegistryDependents = "Dependents"; | ||
| 22 | |||
| 23 | // The following characters cannot be used in a provider key. | ||
| 24 | internal static readonly char[] InvalidCharacters = new char[] { ' ', '\"', ';', '\\' }; | ||
| 25 | } | ||
| 26 | } | ||
diff --git a/src/wixext/DependencyCompiler.cs b/src/wixext/DependencyCompiler.cs index 18bb89df..0405c324 100644 --- a/src/wixext/DependencyCompiler.cs +++ b/src/wixext/DependencyCompiler.cs | |||
| @@ -2,13 +2,9 @@ | |||
| 2 | 2 | ||
| 3 | namespace WixToolset.Dependency | 3 | namespace WixToolset.Dependency |
| 4 | { | 4 | { |
| 5 | using System; | ||
| 6 | using System.Collections.Generic; | 5 | using System.Collections.Generic; |
| 7 | using System.Text; | ||
| 8 | using System.Xml.Linq; | 6 | using System.Xml.Linq; |
| 9 | using WixToolset.Data; | 7 | using WixToolset.Data; |
| 10 | using WixToolset.Data.Symbols; | ||
| 11 | using WixToolset.Dependency.Symbols; | ||
| 12 | using WixToolset.Extensibility; | 8 | using WixToolset.Extensibility; |
| 13 | using WixToolset.Extensibility.Data; | 9 | using WixToolset.Extensibility.Data; |
| 14 | 10 | ||
| @@ -17,18 +13,6 @@ namespace WixToolset.Dependency | |||
| 17 | /// </summary> | 13 | /// </summary> |
| 18 | public sealed class DependencyCompiler : BaseCompilerExtension | 14 | public sealed class DependencyCompiler : BaseCompilerExtension |
| 19 | { | 15 | { |
| 20 | /// <summary> | ||
| 21 | /// Package type when parsing the Provides element. | ||
| 22 | /// </summary> | ||
| 23 | private enum PackageType | ||
| 24 | { | ||
| 25 | None, | ||
| 26 | ExePackage, | ||
| 27 | MsiPackage, | ||
| 28 | MspPackage, | ||
| 29 | MsuPackage | ||
| 30 | } | ||
| 31 | |||
| 32 | public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/dependency"; | 16 | public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/dependency"; |
| 33 | 17 | ||
| 34 | /// <summary> | 18 | /// <summary> |
| @@ -40,534 +24,38 @@ namespace WixToolset.Dependency | |||
| 40 | public override void ParseAttribute(Intermediate intermediate, IntermediateSection section, XElement parentElement, XAttribute attribute, IDictionary<string, string> context) | 24 | public override void ParseAttribute(Intermediate intermediate, IntermediateSection section, XElement parentElement, XAttribute attribute, IDictionary<string, string> context) |
| 41 | { | 25 | { |
| 42 | var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(parentElement); | 26 | var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(parentElement); |
| 43 | switch (parentElement.Name.LocalName) | 27 | var addCheck = YesNoType.NotSet; |
| 44 | { | 28 | var addRequire = YesNoType.NotSet; |
| 45 | case "Bundle": | ||
| 46 | switch (attribute.Name.LocalName) | ||
| 47 | { | ||
| 48 | case "ProviderKey": | ||
| 49 | this.ParseProviderKeyAttribute(section, sourceLineNumbers, parentElement, attribute); | ||
| 50 | break; | ||
| 51 | default: | ||
| 52 | this.ParseHelper.UnexpectedAttribute(parentElement, attribute); | ||
| 53 | break; | ||
| 54 | } | ||
| 55 | break; | ||
| 56 | default: | ||
| 57 | this.ParseHelper.UnexpectedAttribute(parentElement, attribute); | ||
| 58 | break; | ||
| 59 | } | ||
| 60 | } | ||
| 61 | |||
| 62 | /// <summary> | ||
| 63 | /// Processes an element for the Compiler. | ||
| 64 | /// </summary> | ||
| 65 | /// <param name="sourceLineNumbers">Source line number for the parent element.</param> | ||
| 66 | /// <param name="parentElement">Parent element of element to process.</param> | ||
| 67 | /// <param name="element">Element to process.</param> | ||
| 68 | /// <param name="contextValues">Extra information about the context in which this element is being parsed.</param> | ||
| 69 | public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context) | ||
| 70 | { | ||
| 71 | var packageType = PackageType.None; | ||
| 72 | 29 | ||
| 73 | switch (parentElement.Name.LocalName) | 30 | switch (parentElement.Name.LocalName) |
| 74 | { | 31 | { |
| 75 | case "Bundle": | 32 | case "Provides": |
| 76 | case "Fragment": | 33 | if (attribute.Name.LocalName == "Check" && parentElement.Parent.Name.LocalName == "Component") |
| 77 | case "Module": | ||
| 78 | case "Package": | ||
| 79 | switch (element.Name.LocalName) | ||
| 80 | { | 34 | { |
| 81 | case "Requires": | 35 | addCheck = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute); |
| 82 | this.ParseRequiresElement(intermediate, section, element, null, false); | ||
| 83 | break; | ||
| 84 | default: | ||
| 85 | this.ParseHelper.UnexpectedElement(parentElement, element); | ||
| 86 | break; | ||
| 87 | } | 36 | } |
| 88 | break; | 37 | break; |
| 89 | case "ExePackage": | 38 | case "Requires": |
| 90 | packageType = PackageType.ExePackage; | 39 | case "RequiresRef": |
| 91 | break; | 40 | if (attribute.Name.LocalName == "Enforce" && parentElement.Parent.Name.LocalName == "Component") |
| 92 | case "MsiPackage": | ||
| 93 | packageType = PackageType.MsiPackage; | ||
| 94 | break; | ||
| 95 | case "MspPackage": | ||
| 96 | packageType = PackageType.MspPackage; | ||
| 97 | break; | ||
| 98 | case "MsuPackage": | ||
| 99 | packageType = PackageType.MsuPackage; | ||
| 100 | break; | ||
| 101 | default: | ||
| 102 | this.ParseHelper.UnexpectedElement(parentElement, element); | ||
| 103 | break; | ||
| 104 | } | ||
| 105 | |||
| 106 | if (PackageType.None != packageType) | ||
| 107 | { | ||
| 108 | var packageId = context["PackageId"]; | ||
| 109 | |||
| 110 | switch (element.Name.LocalName) | ||
| 111 | { | ||
| 112 | case "Provides": | ||
| 113 | this.ParseProvidesElement(intermediate, section, element, packageType, packageId); | ||
| 114 | break; | ||
| 115 | default: | ||
| 116 | this.ParseHelper.UnexpectedElement(parentElement, element); | ||
| 117 | break; | ||
| 118 | } | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | /// <summary> | ||
| 123 | /// Processes a child element of a Component for the Compiler. | ||
| 124 | /// </summary> | ||
| 125 | /// <param name="parentElement">Parent element of element to process.</param> | ||
| 126 | /// <param name="element">Element to process.</param> | ||
| 127 | /// <param name="context">Extra information about the context in which this element is being parsed.</param> | ||
| 128 | /// <returns>The component key path type if set.</returns> | ||
| 129 | public override IComponentKeyPath ParsePossibleKeyPathElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context) | ||
| 130 | { | ||
| 131 | var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(parentElement); | ||
| 132 | IComponentKeyPath keyPath = null; | ||
| 133 | |||
| 134 | switch (parentElement.Name.LocalName) | ||
| 135 | { | ||
| 136 | case "Component": | ||
| 137 | var componentId = context["ComponentId"]; | ||
| 138 | |||
| 139 | // 64-bit components may cause issues downlevel. | ||
| 140 | Boolean.TryParse(context["Win64"], out var win64); | ||
| 141 | |||
| 142 | switch (element.Name.LocalName) | ||
| 143 | { | 41 | { |
| 144 | case "Provides": | 42 | addRequire = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute); |
| 145 | if (win64) | ||
| 146 | { | ||
| 147 | this.Messaging.Write(DependencyWarnings.Win64Component(sourceLineNumbers, componentId)); | ||
| 148 | } | ||
| 149 | |||
| 150 | keyPath = this.ParseProvidesElement(intermediate, section, element, PackageType.None, componentId); | ||
| 151 | break; | ||
| 152 | default: | ||
| 153 | this.ParseHelper.UnexpectedElement(parentElement, element); | ||
| 154 | break; | ||
| 155 | } | 43 | } |
| 156 | break; | 44 | break; |
| 157 | default: | ||
| 158 | this.ParseHelper.UnexpectedElement(parentElement, element); | ||
| 159 | break; | ||
| 160 | } | ||
| 161 | |||
| 162 | return keyPath; | ||
| 163 | } | ||
| 164 | |||
| 165 | /// <summary> | ||
| 166 | /// Processes the ProviderKey bundle attribute. | ||
| 167 | /// </summary> | ||
| 168 | /// <param name="sourceLineNumbers">Source line number for the parent element.</param> | ||
| 169 | /// <param name="parentElement">Parent element of attribute.</param> | ||
| 170 | /// <param name="attribute">The XML attribute for the ProviderKey attribute.</param> | ||
| 171 | private void ParseProviderKeyAttribute(IntermediateSection section, SourceLineNumber sourceLineNumbers, XElement parentElement, XAttribute attribute) | ||
| 172 | { | ||
| 173 | Identifier id = null; | ||
| 174 | string providerKey = null; | ||
| 175 | int illegalChar = -1; | ||
| 176 | |||
| 177 | switch (attribute.Name.LocalName) | ||
| 178 | { | ||
| 179 | case "ProviderKey": | ||
| 180 | providerKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute); | ||
| 181 | break; | ||
| 182 | default: | ||
| 183 | this.ParseHelper.UnexpectedAttribute(parentElement, attribute); | ||
| 184 | break; | ||
| 185 | } | ||
| 186 | |||
| 187 | // Make sure the key does not contain any illegal characters or values. | ||
| 188 | if (String.IsNullOrEmpty(providerKey)) | ||
| 189 | { | ||
| 190 | this.Messaging.Write(ErrorMessages.IllegalEmptyAttributeValue(sourceLineNumbers, parentElement.Name.LocalName, attribute.Name.LocalName)); | ||
| 191 | } | 45 | } |
| 192 | else if (0 <= (illegalChar = providerKey.IndexOfAny(DependencyCommon.InvalidCharacters))) | ||
| 193 | { | ||
| 194 | var sb = new StringBuilder(DependencyCommon.InvalidCharacters.Length * 2); | ||
| 195 | Array.ForEach<char>(DependencyCommon.InvalidCharacters, c => sb.Append(c).Append(" ")); | ||
| 196 | 46 | ||
| 197 | this.Messaging.Write(DependencyErrors.IllegalCharactersInProvider(sourceLineNumbers, "ProviderKey", providerKey[illegalChar], sb.ToString())); | 47 | if (addCheck == YesNoType.NotSet && addRequire == YesNoType.NotSet) |
| 198 | } | ||
| 199 | else if ("ALL" == providerKey) | ||
| 200 | { | 48 | { |
| 201 | this.Messaging.Write(DependencyErrors.ReservedValue(sourceLineNumbers, parentElement.Name.LocalName, "ProviderKey", providerKey)); | 49 | this.ParseHelper.UnexpectedAttribute(parentElement, attribute); |
| 202 | } | 50 | } |
| 203 | 51 | else if (addCheck == YesNoType.Yes) | |
| 204 | // Generate the primary key for the row. | ||
| 205 | id = this.ParseHelper.CreateIdentifier("dep", attribute.Name.LocalName, providerKey); | ||
| 206 | |||
| 207 | if (!this.Messaging.EncounteredError) | ||
| 208 | { | 52 | { |
| 209 | // Create the provider symbol for the bundle. The Component_ field is required | 53 | this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4DependencyCheck", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64); |
| 210 | // in the table definition but unused for bundles, so just set it to the valid ID. | ||
| 211 | section.AddSymbol(new WixDependencyProviderSymbol(sourceLineNumbers, id) | ||
| 212 | { | ||
| 213 | ComponentRef = id.Id, | ||
| 214 | ProviderKey = providerKey, | ||
| 215 | Attributes = WixDependencyProviderAttributes.ProvidesAttributesBundle, | ||
| 216 | }); | ||
| 217 | } | 54 | } |
| 218 | } | 55 | else if (addRequire == YesNoType.Yes) |
| 219 | |||
| 220 | /// <summary> | ||
| 221 | /// Processes the Provides element. | ||
| 222 | /// </summary> | ||
| 223 | /// <param name="node">The XML node for the Provides element.</param> | ||
| 224 | /// <param name="packageType">The type of the package being chained into a bundle, or "None" if building an MSI package.</param> | ||
| 225 | /// <param name="keyPath">Explicit key path.</param> | ||
| 226 | /// <param name="parentId">The identifier of the parent component or package.</param> | ||
| 227 | /// <returns>The type of key path if set.</returns> | ||
| 228 | private IComponentKeyPath ParseProvidesElement(Intermediate intermediate, IntermediateSection section, XElement node, PackageType packageType, string parentId) | ||
| 229 | { | ||
| 230 | var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); | ||
| 231 | IComponentKeyPath keyPath = null; | ||
| 232 | Identifier id = null; | ||
| 233 | string key = null; | ||
| 234 | string version = null; | ||
| 235 | string displayName = null; | ||
| 236 | int illegalChar = -1; | ||
| 237 | |||
| 238 | foreach (var attrib in node.Attributes()) | ||
| 239 | { | 56 | { |
| 240 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) | 57 | this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4DependencyRequire", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64); |
| 241 | { | ||
| 242 | switch (attrib.Name.LocalName) | ||
| 243 | { | ||
| 244 | case "Id": | ||
| 245 | id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); | ||
| 246 | break; | ||
| 247 | case "Key": | ||
| 248 | key = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
| 249 | break; | ||
| 250 | case "Version": | ||
| 251 | version = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib); | ||
| 252 | break; | ||
| 253 | case "DisplayName": | ||
| 254 | displayName = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
| 255 | break; | ||
| 256 | default: | ||
| 257 | this.ParseHelper.UnexpectedAttribute(node, attrib); | ||
| 258 | break; | ||
| 259 | } | ||
| 260 | } | ||
| 261 | else | ||
| 262 | { | ||
| 263 | this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); | ||
| 264 | } | ||
| 265 | } | 58 | } |
| 266 | |||
| 267 | // Make sure the key is valid. The key will default to the ProductCode for MSI packages | ||
| 268 | // and the package code for MSP packages in the binder if not specified. | ||
| 269 | if (!String.IsNullOrEmpty(key)) | ||
| 270 | { | ||
| 271 | // Make sure the key does not contain any illegal characters or values. | ||
| 272 | if (0 <= (illegalChar = key.IndexOfAny(DependencyCommon.InvalidCharacters))) | ||
| 273 | { | ||
| 274 | var sb = new StringBuilder(DependencyCommon.InvalidCharacters.Length * 2); | ||
| 275 | Array.ForEach<char>(DependencyCommon.InvalidCharacters, c => sb.Append(c).Append(" ")); | ||
| 276 | |||
| 277 | this.Messaging.Write(DependencyErrors.IllegalCharactersInProvider(sourceLineNumbers, "Key", key[illegalChar], sb.ToString())); | ||
| 278 | } | ||
| 279 | else if ("ALL" == key) | ||
| 280 | { | ||
| 281 | this.Messaging.Write(DependencyErrors.ReservedValue(sourceLineNumbers, node.Name.LocalName, "Key", key)); | ||
| 282 | } | ||
| 283 | } | ||
| 284 | else if (PackageType.ExePackage == packageType || PackageType.MsuPackage == packageType) | ||
| 285 | { | ||
| 286 | // Must specify the provider key when authored for a package. | ||
| 287 | this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Key")); | ||
| 288 | } | ||
| 289 | else if (PackageType.None == packageType) | ||
| 290 | { | ||
| 291 | // Make sure the ProductCode is authored and set the key. | ||
| 292 | this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.Property, "ProductCode"); | ||
| 293 | key = "!(bind.property.ProductCode)"; | ||
| 294 | } | ||
| 295 | |||
| 296 | // The Version attribute should not be authored in or for an MSI package. | ||
| 297 | if (!String.IsNullOrEmpty(version)) | ||
| 298 | { | ||
| 299 | switch (packageType) | ||
| 300 | { | ||
| 301 | case PackageType.None: | ||
| 302 | this.Messaging.Write(DependencyWarnings.DiscouragedVersionAttribute(sourceLineNumbers)); | ||
| 303 | break; | ||
| 304 | case PackageType.MsiPackage: | ||
| 305 | this.Messaging.Write(DependencyWarnings.DiscouragedVersionAttribute(sourceLineNumbers, parentId)); | ||
| 306 | break; | ||
| 307 | } | ||
| 308 | } | ||
| 309 | else if (PackageType.MspPackage == packageType || PackageType.MsuPackage == packageType) | ||
| 310 | { | ||
| 311 | // Must specify the Version when authored for packages that do not contain a version. | ||
| 312 | this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Version")); | ||
| 313 | } | ||
| 314 | |||
| 315 | // Need the element ID for child element processing, so generate now if not authored. | ||
| 316 | if (null == id) | ||
| 317 | { | ||
| 318 | id = this.ParseHelper.CreateIdentifier("dep", node.Name.LocalName, parentId, key); | ||
| 319 | } | ||
| 320 | |||
| 321 | foreach (var child in node.Elements()) | ||
| 322 | { | ||
| 323 | if (this.Namespace == child.Name.Namespace) | ||
| 324 | { | ||
| 325 | switch (child.Name.LocalName) | ||
| 326 | { | ||
| 327 | case "Requires": | ||
| 328 | this.ParseRequiresElement(intermediate, section, child, id.Id, PackageType.None == packageType); | ||
| 329 | break; | ||
| 330 | case "RequiresRef": | ||
| 331 | this.ParseRequiresRefElement(intermediate, section, child, id.Id, PackageType.None == packageType); | ||
| 332 | break; | ||
| 333 | default: | ||
| 334 | this.ParseHelper.UnexpectedElement(node, child); | ||
| 335 | break; | ||
| 336 | } | ||
| 337 | } | ||
| 338 | else | ||
| 339 | { | ||
| 340 | this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child); | ||
| 341 | } | ||
| 342 | } | ||
| 343 | |||
| 344 | if (!this.Messaging.EncounteredError) | ||
| 345 | { | ||
| 346 | var symbol = section.AddSymbol(new WixDependencyProviderSymbol(sourceLineNumbers, id) | ||
| 347 | { | ||
| 348 | ComponentRef = parentId, | ||
| 349 | ProviderKey = key, | ||
| 350 | }); | ||
| 351 | |||
| 352 | if (!String.IsNullOrEmpty(version)) | ||
| 353 | { | ||
| 354 | symbol.Version = version; | ||
| 355 | } | ||
| 356 | |||
| 357 | if (!String.IsNullOrEmpty(displayName)) | ||
| 358 | { | ||
| 359 | symbol.DisplayName = displayName; | ||
| 360 | } | ||
| 361 | |||
| 362 | if (PackageType.None == packageType) | ||
| 363 | { | ||
| 364 | this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "DependencyCheck", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64); | ||
| 365 | |||
| 366 | // Generate registry rows for the provider using binder properties. | ||
| 367 | var keyProvides = String.Concat(DependencyCommon.RegistryRoot, key); | ||
| 368 | var root = RegistryRootType.MachineUser; | ||
| 369 | |||
| 370 | var value = "[ProductCode]"; | ||
| 371 | this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, root, keyProvides, null, value, parentId, false); | ||
| 372 | |||
| 373 | value = !String.IsNullOrEmpty(version) ? version : "[ProductVersion]"; | ||
| 374 | var versionRegistrySymbol = | ||
| 375 | this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, root, keyProvides, "Version", value, parentId, false); | ||
| 376 | |||
| 377 | value = !String.IsNullOrEmpty(displayName) ? displayName : "[ProductName]"; | ||
| 378 | this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, root, keyProvides, "DisplayName", value, parentId, false); | ||
| 379 | |||
| 380 | // Use the Version registry value and use that as a potential key path. | ||
| 381 | keyPath = this.CreateComponentKeyPath(); | ||
| 382 | keyPath.Id = versionRegistrySymbol.Id; | ||
| 383 | keyPath.Explicit = false; | ||
| 384 | keyPath.Type = PossibleKeyPathType.Registry; | ||
| 385 | } | ||
| 386 | } | ||
| 387 | |||
| 388 | return keyPath; | ||
| 389 | } | ||
| 390 | |||
| 391 | /// <summary> | ||
| 392 | /// Processes the Requires element. | ||
| 393 | /// </summary> | ||
| 394 | /// <param name="node">The XML node for the Requires element.</param> | ||
| 395 | /// <param name="providerId">The parent provider identifier.</param> | ||
| 396 | /// <param name="requiresAction">Whether the Requires custom action should be referenced.</param> | ||
| 397 | private void ParseRequiresElement(Intermediate intermediate, IntermediateSection section, XElement node, string providerId, bool requiresAction) | ||
| 398 | { | ||
| 399 | var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); | ||
| 400 | Identifier id = null; | ||
| 401 | string providerKey = null; | ||
| 402 | string minVersion = null; | ||
| 403 | string maxVersion = null; | ||
| 404 | int attributes = 0; | ||
| 405 | int illegalChar = -1; | ||
| 406 | |||
| 407 | foreach (var attrib in node.Attributes()) | ||
| 408 | { | ||
| 409 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) | ||
| 410 | { | ||
| 411 | switch (attrib.Name.LocalName) | ||
| 412 | { | ||
| 413 | case "Id": | ||
| 414 | id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); | ||
| 415 | break; | ||
| 416 | case "ProviderKey": | ||
| 417 | providerKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
| 418 | break; | ||
| 419 | case "Minimum": | ||
| 420 | minVersion = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib); | ||
| 421 | break; | ||
| 422 | case "Maximum": | ||
| 423 | maxVersion = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib); | ||
| 424 | break; | ||
| 425 | case "IncludeMinimum": | ||
| 426 | if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib)) | ||
| 427 | { | ||
| 428 | attributes |= DependencyCommon.RequiresAttributesMinVersionInclusive; | ||
| 429 | } | ||
| 430 | break; | ||
| 431 | case "IncludeMaximum": | ||
| 432 | if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib)) | ||
| 433 | { | ||
| 434 | attributes |= DependencyCommon.RequiresAttributesMaxVersionInclusive; | ||
| 435 | } | ||
| 436 | break; | ||
| 437 | default: | ||
| 438 | this.ParseHelper.UnexpectedAttribute(node, attrib); | ||
| 439 | break; | ||
| 440 | } | ||
| 441 | } | ||
| 442 | else | ||
| 443 | { | ||
| 444 | this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); | ||
| 445 | } | ||
| 446 | } | ||
| 447 | |||
| 448 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node); | ||
| 449 | |||
| 450 | if (null == id) | ||
| 451 | { | ||
| 452 | // Generate an ID only if this element is authored under a Provides element; otherwise, a RequiresRef | ||
| 453 | // element will be necessary and the Id attribute will be required. | ||
| 454 | if (!String.IsNullOrEmpty(providerId)) | ||
| 455 | { | ||
| 456 | id = this.ParseHelper.CreateIdentifier("dep", node.Name.LocalName, providerKey); | ||
| 457 | } | ||
| 458 | else | ||
| 459 | { | ||
| 460 | this.Messaging.Write(ErrorMessages.ExpectedAttributeWhenElementNotUnderElement(sourceLineNumbers, node.Name.LocalName, "Id", "Provides")); | ||
| 461 | id = Identifier.Invalid; | ||
| 462 | } | ||
| 463 | } | ||
| 464 | |||
| 465 | if (String.IsNullOrEmpty(providerKey)) | ||
| 466 | { | ||
| 467 | this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "ProviderKey")); | ||
| 468 | } | ||
| 469 | // Make sure the key does not contain any illegal characters. | ||
| 470 | else if (0 <= (illegalChar = providerKey.IndexOfAny(DependencyCommon.InvalidCharacters))) | ||
| 471 | { | ||
| 472 | var sb = new StringBuilder(DependencyCommon.InvalidCharacters.Length * 2); | ||
| 473 | Array.ForEach<char>(DependencyCommon.InvalidCharacters, c => sb.Append(c).Append(" ")); | ||
| 474 | |||
| 475 | this.Messaging.Write(DependencyErrors.IllegalCharactersInProvider(sourceLineNumbers, "ProviderKey", providerKey[illegalChar], sb.ToString())); | ||
| 476 | } | ||
| 477 | |||
| 478 | if (!this.Messaging.EncounteredError) | ||
| 479 | { | ||
| 480 | // Reference the Require custom action if required. | ||
| 481 | if (requiresAction) | ||
| 482 | { | ||
| 483 | this.AddReferenceToWixDependencyRequire(section, sourceLineNumbers); | ||
| 484 | } | ||
| 485 | |||
| 486 | var symbol = section.AddSymbol(new WixDependencySymbol(sourceLineNumbers, id) | ||
| 487 | { | ||
| 488 | ProviderKey = providerKey, | ||
| 489 | MinVersion = minVersion, | ||
| 490 | MaxVersion = maxVersion, | ||
| 491 | }); | ||
| 492 | |||
| 493 | if (0 != attributes) | ||
| 494 | { | ||
| 495 | symbol.Attributes = attributes; | ||
| 496 | } | ||
| 497 | |||
| 498 | // Create the relationship between this WixDependency symbol and the WixDependencyProvider symbol. | ||
| 499 | if (!String.IsNullOrEmpty(providerId)) | ||
| 500 | { | ||
| 501 | section.AddSymbol(new WixDependencyRefSymbol(sourceLineNumbers) | ||
| 502 | { | ||
| 503 | WixDependencyProviderRef = providerId, | ||
| 504 | WixDependencyRef = id.Id, | ||
| 505 | }); | ||
| 506 | } | ||
| 507 | } | ||
| 508 | } | ||
| 509 | |||
| 510 | /// <summary> | ||
| 511 | /// Processes the RequiresRef element. | ||
| 512 | /// </summary> | ||
| 513 | /// <param name="node">The XML node for the RequiresRef element.</param> | ||
| 514 | /// <param name="providerId">The parent provider identifier.</param> | ||
| 515 | /// <param name="requiresAction">Whether the Requires custom action should be referenced.</param> | ||
| 516 | private void ParseRequiresRefElement(Intermediate intermediate, IntermediateSection section, XElement node, string providerId, bool requiresAction) | ||
| 517 | { | ||
| 518 | var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); | ||
| 519 | string id = null; | ||
| 520 | |||
| 521 | foreach (var attrib in node.Attributes()) | ||
| 522 | { | ||
| 523 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) | ||
| 524 | { | ||
| 525 | switch (attrib.Name.LocalName) | ||
| 526 | { | ||
| 527 | case "Id": | ||
| 528 | id = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); | ||
| 529 | break; | ||
| 530 | default: | ||
| 531 | this.ParseHelper.UnexpectedAttribute(node, attrib); | ||
| 532 | break; | ||
| 533 | } | ||
| 534 | } | ||
| 535 | else | ||
| 536 | { | ||
| 537 | this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); | ||
| 538 | } | ||
| 539 | } | ||
| 540 | |||
| 541 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node); | ||
| 542 | |||
| 543 | if (String.IsNullOrEmpty(id)) | ||
| 544 | { | ||
| 545 | this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id")); | ||
| 546 | } | ||
| 547 | |||
| 548 | if (!this.Messaging.EncounteredError) | ||
| 549 | { | ||
| 550 | // Reference the Require custom action if required. | ||
| 551 | if (requiresAction) | ||
| 552 | { | ||
| 553 | this.AddReferenceToWixDependencyRequire(section, sourceLineNumbers); | ||
| 554 | } | ||
| 555 | |||
| 556 | // Create a link dependency on the row that contains information we'll need during bind. | ||
| 557 | this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, DependencySymbolDefinitions.WixDependency, id); | ||
| 558 | |||
| 559 | // Create the relationship between the WixDependency row and the parent WixDependencyProvider row. | ||
| 560 | section.AddSymbol(new WixDependencyRefSymbol(sourceLineNumbers) | ||
| 561 | { | ||
| 562 | WixDependencyProviderRef = providerId, | ||
| 563 | WixDependencyRef = id, | ||
| 564 | }); | ||
| 565 | } | ||
| 566 | } | ||
| 567 | |||
| 568 | private void AddReferenceToWixDependencyRequire(IntermediateSection section, SourceLineNumber sourceLineNumbers) | ||
| 569 | { | ||
| 570 | this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "DependencyRequire", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64); | ||
| 571 | } | 59 | } |
| 572 | } | 60 | } |
| 573 | } | 61 | } |
diff --git a/src/wixext/DependencyErrors.cs b/src/wixext/DependencyErrors.cs deleted file mode 100644 index 83c0986a..00000000 --- a/src/wixext/DependencyErrors.cs +++ /dev/null | |||
| @@ -1,37 +0,0 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Dependency | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | using System.Resources; | ||
| 7 | using WixToolset.Data; | ||
| 8 | |||
| 9 | public static class DependencyErrors | ||
| 10 | { | ||
| 11 | public static Message IllegalCharactersInProvider(SourceLineNumber sourceLineNumbers, string attributeName, Char illegalChar, string illegalChars) | ||
| 12 | { | ||
| 13 | return Message(sourceLineNumbers, Ids.IllegalCharactersInProvider, "The provider key authored into the {0} attribute contains an illegal character, '{1}'. Please author the provider key without any of the following characters: {2}", attributeName, illegalChar, illegalChars); | ||
| 14 | } | ||
| 15 | |||
| 16 | public static Message ReservedValue(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string attributeValue) | ||
| 17 | { | ||
| 18 | return Message(sourceLineNumbers, Ids.ReservedValue, "The {0}/@{1} attribute value '{2}' is reserved and cannot be used here. Please choose a different value.", elementName, attributeName, attributeValue); | ||
| 19 | } | ||
| 20 | |||
| 21 | private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args) | ||
| 22 | { | ||
| 23 | return new Message(sourceLineNumber, MessageLevel.Error, (int)id, format, args); | ||
| 24 | } | ||
| 25 | |||
| 26 | private static Message Message(SourceLineNumber sourceLineNumber, Ids id, ResourceManager resourceManager, string resourceName, params object[] args) | ||
| 27 | { | ||
| 28 | return new Message(sourceLineNumber, MessageLevel.Error, (int)id, resourceManager, resourceName, args); | ||
| 29 | } | ||
| 30 | |||
| 31 | public enum Ids | ||
| 32 | { | ||
| 33 | IllegalCharactersInProvider = 5400, | ||
| 34 | ReservedValue = 5401, | ||
| 35 | } | ||
| 36 | } | ||
| 37 | } | ||
diff --git a/src/wixext/DependencyExtensionData.cs b/src/wixext/DependencyExtensionData.cs index e7d8746c..2f30c2bf 100644 --- a/src/wixext/DependencyExtensionData.cs +++ b/src/wixext/DependencyExtensionData.cs | |||
| @@ -16,12 +16,11 @@ namespace WixToolset.Dependency | |||
| 16 | /// <value>The default culture.</value> | 16 | /// <value>The default culture.</value> |
| 17 | public override string DefaultCulture => "en-US"; | 17 | public override string DefaultCulture => "en-US"; |
| 18 | 18 | ||
| 19 | public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition) | 19 | /// <summary> |
| 20 | { | 20 | /// Gets the contained .wixlib content. |
| 21 | symbolDefinition = DependencySymbolDefinitions.ByName(name); | 21 | /// </summary> |
| 22 | return symbolDefinition != null; | 22 | /// <param name="symbolDefinitions">Strong typed symbold definitions.</param> |
| 23 | } | 23 | /// <returns>The .wixlib.</returns> |
| 24 | |||
| 25 | public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions) | 24 | public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions) |
| 26 | { | 25 | { |
| 27 | return Intermediate.Load(typeof(DependencyExtensionData).Assembly, "WixToolset.Dependency.dependency.wixlib", symbolDefinitions); | 26 | return Intermediate.Load(typeof(DependencyExtensionData).Assembly, "WixToolset.Dependency.dependency.wixlib", symbolDefinitions); |
diff --git a/src/wixext/DependencyExtensionFactory.cs b/src/wixext/DependencyExtensionFactory.cs index c5b89658..354f9234 100644 --- a/src/wixext/DependencyExtensionFactory.cs +++ b/src/wixext/DependencyExtensionFactory.cs | |||
| @@ -12,7 +12,6 @@ namespace WixToolset.Dependency | |||
| 12 | { | 12 | { |
| 13 | typeof(DependencyCompiler), | 13 | typeof(DependencyCompiler), |
| 14 | typeof(DependencyExtensionData), | 14 | typeof(DependencyExtensionData), |
| 15 | typeof(DependencyWindowsInstallerBackendBinderExtension), | ||
| 16 | }; | 15 | }; |
| 17 | } | 16 | } |
| 18 | } | 17 | } |
diff --git a/src/wixext/DependencyTableDefinitions.cs b/src/wixext/DependencyTableDefinitions.cs deleted file mode 100644 index d3f643e4..00000000 --- a/src/wixext/DependencyTableDefinitions.cs +++ /dev/null | |||
| @@ -1,57 +0,0 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Dependency | ||
| 4 | { | ||
| 5 | using WixToolset.Data; | ||
| 6 | using WixToolset.Data.WindowsInstaller; | ||
| 7 | |||
| 8 | public static class DependencyTableDefinitions | ||
| 9 | { | ||
| 10 | public static readonly TableDefinition WixDependencyProvider = new TableDefinition( | ||
| 11 | "WixDependencyProvider", | ||
| 12 | SymbolDefinitions.WixDependencyProvider, | ||
| 13 | new[] | ||
| 14 | { | ||
| 15 | new ColumnDefinition("WixDependencyProvider", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "The non-localized primary key for the table.", modularizeType: ColumnModularizeType.Column), | ||
| 16 | new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "The foreign key into the Component table used to determine install state.", modularizeType: ColumnModularizeType.Column), | ||
| 17 | new ColumnDefinition("ProviderKey", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Text, description: "The name of the registry key that holds the provider identity."), | ||
| 18 | new ColumnDefinition("Version", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Version, description: "The version of the package."), | ||
| 19 | new ColumnDefinition("DisplayName", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Text, description: "The display name of the package."), | ||
| 20 | new ColumnDefinition("Attributes", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, minValue: 0, maxValue: 2147483647, description: "A 32-bit word that specifies the attribute flags to be applied."), | ||
| 21 | }, | ||
| 22 | symbolIdIsPrimaryKey: true | ||
| 23 | ); | ||
| 24 | |||
| 25 | public static readonly TableDefinition WixDependency = new TableDefinition( | ||
| 26 | "WixDependency", | ||
| 27 | DependencySymbolDefinitions.WixDependency, | ||
| 28 | new[] | ||
| 29 | { | ||
| 30 | new ColumnDefinition("WixDependency", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "The non-localized primary key for the table.", modularizeType: ColumnModularizeType.Column), | ||
| 31 | new ColumnDefinition("ProviderKey", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Text, description: "The name of the registry key that holds the provider identity."), | ||
| 32 | new ColumnDefinition("MinVersion", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Version, description: "The minimum version of the provider supported."), | ||
| 33 | new ColumnDefinition("MaxVersion", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Version, description: "The maximum version of the provider supported."), | ||
| 34 | new ColumnDefinition("Attributes", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, minValue: 0, maxValue: 2147483647, description: "A 32-bit word that specifies the attribute flags to be applied."), | ||
| 35 | }, | ||
| 36 | symbolIdIsPrimaryKey: true | ||
| 37 | ); | ||
| 38 | |||
| 39 | public static readonly TableDefinition WixDependencyRef = new TableDefinition( | ||
| 40 | "WixDependencyRef", | ||
| 41 | DependencySymbolDefinitions.WixDependencyRef, | ||
| 42 | new[] | ||
| 43 | { | ||
| 44 | new ColumnDefinition("WixDependencyProvider_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "WixDependencyProvider", keyColumn: 1, description: "Foreign key into the Component table.", modularizeType: ColumnModularizeType.Column), | ||
| 45 | new ColumnDefinition("WixDependency_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "WixDependency", keyColumn: 1, description: "Foreign key into the WixDependency table.", modularizeType: ColumnModularizeType.Column), | ||
| 46 | }, | ||
| 47 | symbolIdIsPrimaryKey: false | ||
| 48 | ); | ||
| 49 | |||
| 50 | public static readonly TableDefinition[] All = new[] | ||
| 51 | { | ||
| 52 | WixDependencyProvider, | ||
| 53 | WixDependency, | ||
| 54 | WixDependencyRef, | ||
| 55 | }; | ||
| 56 | } | ||
| 57 | } | ||
diff --git a/src/wixext/DependencyWarnings.cs b/src/wixext/DependencyWarnings.cs deleted file mode 100644 index 802edc22..00000000 --- a/src/wixext/DependencyWarnings.cs +++ /dev/null | |||
| @@ -1,60 +0,0 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Dependency | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | using System.Resources; | ||
| 7 | using WixToolset.Data; | ||
| 8 | |||
| 9 | public static class DependencyWarnings | ||
| 10 | { | ||
| 11 | public static Message DiscouragedVersionAttribute(SourceLineNumber sourceLineNumbers) | ||
| 12 | { | ||
| 13 | return Message(sourceLineNumbers, Ids.DiscouragedVersionAttribute, "The Provides/@Version attribute should not be specified in an MSI package. The ProductVersion will be used by default."); | ||
| 14 | } | ||
| 15 | |||
| 16 | public static Message DiscouragedVersionAttribute(SourceLineNumber sourceLineNumbers, string id) | ||
| 17 | { | ||
| 18 | return Message(sourceLineNumbers, Ids.DiscouragedVersionAttribute, "The Provides/@Version attribute should not be specified for MSI package {0}. The ProductVersion will be used by default.", id); | ||
| 19 | } | ||
| 20 | |||
| 21 | public static Message PropertyRemoved(string name) | ||
| 22 | { | ||
| 23 | return Message(null, Ids.PropertyRemoved, "The property {0} was authored in the package with a value and will be removed. The property should not be authored.", name); | ||
| 24 | } | ||
| 25 | |||
| 26 | public static Message ProvidesKeyNotFound(SourceLineNumber sourceLineNumbers, string id) | ||
| 27 | { | ||
| 28 | return Message(sourceLineNumbers, Ids.ProvidesKeyNotFound, "The provider key with identifier {0} was not found in the WixDependencyProvider table. Related registry rows will not be removed from authoring.", id); | ||
| 29 | } | ||
| 30 | |||
| 31 | public static Message RequiresKeyNotFound(SourceLineNumber sourceLineNumbers, string id) | ||
| 32 | { | ||
| 33 | return Message(sourceLineNumbers, Ids.RequiresKeyNotFound, "The dependency key with identifier {0} was not found in the WixDependency table. Related registry rows will not be removed from authoring.", id); | ||
| 34 | } | ||
| 35 | |||
| 36 | public static Message Win64Component(SourceLineNumber sourceLineNumbers, string componentId) | ||
| 37 | { | ||
| 38 | return Message(sourceLineNumbers, Ids.Win64Component, "The Provides element should not be authored in the 64-bit component with identifier {0}. The dependency feature may not work if installing this package on 64-bit Windows operating systems prior to Windows 7 and Windows Server 2008 R2. Set the Component/@Win64 attribute to \"no\" to make sure the dependency feature works correctly on all supported operating systems.", componentId); | ||
| 39 | } | ||
| 40 | |||
| 41 | private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args) | ||
| 42 | { | ||
| 43 | return new Message(sourceLineNumber, MessageLevel.Warning, (int)id, format, args); | ||
| 44 | } | ||
| 45 | |||
| 46 | private static Message Message(SourceLineNumber sourceLineNumber, Ids id, ResourceManager resourceManager, string resourceName, params object[] args) | ||
| 47 | { | ||
| 48 | return new Message(sourceLineNumber, MessageLevel.Warning, (int)id, resourceManager, resourceName, args); | ||
| 49 | } | ||
| 50 | |||
| 51 | public enum Ids | ||
| 52 | { | ||
| 53 | ProvidesKeyNotFound = 5431, | ||
| 54 | RequiresKeyNotFound = 5432, | ||
| 55 | PropertyRemoved = 5433, | ||
| 56 | DiscouragedVersionAttribute = 5434, | ||
| 57 | Win64Component = 5435, | ||
| 58 | } | ||
| 59 | } | ||
| 60 | } | ||
diff --git a/src/wixext/DependencyWindowsInstallerBackendBinderExtension.cs b/src/wixext/DependencyWindowsInstallerBackendBinderExtension.cs deleted file mode 100644 index f52f97f3..00000000 --- a/src/wixext/DependencyWindowsInstallerBackendBinderExtension.cs +++ /dev/null | |||
| @@ -1,168 +0,0 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Dependency | ||
| 4 | { | ||
| 5 | using System.Collections.Generic; | ||
| 6 | using WixToolset.Data.WindowsInstaller; | ||
| 7 | using WixToolset.Extensibility; | ||
| 8 | |||
| 9 | public class DependencyWindowsInstallerBackendBinderExtension : BaseWindowsInstallerBackendBinderExtension | ||
| 10 | { | ||
| 11 | public override IEnumerable<TableDefinition> TableDefinitions => DependencyTableDefinitions.All; | ||
| 12 | |||
| 13 | #if TODO_DEPENDENCY_BINDER_EXTENSION | ||
| 14 | private Output output; | ||
| 15 | |||
| 16 | /// <summary> | ||
| 17 | /// Called after all output changes occur and right before the output is bound into its final format. | ||
| 18 | /// </summary> | ||
| 19 | public void Finish(Output output) | ||
| 20 | { | ||
| 21 | // Only process MSI packages. | ||
| 22 | if (OutputType.Product != output.Type) | ||
| 23 | { | ||
| 24 | return; | ||
| 25 | } | ||
| 26 | |||
| 27 | this.output = output; | ||
| 28 | |||
| 29 | Table wixDependencyTable = output.Tables["WixDependency"]; | ||
| 30 | Table wixDependencyProviderTable = output.Tables["WixDependencyProvider"]; | ||
| 31 | Table wixDependencyRefTable = output.Tables["WixDependencyRef"]; | ||
| 32 | |||
| 33 | // Make sure there's something to do. | ||
| 34 | if (null != wixDependencyRefTable) | ||
| 35 | { | ||
| 36 | KeyedRowCollection wixDependencyRows = new KeyedRowCollection(wixDependencyTable); | ||
| 37 | KeyedRowCollection wixDependencyProviderRows = new KeyedRowCollection(wixDependencyProviderTable); | ||
| 38 | |||
| 39 | // For each relationship, get the provides and requires rows to generate registry values. | ||
| 40 | foreach (Row wixDependencyRefRow in wixDependencyRefTable.Rows) | ||
| 41 | { | ||
| 42 | string providesId = (string)wixDependencyRefRow[0]; | ||
| 43 | string requiresId = (string)wixDependencyRefRow[1]; | ||
| 44 | |||
| 45 | Row wixDependencyRow = null; | ||
| 46 | if (wixDependencyRows.Contains(requiresId)) | ||
| 47 | { | ||
| 48 | wixDependencyRow = wixDependencyRows[requiresId]; | ||
| 49 | } | ||
| 50 | |||
| 51 | Row wixDependencyProviderRow = null; | ||
| 52 | if (wixDependencyProviderRows.Contains(providesId)) | ||
| 53 | { | ||
| 54 | wixDependencyProviderRow = wixDependencyProviderRows[providesId]; | ||
| 55 | } | ||
| 56 | |||
| 57 | // If we found both rows, generate the registry values. | ||
| 58 | if (null != wixDependencyRow && null != wixDependencyProviderRow) | ||
| 59 | { | ||
| 60 | // Format the root registry key using the required provider key and the current provider key. | ||
| 61 | string requiresKey = (string)wixDependencyRow[1]; | ||
| 62 | string providesKey = (string)wixDependencyProviderRow[2]; | ||
| 63 | string keyRequires = String.Format(@"{0}{1}\{2}\{3}", DependencyCommon.RegistryRoot, requiresKey, DependencyCommon.RegistryDependents, providesKey); | ||
| 64 | |||
| 65 | // Get the component ID from the provider. | ||
| 66 | string componentId = (string)wixDependencyProviderRow[1]; | ||
| 67 | |||
| 68 | Row row = this.CreateRegistryRow(wixDependencyRow); | ||
| 69 | row[0] = this.Core.CreateIdentifier("reg", providesId, requiresId, "(Default)"); | ||
| 70 | row[1] = -1; | ||
| 71 | row[2] = keyRequires; | ||
| 72 | row[3] = "*"; | ||
| 73 | row[4] = null; | ||
| 74 | row[5] = componentId; | ||
| 75 | |||
| 76 | string minVersion = (string)wixDependencyRow[2]; | ||
| 77 | if (!String.IsNullOrEmpty(minVersion)) | ||
| 78 | { | ||
| 79 | row = this.CreateRegistryRow(wixDependencyRow); | ||
| 80 | row[0] = this.Core.CreateIdentifier("reg", providesId, requiresId, "MinVersion"); | ||
| 81 | row[1] = -1; | ||
| 82 | row[2] = keyRequires; | ||
| 83 | row[3] = "MinVersion"; | ||
| 84 | row[4] = minVersion; | ||
| 85 | row[5] = componentId; | ||
| 86 | } | ||
| 87 | |||
| 88 | string maxVersion = (string)wixDependencyRow[3]; | ||
| 89 | if (!String.IsNullOrEmpty(minVersion)) | ||
| 90 | { | ||
| 91 | row = this.CreateRegistryRow(wixDependencyRow); | ||
| 92 | row[0] = this.Core.CreateIdentifier("reg", providesId, requiresId, "MaxVersion"); | ||
| 93 | row[1] = -1; | ||
| 94 | row[2] = keyRequires; | ||
| 95 | row[3] = "MaxVersion"; | ||
| 96 | row[4] = maxVersion; | ||
| 97 | row[5] = componentId; | ||
| 98 | } | ||
| 99 | |||
| 100 | if (null != wixDependencyRow[4]) | ||
| 101 | { | ||
| 102 | int attributes = (int)wixDependencyRow[4]; | ||
| 103 | |||
| 104 | row = this.CreateRegistryRow(wixDependencyRow); | ||
| 105 | row[0] = this.Core.CreateIdentifier("reg", providesId, requiresId, "Attributes"); | ||
| 106 | row[1] = -1; | ||
| 107 | row[2] = keyRequires; | ||
| 108 | row[3] = "Attributes"; | ||
| 109 | row[4] = String.Concat("#", attributes.ToString(CultureInfo.InvariantCulture.NumberFormat)); | ||
| 110 | row[5] = componentId; | ||
| 111 | } | ||
| 112 | } | ||
| 113 | } | ||
| 114 | } | ||
| 115 | } | ||
| 116 | |||
| 117 | /// <summary> | ||
| 118 | /// Creates a registry row using source information from the given <see cref="Row"/>. | ||
| 119 | /// </summary> | ||
| 120 | /// <param name="referenceRow">The <see cref="Row"/> from which the section and source line information are retrieved.</param> | ||
| 121 | /// <returns>A new Registry row.</returns> | ||
| 122 | private Row CreateRegistryRow(Row referenceRow) | ||
| 123 | { | ||
| 124 | TableDefinition tableDefinition = this.Core.TableDefinitions["Registry"]; | ||
| 125 | |||
| 126 | // Create the row from the main tables, which were populated during link anyway. | ||
| 127 | // We still associate the table with the dependency row's section to maintain servicing. | ||
| 128 | Table table = this.output.EnsureTable(tableDefinition, referenceRow.Table.Section); | ||
| 129 | Row row = table.CreateRow(referenceRow.SourceLineNumbers); | ||
| 130 | |||
| 131 | // Set the section ID for patching and return the new row. | ||
| 132 | row.SectionId = referenceRow.SectionId; | ||
| 133 | return row; | ||
| 134 | } | ||
| 135 | |||
| 136 | /// <summary> | ||
| 137 | /// A keyed collection of <see cref="Row"/> instances for O(1) lookup. | ||
| 138 | /// </summary> | ||
| 139 | private sealed class KeyedRowCollection : KeyedCollection<string, Row> | ||
| 140 | { | ||
| 141 | /// <summary> | ||
| 142 | /// Initializes the <see cref="KeyedRowCollection"/> class with all rows from the specified <paramref name="table"/>. | ||
| 143 | /// </summary> | ||
| 144 | /// <param name="table">The <see cref="Table"/> containing rows to index.</param> | ||
| 145 | internal KeyedRowCollection(Table table) | ||
| 146 | { | ||
| 147 | if (null != table) | ||
| 148 | { | ||
| 149 | foreach (Row row in table.Rows) | ||
| 150 | { | ||
| 151 | this.Add(row); | ||
| 152 | } | ||
| 153 | } | ||
| 154 | } | ||
| 155 | |||
| 156 | /// <summary> | ||
| 157 | /// Gets the primary key for the <see cref="Row"/>. | ||
| 158 | /// </summary> | ||
| 159 | /// <param name="row">The <see cref="Row"/> to index.</param> | ||
| 160 | /// <returns>The primary key for the <see cref="Row"/>.</returns> | ||
| 161 | protected override string GetKeyForItem(Row row) | ||
| 162 | { | ||
| 163 | return row.GetPrimaryKey('/'); | ||
| 164 | } | ||
| 165 | } | ||
| 166 | #endif | ||
| 167 | } | ||
| 168 | } | ||
diff --git a/src/wixext/Symbols/DependencySymbolDefinitions.cs b/src/wixext/Symbols/DependencySymbolDefinitions.cs deleted file mode 100644 index 5a18ae4b..00000000 --- a/src/wixext/Symbols/DependencySymbolDefinitions.cs +++ /dev/null | |||
| @@ -1,43 +0,0 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Dependency | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | using WixToolset.Data; | ||
| 7 | |||
| 8 | public enum DependencySymbolDefinitionType | ||
| 9 | { | ||
| 10 | WixDependency, | ||
| 11 | WixDependencyRef, | ||
| 12 | } | ||
| 13 | |||
| 14 | public static partial class DependencySymbolDefinitions | ||
| 15 | { | ||
| 16 | public static readonly Version Version = new Version("4.0.0"); | ||
| 17 | |||
| 18 | public static IntermediateSymbolDefinition ByName(string name) | ||
| 19 | { | ||
| 20 | if (!Enum.TryParse(name, out DependencySymbolDefinitionType type)) | ||
| 21 | { | ||
| 22 | return null; | ||
| 23 | } | ||
| 24 | |||
| 25 | return ByType(type); | ||
| 26 | } | ||
| 27 | |||
| 28 | public static IntermediateSymbolDefinition ByType(DependencySymbolDefinitionType type) | ||
| 29 | { | ||
| 30 | switch (type) | ||
| 31 | { | ||
| 32 | case DependencySymbolDefinitionType.WixDependency: | ||
| 33 | return DependencySymbolDefinitions.WixDependency; | ||
| 34 | |||
| 35 | case DependencySymbolDefinitionType.WixDependencyRef: | ||
| 36 | return DependencySymbolDefinitions.WixDependencyRef; | ||
| 37 | |||
| 38 | default: | ||
| 39 | throw new ArgumentOutOfRangeException(nameof(type)); | ||
| 40 | } | ||
| 41 | } | ||
| 42 | } | ||
| 43 | } | ||
diff --git a/src/wixext/Symbols/WixDependencyRefSymbol.cs b/src/wixext/Symbols/WixDependencyRefSymbol.cs deleted file mode 100644 index 6f2aaadf..00000000 --- a/src/wixext/Symbols/WixDependencyRefSymbol.cs +++ /dev/null | |||
| @@ -1,55 +0,0 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Dependency | ||
| 4 | { | ||
| 5 | using WixToolset.Data; | ||
| 6 | using WixToolset.Dependency.Symbols; | ||
| 7 | |||
| 8 | public static partial class DependencySymbolDefinitions | ||
| 9 | { | ||
| 10 | public static readonly IntermediateSymbolDefinition WixDependencyRef = new IntermediateSymbolDefinition( | ||
| 11 | DependencySymbolDefinitionType.WixDependencyRef.ToString(), | ||
| 12 | new[] | ||
| 13 | { | ||
| 14 | new IntermediateFieldDefinition(nameof(WixDependencyRefSymbolFields.WixDependencyProviderRef), IntermediateFieldType.String), | ||
| 15 | new IntermediateFieldDefinition(nameof(WixDependencyRefSymbolFields.WixDependencyRef), IntermediateFieldType.String), | ||
| 16 | }, | ||
| 17 | typeof(WixDependencyRefSymbol)); | ||
| 18 | } | ||
| 19 | } | ||
| 20 | |||
| 21 | namespace WixToolset.Dependency.Symbols | ||
| 22 | { | ||
| 23 | using WixToolset.Data; | ||
| 24 | |||
| 25 | public enum WixDependencyRefSymbolFields | ||
| 26 | { | ||
| 27 | WixDependencyProviderRef, | ||
| 28 | WixDependencyRef, | ||
| 29 | } | ||
| 30 | |||
| 31 | public class WixDependencyRefSymbol : IntermediateSymbol | ||
| 32 | { | ||
| 33 | public WixDependencyRefSymbol() : base(DependencySymbolDefinitions.WixDependencyRef, null, null) | ||
| 34 | { | ||
| 35 | } | ||
| 36 | |||
| 37 | public WixDependencyRefSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(DependencySymbolDefinitions.WixDependencyRef, sourceLineNumber, id) | ||
| 38 | { | ||
| 39 | } | ||
| 40 | |||
| 41 | public IntermediateField this[WixDependencyRefSymbolFields index] => this.Fields[(int)index]; | ||
| 42 | |||
| 43 | public string WixDependencyProviderRef | ||
| 44 | { | ||
| 45 | get => this.Fields[(int)WixDependencyRefSymbolFields.WixDependencyProviderRef].AsString(); | ||
| 46 | set => this.Set((int)WixDependencyRefSymbolFields.WixDependencyProviderRef, value); | ||
| 47 | } | ||
| 48 | |||
| 49 | public string WixDependencyRef | ||
| 50 | { | ||
| 51 | get => this.Fields[(int)WixDependencyRefSymbolFields.WixDependencyRef].AsString(); | ||
| 52 | set => this.Set((int)WixDependencyRefSymbolFields.WixDependencyRef, value); | ||
| 53 | } | ||
| 54 | } | ||
| 55 | } \ No newline at end of file | ||
diff --git a/src/wixext/Symbols/WixDependencySymbol.cs b/src/wixext/Symbols/WixDependencySymbol.cs deleted file mode 100644 index 17c631c5..00000000 --- a/src/wixext/Symbols/WixDependencySymbol.cs +++ /dev/null | |||
| @@ -1,71 +0,0 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Dependency | ||
| 4 | { | ||
| 5 | using WixToolset.Data; | ||
| 6 | using WixToolset.Dependency.Symbols; | ||
| 7 | |||
| 8 | public static partial class DependencySymbolDefinitions | ||
| 9 | { | ||
| 10 | public static readonly IntermediateSymbolDefinition WixDependency = new IntermediateSymbolDefinition( | ||
| 11 | DependencySymbolDefinitionType.WixDependency.ToString(), | ||
| 12 | new[] | ||
| 13 | { | ||
| 14 | new IntermediateFieldDefinition(nameof(WixDependencySymbolFields.ProviderKey), IntermediateFieldType.String), | ||
| 15 | new IntermediateFieldDefinition(nameof(WixDependencySymbolFields.MinVersion), IntermediateFieldType.String), | ||
| 16 | new IntermediateFieldDefinition(nameof(WixDependencySymbolFields.MaxVersion), IntermediateFieldType.String), | ||
| 17 | new IntermediateFieldDefinition(nameof(WixDependencySymbolFields.Attributes), IntermediateFieldType.Number), | ||
| 18 | }, | ||
| 19 | typeof(WixDependencySymbol)); | ||
| 20 | } | ||
| 21 | } | ||
| 22 | |||
| 23 | namespace WixToolset.Dependency.Symbols | ||
| 24 | { | ||
| 25 | using WixToolset.Data; | ||
| 26 | |||
| 27 | public enum WixDependencySymbolFields | ||
| 28 | { | ||
| 29 | ProviderKey, | ||
| 30 | MinVersion, | ||
| 31 | MaxVersion, | ||
| 32 | Attributes, | ||
| 33 | } | ||
| 34 | |||
| 35 | public class WixDependencySymbol : IntermediateSymbol | ||
| 36 | { | ||
| 37 | public WixDependencySymbol() : base(DependencySymbolDefinitions.WixDependency, null, null) | ||
| 38 | { | ||
| 39 | } | ||
| 40 | |||
| 41 | public WixDependencySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(DependencySymbolDefinitions.WixDependency, sourceLineNumber, id) | ||
| 42 | { | ||
| 43 | } | ||
| 44 | |||
| 45 | public IntermediateField this[WixDependencySymbolFields index] => this.Fields[(int)index]; | ||
| 46 | |||
| 47 | public string ProviderKey | ||
| 48 | { | ||
| 49 | get => this.Fields[(int)WixDependencySymbolFields.ProviderKey].AsString(); | ||
| 50 | set => this.Set((int)WixDependencySymbolFields.ProviderKey, value); | ||
| 51 | } | ||
| 52 | |||
| 53 | public string MinVersion | ||
| 54 | { | ||
| 55 | get => this.Fields[(int)WixDependencySymbolFields.MinVersion].AsString(); | ||
| 56 | set => this.Set((int)WixDependencySymbolFields.MinVersion, value); | ||
| 57 | } | ||
| 58 | |||
| 59 | public string MaxVersion | ||
| 60 | { | ||
| 61 | get => this.Fields[(int)WixDependencySymbolFields.MaxVersion].AsString(); | ||
| 62 | set => this.Set((int)WixDependencySymbolFields.MaxVersion, value); | ||
| 63 | } | ||
| 64 | |||
| 65 | public int Attributes | ||
| 66 | { | ||
| 67 | get => this.Fields[(int)WixDependencySymbolFields.Attributes].AsNumber(); | ||
| 68 | set => this.Set((int)WixDependencySymbolFields.Attributes, value); | ||
| 69 | } | ||
| 70 | } | ||
| 71 | } \ No newline at end of file | ||
