From 977b748b499e02f7e5226416b1cf5cfcf3842129 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Tue, 23 Mar 2021 01:21:51 -0700 Subject: Allow payloads to be shared across packages in a Bundle Fixes wixtoolset/issues#6370 --- src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs | 81 ++++++++++++++-------- ...CreateBootstrapperApplicationManifestCommand.cs | 54 +++++++++------ .../CreateBundleExtensionManifestCommand.cs | 8 +++ .../Bundles/CreateBurnManifestCommand.cs | 10 +-- .../Bundles/GetPackageFacadesCommand.cs | 3 +- .../Bundles/ProcessMsiPackageCommand.cs | 32 ++++++--- 6 files changed, 123 insertions(+), 65 deletions(-) (limited to 'src/WixToolset.Core.Burn') diff --git a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs index 7b5a3174..d154fef9 100644 --- a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs +++ b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs @@ -63,7 +63,7 @@ namespace WixToolset.Core.Burn private IEnumerable BackendExtensions { get; } - private Intermediate Output { get; } + private Intermediate Output { get; } private string OutputPath { get; } @@ -95,7 +95,7 @@ namespace WixToolset.Core.Burn var wixGroupSymbols = this.GetRequiredSymbols(); - // Ensure there is one and only one row in the WixBundle table. + // Ensure there is one and only one WixBundleSymbol. // The compiler and linker behavior should have colluded to get // this behavior. var bundleSymbol = this.GetSingleSymbol(); @@ -104,12 +104,12 @@ namespace WixToolset.Core.Burn bundleSymbol.Attributes |= WixBundleAttributes.PerMachine; // default to per-machine but the first-per user package wil flip the bundle per-user. - // Ensure there is one and only one row in the WixBootstrapperApplicationDll table. + // Ensure there is one and only one WixBootstrapperApplicationDllSymbol. // The compiler and linker behavior should have colluded to get // this behavior. var bundleApplicationDllSymbol = this.GetSingleSymbol(); - // Ensure there is one and only one row in the WixChain table. + // Ensure there is one and only one WixChainSymbol. // The compiler and linker behavior should have colluded to get // this behavior. var chainSymbol = this.GetSingleSymbol(); @@ -122,10 +122,15 @@ namespace WixToolset.Core.Burn // If there are any fields to resolve later, create the cache to populate during bind. var variableCache = this.DelayedFields.Any() ? new Dictionary(StringComparer.InvariantCultureIgnoreCase) : null; - var orderSearchesCommand = new OrderSearchesCommand(this.Messaging, section); - orderSearchesCommand.Execute(); - var orderedSearches = orderSearchesCommand.OrderedSearchFacades; - var extensionSearchSymbolsById = orderSearchesCommand.ExtensionSearchSymbolsByExtensionId; + IEnumerable orderedSearches; + IDictionary> extensionSearchSymbolsById; + { + var orderSearchesCommand = new OrderSearchesCommand(this.Messaging, section); + orderSearchesCommand.Execute(); + + orderedSearches = orderSearchesCommand.OrderedSearchFacades; + extensionSearchSymbolsById = orderSearchesCommand.ExtensionSearchSymbolsByExtensionId; + } // Extract files that come from binary .wixlibs and WixExtensions (this does not extract files from merge modules). { @@ -136,8 +141,9 @@ namespace WixToolset.Core.Burn // Get the explicit payloads. var payloadSymbols = section.Symbols.OfType().ToDictionary(t => t.Id.Id); + var packagesPayloads = RecalculatePackagesPayloads(payloadSymbols, wixGroupSymbols); - // Update explicitly authored payloads with their parent package and container (as appropriate) + // Update explicitly authored payloads with their parent container // to make it easier to gather the payloads later. foreach (var groupSymbol in wixGroupSymbols) { @@ -145,14 +151,10 @@ namespace WixToolset.Core.Burn { var payloadSymbol = payloadSymbols[groupSymbol.ChildId]; - if (ComplexReferenceParentType.Package == groupSymbol.ParentType) + if (ComplexReferenceParentType.Container == groupSymbol.ParentType) { - Debug.Assert(String.IsNullOrEmpty(payloadSymbol.PackageRef)); - payloadSymbol.PackageRef = groupSymbol.ParentId; - } - else if (ComplexReferenceParentType.Container == groupSymbol.ParentType) - { - Debug.Assert(String.IsNullOrEmpty(payloadSymbol.ContainerRef)); + // TODO: v3 didn't warn if we overwrote the payload's container. + // Should we warn now? payloadSymbol.ContainerRef = groupSymbol.ParentId; } else if (ComplexReferenceParentType.Layout == groupSymbol.ParentType) @@ -167,7 +169,7 @@ namespace WixToolset.Core.Burn // Process the explicitly authored payloads. ISet processedPayloads; { - var command = new ProcessPayloadsCommand(this.ServiceProvider, this.BackendHelper, this.PayloadHarvester, payloadSymbols.Values, bundleSymbol.DefaultPackagingType, layoutDirectory); + var command = new ProcessPayloadsCommand(this.BackendHelper, this.PayloadHarvester, payloadSymbols.Values, bundleSymbol.DefaultPackagingType, layoutDirectory); command.Execute(); fileTransfers.AddRange(command.FileTransfers); @@ -204,7 +206,7 @@ namespace WixToolset.Core.Burn case WixBundlePackageType.Msi: { - var command = new ProcessMsiPackageCommand(this.ServiceProvider, this.BackendExtensions, section, facade, payloadSymbols); + var command = new ProcessMsiPackageCommand(this.ServiceProvider, this.BackendExtensions, section, facade, packagesPayloads[facade.PackageId]); command.Execute(); if (null != variableCache) @@ -249,12 +251,13 @@ namespace WixToolset.Core.Burn // Reindex the payloads now that all the payloads (minus the manifest payloads that will be created later) // are present. payloadSymbols = section.Symbols.OfType().ToDictionary(t => t.Id.Id); + packagesPayloads = RecalculatePackagesPayloads(payloadSymbols, wixGroupSymbols); // Process the payloads that were added by processing the packages. { var toProcess = payloadSymbols.Values.Where(r => !processedPayloads.Contains(r.Id.Id)).ToList(); - var command = new ProcessPayloadsCommand(this.ServiceProvider, this.BackendHelper, this.PayloadHarvester, toProcess, bundleSymbol.DefaultPackagingType, layoutDirectory); + var command = new ProcessPayloadsCommand(this.BackendHelper, this.PayloadHarvester, toProcess, bundleSymbol.DefaultPackagingType, layoutDirectory); command.Execute(); fileTransfers.AddRange(command.FileTransfers); @@ -265,15 +268,13 @@ namespace WixToolset.Core.Burn // Set the package metadata from the payloads now that we have the complete payload information. { - var payloadsByPackageId = payloadSymbols.Values.ToLookup(p => p.PackageRef); - foreach (var facade in facades.Values) { facade.PackageSymbol.Size = 0; - var packagePayloads = payloadsByPackageId[facade.PackageId]; + var packagePayloads = packagesPayloads[facade.PackageId]; - foreach (var payload in packagePayloads) + foreach (var payload in packagePayloads.Values) { facade.PackageSymbol.Size += payload.FileSize.Value; } @@ -415,7 +416,7 @@ namespace WixToolset.Core.Burn // Generate the core-defined BA manifest tables... string baManifestPath; { - var command = new CreateBootstrapperApplicationManifestCommand(section, bundleSymbol, orderedFacades, uxPayloadIndex, payloadSymbols, this.IntermediateFolder, this.InternalBurnBackendHelper); + var command = new CreateBootstrapperApplicationManifestCommand(section, bundleSymbol, orderedFacades, uxPayloadIndex, packagesPayloads, this.IntermediateFolder, this.InternalBurnBackendHelper); command.Execute(); var baManifestPayload = command.BootstrapperApplicationManifestPayloadRow; @@ -462,7 +463,7 @@ namespace WixToolset.Core.Burn { var executableName = Path.GetFileName(this.OutputPath); - var command = new CreateBurnManifestCommand(this.Messaging, this.BackendExtensions, executableName, section, bundleSymbol, containers, chainSymbol, orderedFacades, boundaries, uxPayloads, payloadSymbols, orderedSearches, this.IntermediateFolder); + var command = new CreateBurnManifestCommand(this.Messaging, this.BackendExtensions, executableName, section, bundleSymbol, containers, chainSymbol, orderedFacades, boundaries, uxPayloads, payloadSymbols, packagesPayloads, orderedSearches, this.IntermediateFolder); command.Execute(); manifestPath = command.OutputPath; @@ -580,7 +581,7 @@ namespace WixToolset.Core.Burn if (0 == symbols.Count) { - throw new WixException(ErrorMessages.MissingBundleInformation(nameof(T))); + this.Messaging.Write(ErrorMessages.MissingBundleInformation(nameof(T))); } return symbols; @@ -592,10 +593,36 @@ namespace WixToolset.Core.Burn if (1 != symbols.Count) { - throw new WixException(ErrorMessages.MissingBundleInformation(nameof(T))); + this.Messaging.Write(ErrorMessages.MissingBundleInformation(nameof(T))); } return symbols[0]; } + + private static Dictionary> RecalculatePackagesPayloads(Dictionary payloadSymbols, IEnumerable wixGroupSymbols) + { + var packagesPayloads = new Dictionary>(); + + foreach (var groupSymbol in wixGroupSymbols) + { + if (ComplexReferenceChildType.Payload == groupSymbol.ChildType) + { + var payloadSymbol = payloadSymbols[groupSymbol.ChildId]; + + if (ComplexReferenceParentType.Package == groupSymbol.ParentType) + { + if (!packagesPayloads.TryGetValue(groupSymbol.ParentId, out var packagePayloadsById)) + { + packagePayloadsById = new Dictionary(); + packagesPayloads.Add(groupSymbol.ParentId, packagePayloadsById); + } + + packagePayloadsById.Add(payloadSymbol.Id.Id, payloadSymbol); + } + } + } + + return packagesPayloads; + } } } diff --git a/src/WixToolset.Core.Burn/Bundles/CreateBootstrapperApplicationManifestCommand.cs b/src/WixToolset.Core.Burn/Bundles/CreateBootstrapperApplicationManifestCommand.cs index 63a168a0..1fdd76da 100644 --- a/src/WixToolset.Core.Burn/Bundles/CreateBootstrapperApplicationManifestCommand.cs +++ b/src/WixToolset.Core.Burn/Bundles/CreateBootstrapperApplicationManifestCommand.cs @@ -15,13 +15,13 @@ namespace WixToolset.Core.Burn.Bundles internal class CreateBootstrapperApplicationManifestCommand { - public CreateBootstrapperApplicationManifestCommand(IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable chainPackages, int lastUXPayloadIndex, Dictionary payloadSymbols, string intermediateFolder, IInternalBurnBackendHelper internalBurnBackendHelper) + public CreateBootstrapperApplicationManifestCommand(IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable chainPackages, int lastUXPayloadIndex, Dictionary> packagesPayloads, string intermediateFolder, IInternalBurnBackendHelper internalBurnBackendHelper) { this.Section = section; this.BundleSymbol = bundleSymbol; this.ChainPackages = chainPackages; this.LastUXPayloadIndex = lastUXPayloadIndex; - this.Payloads = payloadSymbols; + this.PackagesPayloads = packagesPayloads; this.IntermediateFolder = intermediateFolder; this.InternalBurnBackendHelper = internalBurnBackendHelper; } @@ -36,7 +36,7 @@ namespace WixToolset.Core.Burn.Bundles private int LastUXPayloadIndex { get; } - private Dictionary Payloads { get; } + private Dictionary> PackagesPayloads { get; } private string IntermediateFolder { get; } @@ -98,7 +98,12 @@ namespace WixToolset.Core.Burn.Bundles { foreach (var package in this.ChainPackages) { - var packagePayload = this.Payloads[package.PackageSymbol.PayloadRef]; + if (!this.PackagesPayloads.TryGetValue(package.PackageId, out var payloads)) + { + continue; + } + + var packagePayload = payloads[package.PackageSymbol.PayloadRef]; var size = package.PackageSymbol.Size.ToString(CultureInfo.InvariantCulture); @@ -212,33 +217,36 @@ namespace WixToolset.Core.Burn.Bundles private void WritePayloadInfo(XmlTextWriter writer) { // TODO: check v3 - should this be only include package payloads or include all non-UX container payloads? - var payloadSymbols = this.Section.Symbols.OfType() - .Where(p => !String.IsNullOrEmpty(p.PackageRef)); - - foreach (var payloadSymbol in payloadSymbols) + foreach (var kvp in this.PackagesPayloads.OrderBy(kvp => kvp.Key, StringComparer.Ordinal)) { - writer.WriteStartElement("WixPayloadProperties"); + var packageId = kvp.Key; + var payloadsById = kvp.Value; - writer.WriteAttributeString("Payload", payloadSymbol.Id.Id); + foreach (var payloadSymbol in payloadsById.Values.OrderBy(p => p.Id.Id, StringComparer.Ordinal)) + { + writer.WriteStartElement("WixPayloadProperties"); - writer.WriteAttributeString("Package", payloadSymbol.PackageRef); + writer.WriteAttributeString("Package", packageId); - if (!String.IsNullOrEmpty(payloadSymbol.ContainerRef)) - { - writer.WriteAttributeString("Container", payloadSymbol.ContainerRef); - } + writer.WriteAttributeString("Payload", payloadSymbol.Id.Id); + + if (!String.IsNullOrEmpty(payloadSymbol.ContainerRef)) + { + writer.WriteAttributeString("Container", payloadSymbol.ContainerRef); + } - writer.WriteAttributeString("Name", payloadSymbol.Name); - writer.WriteAttributeString("Size", payloadSymbol.FileSize.Value.ToString(CultureInfo.InvariantCulture)); + writer.WriteAttributeString("Name", payloadSymbol.Name); + writer.WriteAttributeString("Size", payloadSymbol.FileSize.Value.ToString(CultureInfo.InvariantCulture)); - if (!String.IsNullOrEmpty(payloadSymbol.DownloadUrl)) - { - writer.WriteAttributeString("DownloadUrl", payloadSymbol.DownloadUrl); - } + if (!String.IsNullOrEmpty(payloadSymbol.DownloadUrl)) + { + writer.WriteAttributeString("DownloadUrl", payloadSymbol.DownloadUrl); + } - writer.WriteAttributeString("LayoutOnly", payloadSymbol.LayoutOnly ? "yes" : "no"); + writer.WriteAttributeString("LayoutOnly", payloadSymbol.LayoutOnly ? "yes" : "no"); - writer.WriteEndElement(); + writer.WriteEndElement(); + } } } diff --git a/src/WixToolset.Core.Burn/Bundles/CreateBundleExtensionManifestCommand.cs b/src/WixToolset.Core.Burn/Bundles/CreateBundleExtensionManifestCommand.cs index 7b5b9656..e587413e 100644 --- a/src/WixToolset.Core.Burn/Bundles/CreateBundleExtensionManifestCommand.cs +++ b/src/WixToolset.Core.Burn/Bundles/CreateBundleExtensionManifestCommand.cs @@ -68,6 +68,14 @@ namespace WixToolset.Core.Burn.Bundles { var generatedId = this.InternalBurnBackendHelper.GenerateIdentifier("ux", BurnCommon.BundleExtensionDataFileName); + this.Section.AddSymbol(new WixGroupSymbol(this.BundleSymbol.SourceLineNumbers) + { + ParentType = ComplexReferenceParentType.Container, + ParentId = BurnConstants.BurnUXContainerName, + ChildType = ComplexReferenceChildType.Payload, + ChildId = generatedId + }); + var symbol = this.Section.AddSymbol(new WixBundlePayloadSymbol(this.BundleSymbol.SourceLineNumbers, new Identifier(AccessModifier.Section, generatedId)) { Name = BurnCommon.BundleExtensionDataFileName, diff --git a/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs b/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs index 1559a646..0c16ea26 100644 --- a/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs +++ b/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs @@ -18,7 +18,7 @@ namespace WixToolset.Core.Burn.Bundles internal class CreateBurnManifestCommand { - public CreateBurnManifestCommand(IMessaging messaging, IEnumerable backendExtensions, string executableName, IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable containers, WixChainSymbol chainSymbol, IEnumerable orderedPackages, IEnumerable boundaries, IEnumerable uxPayloads, Dictionary allPayloadsById, IEnumerable orderedSearches, string intermediateFolder) + public CreateBurnManifestCommand(IMessaging messaging, IEnumerable backendExtensions, string executableName, IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable containers, WixChainSymbol chainSymbol, IEnumerable orderedPackages, IEnumerable boundaries, IEnumerable uxPayloads, Dictionary allPayloadsById, Dictionary> packagesPayloads, IEnumerable orderedSearches, string intermediateFolder) { this.Messaging = messaging; this.BackendExtensions = backendExtensions; @@ -31,6 +31,7 @@ namespace WixToolset.Core.Burn.Bundles this.RollbackBoundaries = boundaries; this.UXContainerPayloads = uxPayloads; this.Payloads = allPayloadsById; + this.PackagesPayloads = packagesPayloads; this.OrderedSearches = orderedSearches; this.IntermediateFolder = intermediateFolder; } @@ -57,6 +58,8 @@ namespace WixToolset.Core.Burn.Bundles private Dictionary Payloads { get; } + private Dictionary> PackagesPayloads { get; } + private IEnumerable Containers { get; } private IEnumerable UXContainerPayloads { get; } @@ -328,7 +331,6 @@ namespace WixToolset.Core.Burn.Bundles var targetCodesByPatch = this.Section.Symbols.OfType().ToLookup(r => r.PackageRef); var msiFeaturesByPackage = this.Section.Symbols.OfType().ToLookup(r => r.PackageRef); var msiPropertiesByPackage = this.Section.Symbols.OfType().ToLookup(r => r.PackageRef); - var payloadsByPackage = this.Payloads.Values.ToLookup(p => p.PackageRef); var relatedPackagesByPackage = this.Section.Symbols.OfType().ToLookup(r => r.PackageRef); var slipstreamMspsByPackage = this.Section.Symbols.OfType().ToLookup(r => r.TargetPackageRef); var exitCodesByPackage = this.Section.Symbols.OfType().ToLookup(r => r.ChainPackageId); @@ -569,9 +571,9 @@ namespace WixToolset.Core.Burn.Bundles writer.WriteAttributeString("Id", packagePayloadId); writer.WriteEndElement(); - var packagePayloads = payloadsByPackage[package.PackageId]; + var packagePayloads = this.PackagesPayloads[package.PackageId]; - foreach (var payload in packagePayloads) + foreach (var payload in packagePayloads.Values) { if (payload.Id.Id != packagePayloadId) { diff --git a/src/WixToolset.Core.Burn/Bundles/GetPackageFacadesCommand.cs b/src/WixToolset.Core.Burn/Bundles/GetPackageFacadesCommand.cs index dacff364..b8b256fd 100644 --- a/src/WixToolset.Core.Burn/Bundles/GetPackageFacadesCommand.cs +++ b/src/WixToolset.Core.Burn/Bundles/GetPackageFacadesCommand.cs @@ -27,6 +27,7 @@ namespace WixToolset.Core.Burn.Bundles public void Execute() { + var wixGroupPackagesGroupedById = this.Section.Symbols.OfType().Where(g => g.ParentType == ComplexReferenceParentType.Package).ToLookup(g => g.ParentId); var exePackages = this.Section.Symbols.OfType().ToDictionary(t => t.Id.Id); var msiPackages = this.Section.Symbols.OfType().ToDictionary(t => t.Id.Id); var mspPackages = this.Section.Symbols.OfType().ToDictionary(t => t.Id.Id); @@ -43,7 +44,7 @@ namespace WixToolset.Core.Burn.Bundles var id = package.Id.Id; IntermediateSymbol packagePayload = null; - foreach (var wixGroup in this.Section.Symbols.OfType().Where(g => g.ParentType == ComplexReferenceParentType.Package && g.ParentId == id)) + foreach (var wixGroup in wixGroupPackagesGroupedById[id]) { if (wixGroup.ChildType == ComplexReferenceChildType.PackagePayload) { diff --git a/src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs b/src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs index c8867eb7..4bc40011 100644 --- a/src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs +++ b/src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs @@ -23,7 +23,7 @@ namespace WixToolset.Core.Burn.Bundles { private const string PropertySqlFormat = "SELECT `Value` FROM `Property` WHERE `Property` = '{0}'"; - public ProcessMsiPackageCommand(IServiceProvider serviceProvider, IEnumerable backendExtensions, IntermediateSection section, PackageFacade facade, Dictionary payloadSymbols) + public ProcessMsiPackageCommand(IServiceProvider serviceProvider, IEnumerable backendExtensions, IntermediateSection section, PackageFacade facade, Dictionary packagePayloads) { this.Messaging = serviceProvider.GetService(); this.BackendHelper = serviceProvider.GetService(); @@ -31,7 +31,7 @@ namespace WixToolset.Core.Burn.Bundles this.BackendExtensions = backendExtensions; - this.AuthoredPayloads = payloadSymbols; + this.PackagePayloads = packagePayloads; this.Section = section; this.Facade = facade; } @@ -44,7 +44,7 @@ namespace WixToolset.Core.Burn.Bundles private IEnumerable BackendExtensions { get; } - private Dictionary AuthoredPayloads { get; } + private Dictionary PackagePayloads { get; } private PackageFacade Facade { get; } @@ -55,7 +55,7 @@ namespace WixToolset.Core.Burn.Bundles /// public void Execute() { - var packagePayload = this.AuthoredPayloads[this.Facade.PackageSymbol.PayloadRef]; + var packagePayload = this.PackagePayloads[this.Facade.PackageSymbol.PayloadRef]; var msiPackage = (WixBundleMsiPackageSymbol)this.Facade.SpecificPackageSymbol; @@ -182,9 +182,7 @@ namespace WixToolset.Core.Burn.Bundles private ISet GetPayloadTargetNames(string packageId) { - var payloadNames = this.Section.Symbols.OfType() - .Where(p => p.PackageRef == packageId) - .Select(p => p.Name); + var payloadNames = this.PackagePayloads.Values.Select(p => p.Name); return new HashSet(payloadNames, StringComparer.OrdinalIgnoreCase); } @@ -397,13 +395,20 @@ namespace WixToolset.Core.Burn.Bundles var generatedId = this.BackendHelper.GenerateIdentifier("cab", packagePayload.Id.Id, cabinet); var payloadSourceFile = this.ResolveRelatedFile(packagePayload.SourceFile.Path, packagePayload.UnresolvedSourceFile, cabinet, "Cabinet", this.Facade.PackageSymbol.SourceLineNumbers); + this.Section.AddSymbol(new WixGroupSymbol(this.Facade.PackageSymbol.SourceLineNumbers) + { + ParentType = ComplexReferenceParentType.Package, + ParentId = this.Facade.PackageId, + ChildType = ComplexReferenceChildType.Payload, + ChildId = generatedId + }); + this.Section.AddSymbol(new WixBundlePayloadSymbol(this.Facade.PackageSymbol.SourceLineNumbers, new Identifier(AccessModifier.Section, generatedId)) { Name = cabinetName, SourceFile = new IntermediateFieldPathValue { Path = payloadSourceFile }, Compressed = packagePayload.Compressed, UnresolvedSourceFile = cabinetName, - PackageRef = packagePayload.PackageRef, ContainerRef = packagePayload.ContainerRef, ContentFile = true, Packaging = packagePayload.Packaging, @@ -466,7 +471,7 @@ namespace WixToolset.Core.Burn.Bundles if (WindowsInstallerConstants.MsidbFileAttributesNoncompressed == (compressionBit & WindowsInstallerConstants.MsidbFileAttributesNoncompressed) || (!compressed && 0 == (compressionBit & WindowsInstallerConstants.MsidbFileAttributesCompressed))) { - string fileSourcePath = this.PathResolver.GetFileSourcePath(directories, record.GetString(1), record.GetString(3), compressed, longNamesInImage); + var fileSourcePath = this.PathResolver.GetFileSourcePath(directories, record.GetString(1), record.GetString(3), compressed, longNamesInImage); var name = Path.Combine(Path.GetDirectoryName(packagePayload.Name), fileSourcePath); if (!payloadNames.Contains(name)) @@ -474,13 +479,20 @@ namespace WixToolset.Core.Burn.Bundles var generatedId = this.BackendHelper.GenerateIdentifier("f", packagePayload.Id.Id, record.GetString(2)); var payloadSourceFile = this.ResolveRelatedFile(packagePayload.SourceFile.Path, packagePayload.UnresolvedSourceFile, fileSourcePath, "File", this.Facade.PackageSymbol.SourceLineNumbers); + this.Section.AddSymbol(new WixGroupSymbol(this.Facade.PackageSymbol.SourceLineNumbers) + { + ParentType = ComplexReferenceParentType.Package, + ParentId = this.Facade.PackageId, + ChildType = ComplexReferenceChildType.Payload, + ChildId = generatedId + }); + this.Section.AddSymbol(new WixBundlePayloadSymbol(this.Facade.PackageSymbol.SourceLineNumbers, new Identifier(AccessModifier.Section, generatedId)) { Name = name, SourceFile = new IntermediateFieldPathValue { Path = payloadSourceFile }, Compressed = packagePayload.Compressed, UnresolvedSourceFile = name, - PackageRef = packagePayload.PackageRef, ContainerRef = packagePayload.ContainerRef, ContentFile = true, Packaging = packagePayload.Packaging, -- cgit v1.2.3-55-g6feb