diff options
Diffstat (limited to 'src/WixToolset.Core/Compiler_Bundle.cs')
-rw-r--r-- | src/WixToolset.Core/Compiler_Bundle.cs | 467 |
1 files changed, 264 insertions, 203 deletions
diff --git a/src/WixToolset.Core/Compiler_Bundle.cs b/src/WixToolset.Core/Compiler_Bundle.cs index 21028b6f..2ec66333 100644 --- a/src/WixToolset.Core/Compiler_Bundle.cs +++ b/src/WixToolset.Core/Compiler_Bundle.cs | |||
@@ -17,9 +17,10 @@ namespace WixToolset.Core | |||
17 | /// </summary> | 17 | /// </summary> |
18 | internal partial class Compiler : ICompiler | 18 | internal partial class Compiler : ICompiler |
19 | { | 19 | { |
20 | public const string BurnUXContainerId = "WixUXContainer"; | 20 | public static readonly Identifier BurnUXContainerId = new Identifier(AccessModifier.Private, "WixUXContainer"); |
21 | public const string BurnDefaultAttachedContainerId = "WixAttachedContainer"; | 21 | public static readonly Identifier BurnDefaultAttachedContainerId = new Identifier(AccessModifier.Private, "WixAttachedContainer"); |
22 | 22 | public static readonly Identifier BundleLayoutOnlyPayloads = new Identifier(AccessModifier.Private, "BundleLayoutOnlyPayloads"); | |
23 | |||
23 | // The following constants must stay in sync with src\burn\engine\core.h | 24 | // The following constants must stay in sync with src\burn\engine\core.h |
24 | private const string BURN_BUNDLE_NAME = "WixBundleName"; | 25 | private const string BURN_BUNDLE_NAME = "WixBundleName"; |
25 | private const string BURN_BUNDLE_ORIGINAL_SOURCE = "WixBundleOriginalSource"; | 26 | private const string BURN_BUNDLE_ORIGINAL_SOURCE = "WixBundleOriginalSource"; |
@@ -88,10 +89,14 @@ namespace WixToolset.Core | |||
88 | 89 | ||
89 | if (!this.Core.EncounteredError) | 90 | if (!this.Core.EncounteredError) |
90 | { | 91 | { |
91 | var wixApprovedExeForElevationRow = (WixApprovedExeForElevationTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixApprovedExeForElevation, id); | 92 | var tuple = new WixApprovedExeForElevationTuple(sourceLineNumbers, id) |
92 | wixApprovedExeForElevationRow.Key = key; | 93 | { |
93 | wixApprovedExeForElevationRow.Value = valueName; | 94 | Key = key, |
94 | wixApprovedExeForElevationRow.Attributes = (int)attributes; | 95 | Value = valueName, |
96 | Attributes = attributes | ||
97 | }; | ||
98 | |||
99 | this.Core.AddTuple(tuple); | ||
95 | } | 100 | } |
96 | } | 101 | } |
97 | 102 | ||
@@ -311,10 +316,10 @@ namespace WixToolset.Core | |||
311 | logSeen = true; | 316 | logSeen = true; |
312 | break; | 317 | break; |
313 | case "PayloadGroup": | 318 | case "PayloadGroup": |
314 | this.ParsePayloadGroupElement(child, ComplexReferenceParentType.Layout, "BundleLayoutOnlyPayloads"); | 319 | this.ParsePayloadGroupElement(child, ComplexReferenceParentType.Layout, Compiler.BundleLayoutOnlyPayloads); |
315 | break; | 320 | break; |
316 | case "PayloadGroupRef": | 321 | case "PayloadGroupRef": |
317 | this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Layout, "BundleLayoutOnlyPayloads", ComplexReferenceChildType.Unknown, null); | 322 | this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Layout, Compiler.BundleLayoutOnlyPayloads, ComplexReferenceChildType.Unknown, null); |
318 | break; | 323 | break; |
319 | case "RelatedBundle": | 324 | case "RelatedBundle": |
320 | this.ParseRelatedBundleElement(child); | 325 | this.ParseRelatedBundleElement(child); |
@@ -348,72 +353,75 @@ namespace WixToolset.Core | |||
348 | { | 353 | { |
349 | if (null != upgradeCode) | 354 | if (null != upgradeCode) |
350 | { | 355 | { |
351 | var tuple = new WixRelatedBundleTuple(sourceLineNumbers) | 356 | this.Core.AddTuple(new WixRelatedBundleTuple(sourceLineNumbers) |
352 | { | 357 | { |
353 | BundleId = upgradeCode, | 358 | BundleId = upgradeCode, |
354 | Action = RelatedBundleActionType.Upgrade, | 359 | Action = RelatedBundleActionType.Upgrade, |
355 | }; | 360 | }); |
356 | |||
357 | this.Core.AddTuple(tuple); | ||
358 | } | 361 | } |
359 | 362 | ||
360 | var containerRow = (WixBundleContainerTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleContainer); | 363 | this.Core.AddTuple(new WixBundleContainerTuple(sourceLineNumbers, new Identifier(AccessModifier.Private, Compiler.BurnDefaultAttachedContainerId)) |
361 | containerRow.WixBundleContainer = Compiler.BurnDefaultAttachedContainerId; | 364 | { |
362 | containerRow.Name = "bundle-attached.cab"; | 365 | Name = "bundle-attached.cab", |
363 | containerRow.Type = ContainerType.Attached; | 366 | Type = ContainerType.Attached |
367 | }); | ||
364 | 368 | ||
365 | var row = this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundle); | 369 | var bundleTuple = this.Core.CreateTuple(sourceLineNumbers, TupleDefinitionType.WixBundle); |
366 | row.Set(0, version); | 370 | bundleTuple.Set(0, version); |
367 | row.Set(1, copyright); | 371 | bundleTuple.Set(1, copyright); |
368 | row.Set(2, name); | 372 | bundleTuple.Set(2, name); |
369 | row.Set(3, aboutUrl); | 373 | bundleTuple.Set(3, aboutUrl); |
370 | if (-1 != disableModify) | 374 | if (-1 != disableModify) |
371 | { | 375 | { |
372 | row.Set(4, disableModify); | 376 | bundleTuple.Set(4, disableModify); |
373 | } | 377 | } |
374 | if (YesNoType.NotSet != disableRemove) | 378 | if (YesNoType.NotSet != disableRemove) |
375 | { | 379 | { |
376 | row.Set(5, (YesNoType.Yes == disableRemove) ? 1 : 0); | 380 | bundleTuple.Set(5, (YesNoType.Yes == disableRemove) ? 1 : 0); |
377 | } | 381 | } |
378 | // row.Set(6] - (deprecated) "disable repair" | 382 | // row.Set(6] - (deprecated) "disable repair" |
379 | row.Set(7, helpTelephone); | 383 | bundleTuple.Set(7, helpTelephone); |
380 | row.Set(8, helpUrl); | 384 | bundleTuple.Set(8, helpUrl); |
381 | row.Set(9, manufacturer); | 385 | bundleTuple.Set(9, manufacturer); |
382 | row.Set(10, updateUrl); | 386 | bundleTuple.Set(10, updateUrl); |
383 | if (YesNoDefaultType.Default != compressed) | 387 | if (YesNoDefaultType.Default != compressed) |
384 | { | 388 | { |
385 | row.Set(11, (YesNoDefaultType.Yes == compressed) ? 1 : 0); | 389 | bundleTuple.Set(11, (YesNoDefaultType.Yes == compressed) ? 1 : 0); |
386 | } | 390 | } |
387 | 391 | ||
388 | row.Set(12, logVariablePrefixAndExtension); | 392 | bundleTuple.Set(12, logVariablePrefixAndExtension); |
389 | row.Set(13, iconSourceFile); | 393 | bundleTuple.Set(13, iconSourceFile); |
390 | row.Set(14, splashScreenSourceFile); | 394 | bundleTuple.Set(14, splashScreenSourceFile); |
391 | row.Set(15, condition); | 395 | bundleTuple.Set(15, condition); |
392 | row.Set(16, tag); | 396 | bundleTuple.Set(16, tag); |
393 | row.Set(17, this.CurrentPlatform.ToString()); | 397 | bundleTuple.Set(17, this.CurrentPlatform.ToString()); |
394 | row.Set(18, parentName); | 398 | bundleTuple.Set(18, parentName); |
395 | row.Set(19, upgradeCode); | 399 | bundleTuple.Set(19, upgradeCode); |
396 | 400 | ||
397 | // Ensure that the bundle stores the well-known persisted values. | 401 | // Ensure that the bundle stores the well-known persisted values. |
398 | var bundleNameWellKnownVariable = (WixBundleVariableTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleVariable); | 402 | this.Core.AddTuple(new WixBundleVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Private, Compiler.BURN_BUNDLE_NAME)) |
399 | bundleNameWellKnownVariable.WixBundleVariable = Compiler.BURN_BUNDLE_NAME; | 403 | { |
400 | bundleNameWellKnownVariable.Hidden = false; | 404 | Hidden = false, |
401 | bundleNameWellKnownVariable.Persisted = true; | 405 | Persisted = true |
402 | 406 | }); | |
403 | var bundleOriginalSourceWellKnownVariable = (WixBundleVariableTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleVariable); | 407 | |
404 | bundleOriginalSourceWellKnownVariable.WixBundleVariable = Compiler.BURN_BUNDLE_ORIGINAL_SOURCE; | 408 | this.Core.AddTuple(new WixBundleVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Private, Compiler.BURN_BUNDLE_ORIGINAL_SOURCE)) |
405 | bundleOriginalSourceWellKnownVariable.Hidden = false; | 409 | { |
406 | bundleOriginalSourceWellKnownVariable.Persisted = true; | 410 | Hidden = false, |
407 | 411 | Persisted = true | |
408 | var bundleOriginalSourceFolderWellKnownVariable = (WixBundleVariableTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleVariable); | 412 | }); |
409 | bundleOriginalSourceFolderWellKnownVariable.WixBundleVariable = Compiler.BURN_BUNDLE_ORIGINAL_SOURCE_FOLDER; | 413 | |
410 | bundleOriginalSourceFolderWellKnownVariable.Hidden = false; | 414 | this.Core.AddTuple(new WixBundleVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Private, Compiler.BURN_BUNDLE_ORIGINAL_SOURCE_FOLDER)) |
411 | bundleOriginalSourceFolderWellKnownVariable.Persisted = true; | 415 | { |
412 | 416 | Hidden = false, | |
413 | var bundleLastUsedSourceWellKnownVariable = (WixBundleVariableTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleVariable); | 417 | Persisted = true |
414 | bundleLastUsedSourceWellKnownVariable.WixBundleVariable = Compiler.BURN_BUNDLE_LAST_USED_SOURCE; | 418 | }); |
415 | bundleLastUsedSourceWellKnownVariable.Hidden = false; | 419 | |
416 | bundleLastUsedSourceWellKnownVariable.Persisted = true; | 420 | this.Core.AddTuple(new WixBundleVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Private, Compiler.BURN_BUNDLE_LAST_USED_SOURCE)) |
421 | { | ||
422 | Hidden = false, | ||
423 | Persisted = true | ||
424 | }); | ||
417 | } | 425 | } |
418 | } | 426 | } |
419 | 427 | ||
@@ -514,8 +522,10 @@ namespace WixToolset.Core | |||
514 | { | 522 | { |
515 | this.CreatePayloadRow(sourceLineNumbers, id, Path.GetFileName(sourceFile), sourceFile, null, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId, ComplexReferenceChildType.Unknown, null, YesNoDefaultType.Yes, YesNoType.Yes, null, null, null); | 523 | this.CreatePayloadRow(sourceLineNumbers, id, Path.GetFileName(sourceFile), sourceFile, null, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId, ComplexReferenceChildType.Unknown, null, YesNoDefaultType.Yes, YesNoType.Yes, null, null, null); |
516 | 524 | ||
517 | var wixCatalogRow = (WixBundleCatalogTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleCatalog, id); | 525 | this.Core.AddTuple(new WixBundleCatalogTuple(sourceLineNumbers, id) |
518 | wixCatalogRow.Payload_ = id.Id; | 526 | { |
527 | Payload_ = id.Id, | ||
528 | }); | ||
519 | } | 529 | } |
520 | } | 530 | } |
521 | 531 | ||
@@ -614,10 +624,12 @@ namespace WixToolset.Core | |||
614 | 624 | ||
615 | if (!this.Core.EncounteredError) | 625 | if (!this.Core.EncounteredError) |
616 | { | 626 | { |
617 | var row = (WixBundleContainerTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleContainer, id); | 627 | this.Core.AddTuple(new WixBundleContainerTuple(sourceLineNumbers, id) |
618 | row.Name = name; | 628 | { |
619 | row.Type = type; | 629 | Name = name, |
620 | row.DownloadUrl = downloadUrl; | 630 | Type = type, |
631 | DownloadUrl = downloadUrl | ||
632 | }); | ||
621 | } | 633 | } |
622 | } | 634 | } |
623 | 635 | ||
@@ -628,12 +640,11 @@ namespace WixToolset.Core | |||
628 | private void ParseBootstrapperApplicationElement(XElement node) | 640 | private void ParseBootstrapperApplicationElement(XElement node) |
629 | { | 641 | { |
630 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); | 642 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); |
631 | string id = null; | 643 | Identifier previousId = null; |
632 | string previousId = null; | ||
633 | var previousType = ComplexReferenceChildType.Unknown; | 644 | var previousType = ComplexReferenceChildType.Unknown; |
634 | 645 | ||
635 | // The BootstrapperApplication element acts like a Payload element so delegate to the "Payload" attribute parsing code to parse and create a Payload entry. | 646 | // The BootstrapperApplication element acts like a Payload element so delegate to the "Payload" attribute parsing code to parse and create a Payload entry. |
636 | id = this.ParsePayloadElementContent(node, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId, previousType, previousId, false); | 647 | var id = this.ParsePayloadElementContent(node, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId, previousType, previousId, false); |
637 | if (null != id) | 648 | if (null != id) |
638 | { | 649 | { |
639 | previousId = id; | 650 | previousId = id; |
@@ -676,15 +687,15 @@ namespace WixToolset.Core | |||
676 | // Add the application as an attached container and if an Id was provided add that too. | 687 | // Add the application as an attached container and if an Id was provided add that too. |
677 | if (!this.Core.EncounteredError) | 688 | if (!this.Core.EncounteredError) |
678 | { | 689 | { |
679 | var containerRow = (WixBundleContainerTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleContainer); | 690 | this.Core.AddTuple(new WixBundleContainerTuple(sourceLineNumbers, new Identifier(AccessModifier.Private, Compiler.BurnUXContainerId)) |
680 | containerRow.WixBundleContainer = Compiler.BurnUXContainerId; | 691 | { |
681 | containerRow.Name = "bundle-ux.cab"; | 692 | Name = "bundle-ux.cab", |
682 | containerRow.Type = ContainerType.Attached; | 693 | Type = ContainerType.Attached |
694 | }); | ||
683 | 695 | ||
684 | if (!String.IsNullOrEmpty(id)) | 696 | if (null != id) |
685 | { | 697 | { |
686 | var row = this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBootstrapperApplication); | 698 | this.Core.AddTuple(new WixBootstrapperApplicationTuple(sourceLineNumbers, id)); |
687 | row.Set(0, id); | ||
688 | } | 699 | } |
689 | } | 700 | } |
690 | } | 701 | } |
@@ -697,7 +708,7 @@ namespace WixToolset.Core | |||
697 | { | 708 | { |
698 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); | 709 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); |
699 | string id = null; | 710 | string id = null; |
700 | string previousId = null; | 711 | Identifier previousId = null; |
701 | var previousType = ComplexReferenceChildType.Unknown; | 712 | var previousType = ComplexReferenceChildType.Unknown; |
702 | 713 | ||
703 | foreach (var attrib in node.Attributes()) | 714 | foreach (var attrib in node.Attributes()) |
@@ -847,12 +858,14 @@ namespace WixToolset.Core | |||
847 | 858 | ||
848 | if (!this.Core.EncounteredError) | 859 | if (!this.Core.EncounteredError) |
849 | { | 860 | { |
850 | var row = this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixUpdateRegistration); | 861 | this.Core.AddTuple(new WixUpdateRegistrationTuple(sourceLineNumbers) |
851 | row.Set(0, manufacturer); | 862 | { |
852 | row.Set(1, department); | 863 | Manufacturer = manufacturer, |
853 | row.Set(2, productFamily); | 864 | Department = department, |
854 | row.Set(3, name); | 865 | ProductFamily = productFamily, |
855 | row.Set(4, classification); | 866 | Name = name, |
867 | Classification = classification | ||
868 | }); | ||
856 | } | 869 | } |
857 | } | 870 | } |
858 | 871 | ||
@@ -862,7 +875,7 @@ namespace WixToolset.Core | |||
862 | /// <param name="node">Element to parse</param> | 875 | /// <param name="node">Element to parse</param> |
863 | /// <param name="parentType">ComplexReferenceParentType of parent element. (BA or PayloadGroup)</param> | 876 | /// <param name="parentType">ComplexReferenceParentType of parent element. (BA or PayloadGroup)</param> |
864 | /// <param name="parentId">Identifier of parent element.</param> | 877 | /// <param name="parentId">Identifier of parent element.</param> |
865 | private string ParsePayloadElement(XElement node, ComplexReferenceParentType parentType, string parentId, ComplexReferenceChildType previousType, string previousId) | 878 | private Identifier ParsePayloadElement(XElement node, ComplexReferenceParentType parentType, Identifier parentId, ComplexReferenceChildType previousType, Identifier previousId) |
866 | { | 879 | { |
867 | Debug.Assert(ComplexReferenceParentType.PayloadGroup == parentType || ComplexReferenceParentType.Package == parentType || ComplexReferenceParentType.Container == parentType); | 880 | Debug.Assert(ComplexReferenceParentType.PayloadGroup == parentType || ComplexReferenceParentType.Package == parentType || ComplexReferenceParentType.Container == parentType); |
868 | Debug.Assert(ComplexReferenceChildType.Unknown == previousType || ComplexReferenceChildType.PayloadGroup == previousType || ComplexReferenceChildType.Payload == previousType); | 881 | Debug.Assert(ComplexReferenceChildType.Unknown == previousType || ComplexReferenceChildType.PayloadGroup == previousType || ComplexReferenceChildType.Payload == previousType); |
@@ -870,7 +883,7 @@ namespace WixToolset.Core | |||
870 | var id = this.ParsePayloadElementContent(node, parentType, parentId, previousType, previousId, true); | 883 | var id = this.ParsePayloadElementContent(node, parentType, parentId, previousType, previousId, true); |
871 | var context = new Dictionary<string, string> | 884 | var context = new Dictionary<string, string> |
872 | { | 885 | { |
873 | ["Id"] = id | 886 | ["Id"] = id.Id |
874 | }; | 887 | }; |
875 | 888 | ||
876 | foreach (var child in node.Elements()) | 889 | foreach (var child in node.Elements()) |
@@ -899,7 +912,7 @@ namespace WixToolset.Core | |||
899 | /// <param name="node">Element to parse</param> | 912 | /// <param name="node">Element to parse</param> |
900 | /// <param name="parentType">ComplexReferenceParentType of parent element.</param> | 913 | /// <param name="parentType">ComplexReferenceParentType of parent element.</param> |
901 | /// <param name="parentId">Identifier of parent element.</param> | 914 | /// <param name="parentId">Identifier of parent element.</param> |
902 | private string ParsePayloadElementContent(XElement node, ComplexReferenceParentType parentType, string parentId, ComplexReferenceChildType previousType, string previousId, bool required) | 915 | private Identifier ParsePayloadElementContent(XElement node, ComplexReferenceParentType parentType, Identifier parentId, ComplexReferenceChildType previousType, Identifier previousId, bool required) |
903 | { | 916 | { |
904 | Debug.Assert(ComplexReferenceParentType.PayloadGroup == parentType || ComplexReferenceParentType.Package == parentType || ComplexReferenceParentType.Container == parentType); | 917 | Debug.Assert(ComplexReferenceParentType.PayloadGroup == parentType || ComplexReferenceParentType.Package == parentType || ComplexReferenceParentType.Container == parentType); |
905 | 918 | ||
@@ -959,7 +972,7 @@ namespace WixToolset.Core | |||
959 | 972 | ||
960 | if (null == id) | 973 | if (null == id) |
961 | { | 974 | { |
962 | id = this.Core.CreateIdentifier("pay", (null != sourceFile) ? sourceFile.ToUpperInvariant() : String.Empty); | 975 | id = this.Core.CreateIdentifier("pay", sourceFile?.ToUpperInvariant() ?? String.Empty); |
963 | } | 976 | } |
964 | 977 | ||
965 | // Now that the PayloadId is known, we can parse the extension attributes. | 978 | // Now that the PayloadId is known, we can parse the extension attributes. |
@@ -1022,7 +1035,7 @@ namespace WixToolset.Core | |||
1022 | 1035 | ||
1023 | this.CreatePayloadRow(sourceLineNumbers, id, name, sourceFile, downloadUrl, parentType, parentId, previousType, previousId, compressed, enableSignatureVerification, null, null, remotePayload); | 1036 | this.CreatePayloadRow(sourceLineNumbers, id, name, sourceFile, downloadUrl, parentType, parentId, previousType, previousId, compressed, enableSignatureVerification, null, null, remotePayload); |
1024 | 1037 | ||
1025 | return id.Id; | 1038 | return id; |
1026 | } | 1039 | } |
1027 | 1040 | ||
1028 | private RemotePayload ParseRemotePayloadElement(XElement node) | 1041 | private RemotePayload ParseRemotePayloadElement(XElement node) |
@@ -1103,38 +1116,42 @@ namespace WixToolset.Core | |||
1103 | /// <param name="parentType">ComplexReferenceParentType of parent element</param> | 1116 | /// <param name="parentType">ComplexReferenceParentType of parent element</param> |
1104 | /// <param name="parentId">Identifier of parent element.</param> | 1117 | /// <param name="parentId">Identifier of parent element.</param> |
1105 | private WixBundlePayloadTuple CreatePayloadRow(SourceLineNumber sourceLineNumbers, Identifier id, string name, string sourceFile, string downloadUrl, ComplexReferenceParentType parentType, | 1118 | private WixBundlePayloadTuple CreatePayloadRow(SourceLineNumber sourceLineNumbers, Identifier id, string name, string sourceFile, string downloadUrl, ComplexReferenceParentType parentType, |
1106 | string parentId, ComplexReferenceChildType previousType, string previousId, YesNoDefaultType compressed, YesNoType enableSignatureVerification, string displayName, string description, | 1119 | Identifier parentId, ComplexReferenceChildType previousType, Identifier previousId, YesNoDefaultType compressed, YesNoType enableSignatureVerification, string displayName, string description, |
1107 | RemotePayload remotePayload) | 1120 | RemotePayload remotePayload) |
1108 | { | 1121 | { |
1109 | WixBundlePayloadTuple row = null; | 1122 | WixBundlePayloadTuple tuple = null; |
1110 | 1123 | ||
1111 | if (!this.Core.EncounteredError) | 1124 | if (!this.Core.EncounteredError) |
1112 | { | 1125 | { |
1113 | row = (WixBundlePayloadTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundlePayload, id); | 1126 | tuple = new WixBundlePayloadTuple(sourceLineNumbers, id) |
1114 | row.Name = String.IsNullOrEmpty(name) ? Path.GetFileName(sourceFile) : name; | 1127 | { |
1115 | row.SourceFile = sourceFile; | 1128 | Name = String.IsNullOrEmpty(name) ? Path.GetFileName(sourceFile) : name, |
1116 | row.DownloadUrl = downloadUrl; | 1129 | SourceFile = sourceFile, |
1117 | row.Compressed = compressed; | 1130 | DownloadUrl = downloadUrl, |
1118 | row.UnresolvedSourceFile = sourceFile; // duplicate of sourceFile but in a string column so it won't get resolved to a full path during binding. | 1131 | Compressed = compressed, |
1119 | row.DisplayName = displayName; | 1132 | UnresolvedSourceFile = sourceFile, // duplicate of sourceFile but in a string column so it won't get resolved to a full path during binding. |
1120 | row.Description = description; | 1133 | DisplayName = displayName, |
1121 | row.EnableSignatureValidation = (YesNoType.Yes == enableSignatureVerification); | 1134 | Description = description, |
1135 | EnableSignatureValidation = (YesNoType.Yes == enableSignatureVerification) | ||
1136 | }; | ||
1122 | 1137 | ||
1123 | if (null != remotePayload) | 1138 | if (null != remotePayload) |
1124 | { | 1139 | { |
1125 | row.Description = remotePayload.Description; | 1140 | tuple.Description = remotePayload.Description; |
1126 | row.DisplayName = remotePayload.ProductName; | 1141 | tuple.DisplayName = remotePayload.ProductName; |
1127 | row.Hash = remotePayload.Hash; | 1142 | tuple.Hash = remotePayload.Hash; |
1128 | row.PublicKey = remotePayload.CertificatePublicKey; | 1143 | tuple.PublicKey = remotePayload.CertificatePublicKey; |
1129 | row.Thumbprint = remotePayload.CertificateThumbprint; | 1144 | tuple.Thumbprint = remotePayload.CertificateThumbprint; |
1130 | row.FileSize = remotePayload.Size; | 1145 | tuple.FileSize = remotePayload.Size; |
1131 | row.Version = remotePayload.Version; | 1146 | tuple.Version = remotePayload.Version; |
1132 | } | 1147 | } |
1133 | 1148 | ||
1134 | this.CreateGroupAndOrderingRows(sourceLineNumbers, parentType, parentId, ComplexReferenceChildType.Payload, id.Id, previousType, previousId); | 1149 | this.Core.AddTuple(tuple); |
1150 | |||
1151 | this.CreateGroupAndOrderingRows(sourceLineNumbers, parentType, parentId.Id, ComplexReferenceChildType.Payload, id.Id, previousType, previousId.Id); | ||
1135 | } | 1152 | } |
1136 | 1153 | ||
1137 | return row; | 1154 | return tuple; |
1138 | } | 1155 | } |
1139 | 1156 | ||
1140 | /// <summary> | 1157 | /// <summary> |
@@ -1143,7 +1160,7 @@ namespace WixToolset.Core | |||
1143 | /// <param name="node">Element to parse</param> | 1160 | /// <param name="node">Element to parse</param> |
1144 | /// <param name="parentType">Optional ComplexReferenceParentType of parent element. (typically another PayloadGroup)</param> | 1161 | /// <param name="parentType">Optional ComplexReferenceParentType of parent element. (typically another PayloadGroup)</param> |
1145 | /// <param name="parentId">Identifier of parent element.</param> | 1162 | /// <param name="parentId">Identifier of parent element.</param> |
1146 | private void ParsePayloadGroupElement(XElement node, ComplexReferenceParentType parentType, string parentId) | 1163 | private void ParsePayloadGroupElement(XElement node, ComplexReferenceParentType parentType, Identifier parentId) |
1147 | { | 1164 | { |
1148 | Debug.Assert(ComplexReferenceParentType.Unknown == parentType || ComplexReferenceParentType.Layout == parentType || ComplexReferenceParentType.PayloadGroup == parentType); | 1165 | Debug.Assert(ComplexReferenceParentType.Unknown == parentType || ComplexReferenceParentType.Layout == parentType || ComplexReferenceParentType.PayloadGroup == parentType); |
1149 | 1166 | ||
@@ -1177,7 +1194,7 @@ namespace WixToolset.Core | |||
1177 | } | 1194 | } |
1178 | 1195 | ||
1179 | var previousType = ComplexReferenceChildType.Unknown; | 1196 | var previousType = ComplexReferenceChildType.Unknown; |
1180 | string previousId = null; | 1197 | Identifier previousId = null; |
1181 | foreach (var child in node.Elements()) | 1198 | foreach (var child in node.Elements()) |
1182 | { | 1199 | { |
1183 | if (CompilerCore.WixNamespace == child.Name.Namespace) | 1200 | if (CompilerCore.WixNamespace == child.Name.Namespace) |
@@ -1185,11 +1202,11 @@ namespace WixToolset.Core | |||
1185 | switch (child.Name.LocalName) | 1202 | switch (child.Name.LocalName) |
1186 | { | 1203 | { |
1187 | case "Payload": | 1204 | case "Payload": |
1188 | previousId = this.ParsePayloadElement(child, ComplexReferenceParentType.PayloadGroup, id.Id, previousType, previousId); | 1205 | previousId = this.ParsePayloadElement(child, ComplexReferenceParentType.PayloadGroup, id, previousType, previousId); |
1189 | previousType = ComplexReferenceChildType.Payload; | 1206 | previousType = ComplexReferenceChildType.Payload; |
1190 | break; | 1207 | break; |
1191 | case "PayloadGroupRef": | 1208 | case "PayloadGroupRef": |
1192 | previousId = this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.PayloadGroup, id.Id, previousType, previousId); | 1209 | previousId = this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.PayloadGroup, id, previousType, previousId); |
1193 | previousType = ComplexReferenceChildType.PayloadGroup; | 1210 | previousType = ComplexReferenceChildType.PayloadGroup; |
1194 | break; | 1211 | break; |
1195 | default: | 1212 | default: |
@@ -1206,9 +1223,9 @@ namespace WixToolset.Core | |||
1206 | 1223 | ||
1207 | if (!this.Core.EncounteredError) | 1224 | if (!this.Core.EncounteredError) |
1208 | { | 1225 | { |
1209 | this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundlePayloadGroup, id); | 1226 | this.Core.AddTuple(new WixBundlePayloadGroupTuple(sourceLineNumbers, id)); |
1210 | 1227 | ||
1211 | this.CreateGroupAndOrderingRows(sourceLineNumbers, parentType, parentId, ComplexReferenceChildType.PayloadGroup, id.Id, ComplexReferenceChildType.Unknown, null); | 1228 | this.CreateGroupAndOrderingRows(sourceLineNumbers, parentType, parentId?.Id, ComplexReferenceChildType.PayloadGroup, id.Id, ComplexReferenceChildType.Unknown, null); |
1212 | } | 1229 | } |
1213 | } | 1230 | } |
1214 | 1231 | ||
@@ -1218,13 +1235,13 @@ namespace WixToolset.Core | |||
1218 | /// <param name="node">Element to parse.</param> | 1235 | /// <param name="node">Element to parse.</param> |
1219 | /// <param name="parentType">ComplexReferenceParentType of parent element (BA or PayloadGroup).</param> | 1236 | /// <param name="parentType">ComplexReferenceParentType of parent element (BA or PayloadGroup).</param> |
1220 | /// <param name="parentId">Identifier of parent element.</param> | 1237 | /// <param name="parentId">Identifier of parent element.</param> |
1221 | private string ParsePayloadGroupRefElement(XElement node, ComplexReferenceParentType parentType, string parentId, ComplexReferenceChildType previousType, string previousId) | 1238 | private Identifier ParsePayloadGroupRefElement(XElement node, ComplexReferenceParentType parentType, Identifier parentId, ComplexReferenceChildType previousType, Identifier previousId) |
1222 | { | 1239 | { |
1223 | Debug.Assert(ComplexReferenceParentType.Layout == parentType || ComplexReferenceParentType.PayloadGroup == parentType || ComplexReferenceParentType.Package == parentType || ComplexReferenceParentType.Container == parentType); | 1240 | Debug.Assert(ComplexReferenceParentType.Layout == parentType || ComplexReferenceParentType.PayloadGroup == parentType || ComplexReferenceParentType.Package == parentType || ComplexReferenceParentType.Container == parentType); |
1224 | Debug.Assert(ComplexReferenceChildType.Unknown == previousType || ComplexReferenceChildType.PayloadGroup == previousType || ComplexReferenceChildType.Payload == previousType); | 1241 | Debug.Assert(ComplexReferenceChildType.Unknown == previousType || ComplexReferenceChildType.PayloadGroup == previousType || ComplexReferenceChildType.Payload == previousType); |
1225 | 1242 | ||
1226 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); | 1243 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); |
1227 | string id = null; | 1244 | Identifier id = null; |
1228 | 1245 | ||
1229 | foreach (var attrib in node.Attributes()) | 1246 | foreach (var attrib in node.Attributes()) |
1230 | { | 1247 | { |
@@ -1233,8 +1250,8 @@ namespace WixToolset.Core | |||
1233 | switch (attrib.Name.LocalName) | 1250 | switch (attrib.Name.LocalName) |
1234 | { | 1251 | { |
1235 | case "Id": | 1252 | case "Id": |
1236 | id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); | 1253 | id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); |
1237 | this.Core.CreateSimpleReference(sourceLineNumbers, "WixBundlePayloadGroup", id); | 1254 | this.Core.CreateSimpleReference(sourceLineNumbers, "WixBundlePayloadGroup", id.Id); |
1238 | break; | 1255 | break; |
1239 | default: | 1256 | default: |
1240 | this.Core.UnexpectedAttribute(node, attrib); | 1257 | this.Core.UnexpectedAttribute(node, attrib); |
@@ -1254,7 +1271,7 @@ namespace WixToolset.Core | |||
1254 | 1271 | ||
1255 | this.Core.ParseForExtensionElements(node); | 1272 | this.Core.ParseForExtensionElements(node); |
1256 | 1273 | ||
1257 | this.CreateGroupAndOrderingRows(sourceLineNumbers, parentType, parentId, ComplexReferenceChildType.PayloadGroup, id, previousType, previousId); | 1274 | this.CreateGroupAndOrderingRows(sourceLineNumbers, parentType, parentId.Id, ComplexReferenceChildType.PayloadGroup, id.Id, previousType, previousId.Id); |
1258 | 1275 | ||
1259 | return id; | 1276 | return id; |
1260 | } | 1277 | } |
@@ -1274,6 +1291,11 @@ namespace WixToolset.Core | |||
1274 | ComplexReferenceChildType type, string id, | 1291 | ComplexReferenceChildType type, string id, |
1275 | ComplexReferenceChildType previousType, string previousId) | 1292 | ComplexReferenceChildType previousType, string previousId) |
1276 | { | 1293 | { |
1294 | if (this.Core.EncounteredError) | ||
1295 | { | ||
1296 | return; | ||
1297 | } | ||
1298 | |||
1277 | if (ComplexReferenceParentType.Unknown != parentType && null != parentId) | 1299 | if (ComplexReferenceParentType.Unknown != parentType && null != parentId) |
1278 | { | 1300 | { |
1279 | this.Core.CreateWixGroupRow(sourceLineNumbers, parentType, parentId, type, id); | 1301 | this.Core.CreateWixGroupRow(sourceLineNumbers, parentType, parentId, type, id); |
@@ -1281,7 +1303,18 @@ namespace WixToolset.Core | |||
1281 | 1303 | ||
1282 | if (ComplexReferenceChildType.Unknown != previousType && null != previousId) | 1304 | if (ComplexReferenceChildType.Unknown != previousType && null != previousId) |
1283 | { | 1305 | { |
1284 | this.CreateWixOrderingRow(sourceLineNumbers, type, id, previousType, previousId); | 1306 | // TODO: Should we define our own enum for this, just to ensure there's no "cross-contamination"? |
1307 | // TODO: Also, we could potentially include an 'Attributes' field to track things like | ||
1308 | // 'before' vs. 'after', and explicit vs. inferred dependencies. | ||
1309 | var tuple = new WixOrderingTuple(sourceLineNumbers) | ||
1310 | { | ||
1311 | ItemType = type, | ||
1312 | ItemId_ = id, | ||
1313 | DependsOnType = previousType, | ||
1314 | DependsOnId_ = previousId | ||
1315 | }; | ||
1316 | |||
1317 | this.Core.AddTuple(tuple); | ||
1285 | } | 1318 | } |
1286 | } | 1319 | } |
1287 | 1320 | ||
@@ -1307,7 +1340,7 @@ namespace WixToolset.Core | |||
1307 | break; | 1340 | break; |
1308 | case "Behavior": | 1341 | case "Behavior": |
1309 | var behaviorString = this.Core.GetAttributeValue(sourceLineNumbers, attrib); | 1342 | var behaviorString = this.Core.GetAttributeValue(sourceLineNumbers, attrib); |
1310 | if (!Enum.TryParse<ExitCodeBehaviorType>(behaviorString, true, out behavior)) | 1343 | if (!Enum.TryParse(behaviorString, true, out behavior)) |
1311 | { | 1344 | { |
1312 | this.Core.Write(ErrorMessages.IllegalAttributeValueWithLegalList(sourceLineNumbers, node.Name.LocalName, "Behavior", behaviorString, "success, error, scheduleReboot, forceReboot")); | 1345 | this.Core.Write(ErrorMessages.IllegalAttributeValueWithLegalList(sourceLineNumbers, node.Name.LocalName, "Behavior", behaviorString, "success, error, scheduleReboot, forceReboot")); |
1313 | } | 1346 | } |
@@ -1332,10 +1365,12 @@ namespace WixToolset.Core | |||
1332 | 1365 | ||
1333 | if (!this.Core.EncounteredError) | 1366 | if (!this.Core.EncounteredError) |
1334 | { | 1367 | { |
1335 | var row = (WixBundlePackageExitCodeTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundlePackageExitCode); | 1368 | this.Core.AddTuple(new WixBundlePackageExitCodeTuple(sourceLineNumbers) |
1336 | row.ChainPackageId = packageId; | 1369 | { |
1337 | row.Code = value; | 1370 | ChainPackageId = packageId, |
1338 | row.Behavior = behavior; | 1371 | Code = value, |
1372 | Behavior = behavior | ||
1373 | }); | ||
1339 | } | 1374 | } |
1340 | } | 1375 | } |
1341 | 1376 | ||
@@ -1384,7 +1419,7 @@ namespace WixToolset.Core | |||
1384 | } | 1419 | } |
1385 | 1420 | ||
1386 | // Ensure there is always a rollback boundary at the beginning of the chain. | 1421 | // Ensure there is always a rollback boundary at the beginning of the chain. |
1387 | this.CreateRollbackBoundary(sourceLineNumbers, new Identifier("WixDefaultBoundary", AccessModifier.Public), YesNoType.Yes, YesNoType.No, ComplexReferenceParentType.PackageGroup, "WixChain", ComplexReferenceChildType.Unknown, null); | 1422 | this.CreateRollbackBoundary(sourceLineNumbers, new Identifier(AccessModifier.Public, "WixDefaultBoundary"), YesNoType.Yes, YesNoType.No, ComplexReferenceParentType.PackageGroup, "WixChain", ComplexReferenceChildType.Unknown, null); |
1388 | 1423 | ||
1389 | var previousId = "WixDefaultBoundary"; | 1424 | var previousId = "WixDefaultBoundary"; |
1390 | var previousType = ComplexReferenceChildType.Package; | 1425 | var previousType = ComplexReferenceChildType.Package; |
@@ -1438,8 +1473,10 @@ namespace WixToolset.Core | |||
1438 | 1473 | ||
1439 | if (!this.Core.EncounteredError) | 1474 | if (!this.Core.EncounteredError) |
1440 | { | 1475 | { |
1441 | var row = (WixChainTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixChain); | 1476 | this.Core.AddTuple(new WixChainTuple(sourceLineNumbers) |
1442 | row.Attributes = attributes; | 1477 | { |
1478 | Attributes = attributes | ||
1479 | }); | ||
1443 | } | 1480 | } |
1444 | } | 1481 | } |
1445 | 1482 | ||
@@ -1680,7 +1717,24 @@ namespace WixToolset.Core | |||
1680 | installCondition = this.Core.GetAttributeValue(sourceLineNumbers, attrib); | 1717 | installCondition = this.Core.GetAttributeValue(sourceLineNumbers, attrib); |
1681 | break; | 1718 | break; |
1682 | case "Cache": | 1719 | case "Cache": |
1683 | cache = this.Core.GetAttributeYesNoAlwaysValue(sourceLineNumbers, attrib); | 1720 | var value = this.Core.GetAttributeValue(sourceLineNumbers, attrib); |
1721 | switch (value) | ||
1722 | { | ||
1723 | case "always": | ||
1724 | cache = YesNoAlwaysType.Always; | ||
1725 | break; | ||
1726 | case "yes": | ||
1727 | cache = YesNoAlwaysType.Yes; | ||
1728 | break; | ||
1729 | case "no": | ||
1730 | cache = YesNoAlwaysType.No; | ||
1731 | break; | ||
1732 | case "": | ||
1733 | break; | ||
1734 | default: | ||
1735 | this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, value, "button", "yes", "no")); | ||
1736 | break; | ||
1737 | } | ||
1684 | break; | 1738 | break; |
1685 | case "CacheId": | 1739 | case "CacheId": |
1686 | cacheId = this.Core.GetAttributeValue(sourceLineNumbers, attrib); | 1740 | cacheId = this.Core.GetAttributeValue(sourceLineNumbers, attrib); |
@@ -1933,10 +1987,10 @@ namespace WixToolset.Core | |||
1933 | } | 1987 | } |
1934 | break; | 1988 | break; |
1935 | case "Payload": | 1989 | case "Payload": |
1936 | this.ParsePayloadElement(child, ComplexReferenceParentType.Package, id.Id, ComplexReferenceChildType.Unknown, null); | 1990 | this.ParsePayloadElement(child, ComplexReferenceParentType.Package, id, ComplexReferenceChildType.Unknown, null); |
1937 | break; | 1991 | break; |
1938 | case "PayloadGroupRef": | 1992 | case "PayloadGroupRef": |
1939 | this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Package, id.Id, ComplexReferenceChildType.Unknown, null); | 1993 | this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Package, id, ComplexReferenceChildType.Unknown, null); |
1940 | break; | 1994 | break; |
1941 | case "ExitCode": | 1995 | case "ExitCode": |
1942 | allowed = (packageType == WixBundlePackageType.Exe); | 1996 | allowed = (packageType == WixBundlePackageType.Exe); |
@@ -1975,60 +2029,60 @@ namespace WixToolset.Core | |||
1975 | if (!this.Core.EncounteredError) | 2029 | if (!this.Core.EncounteredError) |
1976 | { | 2030 | { |
1977 | // We create the package contents as a payload with this package as the parent | 2031 | // We create the package contents as a payload with this package as the parent |
1978 | this.CreatePayloadRow(sourceLineNumbers, id, name, sourceFile, downloadUrl, ComplexReferenceParentType.Package, id.Id, | 2032 | this.CreatePayloadRow(sourceLineNumbers, id, name, sourceFile, downloadUrl, ComplexReferenceParentType.Package, id, |
1979 | ComplexReferenceChildType.Unknown, null, compressed, enableSignatureVerification, displayName, description, remotePayload); | 2033 | ComplexReferenceChildType.Unknown, null, compressed, enableSignatureVerification, displayName, description, remotePayload); |
1980 | 2034 | ||
1981 | var chainItemRow = (WixChainItemTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixChainItem, id); | 2035 | this.Core.AddTuple(new WixChainItemTuple(sourceLineNumbers, id)); |
1982 | 2036 | ||
1983 | WixBundlePackageAttributes attributes = 0; | 2037 | WixBundlePackageAttributes attributes = 0; |
1984 | attributes |= (YesNoType.Yes == permanent) ? WixBundlePackageAttributes.Permanent : 0; | 2038 | attributes |= (YesNoType.Yes == permanent) ? WixBundlePackageAttributes.Permanent : 0; |
1985 | attributes |= (YesNoType.Yes == visible) ? WixBundlePackageAttributes.Visible : 0; | 2039 | attributes |= (YesNoType.Yes == visible) ? WixBundlePackageAttributes.Visible : 0; |
1986 | 2040 | ||
1987 | var chainPackageRow = (WixBundlePackageTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundlePackage, id); | 2041 | var chainPackageTuple = new WixBundlePackageTuple(sourceLineNumbers, id) |
1988 | chainPackageRow.Type = packageType; | 2042 | { |
1989 | chainPackageRow.Payload_ = id.Id; | 2043 | Type = packageType, |
1990 | chainPackageRow.Attributes = attributes; | 2044 | Payload_ = id.Id, |
1991 | 2045 | Attributes = attributes, | |
1992 | chainPackageRow.InstallCondition = installCondition; | 2046 | InstallCondition = installCondition, |
2047 | CacheId = cacheId, | ||
2048 | LogPathVariable = logPathVariable, | ||
2049 | RollbackLogPathVariable = rollbackPathVariable, | ||
2050 | }; | ||
1993 | 2051 | ||
1994 | if (YesNoAlwaysType.NotSet != cache) | 2052 | if (YesNoAlwaysType.NotSet != cache) |
1995 | { | 2053 | { |
1996 | chainPackageRow.Cache = cache; | 2054 | chainPackageTuple.Cache = cache; |
1997 | } | 2055 | } |
1998 | 2056 | ||
1999 | chainPackageRow.CacheId = cacheId; | ||
2000 | |||
2001 | if (YesNoType.NotSet != vital) | 2057 | if (YesNoType.NotSet != vital) |
2002 | { | 2058 | { |
2003 | chainPackageRow.Vital = (vital == YesNoType.Yes); | 2059 | chainPackageTuple.Vital = (vital == YesNoType.Yes); |
2004 | } | 2060 | } |
2005 | 2061 | ||
2006 | if (YesNoDefaultType.NotSet != perMachine) | 2062 | if (YesNoDefaultType.NotSet != perMachine) |
2007 | { | 2063 | { |
2008 | chainPackageRow.PerMachine = perMachine; | 2064 | chainPackageTuple.PerMachine = perMachine; |
2009 | } | 2065 | } |
2010 | 2066 | ||
2011 | chainPackageRow.LogPathVariable = logPathVariable; | ||
2012 | chainPackageRow.RollbackLogPathVariable = rollbackPathVariable; | ||
2013 | |||
2014 | if (CompilerConstants.IntegerNotSet != installSize) | 2067 | if (CompilerConstants.IntegerNotSet != installSize) |
2015 | { | 2068 | { |
2016 | chainPackageRow.InstallSize = installSize; | 2069 | chainPackageTuple.InstallSize = installSize; |
2017 | } | 2070 | } |
2018 | 2071 | ||
2072 | this.Core.AddTuple(chainPackageTuple); | ||
2073 | |||
2019 | switch (packageType) | 2074 | switch (packageType) |
2020 | { | 2075 | { |
2021 | case WixBundlePackageType.Exe: | 2076 | case WixBundlePackageType.Exe: |
2022 | WixBundleExePackageAttributes exeAttributes = 0; | 2077 | this.Core.AddTuple(new WixBundleExePackageTuple(sourceLineNumbers, id) |
2023 | exeAttributes |= (YesNoType.Yes == repairable) ? WixBundleExePackageAttributes.Repairable : 0; | 2078 | { |
2024 | 2079 | Attributes = (YesNoType.Yes == repairable) ? WixBundleExePackageAttributes.Repairable : 0, | |
2025 | var exeRow = (WixBundleExePackageTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleExePackage, id); | 2080 | DetectCondition = detectCondition, |
2026 | exeRow.Attributes = exeAttributes; | 2081 | InstallCommand = installCommand, |
2027 | exeRow.DetectCondition = detectCondition; | 2082 | RepairCommand = repairCommand, |
2028 | exeRow.InstallCommand = installCommand; | 2083 | UninstallCommand = uninstallCommand, |
2029 | exeRow.RepairCommand = repairCommand; | 2084 | ExeProtocol = protocol |
2030 | exeRow.UninstallCommand = uninstallCommand; | 2085 | }); |
2031 | exeRow.ExeProtocol = protocol; | ||
2032 | break; | 2086 | break; |
2033 | 2087 | ||
2034 | case WixBundlePackageType.Msi: | 2088 | case WixBundlePackageType.Msi: |
@@ -2038,8 +2092,10 @@ namespace WixToolset.Core | |||
2038 | msiAttributes |= (YesNoType.Yes == forcePerMachine) ? WixBundleMsiPackageAttributes.ForcePerMachine : 0; | 2092 | msiAttributes |= (YesNoType.Yes == forcePerMachine) ? WixBundleMsiPackageAttributes.ForcePerMachine : 0; |
2039 | msiAttributes |= (YesNoType.Yes == suppressLooseFilePayloadGeneration) ? WixBundleMsiPackageAttributes.SuppressLooseFilePayloadGeneration : 0; | 2093 | msiAttributes |= (YesNoType.Yes == suppressLooseFilePayloadGeneration) ? WixBundleMsiPackageAttributes.SuppressLooseFilePayloadGeneration : 0; |
2040 | 2094 | ||
2041 | var msiRow = (WixBundleMsiPackageTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleMsiPackage, id); | 2095 | this.Core.AddTuple(new WixBundleMsiPackageTuple(sourceLineNumbers, id) |
2042 | msiRow.Attributes = msiAttributes; | 2096 | { |
2097 | Attributes = msiAttributes | ||
2098 | }); | ||
2043 | break; | 2099 | break; |
2044 | 2100 | ||
2045 | case WixBundlePackageType.Msp: | 2101 | case WixBundlePackageType.Msp: |
@@ -2047,14 +2103,18 @@ namespace WixToolset.Core | |||
2047 | mspAttributes |= (YesNoType.Yes == displayInternalUI) ? WixBundleMspPackageAttributes.DisplayInternalUI : 0; | 2103 | mspAttributes |= (YesNoType.Yes == displayInternalUI) ? WixBundleMspPackageAttributes.DisplayInternalUI : 0; |
2048 | mspAttributes |= (YesNoType.Yes == slipstream) ? WixBundleMspPackageAttributes.Slipstream : 0; | 2104 | mspAttributes |= (YesNoType.Yes == slipstream) ? WixBundleMspPackageAttributes.Slipstream : 0; |
2049 | 2105 | ||
2050 | var mspRow = (WixBundleMspPackageTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleMspPackage, id); | 2106 | this.Core.AddTuple(new WixBundleMspPackageTuple(sourceLineNumbers, id) |
2051 | mspRow.Attributes = mspAttributes; | 2107 | { |
2108 | Attributes = mspAttributes | ||
2109 | }); | ||
2052 | break; | 2110 | break; |
2053 | 2111 | ||
2054 | case WixBundlePackageType.Msu: | 2112 | case WixBundlePackageType.Msu: |
2055 | var msuRow = (WixBundleMsuPackageTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleMsuPackage, id); | 2113 | this.Core.AddTuple(new WixBundleMsuPackageTuple(sourceLineNumbers, id) |
2056 | msuRow.DetectCondition = detectCondition; | 2114 | { |
2057 | msuRow.MsuKB = msuKB; | 2115 | DetectCondition = detectCondition, |
2116 | MsuKB = msuKB | ||
2117 | }); | ||
2058 | break; | 2118 | break; |
2059 | } | 2119 | } |
2060 | 2120 | ||
@@ -2114,12 +2174,14 @@ namespace WixToolset.Core | |||
2114 | 2174 | ||
2115 | if (!this.Core.EncounteredError) | 2175 | if (!this.Core.EncounteredError) |
2116 | { | 2176 | { |
2117 | var row = (WixBundlePackageCommandLineTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundlePackageCommandLine); | 2177 | this.Core.AddTuple(new WixBundlePackageCommandLineTuple(sourceLineNumbers) |
2118 | row.WixBundlePackage_ = packageId; | 2178 | { |
2119 | row.InstallArgument = installArgument; | 2179 | WixBundlePackage_ = packageId, |
2120 | row.UninstallArgument = uninstallArgument; | 2180 | InstallArgument = installArgument, |
2121 | row.RepairArgument = repairArgument; | 2181 | UninstallArgument = uninstallArgument, |
2122 | row.Condition = condition; | 2182 | RepairArgument = repairArgument, |
2183 | Condition = condition | ||
2184 | }); | ||
2123 | } | 2185 | } |
2124 | } | 2186 | } |
2125 | 2187 | ||
@@ -2204,7 +2266,7 @@ namespace WixToolset.Core | |||
2204 | 2266 | ||
2205 | if (!this.Core.EncounteredError) | 2267 | if (!this.Core.EncounteredError) |
2206 | { | 2268 | { |
2207 | this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundlePackageGroup, id); | 2269 | this.Core.AddTuple(new WixBundlePackageGroupTuple(sourceLineNumbers, id)); |
2208 | } | 2270 | } |
2209 | } | 2271 | } |
2210 | 2272 | ||
@@ -2299,19 +2361,22 @@ namespace WixToolset.Core | |||
2299 | /// <param name="previousId">Identifier of previous item, if any.</param> | 2361 | /// <param name="previousId">Identifier of previous item, if any.</param> |
2300 | private void CreateRollbackBoundary(SourceLineNumber sourceLineNumbers, Identifier id, YesNoType vital, YesNoType transaction, ComplexReferenceParentType parentType, string parentId, ComplexReferenceChildType previousType, string previousId) | 2362 | private void CreateRollbackBoundary(SourceLineNumber sourceLineNumbers, Identifier id, YesNoType vital, YesNoType transaction, ComplexReferenceParentType parentType, string parentId, ComplexReferenceChildType previousType, string previousId) |
2301 | { | 2363 | { |
2302 | var row = (WixChainItemTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixChainItem, id); | 2364 | this.Core.AddTuple(new WixChainItemTuple(sourceLineNumbers, id)); |
2303 | 2365 | ||
2304 | var rollbackBoundary = (WixBundleRollbackBoundaryTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleRollbackBoundary, id); | 2366 | var rollbackBoundary = new WixBundleRollbackBoundaryTuple(sourceLineNumbers, id); |
2305 | 2367 | ||
2306 | if (YesNoType.NotSet != vital) | 2368 | if (YesNoType.NotSet != vital) |
2307 | { | 2369 | { |
2308 | rollbackBoundary.Vital = (vital == YesNoType.Yes); | 2370 | rollbackBoundary.Vital = (vital == YesNoType.Yes); |
2309 | } | 2371 | } |
2372 | |||
2310 | if (YesNoType.NotSet != transaction) | 2373 | if (YesNoType.NotSet != transaction) |
2311 | { | 2374 | { |
2312 | rollbackBoundary.Transaction = (transaction == YesNoType.Yes); | 2375 | rollbackBoundary.Transaction = (transaction == YesNoType.Yes); |
2313 | } | 2376 | } |
2314 | 2377 | ||
2378 | this.Core.AddTuple(rollbackBoundary); | ||
2379 | |||
2315 | this.CreateChainPackageMetaRows(sourceLineNumbers, parentType, parentId, ComplexReferenceChildType.Package, id.Id, previousType, previousId, null); | 2380 | this.CreateChainPackageMetaRows(sourceLineNumbers, parentType, parentId, ComplexReferenceChildType.Package, id.Id, previousType, previousId, null); |
2316 | } | 2381 | } |
2317 | 2382 | ||
@@ -2341,23 +2406,6 @@ namespace WixToolset.Core | |||
2341 | this.CreateGroupAndOrderingRows(sourceLineNumbers, parentType, parentId, type, id, previousType, previousId); | 2406 | this.CreateGroupAndOrderingRows(sourceLineNumbers, parentType, parentId, type, id, previousType, previousId); |
2342 | } | 2407 | } |
2343 | 2408 | ||
2344 | // TODO: Should we define our own enum for this, just to ensure there's no "cross-contamination"? | ||
2345 | // TODO: Also, we could potentially include an 'Attributes' field to track things like | ||
2346 | // 'before' vs. 'after', and explicit vs. inferred dependencies. | ||
2347 | private void CreateWixOrderingRow(SourceLineNumber sourceLineNumbers, | ||
2348 | ComplexReferenceChildType itemType, string itemId, | ||
2349 | ComplexReferenceChildType dependsOnType, string dependsOnId) | ||
2350 | { | ||
2351 | if (!this.Core.EncounteredError) | ||
2352 | { | ||
2353 | var row = this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixOrdering); | ||
2354 | row.Set(0, itemType.ToString()); | ||
2355 | row.Set(1, itemId); | ||
2356 | row.Set(2, dependsOnType.ToString()); | ||
2357 | row.Set(3, dependsOnId); | ||
2358 | } | ||
2359 | } | ||
2360 | |||
2361 | /// <summary> | 2409 | /// <summary> |
2362 | /// Parse MsiProperty element | 2410 | /// Parse MsiProperty element |
2363 | /// </summary> | 2411 | /// </summary> |
@@ -2410,15 +2458,19 @@ namespace WixToolset.Core | |||
2410 | 2458 | ||
2411 | if (!this.Core.EncounteredError) | 2459 | if (!this.Core.EncounteredError) |
2412 | { | 2460 | { |
2413 | var row = (WixBundleMsiPropertyTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleMsiProperty); | 2461 | var tuple = new WixBundleMsiPropertyTuple(sourceLineNumbers) |
2414 | row.WixBundlePackage_ = packageId; | 2462 | { |
2415 | row.Name = name; | 2463 | WixBundlePackage_ = packageId, |
2416 | row.Value = value; | 2464 | Name = name, |
2465 | Value = value | ||
2466 | }; | ||
2417 | 2467 | ||
2418 | if (!String.IsNullOrEmpty(condition)) | 2468 | if (!String.IsNullOrEmpty(condition)) |
2419 | { | 2469 | { |
2420 | row.Condition = condition; | 2470 | tuple.Condition = condition; |
2421 | } | 2471 | } |
2472 | |||
2473 | this.Core.AddTuple(tuple); | ||
2422 | } | 2474 | } |
2423 | } | 2475 | } |
2424 | 2476 | ||
@@ -2462,9 +2514,11 @@ namespace WixToolset.Core | |||
2462 | 2514 | ||
2463 | if (!this.Core.EncounteredError) | 2515 | if (!this.Core.EncounteredError) |
2464 | { | 2516 | { |
2465 | var row = (WixBundleSlipstreamMspTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleSlipstreamMsp); | 2517 | this.Core.AddTuple(new WixBundleSlipstreamMspTuple(sourceLineNumbers) |
2466 | row.WixBundlePackage_ = packageId; | 2518 | { |
2467 | row.WixBundlePackage_Msp = id; | 2519 | WixBundlePackage_ = packageId, |
2520 | WixBundlePackage_Msp = id | ||
2521 | }); | ||
2468 | } | 2522 | } |
2469 | } | 2523 | } |
2470 | 2524 | ||
@@ -2585,8 +2639,12 @@ namespace WixToolset.Core | |||
2585 | 2639 | ||
2586 | if (!this.Core.EncounteredError) | 2640 | if (!this.Core.EncounteredError) |
2587 | { | 2641 | { |
2588 | var row = this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleUpdate); | 2642 | var tuple = new WixBundleUpdateTuple(sourceLineNumbers) |
2589 | row.Set(0, location); | 2643 | { |
2644 | Location = location | ||
2645 | }; | ||
2646 | |||
2647 | this.Core.AddTuple(tuple); | ||
2590 | } | 2648 | } |
2591 | } | 2649 | } |
2592 | 2650 | ||
@@ -2698,12 +2756,15 @@ namespace WixToolset.Core | |||
2698 | 2756 | ||
2699 | if (!this.Core.EncounteredError) | 2757 | if (!this.Core.EncounteredError) |
2700 | { | 2758 | { |
2701 | var row = (WixBundleVariableTuple)this.Core.CreateRow(sourceLineNumbers, TupleDefinitionType.WixBundleVariable); | 2759 | var tuple = new WixBundleVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Private, name)) |
2702 | row.WixBundleVariable = name; | 2760 | { |
2703 | row.Value = value; | 2761 | Value = value, |
2704 | row.Type = type; | 2762 | Type = type, |
2705 | row.Hidden = hidden; | 2763 | Hidden = hidden, |
2706 | row.Persisted = persisted; | 2764 | Persisted = persisted |
2765 | }; | ||
2766 | |||
2767 | this.Core.AddTuple(tuple); | ||
2707 | } | 2768 | } |
2708 | } | 2769 | } |
2709 | 2770 | ||