@joebigelow / wix / commits / 414bf166

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 +}