aboutsummaryrefslogtreecommitdiff
path: root/src/wixext
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2018-12-31 23:52:58 -0600
committerSean Hall <r.sean.hall@gmail.com>2018-12-31 23:52:58 -0600
commit2c568de11510b453f499827919964badef22304e (patch)
treedd342fa59ad9b986e375c4128726b505ae95ad67 /src/wixext
parentcd23c2cba4239f32abf9743ecec9fef58136e0e8 (diff)
downloadwix-2c568de11510b453f499827919964badef22304e.tar.gz
wix-2c568de11510b453f499827919964badef22304e.tar.bz2
wix-2c568de11510b453f499827919964badef22304e.zip
Import code from old v4 repo
Diffstat (limited to 'src/wixext')
-rw-r--r--src/wixext/BalBinder.cs125
-rw-r--r--src/wixext/BalCompiler.cs562
-rw-r--r--src/wixext/BalExtensionData.cs55
-rw-r--r--src/wixext/WixBalExtension.csproj47
-rw-r--r--src/wixext/bal.xsd266
-rw-r--r--src/wixext/messages.xml43
-rw-r--r--src/wixext/tables.xml41
7 files changed, 1139 insertions, 0 deletions
diff --git a/src/wixext/BalBinder.cs b/src/wixext/BalBinder.cs
new file mode 100644
index 00000000..30f7ab44
--- /dev/null
+++ b/src/wixext/BalBinder.cs
@@ -0,0 +1,125 @@
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
3namespace WixToolset.Extensions
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Linq;
8 using System.Text;
9 using WixToolset;
10 using WixToolset.Data;
11 using WixToolset.Data.Rows;
12 using WixToolset.Extensibility;
13
14 public class BalBinder : BinderExtension
15 {
16 public override void Finish(Output output)
17 {
18 // Only process Bundles.
19 if (OutputType.Bundle != output.Type)
20 {
21 return;
22 }
23
24 Table baTable = output.Tables["WixBootstrapperApplication"];
25 Row baRow = baTable.Rows[0];
26 string baId = (string)baRow[0];
27 if (null == baId)
28 {
29 return;
30 }
31
32 bool isStdBA = baId.StartsWith("WixStandardBootstrapperApplication");
33 bool isMBA = baId.StartsWith("ManagedBootstrapperApplicationHost");
34
35 if (isStdBA || isMBA)
36 {
37 VerifyBAFunctions(output);
38 }
39
40 if (isMBA)
41 {
42 VerifyPrereqPackages(output);
43 }
44 }
45
46 private void VerifyBAFunctions(Output output)
47 {
48 Row baFunctionsRow = null;
49 Table baFunctionsTable = output.Tables["WixBalBAFunctions"];
50 foreach (Row row in baFunctionsTable.RowsAs<Row>())
51 {
52 if (null == baFunctionsRow)
53 {
54 baFunctionsRow = row;
55 }
56 else
57 {
58 this.Core.OnMessage(BalErrors.MultipleBAFunctions(row.SourceLineNumbers));
59 }
60 }
61
62 Table payloadPropertiesTable = output.Tables["WixPayloadProperties"];
63 IEnumerable<WixPayloadPropertiesRow> payloadPropertiesRows = payloadPropertiesTable.RowsAs<WixPayloadPropertiesRow>();
64 if (null == baFunctionsRow)
65 {
66 foreach (WixPayloadPropertiesRow payloadPropertiesRow in payloadPropertiesRows)
67 {
68 // TODO: Make core WiX canonicalize Name (this won't catch '.\bafunctions.dll').
69 if (String.Equals(payloadPropertiesRow.Name, "bafunctions.dll", StringComparison.OrdinalIgnoreCase))
70 {
71 this.Core.OnMessage(BalWarnings.UnmarkedBAFunctionsDLL(payloadPropertiesRow.SourceLineNumbers));
72 }
73 }
74 }
75 else
76 {
77 // TODO: May need to revisit this depending on the outcome of #5273.
78 string payloadId = (string)baFunctionsRow[0];
79 WixPayloadPropertiesRow bundlePayloadRow = payloadPropertiesRows.Single(x => payloadId == x.Id);
80 if (Compiler.BurnUXContainerId != bundlePayloadRow.Container)
81 {
82 this.Core.OnMessage(BalErrors.BAFunctionsPayloadRequiredInUXContainer(baFunctionsRow.SourceLineNumbers));
83 }
84 }
85 }
86
87 private void VerifyPrereqPackages(Output output)
88 {
89 Table prereqInfoTable = output.Tables["WixMbaPrereqInformation"];
90 if (null == prereqInfoTable || prereqInfoTable.Rows.Count == 0)
91 {
92 this.Core.OnMessage(BalErrors.MissingPrereq());
93 return;
94 }
95
96 bool foundLicenseFile = false;
97 bool foundLicenseUrl = false;
98
99 foreach (Row prereqInfoRow in prereqInfoTable.Rows)
100 {
101 if (null != prereqInfoRow[1])
102 {
103 if (foundLicenseFile || foundLicenseUrl)
104 {
105 this.Core.OnMessage(BalErrors.MultiplePrereqLicenses(prereqInfoRow.SourceLineNumbers));
106 return;
107 }
108
109 foundLicenseFile = true;
110 }
111
112 if (null != prereqInfoRow[2])
113 {
114 if (foundLicenseFile || foundLicenseUrl)
115 {
116 this.Core.OnMessage(BalErrors.MultiplePrereqLicenses(prereqInfoRow.SourceLineNumbers));
117 return;
118 }
119
120 foundLicenseUrl = true;
121 }
122 }
123 }
124 }
125}
diff --git a/src/wixext/BalCompiler.cs b/src/wixext/BalCompiler.cs
new file mode 100644
index 00000000..38ca9e3c
--- /dev/null
+++ b/src/wixext/BalCompiler.cs
@@ -0,0 +1,562 @@
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
3namespace WixToolset.Extensions
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Xml.Linq;
8 using WixToolset.Data;
9 using WixToolset.Data.Rows;
10 using WixToolset.Extensibility;
11
12 /// <summary>
13 /// The compiler for the WiX Toolset Bal Extension.
14 /// </summary>
15 public sealed class BalCompiler : CompilerExtension
16 {
17 private SourceLineNumber addedConditionLineNumber;
18 private Dictionary<string, Row> prereqInfoRows;
19
20 /// <summary>
21 /// Instantiate a new BalCompiler.
22 /// </summary>
23 public BalCompiler()
24 {
25 this.addedConditionLineNumber = null;
26 prereqInfoRows = new Dictionary<string, Row>();
27 this.Namespace = "http://wixtoolset.org/schemas/v4/wxs/bal";
28 }
29
30 /// <summary>
31 /// Processes an element for the Compiler.
32 /// </summary>
33 /// <param name="parentElement">Parent element of element to process.</param>
34 /// <param name="element">Element to process.</param>
35 /// <param name="contextValues">Extra information about the context in which this element is being parsed.</param>
36 public override void ParseElement(XElement parentElement, XElement element, IDictionary<string, string> context)
37 {
38 switch (parentElement.Name.LocalName)
39 {
40 case "Bundle":
41 case "Fragment":
42 switch (element.Name.LocalName)
43 {
44 case "Condition":
45 this.ParseConditionElement(element);
46 break;
47 default:
48 this.Core.UnexpectedElement(parentElement, element);
49 break;
50 }
51 break;
52 case "BootstrapperApplicationRef":
53 switch (element.Name.LocalName)
54 {
55 case "WixStandardBootstrapperApplication":
56 this.ParseWixStandardBootstrapperApplicationElement(element);
57 break;
58 case "WixManagedBootstrapperApplicationHost":
59 this.ParseWixManagedBootstrapperApplicationHostElement(element);
60 break;
61 default:
62 this.Core.UnexpectedElement(parentElement, element);
63 break;
64 }
65 break;
66 default:
67 this.Core.UnexpectedElement(parentElement, element);
68 break;
69 }
70 }
71
72 /// <summary>
73 /// Processes an attribute for the Compiler.
74 /// </summary>
75 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
76 /// <param name="parentElement">Parent element of element to process.</param>
77 /// <param name="attribute">Attribute to process.</param>
78 /// <param name="context">Extra information about the context in which this element is being parsed.</param>
79 public override void ParseAttribute(XElement parentElement, XAttribute attribute, IDictionary<string, string> context)
80 {
81 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(parentElement);
82 Row row;
83
84 switch (parentElement.Name.LocalName)
85 {
86 case "ExePackage":
87 case "MsiPackage":
88 case "MspPackage":
89 case "MsuPackage":
90 string packageId;
91 if (!context.TryGetValue("PackageId", out packageId) || String.IsNullOrEmpty(packageId))
92 {
93 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, parentElement.Name.LocalName, "Id", attribute.Name.LocalName));
94 }
95 else
96 {
97 switch (attribute.Name.LocalName)
98 {
99 case "PrereqLicenseFile":
100
101 if (!prereqInfoRows.TryGetValue(packageId, out row))
102 {
103 // at the time the extension attribute is parsed, the compiler might not yet have
104 // parsed the PrereqPackage attribute, so we need to get it directly from the parent element.
105 XAttribute prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage");
106
107 if (null != prereqPackage && YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, prereqPackage))
108 {
109 row = this.Core.CreateRow(sourceLineNumbers, "WixMbaPrereqInformation");
110 row[0] = packageId;
111
112 prereqInfoRows.Add(packageId, row);
113 }
114 else
115 {
116 this.Core.OnMessage(BalErrors.AttributeRequiresPrereqPackage(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseFile"));
117 break;
118 }
119 }
120
121 if (null != row[2])
122 {
123 this.Core.OnMessage(WixErrors.IllegalAttributeWithOtherAttribute(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseFile", "PrereqLicenseUrl"));
124 }
125 else
126 {
127 row[1] = this.Core.GetAttributeValue(sourceLineNumbers, attribute);
128 }
129 break;
130 case "PrereqLicenseUrl":
131
132 if (!prereqInfoRows.TryGetValue(packageId, out row))
133 {
134 // at the time the extension attribute is parsed, the compiler might not yet have
135 // parsed the PrereqPackage attribute, so we need to get it directly from the parent element.
136 XAttribute prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage");
137
138 if (null != prereqPackage && YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, prereqPackage))
139 {
140 row = this.Core.CreateRow(sourceLineNumbers, "WixMbaPrereqInformation");
141 row[0] = packageId;
142
143 prereqInfoRows.Add(packageId, row);
144 }
145 else
146 {
147 this.Core.OnMessage(BalErrors.AttributeRequiresPrereqPackage(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseUrl"));
148 break;
149 }
150 }
151
152 if (null != row[1])
153 {
154 this.Core.OnMessage(WixErrors.IllegalAttributeWithOtherAttribute(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseUrl", "PrereqLicenseFile"));
155 }
156 else
157 {
158 row[2] = this.Core.GetAttributeValue(sourceLineNumbers, attribute);
159 }
160 break;
161 case "PrereqPackage":
162 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attribute))
163 {
164 if (!prereqInfoRows.TryGetValue(packageId, out row))
165 {
166 row = this.Core.CreateRow(sourceLineNumbers, "WixMbaPrereqInformation");
167 row[0] = packageId;
168
169 prereqInfoRows.Add(packageId, row);
170 }
171 }
172 break;
173 default:
174 this.Core.UnexpectedAttribute(parentElement, attribute);
175 break;
176 }
177 }
178 break;
179 case "Payload":
180 string payloadId;
181 if (!context.TryGetValue("Id", out payloadId) || String.IsNullOrEmpty(payloadId))
182 {
183 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, parentElement.Name.LocalName, "Id", attribute.Name.LocalName));
184 }
185 else
186 {
187 switch (attribute.Name.LocalName)
188 {
189 case "BAFunctions":
190 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attribute))
191 {
192 row = this.Core.CreateRow(sourceLineNumbers, "WixBalBAFunctions");
193 row[0] = payloadId;
194 }
195 break;
196 default:
197 this.Core.UnexpectedAttribute(parentElement, attribute);
198 break;
199 }
200 }
201 break;
202 case "Variable":
203 // at the time the extension attribute is parsed, the compiler might not yet have
204 // parsed the Name attribute, so we need to get it directly from the parent element.
205 XAttribute variableName = parentElement.Attribute("Name");
206 if (null == variableName)
207 {
208 this.Core.OnMessage(WixErrors.ExpectedParentWithAttribute(sourceLineNumbers, "Variable", "Overridable", "Name"));
209 }
210 else
211 {
212 switch (attribute.Name.LocalName)
213 {
214 case "Overridable":
215 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attribute))
216 {
217 row = this.Core.CreateRow(sourceLineNumbers, "WixStdbaOverridableVariable");
218 row[0] = variableName;
219 }
220 break;
221 default:
222 this.Core.UnexpectedAttribute(parentElement, attribute);
223 break;
224 }
225 }
226 break;
227 }
228 }
229
230 /// <summary>
231 /// Parses a Condition element for Bundles.
232 /// </summary>
233 /// <param name="node">The element to parse.</param>
234 private void ParseConditionElement(XElement node)
235 {
236 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
237 string condition = this.Core.GetConditionInnerText(node); // condition is the inner text of the element.
238 string message = null;
239
240 foreach (XAttribute attrib in node.Attributes())
241 {
242 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
243 {
244 switch (attrib.Name.LocalName)
245 {
246 case "Message":
247 message = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
248 break;
249 default:
250 this.Core.UnexpectedAttribute(node, attrib);
251 break;
252 }
253 }
254 else
255 {
256 this.Core.ParseExtensionAttribute(node, attrib);
257 }
258 }
259
260 this.Core.ParseForExtensionElements(node);
261
262 // Error check the values.
263 if (String.IsNullOrEmpty(condition))
264 {
265 this.Core.OnMessage(WixErrors.ConditionExpected(sourceLineNumbers, node.Name.LocalName));
266 }
267
268 if (null == message)
269 {
270 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Message"));
271 }
272
273 if (!this.Core.EncounteredError)
274 {
275 Row row = this.Core.CreateRow(sourceLineNumbers, "WixBalCondition");
276 row[0] = condition;
277 row[1] = message;
278
279 if (null == this.addedConditionLineNumber)
280 {
281 this.addedConditionLineNumber = sourceLineNumbers;
282 }
283 }
284 }
285
286 /// <summary>
287 /// Parses a WixStandardBootstrapperApplication element for Bundles.
288 /// </summary>
289 /// <param name="node">The element to parse.</param>
290 private void ParseWixStandardBootstrapperApplicationElement(XElement node)
291 {
292 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
293 string launchTarget = null;
294 string launchTargetElevatedId = null;
295 string launchArguments = null;
296 YesNoType launchHidden = YesNoType.NotSet;
297 string launchWorkingDir = null;
298 string licenseFile = null;
299 string licenseUrl = null;
300 string logoFile = null;
301 string logoSideFile = null;
302 string themeFile = null;
303 string localizationFile = null;
304 YesNoType suppressOptionsUI = YesNoType.NotSet;
305 YesNoType suppressDowngradeFailure = YesNoType.NotSet;
306 YesNoType suppressRepair = YesNoType.NotSet;
307 YesNoType showVersion = YesNoType.NotSet;
308 YesNoType supportCacheOnly = YesNoType.NotSet;
309
310 foreach (XAttribute attrib in node.Attributes())
311 {
312 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
313 {
314 switch (attrib.Name.LocalName)
315 {
316 case "LaunchTarget":
317 launchTarget = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
318 break;
319 case "LaunchTargetElevatedId":
320 launchTargetElevatedId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
321 break;
322 case "LaunchArguments":
323 launchArguments = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
324 break;
325 case "LaunchHidden":
326 launchHidden = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
327 break;
328 case "LaunchWorkingFolder":
329 launchWorkingDir = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
330 break;
331 case "LicenseFile":
332 licenseFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
333 break;
334 case "LicenseUrl":
335 licenseUrl = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty);
336 break;
337 case "LogoFile":
338 logoFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
339 break;
340 case "LogoSideFile":
341 logoSideFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
342 break;
343 case "ThemeFile":
344 themeFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
345 break;
346 case "LocalizationFile":
347 localizationFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
348 break;
349 case "SuppressOptionsUI":
350 suppressOptionsUI = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
351 break;
352 case "SuppressDowngradeFailure":
353 suppressDowngradeFailure = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
354 break;
355 case "SuppressRepair":
356 suppressRepair = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
357 break;
358 case "ShowVersion":
359 showVersion = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
360 break;
361 case "SupportCacheOnly":
362 supportCacheOnly = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
363 break;
364 default:
365 this.Core.UnexpectedAttribute(node, attrib);
366 break;
367 }
368 }
369 else
370 {
371 this.Core.ParseExtensionAttribute(node, attrib);
372 }
373 }
374
375 this.Core.ParseForExtensionElements(node);
376
377 if (String.IsNullOrEmpty(licenseFile) && null == licenseUrl)
378 {
379 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "LicenseFile", "LicenseUrl", true));
380 }
381
382 if (!this.Core.EncounteredError)
383 {
384 if (!String.IsNullOrEmpty(launchTarget))
385 {
386 WixBundleVariableRow row = (WixBundleVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixBundleVariable");
387 row.Id = "LaunchTarget";
388 row.Value = launchTarget;
389 row.Type = "string";
390 }
391
392 if (!String.IsNullOrEmpty(launchTargetElevatedId))
393 {
394 WixBundleVariableRow row = (WixBundleVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixBundleVariable");
395 row.Id = "LaunchTargetElevatedId";
396 row.Value = launchTargetElevatedId;
397 row.Type = "string";
398 }
399
400 if (!String.IsNullOrEmpty(launchArguments))
401 {
402 WixBundleVariableRow row = (WixBundleVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixBundleVariable");
403 row.Id = "LaunchArguments";
404 row.Value = launchArguments;
405 row.Type = "string";
406 }
407
408 if (YesNoType.Yes == launchHidden)
409 {
410 WixBundleVariableRow row = (WixBundleVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixBundleVariable");
411 row.Id = "LaunchHidden";
412 row.Value = "yes";
413 row.Type = "string";
414 }
415
416
417 if (!String.IsNullOrEmpty(launchWorkingDir))
418 {
419 WixBundleVariableRow row = (WixBundleVariableRow)this.Core.CreateRow(sourceLineNumbers, "Variable");
420 row.Id = "LaunchWorkingFolder";
421 row.Value = launchWorkingDir;
422 row.Type = "string";
423 }
424
425 if (!String.IsNullOrEmpty(licenseFile))
426 {
427 WixVariableRow wixVariableRow = (WixVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixVariable");
428 wixVariableRow.Id = "WixStdbaLicenseRtf";
429 wixVariableRow.Value = licenseFile;
430 }
431
432 if (null != licenseUrl)
433 {
434 WixVariableRow wixVariableRow = (WixVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixVariable");
435 wixVariableRow.Id = "WixStdbaLicenseUrl";
436 wixVariableRow.Value = licenseUrl;
437 }
438
439 if (!String.IsNullOrEmpty(logoFile))
440 {
441 WixVariableRow wixVariableRow = (WixVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixVariable");
442 wixVariableRow.Id = "WixStdbaLogo";
443 wixVariableRow.Value = logoFile;
444 }
445
446 if (!String.IsNullOrEmpty(logoSideFile))
447 {
448 WixVariableRow wixVariableRow = (WixVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixVariable");
449 wixVariableRow.Id = "WixStdbaLogoSide";
450 wixVariableRow.Value = logoSideFile;
451 }
452
453 if (!String.IsNullOrEmpty(themeFile))
454 {
455 WixVariableRow wixVariableRow = (WixVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixVariable");
456 wixVariableRow.Id = "WixStdbaThemeXml";
457 wixVariableRow.Value = themeFile;
458 }
459
460 if (!String.IsNullOrEmpty(localizationFile))
461 {
462 WixVariableRow wixVariableRow = (WixVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixVariable");
463 wixVariableRow.Id = "WixStdbaThemeWxl";
464 wixVariableRow.Value = localizationFile;
465 }
466
467 if (YesNoType.Yes == suppressOptionsUI || YesNoType.Yes == suppressDowngradeFailure || YesNoType.Yes == suppressRepair || YesNoType.Yes == showVersion || YesNoType.Yes == supportCacheOnly)
468 {
469 Row row = this.Core.CreateRow(sourceLineNumbers, "WixStdbaOptions");
470 if (YesNoType.Yes == suppressOptionsUI)
471 {
472 row[0] = 1;
473 }
474
475 if (YesNoType.Yes == suppressDowngradeFailure)
476 {
477 row[1] = 1;
478 }
479
480 if (YesNoType.Yes == suppressRepair)
481 {
482 row[2] = 1;
483 }
484
485 if (YesNoType.Yes == showVersion)
486 {
487 row[3] = 1;
488 }
489
490 if (YesNoType.Yes == supportCacheOnly)
491 {
492 row[4] = 1;
493 }
494 }
495 }
496 }
497
498 /// <summary>
499 /// Parses a WixManagedBootstrapperApplicationHost element for Bundles.
500 /// </summary>
501 /// <param name="node">The element to parse.</param>
502 private void ParseWixManagedBootstrapperApplicationHostElement(XElement node)
503 {
504 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
505 string logoFile = null;
506 string themeFile = null;
507 string localizationFile = null;
508
509 foreach (XAttribute attrib in node.Attributes())
510 {
511 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
512 {
513 switch (attrib.Name.LocalName)
514 {
515 case "LogoFile":
516 logoFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
517 break;
518 case "ThemeFile":
519 themeFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
520 break;
521 case "LocalizationFile":
522 localizationFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
523 break;
524 default:
525 this.Core.UnexpectedAttribute(node, attrib);
526 break;
527 }
528 }
529 else
530 {
531 this.Core.ParseExtensionAttribute(node, attrib);
532 }
533 }
534
535 this.Core.ParseForExtensionElements(node);
536
537 if (!this.Core.EncounteredError)
538 {
539 if (!String.IsNullOrEmpty(logoFile))
540 {
541 WixVariableRow wixVariableRow = (WixVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixVariable");
542 wixVariableRow.Id = "PreqbaLogo";
543 wixVariableRow.Value = logoFile;
544 }
545
546 if (!String.IsNullOrEmpty(themeFile))
547 {
548 WixVariableRow wixVariableRow = (WixVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixVariable");
549 wixVariableRow.Id = "PreqbaThemeXml";
550 wixVariableRow.Value = themeFile;
551 }
552
553 if (!String.IsNullOrEmpty(localizationFile))
554 {
555 WixVariableRow wixVariableRow = (WixVariableRow)this.Core.CreateRow(sourceLineNumbers, "WixVariable");
556 wixVariableRow.Id = "PreqbaThemeWxl";
557 wixVariableRow.Value = localizationFile;
558 }
559 }
560 }
561 }
562}
diff --git a/src/wixext/BalExtensionData.cs b/src/wixext/BalExtensionData.cs
new file mode 100644
index 00000000..7e8dea5b
--- /dev/null
+++ b/src/wixext/BalExtensionData.cs
@@ -0,0 +1,55 @@
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
3namespace WixToolset.Extensions
4{
5 using System;
6 using System.Reflection;
7 using WixToolset.Data;
8 using WixToolset.Extensibility;
9
10 /// <summary>
11 /// The WiX Toolset Bal Extension.
12 /// </summary>
13 public sealed class BalExtensionData : ExtensionData
14 {
15 /// <summary>
16 /// Gets the optional table definitions for this extension.
17 /// </summary>
18 /// <value>The optional table definitions for this extension.</value>
19 public override TableDefinitionCollection TableDefinitions
20 {
21 get
22 {
23 return BalExtensionData.GetExtensionTableDefinitions();
24 }
25 }
26
27 /// <summary>
28 /// Gets the library associated with this extension.
29 /// </summary>
30 /// <param name="tableDefinitions">The table definitions to use while loading the library.</param>
31 /// <returns>The loaded library.</returns>
32 public override Library GetLibrary(TableDefinitionCollection tableDefinitions)
33 {
34 return BalExtensionData.GetExtensionLibrary(tableDefinitions);
35 }
36
37 /// <summary>
38 /// Internal mechanism to access the extension's table definitions.
39 /// </summary>
40 /// <returns>Extension's table definitions.</returns>
41 internal static TableDefinitionCollection GetExtensionTableDefinitions()
42 {
43 return ExtensionData.LoadTableDefinitionHelper(Assembly.GetExecutingAssembly(), "WixToolset.Extensions.Data.tables.xml");
44 }
45
46 /// <summary>
47 /// Internal mechanism to access the extension's library.
48 /// </summary>
49 /// <returns>Extension's library.</returns>
50 internal static Library GetExtensionLibrary(TableDefinitionCollection tableDefinitions)
51 {
52 return ExtensionData.LoadLibraryHelper(Assembly.GetExecutingAssembly(), "WixToolset.Extensions.Data.bal.wixlib", tableDefinitions);
53 }
54 }
55}
diff --git a/src/wixext/WixBalExtension.csproj b/src/wixext/WixBalExtension.csproj
new file mode 100644
index 00000000..3e9d382e
--- /dev/null
+++ b/src/wixext/WixBalExtension.csproj
@@ -0,0 +1,47 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- 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. -->
3
4
5<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
6 <PropertyGroup>
7 <ProjectGuid>{BF720A63-9D7B-456E-B60C-8122852D9FED}</ProjectGuid>
8 <AssemblyName>WixBalExtension</AssemblyName>
9 <OutputType>Library</OutputType>
10 <RootNamespace>WixToolset.Extensions</RootNamespace>
11 </PropertyGroup>
12 <ItemGroup>
13 <Compile Include="AssemblyInfo.cs" />
14 <Compile Include="BalBinder.cs" />
15 <Compile Include="BalCompiler.cs" />
16 <Compile Include="BalExtensionData.cs" />
17 <MsgGenSource Include="Data\messages.xml">
18 <ResourcesLogicalName>$(RootNamespace).Data.Messages.resources</ResourcesLogicalName>
19 </MsgGenSource>
20 <EmbeddedFlattenedResource Include="Data\tables.xml">
21 <LogicalName>$(RootNamespace).Data.tables.xml</LogicalName>
22 </EmbeddedFlattenedResource>
23 <EmbeddedFlattenedResource Include="Xsd\bal.xsd">
24 <LogicalName>$(RootNamespace).Xsd.bal.xsd</LogicalName>
25 <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
26 </EmbeddedFlattenedResource>
27 <XsdGenSource Include="Xsd\bal.xsd">
28 <CommonNamespace>WixToolset.Data.Serialize</CommonNamespace>
29 <Namespace>WixToolset.Extensions.Serialize.Bal</Namespace>
30 </XsdGenSource>
31 <EmbeddedResource Include="$(OutputPath)\bal.wixlib">
32 <Link>Data\bal.wixlib</Link>
33 </EmbeddedResource>
34 </ItemGroup>
35 <ItemGroup>
36 <Reference Include="System" />
37 <Reference Include="System.Xml" />
38 <Reference Include="System.Xml.Linq" />
39 <ProjectReference Include="..\..\..\libs\WixToolset.Data\WixToolset.Data.csproj" />
40 <ProjectReference Include="..\..\..\libs\WixToolset.Extensibility\WixToolset.Extensibility.csproj" />
41 <ProjectReference Include="..\..\..\tools\wix\Wix.csproj" />
42 <ProjectReference Include="..\wixlib\BalExtension.wixproj">
43 <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
44 </ProjectReference>
45 </ItemGroup>
46 <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), wix.proj))\tools\WixBuild.targets" />
47</Project>
diff --git a/src/wixext/bal.xsd b/src/wixext/bal.xsd
new file mode 100644
index 00000000..73f10540
--- /dev/null
+++ b/src/wixext/bal.xsd
@@ -0,0 +1,266 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- 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. -->
3
4
5<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
6 xmlns:xse=" http://wixtoolset.org/schemas/XmlSchemaExtension"
7 xmlns:html="http://www.w3.org/1999/xhtml"
8 targetNamespace="http://wixtoolset.org/schemas/v4/wxs/bal"
9 xmlns="http://wixtoolset.org/schemas/v4/wxs/bal">
10 <xs:annotation>
11 <xs:documentation>
12 The source code schema for the WiX Toolset Burn User Experience Extension.
13 </xs:documentation>
14 </xs:annotation>
15
16 <xs:import namespace="http://wixtoolset.org/schemas/v4/wxs" />
17
18 <xs:element name="Condition">
19 <xs:annotation>
20 <xs:documentation>
21 Conditions for a bundle. The condition is specified in the inner text of the element.
22 </xs:documentation>
23 <xs:appinfo>
24 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Bundle" />
25 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Fragment" />
26 </xs:appinfo>
27 </xs:annotation>
28 <xs:complexType>
29 <xs:simpleContent>
30 <xs:extension base="xs:string">
31 <xs:annotation>
32 <xs:documentation>
33 The condition that must evaluate to true for the installation to continue.
34 </xs:documentation>
35 </xs:annotation>
36 <xs:attribute name="Message" type="xs:string" use="required">
37 <xs:annotation>
38 <xs:documentation>
39 Set the value to the text to display when the condition fails and the installation must be terminated.
40 </xs:documentation>
41 </xs:annotation>
42 </xs:attribute>
43 </xs:extension>
44 </xs:simpleContent>
45 </xs:complexType>
46 </xs:element>
47
48 <xs:element name="WixStandardBootstrapperApplication">
49 <xs:annotation>
50 <xs:documentation>
51 Configures WixStandardBootstrapperApplication for a Bundle.
52 </xs:documentation>
53 <xs:appinfo>
54 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="BootstrapperApplicationRef" />
55 </xs:appinfo>
56 </xs:annotation>
57 <xs:complexType>
58 <xs:attribute name="LaunchTarget" type="xs:string">
59 <xs:annotation>
60 <xs:documentation>
61 If set, the success page will show a Launch button the user can use to launch the application being installed.
62 The string value can be formatted using Burn variables enclosed in brackets,
63 to refer to installation directories and so forth.
64 </xs:documentation>
65 </xs:annotation>
66 </xs:attribute>
67 <xs:attribute name="LaunchTargetElevatedId" type="xs:string">
68 <xs:annotation>
69 <xs:documentation>
70 Id of the target ApprovedExeForElevation element.
71 If set with LaunchTarget, WixStdBA will launch the application through the Engine's LaunchApprovedExe method instead of through ShellExecute.
72 </xs:documentation>
73 </xs:annotation>
74 </xs:attribute>
75 <xs:attribute name="LaunchArguments" type="xs:string">
76 <xs:annotation>
77 <xs:documentation>
78 If set, WixStdBA will supply these arguments when launching the application specified by the LaunchTarget attribute.
79 The string value can be formatted using Burn variables enclosed in brackets,
80 to refer to installation directories and so forth.
81 </xs:documentation>
82 </xs:annotation>
83 </xs:attribute>
84 <xs:attribute name="LaunchHidden" type="YesNoType">
85 <xs:annotation>
86 <xs:documentation>
87 If set to "yes", WixStdBA will launch the application specified by the LaunchTarget attribute with the SW_HIDE flag.
88 This attribute is ignored when the LaunchTargetElevatedId attribute is specified.
89 </xs:documentation>
90 </xs:annotation>
91 </xs:attribute>
92 <xs:attribute name="LaunchWorkingFolder" type="xs:string">
93 <xs:annotation>
94 <xs:documentation>
95 WixStdBA will use this working folder when launching the specified application.
96 The string value can be formatted using Burn variables enclosed in brackets,
97 to refer to installation directories and so forth.
98 This attribute is ignored when the LaunchTargetElevatedId attribute is specified.
99 </xs:documentation>
100 </xs:annotation>
101 </xs:attribute>
102 <xs:attribute name="LicenseFile" type="xs:string">
103 <xs:annotation>
104 <xs:documentation>Source file of the RTF license file. Cannot be used simultaneously with LicenseUrl.</xs:documentation>
105 </xs:annotation>
106 </xs:attribute>
107 <xs:attribute name="LicenseUrl" type="xs:string">
108 <xs:annotation>
109 <xs:documentation>URL target of the license link. Cannot be used simultaneously with LicenseFile. This attribute can be empty to hide the license link completely.</xs:documentation>
110 </xs:annotation>
111 </xs:attribute>
112 <xs:attribute name="LogoFile" type="xs:string">
113 <xs:annotation>
114 <xs:documentation>Source file of the logo graphic.</xs:documentation>
115 </xs:annotation>
116 </xs:attribute>
117 <xs:attribute name="LogoSideFile" type="xs:string">
118 <xs:annotation>
119 <xs:documentation>Source file of the side logo graphic.</xs:documentation>
120 </xs:annotation>
121 </xs:attribute>
122 <xs:attribute name="ThemeFile" type="xs:string">
123 <xs:annotation>
124 <xs:documentation>Source file of the theme XML.</xs:documentation>
125 </xs:annotation>
126 </xs:attribute>
127 <xs:attribute name="LocalizationFile" type="xs:string">
128 <xs:annotation>
129 <xs:documentation>Source file of the theme localization .wxl file.</xs:documentation>
130 </xs:annotation>
131 </xs:attribute>
132 <xs:attribute name="SuppressOptionsUI" type="YesNoType">
133 <xs:annotation>
134 <xs:documentation>If set to "yes", the Options button will not be shown and the user will not be able to choose an installation directory.</xs:documentation>
135 </xs:annotation>
136 </xs:attribute>
137 <xs:attribute name="SuppressDowngradeFailure" type="YesNoType">
138 <xs:annotation>
139 <xs:documentation>If set to "yes", attempting to installer a downgraded version of a bundle will be treated as a successful do-nothing operation.
140 The default behavior (or when explicitly set to "no") is to treat downgrade attempts as failures. </xs:documentation>
141 </xs:annotation>
142 </xs:attribute>
143 <xs:attribute name="SuppressRepair" type="YesNoType">
144 <xs:annotation>
145 <xs:documentation>If set to "yes", the Repair button will not be shown in the maintenance-mode UI.</xs:documentation>
146 </xs:annotation>
147 </xs:attribute>
148 <xs:attribute name="ShowVersion" type="YesNoType">
149 <xs:annotation>
150 <xs:documentation>If set to "yes", the application version will be displayed on the UI.</xs:documentation>
151 </xs:annotation>
152 </xs:attribute>
153 <xs:attribute name="SupportCacheOnly" type="YesNoType">
154 <xs:annotation>
155 <xs:documentation>If set to "yes", the bundle can be pre-cached using the /cache command line argument.</xs:documentation>
156 </xs:annotation>
157 </xs:attribute>
158 </xs:complexType>
159 </xs:element>
160
161 <xs:element name="WixManagedBootstrapperApplicationHost">
162 <xs:annotation>
163 <xs:documentation>
164 Configures the ManagedBootstrapperApplicationHost for a Bundle.
165 </xs:documentation>
166 <xs:appinfo>
167 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="BootstrapperApplicationRef" />
168 </xs:appinfo>
169 </xs:annotation>
170 <xs:complexType>
171 <xs:attribute name="LogoFile" type="xs:string">
172 <xs:annotation>
173 <xs:documentation>Source file of the logo graphic.</xs:documentation>
174 </xs:annotation>
175 </xs:attribute>
176 <xs:attribute name="ThemeFile" type="xs:string">
177 <xs:annotation>
178 <xs:documentation>Source file of the theme XML.</xs:documentation>
179 </xs:annotation>
180 </xs:attribute>
181 <xs:attribute name="LocalizationFile" type="xs:string">
182 <xs:annotation>
183 <xs:documentation>Source file of the theme localization .wxl file.</xs:documentation>
184 </xs:annotation>
185 </xs:attribute>
186 </xs:complexType>
187 </xs:element>
188
189 <xs:attribute name="BAFunctions" type="YesNoType">
190 <xs:annotation>
191 <xs:documentation>
192 When set to "yes", WixStdBA will load the DLL and work with it to handle BA messages.
193 </xs:documentation>
194 <xs:appinfo>
195 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Payload" />
196 </xs:appinfo>
197 </xs:annotation>
198 </xs:attribute>
199
200 <xs:attribute name="Overridable" type="YesNoType">
201 <xs:annotation>
202 <xs:documentation>
203 When set to "yes", lets the user override the variable's default value by specifying another value on the command line,
204 in the form Variable=Value. Otherwise, WixStdBA won't overwrite the default value and will log
205 "Ignoring attempt to set non-overridable variable: 'BAR'."
206 </xs:documentation>
207 <xs:appinfo>
208 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Variable" />
209 </xs:appinfo>
210 </xs:annotation>
211 </xs:attribute>
212
213 <xs:attribute name="PrereqLicenseFile" type="xs:string">
214 <xs:annotation>
215 <xs:documentation>
216 Source file of the RTF license file.
217 There may only be one package in the bundle that has either the PrereqLicenseFile attribute or the PrereqLicenseUrl attribute.
218 </xs:documentation>
219 <xs:appinfo>
220 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="ExePackage" />
221 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="MsiPackage" />
222 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="MspPackage" />
223 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="MsuPackage" />
224 </xs:appinfo>
225 </xs:annotation>
226 </xs:attribute>
227
228 <xs:attribute name="PrereqLicenseUrl" type="xs:string">
229 <xs:annotation>
230 <xs:documentation>
231 URL target of the license link.
232 There may only be one package in the bundle that has either the PrereqLicenseFile attribute or the PrereqLicenseUrl attribute.
233 </xs:documentation>
234 <xs:appinfo>
235 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="ExePackage" />
236 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="MsiPackage" />
237 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="MspPackage" />
238 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="MsuPackage" />
239 </xs:appinfo>
240 </xs:annotation>
241 </xs:attribute>
242
243 <xs:attribute name="PrereqPackage" type="YesNoType">
244 <xs:annotation>
245 <xs:documentation>
246 When set to "yes", the Prereq BA will plan the package to be installed if its InstallCondition is "true" or empty.
247 </xs:documentation>
248 <xs:appinfo>
249 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="ExePackage" />
250 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="MsiPackage" />
251 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="MspPackage" />
252 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="MsuPackage" />
253 </xs:appinfo>
254 </xs:annotation>
255 </xs:attribute>
256
257 <xs:simpleType name="YesNoType">
258 <xs:annotation>
259 <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
260 </xs:annotation>
261 <xs:restriction base="xs:NMTOKEN">
262 <xs:enumeration value="no"/>
263 <xs:enumeration value="yes"/>
264 </xs:restriction>
265 </xs:simpleType>
266</xs:schema>
diff --git a/src/wixext/messages.xml b/src/wixext/messages.xml
new file mode 100644
index 00000000..9b11981d
--- /dev/null
+++ b/src/wixext/messages.xml
@@ -0,0 +1,43 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- 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. -->
3
4
5<Messages Namespace="WixToolset.Extensions" Resources="Data.Messages" xmlns="http://schemas.microsoft.com/genmsgs/2004/07/messages">
6 <Class Name="BalErrors" ContainerName="BalErrorEventArgs" BaseContainerName="MessageEventArgs" Level="Error">
7 <Message Id="AttributeRequiresPrereqPackage" Number="6801">
8 <Instance>
9 When the {0}/@{1} attribute is specified, the {0}/@PrereqPackage attribute must be set to "yes".
10 <Parameter Type="System.String" Name="elementName" />
11 <Parameter Type="System.String" Name="attributeName" />
12 </Instance>
13 </Message>
14 <Message Id="MissingPrereq" Number="6802" SourceLineNumbers="no">
15 <Instance>
16 There must be at least one PrereqPackage when using the ManagedBootstrapperApplicationHost.
17 This is typically done by using the WixNetFxExtension and referencing one of the NetFxAsPrereq package groups.
18 </Instance>
19 </Message>
20 <Message Id="MultiplePrereqLicenses" Number="6803">
21 <Instance>
22 There may only be one package in the bundle that has either the PrereqLicenseFile attribute or the PrereqLicenseUrl attribute.
23 </Instance>
24 </Message>
25 <Message Id="MultipleBAFunctions" Number="6804">
26 <Instance>
27 WixStandardBootstrapperApplication doesn't support multiple BAFunctions DLLs.
28 </Instance>
29 </Message>
30 <Message Id="BAFunctionsPayloadRequiredInUXContainer" Number="6805">
31 <Instance>
32 The BAFunctions DLL Payload element must be located inside the BootstrapperApplication container.
33 </Instance>
34 </Message>
35 </Class>
36 <Class Name="BalWarnings" ContainerName="BalWarningEventArgs" BaseContainerName="MessageEventArgs" Level="Warning">
37 <Message Id="UnmarkedBAFunctionsDLL" Number="6501">
38 <Instance>
39 WixStandardBootstrapperApplication doesn't automatically load BAFunctions.dll. Use the bal:BAFunctions attribute to indicate that it should be loaded.
40 </Instance>
41 </Message>
42 </Class>
43</Messages>
diff --git a/src/wixext/tables.xml b/src/wixext/tables.xml
new file mode 100644
index 00000000..18abf1d7
--- /dev/null
+++ b/src/wixext/tables.xml
@@ -0,0 +1,41 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- 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. -->
3
4
5<tableDefinitions xmlns="http://wixtoolset.org/schemas/v4/wi/tables">
6 <tableDefinition name="WixBalBAFunctions" bootstrapperApplicationData="yes">
7 <columnDefinition name="PayloadId" type="string" length="0" nullable="yes" category="identifier" primaryKey="yes"
8 keyTable="WixPayloadProperties" keyColumn="1" description="Reference to a payload entry in the WixPayloadProperties table." />
9 </tableDefinition>
10 <tableDefinition name="WixBalCondition" bootstrapperApplicationData="yes">
11 <columnDefinition name="Condition" type="string" length="255" primaryKey="yes" localizable="yes"
12 category="condition" description="Expression which must evaluate to TRUE in order for install to commence." />
13 <columnDefinition name="Message" type="localized" length="255" escapeIdtCharacters="yes"
14 category="formatted" description="Localizable text to display when condition fails and install must abort." />
15 </tableDefinition>
16
17 <tableDefinition name="WixMbaPrereqInformation" bootstrapperApplicationData="yes">
18 <columnDefinition name="PackageId" type="string" length="72" primaryKey="yes"
19 category="identifier" description="PackageId for the Prereq BA to conditionally install." />
20 <columnDefinition name="LicenseFile" type="string" length="0" category="formatted" />
21 <columnDefinition name="LicenseUrl" type="string" length="0" category="formatted" />
22 </tableDefinition>
23
24 <tableDefinition name="WixStdbaOptions" bootstrapperApplicationData="yes">
25 <columnDefinition name="SuppressOptionsUI" type="number" length="2" nullable="yes"
26 maxValue="1" description="If 1, don't show Options button during install." />
27 <columnDefinition name="SuppressDowngradeFailure" type="number" length="2" nullable="yes"
28 maxValue="1" description="If 1, attempts to downgrade are treated as a successful no-op." />
29 <columnDefinition name="SuppressRepair" type="number" length="2" nullable="yes"
30 maxValue="1" description="If 1, don't show Repair button during maintenance." />
31 <columnDefinition name="ShowVersion" type="number" length="2" nullable="yes"
32 maxValue="1" description="If 1, show the version number on the UI." />
33 <columnDefinition name="SupportCacheOnly" type="number" length="2" nullable="yes"
34 maxValue="1" description="If 1, the bundle can be pre-cached using the /cache command line argument."/>
35 </tableDefinition>
36
37 <tableDefinition name="WixStdbaOverridableVariable" bootstrapperApplicationData="yes">
38 <columnDefinition name="Name" type="string" length="255" primaryKey="yes"
39 category="identifier" description="Variable name user can override." />
40 </tableDefinition>
41</tableDefinitions>