Redesign CustomTable tuples to enable file resolution in Core
Rob Mensching committed
Jun 3, 2020 at 02:04 UTC
4a8dc1f4d55278abdff056bb2a332ffec0f60c90
6 files changed
+253
-186
src/WixToolset.Data/Tuples/TupleDefinitions.cs
+8
-4
@@ -144,8 +144,9 @@ namespace WixToolset.Data
144
WixComplexReference,
145
WixComponentGroup,
146
WixComponentSearch,
147
- WixCustomRow,
147
WixCustomTable,
148
+ WixCustomTableCell,
149
+ WixCustomTableColumn,
150
WixDeltaPatchFile,
151
WixDeltaPatchSymbolPaths,
152
WixDependencyProvider,
@@ -613,12 +614,15 @@ namespace WixToolset.Data
614
case TupleDefinitionType.WixComponentSearch:
615
return TupleDefinitions.WixComponentSearch;
616
616
- case TupleDefinitionType.WixCustomRow:
617
- return TupleDefinitions.WixCustomRow;
618
-
617
case TupleDefinitionType.WixCustomTable:
618
return TupleDefinitions.WixCustomTable;
619
620
+ case TupleDefinitionType.WixCustomTableCell:
621
+ return TupleDefinitions.WixCustomTableCell;
622
+
623
+ case TupleDefinitionType.WixCustomTableColumn:
624
+ return TupleDefinitions.WixCustomTableColumn;
625
+
626
case TupleDefinitionType.WixDeltaPatchFile:
627
return TupleDefinitions.WixDeltaPatchFile;
628
src/WixToolset.Data/Tuples/WixCustomRowTuple.cs
deleted
-56
@@ -1,56 +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
-
3
-namespace WixToolset.Data
4
-{
5
- using WixToolset.Data.Tuples;
6
-
7
- public static partial class TupleDefinitions
8
- {
9
- public static readonly IntermediateTupleDefinition WixCustomRow = new IntermediateTupleDefinition(
10
- TupleDefinitionType.WixCustomRow,
11
- new[]
12
- {
13
- new IntermediateFieldDefinition(nameof(WixCustomRowTupleFields.Table), IntermediateFieldType.String),
14
- new IntermediateFieldDefinition(nameof(WixCustomRowTupleFields.FieldData), IntermediateFieldType.String),
15
- },
16
- typeof(WixCustomRowTuple));
17
- }
18
-}
19
-
20
-namespace WixToolset.Data.Tuples
21
-{
22
- public enum WixCustomRowTupleFields
23
- {
24
- Table,
25
- FieldData,
26
- }
27
-
28
- public class WixCustomRowTuple : IntermediateTuple
29
- {
30
- public const char FieldSeparator = '\x85';
31
-
32
- public WixCustomRowTuple() : base(TupleDefinitions.WixCustomRow, null, null)
33
- {
34
- }
35
-
36
- public WixCustomRowTuple(SourceLineNumber sourceLineNumber, Identifier id = null) : base(TupleDefinitions.WixCustomRow, sourceLineNumber, id)
37
- {
38
- }
39
-
40
- public IntermediateField this[WixCustomRowTupleFields index] => this.Fields[(int)index];
41
-
42
- public string Table
43
- {
44
- get => (string)this.Fields[(int)WixCustomRowTupleFields.Table];
45
- set => this.Set((int)WixCustomRowTupleFields.Table, value);
46
- }
47
-
48
- public string FieldData
49
- {
50
- get => (string)this.Fields[(int)WixCustomRowTupleFields.FieldData];
51
- set => this.Set((int)WixCustomRowTupleFields.FieldData, value);
52
- }
53
-
54
- public string[] FieldDataSeparated => this.FieldData.Split(FieldSeparator);
55
- }
56
-}
src/WixToolset.Data/Tuples/WixCustomTableCellTuple.cs
new
+68
@@ -0,0 +1,68 @@
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 WixToolset.Data.Tuples;
6
+
7
+ public static partial class TupleDefinitions
8
+ {
9
+ public static readonly IntermediateTupleDefinition WixCustomTableCell = new IntermediateTupleDefinition(
10
+ TupleDefinitionType.WixCustomTableCell,
11
+ new[]
12
+ {
13
+ new IntermediateFieldDefinition(nameof(WixCustomTableCellTupleFields.TableRef), IntermediateFieldType.String),
14
+ new IntermediateFieldDefinition(nameof(WixCustomTableCellTupleFields.ColumnRef), IntermediateFieldType.String),
15
+ new IntermediateFieldDefinition(nameof(WixCustomTableCellTupleFields.RowId), IntermediateFieldType.String),
16
+ new IntermediateFieldDefinition(nameof(WixCustomTableCellTupleFields.Data), IntermediateFieldType.String),
17
+ },
18
+ typeof(WixCustomTableCellTuple));
19
+ }
20
+}
21
+
22
+namespace WixToolset.Data.Tuples
23
+{
24
+ public enum WixCustomTableCellTupleFields
25
+ {
26
+ TableRef,
27
+ ColumnRef,
28
+ RowId,
29
+ Data,
30
+ }
31
+
32
+ public class WixCustomTableCellTuple : IntermediateTuple
33
+ {
34
+ public WixCustomTableCellTuple() : base(TupleDefinitions.WixCustomTableCell, null, null)
35
+ {
36
+ }
37
+
38
+ public WixCustomTableCellTuple(SourceLineNumber sourceLineNumber, Identifier id = null) : base(TupleDefinitions.WixCustomTableCell, sourceLineNumber, id)
39
+ {
40
+ }
41
+
42
+ public IntermediateField this[WixCustomTableCellTupleFields index] => this.Fields[(int)index];
43
+
44
+ public string TableRef
45
+ {
46
+ get => (string)this.Fields[(int)WixCustomTableCellTupleFields.TableRef];
47
+ set => this.Set((int)WixCustomTableCellTupleFields.TableRef, value);
48
+ }
49
+
50
+ public string ColumnRef
51
+ {
52
+ get => (string)this.Fields[(int)WixCustomTableCellTupleFields.ColumnRef];
53
+ set => this.Set((int)WixCustomTableCellTupleFields.ColumnRef, value);
54
+ }
55
+
56
+ public string RowId
57
+ {
58
+ get => (string)this.Fields[(int)WixCustomTableCellTupleFields.RowId];
59
+ set => this.Set((int)WixCustomTableCellTupleFields.RowId, value);
60
+ }
61
+
62
+ public string Data
63
+ {
64
+ get => (string)this.Fields[(int)WixCustomTableCellTupleFields.Data];
65
+ set => this.Set((int)WixCustomTableCellTupleFields.Data, value);
66
+ }
67
+ }
68
+}
src/WixToolset.Data/Tuples/WixCustomTableColumnTuple.cs
new
+173
@@ -0,0 +1,173 @@
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 WixToolset.Data.Tuples;
6
+
7
+ public static partial class TupleDefinitions
8
+ {
9
+ public static readonly IntermediateTupleDefinition WixCustomTableColumn = new IntermediateTupleDefinition(
10
+ TupleDefinitionType.WixCustomTableColumn,
11
+ new[]
12
+ {
13
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.TableRef), IntermediateFieldType.String),
14
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.Name), IntermediateFieldType.String),
15
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.Type), IntermediateFieldType.String),
16
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.Attributes), IntermediateFieldType.Number),
17
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.Width), IntermediateFieldType.Number),
18
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.MinValue), IntermediateFieldType.String),
19
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.MaxValue), IntermediateFieldType.String),
20
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.KeyTable), IntermediateFieldType.String),
21
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.KeyColumn), IntermediateFieldType.String),
22
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.Category), IntermediateFieldType.String),
23
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.Set), IntermediateFieldType.String),
24
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.Description), IntermediateFieldType.String),
25
+ new IntermediateFieldDefinition(nameof(WixCustomTableColumnTupleFields.Modularize), IntermediateFieldType.Number)
26
+ },
27
+ typeof(WixCustomTableColumnTuple));
28
+ }
29
+}
30
+
31
+namespace WixToolset.Data.Tuples
32
+{
33
+ using System;
34
+
35
+ public enum WixCustomTableColumnTupleFields
36
+ {
37
+ TableRef,
38
+ Name,
39
+ Type,
40
+ Attributes,
41
+ Width,
42
+ MinValue,
43
+ MaxValue,
44
+ KeyTable,
45
+ KeyColumn,
46
+ Category,
47
+ Set,
48
+ Description,
49
+ Modularize,
50
+ }
51
+
52
+ [Flags]
53
+ public enum WixCustomTableColumnTupleAttributes
54
+ {
55
+ None,
56
+ PrimaryKey,
57
+ Localizable,
58
+ Nullable,
59
+ Unreal,
60
+ }
61
+
62
+ public enum WixCustomTableColumnModularizeType
63
+ {
64
+ None,
65
+ Column,
66
+ CompanionFile,
67
+ Condition,
68
+ ControlEventArgument,
69
+ ControlText,
70
+ Icon,
71
+ Property,
72
+ SemicolonDelimited,
73
+ }
74
+
75
+ public class WixCustomTableColumnTuple : IntermediateTuple
76
+ {
77
+ public WixCustomTableColumnTuple() : base(TupleDefinitions.WixCustomTableColumn, null, null)
78
+ {
79
+ }
80
+
81
+ public WixCustomTableColumnTuple(SourceLineNumber sourceLineNumber, Identifier id = null) : base(TupleDefinitions.WixCustomTableColumn, sourceLineNumber, id)
82
+ {
83
+ }
84
+
85
+ public IntermediateField this[WixCustomTableColumnTupleFields index] => this.Fields[(int)index];
86
+
87
+ public string TableRef
88
+ {
89
+ get => (string)this.Fields[(int)WixCustomTableColumnTupleFields.TableRef];
90
+ set => this.Set((int)WixCustomTableColumnTupleFields.TableRef, value);
91
+ }
92
+
93
+ public string Name
94
+ {
95
+ get => (string)this.Fields[(int)WixCustomTableColumnTupleFields.Name];
96
+ set => this.Set((int)WixCustomTableColumnTupleFields.Name, value);
97
+ }
98
+
99
+ public IntermediateFieldType Type
100
+ {
101
+ get => (IntermediateFieldType)this.Fields[(int)WixCustomTableColumnTupleFields.Type].AsNumber();
102
+ set => this.Set((int)WixCustomTableColumnTupleFields.Type, (int)value);
103
+ }
104
+
105
+ public WixCustomTableColumnTupleAttributes Attributes
106
+ {
107
+ get => (WixCustomTableColumnTupleAttributes)this.Fields[(int)WixCustomTableColumnTupleFields.Attributes].AsNumber();
108
+ set => this.Set((int)WixCustomTableColumnTupleFields.Attributes, (int)value);
109
+ }
110
+
111
+ public int Width
112
+ {
113
+ get => (int)this.Fields[(int)WixCustomTableColumnTupleFields.Width];
114
+ set => this.Set((int)WixCustomTableColumnTupleFields.Width, value);
115
+ }
116
+
117
+ public long? MinValue
118
+ {
119
+ get => (long?)this.Fields[(int)WixCustomTableColumnTupleFields.MinValue];
120
+ set => this.Set((int)WixCustomTableColumnTupleFields.MinValue, value);
121
+ }
122
+
123
+ public long? MaxValue
124
+ {
125
+ get => (long?)this.Fields[(int)WixCustomTableColumnTupleFields.MaxValue];
126
+ set => this.Set((int)WixCustomTableColumnTupleFields.MaxValue, value);
127
+ }
128
+
129
+ public string KeyTable
130
+ {
131
+ get => (string)this.Fields[(int)WixCustomTableColumnTupleFields.KeyTable];
132
+ set => this.Set((int)WixCustomTableColumnTupleFields.KeyTable, value);
133
+ }
134
+
135
+ public int? KeyColumn
136
+ {
137
+ get => (int?)this.Fields[(int)WixCustomTableColumnTupleFields.KeyColumn];
138
+ set => this.Set((int)WixCustomTableColumnTupleFields.KeyColumn, value);
139
+ }
140
+
141
+ public string Category
142
+ {
143
+ get => (string)this.Fields[(int)WixCustomTableColumnTupleFields.Category];
144
+ set => this.Set((int)WixCustomTableColumnTupleFields.Category, value);
145
+ }
146
+
147
+ public string Set
148
+ {
149
+ get => (string)this.Fields[(int)WixCustomTableColumnTupleFields.Set];
150
+ set => this.Set((int)WixCustomTableColumnTupleFields.Set, value);
151
+ }
152
+
153
+ public string Description
154
+ {
155
+ get => (string)this.Fields[(int)WixCustomTableColumnTupleFields.Description];
156
+ set => this.Set((int)WixCustomTableColumnTupleFields.Description, value);
157
+ }
158
+
159
+ public WixCustomTableColumnModularizeType? Modularize
160
+ {
161
+ get => (WixCustomTableColumnModularizeType?)this.Fields[(int)WixCustomTableColumnTupleFields.Modularize].AsNullableNumber();
162
+ set => this.Set((int)WixCustomTableColumnTupleFields.Modularize, (int?)value);
163
+ }
164
+
165
+ public bool PrimaryKey => (this.Attributes & WixCustomTableColumnTupleAttributes.PrimaryKey) == WixCustomTableColumnTupleAttributes.PrimaryKey;
166
+
167
+ public bool Localizable => (this.Attributes & WixCustomTableColumnTupleAttributes.Localizable) == WixCustomTableColumnTupleAttributes.Localizable;
168
+
169
+ public bool Nullable => (this.Attributes & WixCustomTableColumnTupleAttributes.Nullable) == WixCustomTableColumnTupleAttributes.Nullable;
170
+
171
+ public bool Unreal => (this.Attributes & WixCustomTableColumnTupleAttributes.Unreal) == WixCustomTableColumnTupleAttributes.Unreal;
172
+ }
173
+}
src/WixToolset.Data/Tuples/WixCustomTableTuple.cs
+4
-88
@@ -10,18 +10,7 @@ namespace WixToolset.Data
10
TupleDefinitionType.WixCustomTable,
11
new[]
12
{
13
- new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.ColumnCount), IntermediateFieldType.Number),
13
new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.ColumnNames), IntermediateFieldType.String),
15
- new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.ColumnTypes), IntermediateFieldType.String),
16
- new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.PrimaryKeys), IntermediateFieldType.String),
17
- new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.MinValues), IntermediateFieldType.String),
18
- new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.MaxValues), IntermediateFieldType.String),
19
- new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.KeyTables), IntermediateFieldType.String),
20
- new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.KeyColumns), IntermediateFieldType.String),
21
- new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.Categories), IntermediateFieldType.String),
22
- new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.Sets), IntermediateFieldType.String),
23
- new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.Descriptions), IntermediateFieldType.String),
24
- new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.Modularizations), IntermediateFieldType.String),
14
new IntermediateFieldDefinition(nameof(WixCustomTableTupleFields.Unreal), IntermediateFieldType.Bool),
15
},
16
typeof(WixCustomTableTuple));
@@ -32,23 +21,14 @@ namespace WixToolset.Data.Tuples
21
{
22
public enum WixCustomTableTupleFields
23
{
35
- ColumnCount,
24
ColumnNames,
37
- ColumnTypes,
38
- PrimaryKeys,
39
- MinValues,
40
- MaxValues,
41
- KeyTables,
42
- KeyColumns,
43
- Categories,
44
- Sets,
45
- Descriptions,
46
- Modularizations,
25
Unreal,
26
}
27
28
public class WixCustomTableTuple : IntermediateTuple
29
{
30
+ public const char ColumnNamesSeparator = '\x85';
31
+
32
public WixCustomTableTuple() : base(TupleDefinitions.WixCustomTable, null, null)
33
{
34
}
@@ -59,82 +39,18 @@ namespace WixToolset.Data.Tuples
39
40
public IntermediateField this[WixCustomTableTupleFields index] => this.Fields[(int)index];
41
62
- public int ColumnCount
63
- {
64
- get => (int)this.Fields[(int)WixCustomTableTupleFields.ColumnCount];
65
- set => this.Set((int)WixCustomTableTupleFields.ColumnCount, value);
66
- }
67
-
42
public string ColumnNames
43
{
44
get => (string)this.Fields[(int)WixCustomTableTupleFields.ColumnNames];
45
set => this.Set((int)WixCustomTableTupleFields.ColumnNames, value);
46
}
47
74
- public string ColumnTypes
75
- {
76
- get => (string)this.Fields[(int)WixCustomTableTupleFields.ColumnTypes];
77
- set => this.Set((int)WixCustomTableTupleFields.ColumnTypes, value);
78
- }
79
-
80
- public string PrimaryKeys
81
- {
82
- get => (string)this.Fields[(int)WixCustomTableTupleFields.PrimaryKeys];
83
- set => this.Set((int)WixCustomTableTupleFields.PrimaryKeys, value);
84
- }
85
-
86
- public string MinValues
87
- {
88
- get => (string)this.Fields[(int)WixCustomTableTupleFields.MinValues];
89
- set => this.Set((int)WixCustomTableTupleFields.MinValues, value);
90
- }
91
-
92
- public string MaxValues
93
- {
94
- get => (string)this.Fields[(int)WixCustomTableTupleFields.MaxValues];
95
- set => this.Set((int)WixCustomTableTupleFields.MaxValues, value);
96
- }
97
-
98
- public string KeyTables
99
- {
100
- get => (string)this.Fields[(int)WixCustomTableTupleFields.KeyTables];
101
- set => this.Set((int)WixCustomTableTupleFields.KeyTables, value);
102
- }
103
-
104
- public string KeyColumns
105
- {
106
- get => (string)this.Fields[(int)WixCustomTableTupleFields.KeyColumns];
107
- set => this.Set((int)WixCustomTableTupleFields.KeyColumns, value);
108
- }
109
-
110
- public string Categories
111
- {
112
- get => (string)this.Fields[(int)WixCustomTableTupleFields.Categories];
113
- set => this.Set((int)WixCustomTableTupleFields.Categories, value);
114
- }
115
-
116
- public string Sets
117
- {
118
- get => (string)this.Fields[(int)WixCustomTableTupleFields.Sets];
119
- set => this.Set((int)WixCustomTableTupleFields.Sets, value);
120
- }
121
-
122
- public string Descriptions
123
- {
124
- get => (string)this.Fields[(int)WixCustomTableTupleFields.Descriptions];
125
- set => this.Set((int)WixCustomTableTupleFields.Descriptions, value);
126
- }
127
-
128
- public string Modularizations
129
- {
130
- get => (string)this.Fields[(int)WixCustomTableTupleFields.Modularizations];
131
- set => this.Set((int)WixCustomTableTupleFields.Modularizations, value);
132
- }
133
-
48
public bool Unreal
49
{
50
get => (bool)this.Fields[(int)WixCustomTableTupleFields.Unreal];
51
set => this.Set((int)WixCustomTableTupleFields.Unreal, value);
52
}
53
+
54
+ public string[] ColumnNamesSeparated => this.ColumnNames.Split(ColumnNamesSeparator);
55
}
56
}
src/WixToolset.Data/WindowsInstaller/WindowsInstallerTableDefinitions.cs
-38
@@ -1733,42 +1733,6 @@ namespace WixToolset.Data.WindowsInstaller
1733
tupleIdIsPrimaryKey: false
1734
);
1735
1736
- public static readonly TableDefinition WixCustomRow = new TableDefinition(
1737
- "WixCustomRow",
1738
- TupleDefinitions.WixCustomRow,
1739
- new[]
1740
- {
1741
- new ColumnDefinition("Table", ColumnType.String, 62, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1742
- new ColumnDefinition("FieldData", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1743
- },
1744
- unreal: true,
1745
- tupleIdIsPrimaryKey: false
1746
- );
1747
-
1748
- public static readonly TableDefinition WixCustomTable = new TableDefinition(
1749
- "WixCustomTable",
1750
- TupleDefinitions.WixCustomTable,
1751
- new[]
1752
- {
1753
- new ColumnDefinition("Table", ColumnType.String, 62, primaryKey: true, nullable: false, ColumnCategory.Unknown),
1754
- new ColumnDefinition("ColumnCount", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1755
- new ColumnDefinition("ColumnNames", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1756
- new ColumnDefinition("ColumnTypes", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1757
- new ColumnDefinition("PrimaryKeys", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1758
- new ColumnDefinition("MinValues", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1759
- new ColumnDefinition("MaxValues", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1760
- new ColumnDefinition("KeyTables", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1761
- new ColumnDefinition("KeyColumns", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1762
- new ColumnDefinition("Categories", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1763
- new ColumnDefinition("Sets", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1764
- new ColumnDefinition("Descriptions", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1765
- new ColumnDefinition("Modularizations", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1766
- new ColumnDefinition("BootstrapperApplicationData", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown),
1767
- },
1768
- unreal: true,
1769
- tupleIdIsPrimaryKey: true
1770
- );
1771
-
1736
public static readonly TableDefinition WixDirectory = new TableDefinition(
1737
"WixDirectory",
1738
null,
@@ -2325,8 +2289,6 @@ namespace WixToolset.Data.WindowsInstaller
2289
WixComplexReference,
2290
WixComponentGroup,
2291
WixControl,
2328
- WixCustomRow,
2329
- WixCustomTable,
2292
WixDirectory,
2293
WixEnsureTable,
2294
WixFeatureGroup,