aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2020-05-30 14:53:05 -0700
committerRob Mensching <rob@firegiant.com>2020-05-30 15:07:21 -0700
commitd529525a1e331f3ef9ec2707791c99bd78fdd82f (patch)
tree1d9fe1f0c0ee9850371c916802eb03ec9dc37a87 /src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs
parent9c54d2fce80983bbee5f0f113b5aa30f22bc8a23 (diff)
downloadwix-d529525a1e331f3ef9ec2707791c99bd78fdd82f.tar.gz
wix-d529525a1e331f3ef9ec2707791c99bd78fdd82f.tar.bz2
wix-d529525a1e331f3ef9ec2707791c99bd78fdd82f.zip
Basic patching support
Diffstat (limited to 'src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs')
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs61
1 files changed, 28 insertions, 33 deletions
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs
index 5d18a230..9aab7b98 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs
@@ -6,62 +6,59 @@ namespace WixToolset.Core.WindowsInstaller.Bind
6 using System.Linq; 6 using System.Linq;
7 using WixToolset.Core.Bind; 7 using WixToolset.Core.Bind;
8 using WixToolset.Data; 8 using WixToolset.Data;
9 using WixToolset.Data.WindowsInstaller; 9 using WixToolset.Data.Tuples;
10 using WixToolset.Data.WindowsInstaller.Rows;
11 10
12 internal class UpdateMediaSequencesCommand 11 internal class UpdateMediaSequencesCommand
13 { 12 {
14 public UpdateMediaSequencesCommand(WindowsInstallerData output, List<FileFacade> fileFacades) 13 public UpdateMediaSequencesCommand(IntermediateSection section, List<FileFacade> fileFacades)
15 { 14 {
16 this.Output = output; 15 this.Section = section;
17 this.FileFacades = fileFacades; 16 this.FileFacades = fileFacades;
18 } 17 }
19 18
20 private WindowsInstallerData Output { get; } 19 private IntermediateSection Section { get; }
21 20
22 private List<FileFacade> FileFacades { get; } 21 private List<FileFacade> FileFacades { get; }
23 22
24 public void Execute() 23 public void Execute()
25 { 24 {
26 var fileRows = new RowDictionary<FileRow>(this.Output.Tables["File"]); 25 var mediaRows = this.Section.Tuples.OfType<MediaTuple>().ToDictionary(t => t.DiskId);
27 var mediaRows = new RowDictionary<MediaRow>(this.Output.Tables["Media"]);
28 26
29 // Calculate sequence numbers and media disk id layout for all file media information objects. 27 // Calculate sequence numbers and media disk id layout for all file media information objects.
30 if (OutputType.Module == this.Output.Type) 28 if (SectionType.Module == this.Section.Type)
31 { 29 {
32 var lastSequence = 0; 30 var lastSequence = 0;
33 31
34 // Order by Component to group the files by directory. 32 // Order by Component to group the files by directory.
35 var optimized = this.OptimizedFileFacades(); 33 var optimized = this.OptimizedFileFacades();
36 foreach (var fileId in optimized.Select(f => f.Id)) 34 foreach (var facade in optimized)
37 { 35 {
38 var fileRow = fileRows.Get(fileId); 36 facade.Sequence = ++lastSequence;
39 fileRow.Sequence = ++lastSequence;
40 } 37 }
41 } 38 }
42 else 39 else
43 { 40 {
44 var lastSequence = 0; 41 var lastSequence = 0;
45 MediaRow mediaRow = null; 42 MediaTuple mediaTuple = null;
46 var patchGroups = new Dictionary<int, List<FileFacade>>(); 43 var patchGroups = new Dictionary<int, List<FileFacade>>();
47 44
48 // sequence the non-patch-added files 45 // sequence the non-patch-added files
49 var optimized = this.OptimizedFileFacades(); 46 var optimized = this.OptimizedFileFacades();
50 foreach (var facade in optimized) 47 foreach (var facade in optimized)
51 { 48 {
52 if (null == mediaRow) 49 if (null == mediaTuple)
53 { 50 {
54 mediaRow = mediaRows.Get(facade.DiskId); 51 mediaTuple = mediaRows[facade.DiskId];
55 if (OutputType.Patch == this.Output.Type) 52 if (SectionType.Patch == this.Section.Type)
56 { 53 {
57 // patch Media cannot start at zero 54 // patch Media cannot start at zero
58 lastSequence = mediaRow.LastSequence; 55 lastSequence = mediaTuple.LastSequence ?? 1;
59 } 56 }
60 } 57 }
61 else if (mediaRow.DiskId != facade.DiskId) 58 else if (mediaTuple.DiskId != facade.DiskId)
62 { 59 {
63 mediaRow.LastSequence = lastSequence; 60 mediaTuple.LastSequence = lastSequence;
64 mediaRow = mediaRows.Get(facade.DiskId); 61 mediaTuple = mediaRows[facade.DiskId];
65 } 62 }
66 63
67 if (facade.PatchGroup.HasValue) 64 if (facade.PatchGroup.HasValue)
@@ -76,15 +73,14 @@ namespace WixToolset.Core.WindowsInstaller.Bind
76 } 73 }
77 else if (!facade.FromModule) 74 else if (!facade.FromModule)
78 { 75 {
79 var fileRow = fileRows.Get(facade.Id); 76 facade.Sequence = ++lastSequence;
80 fileRow.Sequence = ++lastSequence;
81 } 77 }
82 } 78 }
83 79
84 if (null != mediaRow) 80 if (null != mediaTuple)
85 { 81 {
86 mediaRow.LastSequence = lastSequence; 82 mediaTuple.LastSequence = lastSequence;
87 mediaRow = null; 83 mediaTuple = null;
88 } 84 }
89 85
90 // sequence the patch-added files 86 // sequence the patch-added files
@@ -92,24 +88,23 @@ namespace WixToolset.Core.WindowsInstaller.Bind
92 { 88 {
93 foreach (var facade in patchGroup) 89 foreach (var facade in patchGroup)
94 { 90 {
95 if (null == mediaRow) 91 if (null == mediaTuple)
96 { 92 {
97 mediaRow = mediaRows.Get(facade.DiskId); 93 mediaTuple = mediaRows[facade.DiskId];
98 } 94 }
99 else if (mediaRow.DiskId != facade.DiskId) 95 else if (mediaTuple.DiskId != facade.DiskId)
100 { 96 {
101 mediaRow.LastSequence = lastSequence; 97 mediaTuple.LastSequence = lastSequence;
102 mediaRow = mediaRows.Get(facade.DiskId); 98 mediaTuple = mediaRows[facade.DiskId];
103 } 99 }
104 100
105 var fileRow = fileRows.Get(facade.Id); 101 facade.Sequence = ++lastSequence;
106 fileRow.Sequence = ++lastSequence;
107 } 102 }
108 } 103 }
109 104
110 if (null != mediaRow) 105 if (null != mediaTuple)
111 { 106 {
112 mediaRow.LastSequence = lastSequence; 107 mediaTuple.LastSequence = lastSequence;
113 } 108 }
114 } 109 }
115 } 110 }