aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs2
-rw-r--r--src/WixToolset.Core.Burn/Bind/ResolveDownloadUrlsCommand.cs17
-rw-r--r--src/WixToolset.Core.Burn/Bundles/BurnCommon.cs3
-rw-r--r--src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs61
-rw-r--r--src/WixToolset.Core.Burn/Bundles/CreateContainerCommand.cs7
-rw-r--r--src/WixToolset.Core/Compile/CompilerPayload.cs11
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs50
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/TestData/Container/HarvestIntoAttachedContainer.wxs17
8 files changed, 110 insertions, 58 deletions
diff --git a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
index deab4d78..4a4f06f3 100644
--- a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
+++ b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
@@ -300,7 +300,7 @@ namespace WixToolset.Core.Burn
300 300
301 if (PackagingType.Embedded == payload.Packaging && String.IsNullOrEmpty(payload.EmbeddedId)) 301 if (PackagingType.Embedded == payload.Packaging && String.IsNullOrEmpty(payload.EmbeddedId))
302 { 302 {
303 payload.EmbeddedId = String.Format(CultureInfo.InvariantCulture, BurnCommon.BurnAttachedContainerEmbeddedIdFormat, payloadIndex); 303 payload.EmbeddedId = String.Format(CultureInfo.InvariantCulture, BurnCommon.BurnAuthoredContainerEmbeddedIdFormat, payloadIndex);
304 ++payloadIndex; 304 ++payloadIndex;
305 } 305 }
306 } 306 }
diff --git a/src/WixToolset.Core.Burn/Bind/ResolveDownloadUrlsCommand.cs b/src/WixToolset.Core.Burn/Bind/ResolveDownloadUrlsCommand.cs
index e41c1058..c678b114 100644
--- a/src/WixToolset.Core.Burn/Bind/ResolveDownloadUrlsCommand.cs
+++ b/src/WixToolset.Core.Burn/Bind/ResolveDownloadUrlsCommand.cs
@@ -5,6 +5,7 @@ namespace WixToolset.Core.Burn.Bind
5 using System; 5 using System;
6 using System.Collections.Generic; 6 using System.Collections.Generic;
7 using WixToolset.Data; 7 using WixToolset.Data;
8 using WixToolset.Data.Burn;
8 using WixToolset.Data.Symbols; 9 using WixToolset.Data.Symbols;
9 using WixToolset.Extensibility; 10 using WixToolset.Extensibility;
10 using WixToolset.Extensibility.Services; 11 using WixToolset.Extensibility.Services;
@@ -60,7 +61,14 @@ namespace WixToolset.Core.Burn.Bind
60 { 61 {
61 foreach (var payload in this.PayloadsById.Values) 62 foreach (var payload in this.PayloadsById.Values)
62 { 63 {
63 if (payload.Packaging == PackagingType.External) 64 if (payload.Packaging == PackagingType.Embedded && payload.ContainerRef == BurnConstants.BurnUXContainerName)
65 {
66 if (!String.IsNullOrEmpty(payload.DownloadUrl))
67 {
68 this.Messaging.Write(WarningMessages.DownloadUrlNotSupportedForBAPayloads(payload.SourceLineNumbers, payload.Id.Id));
69 }
70 }
71 else
64 { 72 {
65 var packageId = payload.ParentPackagePayloadRef; 73 var packageId = payload.ParentPackagePayloadRef;
66 var parentUrl = payload.ParentPackagePayloadRef == null ? null : this.PayloadsById[payload.ParentPackagePayloadRef].DownloadUrl; 74 var parentUrl = payload.ParentPackagePayloadRef == null ? null : this.PayloadsById[payload.ParentPackagePayloadRef].DownloadUrl;
@@ -70,13 +78,6 @@ namespace WixToolset.Core.Burn.Bind
70 payload.DownloadUrl = resolvedUrl; 78 payload.DownloadUrl = resolvedUrl;
71 } 79 }
72 } 80 }
73 else if (payload.Packaging == PackagingType.Embedded)
74 {
75 if (!String.IsNullOrEmpty(payload.DownloadUrl))
76 {
77 this.Messaging.Write(WarningMessages.DownloadUrlNotSupportedForEmbeddedPayloads(payload.SourceLineNumbers, payload.Id.Id));
78 }
79 }
80 } 81 }
81 } 82 }
82 83
diff --git a/src/WixToolset.Core.Burn/Bundles/BurnCommon.cs b/src/WixToolset.Core.Burn/Bundles/BurnCommon.cs
index ab3b7896..1eb3563a 100644
--- a/src/WixToolset.Core.Burn/Bundles/BurnCommon.cs
+++ b/src/WixToolset.Core.Burn/Bundles/BurnCommon.cs
@@ -19,8 +19,7 @@ namespace WixToolset.Core.Burn.Bundles
19 { 19 {
20 public const string BurnNamespace = "http://wixtoolset.org/schemas/v4/2008/Burn"; 20 public const string BurnNamespace = "http://wixtoolset.org/schemas/v4/2008/Burn";
21 public const string BurnUXContainerEmbeddedIdFormat = "u{0}"; 21 public const string BurnUXContainerEmbeddedIdFormat = "u{0}";
22 public const string BurnUXContainerPayloadIdFormat = "p{0}"; 22 public const string BurnAuthoredContainerEmbeddedIdFormat = "a{0}";
23 public const string BurnAttachedContainerEmbeddedIdFormat = "a{0}";
24 23
25 public const string BADataFileName = "BootstrapperApplicationData.xml"; 24 public const string BADataFileName = "BootstrapperApplicationData.xml";
26 public const string BADataNamespace = "http://wixtoolset.org/schemas/v4/BootstrapperApplicationData"; 25 public const string BADataNamespace = "http://wixtoolset.org/schemas/v4/BootstrapperApplicationData";
diff --git a/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs b/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
index db09b540..5655d23d 100644
--- a/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
+++ b/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
@@ -166,9 +166,7 @@ namespace WixToolset.Core.Burn.Bundles
166 // write the UX allPayloads... 166 // write the UX allPayloads...
167 foreach (var payload in this.UXContainerPayloads) 167 foreach (var payload in this.UXContainerPayloads)
168 { 168 {
169 writer.WriteStartElement("Payload"); 169 this.WriteBurnManifestUXPayload(writer, payload);
170 this.WriteBurnManifestPayloadAttributes(writer, payload, true, this.Payloads);
171 writer.WriteEndElement();
172 } 170 }
173 171
174 writer.WriteEndElement(); // </UX> 172 writer.WriteEndElement(); // </UX>
@@ -183,20 +181,9 @@ namespace WixToolset.Core.Burn.Bundles
183 } 181 }
184 } 182 }
185 183
186 foreach (var payload in this.Payloads.Values) 184 foreach (var payload in this.Payloads.Values.Where(p => p.ContainerRef != BurnConstants.BurnUXContainerName))
187 { 185 {
188 if (PackagingType.Embedded == payload.Packaging && BurnConstants.BurnUXContainerName != payload.ContainerRef) 186 this.WriteBurnManifestPayload(writer, payload);
189 {
190 writer.WriteStartElement("Payload");
191 this.WriteBurnManifestPayloadAttributes(writer, payload, true, this.Payloads);
192 writer.WriteEndElement();
193 }
194 else if (PackagingType.External == payload.Packaging)
195 {
196 writer.WriteStartElement("Payload");
197 this.WriteBurnManifestPayloadAttributes(writer, payload, false, this.Payloads);
198 writer.WriteEndElement();
199 }
200 } 187 }
201 188
202 foreach (var rollbackBoundary in this.RollbackBoundaries) 189 foreach (var rollbackBoundary in this.RollbackBoundaries)
@@ -654,9 +641,9 @@ namespace WixToolset.Core.Burn.Bundles
654 } 641 }
655 } 642 }
656 643
657 private void WriteBurnManifestPayloadAttributes(XmlTextWriter writer, WixBundlePayloadSymbol payload, bool embeddedOnly, Dictionary<string, WixBundlePayloadSymbol> allPayloads) 644 private void WriteBurnManifestPayload(XmlTextWriter writer, WixBundlePayloadSymbol payload)
658 { 645 {
659 Debug.Assert(!embeddedOnly || PackagingType.Embedded == payload.Packaging); 646 writer.WriteStartElement("Payload");
660 647
661 writer.WriteAttributeString("Id", payload.Id.Id); 648 writer.WriteAttributeString("Id", payload.Id.Id);
662 writer.WriteAttributeString("FilePath", payload.Name); 649 writer.WriteAttributeString("FilePath", payload.Name);
@@ -668,28 +655,46 @@ namespace WixToolset.Core.Burn.Bundles
668 writer.WriteAttributeString("LayoutOnly", "yes"); 655 writer.WriteAttributeString("LayoutOnly", "yes");
669 } 656 }
670 657
658 if (!String.IsNullOrEmpty(payload.DownloadUrl))
659 {
660 writer.WriteAttributeString("DownloadUrl", payload.DownloadUrl);
661 }
662
671 switch (payload.Packaging) 663 switch (payload.Packaging)
672 { 664 {
673 case PackagingType.Embedded: // this means it's in a container. 665 case PackagingType.Embedded: // this means it's in a container.
666 Debug.Assert(BurnConstants.BurnUXContainerName != payload.ContainerRef);
667
674 writer.WriteAttributeString("Packaging", "embedded"); 668 writer.WriteAttributeString("Packaging", "embedded");
675 writer.WriteAttributeString("SourcePath", payload.EmbeddedId); 669 writer.WriteAttributeString("SourcePath", payload.EmbeddedId);
676 670 writer.WriteAttributeString("Container", payload.ContainerRef);
677 if (BurnConstants.BurnUXContainerName != payload.ContainerRef)
678 {
679 writer.WriteAttributeString("Container", payload.ContainerRef);
680 }
681 break; 671 break;
682 672
683 case PackagingType.External: 673 case PackagingType.External:
684 if (!String.IsNullOrEmpty(payload.DownloadUrl))
685 {
686 writer.WriteAttributeString("DownloadUrl", payload.DownloadUrl);
687 }
688
689 writer.WriteAttributeString("Packaging", "external"); 674 writer.WriteAttributeString("Packaging", "external");
690 writer.WriteAttributeString("SourcePath", payload.Name); 675 writer.WriteAttributeString("SourcePath", payload.Name);
691 break; 676 break;
692 } 677 }
678
679 writer.WriteEndElement();
680 }
681
682 private void WriteBurnManifestUXPayload(XmlTextWriter writer, WixBundlePayloadSymbol payload)
683 {
684 Debug.Assert(PackagingType.Embedded == payload.Packaging);
685 Debug.Assert(BurnConstants.BurnUXContainerName == payload.ContainerRef);
686
687 writer.WriteStartElement("Payload");
688
689 // TODO: The engine should be updated to not require FileSize, Hash, or Packaging for UX payloads since the values are never used.
690 writer.WriteAttributeString("Id", payload.Id.Id);
691 writer.WriteAttributeString("FilePath", payload.Name);
692 writer.WriteAttributeString("FileSize", payload.FileSize.Value.ToString(CultureInfo.InvariantCulture));
693 writer.WriteAttributeString("Hash", payload.Hash);
694 writer.WriteAttributeString("Packaging", "embedded");
695 writer.WriteAttributeString("SourcePath", payload.EmbeddedId);
696
697 writer.WriteEndElement();
693 } 698 }
694 } 699 }
695} 700}
diff --git a/src/WixToolset.Core.Burn/Bundles/CreateContainerCommand.cs b/src/WixToolset.Core.Burn/Bundles/CreateContainerCommand.cs
index 8f361626..87a63cc3 100644
--- a/src/WixToolset.Core.Burn/Bundles/CreateContainerCommand.cs
+++ b/src/WixToolset.Core.Burn/Bundles/CreateContainerCommand.cs
@@ -44,13 +44,6 @@ namespace WixToolset.Core.Burn.Bundles
44 44
45 public void Execute() 45 public void Execute()
46 { 46 {
47 var payloadCount = this.Payloads.Count(); // The number of embedded payloads
48
49 if (!String.IsNullOrEmpty(this.ManifestFile))
50 {
51 ++payloadCount;
52 }
53
54 var cabinetPath = Path.GetFullPath(this.OutputPath); 47 var cabinetPath = Path.GetFullPath(this.OutputPath);
55 48
56 var files = new List<CabinetCompressFile>(); 49 var files = new List<CabinetCompressFile>();
diff --git a/src/WixToolset.Core/Compile/CompilerPayload.cs b/src/WixToolset.Core/Compile/CompilerPayload.cs
index 4c7e843d..3f423034 100644
--- a/src/WixToolset.Core/Compile/CompilerPayload.cs
+++ b/src/WixToolset.Core/Compile/CompilerPayload.cs
@@ -15,8 +15,6 @@ namespace WixToolset.Core
15 15
16 public string Description { get; set; } 16 public string Description { get; set; }
17 17
18 public string DisplayName { get; set; }
19
20 public string DownloadUrl { get; set; } 18 public string DownloadUrl { get; set; }
21 19
22 public string Hash { get; set; } 20 public string Hash { get; set; }
@@ -158,7 +156,7 @@ namespace WixToolset.Core
158 156
159 if (!String.IsNullOrEmpty(this.DownloadUrl)) 157 if (!String.IsNullOrEmpty(this.DownloadUrl))
160 { 158 {
161 this.Core.Write(WarningMessages.DownloadUrlNotSupportedForEmbeddedPayloads(this.SourceLineNumbers, this.Id.Id)); 159 this.Core.Write(WarningMessages.DownloadUrlNotSupportedForBAPayloads(this.SourceLineNumbers, this.Id.Id));
162 } 160 }
163 161
164 this.Compressed = YesNoDefaultType.Yes; 162 this.Compressed = YesNoDefaultType.Yes;
@@ -174,7 +172,7 @@ namespace WixToolset.Core
174 DownloadUrl = this.DownloadUrl, 172 DownloadUrl = this.DownloadUrl,
175 Compressed = (this.Compressed == YesNoDefaultType.Yes) ? true : (this.Compressed == YesNoDefaultType.No) ? (bool?)false : null, 173 Compressed = (this.Compressed == YesNoDefaultType.Yes) ? true : (this.Compressed == YesNoDefaultType.No) ? (bool?)false : null,
176 UnresolvedSourceFile = this.SourceFile, // duplicate of sourceFile but in a string column so it won't get resolved to a full path during binding. 174 UnresolvedSourceFile = this.SourceFile, // duplicate of sourceFile but in a string column so it won't get resolved to a full path during binding.
177 DisplayName = this.DisplayName ?? this.ProductName, 175 DisplayName = this.ProductName,
178 Description = this.Description, 176 Description = this.Description,
179 Hash = this.Hash, 177 Hash = this.Hash,
180 FileSize = this.Size, 178 FileSize = this.Size,
@@ -245,11 +243,6 @@ namespace WixToolset.Core
245 this.Description = this.Core.GetAttributeValue(this.SourceLineNumbers, attrib); 243 this.Description = this.Core.GetAttributeValue(this.SourceLineNumbers, attrib);
246 } 244 }
247 245
248 public void ParseDisplayName(XAttribute attrib)
249 {
250 this.DisplayName = this.Core.GetAttributeValue(this.SourceLineNumbers, attrib);
251 }
252
253 public void ParseDownloadUrl(XAttribute attrib) 246 public void ParseDownloadUrl(XAttribute attrib)
254 { 247 {
255 this.DownloadUrl = this.Core.GetAttributeValue(this.SourceLineNumbers, attrib); 248 this.DownloadUrl = this.Core.GetAttributeValue(this.SourceLineNumbers, attrib);
diff --git a/src/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs b/src/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs
index ff48ee05..dd381dfe 100644
--- a/src/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs
+++ b/src/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs
@@ -15,6 +15,50 @@ namespace WixToolsetTest.CoreIntegration
15 15
16 public class ContainerFixture 16 public class ContainerFixture
17 { 17 {
18 [Fact(Skip = "Test demonstrates failure")]
19 public void CanBuildWithCustomAttachedContainer()
20 {
21 var folder = TestData.Get(@"TestData");
22
23 using (var fs = new DisposableFileSystem())
24 {
25 var baseFolder = fs.GetFolder();
26 var intermediateFolder = Path.Combine(baseFolder, "obj");
27 var binFolder = Path.Combine(baseFolder, "bin");
28 var bundlePath = Path.Combine(binFolder, "test.exe");
29 var baFolderPath = Path.Combine(baseFolder, "ba");
30 var extractFolderPath = Path.Combine(baseFolder, "extract");
31
32 this.BuildMsis(folder, intermediateFolder, binFolder, buildToSubfolder: true);
33
34 var result = WixRunner.Execute(new[]
35 {
36 "build",
37 Path.Combine(folder, "Container", "HarvestIntoAttachedContainer.wxs"),
38 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
39 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
40 "-bindpath", binFolder,
41 "-intermediateFolder", intermediateFolder,
42 "-o", bundlePath
43 });
44
45 result.AssertSuccess();
46
47 Assert.True(File.Exists(bundlePath));
48
49 var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
50 extractResult.AssertSuccess();
51
52 var payloads = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Payload");
53 Assert.Equal(4, payloads.Count);
54 var ignoreAttributes = new Dictionary<string, List<string>> { { "Payload", new List<string> { "FileSize", "Hash" } } };
55 Assert.Equal(@"<Payload Id='FirstX64' FilePath='FirstX64\FirstX64.msi' FileSize='*' Hash='*' DownloadUrl='http://example.com//FirstX64/FirstX64/FirstX64.msi' Packaging='embedded' SourcePath='a0' Container='BundlePackages' />", payloads[0].GetTestXml(ignoreAttributes));
56 Assert.Equal(@"<Payload Id='FirstX86.msi' FilePath='FirstX86\FirstX86.msi' FileSize='*' Hash='*' DownloadUrl='http://example.com//FirstX86.msi/FirstX86/FirstX86.msi' Packaging='embedded' SourcePath='a1' Container='BundlePackages' />", payloads[1].GetTestXml(ignoreAttributes));
57 Assert.Equal(@"<Payload Id='fk1m38Cf9RZ2Bx_ipinRY6BftelU' FilePath='FirstX86\PFiles\MsiPackage\test.txt' FileSize='*' Hash='*' DownloadUrl='http://example.com/FirstX86/fk1m38Cf9RZ2Bx_ipinRY6BftelU/FirstX86/PFiles/MsiPackage/test.txt' Packaging='embedded' SourcePath='a2' Container='BundlePackages' />", payloads[2].GetTestXml(ignoreAttributes));
58 Assert.Equal(@"<Payload Id='ff2L_N_DLQ.nSUi.l8LxG14gd2V4' FilePath='FirstX64\PFiles\MsiPackage\test.txt' FileSize='*' Hash='*' DownloadUrl='http://example.com/FirstX64/ff2L_N_DLQ.nSUi.l8LxG14gd2V4/FirstX64/PFiles/MsiPackage/test.txt' Packaging='embedded' SourcePath='a3' Container='BundlePackages' />", payloads[3].GetTestXml(ignoreAttributes));
59 }
60 }
61
18 [Fact] 62 [Fact]
19 public void HarvestedPayloadsArePutInCorrectContainer() 63 public void HarvestedPayloadsArePutInCorrectContainer()
20 { 64 {
@@ -309,7 +353,7 @@ namespace WixToolsetTest.CoreIntegration
309 } 353 }
310 } 354 }
311 355
312 private void BuildMsis(string folder, string intermediateFolder, string binFolder) 356 private void BuildMsis(string folder, string intermediateFolder, string binFolder, bool buildToSubfolder = false)
313 { 357 {
314 var result = WixRunner.Execute(new[] 358 var result = WixRunner.Execute(new[]
315 { 359 {
@@ -319,7 +363,7 @@ namespace WixToolsetTest.CoreIntegration
319 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), 363 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
320 "-bindpath", Path.Combine(folder, "SingleFile", "data"), 364 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
321 "-intermediateFolder", intermediateFolder, 365 "-intermediateFolder", intermediateFolder,
322 "-o", Path.Combine(binFolder, "FirstX86.msi"), 366 "-o", Path.Combine(binFolder, buildToSubfolder ? "FirstX86" : ".", "FirstX86.msi"),
323 }); 367 });
324 368
325 result.AssertSuccess(); 369 result.AssertSuccess();
@@ -332,7 +376,7 @@ namespace WixToolsetTest.CoreIntegration
332 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), 376 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
333 "-bindpath", Path.Combine(folder, "SingleFile", "data"), 377 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
334 "-intermediateFolder", intermediateFolder, 378 "-intermediateFolder", intermediateFolder,
335 "-o", Path.Combine(binFolder, "FirstX64.msi"), 379 "-o", Path.Combine(binFolder, buildToSubfolder ? "FirstX64" : ".", "FirstX64.msi"),
336 }); 380 });
337 381
338 result.AssertSuccess(); 382 result.AssertSuccess();
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/Container/HarvestIntoAttachedContainer.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/Container/HarvestIntoAttachedContainer.wxs
new file mode 100644
index 00000000..ec757c5d
--- /dev/null
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/Container/HarvestIntoAttachedContainer.wxs
@@ -0,0 +1,17 @@
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="FirstX86">
6 <PayloadGroupRef Id="FirstX86Payloads" />
7 </MsiPackage>
8 <MsiPackage Id="FirstX64" Name="FirstX64\FirstX64.msi" SourceFile="FirstX64\" DownloadUrl="http://example.com/{0}/{1}/{2}" />
9 </PackageGroup>
10 <Container Id="BundlePackages" Type="attached">
11 <PackageGroupRef Id="BundlePackages" />
12 </Container>
13 <PayloadGroup Id="FirstX86Payloads">
14 <MsiPackagePayload Name="FirstX86\FirstX86.msi" SourceFile="FirstX86\" DownloadUrl="http://example.com/{0}/{1}/{2}" />
15 </PayloadGroup>
16 </Fragment>
17</Wix>