main
cs 109 lines 3.87 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.WindowsInstaller.Bind
4 {
5 using System.Collections.Generic;
6 using System.Linq;
7 using WixToolset.Data;
8 using WixToolset.Data.Symbols;
9 using WixToolset.Extensibility.Data;
10
11 internal class UpdateMediaSequencesCommand
12 {
13 public UpdateMediaSequencesCommand(IntermediateSection section, IEnumerable<IFileFacade> fileFacades)
14 {
15 this.Section = section;
16 this.FileFacades = fileFacades;
17 }
18
19 private IntermediateSection Section { get; }
20
21 private IEnumerable<IFileFacade> FileFacades { get; }
22
23 public void Execute()
24 {
25 var mediaRows = this.Section.Symbols.OfType<MediaSymbol>().ToDictionary(t => t.DiskId);
26
27 // Calculate sequence numbers and media disk id layout for all file media information objects.
28 if (SectionType.Module == this.Section.Type)
29 {
30 var lastSequence = 0;
31
32 foreach (var facade in this.FileFacades)
33 {
34 facade.Sequence = ++lastSequence;
35 }
36 }
37 else
38 {
39 var lastSequence = 0;
40 MediaSymbol mediaSymbol = null;
41 var patchGroups = new Dictionary<int, List<IFileFacade>>();
42
43 // Sequence the non-patch-added files.
44 foreach (var facade in this.FileFacades)
45 {
46 if (null == mediaSymbol)
47 {
48 mediaSymbol = mediaRows[facade.DiskId];
49 if (SectionType.Patch == this.Section.Type)
50 {
51 // patch Media cannot start at zero
52 lastSequence = mediaSymbol.LastSequence ?? 1;
53 }
54 }
55 else if (mediaSymbol.DiskId != facade.DiskId)
56 {
57 mediaSymbol.LastSequence = lastSequence;
58 mediaSymbol = mediaRows[facade.DiskId];
59 }
60
61 if (facade.PatchGroup.HasValue)
62 {
63 if (!patchGroups.TryGetValue(facade.PatchGroup.Value, out var patchGroup))
64 {
65 patchGroup = new List<IFileFacade>();
66 patchGroups.Add(facade.PatchGroup.Value, patchGroup);
67 }
68
69 patchGroup.Add(facade);
70 }
71 else
72 {
73 facade.Sequence = ++lastSequence;
74 }
75 }
76
77 if (null != mediaSymbol)
78 {
79 mediaSymbol.LastSequence = lastSequence;
80 mediaSymbol = null;
81 }
82
83 // Sequence the patch-added files.
84 foreach (var patchGroup in patchGroups.Values)
85 {
86 foreach (var facade in patchGroup)
87 {
88 if (null == mediaSymbol)
89 {
90 mediaSymbol = mediaRows[facade.DiskId];
91 }
92 else if (mediaSymbol.DiskId != facade.DiskId)
93 {
94 mediaSymbol.LastSequence = lastSequence;
95 mediaSymbol = mediaRows[facade.DiskId];
96 }
97
98 facade.Sequence = ++lastSequence;
99 }
100 }
101
102 if (null != mediaSymbol)
103 {
104 mediaSymbol.LastSequence = lastSequence;
105 }
106 }
107 }
108 }
109 }