| 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 | } |