Additional IR updates
Rob Mensching committed
Nov 11, 2017 at 01:40 UTC
414bf166e07703056ad186fa8ec23a4119dd9993
10 files changed
+600
-16
src/WixToolset.Data/FileStructure.cs
+1
-1
@@ -61,7 +61,7 @@ namespace WixToolset.Data
61
{
62
fs.WriteType(writer, fileFormat);
63
64
- fs.WriteEmbeddedFiles(writer, embedFilePaths.ToArray());
64
+ fs.WriteEmbeddedFiles(writer, embedFilePaths?.ToArray() ?? Array.Empty<string>());
65
66
// Remember the data stream offset, which is right after the embedded files have been written.
67
fs.dataStreamOffset = stream.Position;
src/WixToolset.Data/Identifier.cs
+24
-3
@@ -4,9 +4,10 @@ namespace WixToolset.Data
4
{
5
using System;
6
using System.Diagnostics;
7
+ using SimpleJson;
8
9
/// <summary>
9
- /// Class to define the identifier and access for a row.
10
+ /// Class to define the identifier and access for a tuple.
11
/// </summary>
12
[DebuggerDisplay("{Access} {Id,nq}")]
13
public class Identifier
@@ -26,13 +27,33 @@ namespace WixToolset.Data
27
}
28
29
/// <summary>
29
- /// Access modifier for a row.
30
+ /// Access modifier for a tuple.
31
/// </summary>
32
public AccessModifier Access { get; }
33
34
/// <summary>
34
- /// Identifier for the row.
35
+ /// Identifier for the tuple.
36
/// </summary>
37
public string Id { get; }
38
+
39
+ internal static Identifier Deserialize(JsonObject jsonObject)
40
+ {
41
+ var id = jsonObject.GetValueOrDefault<string>("id");
42
+ var accessValue = jsonObject.GetValueOrDefault<string>("access");
43
+ Enum.TryParse(accessValue, true, out AccessModifier access);
44
+
45
+ return new Identifier(id, access);
46
+ }
47
+
48
+ internal JsonObject Serialize()
49
+ {
50
+ var jsonObject = new JsonObject
51
+ {
52
+ { "id", this.Id },
53
+ { "access", this.Access.ToString().ToLowerInvariant() }
54
+ };
55
+
56
+ return jsonObject;
57
+ }
58
}
59
}
src/WixToolset.Data/IntermediateTuple.cs
+19
-2
@@ -30,12 +30,17 @@ namespace WixToolset.Data
30
31
internal static IntermediateTuple Deserialize(ITupleDefinitionCreator creator, JsonObject jsonObject)
32
{
33
- var definitionName = jsonObject.GetValueOrDefault<string>("def");
33
+ var definitionName = jsonObject.GetValueOrDefault<string>("type");
34
+ var idJson = jsonObject.GetValueOrDefault<JsonObject>("id");
35
+ var sourceLineNumbersJson = jsonObject.GetValueOrDefault<JsonObject>("ln");
36
var fieldsJson = jsonObject.GetValueOrDefault<JsonArray>("fields");
37
38
creator.TryGetTupleDefinitionByName(definitionName, out var definition); // TODO: this isn't sufficient.
39
var tuple = definition.CreateTuple();
40
41
+ tuple.Id = (idJson == null) ? null : Identifier.Deserialize(idJson);
42
+ tuple.SourceLineNumbers = (sourceLineNumbersJson == null) ? null : SourceLineNumber.Deserialize(sourceLineNumbersJson);
43
+
44
for (var i = 0; i < fieldsJson.Count; ++i)
45
{
46
if (tuple.Fields.Length > i && fieldsJson[i] is JsonObject fieldJson)
@@ -51,9 +56,21 @@ namespace WixToolset.Data
56
{
57
var jsonObject = new JsonObject
58
{
54
- { "def", this.Definition.Name }
59
+ { "type", this.Definition.Name }
60
};
61
62
+ var idJson = this.Id?.Serialize();
63
+ if (idJson != null)
64
+ {
65
+ jsonObject.Add("id", idJson);
66
+ }
67
+
68
+ var lnJson = this.SourceLineNumbers?.Serialize();
69
+ if (lnJson != null)
70
+ {
71
+ jsonObject.Add("ln", lnJson);
72
+ }
73
+
74
var fieldsJson = new JsonArray(this.Fields.Length);
75
76
foreach (var field in this.Fields)
src/WixToolset.Data/Json/JsonObjectExtensions.cs
+5
@@ -12,6 +12,11 @@ namespace WixToolset.Data
12
return jsonObject.TryGetValue(key, out var value) ? Convert.ToInt32(value) : defaultValue;
13
}
14
15
+ public static int? GetValueOrDefault(this JsonObject jsonObject, string key, int? defaultValue)
16
+ {
17
+ return jsonObject.TryGetValue(key, out var value) ? Convert.ToInt32(value) : defaultValue;
18
+ }
19
+
20
public static T GetValueOrDefault<T>(this JsonObject jsonObject, string key, T defaultValue = default(T)) where T : class
21
{
22
return jsonObject.TryGetValue(key, out var value) ? value as T: defaultValue;
src/WixToolset.Data/SourceLineNumber.cs
+33
@@ -7,6 +7,7 @@ namespace WixToolset.Data
7
using System.Text;
8
using System.Xml;
9
using System.Xml.Linq;
10
+ using SimpleJson;
11
12
/// <summary>
13
/// Represents file name and line number for source file
@@ -62,6 +63,38 @@ namespace WixToolset.Data
63
}
64
}
65
66
+ internal static SourceLineNumber Deserialize(JsonObject jsonObject)
67
+ {
68
+ var fileName = jsonObject.GetValueOrDefault<string>("file");
69
+ var lineNumber = jsonObject.GetValueOrDefault("line", null);
70
+
71
+ var parentJson = jsonObject.GetValueOrDefault<JsonObject>("parent");
72
+ var parent = (parentJson == null) ? null : SourceLineNumber.Deserialize(parentJson);
73
+
74
+ return new SourceLineNumber(fileName)
75
+ {
76
+ LineNumber = lineNumber,
77
+ Parent = parent
78
+ };
79
+ }
80
+
81
+ internal JsonObject Serialize()
82
+ {
83
+ var jsonObject = new JsonObject
84
+ {
85
+ { "file", this.FileName },
86
+ { "line", this.LineNumber }
87
+ };
88
+
89
+ if (this.Parent != null)
90
+ {
91
+ var parentJson = this.Parent.Serialize();
92
+ jsonObject.Add("parent", parentJson);
93
+ }
94
+
95
+ return jsonObject;
96
+ }
97
+
98
/// <summary>
99
/// Creates a source line number from an encoded string.
100
/// </summary>
src/WixToolset.Data/Tuples/WixFileTuple.cs
+1
-1
@@ -133,7 +133,7 @@ namespace WixToolset.Data.Tuples
133
134
public string Source
135
{
136
- get => (string)this.Fields[(int)WixFileTupleFields.Source]?.Value;
136
+ get => this.Fields[(int)WixFileTupleFields.Source].AsPath()?.Path;
137
set => this.Set((int)WixFileTupleFields.Source, value);
138
}
139
src/WixToolset.Data/Tuples/WixMergeTuple.cs
+3
-3
@@ -15,7 +15,7 @@ namespace WixToolset.Data
15
new IntermediateFieldDefinition(nameof(WixMergeTupleFields.Directory_), IntermediateFieldType.String),
16
new IntermediateFieldDefinition(nameof(WixMergeTupleFields.SourceFile), IntermediateFieldType.Path),
17
new IntermediateFieldDefinition(nameof(WixMergeTupleFields.DiskId), IntermediateFieldType.Number),
18
- new IntermediateFieldDefinition(nameof(WixMergeTupleFields.FileCompression), IntermediateFieldType.Number),
18
+ new IntermediateFieldDefinition(nameof(WixMergeTupleFields.FileCompression), IntermediateFieldType.Bool),
19
new IntermediateFieldDefinition(nameof(WixMergeTupleFields.ConfigurationData), IntermediateFieldType.String),
20
new IntermediateFieldDefinition(nameof(WixMergeTupleFields.Feature_), IntermediateFieldType.String),
21
},
@@ -79,9 +79,9 @@ namespace WixToolset.Data.Tuples
79
set => this.Set((int)WixMergeTupleFields.DiskId, value);
80
}
81
82
- public int FileCompression
82
+ public bool? FileCompression
83
{
84
- get => (int)this.Fields[(int)WixMergeTupleFields.FileCompression]?.Value;
84
+ get => (bool?)this.Fields[(int)WixMergeTupleFields.FileCompression]?.Value;
85
set => this.Set((int)WixMergeTupleFields.FileCompression, value);
86
}
87
src/WixToolset.Data/Tuples/WixPatchIdTuple.cs
+3
-3
@@ -12,7 +12,7 @@ namespace WixToolset.Data
12
{
13
new IntermediateFieldDefinition(nameof(WixPatchIdTupleFields.ProductCode), IntermediateFieldType.String),
14
new IntermediateFieldDefinition(nameof(WixPatchIdTupleFields.ClientPatchId), IntermediateFieldType.String),
15
- new IntermediateFieldDefinition(nameof(WixPatchIdTupleFields.OptimizePatchSizeForLargeFiles), IntermediateFieldType.Number),
15
+ new IntermediateFieldDefinition(nameof(WixPatchIdTupleFields.OptimizePatchSizeForLargeFiles), IntermediateFieldType.Bool),
16
new IntermediateFieldDefinition(nameof(WixPatchIdTupleFields.ApiPatchingSymbolFlags), IntermediateFieldType.Number),
17
},
18
typeof(WixPatchIdTuple));
@@ -53,9 +53,9 @@ namespace WixToolset.Data.Tuples
53
set => this.Set((int)WixPatchIdTupleFields.ClientPatchId, value);
54
}
55
56
- public int OptimizePatchSizeForLargeFiles
56
+ public bool OptimizePatchSizeForLargeFiles
57
{
58
- get => (int)this.Fields[(int)WixPatchIdTupleFields.OptimizePatchSizeForLargeFiles]?.Value;
58
+ get => (bool)this.Fields[(int)WixPatchIdTupleFields.OptimizePatchSizeForLargeFiles]?.Value;
59
set => this.Set((int)WixPatchIdTupleFields.OptimizePatchSizeForLargeFiles, value);
60
}
61
src/WixToolset.Data/Tuples/WixSuppressActionTuple.cs
+5
-3
@@ -19,6 +19,8 @@ namespace WixToolset.Data
19
20
namespace WixToolset.Data.Tuples
21
{
22
+ using System;
23
+
24
public enum WixSuppressActionTupleFields
25
{
26
SequenceTable,
@@ -37,10 +39,10 @@ namespace WixToolset.Data.Tuples
39
40
public IntermediateField this[WixSuppressActionTupleFields index] => this.Fields[(int)index];
41
40
- public string SequenceTable
42
+ public SequenceTable SequenceTable
43
{
42
- get => (string)this.Fields[(int)WixSuppressActionTupleFields.SequenceTable]?.Value;
43
- set => this.Set((int)WixSuppressActionTupleFields.SequenceTable, value);
44
+ get => (SequenceTable)Enum.Parse(typeof(SequenceTable), (string)this.Fields[(int)WixSuppressActionTupleFields.SequenceTable]?.Value);
45
+ set => this.Set((int)WixSuppressActionTupleFields.SequenceTable, value.ToString());
46
}
47
48
public string Action
src/WixToolset.Data/WindowsInstallerStandard.cs
new
+506
@@ -0,0 +1,506 @@
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.Data
4
+{
5
+ using System.Collections.Generic;
6
+ using WixToolset.Data.Tuples;
7
+
8
+ public class WindowsInstallerStandard
9
+ {
10
+ private static readonly HashSet<string> standardActionNames = new HashSet<string>
11
+ {
12
+ "AllocateRegistrySpace",
13
+ "AppSearch",
14
+ "BindImage",
15
+ "CCPSearch",
16
+ "CostFinalize",
17
+ "CostInitialize",
18
+ "CreateFolders",
19
+ "CreateShortcuts",
20
+ "DeleteServices",
21
+ "DisableRollback",
22
+ "DuplicateFiles",
23
+ "ExecuteAction",
24
+ "FileCost",
25
+ "FindRelatedProducts",
26
+ "ForceReboot",
27
+ "InstallAdminPackage",
28
+ "InstallExecute",
29
+ "InstallExecuteAgain",
30
+ "InstallFiles",
31
+ "InstallFinalize",
32
+ "InstallInitialize",
33
+ "InstallODBC",
34
+ "InstallServices",
35
+ "InstallSFPCatalogFile",
36
+ "InstallValidate",
37
+ "IsolateComponents",
38
+ "LaunchConditions",
39
+ "MigrateFeatureStates",
40
+ "MoveFiles",
41
+ "MsiConfigureServices",
42
+ "MsiPublishAssemblies",
43
+ "MsiUnpublishAssemblies",
44
+ "PatchFiles",
45
+ "ProcessComponents",
46
+ "PublishComponents",
47
+ "PublishFeatures",
48
+ "PublishProduct",
49
+ "RegisterClassInfo",
50
+ "RegisterComPlus",
51
+ "RegisterExtensionInfo",
52
+ "RegisterFonts",
53
+ "RegisterMIMEInfo",
54
+ "RegisterProduct",
55
+ "RegisterProgIdInfo",
56
+ "RegisterTypeLibraries",
57
+ "RegisterUser",
58
+ "RemoveDuplicateFiles",
59
+ "RemoveEnvironmentStrings",
60
+ "RemoveExistingProducts",
61
+ "RemoveFiles",
62
+ "RemoveFolders",
63
+ "RemoveIniValues",
64
+ "RemoveODBC",
65
+ "RemoveRegistryValues",
66
+ "RemoveShortcuts",
67
+ "ResolveSource",
68
+ "RMCCPSearch",
69
+ "ScheduleReboot",
70
+ "SelfRegModules",
71
+ "SelfUnregModules",
72
+ "SetODBCFolders",
73
+ "StartServices",
74
+ "StopServices",
75
+ "UnpublishComponents",
76
+ "UnpublishFeatures",
77
+ "UnregisterClassInfo",
78
+ "UnregisterComPlus",
79
+ "UnregisterExtensionInfo",
80
+ "UnregisterFonts",
81
+ "UnregisterMIMEInfo",
82
+ "UnregisterProgIdInfo",
83
+ "UnregisterTypeLibraries",
84
+ "ValidateProductID",
85
+ "WriteEnvironmentStrings",
86
+ "WriteIniValues",
87
+ "WriteRegistryValues",
88
+ };
89
+
90
+ private static readonly WixActionTuple[] standardActions = new[]
91
+ {
92
+ new WixActionTuple(null, new Identifier("AdminExecuteSequence/InstallInitialize", AccessModifier.Public)) { Action="InstallInitialize", Sequence=1500, SequenceTable=SequenceTable.AdminExecuteSequence },
93
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/InstallInitialize", AccessModifier.Public)) { Action="InstallInitialize", Sequence=1500, SequenceTable=SequenceTable.AdvtExecuteSequence },
94
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/InstallInitialize", AccessModifier.Public)) { Action="InstallInitialize", Sequence=1500, SequenceTable=SequenceTable.InstallExecuteSequence },
95
+
96
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/InstallExecute", AccessModifier.Public)) { Action="InstallExecute", Sequence=6500, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="NOT Installed" },
97
+
98
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/InstallExecuteAgain", AccessModifier.Public)) { Action="InstallExecuteAgain", Sequence=6550, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="NOT Installed" },
99
+
100
+ new WixActionTuple(null, new Identifier("AdminExecuteSequence/InstallFinalize", AccessModifier.Public)) { Action="InstallFinalize", Sequence=6600, SequenceTable=SequenceTable.AdminExecuteSequence },
101
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/InstallFinalize", AccessModifier.Public)) { Action="InstallFinalize", Sequence=6600, SequenceTable=SequenceTable.AdvtExecuteSequence },
102
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/InstallFinalize", AccessModifier.Public)) { Action="InstallFinalize", Sequence=6600, SequenceTable=SequenceTable.InstallExecuteSequence },
103
+
104
+ new WixActionTuple(null, new Identifier("AdminExecuteSequence/InstallFiles", AccessModifier.Public)) { Action="InstallFiles", Sequence=4000, SequenceTable=SequenceTable.AdminExecuteSequence },
105
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/InstallFiles", AccessModifier.Public)) { Action="InstallFiles", Sequence=4000, SequenceTable=SequenceTable.InstallExecuteSequence },
106
+
107
+ new WixActionTuple(null, new Identifier("AdminExecuteSequence/InstallAdminPackage", AccessModifier.Public)) { Action="InstallAdminPackage", Sequence=3900, SequenceTable=SequenceTable.AdminExecuteSequence },
108
+
109
+ new WixActionTuple(null, new Identifier("AdminExecuteSequence/FileCost", AccessModifier.Public)) { Action="FileCost", Sequence=900, SequenceTable=SequenceTable.AdminExecuteSequence },
110
+ new WixActionTuple(null, new Identifier("AdminUISequence/FileCost", AccessModifier.Public)) { Action="FileCost", Sequence=900, SequenceTable=SequenceTable.AdminUISequence },
111
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/FileCost", AccessModifier.Public)) { Action="FileCost", Sequence=900, SequenceTable=SequenceTable.InstallExecuteSequence },
112
+ new WixActionTuple(null, new Identifier("InstallUISequence/FileCost", AccessModifier.Public)) { Action="FileCost", Sequence=900, SequenceTable=SequenceTable.InstallUISequence },
113
+
114
+ new WixActionTuple(null, new Identifier("AdminExecuteSequence/CostInitialize", AccessModifier.Public)) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.AdminExecuteSequence },
115
+ new WixActionTuple(null, new Identifier("AdminUISequence/CostInitialize", AccessModifier.Public)) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.AdminUISequence },
116
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/CostInitialize", AccessModifier.Public)) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.AdvtExecuteSequence },
117
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/CostInitialize", AccessModifier.Public)) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.InstallExecuteSequence },
118
+ new WixActionTuple(null, new Identifier("InstallUISequence/CostInitialize", AccessModifier.Public)) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.InstallUISequence },
119
+
120
+ new WixActionTuple(null, new Identifier("AdminExecuteSequence/CostFinalize", AccessModifier.Public)) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.AdminExecuteSequence },
121
+ new WixActionTuple(null, new Identifier("AdminUISequence/CostFinalize", AccessModifier.Public)) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.AdminUISequence },
122
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/CostFinalize", AccessModifier.Public)) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.AdvtExecuteSequence },
123
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/CostFinalize", AccessModifier.Public)) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.InstallExecuteSequence },
124
+ new WixActionTuple(null, new Identifier("InstallUISequence/CostFinalize", AccessModifier.Public)) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.InstallUISequence },
125
+
126
+ new WixActionTuple(null, new Identifier("AdminExecuteSequence/InstallValidate", AccessModifier.Public)) { Action="InstallValidate", Sequence=1400, SequenceTable=SequenceTable.AdminExecuteSequence },
127
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/InstallValidate", AccessModifier.Public)) { Action="InstallValidate", Sequence=1400, SequenceTable=SequenceTable.AdvtExecuteSequence },
128
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/InstallValidate", AccessModifier.Public)) { Action="InstallValidate", Sequence=1400, SequenceTable=SequenceTable.InstallExecuteSequence },
129
+
130
+ new WixActionTuple(null, new Identifier("AdminUISequence/ExecuteAction", AccessModifier.Public)) { Action="ExecuteAction", Sequence=1300, SequenceTable=SequenceTable.AdminUISequence },
131
+ new WixActionTuple(null, new Identifier("InstallUISequence/ExecuteAction", AccessModifier.Public)) { Action="ExecuteAction", Sequence=1300, SequenceTable=SequenceTable.InstallUISequence },
132
+
133
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/CreateShortcuts", AccessModifier.Public)) { Action="CreateShortcuts", Sequence=4500, SequenceTable=SequenceTable.AdvtExecuteSequence },
134
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/CreateShortcuts", AccessModifier.Public)) { Action="CreateShortcuts", Sequence=4500, SequenceTable=SequenceTable.InstallExecuteSequence },
135
+
136
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/MsiPublishAssemblies", AccessModifier.Public)) { Action="MsiPublishAssemblies", Sequence=6250, SequenceTable=SequenceTable.AdvtExecuteSequence },
137
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/MsiPublishAssemblies", AccessModifier.Public)) { Action="MsiPublishAssemblies", Sequence=6250, SequenceTable=SequenceTable.InstallExecuteSequence },
138
+
139
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/PublishComponents", AccessModifier.Public)) { Action="PublishComponents", Sequence=6200, SequenceTable=SequenceTable.AdvtExecuteSequence },
140
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/PublishComponents", AccessModifier.Public)) { Action="PublishComponents", Sequence=6200, SequenceTable=SequenceTable.InstallExecuteSequence },
141
+
142
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/PublishFeatures", AccessModifier.Public)) { Action="PublishFeatures", Sequence=6300, SequenceTable=SequenceTable.AdvtExecuteSequence },
143
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/PublishFeatures", AccessModifier.Public)) { Action="PublishFeatures", Sequence=6300, SequenceTable=SequenceTable.InstallExecuteSequence },
144
+
145
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/PublishProduct", AccessModifier.Public)) { Action="PublishProduct", Sequence=6400, SequenceTable=SequenceTable.AdvtExecuteSequence },
146
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/PublishProduct", AccessModifier.Public)) { Action="PublishProduct", Sequence=6400, SequenceTable=SequenceTable.InstallExecuteSequence },
147
+
148
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/RegisterClassInfo", AccessModifier.Public)) { Action="RegisterClassInfo", Sequence=4600, SequenceTable=SequenceTable.AdvtExecuteSequence },
149
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RegisterClassInfo", AccessModifier.Public)) { Action="RegisterClassInfo", Sequence=4600, SequenceTable=SequenceTable.InstallExecuteSequence },
150
+
151
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/RegisterExtensionInfo", AccessModifier.Public)) { Action="RegisterExtensionInfo", Sequence=4700, SequenceTable=SequenceTable.AdvtExecuteSequence },
152
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RegisterExtensionInfo", AccessModifier.Public)) { Action="RegisterExtensionInfo", Sequence=4700, SequenceTable=SequenceTable.InstallExecuteSequence },
153
+
154
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/RegisterMIMEInfo", AccessModifier.Public)) { Action="RegisterMIMEInfo", Sequence=4900, SequenceTable=SequenceTable.AdvtExecuteSequence },
155
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RegisterMIMEInfo", AccessModifier.Public)) { Action="RegisterMIMEInfo", Sequence=4900, SequenceTable=SequenceTable.InstallExecuteSequence },
156
+
157
+ new WixActionTuple(null, new Identifier("AdvtExecuteSequence/RegisterProgIdInfo", AccessModifier.Public)) { Action="RegisterProgIdInfo", Sequence=4800, SequenceTable=SequenceTable.AdvtExecuteSequence },
158
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RegisterProgIdInfo", AccessModifier.Public)) { Action="RegisterProgIdInfo", Sequence=4800, SequenceTable=SequenceTable.InstallExecuteSequence },
159
+
160
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/AllocateRegistrySpace", AccessModifier.Public)) { Action="AllocateRegistrySpace", Sequence=1550, SequenceTable=SequenceTable.InstallExecuteSequence },
161
+
162
+ new WixActionTuple(null, new Identifier("InstallUISequence/AppSearch", AccessModifier.Public)) { Action="AppSearch", Sequence=50, SequenceTable=SequenceTable.InstallUISequence },
163
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/AppSearch", AccessModifier.Public)) { Action="AppSearch", Sequence=50, SequenceTable=SequenceTable.InstallExecuteSequence },
164
+
165
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/BindImage", AccessModifier.Public)) { Action="BindImage", Sequence=4300, SequenceTable=SequenceTable.InstallExecuteSequence },
166
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/CreateFolders", AccessModifier.Public)) { Action="CreateFolders", Sequence=3700, SequenceTable=SequenceTable.InstallExecuteSequence },
167
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/DuplicateFiles", AccessModifier.Public)) { Action="DuplicateFiles", Sequence=4210, SequenceTable=SequenceTable.InstallExecuteSequence },
168
+
169
+ new WixActionTuple(null, new Identifier("InstallUISequence/FindRelatedProducts", AccessModifier.Public)) { Action="FindRelatedProducts", Sequence=25, SequenceTable=SequenceTable.InstallUISequence },
170
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/FindRelatedProducts", AccessModifier.Public)) { Action="FindRelatedProducts", Sequence=25, SequenceTable=SequenceTable.InstallExecuteSequence },
171
+
172
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/InstallODBC", AccessModifier.Public)) { Action="InstallODBC", Sequence=5400, SequenceTable=SequenceTable.InstallExecuteSequence },
173
+
174
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/InstallServices", AccessModifier.Public)) { Action="InstallServices", Sequence=5800, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="VersionNT" },
175
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/MsiConfigureServices", AccessModifier.Public)) { Action="MsiConfigureServices", Sequence=5850, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="VersionNT>=600" },
176
+
177
+ new WixActionTuple(null, new Identifier("InstallUISequence/IsolateComponents", AccessModifier.Public)) { Action="IsolateComponents", Sequence=950, SequenceTable=SequenceTable.InstallUISequence },
178
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/IsolateComponents", AccessModifier.Public)) { Action="IsolateComponents", Sequence=950, SequenceTable=SequenceTable.InstallExecuteSequence },
179
+
180
+ new WixActionTuple(null, new Identifier("AdminUISequence/LaunchConditions", AccessModifier.Public)) { Action="LaunchConditions", Sequence=100, SequenceTable=SequenceTable.AdminUISequence },
181
+ new WixActionTuple(null, new Identifier("AdminExecuteSequence/LaunchConditions", AccessModifier.Public)) { Action="LaunchConditions", Sequence=100, SequenceTable=SequenceTable.AdminExecuteSequence },
182
+ new WixActionTuple(null, new Identifier("InstallUISequence/LaunchConditions", AccessModifier.Public)) { Action="LaunchConditions", Sequence=100, SequenceTable=SequenceTable.InstallUISequence },
183
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/LaunchConditions", AccessModifier.Public)) { Action="LaunchConditions", Sequence=100, SequenceTable=SequenceTable.InstallExecuteSequence },
184
+
185
+ new WixActionTuple(null, new Identifier("InstallUISequence/MigrateFeatureStates", AccessModifier.Public)) { Action="MigrateFeatureStates", Sequence=1200, SequenceTable=SequenceTable.InstallUISequence },
186
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/MigrateFeatureStates", AccessModifier.Public)) { Action="MigrateFeatureStates", Sequence=1200, SequenceTable=SequenceTable.InstallExecuteSequence },
187
+
188
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/MoveFiles", AccessModifier.Public)) { Action="MoveFiles", Sequence=3800, SequenceTable=SequenceTable.InstallExecuteSequence },
189
+
190
+ new WixActionTuple(null, new Identifier("AdminExecuteSequence/PatchFiles", AccessModifier.Public)) { Action="PatchFiles", Sequence=4090, SequenceTable=SequenceTable.AdminExecuteSequence },
191
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/PatchFiles", AccessModifier.Public)) { Action="PatchFiles", Sequence=4090, SequenceTable=SequenceTable.InstallExecuteSequence },
192
+
193
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/ProcessComponents", AccessModifier.Public)) { Action="ProcessComponents", Sequence=1600, SequenceTable=SequenceTable.InstallExecuteSequence },
194
+
195
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RegisterComPlus", AccessModifier.Public)) { Action="RegisterComPlus", Sequence=5700, SequenceTable=SequenceTable.InstallExecuteSequence },
196
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RegisterFonts", AccessModifier.Public)) { Action="RegisterFonts", Sequence=5300, SequenceTable=SequenceTable.InstallExecuteSequence },
197
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RegisterProduct", AccessModifier.Public)) { Action="RegisterProduct", Sequence=6100, SequenceTable=SequenceTable.InstallExecuteSequence },
198
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RegisterTypeLibraries", AccessModifier.Public)) { Action="RegisterTypeLibraries", Sequence=5500, SequenceTable=SequenceTable.InstallExecuteSequence },
199
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RegisterUser", AccessModifier.Public)) { Action="RegisterUser", Sequence=6000, SequenceTable=SequenceTable.InstallExecuteSequence },
200
+
201
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RemoveDuplicateFiles", AccessModifier.Public)) { Action="RemoveDuplicateFiles", Sequence=3400, SequenceTable=SequenceTable.InstallExecuteSequence },
202
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RemoveEnvironmentStrings", AccessModifier.Public)) { Action="RemoveEnvironmentStrings", Sequence=3300, SequenceTable=SequenceTable.InstallExecuteSequence },
203
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RemoveFiles", AccessModifier.Public)) { Action="RemoveFiles", Sequence=3500, SequenceTable=SequenceTable.InstallExecuteSequence },
204
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RemoveFolders", AccessModifier.Public)) { Action="RemoveFolders", Sequence=3600, SequenceTable=SequenceTable.InstallExecuteSequence },
205
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RemoveIniValues", AccessModifier.Public)) { Action="RemoveIniValues", Sequence=3100, SequenceTable=SequenceTable.InstallExecuteSequence },
206
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RemoveODBC", AccessModifier.Public)) { Action="RemoveODBC", Sequence=2400, SequenceTable=SequenceTable.InstallExecuteSequence },
207
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RemoveRegistryValues", AccessModifier.Public)) { Action="RemoveRegistryValues", Sequence=2600, SequenceTable=SequenceTable.InstallExecuteSequence },
208
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RemoveShortcuts", AccessModifier.Public)) { Action="RemoveShortcuts", Sequence=3200, SequenceTable=SequenceTable.InstallExecuteSequence },
209
+
210
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/SelfRegModules", AccessModifier.Public)) { Action="SelfRegModules", Sequence=5600, SequenceTable=SequenceTable.InstallExecuteSequence },
211
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/SelfUnregModules", AccessModifier.Public)) { Action="SelfUnregModules", Sequence=2200, SequenceTable=SequenceTable.InstallExecuteSequence },
212
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/SetODBCFolders", AccessModifier.Public)) { Action="SetODBCFolders", Sequence=1100, SequenceTable=SequenceTable.InstallExecuteSequence },
213
+
214
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/CCPSearch", AccessModifier.Public)) { Action="CCPSearch", Sequence=500, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="NOT Installed" },
215
+ new WixActionTuple(null, new Identifier("InstallUISequence/CCPSearch", AccessModifier.Public)) { Action="CCPSearch", Sequence=500, SequenceTable=SequenceTable.InstallUISequence, Condition="NOT Installed" },
216
+
217
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/DeleteServices", AccessModifier.Public)) { Action="DeleteServices", Sequence=2000, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="VersionNT" },
218
+
219
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/RMCCPSearch", AccessModifier.Public)) { Action="RMCCPSearch", Sequence=600, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="NOT Installed" },
220
+ new WixActionTuple(null, new Identifier("InstallUISequence/RMCCPSearch", AccessModifier.Public)) { Action="RMCCPSearch", Sequence=600, SequenceTable=SequenceTable.InstallUISequence, Condition="NOT Installed" },
221
+
222
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/StartServices", AccessModifier.Public)) { Action="StartServices", Sequence=5900, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="VersionNT" },
223
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/StopServices", AccessModifier.Public)) { Action="StopServices", Sequence=1900, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="VersionNT" },
224
+
225
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/MsiUnpublishAssemblies", AccessModifier.Public)) { Action="MsiUnpublishAssemblies", Sequence=1750, SequenceTable=SequenceTable.InstallExecuteSequence },
226
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/UnpublishComponents", AccessModifier.Public)) { Action="UnpublishComponents", Sequence=1700, SequenceTable=SequenceTable.InstallExecuteSequence },
227
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/UnpublishFeatures", AccessModifier.Public)) { Action="UnpublishFeatures", Sequence=1800, SequenceTable=SequenceTable.InstallExecuteSequence },
228
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/UnregisterClassInfo", AccessModifier.Public)) { Action="UnregisterClassInfo", Sequence=2700, SequenceTable=SequenceTable.InstallExecuteSequence },
229
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/UnregisterComPlus", AccessModifier.Public)) { Action="UnregisterComPlus", Sequence=2100, SequenceTable=SequenceTable.InstallExecuteSequence },
230
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/UnregisterExtensionInfo", AccessModifier.Public)) { Action="UnregisterExtensionInfo", Sequence=2800, SequenceTable=SequenceTable.InstallExecuteSequence },
231
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/UnregisterFonts", AccessModifier.Public)) { Action="UnregisterFonts", Sequence=2500, SequenceTable=SequenceTable.InstallExecuteSequence },
232
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/UnregisterMIMEInfo", AccessModifier.Public)) { Action="UnregisterMIMEInfo", Sequence=3000, SequenceTable=SequenceTable.InstallExecuteSequence },
233
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/UnregisterProgIdInfo", AccessModifier.Public)) { Action="UnregisterProgIdInfo", Sequence=2900, SequenceTable=SequenceTable.InstallExecuteSequence },
234
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/UnregisterTypeLibraries", AccessModifier.Public)) { Action="UnregisterTypeLibraries", Sequence=2300, SequenceTable=SequenceTable.InstallExecuteSequence },
235
+
236
+ new WixActionTuple(null, new Identifier("InstallUISequence/ValidateProductID", AccessModifier.Public)) { Action="ValidateProductID", Sequence=700, SequenceTable=SequenceTable.InstallUISequence },
237
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/ValidateProductID", AccessModifier.Public)) { Action="ValidateProductID", Sequence=700, SequenceTable=SequenceTable.InstallExecuteSequence },
238
+
239
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/WriteEnvironmentStrings", AccessModifier.Public)) { Action="WriteEnvironmentStrings", Sequence=5200, SequenceTable=SequenceTable.InstallExecuteSequence },
240
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/WriteIniValues", AccessModifier.Public)) { Action="WriteIniValues", Sequence=5100, SequenceTable=SequenceTable.InstallExecuteSequence },
241
+ new WixActionTuple(null, new Identifier("InstallExecuteSequence/WriteRegistryValues", AccessModifier.Public)) { Action="WriteRegistryValues", Sequence=5000, SequenceTable=SequenceTable.InstallExecuteSequence },
242
+ };
243
+
244
+ private static readonly HashSet<string> standardDirectories = new HashSet<string>
245
+ {
246
+ "TARGETDIR",
247
+ "AdminToolsFolder",
248
+ "AppDataFolder",
249
+ "CommonAppDataFolder",
250
+ "CommonFilesFolder",
251
+ "DesktopFolder",
252
+ "FavoritesFolder",
253
+ "FontsFolder",
254
+ "LocalAppDataFolder",
255
+ "MyPicturesFolder",
256
+ "PersonalFolder",
257
+ "ProgramFilesFolder",
258
+ "ProgramMenuFolder",
259
+ "SendToFolder",
260
+ "StartMenuFolder",
261
+ "StartupFolder",
262
+ "System16Folder",
263
+ "SystemFolder",
264
+ "TempFolder",
265
+ "TemplateFolder",
266
+ "WindowsFolder",
267
+ "CommonFiles64Folder",
268
+ "ProgramFiles64Folder",
269
+ "System64Folder",
270
+ "NetHoodFolder",
271
+ "PrintHoodFolder",
272
+ "RecentFolder",
273
+ "WindowsVolume",
274
+ };
275
+
276
+ /// <summary>
277
+ /// References:
278
+ /// Title: Property Reference [Windows Installer]:
279
+ /// URL: http://msdn.microsoft.com/library/en-us/msi/setup/property_reference.asp
280
+ /// </summary>
281
+ private static readonly HashSet<string> standardProperties = new HashSet<string>
282
+ {
283
+ "~", // REG_MULTI_SZ/NULL marker
284
+ "ACTION",
285
+ "ADDDEFAULT",
286
+ "ADDLOCAL",
287
+ "ADDDSOURCE",
288
+ "AdminProperties",
289
+ "AdminUser",
290
+ "ADVERTISE",
291
+ "AFTERREBOOT",
292
+ "AllowProductCodeMismatches",
293
+ "AllowProductVersionMajorMismatches",
294
+ "ALLUSERS",
295
+ "Alpha",
296
+ "ApiPatchingSymbolFlags",
297
+ "ARPAUTHORIZEDCDFPREFIX",
298
+ "ARPCOMMENTS",
299
+ "ARPCONTACT",
300
+ "ARPHELPLINK",
301
+ "ARPHELPTELEPHONE",
302
+ "ARPINSTALLLOCATION",
303
+ "ARPNOMODIFY",
304
+ "ARPNOREMOVE",
305
+ "ARPNOREPAIR",
306
+ "ARPPRODUCTIONICON",
307
+ "ARPREADME",
308
+ "ARPSIZE",
309
+ "ARPSYSTEMCOMPONENT",
310
+ "ARPULRINFOABOUT",
311
+ "ARPURLUPDATEINFO",
312
+ "AVAILABLEFREEREG",
313
+ "BorderSize",
314
+ "BorderTop",
315
+ "CaptionHeight",
316
+ "CCP_DRIVE",
317
+ "ColorBits",
318
+ "COMPADDLOCAL",
319
+ "COMPADDSOURCE",
320
+ "COMPANYNAME",
321
+ "ComputerName",
322
+ "CostingComplete",
323
+ "Date",
324
+ "DefaultUIFont",
325
+ "DISABLEADVTSHORTCUTS",
326
+ "DISABLEMEDIA",
327
+ "DISABLEROLLBACK",
328
+ "DiskPrompt",
329
+ "DontRemoveTempFolderWhenFinished",
330
+ "EnableUserControl",
331
+ "EXECUTEACTION",
332
+ "EXECUTEMODE",
333
+ "FASTOEM",
334
+ "FILEADDDEFAULT",
335
+ "FILEADDLOCAL",
336
+ "FILEADDSOURCE",
337
+ "IncludeWholeFilesOnly",
338
+ "Installed",
339
+ "INSTALLLEVEL",
340
+ "Intel",
341
+ "Intel64",
342
+ "IsAdminPackage",
343
+ "LeftUnit",
344
+ "LIMITUI",
345
+ "ListOfPatchGUIDsToReplace",
346
+ "ListOfTargetProductCode",
347
+ "LOGACTION",
348
+ "LogonUser",
349
+ "Manufacturer",
350
+ "MEDIAPACKAGEPATH",
351
+ "MediaSourceDir",
352
+ "MinimumRequiredMsiVersion",
353
+ "MsiAMD64",
354
+ "MSIAPRSETTINGSIDENTIFIER",
355
+ "MSICHECKCRCS",
356
+ "MSIDISABLERMRESTART",
357
+ "MSIENFORCEUPGRADECOMPONENTRULES",
358
+ "MSIFASTINSTALL",
359
+ "MsiFileToUseToCreatePatchTables",
360
+ "MsiHiddenProperties",
361
+ "MSIINSTALLPERUSER",
362
+ "MSIINSTANCEGUID",
363
+ "MsiLogFileLocation",
364
+ "MsiLogging",
365
+ "MsiNetAssemblySupport",
366
+ "MSINEWINSTANCE",
367
+ "MSINODISABLEMEDIA",
368
+ "MsiNTProductType",
369
+ "MsiNTSuiteBackOffice",
370
+ "MsiNTSuiteDataCenter",
371
+ "MsiNTSuiteEnterprise",
372
+ "MsiNTSuiteSmallBusiness",
373
+ "MsiNTSuiteSmallBusinessRestricted",
374
+ "MsiNTSuiteWebServer",
375
+ "MsiNTSuitePersonal",
376
+ "MsiPatchRemovalList",
377
+ "MSIPATCHREMOVE",
378
+ "MSIRESTARTMANAGERCONTROL",
379
+ "MsiRestartManagerSessionKey",
380
+ "MSIRMSHUTDOWN",
381
+ "MsiRunningElevated",
382
+ "MsiUIHideCancel",
383
+ "MsiUIProgressOnly",
384
+ "MsiUISourceResOnly",
385
+ "MsiSystemRebootPending",
386
+ "MsiWin32AssemblySupport",
387
+ "NOCOMPANYNAME",
388
+ "NOUSERNAME",
389
+ "OLEAdvtSupport",
390
+ "OptimizePatchSizeForLargeFiles",
391
+ "OriginalDatabase",
392
+ "OutOfDiskSpace",
393
+ "OutOfNoRbDiskSpace",
394
+ "ParentOriginalDatabase",
395
+ "ParentProductCode",
396
+ "PATCH",
397
+ "PATCH_CACHE_DIR",
398
+ "PATCH_CACHE_ENABLED",
399
+ "PatchGUID",
400
+ "PATCHNEWPACKAGECODE",
401
+ "PATCHNEWSUMMARYCOMMENTS",
402
+ "PATCHNEWSUMMARYSUBJECT",
403
+ "PatchOutputPath",
404
+ "PatchSourceList",
405
+ "PhysicalMemory",
406
+ "PIDKEY",
407
+ "PIDTemplate",
408
+ "Preselected",
409
+ "PRIMARYFOLDER",
410
+ "PrimaryVolumePath",
411
+ "PrimaryVolumeSpaceAvailable",
412
+ "PrimaryVolumeSpaceRemaining",
413
+ "PrimaryVolumeSpaceRequired",
414
+ "Privileged",
415
+ "ProductCode",
416
+ "ProductID",
417
+ "ProductLanguage",
418
+ "ProductName",
419
+ "ProductState",
420
+ "ProductVersion",
421
+ "PROMPTROLLBACKCOST",
422
+ "REBOOT",
423
+ "REBOOTPROMPT",
424
+ "RedirectedDllSupport",
425
+ "REINSTALL",
426
+ "REINSTALLMODE",
427
+ "RemoveAdminTS",
428
+ "REMOVE",
429
+ "ReplacedInUseFiles",
430
+ "RestrictedUserControl",
431
+ "RESUME",
432
+ "RollbackDisabled",
433
+ "ROOTDRIVE",
434
+ "ScreenX",
435
+ "ScreenY",
436
+ "SecureCustomProperties",
437
+ "ServicePackLevel",
438
+ "ServicePackLevelMinor",
439
+ "SEQUENCE",
440
+ "SharedWindows",
441
+ "ShellAdvtSupport",
442
+ "SHORTFILENAMES",
443
+ "SourceDir",
444
+ "SOURCELIST",
445
+ "SystemLanguageID",
446
+ "TARGETDIR",
447
+ "TerminalServer",
448
+ "TextHeight",
449
+ "Time",
450
+ "TRANSFORMS",
451
+ "TRANSFORMSATSOURCE",
452
+ "TRANSFORMSSECURE",
453
+ "TTCSupport",
454
+ "UILevel",
455
+ "UpdateStarted",
456
+ "UpgradeCode",
457
+ "UPGRADINGPRODUCTCODE",
458
+ "UserLanguageID",
459
+ "USERNAME",
460
+ "UserSID",
461
+ "Version9X",
462
+ "VersionDatabase",
463
+ "VersionMsi",
464
+ "VersionNT",
465
+ "VersionNT64",
466
+ "VirtualMemory",
467
+ "WindowsBuild",
468
+ "WindowsVolume",
469
+ };
470
+
471
+ /// <summary>
472
+ /// Find out if an action is a standard action.
473
+ /// </summary>
474
+ /// <param name="actionName">Name of the action.</param>
475
+ /// <returns>true if the action is standard, false otherwise.</returns>
476
+ public static bool IsStandardAction(string actionName)
477
+ {
478
+ return standardActionNames.Contains(actionName);
479
+ }
480
+
481
+ /// <summary>
482
+ /// Array of standard actions.
483
+ /// </summary>
484
+ public static WixActionTuple[] StandardActions() => standardActions;
485
+
486
+ /// <summary>
487
+ /// Find out if a directory is a standard directory.
488
+ /// </summary>
489
+ /// <param name="directoryName">Name of the directory.</param>
490
+ /// <returns>true if the directory is standard, false otherwise.</returns>
491
+ public static bool IsStandardDirectory(string directoryName)
492
+ {
493
+ return standardDirectories.Contains(directoryName);
494
+ }
495
+
496
+ /// <summary>
497
+ /// Find out if a property is a standard property.
498
+ /// </summary>
499
+ /// <param name="propertyName">Name of the property.</param>
500
+ /// <returns>true if a property is standard, false otherwise.</returns>
501
+ public static bool IsStandardProperty(string propertyName)
502
+ {
503
+ return standardProperties.Contains(propertyName);
504
+ }
505
+ }
506
+}