main
cs 126 lines 5.15 KB
Raw
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.Bundles
4 {
5 using System;
6 using System.Collections.Generic;
7 using System.Diagnostics;
8 using System.IO;
9 using WixToolset.Core.Burn.Interfaces;
10 using WixToolset.Data;
11 using WixToolset.Data.Burn;
12 using WixToolset.Data.Symbols;
13 using WixToolset.Extensibility.Data;
14 using WixToolset.Extensibility.Services;
15
16 internal class ProcessPayloadsCommand
17 {
18 public ProcessPayloadsCommand(IBurnBackendHelper backendHelper, IPayloadHarvester payloadHarvester, IEnumerable<WixBundlePayloadSymbol> payloads, PackagingType defaultPackaging, string layoutDirectory)
19 {
20 this.BackendHelper = backendHelper;
21 this.PayloadHarvester = payloadHarvester;
22 this.Payloads = payloads;
23 this.DefaultPackaging = defaultPackaging;
24 this.LayoutDirectory = layoutDirectory;
25 }
26
27 public IEnumerable<IFileTransfer> FileTransfers { get; private set; }
28
29 public IEnumerable<ITrackedFile> TrackedFiles { get; private set; }
30
31 private IBurnBackendHelper BackendHelper { get; }
32
33 private IPayloadHarvester PayloadHarvester { get; }
34
35 private IEnumerable<WixBundlePayloadSymbol> Payloads { get; }
36
37 private PackagingType DefaultPackaging { get; }
38
39 private string LayoutDirectory { get; }
40
41 public void Execute()
42 {
43 var fileTransfers = new List<IFileTransfer>();
44 var trackedFiles = new List<ITrackedFile>();
45
46 foreach (var payload in this.Payloads)
47 {
48 payload.Name = this.BackendHelper.GetCanonicalRelativePath(payload.SourceLineNumbers, "Payload", "Name", payload.Name);
49
50 // Embedded files (aka: files from binary .wixlibs) are not content files (because they are hidden
51 // in the .wixlib).
52 var sourceFile = payload.SourceFile;
53 payload.ContentFile = sourceFile != null && !sourceFile.Embed;
54
55 this.UpdatePayloadPackagingType(payload);
56
57 if (payload.ContainerRef == BurnConstants.BurnUXContainerName)
58 {
59 Debug.Assert(PackagingType.Embedded == payload.Packaging);
60
61 // Nothing needs to be harvested because the engine only uses Id, Name (FilePath), and EmbeddedId (SourcePath).
62
63 if (payload.ContentFile)
64 {
65 trackedFiles.Add(this.BackendHelper.TrackFile(sourceFile.Path, TrackedFileType.Input, payload.SourceLineNumbers));
66 }
67 }
68 else
69 {
70 if (!this.PayloadHarvester.HarvestStandardInformation(payload))
71 {
72 // Remote payloads obviously cannot be embedded.
73 Debug.Assert(PackagingType.Embedded != payload.Packaging);
74 }
75 else // not a remote payload so we have a lot more to update.
76 {
77 // External payloads need to be transfered.
78 if (PackagingType.External == payload.Packaging)
79 {
80 var outputPath = Path.Combine(this.LayoutDirectory, payload.Name);
81
82 var transfer = this.BackendHelper.CreateFileTransfer(sourceFile.Path, outputPath, false, payload.SourceLineNumbers);
83 fileTransfers.Add(transfer);
84
85 trackedFiles.Add(this.BackendHelper.TrackFile(outputPath, TrackedFileType.CopiedOutput, payload.SourceLineNumbers));
86 }
87
88 if (payload.ContentFile)
89 {
90 trackedFiles.Add(this.BackendHelper.TrackFile(sourceFile.Path, TrackedFileType.Input, payload.SourceLineNumbers));
91 }
92 }
93 }
94 }
95
96 this.FileTransfers = fileTransfers;
97 this.TrackedFiles = trackedFiles;
98 }
99
100 private void UpdatePayloadPackagingType(WixBundlePayloadSymbol payload)
101 {
102 if (!payload.Packaging.HasValue || PackagingType.Unknown == payload.Packaging)
103 {
104 if (!payload.Compressed.HasValue)
105 {
106 payload.Packaging = this.DefaultPackaging;
107 }
108 else if (payload.Compressed.Value)
109 {
110 payload.Packaging = PackagingType.Embedded;
111 }
112 else
113 {
114 payload.Packaging = PackagingType.External;
115 }
116 }
117
118 // Embedded payloads that are not assigned a container already are placed in the default attached
119 // container.
120 if (PackagingType.Embedded == payload.Packaging && String.IsNullOrEmpty(payload.ContainerRef))
121 {
122 payload.ContainerRef = BurnConstants.BurnDefaultAttachedContainerName;
123 }
124 }
125 }
126 }