From a6013a643208a8d1fc2d1136ef8d3a6c3e909522 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Sun, 28 Feb 2021 21:04:16 -0600 Subject: Refactor payload compiling and harvesting. --- src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs | 8 ++- .../Bundles/ProcessPayloadsCommand.cs | 49 ++-------------- .../ExtensibilityServices/PayloadHarvester.cs | 68 ++++++++++++++++++++++ .../Interfaces/IPayloadHarvester.cs | 23 ++++++++ .../WixToolsetCoreServiceProviderExtensions.cs | 2 + 5 files changed, 105 insertions(+), 45 deletions(-) create mode 100644 src/WixToolset.Core.Burn/ExtensibilityServices/PayloadHarvester.cs create mode 100644 src/WixToolset.Core.Burn/Interfaces/IPayloadHarvester.cs (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 c9a111c6..724dd7ff 100644 --- a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs +++ b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs @@ -11,6 +11,7 @@ namespace WixToolset.Core.Burn using WixToolset.Core.Bind; using WixToolset.Core.Burn.Bind; using WixToolset.Core.Burn.Bundles; + using WixToolset.Core.Burn.Interfaces; using WixToolset.Data; using WixToolset.Data.Burn; using WixToolset.Data.Symbols; @@ -31,6 +32,7 @@ namespace WixToolset.Core.Burn this.BackendHelper = context.ServiceProvider.GetService(); this.InternalBurnBackendHelper = context.ServiceProvider.GetService(); + this.PayloadHarvester = context.ServiceProvider.GetService(); this.DefaultCompressionLevel = context.DefaultCompressionLevel; this.DelayedFields = context.DelayedFields; @@ -52,6 +54,8 @@ namespace WixToolset.Core.Burn private IInternalBurnBackendHelper InternalBurnBackendHelper { get; } + private IPayloadHarvester PayloadHarvester { get; } + private CompressionLevel? DefaultCompressionLevel { get; } public IEnumerable DelayedFields { get; } @@ -165,7 +169,7 @@ namespace WixToolset.Core.Burn // Process the explicitly authored payloads. ISet processedPayloads; { - var command = new ProcessPayloadsCommand(this.ServiceProvider, this.BackendHelper, payloadSymbols.Values, bundleSymbol.DefaultPackagingType, layoutDirectory); + var command = new ProcessPayloadsCommand(this.ServiceProvider, this.BackendHelper, this.PayloadHarvester, payloadSymbols.Values, bundleSymbol.DefaultPackagingType, layoutDirectory); command.Execute(); fileTransfers.AddRange(command.FileTransfers); @@ -247,7 +251,7 @@ namespace WixToolset.Core.Burn { var toProcess = payloadSymbols.Values.Where(r => !processedPayloads.Contains(r.Id.Id)).ToList(); - var command = new ProcessPayloadsCommand(this.ServiceProvider, this.BackendHelper, toProcess, bundleSymbol.DefaultPackagingType, layoutDirectory); + var command = new ProcessPayloadsCommand(this.ServiceProvider, this.BackendHelper, this.PayloadHarvester, toProcess, bundleSymbol.DefaultPackagingType, layoutDirectory); command.Execute(); fileTransfers.AddRange(command.FileTransfers); diff --git a/src/WixToolset.Core.Burn/Bundles/ProcessPayloadsCommand.cs b/src/WixToolset.Core.Burn/Bundles/ProcessPayloadsCommand.cs index db5b03fb..dea5b336 100644 --- a/src/WixToolset.Core.Burn/Bundles/ProcessPayloadsCommand.cs +++ b/src/WixToolset.Core.Burn/Bundles/ProcessPayloadsCommand.cs @@ -6,6 +6,7 @@ namespace WixToolset.Core.Burn.Bundles using System.Collections.Generic; using System.Diagnostics; using System.IO; + using WixToolset.Core.Burn.Interfaces; using WixToolset.Data; using WixToolset.Data.Burn; using WixToolset.Data.Symbols; @@ -14,13 +15,12 @@ namespace WixToolset.Core.Burn.Bundles internal class ProcessPayloadsCommand { - private static readonly Version EmptyVersion = new Version(0, 0, 0, 0); - - public ProcessPayloadsCommand(IWixToolsetServiceProvider serviceProvider, IBackendHelper backendHelper, IEnumerable payloads, PackagingType defaultPackaging, string layoutDirectory) + public ProcessPayloadsCommand(IWixToolsetServiceProvider serviceProvider, IBackendHelper backendHelper, IPayloadHarvester payloadHarvester, IEnumerable payloads, PackagingType defaultPackaging, string layoutDirectory) { this.Messaging = serviceProvider.GetService(); this.BackendHelper = backendHelper; + this.PayloadHarvester = payloadHarvester; this.Payloads = payloads; this.DefaultPackaging = defaultPackaging; this.LayoutDirectory = layoutDirectory; @@ -34,6 +34,8 @@ namespace WixToolset.Core.Burn.Bundles private IBackendHelper BackendHelper { get; } + private IPayloadHarvester PayloadHarvester { get; } + private IEnumerable Payloads { get; } private PackagingType DefaultPackaging { get; } @@ -56,17 +58,13 @@ namespace WixToolset.Core.Burn.Bundles this.UpdatePayloadPackagingType(payload); - if (String.IsNullOrEmpty(sourceFile?.Path)) + if (!this.PayloadHarvester.HarvestStandardInformation(payload)) { // Remote payloads obviously cannot be embedded. Debug.Assert(PackagingType.Embedded != payload.Packaging); } else // not a remote payload so we have a lot more to update. { - this.UpdatePayloadFileInformation(payload, sourceFile); - - this.UpdatePayloadVersionInformation(payload, sourceFile); - // External payloads need to be transfered. if (PackagingType.External == payload.Packaging) { @@ -110,40 +108,5 @@ namespace WixToolset.Core.Burn.Bundles payload.ContainerRef = BurnConstants.BurnDefaultAttachedContainerName; } } - - private void UpdatePayloadFileInformation(WixBundlePayloadSymbol payload, IntermediateFieldPathValue sourceFile) - { - var fileInfo = new FileInfo(sourceFile.Path); - - if (null != fileInfo) - { - payload.FileSize = fileInfo.Length; - - payload.Hash = BundleHashAlgorithm.Hash(fileInfo); - } - else - { - payload.FileSize = 0; - } - } - - private void UpdatePayloadVersionInformation(WixBundlePayloadSymbol payload, IntermediateFieldPathValue sourceFile) - { - var versionInfo = FileVersionInfo.GetVersionInfo(sourceFile.Path); - - if (null != versionInfo) - { - // Use the fixed version info block for the file since the resource text may not be a dotted quad. - var version = new Version(versionInfo.ProductMajorPart, versionInfo.ProductMinorPart, versionInfo.ProductBuildPart, versionInfo.ProductPrivatePart); - - if (ProcessPayloadsCommand.EmptyVersion != version) - { - payload.Version = version.ToString(); - } - - payload.Description = versionInfo.FileDescription; - payload.DisplayName = versionInfo.ProductName; - } - } } } diff --git a/src/WixToolset.Core.Burn/ExtensibilityServices/PayloadHarvester.cs b/src/WixToolset.Core.Burn/ExtensibilityServices/PayloadHarvester.cs new file mode 100644 index 00000000..9ef91028 --- /dev/null +++ b/src/WixToolset.Core.Burn/ExtensibilityServices/PayloadHarvester.cs @@ -0,0 +1,68 @@ +// 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. + +namespace WixToolset.Core.Burn.ExtensibilityServices +{ + using System; + using System.Diagnostics; + using System.IO; + using WixToolset.Core.Burn.Bundles; + using WixToolset.Core.Burn.Interfaces; + using WixToolset.Data.Symbols; + + internal class PayloadHarvester : IPayloadHarvester + { + private static readonly Version EmptyVersion = new Version(0, 0, 0, 0); + + /// + public bool HarvestStandardInformation(WixBundlePayloadSymbol payload) + { + var filePath = payload.SourceFile?.Path; + + if (String.IsNullOrEmpty(filePath)) + { + return false; + } + + this.UpdatePayloadFileInformation(payload, filePath); + + this.UpdatePayloadVersionInformation(payload, filePath); + + return true; + } + + private void UpdatePayloadFileInformation(WixBundlePayloadSymbol payload, string filePath) + { + var fileInfo = new FileInfo(filePath); + + if (null != fileInfo) + { + payload.FileSize = fileInfo.Length; + + payload.Hash = BundleHashAlgorithm.Hash(fileInfo); + } + else + { + payload.FileSize = 0; + } + } + + private void UpdatePayloadVersionInformation(WixBundlePayloadSymbol payload, string filePath) + { + var versionInfo = FileVersionInfo.GetVersionInfo(filePath); + + if (null != versionInfo) + { + // Use the fixed version info block for the file since the resource text may not be a dotted quad. + var version = new Version(versionInfo.ProductMajorPart, versionInfo.ProductMinorPart, versionInfo.ProductBuildPart, versionInfo.ProductPrivatePart); + + if (PayloadHarvester.EmptyVersion != version) + { + payload.Version = version.ToString(); + } + + payload.Description = versionInfo.FileDescription; + payload.DisplayName = versionInfo.ProductName; + } + } + } +} diff --git a/src/WixToolset.Core.Burn/Interfaces/IPayloadHarvester.cs b/src/WixToolset.Core.Burn/Interfaces/IPayloadHarvester.cs new file mode 100644 index 00000000..1bafa46e --- /dev/null +++ b/src/WixToolset.Core.Burn/Interfaces/IPayloadHarvester.cs @@ -0,0 +1,23 @@ +// 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. + +namespace WixToolset.Core.Burn.Interfaces +{ + using System.Diagnostics; + using WixToolset.Data.Symbols; + + /// + /// Service for harvesting payload information. + /// + public interface IPayloadHarvester + { + /// + /// Uses to: + /// update from file contents, + /// update from file size, and + /// update , , and from . + /// + /// The symbol to update. + /// Whether the symbol had a source file specified. + bool HarvestStandardInformation(WixBundlePayloadSymbol payload); + } +} diff --git a/src/WixToolset.Core.Burn/WixToolsetCoreServiceProviderExtensions.cs b/src/WixToolset.Core.Burn/WixToolsetCoreServiceProviderExtensions.cs index b0401b4a..58076d5e 100644 --- a/src/WixToolset.Core.Burn/WixToolsetCoreServiceProviderExtensions.cs +++ b/src/WixToolset.Core.Burn/WixToolsetCoreServiceProviderExtensions.cs @@ -5,6 +5,7 @@ namespace WixToolset.Core.Burn using System; using System.Collections.Generic; using WixToolset.Core.Burn.ExtensibilityServices; + using WixToolset.Core.Burn.Interfaces; using WixToolset.Extensibility.Services; /// @@ -31,6 +32,7 @@ namespace WixToolset.Core.Burn { // Singletons. coreProvider.AddService((provider, singletons) => AddSingleton(singletons, new BurnBackendHelper(provider))); + coreProvider.AddService((provider, singletons) => AddSingleton(singletons, new PayloadHarvester())); coreProvider.AddService((provider, singletons) => AddSingleton(singletons, provider.GetService())); } -- cgit v1.2.3-55-g6feb