diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2022-07-19 15:17:10 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2022-07-20 08:53:56 -0500 |
commit | 913b6238417dceeb8440315e4669990756d17655 (patch) | |
tree | a9e3552ea124d2025e30436afc8629f071c01ed4 /src/ext/Bal/wixext/BalCompiler.cs | |
parent | 93bb820eff547f8de304f05249f572da861256fb (diff) | |
download | wix-913b6238417dceeb8440315e4669990756d17655.tar.gz wix-913b6238417dceeb8440315e4669990756d17655.tar.bz2 wix-913b6238417dceeb8440315e4669990756d17655.zip |
Add WixInternalUIBootstrapperApplication as a new built-in BA.
Implements 6835
Diffstat (limited to 'src/ext/Bal/wixext/BalCompiler.cs')
-rw-r--r-- | src/ext/Bal/wixext/BalCompiler.cs | 269 |
1 files changed, 200 insertions, 69 deletions
diff --git a/src/ext/Bal/wixext/BalCompiler.cs b/src/ext/Bal/wixext/BalCompiler.cs index 1721f252..bc2ba861 100644 --- a/src/ext/Bal/wixext/BalCompiler.cs +++ b/src/ext/Bal/wixext/BalCompiler.cs | |||
@@ -16,7 +16,8 @@ namespace WixToolset.Bal | |||
16 | /// </summary> | 16 | /// </summary> |
17 | public sealed class BalCompiler : BaseCompilerExtension | 17 | public sealed class BalCompiler : BaseCompilerExtension |
18 | { | 18 | { |
19 | private readonly Dictionary<string, WixMbaPrereqInformationSymbol> prereqInfoSymbolsByPackageId; | 19 | private readonly Dictionary<string, WixBalPackageInfoSymbol> packageInfoSymbolsByPackageId = new Dictionary<string, WixBalPackageInfoSymbol>(); |
20 | private readonly Dictionary<string, WixMbaPrereqInformationSymbol> prereqInfoSymbolsByPackageId = new Dictionary<string, WixMbaPrereqInformationSymbol>(); | ||
20 | 21 | ||
21 | private enum WixDotNetCoreBootstrapperApplicationHostTheme | 22 | private enum WixDotNetCoreBootstrapperApplicationHostTheme |
22 | { | 23 | { |
@@ -32,6 +33,13 @@ namespace WixToolset.Bal | |||
32 | Standard, | 33 | Standard, |
33 | } | 34 | } |
34 | 35 | ||
36 | private enum WixInternalUIBootstrapperApplicationTheme | ||
37 | { | ||
38 | Unknown, | ||
39 | None, | ||
40 | Standard, | ||
41 | } | ||
42 | |||
35 | private enum WixStandardBootstrapperApplicationTheme | 43 | private enum WixStandardBootstrapperApplicationTheme |
36 | { | 44 | { |
37 | Unknown, | 45 | Unknown, |
@@ -43,14 +51,6 @@ namespace WixToolset.Bal | |||
43 | RtfLicense, | 51 | RtfLicense, |
44 | } | 52 | } |
45 | 53 | ||
46 | /// <summary> | ||
47 | /// Instantiate a new BalCompiler. | ||
48 | /// </summary> | ||
49 | public BalCompiler() | ||
50 | { | ||
51 | this.prereqInfoSymbolsByPackageId = new Dictionary<string, WixMbaPrereqInformationSymbol>(); | ||
52 | } | ||
53 | |||
54 | public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/bal"; | 54 | public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/bal"; |
55 | 55 | ||
56 | /// <summary> | 56 | /// <summary> |
@@ -83,6 +83,9 @@ namespace WixToolset.Bal | |||
83 | case "BootstrapperApplication": | 83 | case "BootstrapperApplication": |
84 | switch (element.Name.LocalName) | 84 | switch (element.Name.LocalName) |
85 | { | 85 | { |
86 | case "WixInternalUIBootstrapperApplication": | ||
87 | this.ParseWixInternalUIBootstrapperApplicationElement(intermediate, section, element); | ||
88 | break; | ||
86 | case "WixStandardBootstrapperApplication": | 89 | case "WixStandardBootstrapperApplication": |
87 | this.ParseWixStandardBootstrapperApplicationElement(intermediate, section, element); | 90 | this.ParseWixStandardBootstrapperApplicationElement(intermediate, section, element); |
88 | break; | 91 | break; |
@@ -113,7 +116,6 @@ namespace WixToolset.Bal | |||
113 | public override void ParseAttribute(Intermediate intermediate, IntermediateSection section, XElement parentElement, XAttribute attribute, IDictionary<string, string> context) | 116 | public override void ParseAttribute(Intermediate intermediate, IntermediateSection section, XElement parentElement, XAttribute attribute, IDictionary<string, string> context) |
114 | { | 117 | { |
115 | var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(parentElement); | 118 | var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(parentElement); |
116 | WixMbaPrereqInformationSymbol prereqInfo; | ||
117 | 119 | ||
118 | switch (parentElement.Name.LocalName) | 120 | switch (parentElement.Name.LocalName) |
119 | { | 121 | { |
@@ -137,42 +139,63 @@ namespace WixToolset.Bal | |||
137 | case "MsiPackage": | 139 | case "MsiPackage": |
138 | case "MspPackage": | 140 | case "MspPackage": |
139 | var displayInternalUICondition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute); | 141 | var displayInternalUICondition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute); |
140 | section.AddSymbol(new WixBalPackageInfoSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, packageId)) | 142 | var packageInfo = this.GetBalPackageInfoSymbol(section, sourceLineNumbers, packageId); |
141 | { | 143 | packageInfo.DisplayInternalUICondition = displayInternalUICondition; |
142 | PackageId = packageId, | ||
143 | DisplayInternalUICondition = displayInternalUICondition, | ||
144 | }); | ||
145 | break; | 144 | break; |
146 | default: | 145 | default: |
147 | this.ParseHelper.UnexpectedAttribute(parentElement, attribute); | 146 | this.ParseHelper.UnexpectedAttribute(parentElement, attribute); |
148 | break; | 147 | break; |
149 | } | 148 | } |
150 | break; | 149 | break; |
151 | case "PrereqLicenseFile": | 150 | case "PrimaryPackageType": |
152 | 151 | { | |
153 | if (!this.prereqInfoSymbolsByPackageId.TryGetValue(packageId, out prereqInfo)) | 152 | var primaryPackageType = BalPrimaryPackageType.None; |
153 | var primaryPackageTypeValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute); | ||
154 | switch (primaryPackageTypeValue) | ||
154 | { | 155 | { |
155 | // at the time the extension attribute is parsed, the compiler might not yet have | 156 | case "default": |
156 | // parsed the PrereqPackage attribute, so we need to get it directly from the parent element. | 157 | primaryPackageType = BalPrimaryPackageType.Default; |
157 | var prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage"); | 158 | break; |
158 | 159 | case "x86": | |
159 | if (null != prereqPackage && YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, prereqPackage)) | 160 | primaryPackageType = BalPrimaryPackageType.X86; |
160 | { | 161 | break; |
161 | prereqInfo = section.AddSymbol(new WixMbaPrereqInformationSymbol(sourceLineNumbers) | 162 | case "x64": |
162 | { | 163 | primaryPackageType = BalPrimaryPackageType.X64; |
163 | PackageId = packageId, | 164 | break; |
164 | }); | 165 | case "arm64": |
165 | 166 | primaryPackageType = BalPrimaryPackageType.ARM64; | |
166 | this.prereqInfoSymbolsByPackageId.Add(packageId, prereqInfo); | 167 | break; |
167 | } | 168 | default: |
168 | else | 169 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, parentElement.Name.LocalName, "PrimaryPackageType", primaryPackageTypeValue, "default", "x86", "x64", "arm64")); |
169 | { | ||
170 | this.Messaging.Write(BalErrors.AttributeRequiresPrereqPackage(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseFile")); | ||
171 | break; | 170 | break; |
172 | } | ||
173 | } | 171 | } |
174 | 172 | ||
175 | if (null != prereqInfo.LicenseUrl) | 173 | // at the time the extension attribute is parsed, the compiler might not yet have |
174 | // parsed the PrereqPackage attribute, so we need to get it directly from the parent element. | ||
175 | var prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage"); | ||
176 | var prereqInfo = this.GetMbaPrereqInformationSymbol(section, sourceLineNumbers, prereqPackage, packageId); | ||
177 | if (prereqInfo != null) | ||
178 | { | ||
179 | this.Messaging.Write(ErrorMessages.IllegalAttributeValueWithOtherAttribute(sourceLineNumbers, parentElement.Name.LocalName, "PrereqPackage", "yes", "PrimaryPackageType")); | ||
180 | } | ||
181 | else | ||
182 | { | ||
183 | var packageInfo = this.GetBalPackageInfoSymbol(section, sourceLineNumbers, packageId); | ||
184 | packageInfo.PrimaryPackageType = primaryPackageType; | ||
185 | } | ||
186 | break; | ||
187 | } | ||
188 | case "PrereqLicenseFile": | ||
189 | { | ||
190 | // at the time the extension attribute is parsed, the compiler might not yet have | ||
191 | // parsed the PrereqPackage attribute, so we need to get it directly from the parent element. | ||
192 | var prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage"); | ||
193 | var prereqInfo = this.GetMbaPrereqInformationSymbol(section, sourceLineNumbers, prereqPackage, packageId); | ||
194 | if (prereqInfo == null) | ||
195 | { | ||
196 | this.Messaging.Write(BalErrors.AttributeRequiresPrereqPackage(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseFile")); | ||
197 | } | ||
198 | else if (null != prereqInfo.LicenseUrl) | ||
176 | { | 199 | { |
177 | this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseFile", "PrereqLicenseUrl")); | 200 | this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseFile", "PrereqLicenseUrl")); |
178 | } | 201 | } |
@@ -181,31 +204,19 @@ namespace WixToolset.Bal | |||
181 | prereqInfo.LicenseFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute); | 204 | prereqInfo.LicenseFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute); |
182 | } | 205 | } |
183 | break; | 206 | break; |
207 | } | ||
184 | case "PrereqLicenseUrl": | 208 | case "PrereqLicenseUrl": |
209 | { | ||
210 | // at the time the extension attribute is parsed, the compiler might not yet have | ||
211 | // parsed the PrereqPackage attribute, so we need to get it directly from the parent element. | ||
212 | var prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage"); | ||
213 | var prereqInfo = this.GetMbaPrereqInformationSymbol(section, sourceLineNumbers, prereqPackage, packageId); | ||
185 | 214 | ||
186 | if (!this.prereqInfoSymbolsByPackageId.TryGetValue(packageId, out prereqInfo)) | 215 | if (prereqInfo == null) |
187 | { | 216 | { |
188 | // at the time the extension attribute is parsed, the compiler might not yet have | 217 | this.Messaging.Write(BalErrors.AttributeRequiresPrereqPackage(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseUrl")); |
189 | // parsed the PrereqPackage attribute, so we need to get it directly from the parent element. | ||
190 | var prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage"); | ||
191 | |||
192 | if (null != prereqPackage && YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, prereqPackage)) | ||
193 | { | ||
194 | prereqInfo = section.AddSymbol(new WixMbaPrereqInformationSymbol(sourceLineNumbers) | ||
195 | { | ||
196 | PackageId = packageId, | ||
197 | }); | ||
198 | |||
199 | this.prereqInfoSymbolsByPackageId.Add(packageId, prereqInfo); | ||
200 | } | ||
201 | else | ||
202 | { | ||
203 | this.Messaging.Write(BalErrors.AttributeRequiresPrereqPackage(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseUrl")); | ||
204 | break; | ||
205 | } | ||
206 | } | 218 | } |
207 | 219 | else if (null != prereqInfo.LicenseFile) | |
208 | if (null != prereqInfo.LicenseFile) | ||
209 | { | 220 | { |
210 | this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseUrl", "PrereqLicenseFile")); | 221 | this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseUrl", "PrereqLicenseFile")); |
211 | } | 222 | } |
@@ -214,19 +225,9 @@ namespace WixToolset.Bal | |||
214 | prereqInfo.LicenseUrl = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute); | 225 | prereqInfo.LicenseUrl = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute); |
215 | } | 226 | } |
216 | break; | 227 | break; |
228 | } | ||
217 | case "PrereqPackage": | 229 | case "PrereqPackage": |
218 | if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute)) | 230 | this.GetMbaPrereqInformationSymbol(section, sourceLineNumbers, attribute, packageId); |
219 | { | ||
220 | if (!this.prereqInfoSymbolsByPackageId.TryGetValue(packageId, out _)) | ||
221 | { | ||
222 | prereqInfo = section.AddSymbol(new WixMbaPrereqInformationSymbol(sourceLineNumbers) | ||
223 | { | ||
224 | PackageId = packageId, | ||
225 | }); | ||
226 | |||
227 | this.prereqInfoSymbolsByPackageId.Add(packageId, prereqInfo); | ||
228 | } | ||
229 | } | ||
230 | break; | 231 | break; |
231 | default: | 232 | default: |
232 | this.ParseHelper.UnexpectedAttribute(parentElement, attribute); | 233 | this.ParseHelper.UnexpectedAttribute(parentElement, attribute); |
@@ -300,6 +301,41 @@ namespace WixToolset.Bal | |||
300 | } | 301 | } |
301 | } | 302 | } |
302 | 303 | ||
304 | private WixBalPackageInfoSymbol GetBalPackageInfoSymbol(IntermediateSection section, SourceLineNumber sourceLineNumbers, string packageId) | ||
305 | { | ||
306 | if (!this.packageInfoSymbolsByPackageId.TryGetValue(packageId, out var packageInfo)) | ||
307 | { | ||
308 | packageInfo = section.AddSymbol(new WixBalPackageInfoSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, packageId)) | ||
309 | { | ||
310 | PackageId = packageId, | ||
311 | }); | ||
312 | |||
313 | this.packageInfoSymbolsByPackageId.Add(packageId, packageInfo); | ||
314 | } | ||
315 | |||
316 | return packageInfo; | ||
317 | } | ||
318 | |||
319 | private WixMbaPrereqInformationSymbol GetMbaPrereqInformationSymbol(IntermediateSection section, SourceLineNumber sourceLineNumbers, XAttribute prereqAttribute, string packageId) | ||
320 | { | ||
321 | WixMbaPrereqInformationSymbol prereqInfo = null; | ||
322 | |||
323 | if (prereqAttribute != null && YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, prereqAttribute)) | ||
324 | { | ||
325 | if (!this.prereqInfoSymbolsByPackageId.TryGetValue(packageId, out _)) | ||
326 | { | ||
327 | prereqInfo = section.AddSymbol(new WixMbaPrereqInformationSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, packageId)) | ||
328 | { | ||
329 | PackageId = packageId, | ||
330 | }); | ||
331 | |||
332 | this.prereqInfoSymbolsByPackageId.Add(packageId, prereqInfo); | ||
333 | } | ||
334 | } | ||
335 | |||
336 | return prereqInfo; | ||
337 | } | ||
338 | |||
303 | /// <summary> | 339 | /// <summary> |
304 | /// Parses a Condition element for Bundles. | 340 | /// Parses a Condition element for Bundles. |
305 | /// </summary> | 341 | /// </summary> |
@@ -418,6 +454,101 @@ namespace WixToolset.Bal | |||
418 | } | 454 | } |
419 | } | 455 | } |
420 | 456 | ||
457 | private void ParseWixInternalUIBootstrapperApplicationElement(Intermediate intermediate, IntermediateSection section, XElement node) | ||
458 | { | ||
459 | var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); | ||
460 | WixInternalUIBootstrapperApplicationTheme? theme = null; | ||
461 | string themeFile = null; | ||
462 | string logoFile = null; | ||
463 | string localizationFile = null; | ||
464 | |||
465 | foreach (var attrib in node.Attributes()) | ||
466 | { | ||
467 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) | ||
468 | { | ||
469 | switch (attrib.Name.LocalName) | ||
470 | { | ||
471 | case "LogoFile": | ||
472 | logoFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
473 | break; | ||
474 | case "ThemeFile": | ||
475 | themeFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
476 | break; | ||
477 | case "LocalizationFile": | ||
478 | localizationFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
479 | break; | ||
480 | case "Theme": | ||
481 | var themeValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
482 | switch (themeValue) | ||
483 | { | ||
484 | case "none": | ||
485 | theme = WixInternalUIBootstrapperApplicationTheme.None; | ||
486 | break; | ||
487 | case "standard": | ||
488 | theme = WixInternalUIBootstrapperApplicationTheme.Standard; | ||
489 | break; | ||
490 | default: | ||
491 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Theme", themeValue, "none", "standard")); | ||
492 | theme = WixInternalUIBootstrapperApplicationTheme.Unknown; | ||
493 | break; | ||
494 | } | ||
495 | break; | ||
496 | default: | ||
497 | this.ParseHelper.UnexpectedAttribute(node, attrib); | ||
498 | break; | ||
499 | } | ||
500 | } | ||
501 | else | ||
502 | { | ||
503 | this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); | ||
504 | } | ||
505 | } | ||
506 | |||
507 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node); | ||
508 | |||
509 | if (!theme.HasValue) | ||
510 | { | ||
511 | theme = WixInternalUIBootstrapperApplicationTheme.Standard; | ||
512 | } | ||
513 | |||
514 | if (!this.Messaging.EncounteredError) | ||
515 | { | ||
516 | if (!String.IsNullOrEmpty(logoFile)) | ||
517 | { | ||
518 | section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "WixIuibaLogo")) | ||
519 | { | ||
520 | Value = logoFile, | ||
521 | }); | ||
522 | } | ||
523 | |||
524 | if (!String.IsNullOrEmpty(themeFile)) | ||
525 | { | ||
526 | section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "WixIuibaThemeXml")) | ||
527 | { | ||
528 | Value = themeFile, | ||
529 | }); | ||
530 | } | ||
531 | |||
532 | if (!String.IsNullOrEmpty(localizationFile)) | ||
533 | { | ||
534 | section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "WixIuibaThemeWxl")) | ||
535 | { | ||
536 | Value = localizationFile, | ||
537 | }); | ||
538 | } | ||
539 | |||
540 | var baId = "WixInternalUIBootstrapperApplication"; | ||
541 | switch (theme) | ||
542 | { | ||
543 | case WixInternalUIBootstrapperApplicationTheme.Standard: | ||
544 | baId = "WixInternalUIBootstrapperApplication.Standard"; | ||
545 | break; | ||
546 | } | ||
547 | |||
548 | this.CreateBARef(section, sourceLineNumbers, node, baId); | ||
549 | } | ||
550 | } | ||
551 | |||
421 | /// <summary> | 552 | /// <summary> |
422 | /// Parses a WixStandardBootstrapperApplication element for Bundles. | 553 | /// Parses a WixStandardBootstrapperApplication element for Bundles. |
423 | /// </summary> | 554 | /// </summary> |