aboutsummaryrefslogtreecommitdiff
path: root/src/ext/Bal/wixext/BalCompiler.cs
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-07-19 15:17:10 -0500
committerSean Hall <r.sean.hall@gmail.com>2022-07-20 08:53:56 -0500
commit913b6238417dceeb8440315e4669990756d17655 (patch)
treea9e3552ea124d2025e30436afc8629f071c01ed4 /src/ext/Bal/wixext/BalCompiler.cs
parent93bb820eff547f8de304f05249f572da861256fb (diff)
downloadwix-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.cs269
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>