diff options
16 files changed, 670 insertions, 116 deletions
diff --git a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs index 724dd7ff..12a530ae 100644 --- a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs +++ b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs | |||
@@ -180,12 +180,17 @@ namespace WixToolset.Core.Burn | |||
180 | 180 | ||
181 | IDictionary<string, PackageFacade> facades; | 181 | IDictionary<string, PackageFacade> facades; |
182 | { | 182 | { |
183 | var command = new GetPackageFacadesCommand(chainPackageSymbols, section); | 183 | var command = new GetPackageFacadesCommand(this.Messaging, chainPackageSymbols, section); |
184 | command.Execute(); | 184 | command.Execute(); |
185 | 185 | ||
186 | facades = command.PackageFacades; | 186 | facades = command.PackageFacades; |
187 | } | 187 | } |
188 | 188 | ||
189 | if (this.Messaging.EncounteredError) | ||
190 | { | ||
191 | return; | ||
192 | } | ||
193 | |||
189 | // Process each package facade. Note this is likely to add payloads and other symbols so | 194 | // Process each package facade. Note this is likely to add payloads and other symbols so |
190 | // note that any indexes created above may be out of date now. | 195 | // note that any indexes created above may be out of date now. |
191 | foreach (var facade in facades.Values) | 196 | foreach (var facade in facades.Values) |
diff --git a/src/WixToolset.Core.Burn/Bind/GenerateManifestDataFromIRCommand.cs b/src/WixToolset.Core.Burn/Bind/GenerateManifestDataFromIRCommand.cs index 36ced6cf..d4a69513 100644 --- a/src/WixToolset.Core.Burn/Bind/GenerateManifestDataFromIRCommand.cs +++ b/src/WixToolset.Core.Burn/Bind/GenerateManifestDataFromIRCommand.cs | |||
@@ -66,12 +66,16 @@ namespace WixToolset.Core.Burn.Bind | |||
66 | case SymbolDefinitionType.WixBundleContainer: | 66 | case SymbolDefinitionType.WixBundleContainer: |
67 | case SymbolDefinitionType.WixBundleCustomDataAttribute: | 67 | case SymbolDefinitionType.WixBundleCustomDataAttribute: |
68 | case SymbolDefinitionType.WixBundleExePackage: | 68 | case SymbolDefinitionType.WixBundleExePackage: |
69 | case SymbolDefinitionType.WixBundleExePackagePayload: | ||
69 | case SymbolDefinitionType.WixBundleExtension: | 70 | case SymbolDefinitionType.WixBundleExtension: |
70 | case SymbolDefinitionType.WixBundleMsiFeature: | 71 | case SymbolDefinitionType.WixBundleMsiFeature: |
71 | case SymbolDefinitionType.WixBundleMsiPackage: | 72 | case SymbolDefinitionType.WixBundleMsiPackage: |
73 | case SymbolDefinitionType.WixBundleMsiPackagePayload: | ||
72 | case SymbolDefinitionType.WixBundleMsiProperty: | 74 | case SymbolDefinitionType.WixBundleMsiProperty: |
73 | case SymbolDefinitionType.WixBundleMspPackage: | 75 | case SymbolDefinitionType.WixBundleMspPackage: |
76 | case SymbolDefinitionType.WixBundleMspPackagePayload: | ||
74 | case SymbolDefinitionType.WixBundleMsuPackage: | 77 | case SymbolDefinitionType.WixBundleMsuPackage: |
78 | case SymbolDefinitionType.WixBundleMsuPackagePayload: | ||
75 | case SymbolDefinitionType.WixBundlePackage: | 79 | case SymbolDefinitionType.WixBundlePackage: |
76 | case SymbolDefinitionType.WixBundlePackageCommandLine: | 80 | case SymbolDefinitionType.WixBundlePackageCommandLine: |
77 | case SymbolDefinitionType.WixBundlePackageExitCode: | 81 | case SymbolDefinitionType.WixBundlePackageExitCode: |
diff --git a/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs b/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs index 3bc6bf1b..1559a646 100644 --- a/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs +++ b/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs | |||
@@ -564,15 +564,16 @@ namespace WixToolset.Core.Burn.Bundles | |||
564 | } | 564 | } |
565 | 565 | ||
566 | // Write any contained Payloads with the PackagePayload being first | 566 | // Write any contained Payloads with the PackagePayload being first |
567 | var packagePayloadId = package.PackageSymbol.PayloadRef; | ||
567 | writer.WriteStartElement("PayloadRef"); | 568 | writer.WriteStartElement("PayloadRef"); |
568 | writer.WriteAttributeString("Id", package.PackageSymbol.PayloadRef); | 569 | writer.WriteAttributeString("Id", packagePayloadId); |
569 | writer.WriteEndElement(); | 570 | writer.WriteEndElement(); |
570 | 571 | ||
571 | var packagePayloads = payloadsByPackage[package.PackageId]; | 572 | var packagePayloads = payloadsByPackage[package.PackageId]; |
572 | 573 | ||
573 | foreach (var payload in packagePayloads) | 574 | foreach (var payload in packagePayloads) |
574 | { | 575 | { |
575 | if (payload.Id.Id != package.PackageSymbol.PayloadRef) | 576 | if (payload.Id.Id != packagePayloadId) |
576 | { | 577 | { |
577 | writer.WriteStartElement("PayloadRef"); | 578 | writer.WriteStartElement("PayloadRef"); |
578 | writer.WriteAttributeString("Id", payload.Id.Id); | 579 | writer.WriteAttributeString("Id", payload.Id.Id); |
diff --git a/src/WixToolset.Core.Burn/Bundles/GetPackageFacadesCommand.cs b/src/WixToolset.Core.Burn/Bundles/GetPackageFacadesCommand.cs index 24d1e8d8..dacff364 100644 --- a/src/WixToolset.Core.Burn/Bundles/GetPackageFacadesCommand.cs +++ b/src/WixToolset.Core.Burn/Bundles/GetPackageFacadesCommand.cs | |||
@@ -6,17 +6,21 @@ namespace WixToolset.Core.Burn.Bundles | |||
6 | using System.Linq; | 6 | using System.Linq; |
7 | using WixToolset.Data; | 7 | using WixToolset.Data; |
8 | using WixToolset.Data.Symbols; | 8 | using WixToolset.Data.Symbols; |
9 | using WixToolset.Extensibility.Services; | ||
9 | 10 | ||
10 | internal class GetPackageFacadesCommand | 11 | internal class GetPackageFacadesCommand |
11 | { | 12 | { |
12 | public GetPackageFacadesCommand(IEnumerable<WixBundlePackageSymbol> chainPackageSymbols, IntermediateSection section) | 13 | public GetPackageFacadesCommand(IMessaging messaging, IEnumerable<WixBundlePackageSymbol> chainPackageSymbols, IntermediateSection section) |
13 | { | 14 | { |
15 | this.Messaging = messaging; | ||
14 | this.ChainPackageSymbols = chainPackageSymbols; | 16 | this.ChainPackageSymbols = chainPackageSymbols; |
15 | this.Section = section; | 17 | this.Section = section; |
16 | } | 18 | } |
17 | 19 | ||
18 | private IEnumerable<WixBundlePackageSymbol> ChainPackageSymbols { get; } | 20 | private IEnumerable<WixBundlePackageSymbol> ChainPackageSymbols { get; } |
19 | 21 | ||
22 | private IMessaging Messaging { get; } | ||
23 | |||
20 | private IntermediateSection Section { get; } | 24 | private IntermediateSection Section { get; } |
21 | 25 | ||
22 | public IDictionary<string, PackageFacade> PackageFacades { get; private set; } | 26 | public IDictionary<string, PackageFacade> PackageFacades { get; private set; } |
@@ -27,12 +31,101 @@ namespace WixToolset.Core.Burn.Bundles | |||
27 | var msiPackages = this.Section.Symbols.OfType<WixBundleMsiPackageSymbol>().ToDictionary(t => t.Id.Id); | 31 | var msiPackages = this.Section.Symbols.OfType<WixBundleMsiPackageSymbol>().ToDictionary(t => t.Id.Id); |
28 | var mspPackages = this.Section.Symbols.OfType<WixBundleMspPackageSymbol>().ToDictionary(t => t.Id.Id); | 32 | var mspPackages = this.Section.Symbols.OfType<WixBundleMspPackageSymbol>().ToDictionary(t => t.Id.Id); |
29 | var msuPackages = this.Section.Symbols.OfType<WixBundleMsuPackageSymbol>().ToDictionary(t => t.Id.Id); | 33 | var msuPackages = this.Section.Symbols.OfType<WixBundleMsuPackageSymbol>().ToDictionary(t => t.Id.Id); |
34 | var exePackagePayloads = this.Section.Symbols.OfType<WixBundleExePackagePayloadSymbol>().ToDictionary(t => t.Id.Id); | ||
35 | var msiPackagePayloads = this.Section.Symbols.OfType<WixBundleMsiPackagePayloadSymbol>().ToDictionary(t => t.Id.Id); | ||
36 | var mspPackagePayloads = this.Section.Symbols.OfType<WixBundleMspPackagePayloadSymbol>().ToDictionary(t => t.Id.Id); | ||
37 | var msuPackagePayloads = this.Section.Symbols.OfType<WixBundleMsuPackagePayloadSymbol>().ToDictionary(t => t.Id.Id); | ||
30 | 38 | ||
31 | var facades = new Dictionary<string, PackageFacade>(); | 39 | var facades = new Dictionary<string, PackageFacade>(); |
32 | 40 | ||
33 | foreach (var package in this.ChainPackageSymbols) | 41 | foreach (var package in this.ChainPackageSymbols) |
34 | { | 42 | { |
35 | var id = package.Id.Id; | 43 | var id = package.Id.Id; |
44 | |||
45 | IntermediateSymbol packagePayload = null; | ||
46 | foreach (var wixGroup in this.Section.Symbols.OfType<WixGroupSymbol>().Where(g => g.ParentType == ComplexReferenceParentType.Package && g.ParentId == id)) | ||
47 | { | ||
48 | if (wixGroup.ChildType == ComplexReferenceChildType.PackagePayload) | ||
49 | { | ||
50 | IntermediateSymbol tempPackagePayload = null; | ||
51 | if (exePackagePayloads.TryGetValue(wixGroup.ChildId, out var exePackagePayload)) | ||
52 | { | ||
53 | if (package.Type == WixBundlePackageType.Exe) | ||
54 | { | ||
55 | tempPackagePayload = exePackagePayload; | ||
56 | } | ||
57 | else | ||
58 | { | ||
59 | this.Messaging.Write(ErrorMessages.PackagePayloadUnsupported(exePackagePayload.SourceLineNumbers, "Exe")); | ||
60 | this.Messaging.Write(ErrorMessages.PackagePayloadUnsupported2(package.SourceLineNumbers)); | ||
61 | } | ||
62 | } | ||
63 | else if (msiPackagePayloads.TryGetValue(wixGroup.ChildId, out var msiPackagePayload)) | ||
64 | { | ||
65 | if (package.Type == WixBundlePackageType.Msi) | ||
66 | { | ||
67 | tempPackagePayload = msiPackagePayload; | ||
68 | } | ||
69 | else | ||
70 | { | ||
71 | this.Messaging.Write(ErrorMessages.PackagePayloadUnsupported(msiPackagePayload.SourceLineNumbers, "Msi")); | ||
72 | this.Messaging.Write(ErrorMessages.PackagePayloadUnsupported2(package.SourceLineNumbers)); | ||
73 | } | ||
74 | } | ||
75 | else if (mspPackagePayloads.TryGetValue(wixGroup.ChildId, out var mspPackagePayload)) | ||
76 | { | ||
77 | if (package.Type == WixBundlePackageType.Msp) | ||
78 | { | ||
79 | tempPackagePayload = mspPackagePayload; | ||
80 | } | ||
81 | else | ||
82 | { | ||
83 | this.Messaging.Write(ErrorMessages.PackagePayloadUnsupported(mspPackagePayload.SourceLineNumbers, "Msp")); | ||
84 | this.Messaging.Write(ErrorMessages.PackagePayloadUnsupported2(package.SourceLineNumbers)); | ||
85 | } | ||
86 | } | ||
87 | else if (msuPackagePayloads.TryGetValue(wixGroup.ChildId, out var msuPackagePayload)) | ||
88 | { | ||
89 | if (package.Type == WixBundlePackageType.Msu) | ||
90 | { | ||
91 | tempPackagePayload = msuPackagePayload; | ||
92 | } | ||
93 | else | ||
94 | { | ||
95 | this.Messaging.Write(ErrorMessages.PackagePayloadUnsupported(msuPackagePayload.SourceLineNumbers, "Msu")); | ||
96 | this.Messaging.Write(ErrorMessages.PackagePayloadUnsupported2(package.SourceLineNumbers)); | ||
97 | } | ||
98 | } | ||
99 | else | ||
100 | { | ||
101 | this.Messaging.Write(ErrorMessages.IdentifierNotFound(package.Type + "PackagePayload", wixGroup.ChildId)); | ||
102 | } | ||
103 | |||
104 | if (tempPackagePayload != null) | ||
105 | { | ||
106 | if (packagePayload == null) | ||
107 | { | ||
108 | packagePayload = tempPackagePayload; | ||
109 | } | ||
110 | else | ||
111 | { | ||
112 | this.Messaging.Write(ErrorMessages.MultiplePackagePayloads(tempPackagePayload.SourceLineNumbers, id, packagePayload.Id.Id, tempPackagePayload.Id.Id)); | ||
113 | this.Messaging.Write(ErrorMessages.MultiplePackagePayloads2(packagePayload.SourceLineNumbers)); | ||
114 | this.Messaging.Write(ErrorMessages.MultiplePackagePayloads3(package.SourceLineNumbers)); | ||
115 | } | ||
116 | } | ||
117 | } | ||
118 | } | ||
119 | |||
120 | if (packagePayload == null) | ||
121 | { | ||
122 | this.Messaging.Write(ErrorMessages.MissingPackagePayload(package.SourceLineNumbers, id, package.Type.ToString())); | ||
123 | } | ||
124 | else | ||
125 | { | ||
126 | package.PayloadRef = packagePayload.Id.Id; | ||
127 | } | ||
128 | |||
36 | switch (package.Type) | 129 | switch (package.Type) |
37 | { | 130 | { |
38 | case WixBundlePackageType.Exe: | 131 | case WixBundlePackageType.Exe: |
@@ -40,6 +133,10 @@ namespace WixToolset.Core.Burn.Bundles | |||
40 | { | 133 | { |
41 | facades.Add(id, new PackageFacade(package, exePackage)); | 134 | facades.Add(id, new PackageFacade(package, exePackage)); |
42 | } | 135 | } |
136 | else | ||
137 | { | ||
138 | this.Messaging.Write(ErrorMessages.IdentifierNotFound("WixBundleExePackage", id)); | ||
139 | } | ||
43 | break; | 140 | break; |
44 | 141 | ||
45 | case WixBundlePackageType.Msi: | 142 | case WixBundlePackageType.Msi: |
@@ -47,6 +144,10 @@ namespace WixToolset.Core.Burn.Bundles | |||
47 | { | 144 | { |
48 | facades.Add(id, new PackageFacade(package, msiPackage)); | 145 | facades.Add(id, new PackageFacade(package, msiPackage)); |
49 | } | 146 | } |
147 | else | ||
148 | { | ||
149 | this.Messaging.Write(ErrorMessages.IdentifierNotFound("WixBundleMsiPackage", id)); | ||
150 | } | ||
50 | break; | 151 | break; |
51 | 152 | ||
52 | case WixBundlePackageType.Msp: | 153 | case WixBundlePackageType.Msp: |
@@ -54,6 +155,10 @@ namespace WixToolset.Core.Burn.Bundles | |||
54 | { | 155 | { |
55 | facades.Add(id, new PackageFacade(package, mspPackage)); | 156 | facades.Add(id, new PackageFacade(package, mspPackage)); |
56 | } | 157 | } |
158 | else | ||
159 | { | ||
160 | this.Messaging.Write(ErrorMessages.IdentifierNotFound("WixBundleMspPackage", id)); | ||
161 | } | ||
57 | break; | 162 | break; |
58 | 163 | ||
59 | case WixBundlePackageType.Msu: | 164 | case WixBundlePackageType.Msu: |
@@ -61,6 +166,10 @@ namespace WixToolset.Core.Burn.Bundles | |||
61 | { | 166 | { |
62 | facades.Add(id, new PackageFacade(package, msuPackage)); | 167 | facades.Add(id, new PackageFacade(package, msuPackage)); |
63 | } | 168 | } |
169 | else | ||
170 | { | ||
171 | this.Messaging.Write(ErrorMessages.IdentifierNotFound("WixBundleMsuPackage", id)); | ||
172 | } | ||
64 | break; | 173 | break; |
65 | } | 174 | } |
66 | } | 175 | } |
diff --git a/src/WixToolset.Core/Compile/CompilerPayload.cs b/src/WixToolset.Core/Compile/CompilerPayload.cs index 4eda56f8..7a5fd1b2 100644 --- a/src/WixToolset.Core/Compile/CompilerPayload.cs +++ b/src/WixToolset.Core/Compile/CompilerPayload.cs | |||
@@ -23,6 +23,8 @@ namespace WixToolset.Core | |||
23 | 23 | ||
24 | public Identifier Id { get; set; } | 24 | public Identifier Id { get; set; } |
25 | 25 | ||
26 | public bool IsRemoteAllowed { get; set; } | ||
27 | |||
26 | public bool IsRequired { get; set; } = true; | 28 | public bool IsRequired { get; set; } = true; |
27 | 29 | ||
28 | public string Name { get; set; } | 30 | public string Name { get; set; } |
@@ -48,26 +50,17 @@ namespace WixToolset.Core | |||
48 | 50 | ||
49 | private SourceLineNumber SourceLineNumbers { get; } | 51 | private SourceLineNumber SourceLineNumbers { get; } |
50 | 52 | ||
51 | private void CalculateAndVerifyFields(CompilerPayload remotePayload = null) | 53 | private void CalculateAndVerifyFields() |
52 | { | 54 | { |
55 | var isRemote = this.IsRemoteAllowed && !String.IsNullOrEmpty(this.Hash); | ||
56 | |||
53 | if (String.IsNullOrEmpty(this.SourceFile)) | 57 | if (String.IsNullOrEmpty(this.SourceFile)) |
54 | { | 58 | { |
55 | if (String.IsNullOrEmpty(this.Name)) | 59 | if (!String.IsNullOrEmpty(this.Name) && !isRemote) |
56 | { | ||
57 | if (this.IsRequired) | ||
58 | { | ||
59 | this.Core.Write(ErrorMessages.ExpectedAttributesWithOtherAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "Name", "SourceFile")); | ||
60 | } | ||
61 | } | ||
62 | else if (remotePayload == null) | ||
63 | { | 60 | { |
64 | this.SourceFile = Path.Combine("SourceDir", this.Name); | 61 | this.SourceFile = Path.Combine("SourceDir", this.Name); |
65 | } | 62 | } |
66 | } | 63 | } |
67 | else if (remotePayload != null) | ||
68 | { | ||
69 | this.Core.Write(ErrorMessages.UnexpectedElementWithAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "RemotePayload", "SourceFile")); | ||
70 | } | ||
71 | else if (this.SourceFile.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) | 64 | else if (this.SourceFile.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) |
72 | { | 65 | { |
73 | if (String.IsNullOrEmpty(this.Name)) | 66 | if (String.IsNullOrEmpty(this.Name)) |
@@ -80,24 +73,67 @@ namespace WixToolset.Core | |||
80 | } | 73 | } |
81 | } | 74 | } |
82 | 75 | ||
83 | if (remotePayload != null) | 76 | if (String.IsNullOrEmpty(this.SourceFile) && !isRemote) |
84 | { | 77 | { |
85 | if (this.DownloadUrl == null) | 78 | if (this.IsRequired) |
86 | { | 79 | { |
87 | this.Core.Write(ErrorMessages.ExpectedAttributeWithElement(this.SourceLineNumbers, this.Element.Name.LocalName, "DownloadUrl", "RemotePayload")); | 80 | if (!this.IsRemoteAllowed) |
81 | { | ||
82 | this.Core.Write(ErrorMessages.ExpectedAttributes(this.SourceLineNumbers, this.Element.Name.LocalName, "Name", "SourceFile")); | ||
83 | } | ||
84 | else | ||
85 | { | ||
86 | this.Core.Write(ErrorMessages.ExpectedAttributes(this.SourceLineNumbers, this.Element.Name.LocalName, "SourceFile", "Hash")); | ||
87 | } | ||
88 | } | 88 | } |
89 | } | ||
90 | else if (this.IsRemoteAllowed) | ||
91 | { | ||
92 | var isLocal = !String.IsNullOrEmpty(this.SourceFile); | ||
89 | 93 | ||
90 | if (YesNoDefaultType.No != this.Compressed) | 94 | if (isLocal) |
95 | { | ||
96 | if (isRemote) | ||
97 | { | ||
98 | this.Core.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "Hash", "SourceFile")); | ||
99 | } | ||
100 | } | ||
101 | else | ||
91 | { | 102 | { |
103 | if (String.IsNullOrEmpty(this.DownloadUrl)) | ||
104 | { | ||
105 | this.Core.Write(ErrorMessages.ExpectedAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "DownloadUrl", "Hash")); | ||
106 | } | ||
107 | |||
108 | if (String.IsNullOrEmpty(this.Name)) | ||
109 | { | ||
110 | this.Core.Write(ErrorMessages.ExpectedAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "Name", "Hash")); | ||
111 | } | ||
112 | |||
113 | if (YesNoDefaultType.Yes == this.Compressed) | ||
114 | { | ||
115 | this.Core.Write(WarningMessages.RemotePayloadsMustNotAlsoBeCompressed(this.SourceLineNumbers, this.Element.Name.LocalName)); | ||
116 | } | ||
117 | |||
92 | this.Compressed = YesNoDefaultType.No; | 118 | this.Compressed = YesNoDefaultType.No; |
93 | this.Core.Write(WarningMessages.RemotePayloadsMustNotAlsoBeCompressed(this.SourceLineNumbers, this.Element.Name.LocalName)); | ||
94 | } | 119 | } |
95 | 120 | ||
96 | this.Description = remotePayload.Description; | 121 | VerifyValidValue("Description", !String.IsNullOrEmpty(this.Description)); |
97 | this.DisplayName = remotePayload.DisplayName; | 122 | VerifyValidValue("ProductName", !String.IsNullOrEmpty(this.ProductName)); |
98 | this.Hash = remotePayload.Hash; | 123 | VerifyValidValue("Size", this.Size.HasValue); |
99 | this.Size = remotePayload.Size; | 124 | VerifyValidValue("Version", !String.IsNullOrEmpty(this.Version)); |
100 | this.Version = remotePayload.Version; | 125 | |
126 | void VerifyValidValue(string attributeName, bool isSpecified) | ||
127 | { | ||
128 | if (isLocal && isSpecified) | ||
129 | { | ||
130 | this.Core.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, attributeName, "SourceFile")); | ||
131 | } | ||
132 | else if (!isLocal && !isSpecified) | ||
133 | { | ||
134 | this.Core.Write(ErrorMessages.ExpectedAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, attributeName, "Hash")); | ||
135 | } | ||
136 | } | ||
101 | } | 137 | } |
102 | } | 138 | } |
103 | 139 | ||
@@ -143,9 +179,9 @@ namespace WixToolset.Core | |||
143 | return symbol; | 179 | return symbol; |
144 | } | 180 | } |
145 | 181 | ||
146 | public void FinishCompilingPackage(CompilerPayload remotePayload) | 182 | public void FinishCompilingPackage() |
147 | { | 183 | { |
148 | this.CalculateAndVerifyFields(remotePayload); | 184 | this.CalculateAndVerifyFields(); |
149 | this.GenerateIdFromFilename(); | 185 | this.GenerateIdFromFilename(); |
150 | 186 | ||
151 | if (this.Id == null) | 187 | if (this.Id == null) |
@@ -155,6 +191,13 @@ namespace WixToolset.Core | |||
155 | } | 191 | } |
156 | } | 192 | } |
157 | 193 | ||
194 | public void FinishCompilingPackagePayload() | ||
195 | { | ||
196 | this.CalculateAndVerifyFields(); | ||
197 | this.GenerateIdFromFilename(); | ||
198 | this.GenerateIdFromPrefix("ppy"); | ||
199 | } | ||
200 | |||
158 | public void FinishCompilingPayload() | 201 | public void FinishCompilingPayload() |
159 | { | 202 | { |
160 | this.CalculateAndVerifyFields(); | 203 | this.CalculateAndVerifyFields(); |
diff --git a/src/WixToolset.Core/Compiler_Bundle.cs b/src/WixToolset.Core/Compiler_Bundle.cs index 64fe2acc..60db75d6 100644 --- a/src/WixToolset.Core/Compiler_Bundle.cs +++ b/src/WixToolset.Core/Compiler_Bundle.cs | |||
@@ -1451,71 +1451,6 @@ namespace WixToolset.Core | |||
1451 | return compilerPayload.Id; | 1451 | return compilerPayload.Id; |
1452 | } | 1452 | } |
1453 | 1453 | ||
1454 | private CompilerPayload ParseRemotePayloadElement(XElement node) | ||
1455 | { | ||
1456 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); | ||
1457 | var remotePayload = new CompilerPayload(this.Core, sourceLineNumbers, node); | ||
1458 | |||
1459 | foreach (var attrib in node.Attributes()) | ||
1460 | { | ||
1461 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || CompilerCore.WixNamespace == attrib.Name.Namespace) | ||
1462 | { | ||
1463 | switch (attrib.Name.LocalName) | ||
1464 | { | ||
1465 | case "Description": | ||
1466 | remotePayload.ParseDescription(attrib); | ||
1467 | break; | ||
1468 | case "Hash": | ||
1469 | remotePayload.ParseHash(attrib); | ||
1470 | break; | ||
1471 | case "ProductName": | ||
1472 | remotePayload.ParseProductName(attrib); | ||
1473 | break; | ||
1474 | case "Size": | ||
1475 | remotePayload.ParseSize(attrib); | ||
1476 | break; | ||
1477 | case "Version": | ||
1478 | remotePayload.ParseVersion(attrib); | ||
1479 | break; | ||
1480 | default: | ||
1481 | this.Core.UnexpectedAttribute(node, attrib); | ||
1482 | break; | ||
1483 | } | ||
1484 | } | ||
1485 | else | ||
1486 | { | ||
1487 | this.Core.ParseExtensionAttribute(node, attrib); | ||
1488 | } | ||
1489 | } | ||
1490 | |||
1491 | if (String.IsNullOrEmpty(remotePayload.ProductName)) | ||
1492 | { | ||
1493 | this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "ProductName")); | ||
1494 | } | ||
1495 | |||
1496 | if (String.IsNullOrEmpty(remotePayload.Description)) | ||
1497 | { | ||
1498 | this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Description")); | ||
1499 | } | ||
1500 | |||
1501 | if (String.IsNullOrEmpty(remotePayload.Hash)) | ||
1502 | { | ||
1503 | this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Hash")); | ||
1504 | } | ||
1505 | |||
1506 | if (0 == remotePayload.Size) | ||
1507 | { | ||
1508 | this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Size")); | ||
1509 | } | ||
1510 | |||
1511 | if (String.IsNullOrEmpty(remotePayload.Version)) | ||
1512 | { | ||
1513 | this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Version")); | ||
1514 | } | ||
1515 | |||
1516 | return remotePayload; | ||
1517 | } | ||
1518 | |||
1519 | /// <summary> | 1454 | /// <summary> |
1520 | /// Parse PayloadGroup element. | 1455 | /// Parse PayloadGroup element. |
1521 | /// </summary> | 1456 | /// </summary> |
@@ -1561,8 +1496,21 @@ namespace WixToolset.Core | |||
1561 | { | 1496 | { |
1562 | if (CompilerCore.WixNamespace == child.Name.Namespace) | 1497 | if (CompilerCore.WixNamespace == child.Name.Namespace) |
1563 | { | 1498 | { |
1499 | WixBundlePackageType? packageType = null; | ||
1564 | switch (child.Name.LocalName) | 1500 | switch (child.Name.LocalName) |
1565 | { | 1501 | { |
1502 | case "ExePackagePayload": | ||
1503 | packageType = WixBundlePackageType.Exe; | ||
1504 | break; | ||
1505 | case "MsiPackagePayload": | ||
1506 | packageType = WixBundlePackageType.Msi; | ||
1507 | break; | ||
1508 | case "MspPackagePayload": | ||
1509 | packageType = WixBundlePackageType.Msp; | ||
1510 | break; | ||
1511 | case "MsuPackagePayload": | ||
1512 | packageType = WixBundlePackageType.Msu; | ||
1513 | break; | ||
1566 | case "Payload": | 1514 | case "Payload": |
1567 | previousId = this.ParsePayloadElement(child, ComplexReferenceParentType.PayloadGroup, id, previousType, previousId); | 1515 | previousId = this.ParsePayloadElement(child, ComplexReferenceParentType.PayloadGroup, id, previousType, previousId); |
1568 | previousType = ComplexReferenceChildType.Payload; | 1516 | previousType = ComplexReferenceChildType.Payload; |
@@ -1575,6 +1523,19 @@ namespace WixToolset.Core | |||
1575 | this.Core.UnexpectedElement(node, child); | 1523 | this.Core.UnexpectedElement(node, child); |
1576 | break; | 1524 | break; |
1577 | } | 1525 | } |
1526 | |||
1527 | if (packageType.HasValue) | ||
1528 | { | ||
1529 | var compilerPayload = this.ParsePackagePayloadElement(null, child, packageType.Value, null); | ||
1530 | var payloadSymbol = compilerPayload.CreatePayloadSymbol(ComplexReferenceParentType.PayloadGroup, id?.Id, previousType, previousId?.Id); | ||
1531 | if (payloadSymbol != null) | ||
1532 | { | ||
1533 | previousId = payloadSymbol.Id; | ||
1534 | previousType = ComplexReferenceChildType.Payload; | ||
1535 | |||
1536 | this.CreatePackagePayloadSymbol(payloadSymbol.SourceLineNumbers, packageType.Value, payloadSymbol.Id, ComplexReferenceParentType.PayloadGroup, id); | ||
1537 | } | ||
1538 | } | ||
1578 | } | 1539 | } |
1579 | else | 1540 | else |
1580 | { | 1541 | { |
@@ -1984,7 +1945,7 @@ namespace WixToolset.Core | |||
1984 | Debug.Assert(ComplexReferenceParentType.PackageGroup == parentType); | 1945 | Debug.Assert(ComplexReferenceParentType.PackageGroup == parentType); |
1985 | Debug.Assert(ComplexReferenceChildType.Unknown == previousType || ComplexReferenceChildType.PackageGroup == previousType || ComplexReferenceChildType.Package == previousType); | 1946 | Debug.Assert(ComplexReferenceChildType.Unknown == previousType || ComplexReferenceChildType.PackageGroup == previousType || ComplexReferenceChildType.Package == previousType); |
1986 | 1947 | ||
1987 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);; | 1948 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); |
1988 | var compilerPayload = new CompilerPayload(this.Core, sourceLineNumbers, node) | 1949 | var compilerPayload = new CompilerPayload(this.Core, sourceLineNumbers, node) |
1989 | { | 1950 | { |
1990 | IsRequired = false, | 1951 | IsRequired = false, |
@@ -2008,8 +1969,9 @@ namespace WixToolset.Core | |||
2008 | string msuKB = null; | 1969 | string msuKB = null; |
2009 | var enableFeatureSelection = YesNoType.NotSet; | 1970 | var enableFeatureSelection = YesNoType.NotSet; |
2010 | var forcePerMachine = YesNoType.NotSet; | 1971 | var forcePerMachine = YesNoType.NotSet; |
2011 | CompilerPayload remotePayload = null; | 1972 | CompilerPayload childPackageCompilerPayload = null; |
2012 | var slipstream = YesNoType.NotSet; | 1973 | var slipstream = YesNoType.NotSet; |
1974 | var hasPayloadInfo = false; | ||
2013 | 1975 | ||
2014 | var expectedNetFx4Args = new string[] { "/q", "/norestart", "/chainingpackage" }; | 1976 | var expectedNetFx4Args = new string[] { "/q", "/norestart", "/chainingpackage" }; |
2015 | 1977 | ||
@@ -2029,12 +1991,15 @@ namespace WixToolset.Core | |||
2029 | break; | 1991 | break; |
2030 | case "Name": | 1992 | case "Name": |
2031 | compilerPayload.ParseName(attrib); | 1993 | compilerPayload.ParseName(attrib); |
1994 | hasPayloadInfo = true; | ||
2032 | break; | 1995 | break; |
2033 | case "SourceFile": | 1996 | case "SourceFile": |
2034 | compilerPayload.ParseSourceFile(attrib); | 1997 | compilerPayload.ParseSourceFile(attrib); |
1998 | hasPayloadInfo = true; | ||
2035 | break; | 1999 | break; |
2036 | case "DownloadUrl": | 2000 | case "DownloadUrl": |
2037 | compilerPayload.ParseDownloadUrl(attrib); | 2001 | compilerPayload.ParseDownloadUrl(attrib); |
2002 | hasPayloadInfo = true; | ||
2038 | break; | 2003 | break; |
2039 | case "After": | 2004 | case "After": |
2040 | after = this.Core.GetAttributeValue(sourceLineNumbers, attrib); | 2005 | after = this.Core.GetAttributeValue(sourceLineNumbers, attrib); |
@@ -2128,6 +2093,7 @@ namespace WixToolset.Core | |||
2128 | break; | 2093 | break; |
2129 | case "Compressed": | 2094 | case "Compressed": |
2130 | compilerPayload.ParseCompressed(attrib); | 2095 | compilerPayload.ParseCompressed(attrib); |
2096 | hasPayloadInfo = true; | ||
2131 | break; | 2097 | break; |
2132 | case "Slipstream": | 2098 | case "Slipstream": |
2133 | slipstream = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); | 2099 | slipstream = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); |
@@ -2150,26 +2116,30 @@ namespace WixToolset.Core | |||
2150 | } | 2116 | } |
2151 | } | 2117 | } |
2152 | 2118 | ||
2153 | // We need to handle RemotePayload up front because it effects value of sourceFile which is used in Id generation. Id is needed by other child elements. | 2119 | // We need to handle the package payload up front because it affects Id generation. Id is needed by other child elements. |
2154 | foreach (var child in node.Elements(CompilerCore.WixNamespace + "RemotePayload")) | 2120 | var packagePayloadElementName = packageType + "PackagePayload"; |
2121 | foreach (var child in node.Elements(CompilerCore.WixNamespace + packagePayloadElementName)) | ||
2155 | { | 2122 | { |
2156 | var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); | 2123 | var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); |
2157 | 2124 | ||
2158 | if (CompilerCore.WixNamespace == node.Name.Namespace && node.Name.LocalName != "ExePackage" && node.Name.LocalName != "MsuPackage") | 2125 | if (childPackageCompilerPayload != null) |
2159 | { | 2126 | { |
2160 | this.Core.Write(ErrorMessages.RemotePayloadUnsupported(childSourceLineNumbers)); | 2127 | this.Core.Write(ErrorMessages.TooManyChildren(childSourceLineNumbers, node.Name.LocalName, child.Name.LocalName)); |
2161 | continue; | ||
2162 | } | 2128 | } |
2163 | 2129 | else if (hasPayloadInfo) | |
2164 | if (null != remotePayload) | ||
2165 | { | 2130 | { |
2166 | this.Core.Write(ErrorMessages.TooManyChildren(childSourceLineNumbers, node.Name.LocalName, child.Name.LocalName)); | 2131 | this.Core.Write(ErrorMessages.UnexpectedElementWithAttribute(sourceLineNumbers, node.Name.LocalName, child.Name.LocalName, "SourceFile", "Name", "DownloadUrl", "Compressed")); |
2167 | } | 2132 | } |
2168 | 2133 | ||
2169 | remotePayload = this.ParseRemotePayloadElement(child); | 2134 | childPackageCompilerPayload = this.ParsePackagePayloadElement(childSourceLineNumbers, child, packageType, compilerPayload.Id); |
2135 | } | ||
2136 | |||
2137 | if (compilerPayload.Id == null && childPackageCompilerPayload != null) | ||
2138 | { | ||
2139 | compilerPayload.Id = childPackageCompilerPayload.Id; | ||
2170 | } | 2140 | } |
2171 | 2141 | ||
2172 | compilerPayload.FinishCompilingPackage(remotePayload); | 2142 | compilerPayload.FinishCompilingPackage(); |
2173 | var id = compilerPayload.Id; | 2143 | var id = compilerPayload.Id; |
2174 | 2144 | ||
2175 | if (null == logPathVariable) | 2145 | if (null == logPathVariable) |
@@ -2279,7 +2249,11 @@ namespace WixToolset.Core | |||
2279 | this.ParseCommandLineElement(child, id.Id); | 2249 | this.ParseCommandLineElement(child, id.Id); |
2280 | } | 2250 | } |
2281 | break; | 2251 | break; |
2282 | case "RemotePayload": | 2252 | case "ExePackagePayload": |
2253 | case "MsiPackagePayload": | ||
2254 | case "MspPackagePayload": | ||
2255 | case "MsuPackagePayload": | ||
2256 | allowed = packagePayloadElementName == child.Name.LocalName; | ||
2283 | // Handled previously | 2257 | // Handled previously |
2284 | break; | 2258 | break; |
2285 | default: | 2259 | default: |
@@ -2301,8 +2275,13 @@ namespace WixToolset.Core | |||
2301 | 2275 | ||
2302 | if (!this.Core.EncounteredError) | 2276 | if (!this.Core.EncounteredError) |
2303 | { | 2277 | { |
2304 | // We create the package contents as a payload with this package as the parent | 2278 | var packageCompilerPayload = childPackageCompilerPayload ?? (hasPayloadInfo ? compilerPayload : null); |
2305 | compilerPayload.CreatePayloadSymbol(ComplexReferenceParentType.Package, id.Id); | 2279 | if (packageCompilerPayload != null) |
2280 | { | ||
2281 | var payload = packageCompilerPayload.CreatePayloadSymbol(ComplexReferenceParentType.Package, id.Id); | ||
2282 | |||
2283 | this.CreatePackagePayloadSymbol(sourceLineNumbers, packageType, payload.Id, ComplexReferenceParentType.Package, id); | ||
2284 | } | ||
2306 | 2285 | ||
2307 | this.Core.AddSymbol(new WixChainItemSymbol(sourceLineNumbers, id)); | 2286 | this.Core.AddSymbol(new WixChainItemSymbol(sourceLineNumbers, id)); |
2308 | 2287 | ||
@@ -2313,7 +2292,6 @@ namespace WixToolset.Core | |||
2313 | var chainPackageSymbol = this.Core.AddSymbol(new WixBundlePackageSymbol(sourceLineNumbers, id) | 2292 | var chainPackageSymbol = this.Core.AddSymbol(new WixBundlePackageSymbol(sourceLineNumbers, id) |
2314 | { | 2293 | { |
2315 | Type = packageType, | 2294 | Type = packageType, |
2316 | PayloadRef = id.Id, | ||
2317 | Attributes = attributes, | 2295 | Attributes = attributes, |
2318 | InstallCondition = installCondition, | 2296 | InstallCondition = installCondition, |
2319 | CacheId = cacheId, | 2297 | CacheId = cacheId, |
@@ -2391,6 +2369,134 @@ namespace WixToolset.Core | |||
2391 | return id.Id; | 2369 | return id.Id; |
2392 | } | 2370 | } |
2393 | 2371 | ||
2372 | private void CreatePackagePayloadSymbol(SourceLineNumber sourceLineNumbers, WixBundlePackageType packageType, Identifier payloadId, ComplexReferenceParentType parentType, Identifier parentId) | ||
2373 | { | ||
2374 | switch (packageType) | ||
2375 | { | ||
2376 | case WixBundlePackageType.Exe: | ||
2377 | this.Core.AddSymbol(new WixBundleExePackagePayloadSymbol(sourceLineNumbers, payloadId)); | ||
2378 | break; | ||
2379 | |||
2380 | case WixBundlePackageType.Msi: | ||
2381 | this.Core.AddSymbol(new WixBundleMsiPackagePayloadSymbol(sourceLineNumbers, payloadId)); | ||
2382 | break; | ||
2383 | |||
2384 | case WixBundlePackageType.Msp: | ||
2385 | this.Core.AddSymbol(new WixBundleMspPackagePayloadSymbol(sourceLineNumbers, payloadId)); | ||
2386 | break; | ||
2387 | |||
2388 | case WixBundlePackageType.Msu: | ||
2389 | this.Core.AddSymbol(new WixBundleMsuPackagePayloadSymbol(sourceLineNumbers, payloadId)); | ||
2390 | break; | ||
2391 | } | ||
2392 | |||
2393 | this.Core.CreateGroupAndOrderingRows(sourceLineNumbers, parentType, parentId?.Id, ComplexReferenceChildType.PackagePayload, payloadId?.Id, ComplexReferenceChildType.Unknown, null); | ||
2394 | } | ||
2395 | |||
2396 | private CompilerPayload ParsePackagePayloadElement(SourceLineNumber sourceLineNumbers, XElement node, WixBundlePackageType packageType, Identifier defaultId) | ||
2397 | { | ||
2398 | sourceLineNumbers = sourceLineNumbers ?? Preprocessor.GetSourceLineNumbers(node); | ||
2399 | var compilerPayload = new CompilerPayload(this.Core, sourceLineNumbers, node) | ||
2400 | { | ||
2401 | Id = defaultId, | ||
2402 | IsRemoteAllowed = packageType == WixBundlePackageType.Exe || packageType == WixBundlePackageType.Msu, | ||
2403 | }; | ||
2404 | |||
2405 | // This list lets us evaluate extension attributes *after* all core attributes | ||
2406 | // have been parsed and dealt with, regardless of authoring order. | ||
2407 | var extensionAttributes = new List<XAttribute>(); | ||
2408 | |||
2409 | foreach (var attrib in node.Attributes()) | ||
2410 | { | ||
2411 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || CompilerCore.WixNamespace == attrib.Name.Namespace) | ||
2412 | { | ||
2413 | var allowed = true; | ||
2414 | switch (attrib.Name.LocalName) | ||
2415 | { | ||
2416 | case "Id": | ||
2417 | compilerPayload.ParseId(attrib); | ||
2418 | break; | ||
2419 | case "Compressed": | ||
2420 | compilerPayload.ParseCompressed(attrib); | ||
2421 | break; | ||
2422 | case "Name": | ||
2423 | compilerPayload.ParseName(attrib); | ||
2424 | break; | ||
2425 | case "SourceFile": | ||
2426 | compilerPayload.ParseSourceFile(attrib); | ||
2427 | break; | ||
2428 | case "DownloadUrl": | ||
2429 | compilerPayload.ParseDownloadUrl(attrib); | ||
2430 | break; | ||
2431 | case "Description": | ||
2432 | allowed = compilerPayload.IsRemoteAllowed; | ||
2433 | if (allowed) | ||
2434 | { | ||
2435 | compilerPayload.ParseDescription(attrib); | ||
2436 | } | ||
2437 | break; | ||
2438 | case "Hash": | ||
2439 | allowed = compilerPayload.IsRemoteAllowed; | ||
2440 | if (allowed) | ||
2441 | { | ||
2442 | compilerPayload.ParseHash(attrib); | ||
2443 | } | ||
2444 | break; | ||
2445 | case "ProductName": | ||
2446 | allowed = compilerPayload.IsRemoteAllowed; | ||
2447 | if (allowed) | ||
2448 | { | ||
2449 | compilerPayload.ParseProductName(attrib); | ||
2450 | } | ||
2451 | break; | ||
2452 | case "Size": | ||
2453 | allowed = compilerPayload.IsRemoteAllowed; | ||
2454 | if (allowed) | ||
2455 | { | ||
2456 | compilerPayload.ParseSize(attrib); | ||
2457 | } | ||
2458 | break; | ||
2459 | case "Version": | ||
2460 | allowed = compilerPayload.IsRemoteAllowed; | ||
2461 | if (allowed) | ||
2462 | { | ||
2463 | compilerPayload.ParseVersion(attrib); | ||
2464 | } | ||
2465 | break; | ||
2466 | default: | ||
2467 | allowed = false; | ||
2468 | break; | ||
2469 | } | ||
2470 | |||
2471 | if (!allowed) | ||
2472 | { | ||
2473 | this.Core.UnexpectedAttribute(node, attrib); | ||
2474 | } | ||
2475 | } | ||
2476 | else | ||
2477 | { | ||
2478 | this.Core.ParseExtensionAttribute(node, attrib); | ||
2479 | } | ||
2480 | } | ||
2481 | |||
2482 | compilerPayload.FinishCompilingPackagePayload(); | ||
2483 | |||
2484 | // Now that the PayloadId is known, we can parse the extension attributes. | ||
2485 | var context = new Dictionary<string, string> | ||
2486 | { | ||
2487 | ["Id"] = compilerPayload.Id.Id, | ||
2488 | }; | ||
2489 | |||
2490 | foreach (var extensionAttribute in extensionAttributes) | ||
2491 | { | ||
2492 | this.Core.ParseExtensionAttribute(node, extensionAttribute, context); | ||
2493 | } | ||
2494 | |||
2495 | this.Core.ParseForExtensionElements(node); | ||
2496 | |||
2497 | return compilerPayload; | ||
2498 | } | ||
2499 | |||
2394 | /// <summary> | 2500 | /// <summary> |
2395 | /// Parse CommandLine element. | 2501 | /// Parse CommandLine element. |
2396 | /// </summary> | 2502 | /// </summary> |
diff --git a/src/WixToolset.Core/Linker.cs b/src/WixToolset.Core/Linker.cs index e0af89ba..41e0db7d 100644 --- a/src/WixToolset.Core/Linker.cs +++ b/src/WixToolset.Core/Linker.cs | |||
@@ -1242,7 +1242,7 @@ namespace WixToolset.Core | |||
1242 | var groups = new WixGroupingOrdering(entrySection, this.Messaging); | 1242 | var groups = new WixGroupingOrdering(entrySection, this.Messaging); |
1243 | 1243 | ||
1244 | // Create UX payloads and Package payloads | 1244 | // Create UX payloads and Package payloads |
1245 | groups.UseTypes(new[] { ComplexReferenceParentType.Container, ComplexReferenceParentType.Layout, ComplexReferenceParentType.PackageGroup, ComplexReferenceParentType.PayloadGroup, ComplexReferenceParentType.Package }, new[] { ComplexReferenceChildType.PackageGroup, ComplexReferenceChildType.Package, ComplexReferenceChildType.PayloadGroup, ComplexReferenceChildType.Payload }); | 1245 | groups.UseTypes(new[] { ComplexReferenceParentType.Container, ComplexReferenceParentType.Layout, ComplexReferenceParentType.PackageGroup, ComplexReferenceParentType.PayloadGroup, ComplexReferenceParentType.Package }, new[] { ComplexReferenceChildType.PackageGroup, ComplexReferenceChildType.Package, ComplexReferenceChildType.PackagePayload, ComplexReferenceChildType.PayloadGroup, ComplexReferenceChildType.Payload }); |
1246 | groups.FlattenAndRewriteGroups(ComplexReferenceParentType.Package, false); | 1246 | groups.FlattenAndRewriteGroups(ComplexReferenceParentType.Package, false); |
1247 | groups.FlattenAndRewriteGroups(ComplexReferenceParentType.Container, false); | 1247 | groups.FlattenAndRewriteGroups(ComplexReferenceParentType.Container, false); |
1248 | groups.FlattenAndRewriteGroups(ComplexReferenceParentType.Layout, false); | 1248 | groups.FlattenAndRewriteGroups(ComplexReferenceParentType.Layout, false); |
diff --git a/src/test/WixToolsetTest.CoreIntegration/PackagePayloadFixture.cs b/src/test/WixToolsetTest.CoreIntegration/PackagePayloadFixture.cs new file mode 100644 index 00000000..77a21f61 --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/PackagePayloadFixture.cs | |||
@@ -0,0 +1,207 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolsetTest.CoreIntegration | ||
4 | { | ||
5 | using System.Collections.Generic; | ||
6 | using System.IO; | ||
7 | using System.Linq; | ||
8 | using WixBuildTools.TestSupport; | ||
9 | using WixToolset.Core.TestPackage; | ||
10 | using Xunit; | ||
11 | |||
12 | public class PackagePayloadFixture | ||
13 | { | ||
14 | [Fact] | ||
15 | public void CanSpecifyPackagePayloadInPayloadGroup() | ||
16 | { | ||
17 | var folder = TestData.Get(@"TestData"); | ||
18 | |||
19 | using (var fs = new DisposableFileSystem()) | ||
20 | { | ||
21 | var baseFolder = fs.GetFolder(); | ||
22 | var intermediateFolder = Path.Combine(baseFolder, "obj"); | ||
23 | var bundlePath = Path.Combine(baseFolder, @"bin\test.exe"); | ||
24 | var baFolderPath = Path.Combine(baseFolder, "ba"); | ||
25 | var extractFolderPath = Path.Combine(baseFolder, "extract"); | ||
26 | |||
27 | var result = WixRunner.Execute(new[] | ||
28 | { | ||
29 | "build", | ||
30 | Path.Combine(folder, "PackagePayload", "PackagePayloadInPayloadGroup.wxs"), | ||
31 | Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"), | ||
32 | "-bindpath", Path.Combine(folder, "SimpleBundle", "data"), | ||
33 | "-bindpath", Path.Combine(folder, ".Data"), | ||
34 | "-intermediateFolder", intermediateFolder, | ||
35 | "-o", bundlePath, | ||
36 | }); | ||
37 | |||
38 | result.AssertSuccess(); | ||
39 | |||
40 | Assert.True(File.Exists(bundlePath)); | ||
41 | |||
42 | var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath); | ||
43 | extractResult.AssertSuccess(); | ||
44 | |||
45 | var exePackageElements = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:ExePackage"); | ||
46 | var ignoreAttributesByElementName = new Dictionary<string, List<string>> | ||
47 | { | ||
48 | { "ExePackage", new List<string> { "CacheId", "InstallSize", "Size" } }, | ||
49 | }; | ||
50 | Assert.Equal(1, exePackageElements.Count); | ||
51 | Assert.Equal("<ExePackage Id='PackagePayloadInPayloadGroup' Cache='yes' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_PackagePayloadInPayloadGroup' RollbackLogPathVariable='WixBundleRollbackLog_PackagePayloadInPayloadGroup' DetectCondition='none' InstallArguments='' UninstallArguments='' RepairArguments='' Repairable='no'><PayloadRef Id='burn.exe' /></ExePackage>", exePackageElements[0].GetTestXml(ignoreAttributesByElementName)); | ||
52 | } | ||
53 | } | ||
54 | |||
55 | [Fact] | ||
56 | public void ErrorWhenMissingSourceFileAndHash() | ||
57 | { | ||
58 | var folder = TestData.Get(@"TestData", "PackagePayload"); | ||
59 | |||
60 | using (var fs = new DisposableFileSystem()) | ||
61 | { | ||
62 | var baseFolder = fs.GetFolder(); | ||
63 | |||
64 | var result = WixRunner.Execute(false, new[] | ||
65 | { | ||
66 | "build", | ||
67 | Path.Combine(folder, "MissingSourceFileAndHash.wxs"), | ||
68 | "-o", Path.Combine(baseFolder, "test.wixlib") | ||
69 | }); | ||
70 | |||
71 | Assert.Equal(44, result.ExitCode); | ||
72 | WixAssert.CompareLineByLine(new[] | ||
73 | { | ||
74 | "The MsuPackagePayload element's SourceFile or Hash attribute was not found; one of these is required.", | ||
75 | }, result.Messages.Select(m => m.ToString()).ToArray()); | ||
76 | } | ||
77 | } | ||
78 | |||
79 | [Fact] | ||
80 | public void ErrorWhenMissingSourceFileAndName() | ||
81 | { | ||
82 | var folder = TestData.Get(@"TestData", "PackagePayload"); | ||
83 | |||
84 | using (var fs = new DisposableFileSystem()) | ||
85 | { | ||
86 | var baseFolder = fs.GetFolder(); | ||
87 | |||
88 | var result = WixRunner.Execute(false, new[] | ||
89 | { | ||
90 | "build", | ||
91 | Path.Combine(folder, "MissingSourceFileAndName.wxs"), | ||
92 | "-o", Path.Combine(baseFolder, "test.wixlib") | ||
93 | }); | ||
94 | |||
95 | Assert.Equal(44, result.ExitCode); | ||
96 | WixAssert.CompareLineByLine(new[] | ||
97 | { | ||
98 | "The MsiPackagePayload element's Name or SourceFile attribute was not found; one of these is required.", | ||
99 | }, result.Messages.Select(m => m.ToString()).ToArray()); | ||
100 | } | ||
101 | } | ||
102 | |||
103 | [Fact] | ||
104 | public void ErrorWhenSpecifiedHash() | ||
105 | { | ||
106 | var folder = TestData.Get(@"TestData", "PackagePayload"); | ||
107 | |||
108 | using (var fs = new DisposableFileSystem()) | ||
109 | { | ||
110 | var baseFolder = fs.GetFolder(); | ||
111 | |||
112 | var result = WixRunner.Execute(new[] | ||
113 | { | ||
114 | "build", | ||
115 | Path.Combine(folder, "SpecifiedHash.wxs"), | ||
116 | "-o", Path.Combine(baseFolder, "test.wixlib") | ||
117 | }); | ||
118 | |||
119 | Assert.Equal(4, result.ExitCode); | ||
120 | WixAssert.CompareLineByLine(new[] | ||
121 | { | ||
122 | "The MspPackagePayload element contains an unexpected attribute 'Hash'.", | ||
123 | }, result.Messages.Select(m => m.ToString()).ToArray()); | ||
124 | } | ||
125 | } | ||
126 | |||
127 | [Fact] | ||
128 | public void ErrorWhenSpecifiedHashAndMissingDownloadUrl() | ||
129 | { | ||
130 | var folder = TestData.Get(@"TestData", "PackagePayload"); | ||
131 | |||
132 | using (var fs = new DisposableFileSystem()) | ||
133 | { | ||
134 | var baseFolder = fs.GetFolder(); | ||
135 | |||
136 | var result = WixRunner.Execute(new[] | ||
137 | { | ||
138 | "build", | ||
139 | Path.Combine(folder, "SpecifiedHashAndMissingDownloadUrl.wxs"), | ||
140 | "-o", Path.Combine(baseFolder, "test.wixlib") | ||
141 | }); | ||
142 | |||
143 | Assert.Equal(10, result.ExitCode); | ||
144 | WixAssert.CompareLineByLine(new[] | ||
145 | { | ||
146 | "The MsuPackagePayload/@DownloadUrl attribute was not found; it is required when attribute Hash is specified.", | ||
147 | }, result.Messages.Select(m => m.ToString()).ToArray()); | ||
148 | } | ||
149 | } | ||
150 | |||
151 | [Fact] | ||
152 | public void ErrorWhenSpecifiedSourceFileAndHash() | ||
153 | { | ||
154 | var folder = TestData.Get(@"TestData", "PackagePayload"); | ||
155 | |||
156 | using (var fs = new DisposableFileSystem()) | ||
157 | { | ||
158 | var baseFolder = fs.GetFolder(); | ||
159 | |||
160 | var result = WixRunner.Execute(new[] | ||
161 | { | ||
162 | "build", | ||
163 | Path.Combine(folder, "SpecifiedSourceFileAndHash.wxs"), | ||
164 | "-o", Path.Combine(baseFolder, "test.wixlib") | ||
165 | }); | ||
166 | |||
167 | Assert.Equal(35, result.ExitCode); | ||
168 | WixAssert.CompareLineByLine(new[] | ||
169 | { | ||
170 | "The ExePackagePayload/@Hash attribute cannot be specified when attribute SourceFile is present.", | ||
171 | }, result.Messages.Select(m => m.ToString()).ToArray()); | ||
172 | } | ||
173 | } | ||
174 | |||
175 | [Fact] | ||
176 | public void ErrorWhenWrongPackagePayloadInPayloadGroup() | ||
177 | { | ||
178 | var folder = TestData.Get(@"TestData"); | ||
179 | |||
180 | using (var fs = new DisposableFileSystem()) | ||
181 | { | ||
182 | var baseFolder = fs.GetFolder(); | ||
183 | var intermediateFolder = Path.Combine(baseFolder, "obj"); | ||
184 | var bundlePath = Path.Combine(baseFolder, @"bin\test.exe"); | ||
185 | |||
186 | var result = WixRunner.Execute(new[] | ||
187 | { | ||
188 | "build", | ||
189 | Path.Combine(folder, "PackagePayload", "WrongPackagePayloadInPayloadGroup.wxs"), | ||
190 | Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"), | ||
191 | "-bindpath", Path.Combine(folder, "SimpleBundle", "data"), | ||
192 | "-bindpath", Path.Combine(folder, ".Data"), | ||
193 | "-intermediateFolder", intermediateFolder, | ||
194 | "-o", bundlePath, | ||
195 | }); | ||
196 | |||
197 | Assert.Equal(407, result.ExitCode); | ||
198 | WixAssert.CompareLineByLine(new[] | ||
199 | { | ||
200 | "The ExePackagePayload element can only be used for ExePackages.", | ||
201 | "The location of the package related to previous error.", | ||
202 | "There is no payload defined for package 'WrongPackagePayloadInPayloadGroup'. This is specified on the MsiPackage element or a child MsiPackagePayload element.", | ||
203 | }, result.Messages.Select(m => m.ToString()).ToArray()); | ||
204 | } | ||
205 | } | ||
206 | } | ||
207 | } | ||
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/MissingSourceFileAndHash.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/MissingSourceFileAndHash.wxs new file mode 100644 index 00000000..5e1b99ff --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/MissingSourceFileAndHash.wxs | |||
@@ -0,0 +1,10 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
3 | <Fragment> | ||
4 | <PackageGroup Id="BundlePackages"> | ||
5 | <MsuPackage Id="MissingSourceFileAndHash" Permanent="yes" DetectCondition="none"> | ||
6 | <MsuPackagePayload DownloadUrl="example.com" /> | ||
7 | </MsuPackage> | ||
8 | </PackageGroup> | ||
9 | </Fragment> | ||
10 | </Wix> | ||
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/MissingSourceFileAndName.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/MissingSourceFileAndName.wxs new file mode 100644 index 00000000..f220d81a --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/MissingSourceFileAndName.wxs | |||
@@ -0,0 +1,10 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
3 | <Fragment> | ||
4 | <PackageGroup Id="BundlePackages"> | ||
5 | <MsiPackage Id="MissingSourceFileAndName"> | ||
6 | <MsiPackagePayload DownloadUrl="example.com" /> | ||
7 | </MsiPackage> | ||
8 | </PackageGroup> | ||
9 | </Fragment> | ||
10 | </Wix> | ||
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/PackagePayloadInPayloadGroup.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/PackagePayloadInPayloadGroup.wxs new file mode 100644 index 00000000..149870a4 --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/PackagePayloadInPayloadGroup.wxs | |||
@@ -0,0 +1,15 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
3 | <Fragment> | ||
4 | <PackageGroup Id="BundlePackages"> | ||
5 | <ExePackage Id="PackagePayloadInPayloadGroup" Permanent="yes" DetectCondition="none"> | ||
6 | <PayloadGroupRef Id="PackagePayloadGroup" /> | ||
7 | </ExePackage> | ||
8 | </PackageGroup> | ||
9 | </Fragment> | ||
10 | <Fragment> | ||
11 | <PayloadGroup Id="PackagePayloadGroup"> | ||
12 | <ExePackagePayload SourceFile="burn.exe" /> | ||
13 | </PayloadGroup> | ||
14 | </Fragment> | ||
15 | </Wix> | ||
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedHash.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedHash.wxs new file mode 100644 index 00000000..3c361c49 --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedHash.wxs | |||
@@ -0,0 +1,10 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
3 | <Fragment> | ||
4 | <PackageGroup Id="BundlePackages"> | ||
5 | <MspPackage Id="SpecifiedHash"> | ||
6 | <MspPackagePayload SourceFile="example.msp" DownloadUrl="example.com" Hash="abcd" /> | ||
7 | </MspPackage> | ||
8 | </PackageGroup> | ||
9 | </Fragment> | ||
10 | </Wix> | ||
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedHashAndMissingDownloadUrl.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedHashAndMissingDownloadUrl.wxs new file mode 100644 index 00000000..8e62f660 --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedHashAndMissingDownloadUrl.wxs | |||
@@ -0,0 +1,10 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
3 | <Fragment> | ||
4 | <PackageGroup Id="BundlePackages"> | ||
5 | <MsuPackage Id="SpecifiedHashAndMissingDownloadUrl" Permanent="yes" DetectCondition="none"> | ||
6 | <MsuPackagePayload Name="example.msu" Hash="abcd" Size="1" Version="1.0.0.0" ProductName="KB1234567" Description="fake msu" /> | ||
7 | </MsuPackage> | ||
8 | </PackageGroup> | ||
9 | </Fragment> | ||
10 | </Wix> | ||
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedSourceFileAndHash.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedSourceFileAndHash.wxs new file mode 100644 index 00000000..f79da874 --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedSourceFileAndHash.wxs | |||
@@ -0,0 +1,10 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
3 | <Fragment> | ||
4 | <PackageGroup Id="BundlePackages"> | ||
5 | <ExePackage Id="SpecifiedSourceFileAndHash" Permanent="yes" DetectCondition="none"> | ||
6 | <ExePackagePayload SourceFile="example.exe" Hash="abcd" /> | ||
7 | </ExePackage> | ||
8 | </PackageGroup> | ||
9 | </Fragment> | ||
10 | </Wix> | ||
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/WrongPackagePayloadInPayloadGroup.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/WrongPackagePayloadInPayloadGroup.wxs new file mode 100644 index 00000000..dda306cf --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/WrongPackagePayloadInPayloadGroup.wxs | |||
@@ -0,0 +1,15 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
3 | <Fragment> | ||
4 | <PackageGroup Id="BundlePackages"> | ||
5 | <MsiPackage Id="WrongPackagePayloadInPayloadGroup"> | ||
6 | <PayloadGroupRef Id="WrongPackagePayloadGroup" /> | ||
7 | </MsiPackage> | ||
8 | </PackageGroup> | ||
9 | </Fragment> | ||
10 | <Fragment> | ||
11 | <PayloadGroup Id="WrongPackagePayloadGroup"> | ||
12 | <ExePackagePayload SourceFile="burn.exe" /> | ||
13 | </PayloadGroup> | ||
14 | </Fragment> | ||
15 | </Wix> | ||
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/SingleExeBundle/SingleExeRemotePayload.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/SingleExeBundle/SingleExeRemotePayload.wxs index 79ba52d2..56f08ba9 100644 --- a/src/test/WixToolsetTest.CoreIntegration/TestData/SingleExeBundle/SingleExeRemotePayload.wxs +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/SingleExeBundle/SingleExeRemotePayload.wxs | |||
@@ -13,11 +13,10 @@ | |||
13 | Vital="yes" | 13 | Vital="yes" |
14 | Permanent="yes" | 14 | Permanent="yes" |
15 | Protocol="netfx4" | 15 | Protocol="netfx4" |
16 | DownloadUrl="C" | 16 | LogPathVariable="NetFx462FullLog"> |
17 | LogPathVariable="NetFx462FullLog" | 17 | <ExePackagePayload |
18 | Compressed="no" | 18 | DownloadUrl="C" |
19 | Name="NDP462-KB3151802-Web.exe"> | 19 | Name="NDP462-KB3151802-Web.exe" |
20 | <RemotePayload | ||
21 | Description="Microsoft .NET Framework 4.6.2 Setup" | 20 | Description="Microsoft .NET Framework 4.6.2 Setup" |
22 | Hash="C42E6ED280290648BBD59F664008852F4CFE4548" | 21 | Hash="C42E6ED280290648BBD59F664008852F4CFE4548" |
23 | ProductName="Microsoft .NET Framework 4.6.2" | 22 | ProductName="Microsoft .NET Framework 4.6.2" |