aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.Burn
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-02-28 21:04:16 -0600
committerSean Hall <r.sean.hall@gmail.com>2021-03-02 15:50:47 -0600
commita6013a643208a8d1fc2d1136ef8d3a6c3e909522 (patch)
tree4f3007b58541d3d944cea469f630d3656ba5ef89 /src/WixToolset.Core.Burn
parentb54ac261d0a03b75cf05ef370351445774b82155 (diff)
downloadwix-a6013a643208a8d1fc2d1136ef8d3a6c3e909522.tar.gz
wix-a6013a643208a8d1fc2d1136ef8d3a6c3e909522.tar.bz2
wix-a6013a643208a8d1fc2d1136ef8d3a6c3e909522.zip
Refactor payload compiling and harvesting.
Diffstat (limited to 'src/WixToolset.Core.Burn')
-rw-r--r--src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs8
-rw-r--r--src/WixToolset.Core.Burn/Bundles/ProcessPayloadsCommand.cs49
-rw-r--r--src/WixToolset.Core.Burn/ExtensibilityServices/PayloadHarvester.cs68
-rw-r--r--src/WixToolset.Core.Burn/Interfaces/IPayloadHarvester.cs23
-rw-r--r--src/WixToolset.Core.Burn/WixToolsetCoreServiceProviderExtensions.cs2
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
3namespace 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
3namespace 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