summaryrefslogtreecommitdiff
path: root/src/tools/heat/IIsHarvesterMutator.cs
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2022-07-26 17:20:39 -0700
committerRob Mensching <rob@firegiant.com>2022-08-01 20:25:19 -0700
commita627ca9b720047e633a8fe72003ab9bee31006c5 (patch)
tree2bc8a924bb4141ab718e74d08f6459a0ffe8d573 /src/tools/heat/IIsHarvesterMutator.cs
parent521eb3c9cf38823a2c4019abb85dc0b3200b92cb (diff)
downloadwix-a627ca9b720047e633a8fe72003ab9bee31006c5.tar.gz
wix-a627ca9b720047e633a8fe72003ab9bee31006c5.tar.bz2
wix-a627ca9b720047e633a8fe72003ab9bee31006c5.zip
Create WixToolset.Heat.nupkg to distribute heat.exe and Heat targets
Moves Heat functionality to the "tools" layer and packages it all up in WixToolset.Heat.nupkg for distribution in WiX v4. Completes 6838
Diffstat (limited to 'src/tools/heat/IIsHarvesterMutator.cs')
-rw-r--r--src/tools/heat/IIsHarvesterMutator.cs429
1 files changed, 429 insertions, 0 deletions
diff --git a/src/tools/heat/IIsHarvesterMutator.cs b/src/tools/heat/IIsHarvesterMutator.cs
new file mode 100644
index 00000000..a0147d0f
--- /dev/null
+++ b/src/tools/heat/IIsHarvesterMutator.cs
@@ -0,0 +1,429 @@
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.Harvesters
4{
5 using System;
6 using System.Collections;
7 using System.Collections.Specialized;
8 using System.IO;
9 using WixToolset.Harvesters.Extensibility;
10 using IIs = Serialize.IIs;
11 using Wix = WixToolset.Harvesters.Serialize;
12
13 /// <summary>
14 /// The harvester mutator for the WiX Toolset Internet Information Services Extension.
15 /// </summary>
16 public sealed class IIsHarvesterMutator : BaseMutatorExtension
17 {
18 private ArrayList components;
19 private DirectoryHarvester directoryHarvester;
20 private Hashtable directoryPaths;
21 private FileHarvester fileHarvester;
22 private Wix.IParentElement rootElement;
23 private bool setUniqueIdentifiers;
24 private ArrayList webAddresses;
25 private ArrayList webDirs;
26 private ArrayList webDirProperties;
27 private ArrayList webFilters;
28 private ArrayList webSites;
29 private ArrayList webVirtualDirs;
30
31 /// <summary>
32 /// Instantiate a new IIsHarvesterMutator.
33 /// </summary>
34 public IIsHarvesterMutator()
35 {
36 this.components = new ArrayList();
37 this.directoryHarvester = new DirectoryHarvester();
38 this.directoryPaths = CollectionsUtil.CreateCaseInsensitiveHashtable();
39 this.fileHarvester = new FileHarvester();
40 this.webAddresses = new ArrayList();
41 this.webDirs = new ArrayList();
42 this.webDirProperties = new ArrayList();
43 this.webFilters = new ArrayList();
44 this.webSites = new ArrayList();
45 this.webVirtualDirs = new ArrayList();
46 }
47
48 /// <summary>
49 /// Gets the sequence of this mutator extension.
50 /// </summary>
51 /// <value>The sequence of this mutator extension.</value>
52 public override int Sequence
53 {
54 get { return 100; }
55 }
56
57 /// <summary>
58 /// Gets of sets the option to set unique identifiers.
59 /// </summary>
60 /// <value>The option to set unique identifiers.</value>
61 public bool SetUniqueIdentifiers
62 {
63 get { return this.setUniqueIdentifiers; }
64 set { this.setUniqueIdentifiers = value; }
65 }
66
67 /// <summary>
68 /// Mutate a WiX document.
69 /// </summary>
70 /// <param name="wix">The Wix document element.</param>
71 public override void Mutate(Wix.Wix wix)
72 {
73 this.components.Clear();
74 this.directoryPaths.Clear();
75 this.webAddresses.Clear();
76 this.webDirs.Clear();
77 this.webDirProperties.Clear();
78 this.webFilters.Clear();
79 this.webSites.Clear();
80 this.webVirtualDirs.Clear();
81 this.rootElement = null;
82
83 this.IndexElement(wix);
84
85 this.MutateWebAddresses();
86
87 this.MutateWebDirs();
88
89 this.MutateWebDirProperties();
90
91 this.MutateWebSites();
92
93 this.MutateWebVirtualDirs();
94
95 // this must come after the web virtual dirs in case they harvest a directory containing a web filter file
96 this.MutateWebFilters();
97
98 // this must come after the web site identifiers are created
99 this.MutateComponents();
100 }
101
102 /// <summary>
103 /// Harvest a new directory or return one that was previously harvested.
104 /// </summary>
105 /// <param name="path">The path of the directory.</param>
106 /// <param name="harvestChildren">The option to harvest the children of the directory.</param>
107 /// <returns>The harvested directory.</returns>
108 private Wix.Directory HarvestUniqueDirectory(string path, bool harvestChildren)
109 {
110 if (this.directoryPaths.Contains(path))
111 {
112 return (Wix.Directory)this.directoryPaths[path];
113 }
114 else
115 {
116 Wix.Directory directory = this.directoryHarvester.HarvestDirectory(path, harvestChildren);
117
118 this.rootElement.AddChild(directory);
119
120 // index this new directory and all of its children
121 this.IndexElement(directory);
122
123 return directory;
124 }
125 }
126
127 /// <summary>
128 /// Index an element.
129 /// </summary>
130 /// <param name="element">The element to index.</param>
131 private void IndexElement(Wix.ISchemaElement element)
132 {
133 if (element is IIs.WebAddress)
134 {
135 this.webAddresses.Add(element);
136 }
137 else if (element is IIs.WebDir)
138 {
139 this.webDirs.Add(element);
140 }
141 else if (element is IIs.WebDirProperties)
142 {
143 this.webDirProperties.Add(element);
144 }
145 else if (element is IIs.WebFilter)
146 {
147 this.webFilters.Add(element);
148 }
149 else if (element is IIs.WebSite)
150 {
151 this.webSites.Add(element);
152 }
153 else if (element is IIs.WebVirtualDir)
154 {
155 this.webVirtualDirs.Add(element);
156 }
157 else if (element is Wix.Component)
158 {
159 this.components.Add(element);
160 }
161 else if (element is Wix.Directory)
162 {
163 Wix.Directory directory = (Wix.Directory)element;
164
165 if (null != directory.FileSource)
166 {
167 this.directoryPaths.Add(directory.FileSource, directory);
168 }
169 }
170 else if (element is Wix.Fragment || element is Wix.Module || element is Wix.PatchCreation || element is Wix.Package)
171 {
172 this.rootElement = (Wix.IParentElement)element;
173 }
174
175 // index the child elements
176 if (element is Wix.IParentElement)
177 {
178 foreach (Wix.ISchemaElement childElement in ((Wix.IParentElement)element).Children)
179 {
180 this.IndexElement(childElement);
181 }
182 }
183 }
184
185 /// <summary>
186 /// Mutate the Component elements.
187 /// </summary>
188 private void MutateComponents()
189 {
190 if (this.setUniqueIdentifiers)
191 {
192 IdentifierGenerator identifierGenerator = new IdentifierGenerator("Component", this.Core);
193
194 // index all the existing identifiers
195 foreach (Wix.Component component in this.components)
196 {
197 if (null != component.Id)
198 {
199 identifierGenerator.IndexExistingIdentifier(component.Id);
200 }
201 }
202
203 // index all the web site identifiers
204 foreach (IIs.WebSite webSite in this.webSites)
205 {
206 if (webSite.ParentElement is Wix.Component)
207 {
208 identifierGenerator.IndexName(webSite.Id);
209 }
210 }
211
212 // create an identifier for each component based on its child web site identifier
213 foreach (IIs.WebSite webSite in this.webSites)
214 {
215 Wix.Component component = webSite.ParentElement as Wix.Component;
216
217 if (null != component)
218 {
219 component.Id = identifierGenerator.GetIdentifier(webSite.Id);
220 }
221 }
222 }
223 }
224
225 /// <summary>
226 /// Mutate the WebAddress elements.
227 /// </summary>
228 private void MutateWebAddresses()
229 {
230 if (this.setUniqueIdentifiers)
231 {
232 IdentifierGenerator identifierGenerator = new IdentifierGenerator("WebAddress", this.Core);
233
234 // index all the existing identifiers and names
235 foreach (IIs.WebAddress webAddress in this.webAddresses)
236 {
237 if (null != webAddress.Id)
238 {
239 identifierGenerator.IndexExistingIdentifier(webAddress.Id);
240 }
241 else
242 {
243 identifierGenerator.IndexName(String.Concat(webAddress.IP, "_", webAddress.Port));
244 }
245 }
246
247 foreach (IIs.WebAddress webAddress in this.webAddresses)
248 {
249 if (null == webAddress.Id)
250 {
251 webAddress.Id = identifierGenerator.GetIdentifier(String.Concat(webAddress.IP, "_", webAddress.Port));
252 }
253 }
254 }
255 }
256
257 /// <summary>
258 /// Mutate the WebDir elements.
259 /// </summary>
260 private void MutateWebDirs()
261 {
262 if (this.setUniqueIdentifiers)
263 {
264 IdentifierGenerator identifierGenerator = new IdentifierGenerator("WebDir", this.Core);
265
266 // index all the existing identifiers and names
267 foreach (IIs.WebDir webDir in this.webDirs)
268 {
269 if (null != webDir.Id)
270 {
271 identifierGenerator.IndexExistingIdentifier(webDir.Id);
272 }
273 else
274 {
275 identifierGenerator.IndexName(webDir.Path);
276 }
277 }
278
279 foreach (IIs.WebDir webDir in this.webDirs)
280 {
281 if (null == webDir.Id)
282 {
283 webDir.Id = identifierGenerator.GetIdentifier(webDir.Path);
284 }
285 }
286 }
287 }
288
289 /// <summary>
290 /// Mutate the WebDirProperties elements.
291 /// </summary>
292 private void MutateWebDirProperties()
293 {
294 if (this.setUniqueIdentifiers)
295 {
296 IdentifierGenerator identifierGenerator = new IdentifierGenerator("WebDirProperties", this.Core);
297
298 // index all the existing identifiers and names
299 foreach (IIs.WebDirProperties webDirProperties in this.webDirProperties)
300 {
301 if (null != webDirProperties.Id)
302 {
303 identifierGenerator.IndexExistingIdentifier(webDirProperties.Id);
304 }
305 }
306
307 foreach (IIs.WebDirProperties webDirProperties in this.webDirProperties)
308 {
309 if (null == webDirProperties.Id)
310 {
311 webDirProperties.Id = identifierGenerator.GetIdentifier(String.Empty);
312 }
313 }
314 }
315 }
316
317 /// <summary>
318 /// Mutate the WebFilter elements.
319 /// </summary>
320 private void MutateWebFilters()
321 {
322 IdentifierGenerator identifierGenerator = null;
323
324 if (this.setUniqueIdentifiers)
325 {
326 identifierGenerator = new IdentifierGenerator("WebFilter", this.Core);
327
328 // index all the existing identifiers and names
329 foreach (IIs.WebFilter webFilter in this.webFilters)
330 {
331 if (null != webFilter.Id)
332 {
333 identifierGenerator.IndexExistingIdentifier(webFilter.Id);
334 }
335 else
336 {
337 identifierGenerator.IndexName(webFilter.Name);
338 }
339 }
340 }
341
342 foreach (IIs.WebFilter webFilter in this.webFilters)
343 {
344 if (this.setUniqueIdentifiers && null == webFilter.Id)
345 {
346 webFilter.Id = identifierGenerator.GetIdentifier(webFilter.Name);
347 }
348
349 // harvest the file for this WebFilter
350 Wix.Directory directory = this.HarvestUniqueDirectory(Path.GetDirectoryName(webFilter.Path), false);
351
352 Wix.Component component = new Wix.Component();
353 directory.AddChild(component);
354
355 Wix.File file = this.fileHarvester.HarvestFile(webFilter.Path);
356 component.AddChild(file);
357 }
358 }
359
360 /// <summary>
361 /// Mutate the WebSite elements.
362 /// </summary>
363 private void MutateWebSites()
364 {
365 if (this.setUniqueIdentifiers)
366 {
367 IdentifierGenerator identifierGenerator = new IdentifierGenerator("WebSite", this.Core);
368
369 // index all the existing identifiers and names
370 foreach (IIs.WebSite webSite in this.webSites)
371 {
372 if (null != webSite.Id)
373 {
374 identifierGenerator.IndexExistingIdentifier(webSite.Id);
375 }
376 else
377 {
378 identifierGenerator.IndexName(webSite.Description);
379 }
380 }
381
382 foreach (IIs.WebSite webSite in this.webSites)
383 {
384 if (null == webSite.Id)
385 {
386 webSite.Id = identifierGenerator.GetIdentifier(webSite.Description);
387 }
388 }
389 }
390 }
391
392 /// <summary>
393 /// Mutate the WebVirtualDir elements.
394 /// </summary>
395 private void MutateWebVirtualDirs()
396 {
397 IdentifierGenerator identifierGenerator = null;
398
399 if (this.setUniqueIdentifiers)
400 {
401 identifierGenerator = new IdentifierGenerator("WebVirtualDir", this.Core);
402
403 // index all the existing identifiers and names
404 foreach (IIs.WebVirtualDir webVirtualDir in this.webVirtualDirs)
405 {
406 if (null != webVirtualDir.Id)
407 {
408 identifierGenerator.IndexExistingIdentifier(webVirtualDir.Id);
409 }
410 else
411 {
412 identifierGenerator.IndexName(webVirtualDir.Alias);
413 }
414 }
415 }
416
417 foreach (IIs.WebVirtualDir webVirtualDir in this.webVirtualDirs)
418 {
419 if (this.setUniqueIdentifiers && null == webVirtualDir.Id)
420 {
421 webVirtualDir.Id = identifierGenerator.GetIdentifier(webVirtualDir.Alias);
422 }
423
424 // harvest the directory for this WebVirtualDir
425 this.HarvestUniqueDirectory(webVirtualDir.Directory, true);
426 }
427 }
428 }
429}