diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2021-02-28 21:04:16 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2021-03-02 15:50:47 -0600 |
| commit | a6013a643208a8d1fc2d1136ef8d3a6c3e909522 (patch) | |
| tree | 4f3007b58541d3d944cea469f630d3656ba5ef89 /src/WixToolset.Core.Burn | |
| parent | b54ac261d0a03b75cf05ef370351445774b82155 (diff) | |
| download | wix-a6013a643208a8d1fc2d1136ef8d3a6c3e909522.tar.gz wix-a6013a643208a8d1fc2d1136ef8d3a6c3e909522.tar.bz2 wix-a6013a643208a8d1fc2d1136ef8d3a6c3e909522.zip | |
Refactor payload compiling and harvesting.
Diffstat (limited to 'src/WixToolset.Core.Burn')
5 files changed, 105 insertions, 45 deletions
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 | |||
| 11 | using WixToolset.Core.Bind; | 11 | using WixToolset.Core.Bind; |
| 12 | using WixToolset.Core.Burn.Bind; | 12 | using WixToolset.Core.Burn.Bind; |
| 13 | using WixToolset.Core.Burn.Bundles; | 13 | using WixToolset.Core.Burn.Bundles; |
| 14 | using WixToolset.Core.Burn.Interfaces; | ||
| 14 | using WixToolset.Data; | 15 | using WixToolset.Data; |
| 15 | using WixToolset.Data.Burn; | 16 | using WixToolset.Data.Burn; |
| 16 | using WixToolset.Data.Symbols; | 17 | using WixToolset.Data.Symbols; |
| @@ -31,6 +32,7 @@ namespace WixToolset.Core.Burn | |||
| 31 | 32 | ||
| 32 | this.BackendHelper = context.ServiceProvider.GetService<IBackendHelper>(); | 33 | this.BackendHelper = context.ServiceProvider.GetService<IBackendHelper>(); |
| 33 | this.InternalBurnBackendHelper = context.ServiceProvider.GetService<IInternalBurnBackendHelper>(); | 34 | this.InternalBurnBackendHelper = context.ServiceProvider.GetService<IInternalBurnBackendHelper>(); |
| 35 | this.PayloadHarvester = context.ServiceProvider.GetService<IPayloadHarvester>(); | ||
| 34 | 36 | ||
| 35 | this.DefaultCompressionLevel = context.DefaultCompressionLevel; | 37 | this.DefaultCompressionLevel = context.DefaultCompressionLevel; |
| 36 | this.DelayedFields = context.DelayedFields; | 38 | this.DelayedFields = context.DelayedFields; |
| @@ -52,6 +54,8 @@ namespace WixToolset.Core.Burn | |||
| 52 | 54 | ||
| 53 | private IInternalBurnBackendHelper InternalBurnBackendHelper { get; } | 55 | private IInternalBurnBackendHelper InternalBurnBackendHelper { get; } |
| 54 | 56 | ||
| 57 | private IPayloadHarvester PayloadHarvester { get; } | ||
| 58 | |||
| 55 | private CompressionLevel? DefaultCompressionLevel { get; } | 59 | private CompressionLevel? DefaultCompressionLevel { get; } |
| 56 | 60 | ||
| 57 | public IEnumerable<IDelayedField> DelayedFields { get; } | 61 | public IEnumerable<IDelayedField> DelayedFields { get; } |
| @@ -165,7 +169,7 @@ namespace WixToolset.Core.Burn | |||
| 165 | // Process the explicitly authored payloads. | 169 | // Process the explicitly authored payloads. |
| 166 | ISet<string> processedPayloads; | 170 | ISet<string> processedPayloads; |
| 167 | { | 171 | { |
| 168 | var command = new ProcessPayloadsCommand(this.ServiceProvider, this.BackendHelper, payloadSymbols.Values, bundleSymbol.DefaultPackagingType, layoutDirectory); | 172 | var command = new ProcessPayloadsCommand(this.ServiceProvider, this.BackendHelper, this.PayloadHarvester, payloadSymbols.Values, bundleSymbol.DefaultPackagingType, layoutDirectory); |
| 169 | command.Execute(); | 173 | command.Execute(); |
| 170 | 174 | ||
| 171 | fileTransfers.AddRange(command.FileTransfers); | 175 | fileTransfers.AddRange(command.FileTransfers); |
| @@ -247,7 +251,7 @@ namespace WixToolset.Core.Burn | |||
| 247 | { | 251 | { |
| 248 | var toProcess = payloadSymbols.Values.Where(r => !processedPayloads.Contains(r.Id.Id)).ToList(); | 252 | var toProcess = payloadSymbols.Values.Where(r => !processedPayloads.Contains(r.Id.Id)).ToList(); |
| 249 | 253 | ||
| 250 | var command = new ProcessPayloadsCommand(this.ServiceProvider, this.BackendHelper, toProcess, bundleSymbol.DefaultPackagingType, layoutDirectory); | 254 | var command = new ProcessPayloadsCommand(this.ServiceProvider, this.BackendHelper, this.PayloadHarvester, toProcess, bundleSymbol.DefaultPackagingType, layoutDirectory); |
| 251 | command.Execute(); | 255 | command.Execute(); |
| 252 | 256 | ||
| 253 | fileTransfers.AddRange(command.FileTransfers); | 257 | 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 | |||
| 6 | using System.Collections.Generic; | 6 | using System.Collections.Generic; |
| 7 | using System.Diagnostics; | 7 | using System.Diagnostics; |
| 8 | using System.IO; | 8 | using System.IO; |
| 9 | using WixToolset.Core.Burn.Interfaces; | ||
| 9 | using WixToolset.Data; | 10 | using WixToolset.Data; |
| 10 | using WixToolset.Data.Burn; | 11 | using WixToolset.Data.Burn; |
| 11 | using WixToolset.Data.Symbols; | 12 | using WixToolset.Data.Symbols; |
| @@ -14,13 +15,12 @@ namespace WixToolset.Core.Burn.Bundles | |||
| 14 | 15 | ||
| 15 | internal class ProcessPayloadsCommand | 16 | internal class ProcessPayloadsCommand |
| 16 | { | 17 | { |
| 17 | private static readonly Version EmptyVersion = new Version(0, 0, 0, 0); | 18 | public ProcessPayloadsCommand(IWixToolsetServiceProvider serviceProvider, IBackendHelper backendHelper, IPayloadHarvester payloadHarvester, IEnumerable<WixBundlePayloadSymbol> payloads, PackagingType defaultPackaging, string layoutDirectory) |
| 18 | |||
| 19 | public ProcessPayloadsCommand(IWixToolsetServiceProvider serviceProvider, IBackendHelper backendHelper, IEnumerable<WixBundlePayloadSymbol> payloads, PackagingType defaultPackaging, string layoutDirectory) | ||
| 20 | { | 19 | { |
| 21 | this.Messaging = serviceProvider.GetService<IMessaging>(); | 20 | this.Messaging = serviceProvider.GetService<IMessaging>(); |
| 22 | 21 | ||
| 23 | this.BackendHelper = backendHelper; | 22 | this.BackendHelper = backendHelper; |
| 23 | this.PayloadHarvester = payloadHarvester; | ||
| 24 | this.Payloads = payloads; | 24 | this.Payloads = payloads; |
| 25 | this.DefaultPackaging = defaultPackaging; | 25 | this.DefaultPackaging = defaultPackaging; |
| 26 | this.LayoutDirectory = layoutDirectory; | 26 | this.LayoutDirectory = layoutDirectory; |
| @@ -34,6 +34,8 @@ namespace WixToolset.Core.Burn.Bundles | |||
| 34 | 34 | ||
| 35 | private IBackendHelper BackendHelper { get; } | 35 | private IBackendHelper BackendHelper { get; } |
| 36 | 36 | ||
| 37 | private IPayloadHarvester PayloadHarvester { get; } | ||
| 38 | |||
| 37 | private IEnumerable<WixBundlePayloadSymbol> Payloads { get; } | 39 | private IEnumerable<WixBundlePayloadSymbol> Payloads { get; } |
| 38 | 40 | ||
| 39 | private PackagingType DefaultPackaging { get; } | 41 | private PackagingType DefaultPackaging { get; } |
| @@ -56,17 +58,13 @@ namespace WixToolset.Core.Burn.Bundles | |||
| 56 | 58 | ||
| 57 | this.UpdatePayloadPackagingType(payload); | 59 | this.UpdatePayloadPackagingType(payload); |
| 58 | 60 | ||
| 59 | if (String.IsNullOrEmpty(sourceFile?.Path)) | 61 | if (!this.PayloadHarvester.HarvestStandardInformation(payload)) |
| 60 | { | 62 | { |
| 61 | // Remote payloads obviously cannot be embedded. | 63 | // Remote payloads obviously cannot be embedded. |
| 62 | Debug.Assert(PackagingType.Embedded != payload.Packaging); | 64 | Debug.Assert(PackagingType.Embedded != payload.Packaging); |
| 63 | } | 65 | } |
| 64 | else // not a remote payload so we have a lot more to update. | 66 | else // not a remote payload so we have a lot more to update. |
| 65 | { | 67 | { |
| 66 | this.UpdatePayloadFileInformation(payload, sourceFile); | ||
| 67 | |||
| 68 | this.UpdatePayloadVersionInformation(payload, sourceFile); | ||
| 69 | |||
| 70 | // External payloads need to be transfered. | 68 | // External payloads need to be transfered. |
| 71 | if (PackagingType.External == payload.Packaging) | 69 | if (PackagingType.External == payload.Packaging) |
| 72 | { | 70 | { |
| @@ -110,40 +108,5 @@ namespace WixToolset.Core.Burn.Bundles | |||
| 110 | payload.ContainerRef = BurnConstants.BurnDefaultAttachedContainerName; | 108 | payload.ContainerRef = BurnConstants.BurnDefaultAttachedContainerName; |
| 111 | } | 109 | } |
| 112 | } | 110 | } |
| 113 | |||
| 114 | private void UpdatePayloadFileInformation(WixBundlePayloadSymbol payload, IntermediateFieldPathValue sourceFile) | ||
| 115 | { | ||
| 116 | var fileInfo = new FileInfo(sourceFile.Path); | ||
| 117 | |||
| 118 | if (null != fileInfo) | ||
| 119 | { | ||
| 120 | payload.FileSize = fileInfo.Length; | ||
| 121 | |||
| 122 | payload.Hash = BundleHashAlgorithm.Hash(fileInfo); | ||
| 123 | } | ||
| 124 | else | ||
| 125 | { | ||
| 126 | payload.FileSize = 0; | ||
| 127 | } | ||
| 128 | } | ||
| 129 | |||
| 130 | private void UpdatePayloadVersionInformation(WixBundlePayloadSymbol payload, IntermediateFieldPathValue sourceFile) | ||
| 131 | { | ||
| 132 | var versionInfo = FileVersionInfo.GetVersionInfo(sourceFile.Path); | ||
| 133 | |||
| 134 | if (null != versionInfo) | ||
| 135 | { | ||
| 136 | // Use the fixed version info block for the file since the resource text may not be a dotted quad. | ||
| 137 | var version = new Version(versionInfo.ProductMajorPart, versionInfo.ProductMinorPart, versionInfo.ProductBuildPart, versionInfo.ProductPrivatePart); | ||
| 138 | |||
| 139 | if (ProcessPayloadsCommand.EmptyVersion != version) | ||
| 140 | { | ||
| 141 | payload.Version = version.ToString(); | ||
| 142 | } | ||
| 143 | |||
| 144 | payload.Description = versionInfo.FileDescription; | ||
| 145 | payload.DisplayName = versionInfo.ProductName; | ||
| 146 | } | ||
| 147 | } | ||
| 148 | } | 111 | } |
| 149 | } | 112 | } |
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 @@ | |||
| 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 WixToolset.Core.Burn.ExtensibilityServices | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | using System.Diagnostics; | ||
| 7 | using System.IO; | ||
| 8 | using WixToolset.Core.Burn.Bundles; | ||
| 9 | using WixToolset.Core.Burn.Interfaces; | ||
| 10 | using WixToolset.Data.Symbols; | ||
| 11 | |||
| 12 | internal class PayloadHarvester : IPayloadHarvester | ||
| 13 | { | ||
| 14 | private static readonly Version EmptyVersion = new Version(0, 0, 0, 0); | ||
| 15 | |||
| 16 | /// <inheritdoc /> | ||
| 17 | public bool HarvestStandardInformation(WixBundlePayloadSymbol payload) | ||
| 18 | { | ||
| 19 | var filePath = payload.SourceFile?.Path; | ||
| 20 | |||
| 21 | if (String.IsNullOrEmpty(filePath)) | ||
| 22 | { | ||
| 23 | return false; | ||
| 24 | } | ||
| 25 | |||
| 26 | this.UpdatePayloadFileInformation(payload, filePath); | ||
| 27 | |||
| 28 | this.UpdatePayloadVersionInformation(payload, filePath); | ||
| 29 | |||
| 30 | return true; | ||
| 31 | } | ||
| 32 | |||
| 33 | private void UpdatePayloadFileInformation(WixBundlePayloadSymbol payload, string filePath) | ||
| 34 | { | ||
| 35 | var fileInfo = new FileInfo(filePath); | ||
| 36 | |||
| 37 | if (null != fileInfo) | ||
| 38 | { | ||
| 39 | payload.FileSize = fileInfo.Length; | ||
| 40 | |||
| 41 | payload.Hash = BundleHashAlgorithm.Hash(fileInfo); | ||
| 42 | } | ||
| 43 | else | ||
| 44 | { | ||
| 45 | payload.FileSize = 0; | ||
| 46 | } | ||
| 47 | } | ||
| 48 | |||
| 49 | private void UpdatePayloadVersionInformation(WixBundlePayloadSymbol payload, string filePath) | ||
| 50 | { | ||
| 51 | var versionInfo = FileVersionInfo.GetVersionInfo(filePath); | ||
| 52 | |||
| 53 | if (null != versionInfo) | ||
| 54 | { | ||
| 55 | // Use the fixed version info block for the file since the resource text may not be a dotted quad. | ||
| 56 | var version = new Version(versionInfo.ProductMajorPart, versionInfo.ProductMinorPart, versionInfo.ProductBuildPart, versionInfo.ProductPrivatePart); | ||
| 57 | |||
| 58 | if (PayloadHarvester.EmptyVersion != version) | ||
| 59 | { | ||
| 60 | payload.Version = version.ToString(); | ||
| 61 | } | ||
| 62 | |||
| 63 | payload.Description = versionInfo.FileDescription; | ||
| 64 | payload.DisplayName = versionInfo.ProductName; | ||
| 65 | } | ||
| 66 | } | ||
| 67 | } | ||
| 68 | } | ||
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 @@ | |||
| 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 WixToolset.Core.Burn.Interfaces | ||
| 4 | { | ||
| 5 | using System.Diagnostics; | ||
| 6 | using WixToolset.Data.Symbols; | ||
| 7 | |||
| 8 | /// <summary> | ||
| 9 | /// Service for harvesting payload information. | ||
| 10 | /// </summary> | ||
| 11 | public interface IPayloadHarvester | ||
| 12 | { | ||
| 13 | /// <summary> | ||
| 14 | /// Uses <see cref="WixBundlePayloadSymbol.SourceFile"/> to: | ||
| 15 | /// update <see cref="WixBundlePayloadSymbol.Hash"/> from file contents, | ||
| 16 | /// update <see cref="WixBundlePayloadSymbol.FileSize"/> from file size, and | ||
| 17 | /// update <see cref="WixBundlePayloadSymbol.Description"/>, <see cref="WixBundlePayloadSymbol.DisplayName"/>, and <see cref="WixBundlePayloadSymbol.Version"/> from <see cref="FileVersionInfo"/>. | ||
| 18 | /// </summary> | ||
| 19 | /// <param name="payload">The symbol to update.</param> | ||
| 20 | /// <returns>Whether the symbol had a source file specified.</returns> | ||
| 21 | bool HarvestStandardInformation(WixBundlePayloadSymbol payload); | ||
| 22 | } | ||
| 23 | } | ||
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 | |||
| 5 | using System; | 5 | using System; |
| 6 | using System.Collections.Generic; | 6 | using System.Collections.Generic; |
| 7 | using WixToolset.Core.Burn.ExtensibilityServices; | 7 | using WixToolset.Core.Burn.ExtensibilityServices; |
| 8 | using WixToolset.Core.Burn.Interfaces; | ||
| 8 | using WixToolset.Extensibility.Services; | 9 | using WixToolset.Extensibility.Services; |
| 9 | 10 | ||
| 10 | /// <summary> | 11 | /// <summary> |
| @@ -31,6 +32,7 @@ namespace WixToolset.Core.Burn | |||
| 31 | { | 32 | { |
| 32 | // Singletons. | 33 | // Singletons. |
| 33 | coreProvider.AddService((provider, singletons) => AddSingleton<IInternalBurnBackendHelper>(singletons, new BurnBackendHelper(provider))); | 34 | coreProvider.AddService((provider, singletons) => AddSingleton<IInternalBurnBackendHelper>(singletons, new BurnBackendHelper(provider))); |
| 35 | coreProvider.AddService((provider, singletons) => AddSingleton<IPayloadHarvester>(singletons, new PayloadHarvester())); | ||
| 34 | coreProvider.AddService((provider, singletons) => AddSingleton<IBurnBackendHelper>(singletons, provider.GetService<IInternalBurnBackendHelper>())); | 36 | coreProvider.AddService((provider, singletons) => AddSingleton<IBurnBackendHelper>(singletons, provider.GetService<IInternalBurnBackendHelper>())); |
| 35 | } | 37 | } |
| 36 | 38 | ||
