aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2020-05-06 13:42:03 +1000
committerSean Hall <r.sean.hall@gmail.com>2020-05-08 22:05:22 +1000
commitdb3c7998c80523d8a059f7a9c3214dbc5c8c1e23 (patch)
tree7fdeb1e91c3bcfd93c9cb379afcaf45732abe04c /src
parent2d23530fde970972c927680ee3df6466538ae8ca (diff)
downloadwix-db3c7998c80523d8a059f7a9c3214dbc5c8c1e23.tar.gz
wix-db3c7998c80523d8a059f7a9c3214dbc5c8c1e23.tar.bz2
wix-db3c7998c80523d8a059f7a9c3214dbc5c8c1e23.zip
Remove Heat files from Core.
Diffstat (limited to 'src')
-rw-r--r--src/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj2
-rw-r--r--src/WixToolset.Core.TestPackage/WixToolset.Core.TestPackage.csproj4
-rw-r--r--src/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj2
-rw-r--r--src/WixToolset.Core/Extensibility/AssemblyDefaultHeatExtensionAttribute.cs33
-rw-r--r--src/WixToolset.Core/Extensibility/HarvesterExtension.cs26
-rw-r--r--src/WixToolset.Core/Extensibility/HeatExtension.cs200
-rw-r--r--src/WixToolset.Core/Extensibility/IHarvesterCore.cs48
-rw-r--r--src/WixToolset.Core/Extensibility/IHeatCore.cs22
-rw-r--r--src/WixToolset.Core/Extensibility/MutatorExtension.cs198
-rw-r--r--src/WixToolset.Core/Harvester.cs79
-rw-r--r--src/WixToolset.Core/HarvesterCore.cs75
-rw-r--r--src/WixToolset.Core/HeatCore.cs43
-rw-r--r--src/WixToolset.Core/Mutator.cs115
-rw-r--r--src/WixToolset.Core/WixToolset.Core.csproj2
14 files changed, 5 insertions, 844 deletions
diff --git a/src/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj b/src/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj
index ae0e7023..786db9be 100644
--- a/src/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj
+++ b/src/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj
@@ -28,7 +28,7 @@
28 </ItemGroup> 28 </ItemGroup>
29 29
30 <ItemGroup> 30 <ItemGroup>
31 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta2-18618-05" PrivateAssets="All"/> 31 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
32 <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="all" /> 32 <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="all" />
33 </ItemGroup> 33 </ItemGroup>
34</Project> 34</Project>
diff --git a/src/WixToolset.Core.TestPackage/WixToolset.Core.TestPackage.csproj b/src/WixToolset.Core.TestPackage/WixToolset.Core.TestPackage.csproj
index e5a550f3..b58c38e8 100644
--- a/src/WixToolset.Core.TestPackage/WixToolset.Core.TestPackage.csproj
+++ b/src/WixToolset.Core.TestPackage/WixToolset.Core.TestPackage.csproj
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<!-- 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<!-- 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. -->
3 3
4<Project Sdk="Microsoft.NET.Sdk"> 4<Project Sdk="Microsoft.NET.Sdk">
@@ -22,7 +22,7 @@
22 </ItemGroup> 22 </ItemGroup>
23 23
24 <ItemGroup> 24 <ItemGroup>
25 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta2-18618-05" PrivateAssets="All"/> 25 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
26 <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="All" /> 26 <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="All" />
27 </ItemGroup> 27 </ItemGroup>
28 28
diff --git a/src/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj b/src/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj
index 5d68bfe4..c631b53b 100644
--- a/src/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj
+++ b/src/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj
@@ -24,7 +24,7 @@
24 </ItemGroup> 24 </ItemGroup>
25 25
26 <ItemGroup> 26 <ItemGroup>
27 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta2-18618-05" PrivateAssets="All" /> 27 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
28 <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="all" /> 28 <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="all" />
29 </ItemGroup> 29 </ItemGroup>
30</Project> 30</Project>
diff --git a/src/WixToolset.Core/Extensibility/AssemblyDefaultHeatExtensionAttribute.cs b/src/WixToolset.Core/Extensibility/AssemblyDefaultHeatExtensionAttribute.cs
deleted file mode 100644
index bb53e30c..00000000
--- a/src/WixToolset.Core/Extensibility/AssemblyDefaultHeatExtensionAttribute.cs
+++ /dev/null
@@ -1,33 +0,0 @@
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.Tools
4{
5 using System;
6
7 /// <summary>
8 /// Represents a custom attribute for declaring the type to use
9 /// as the default heat extension in an assembly.
10 /// </summary>
11 public class AssemblyDefaultHeatExtensionAttribute : Attribute
12 {
13 private readonly Type extensionType;
14
15 /// <summary>
16 /// Instantiate a new AssemblyDefaultHeatExtensionAttribute.
17 /// </summary>
18 /// <param name="extensionType">The type of the default heat extension in an assembly.</param>
19 public AssemblyDefaultHeatExtensionAttribute(Type extensionType)
20 {
21 this.extensionType = extensionType;
22 }
23
24 /// <summary>
25 /// Gets the type of the default heat extension in an assembly.
26 /// </summary>
27 /// <value>The type of the default heat extension in an assembly.</value>
28 public Type ExtensionType
29 {
30 get { return this.extensionType; }
31 }
32 }
33}
diff --git a/src/WixToolset.Core/Extensibility/HarvesterExtension.cs b/src/WixToolset.Core/Extensibility/HarvesterExtension.cs
deleted file mode 100644
index d8d0ab34..00000000
--- a/src/WixToolset.Core/Extensibility/HarvesterExtension.cs
+++ /dev/null
@@ -1,26 +0,0 @@
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
4{
5 using Wix = WixToolset.Data.Serialize;
6
7 /// <summary>
8 /// The base harvester extension. Any of these methods can be overridden to change
9 /// the behavior of the harvester.
10 /// </summary>
11 public abstract class HarvesterExtension
12 {
13 /// <summary>
14 /// Gets or sets the harvester core for the extension.
15 /// </summary>
16 /// <value>The harvester core for the extension.</value>
17 public IHarvesterCore Core { get; set; }
18
19 /// <summary>
20 /// Harvest a WiX document.
21 /// </summary>
22 /// <param name="argument">The argument for harvesting.</param>
23 /// <returns>The harvested Fragments.</returns>
24 public abstract Wix.Fragment[] Harvest(string argument);
25 }
26}
diff --git a/src/WixToolset.Core/Extensibility/HeatExtension.cs b/src/WixToolset.Core/Extensibility/HeatExtension.cs
deleted file mode 100644
index b0da75f1..00000000
--- a/src/WixToolset.Core/Extensibility/HeatExtension.cs
+++ /dev/null
@@ -1,200 +0,0 @@
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.Extensibility
4{
5 using System;
6 using System.IO;
7 using System.Reflection;
8 using WixToolset.Data;
9 using WixToolset.Tools;
10
11 /// <summary>
12 /// A command line option.
13 /// </summary>
14 public struct HeatCommandLineOption
15 {
16 public string Option;
17
18 public string Description;
19
20 /// <summary>
21 /// Instantiates a new CommandLineOption.
22 /// </summary>
23 /// <param name="option">The option name.</param>
24 /// <param name="description">The description of the option.</param>
25 public HeatCommandLineOption(string option, string description)
26 {
27 this.Option = option;
28 this.Description = description;
29 }
30 }
31
32 /// <summary>
33 /// An extension for the WiX Toolset Harvester application.
34 /// </summary>
35 public abstract class HeatExtension
36 {
37 /// <summary>
38 /// Gets or sets the heat core for the extension.
39 /// </summary>
40 /// <value>The heat core for the extension.</value>
41 public IHeatCore Core { get; set; }
42
43 /// <summary>
44 /// Gets the supported command line types for this extension.
45 /// </summary>
46 /// <value>The supported command line types for this extension.</value>
47 public virtual HeatCommandLineOption[] CommandLineTypes
48 {
49 get { return null; }
50 }
51
52 /// <summary>
53 /// Loads a HeatExtension from a type description string.
54 /// </summary>
55 /// <param name="extension">The extension type description string.</param>
56 /// <returns>The loaded HeatExtension.</returns>
57 /// <remarks>
58 /// <paramref name="extension"/> can be in several different forms:
59 /// <list type="number">
60 /// <item><term>AssemblyQualifiedName (TopNamespace.SubNameSpace.ContainingClass+NestedClass, MyAssembly, Version=1.3.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089)</term></item>
61 /// <item><term>AssemblyName (MyAssembly, Version=1.3.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089)</term></item>
62 /// <item><term>Absolute path to an assembly (C:\MyExtensions\ExtensionAssembly.dll)</term></item>
63 /// <item><term>Filename of an assembly in the application directory (ExtensionAssembly.dll)</term></item>
64 /// <item><term>Relative path to an assembly (..\..\MyExtensions\ExtensionAssembly.dll)</term></item>
65 /// </list>
66 /// To specify a particular class to use, prefix the fully qualified class name to the assembly and separate them with a comma.
67 /// For example: "TopNamespace.SubNameSpace.ContainingClass+NestedClass, C:\MyExtensions\ExtensionAssembly.dll"
68 /// </remarks>
69 public static HeatExtension Load(string extension)
70 {
71 Type extensionType = null;
72 int commaIndex = extension.IndexOf(',');
73 string className = String.Empty;
74 string assemblyName = extension;
75
76 if (0 <= commaIndex)
77 {
78 className = extension.Substring(0, commaIndex);
79 assemblyName = (extension.Length <= commaIndex + 1 ? String.Empty : extension.Substring(commaIndex + 1));
80 }
81
82 className = className.Trim();
83 assemblyName = assemblyName.Trim();
84
85 if (null == extensionType && 0 < assemblyName.Length)
86 {
87
88 Assembly extensionAssembly;
89
90 // case 3: Absolute path to an assembly
91 if (Path.IsPathRooted(assemblyName))
92 {
93 extensionAssembly = ExtensionLoadFrom(assemblyName);
94 }
95 else
96 {
97 try
98 {
99 // case 2: AssemblyName
100 extensionAssembly = Assembly.Load(assemblyName);
101 }
102 catch (IOException e)
103 {
104 if (e is FileLoadException || e is FileNotFoundException)
105 {
106 try
107 {
108 // case 4: Filename of an assembly in the application directory
109 extensionAssembly = Assembly.Load(Path.GetFileNameWithoutExtension(assemblyName));
110 }
111 catch (IOException innerE)
112 {
113 if (innerE is FileLoadException || innerE is FileNotFoundException)
114 {
115 // case 5: Relative path to an assembly
116
117 // we want to use Assembly.Load when we can because it has some benefits over Assembly.LoadFrom
118 // (see the documentation for Assembly.LoadFrom). However, it may fail when the path is a relative
119 // path, so we should try Assembly.LoadFrom one last time. We could have detected a directory
120 // separator character and used Assembly.LoadFrom directly, but dealing with path canonicalization
121 // issues is something we don't want to deal with if we don't have to.
122 extensionAssembly = ExtensionLoadFrom(assemblyName);
123 }
124 else
125 {
126 throw new WixException(ErrorMessages.InvalidExtension(assemblyName, innerE.Message));
127 }
128 }
129 }
130 else
131 {
132 throw new WixException(ErrorMessages.InvalidExtension(assemblyName, e.Message));
133 }
134 }
135 }
136
137 if (0 < className.Length)
138 {
139 try
140 {
141 // case 1: AssemblyQualifiedName
142 extensionType = extensionAssembly.GetType(className, true /* throwOnError */, true /* ignoreCase */);
143 }
144 catch (Exception e)
145 {
146 throw new WixException(ErrorMessages.InvalidExtensionType(assemblyName, className, e.GetType().ToString(), e.Message));
147 }
148 }
149 else
150 {
151 // if no class name was specified, then let's hope the assembly defined a default WixExtension
152 AssemblyDefaultHeatExtensionAttribute extensionAttribute = (AssemblyDefaultHeatExtensionAttribute)Attribute.GetCustomAttribute(extensionAssembly, typeof(AssemblyDefaultHeatExtensionAttribute));
153
154 if (null != extensionAttribute)
155 {
156 extensionType = extensionAttribute.ExtensionType;
157 }
158 else
159 {
160 throw new WixException(ErrorMessages.InvalidExtensionType(assemblyName, typeof(AssemblyDefaultHeatExtensionAttribute).ToString()));
161 }
162 }
163 }
164
165 if (extensionType.IsSubclassOf(typeof(HeatExtension)))
166 {
167 return Activator.CreateInstance(extensionType) as HeatExtension;
168 }
169 else
170 {
171 throw new WixException(ErrorMessages.InvalidExtensionType(extension, extensionType.ToString(), typeof(HeatExtension).ToString()));
172 }
173 }
174
175 /// <summary>
176 /// Parse the command line options for this extension.
177 /// </summary>
178 /// <param name="type">The active harvester type.</param>
179 /// <param name="args">The option arguments.</param>
180 public virtual void ParseOptions(string type, string[] args)
181 {
182 }
183
184 private static Assembly ExtensionLoadFrom(string assemblyName)
185 {
186 Assembly extensionAssembly = null;
187
188 try
189 {
190 extensionAssembly = Assembly.LoadFrom(assemblyName);
191 }
192 catch (Exception e)
193 {
194 throw new WixException(ErrorMessages.InvalidExtension(assemblyName, e.Message));
195 }
196
197 return extensionAssembly;
198 }
199 }
200}
diff --git a/src/WixToolset.Core/Extensibility/IHarvesterCore.cs b/src/WixToolset.Core/Extensibility/IHarvesterCore.cs
deleted file mode 100644
index a9001b46..00000000
--- a/src/WixToolset.Core/Extensibility/IHarvesterCore.cs
+++ /dev/null
@@ -1,48 +0,0 @@
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
4{
5 using WixToolset.Extensibility.Services;
6
7 /// <summary>
8 /// The WiX Toolset harvester core.
9 /// </summary>
10 public interface IHarvesterCore
11 {
12 IMessaging Messaging { get; set; }
13
14 /// <summary>
15 /// Gets or sets the value of the extension argument passed to heat.
16 /// </summary>
17 /// <value>The extension argument.</value>
18 string ExtensionArgument { get; set; }
19
20 /// <summary>
21 /// Gets or sets the value of the root directory that is being harvested.
22 /// </summary>
23 /// <value>The root directory being harvested.</value>
24 string RootDirectory { get; set; }
25
26 /// <summary>
27 /// Create an identifier based on passed file name
28 /// </summary>
29 /// <param name="name">File name to generate identifer from</param>
30 /// <returns></returns>
31 string CreateIdentifierFromFilename(string filename);
32
33 /// <summary>
34 /// Generate an identifier by hashing data from the row.
35 /// </summary>
36 /// <param name="prefix">Three letter or less prefix for generated row identifier.</param>
37 /// <param name="args">Information to hash.</param>
38 /// <returns>The generated identifier.</returns>
39 string GenerateIdentifier(string prefix, params string[] args);
40
41 /// <summary>
42 /// Resolves a file's path if the Wix.File.Source value starts with "SourceDir\".
43 /// </summary>
44 /// <param name="fileSource">The Wix.File.Source value with "SourceDir\".</param>
45 /// <returns>The full path of the file.</returns>
46 string ResolveFilePath(string fileSource);
47 }
48}
diff --git a/src/WixToolset.Core/Extensibility/IHeatCore.cs b/src/WixToolset.Core/Extensibility/IHeatCore.cs
deleted file mode 100644
index 1365dfaf..00000000
--- a/src/WixToolset.Core/Extensibility/IHeatCore.cs
+++ /dev/null
@@ -1,22 +0,0 @@
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.Extensibility
4{
5 /// <summary>
6 /// The WiX Toolset Harvester application core.
7 /// </summary>
8 public interface IHeatCore
9 {
10 /// <summary>
11 /// Gets the harvester.
12 /// </summary>
13 /// <value>The harvester.</value>
14 Harvester Harvester { get; }
15
16 /// <summary>
17 /// Gets the mutator.
18 /// </summary>
19 /// <value>The mutator.</value>
20 Mutator Mutator { get; }
21 }
22}
diff --git a/src/WixToolset.Core/Extensibility/MutatorExtension.cs b/src/WixToolset.Core/Extensibility/MutatorExtension.cs
deleted file mode 100644
index afc76b79..00000000
--- a/src/WixToolset.Core/Extensibility/MutatorExtension.cs
+++ /dev/null
@@ -1,198 +0,0 @@
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.Extensibility
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Diagnostics.CodeAnalysis;
8 using System.Text;
9
10 using Wix = WixToolset.Data.Serialize;
11
12 /// <summary>
13 /// The base mutator extension. Any of these methods can be overridden to change
14 /// the behavior of the mutator.
15 /// </summary>
16 public abstract class MutatorExtension
17 {
18 /// <summary>
19 /// Gets or sets the mutator core for the extension.
20 /// </summary>
21 /// <value>The mutator core for the extension.</value>
22 public IHarvesterCore Core { get; set; }
23
24 /// <summary>
25 /// Gets the sequence of the extension.
26 /// </summary>
27 /// <value>The sequence of the extension.</value>
28 public abstract int Sequence
29 {
30 get;
31 }
32
33 /// <summary>
34 /// Mutate a WiX document.
35 /// </summary>
36 /// <param name="wix">The Wix document element.</param>
37 public virtual void Mutate(Wix.Wix wix)
38 {
39 }
40
41 /// <summary>
42 /// Mutate a WiX document as a string.
43 /// </summary>
44 /// <param name="wix">The Wix document element as a string.</param>
45 /// <returns>The mutated Wix document as a string.</returns>
46 public virtual string Mutate(string wixString)
47 {
48 return wixString;
49 }
50
51 /// <summary>
52 /// Generate unique MSI identifiers.
53 /// </summary>
54 protected class IdentifierGenerator
55 {
56 public const int MaxProductIdentifierLength = 72;
57 public const int MaxModuleIdentifierLength = 35;
58
59 private string baseName;
60 private int maxLength;
61 private Dictionary<string, object> existingIdentifiers;
62 private Dictionary<string, object> possibleIdentifiers;
63
64 /// <summary>
65 /// Instantiate a new IdentifierGenerator.
66 /// </summary>
67 /// <param name="baseName">The base resource name to use if a resource name contains no usable characters.</param>
68 public IdentifierGenerator(string baseName)
69 {
70 this.baseName = baseName;
71 this.maxLength = IdentifierGenerator.MaxProductIdentifierLength;
72 this.existingIdentifiers = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
73 this.possibleIdentifiers = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
74 }
75
76 /// <summary>
77 /// Gets or sets the maximum length for generated identifiers.
78 /// </summary>
79 /// <value>Maximum length for generated identifiers. (Default is 72.)</value>
80 public int MaxIdentifierLength
81 {
82 get { return this.maxLength; }
83 set { this.maxLength = value; }
84 }
85
86 /// <summary>
87 /// Index an existing identifier for collision detection.
88 /// </summary>
89 /// <param name="identifier">The identifier.</param>
90 public void IndexExistingIdentifier(string identifier)
91 {
92 if (null == identifier)
93 {
94 throw new ArgumentNullException("identifier");
95 }
96
97 this.existingIdentifiers[identifier] = null;
98 }
99
100 /// <summary>
101 /// Index a resource name for collision detection.
102 /// </summary>
103 /// <param name="name">The resource name.</param>
104 public void IndexName(string name)
105 {
106 if (null == name)
107 {
108 throw new ArgumentNullException("name");
109 }
110
111 string identifier = this.CreateIdentifier(name, 0);
112
113 if (this.possibleIdentifiers.ContainsKey(identifier))
114 {
115 this.possibleIdentifiers[identifier] = String.Empty;
116 }
117 else
118 {
119 this.possibleIdentifiers.Add(identifier, null);
120 }
121 }
122
123 /// <summary>
124 /// Get the identifier for the given resource name.
125 /// </summary>
126 /// <param name="name">The resource name.</param>
127 /// <returns>A legal MSI identifier.</returns>
128 [SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "System.InvalidOperationException.#ctor(System.String)")]
129 public string GetIdentifier(string name)
130 {
131 if (null == name)
132 {
133 throw new ArgumentNullException("name");
134 }
135
136 for (int i = 0; i <= Int32.MaxValue; i++)
137 {
138 string identifier = this.CreateIdentifier(name, i);
139
140 if (this.existingIdentifiers.ContainsKey(identifier) || // already used
141 (0 == i && 0 != this.possibleIdentifiers.Count && null != this.possibleIdentifiers[identifier]) || // needs an index because its duplicated
142 (0 != i && this.possibleIdentifiers.ContainsKey(identifier))) // collides with another possible identifier
143 {
144 continue;
145 }
146 else // use this identifier
147 {
148 this.existingIdentifiers.Add(identifier, null);
149
150 return identifier;
151 }
152 }
153
154 throw new InvalidOperationException("Could not find a unique identifier for the given resource name.");
155 }
156
157 /// <summary>
158 /// Create a legal MSI identifier from a resource name and an index.
159 /// </summary>
160 /// <param name="name">The name of the resource for which an identifier should be created.</param>
161 /// <param name="index">An index to append to the end of the identifier to make it unique.</param>
162 /// <returns>A legal MSI identifier.</returns>
163 public string CreateIdentifier(string name, int index)
164 {
165 if (null == name)
166 {
167 throw new ArgumentNullException("name");
168 }
169
170 StringBuilder identifier = new StringBuilder();
171
172 // Convert the name to a standard MSI identifier
173 identifier.Append(Common.GetIdentifierFromName(name));
174
175 // no legal identifier characters were found, use the base id instead
176 if (0 == identifier.Length)
177 {
178 identifier.Append(this.baseName);
179 }
180
181 // truncate the identifier if it's too long (reserve 3 characters for up to 99 collisions)
182 int adjustedMaxLength = this.MaxIdentifierLength - (index != 0 ? 3 : 0);
183 if (adjustedMaxLength < identifier.Length)
184 {
185 identifier.Length = adjustedMaxLength;
186 }
187
188 // if the index is not zero, then append it to the identifier name
189 if (0 != index)
190 {
191 identifier.AppendFormat("_{0}", index);
192 }
193
194 return identifier.ToString();
195 }
196 }
197 }
198}
diff --git a/src/WixToolset.Core/Harvester.cs b/src/WixToolset.Core/Harvester.cs
deleted file mode 100644
index 3399420c..00000000
--- a/src/WixToolset.Core/Harvester.cs
+++ /dev/null
@@ -1,79 +0,0 @@
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
4{
5 using System;
6 using System.Diagnostics.CodeAnalysis;
7 using WixToolset.Data;
8 using Wix = WixToolset.Data.Serialize;
9
10 /// <summary>
11 /// The WiX Toolset harvester.
12 /// </summary>
13 public class Harvester
14 {
15 private HarvesterExtension harvesterExtension;
16
17 /// <summary>
18 /// Gets or sets the harvester core for the extension.
19 /// </summary>
20 /// <value>The harvester core for the extension.</value>
21 public IHarvesterCore Core { get; set; }
22
23 /// <summary>
24 /// Gets or sets the extension.
25 /// </summary>
26 /// <value>The extension.</value>
27 [SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "System.InvalidOperationException.#ctor(System.String)")]
28 public HarvesterExtension Extension
29 {
30 get
31 {
32 return this.harvesterExtension;
33 }
34 set
35 {
36 if (null != this.harvesterExtension)
37 {
38 throw new InvalidOperationException("Multiple harvester extensions specified.");
39 }
40
41 this.harvesterExtension = value;
42 }
43 }
44
45 /// <summary>
46 /// Harvest wix authoring.
47 /// </summary>
48 /// <param name="argument">The argument for harvesting.</param>
49 /// <returns>The harvested wix authoring.</returns>
50 public Wix.Wix Harvest(string argument)
51 {
52 if (null == argument)
53 {
54 throw new ArgumentNullException("argument");
55 }
56
57 if (null == this.harvesterExtension)
58 {
59 throw new WixException(ErrorMessages.HarvestTypeNotFound());
60 }
61
62 this.harvesterExtension.Core = this.Core;
63
64 Wix.Fragment[] fragments = this.harvesterExtension.Harvest(argument);
65 if (null == fragments || 0 == fragments.Length)
66 {
67 return null;
68 }
69
70 Wix.Wix wix = new Wix.Wix();
71 foreach (Wix.Fragment fragment in fragments)
72 {
73 wix.AddChild(fragment);
74 }
75
76 return wix;
77 }
78 }
79}
diff --git a/src/WixToolset.Core/HarvesterCore.cs b/src/WixToolset.Core/HarvesterCore.cs
deleted file mode 100644
index 70991979..00000000
--- a/src/WixToolset.Core/HarvesterCore.cs
+++ /dev/null
@@ -1,75 +0,0 @@
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
4{
5 using System;
6 using System.Diagnostics.CodeAnalysis;
7 using System.IO;
8 using WixToolset.Extensibility.Services;
9
10 /// <summary>
11 /// The WiX Toolset harvester core.
12 /// </summary>
13 public class HarvesterCore : IHarvesterCore
14 {
15 public IMessaging Messaging { get; set; }
16
17 /// <summary>
18 /// Gets or sets the value of the extension argument passed to heat.
19 /// </summary>
20 /// <value>The extension argument.</value>
21 public string ExtensionArgument { get; set; }
22
23 /// <summary>
24 /// Gets or sets the value of the root directory that is being harvested.
25 /// </summary>
26 /// <value>The root directory being harvested.</value>
27 public string RootDirectory { get; set; }
28
29 /// <summary>
30 /// Create an identifier based on passed file name
31 /// </summary>
32 /// <param name="name">File name to generate identifer from</param>
33 /// <returns></returns>
34 public string CreateIdentifierFromFilename(string filename)
35 {
36 return Common.GetIdentifierFromName(filename);
37 }
38
39 /// <summary>
40 /// Generate an identifier by hashing data from the row.
41 /// </summary>
42 /// <param name="prefix">Three letter or less prefix for generated row identifier.</param>
43 /// <param name="args">Information to hash.</param>
44 /// <returns>The generated identifier.</returns>
45 [SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "System.InvalidOperationException.#ctor(System.String)")]
46 public string GenerateIdentifier(string prefix, params string[] args)
47 {
48 return Common.GenerateIdentifier(prefix, args);
49 }
50
51 /// <summary>
52 /// Resolves a file's path if the Wix.File.Source value starts with "SourceDir\".
53 /// </summary>
54 /// <param name="fileSource">The Wix.File.Source value with "SourceDir\".</param>
55 /// <returns>The full path of the file.</returns>
56 public string ResolveFilePath(string fileSource)
57 {
58 if (fileSource.StartsWith("SourceDir\\", StringComparison.Ordinal))
59 {
60 string file = Path.GetFullPath(this.RootDirectory);
61 if (File.Exists(file))
62 {
63 return file;
64 }
65 else
66 {
67 fileSource = fileSource.Substring(10);
68 fileSource = Path.Combine(Path.GetFullPath(this.RootDirectory), fileSource);
69 }
70 }
71
72 return fileSource;
73 }
74 }
75}
diff --git a/src/WixToolset.Core/HeatCore.cs b/src/WixToolset.Core/HeatCore.cs
deleted file mode 100644
index d43b5f3d..00000000
--- a/src/WixToolset.Core/HeatCore.cs
+++ /dev/null
@@ -1,43 +0,0 @@
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
4{
5 using WixToolset.Core.Extensibility;
6
7 /// <summary>
8 /// The WiX Toolset Harvester application core.
9 /// </summary>
10 public class HeatCore : IHeatCore
11 {
12 private Harvester harvester;
13 private Mutator mutator;
14
15 /// <summary>
16 /// Instantiates a new HeatCore.
17 /// </summary>
18 /// <param name="messageHandler">The message handler for the core.</param>
19 public HeatCore()
20 {
21 this.harvester = new Harvester();
22 this.mutator = new Mutator();
23 }
24
25 /// <summary>
26 /// Gets the harvester.
27 /// </summary>
28 /// <value>The harvester.</value>
29 public Harvester Harvester
30 {
31 get { return this.harvester; }
32 }
33
34 /// <summary>
35 /// Gets the mutator.
36 /// </summary>
37 /// <value>The mutator.</value>
38 public Mutator Mutator
39 {
40 get { return this.mutator; }
41 }
42 }
43}
diff --git a/src/WixToolset.Core/Mutator.cs b/src/WixToolset.Core/Mutator.cs
deleted file mode 100644
index cee17736..00000000
--- a/src/WixToolset.Core/Mutator.cs
+++ /dev/null
@@ -1,115 +0,0 @@
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
4{
5 using System;
6 using System.Collections;
7 using WixToolset.Core.Extensibility;
8 using Wix = WixToolset.Data.Serialize;
9
10 /// <summary>
11 /// The WiX Toolset mutator.
12 /// </summary>
13 public class Mutator
14 {
15 private SortedList extensions;
16 private string extensionArgument;
17
18 /// <summary>
19 /// Instantiate a new mutator.
20 /// </summary>
21 public Mutator()
22 {
23 this.extensions = new SortedList();
24 }
25
26 /// <summary>
27 /// Gets or sets the harvester core for the extension.
28 /// </summary>
29 /// <value>The harvester core for the extension.</value>
30 public IHarvesterCore Core { get; set; }
31
32 /// <summary>
33 /// Gets or sets the value of the extension argument passed to heat.
34 /// </summary>
35 /// <value>The extension argument.</value>
36 public string ExtensionArgument
37 {
38 get { return this.extensionArgument; }
39 set { this.extensionArgument = value; }
40 }
41
42 /// <summary>
43 /// Adds a mutator extension.
44 /// </summary>
45 /// <param name="mutatorExtension">The mutator extension to add.</param>
46 public void AddExtension(MutatorExtension mutatorExtension)
47 {
48 this.extensions.Add(mutatorExtension.Sequence, mutatorExtension);
49 }
50
51 /// <summary>
52 /// Mutate a WiX document.
53 /// </summary>
54 /// <param name="wix">The Wix document element.</param>
55 /// <returns>true if mutation was successful</returns>
56 public bool Mutate(Wix.Wix wix)
57 {
58 bool encounteredError = false;
59
60 try
61 {
62 foreach (MutatorExtension mutatorExtension in this.extensions.Values)
63 {
64 if (null == mutatorExtension.Core)
65 {
66 mutatorExtension.Core = this.Core;
67 }
68
69 mutatorExtension.Mutate(wix);
70 }
71 }
72 finally
73 {
74 encounteredError = this.Core.Messaging.EncounteredError;
75 }
76
77 // return the Wix document element only if mutation completed successfully
78 return !encounteredError;
79 }
80
81 /// <summary>
82 /// Mutate a WiX document.
83 /// </summary>
84 /// <param name="wixString">The Wix document as a string.</param>
85 /// <returns>The mutated Wix document as a string if mutation was successful, else null.</returns>
86 public string Mutate(string wixString)
87 {
88 bool encounteredError = false;
89
90 try
91 {
92 foreach (MutatorExtension mutatorExtension in this.extensions.Values)
93 {
94 if (null == mutatorExtension.Core)
95 {
96 mutatorExtension.Core = this.Core;
97 }
98
99 wixString = mutatorExtension.Mutate(wixString);
100
101 if (String.IsNullOrEmpty(wixString) || this.Core.Messaging.EncounteredError)
102 {
103 break;
104 }
105 }
106 }
107 finally
108 {
109 encounteredError = this.Core.Messaging.EncounteredError;
110 }
111
112 return encounteredError ? null : wixString;
113 }
114 }
115}
diff --git a/src/WixToolset.Core/WixToolset.Core.csproj b/src/WixToolset.Core/WixToolset.Core.csproj
index 4e205641..3e7bea3b 100644
--- a/src/WixToolset.Core/WixToolset.Core.csproj
+++ b/src/WixToolset.Core/WixToolset.Core.csproj
@@ -25,7 +25,7 @@
25 </ItemGroup> 25 </ItemGroup>
26 26
27 <ItemGroup> 27 <ItemGroup>
28 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta2-18618-05" PrivateAssets="All" /> 28 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
29 <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="All" /> 29 <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="All" />
30 </ItemGroup> 30 </ItemGroup>
31</Project> 31</Project>