aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.WindowsInstaller/Bind/CreatePatchTransformsCommand.cs
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2020-01-24 15:27:20 -0800
committerRob Mensching <rob@firegiant.com>2020-02-05 16:15:47 -0800
commit6ff680e386b1543ad1a58d1b1d465ce8aa20bc7d (patch)
treec717333cd10d5592e59dfb898b391275bba1f389 /src/WixToolset.Core.WindowsInstaller/Bind/CreatePatchTransformsCommand.cs
parent6e2e67ab55c75f4655397588c0dcc64f50d22f92 (diff)
downloadwix-6ff680e386b1543ad1a58d1b1d465ce8aa20bc7d.tar.gz
wix-6ff680e386b1543ad1a58d1b1d465ce8aa20bc7d.tar.bz2
wix-6ff680e386b1543ad1a58d1b1d465ce8aa20bc7d.zip
Start on new patch infrastructure
Diffstat (limited to 'src/WixToolset.Core.WindowsInstaller/Bind/CreatePatchTransformsCommand.cs')
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/CreatePatchTransformsCommand.cs90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/CreatePatchTransformsCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/CreatePatchTransformsCommand.cs
new file mode 100644
index 00000000..854d973e
--- /dev/null
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/CreatePatchTransformsCommand.cs
@@ -0,0 +1,90 @@
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.WindowsInstaller.Bind
4{
5 using System;
6 using System.Collections.Generic;
7 using System.IO;
8 using System.Linq;
9 using WixToolset.Core.WindowsInstaller.Msi;
10 using WixToolset.Core.WindowsInstaller.Unbind;
11 using WixToolset.Data;
12 using WixToolset.Data.Tuples;
13 using WixToolset.Data.WindowsInstaller;
14 using WixToolset.Extensibility.Services;
15
16 internal class CreatePatchTransformsCommand
17 {
18 public CreatePatchTransformsCommand(IMessaging messaging, Intermediate intermediate, string intermediateFolder)
19 {
20 this.Messaging = messaging;
21 this.Intermediate = intermediate;
22 this.IntermediateFolder = intermediateFolder;
23 }
24
25 private IMessaging Messaging { get; }
26
27 private Intermediate Intermediate { get; }
28
29 private string IntermediateFolder { get; }
30
31 public IEnumerable<PatchTransform> PatchTransforms { get; private set; }
32
33 public IEnumerable<PatchTransform> Execute()
34 {
35 var patchTransforms = new List<PatchTransform>();
36
37 var tuples = this.Intermediate.Sections.SelectMany(s => s.Tuples).OfType<WixPatchBaselineTuple>();
38
39 foreach (var tuple in tuples)
40 {
41 WindowsInstallerData transform;
42
43 if (tuple.TransformFile is null)
44 {
45 var baselineData = this.GetData(tuple.BaselineFile.Path);
46 var updateData = this.GetData(tuple.UpdateFile.Path);
47
48 var command = new GenerateTransformCommand(this.Messaging, baselineData, updateData, false);
49 transform = command.Execute();
50 }
51 else
52 {
53 var exportBasePath = Path.Combine(this.IntermediateFolder, "_trans"); // TODO: come up with a better path.
54
55 var command = new UnbindTransformCommand(this.Messaging, tuple.TransformFile.Path, exportBasePath, this.IntermediateFolder);
56 transform = command.Execute();
57 }
58
59 patchTransforms.Add(new PatchTransform(tuple.Id.Id, transform));
60 }
61
62 this.PatchTransforms = patchTransforms;
63
64 return this.PatchTransforms;
65 }
66
67 private WindowsInstallerData GetData(string path)
68 {
69 var ext = Path.GetExtension(path);
70
71 if (".msi".Equals(ext, StringComparison.OrdinalIgnoreCase))
72 {
73 using (var database = new Database(path, OpenDatabase.ReadOnly))
74 {
75 var exportBasePath = Path.Combine(this.IntermediateFolder, "_msi"); // TODO: come up with a better path.
76
77 var isAdminImage = false; // TODO: need a better way to set this
78
79 var command = new UnbindDatabaseCommand(this.Messaging, database, path, OutputType.Product, exportBasePath, this.IntermediateFolder, isAdminImage, suppressDemodularization: true, skipSummaryInfo: true);
80 return command.Execute();
81 }
82 }
83 else // assume .wixpdb (or .wixout)
84 {
85 var data = WindowsInstallerData.Load(path, true);
86 return data;
87 }
88 }
89 }
90}