aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.WindowsInstaller
diff options
context:
space:
mode:
Diffstat (limited to 'src/WixToolset.Core.WindowsInstaller')
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs18
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/BindTransformCommand.cs1
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/CopyTransformDataCommand.cs9
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs3
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/CreateIdtFileCommand.cs228
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs25
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/GenerateDatabaseCommand.cs55
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/MergeModulesCommand.cs7
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/ModularaizeCommand.cs238
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/UpdateControlTextCommand.cs3
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/UpdateFileFacadesCommand.cs1
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs4
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Data/actions.xml76
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Data/tables.xml1962
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Differ.cs6
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Inscribe/InscribeMsiPackageCommand.cs12
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Msi/Database.cs65
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Msi/WixInvalidIdtException.cs33
-rw-r--r--src/WixToolset.Core.WindowsInstaller/MsiBackend.cs18
-rw-r--r--src/WixToolset.Core.WindowsInstaller/MsmBackend.cs18
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Patch.cs7
-rw-r--r--src/WixToolset.Core.WindowsInstaller/RowDictionary.cs84
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Rows/WixActionRowCollection.cs328
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Unbind/ExtractCabinetsCommand.cs3
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Unbind/UnbindDatabaseCommand.cs31
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Unbind/UnbindTranformCommand.cs1
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Validator.cs9
-rw-r--r--src/WixToolset.Core.WindowsInstaller/ValidatorExtension.cs1
-rw-r--r--src/WixToolset.Core.WindowsInstaller/WindowsInstallerStandardInternal.cs64
-rw-r--r--src/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj7
30 files changed, 3191 insertions, 126 deletions
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs
index 012998e6..9e30aed2 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs
@@ -10,6 +10,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
10 using WixToolset.Data; 10 using WixToolset.Data;
11 using WixToolset.Data.Bind; 11 using WixToolset.Data.Bind;
12 using WixToolset.Data.Tuples; 12 using WixToolset.Data.Tuples;
13 using WixToolset.Data.WindowsInstaller;
13 using WixToolset.Extensibility; 14 using WixToolset.Extensibility;
14 using WixToolset.Extensibility.Services; 15 using WixToolset.Extensibility.Services;
15 16
@@ -21,7 +22,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
21 // As outlined in RFC 4122, this is our namespace for generating name-based (version 3) UUIDs. 22 // As outlined in RFC 4122, this is our namespace for generating name-based (version 3) UUIDs.
22 internal static readonly Guid WixComponentGuidNamespace = new Guid("{3064E5C6-FB63-4FE9-AC49-E446A792EFA5}"); 23 internal static readonly Guid WixComponentGuidNamespace = new Guid("{3064E5C6-FB63-4FE9-AC49-E446A792EFA5}");
23 24
24 public BindDatabaseCommand(IBindContext context, Validator validator) 25 public BindDatabaseCommand(IBindContext context, IEnumerable<IWindowsInstallerBackendExtension> backendExtension, Validator validator)
25 { 26 {
26 this.TableDefinitions = WindowsInstallerStandardInternal.GetTableDefinitions(); 27 this.TableDefinitions = WindowsInstallerStandardInternal.GetTableDefinitions();
27 28
@@ -40,7 +41,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
40 this.Validator = validator; 41 this.Validator = validator;
41 this.WixVariableResolver = context.WixVariableResolver; 42 this.WixVariableResolver = context.WixVariableResolver;
42 43
43 this.BackendExtensions = context.ExtensionManager.Create<IWindowsInstallerBackendExtension>(); 44 this.BackendExtensions = backendExtension;
44 } 45 }
45 46
46 private IEnumerable<BindPath> BindPaths { get; } 47 private IEnumerable<BindPath> BindPaths { get; }
@@ -298,7 +299,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
298 // Try to put as much above here as possible, updating the IR is better. 299 // Try to put as much above here as possible, updating the IR is better.
299 Output output; 300 Output output;
300 { 301 {
301 var command = new CreateOutputFromIRCommand(section, this.TableDefinitions); 302 var command = new CreateOutputFromIRCommand(section, this.TableDefinitions, this.BackendExtensions);
302 command.Execute(); 303 command.Execute();
303 304
304 output = command.Output; 305 output = command.Output;
@@ -313,13 +314,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind
313 // Modularize identifiers and add tables with real streams to the import tables. 314 // Modularize identifiers and add tables with real streams to the import tables.
314 if (OutputType.Module == output.Type) 315 if (OutputType.Module == output.Type)
315 { 316 {
316 // Gather all the suppress modularization identifiers 317 var command = new ModularaizeCommand(output, modularizationGuid, section.Tuples.OfType<WixSuppressModularizationTuple>());
317 var suppressModularizationIdentifiers = new HashSet<string>(section.Tuples.OfType<WixSuppressModularizationTuple>().Select(s => s.WixSuppressModularization)); 318 command.Execute();
318
319 foreach (var table in output.Tables)
320 {
321 table.Modularize(modularizationGuid, suppressModularizationIdentifiers);
322 }
323 } 319 }
324 320
325#if TODO_FINISH_UPDATE 321#if TODO_FINISH_UPDATE
@@ -897,7 +893,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
897 { 893 {
898 Dictionary<string, bool> componentGuidConditions = new Dictionary<string, bool>(componentTable.Rows.Count); 894 Dictionary<string, bool> componentGuidConditions = new Dictionary<string, bool>(componentTable.Rows.Count);
899 895
900 foreach (Data.Rows.ComponentRow row in componentTable.Rows) 896 foreach (Data.WindowsInstaller.Rows.ComponentRow row in componentTable.Rows)
901 { 897 {
902 // we don't care about unmanaged components and if there's a * GUID remaining, 898 // we don't care about unmanaged components and if there's a * GUID remaining,
903 // there's already an error that prevented it from being replaced with a real GUID. 899 // there's already an error that prevented it from being replaced with a real GUID.
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/BindTransformCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/BindTransformCommand.cs
index b4027834..49440cea 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/BindTransformCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/BindTransformCommand.cs
@@ -10,6 +10,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
10 using WixToolset.Extensibility; 10 using WixToolset.Extensibility;
11 using WixToolset.Msi; 11 using WixToolset.Msi;
12 using WixToolset.Core.Native; 12 using WixToolset.Core.Native;
13 using WixToolset.Data.WindowsInstaller;
13 14
14 internal class BindTransformCommand 15 internal class BindTransformCommand
15 { 16 {
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/CopyTransformDataCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/CopyTransformDataCommand.cs
index 0dcddb99..559d440c 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/CopyTransformDataCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/CopyTransformDataCommand.cs
@@ -5,12 +5,13 @@ namespace WixToolset.Core.WindowsInstaller.Bind
5 using System; 5 using System;
6 using System.Collections.Generic; 6 using System.Collections.Generic;
7 using System.Diagnostics; 7 using System.Diagnostics;
8 using WixToolset.Data;
9 using WixToolset.Data.Rows;
10 using WixToolset.Extensibility;
11 using WixToolset.Core.Native;
12 using WixToolset.Core.Bind; 8 using WixToolset.Core.Bind;
9 using WixToolset.Core.Native;
10 using WixToolset.Data;
13 using WixToolset.Data.Tuples; 11 using WixToolset.Data.Tuples;
12 using WixToolset.Data.WindowsInstaller;
13 using WixToolset.Data.WindowsInstaller.Rows;
14 using WixToolset.Extensibility;
14 15
15 internal class CopyTransformDataCommand 16 internal class CopyTransformDataCommand
16 { 17 {
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs
index a449397d..0aa50bd9 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs
@@ -12,8 +12,9 @@ namespace WixToolset.Core.WindowsInstaller.Bind
12 using WixToolset.Core.Bind; 12 using WixToolset.Core.Bind;
13 using WixToolset.Data; 13 using WixToolset.Data;
14 using WixToolset.Data.Bind; 14 using WixToolset.Data.Bind;
15 using WixToolset.Data.Rows;
16 using WixToolset.Data.Tuples; 15 using WixToolset.Data.Tuples;
16 using WixToolset.Data.WindowsInstaller;
17 using WixToolset.Data.WindowsInstaller.Rows;
17 using WixToolset.Extensibility; 18 using WixToolset.Extensibility;
18 19
19 /// <summary> 20 /// <summary>
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/CreateIdtFileCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/CreateIdtFileCommand.cs
new file mode 100644
index 00000000..1fc7d068
--- /dev/null
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/CreateIdtFileCommand.cs
@@ -0,0 +1,228 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Core.WindowsInstaller.Bind
4{
5 using System;
6 using System.Globalization;
7 using System.IO;
8 using System.Text;
9 using WixToolset.Data;
10 using WixToolset.Data.WindowsInstaller;
11
12 internal class CreateIdtFileCommand
13 {
14 public CreateIdtFileCommand(Table table, int codepage, string intermediateFolder, bool keepAddedColumns)
15 {
16 this.Table = table;
17 this.Codepage = codepage;
18 this.IntermediateFolder = intermediateFolder;
19 this.KeepAddedColumns = keepAddedColumns;
20 }
21
22 private Table Table { get; }
23
24 private int Codepage { get; set; }
25
26 private string IntermediateFolder { get; }
27
28 private bool KeepAddedColumns { get; }
29
30 public string IdtPath { get; private set; }
31
32 public void Execute()
33 {
34 // write out the table to an IDT file
35 Encoding encoding;
36
37 // If UTF8 encoding, use the UTF8-specific constructor to avoid writing
38 // the byte order mark at the beginning of the file
39 if (this.Codepage == Encoding.UTF8.CodePage)
40 {
41 encoding = new UTF8Encoding(false, true);
42 }
43 else
44 {
45 if (this.Codepage == 0)
46 {
47 this.Codepage = Encoding.ASCII.CodePage;
48 }
49
50 encoding = Encoding.GetEncoding(this.Codepage, new EncoderExceptionFallback(), new DecoderExceptionFallback());
51 }
52
53 this.IdtPath = Path.Combine(this.IntermediateFolder, String.Concat(this.Table.Name, ".idt"));
54
55 using (var idtWriter = new StreamWriter(this.IdtPath, false, encoding))
56 {
57 this.TableToIdtDefinition(this.Table, idtWriter, this.KeepAddedColumns);
58 }
59 }
60
61 private void TableToIdtDefinition(Table table, StreamWriter writer, bool keepAddedColumns)
62 {
63 if (table.Definition.Unreal)
64 {
65 return;
66 }
67
68 if (TableDefinition.MaxColumnsInRealTable < table.Definition.Columns.Count)
69 {
70 throw new WixException(WixDataErrors.TooManyColumnsInRealTable(table.Definition.Name, table.Definition.Columns.Count, TableDefinition.MaxColumnsInRealTable));
71 }
72
73 // Tack on the table header, and flush before we start writing bytes directly to the stream.
74 var header = this.TableDefinitionToIdtDefinition(table.Definition, keepAddedColumns);
75 writer.Write(header);
76 writer.Flush();
77
78 using (var binary = new BinaryWriter(writer.BaseStream, writer.Encoding, true))
79 {
80 // Create an encoding that replaces characters with question marks, and doesn't throw. We'll
81 // use this in case of errors
82 Encoding convertEncoding = Encoding.GetEncoding(writer.Encoding.CodePage);
83
84 foreach (Row row in table.Rows)
85 {
86 if (row.Redundant)
87 {
88 continue;
89 }
90
91 string rowString = this.RowToIdtDefinition(row, keepAddedColumns);
92 byte[] rowBytes;
93
94 try
95 {
96 // GetBytes will throw an exception if any character doesn't match our current encoding
97 rowBytes = writer.Encoding.GetBytes(rowString);
98 }
99 catch (EncoderFallbackException)
100 {
101 Messaging.Instance.OnMessage(WixDataErrors.InvalidStringForCodepage(row.SourceLineNumbers, Convert.ToString(writer.Encoding.WindowsCodePage, CultureInfo.InvariantCulture)));
102
103 rowBytes = convertEncoding.GetBytes(rowString);
104 }
105
106 binary.Write(rowBytes, 0, rowBytes.Length);
107 }
108 }
109 }
110
111 private string TableDefinitionToIdtDefinition(TableDefinition definition, bool keepAddedColumns)
112 {
113 var first = true;
114 var columnString = new StringBuilder();
115 var dataString = new StringBuilder();
116 var tableString = new StringBuilder();
117
118 tableString.Append(definition.Name);
119 foreach (var column in definition.Columns)
120 {
121 // conditionally keep columns added in a transform; otherwise,
122 // break because columns can only be added at the end
123 if (column.Added && !keepAddedColumns)
124 {
125 break;
126 }
127
128 if (!first)
129 {
130 columnString.Append('\t');
131 dataString.Append('\t');
132 }
133
134 columnString.Append(column.Name);
135 dataString.Append(ColumnIdtType(column));
136
137 if (column.PrimaryKey)
138 {
139 tableString.AppendFormat("\t{0}", column.Name);
140 }
141
142 first = false;
143 }
144 columnString.Append("\r\n");
145 columnString.Append(dataString);
146 columnString.Append("\r\n");
147 columnString.Append(tableString);
148 columnString.Append("\r\n");
149
150 return columnString.ToString();
151 }
152
153 private string RowToIdtDefinition(Row row, bool keepAddedColumns)
154 {
155 var first = true;
156 var sb = new StringBuilder();
157
158 foreach (var field in row.Fields)
159 {
160 // Conditionally keep columns added in a transform; otherwise,
161 // break because columns can only be added at the end.
162 if (field.Column.Added && !keepAddedColumns)
163 {
164 break;
165 }
166
167 if (first)
168 {
169 first = false;
170 }
171 else
172 {
173 sb.Append('\t');
174 }
175
176 sb.Append(this.FieldToIdtValue(field));
177 }
178 sb.Append("\r\n");
179
180 return sb.ToString();
181 }
182
183 private string FieldToIdtValue(Field field)
184 {
185 var data = field.AsString();
186
187 if (String.IsNullOrEmpty(data))
188 {
189 return data;
190 }
191
192 // Special field value idt-specific escaping.
193 return data.Replace('\t', '\x10')
194 .Replace('\r', '\x11')
195 .Replace('\n', '\x19');
196 }
197
198
199 /// <summary>
200 /// Gets the type of the column in IDT format.
201 /// </summary>
202 /// <value>IDT format for column type.</value>
203 private static string ColumnIdtType(ColumnDefinition column)
204 {
205 char typeCharacter;
206 switch (column.Type)
207 {
208 case ColumnType.Number:
209 typeCharacter = column.Nullable ? 'I' : 'i';
210 break;
211 case ColumnType.Preserved:
212 case ColumnType.String:
213 typeCharacter = column.Nullable ? 'S' : 's';
214 break;
215 case ColumnType.Localized:
216 typeCharacter = column.Nullable ? 'L' : 'l';
217 break;
218 case ColumnType.Object:
219 typeCharacter = column.Nullable ? 'V' : 'v';
220 break;
221 default:
222 throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture, WixDataStrings.EXP_UnknownColumnType, column.Type));
223 }
224
225 return String.Concat(typeCharacter, column.Length);
226 }
227 }
228}
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs
index a19a53f1..4e053c12 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs
@@ -3,20 +3,26 @@
3namespace WixToolset.Core.WindowsInstaller.Bind 3namespace WixToolset.Core.WindowsInstaller.Bind
4{ 4{
5 using System; 5 using System;
6 using System.Collections.Generic;
6 using System.Linq; 7 using System.Linq;
7 using WixToolset.Core.Native; 8 using WixToolset.Core.Native;
8 using WixToolset.Data; 9 using WixToolset.Data;
9 using WixToolset.Data.Rows;
10 using WixToolset.Data.Tuples; 10 using WixToolset.Data.Tuples;
11 using WixToolset.Data.WindowsInstaller;
12 using WixToolset.Data.WindowsInstaller.Rows;
13 using WixToolset.Extensibility;
11 14
12 internal class CreateOutputFromIRCommand 15 internal class CreateOutputFromIRCommand
13 { 16 {
14 public CreateOutputFromIRCommand(IntermediateSection section, TableDefinitionCollection tableDefinitions) 17 public CreateOutputFromIRCommand(IntermediateSection section, TableDefinitionCollection tableDefinitions, IEnumerable<IWindowsInstallerBackendExtension> backendExtensions)
15 { 18 {
16 this.Section = section; 19 this.Section = section;
17 this.TableDefinitions = tableDefinitions; 20 this.TableDefinitions = tableDefinitions;
21 this.BackendExtensions = backendExtensions;
18 } 22 }
19 23
24 private IEnumerable<IWindowsInstallerBackendExtension> BackendExtensions { get; }
25
20 private TableDefinitionCollection TableDefinitions { get; } 26 private TableDefinitionCollection TableDefinitions { get; }
21 27
22 private IntermediateSection Section { get; } 28 private IntermediateSection Section { get; }
@@ -60,6 +66,10 @@ namespace WixToolset.Core.WindowsInstaller.Bind
60 // Ignored. 66 // Ignored.
61 break; 67 break;
62 68
69 case TupleDefinitionType.MustBeFromAnExtension:
70 this.AddTupleFromExtension(tuple, output);
71 break;
72
63 default: 73 default:
64 this.AddTupleDefaultly(tuple, output); 74 this.AddTupleDefaultly(tuple, output);
65 break; 75 break;
@@ -206,6 +216,17 @@ namespace WixToolset.Core.WindowsInstaller.Bind
206 } 216 }
207 } 217 }
208 218
219 private void AddTupleFromExtension(IntermediateTuple tuple, Output output)
220 {
221 foreach (var extension in this.BackendExtensions)
222 {
223 if (extension.TryAddTupleToOutput(tuple, output))
224 {
225 break;
226 }
227 }
228 }
229
209 private void AddTupleDefaultly(IntermediateTuple tuple, Output output) 230 private void AddTupleDefaultly(IntermediateTuple tuple, Output output)
210 { 231 {
211 if (!this.TableDefinitions.TryGet(tuple.Definition.Name, out var tableDefinition)) 232 if (!this.TableDefinitions.TryGet(tuple.Definition.Name, out var tableDefinition))
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/GenerateDatabaseCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/GenerateDatabaseCommand.cs
index a3d3ecf7..e4e66559 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/GenerateDatabaseCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/GenerateDatabaseCommand.cs
@@ -12,6 +12,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
12 using WixToolset.Extensibility; 12 using WixToolset.Extensibility;
13 using WixToolset.Msi; 13 using WixToolset.Msi;
14 using WixToolset.Core.Native; 14 using WixToolset.Core.Native;
15 using WixToolset.Data.WindowsInstaller;
15 16
16 internal class GenerateDatabaseCommand 17 internal class GenerateDatabaseCommand
17 { 18 {
@@ -44,14 +45,56 @@ namespace WixToolset.Core.WindowsInstaller.Bind
44 // Add the _Validation rows. 45 // Add the _Validation rows.
45 if (!this.SuppressAddingValidationRows) 46 if (!this.SuppressAddingValidationRows)
46 { 47 {
47 Table validationTable = this.Output.EnsureTable(this.TableDefinitions["_Validation"]); 48 var validationTable = this.Output.EnsureTable(this.TableDefinitions["_Validation"]);
48 49
49 foreach (Table table in this.Output.Tables) 50 foreach (var table in this.Output.Tables)
50 { 51 {
51 if (!table.Definition.Unreal) 52 if (!table.Definition.Unreal)
52 { 53 {
53 // Add the validation rows for this table. 54 // Add the validation rows for this table.
54 table.Definition.AddValidationRows(validationTable); 55 foreach (ColumnDefinition columnDef in table.Definition.Columns)
56 {
57 var row = validationTable.CreateRow(null);
58
59 row[0] = table.Name;
60
61 row[1] = columnDef.Name;
62
63 if (columnDef.Nullable)
64 {
65 row[2] = "Y";
66 }
67 else
68 {
69 row[2] = "N";
70 }
71
72 if (columnDef.MinValue.HasValue)
73 {
74 row[3] = columnDef.MinValue.Value;
75 }
76
77 if (columnDef.MaxValue.HasValue)
78 {
79 row[4] = columnDef.MaxValue.Value;
80 }
81
82 row[5] = columnDef.KeyTable;
83
84 if (columnDef.KeyColumn.HasValue)
85 {
86 row[6] = columnDef.KeyColumn.Value;
87 }
88
89 if (ColumnCategory.Unknown != columnDef.Category)
90 {
91 row[7] = columnDef.Category.ToString();
92 }
93
94 row[8] = columnDef.Possibilities;
95
96 row[9] = columnDef.Description;
97 }
55 } 98 }
56 } 99 }
57 } 100 }
@@ -133,7 +176,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind
133 { 176 {
134 try 177 try
135 { 178 {
136 db.ImportTable(this.Output.Codepage, importTable, baseDirectory, this.KeepAddedColumns); 179 //db.ImportTable(this.Output.Codepage, importTable, baseDirectory, this.KeepAddedColumns);
180 var command = new CreateIdtFileCommand(importTable, this.Output.Codepage, baseDirectory, this.KeepAddedColumns);
181 command.Execute();
182
183 db.Import(command.IdtPath);
137 } 184 }
138 catch (WixInvalidIdtException) 185 catch (WixInvalidIdtException)
139 { 186 {
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/MergeModulesCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/MergeModulesCommand.cs
index dcf67c05..32a05d93 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/MergeModulesCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/MergeModulesCommand.cs
@@ -8,12 +8,13 @@ namespace WixToolset.Core.WindowsInstaller.Bind
8 using System.IO; 8 using System.IO;
9 using System.Runtime.InteropServices; 9 using System.Runtime.InteropServices;
10 using System.Text; 10 using System.Text;
11 using WixToolset.Core.Bind;
12 using WixToolset.Core.Native;
11 using WixToolset.Data; 13 using WixToolset.Data;
12 using WixToolset.Data.Rows; 14 using WixToolset.Data.WindowsInstaller;
15 using WixToolset.Data.WindowsInstaller.Rows;
13 using WixToolset.MergeMod; 16 using WixToolset.MergeMod;
14 using WixToolset.Msi; 17 using WixToolset.Msi;
15 using WixToolset.Core.Native;
16 using WixToolset.Core.Bind;
17 18
18 /// <summary> 19 /// <summary>
19 /// Update file information. 20 /// Update file information.
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/ModularaizeCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/ModularaizeCommand.cs
new file mode 100644
index 00000000..03538fc3
--- /dev/null
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/ModularaizeCommand.cs
@@ -0,0 +1,238 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Core.WindowsInstaller.Bind
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Diagnostics;
8 using System.Globalization;
9 using System.Linq;
10 using System.Text;
11 using System.Text.RegularExpressions;
12 using WixToolset.Data;
13 using WixToolset.Data.Tuples;
14 using WixToolset.Data.WindowsInstaller;
15
16 internal class ModularaizeCommand
17 {
18 public ModularaizeCommand(Output output, string modularizationGuid, IEnumerable<WixSuppressModularizationTuple> suppressTuples)
19 {
20 this.Output = output;
21 this.ModularizationGuid = modularizationGuid;
22
23 // Gather all the unique suppress modularization identifiers.
24 this.SuppressModularizationIdentifiers = new HashSet<string>(suppressTuples.Select(s => s.WixSuppressModularization));
25 }
26
27 private Output Output { get; }
28
29 private string ModularizationGuid { get; }
30
31 private HashSet<string> SuppressModularizationIdentifiers { get; }
32
33 public void Execute()
34 {
35 foreach (var table in this.Output.Tables)
36 {
37 this.ModularizeTable(table);
38 }
39 }
40
41 /// <summary>
42 /// Modularize the table.
43 /// </summary>
44 /// <param name="modularizationGuid">String containing the GUID of the Merge Module, if appropriate.</param>
45 /// <param name="suppressModularizationIdentifiers">Optional collection of identifiers that should not be modularized.</param>
46 public void ModularizeTable(Table table)
47 {
48 var modularizedColumns = new List<int>();
49
50 // find the modularized columns
51 for (var i = 0; i < table.Definition.Columns.Count; ++i)
52 {
53 if (ColumnModularizeType.None != table.Definition.Columns[i].ModularizeType)
54 {
55 modularizedColumns.Add(i);
56 }
57 }
58
59 if (0 < modularizedColumns.Count)
60 {
61 foreach (var row in table.Rows)
62 {
63 foreach (var modularizedColumn in modularizedColumns)
64 {
65 var field = row.Fields[modularizedColumn];
66
67 if (field.Data != null)
68 {
69 field.Data = this.ModularizedRowFieldValue(row, field);
70 }
71 }
72 }
73 }
74 }
75
76 private string ModularizedRowFieldValue(Row row, Field field)
77 {
78 var fieldData = field.AsString();
79
80 if (!(WindowsInstallerStandard.IsStandardAction(fieldData) || WindowsInstallerStandard.IsStandardProperty(fieldData)))
81 {
82 ColumnModularizeType modularizeType = field.Column.ModularizeType;
83
84 // special logic for the ControlEvent table's Argument column
85 // this column requires different modularization methods depending upon the value of the Event column
86 if (ColumnModularizeType.ControlEventArgument == field.Column.ModularizeType)
87 {
88 switch (row[2].ToString())
89 {
90 case "CheckExistingTargetPath": // redirectable property name
91 case "CheckTargetPath":
92 case "DoAction": // custom action name
93 case "NewDialog": // dialog name
94 case "SelectionBrowse":
95 case "SetTargetPath":
96 case "SpawnDialog":
97 case "SpawnWaitDialog":
98 if (Common.IsIdentifier(fieldData))
99 {
100 modularizeType = ColumnModularizeType.Column;
101 }
102 else
103 {
104 modularizeType = ColumnModularizeType.Property;
105 }
106 break;
107 default: // formatted
108 modularizeType = ColumnModularizeType.Property;
109 break;
110 }
111 }
112 else if (ColumnModularizeType.ControlText == field.Column.ModularizeType)
113 {
114 // icons are stored in the Binary table, so they get column-type modularization
115 if (("Bitmap" == row[2].ToString() || "Icon" == row[2].ToString()) && Common.IsIdentifier(fieldData))
116 {
117 modularizeType = ColumnModularizeType.Column;
118 }
119 else
120 {
121 modularizeType = ColumnModularizeType.Property;
122 }
123 }
124
125 switch (modularizeType)
126 {
127 case ColumnModularizeType.Column:
128 // ensure the value is an identifier (otherwise it shouldn't be modularized this way)
129 if (!Common.IsIdentifier(fieldData))
130 {
131 throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture, WixDataStrings.EXP_CannotModularizeIllegalID, fieldData));
132 }
133
134 // if we're not supposed to suppress modularization of this identifier
135 if (!this.SuppressModularizationIdentifiers.Contains(fieldData))
136 {
137 fieldData = String.Concat(fieldData, ".", this.ModularizationGuid);
138 }
139 break;
140
141 case ColumnModularizeType.Property:
142 case ColumnModularizeType.Condition:
143 Regex regex;
144 if (ColumnModularizeType.Property == modularizeType)
145 {
146 regex = new Regex(@"\[(?<identifier>[#$!]?[a-zA-Z_][a-zA-Z0-9_\.]*)]", RegexOptions.Singleline | RegexOptions.ExplicitCapture);
147 }
148 else
149 {
150 Debug.Assert(ColumnModularizeType.Condition == modularizeType);
151
152 // This heinous looking regular expression is actually quite an elegant way
153 // to shred the entire condition into the identifiers that need to be
154 // modularized. Let's break it down piece by piece:
155 //
156 // 1. Look for the operators: NOT, EQV, XOR, OR, AND, IMP (plus a space). Note that the
157 // regular expression is case insensitive so we don't have to worry about
158 // all the permutations of these strings.
159 // 2. Look for quoted strings. Quoted strings are just text and are ignored
160 // outright.
161 // 3. Look for environment variables. These look like identifiers we might
162 // otherwise be interested in but start with a percent sign. Like quoted
163 // strings these enviroment variable references are ignored outright.
164 // 4. Match all identifiers that are things that need to be modularized. Note
165 // the special characters (!, $, ?, &) that denote Component and Feature states.
166 regex = new Regex(@"NOT\s|EQV\s|XOR\s|OR\s|AND\s|IMP\s|"".*?""|%[a-zA-Z_][a-zA-Z0-9_\.]*|(?<identifier>[!$\?&]?[a-zA-Z_][a-zA-Z0-9_\.]*)", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
167
168 // less performant version of the above with captures showing where everything lives
169 // regex = new Regex(@"(?<operator>NOT|EQV|XOR|OR|AND|IMP)|(?<string>"".*?"")|(?<environment>%[a-zA-Z_][a-zA-Z0-9_\.]*)|(?<identifier>[!$\?&]?[a-zA-Z_][a-zA-Z0-9_\.]*)",RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
170 }
171
172 var matches = regex.Matches(fieldData);
173
174 var sb = new StringBuilder(fieldData);
175
176 // Notice how this code walks backward through the list
177 // because it modifies the string as we through it.
178 for (var i = matches.Count - 1; 0 <= i; i--)
179 {
180 var group = matches[i].Groups["identifier"];
181 if (group.Success)
182 {
183 var identifier = group.Value;
184 if (!WindowsInstallerStandard.IsStandardProperty(identifier) && !this.SuppressModularizationIdentifiers.Contains(identifier))
185 {
186 sb.Insert(group.Index + group.Length, '.');
187 sb.Insert(group.Index + group.Length + 1, this.ModularizationGuid);
188 }
189 }
190 }
191
192 fieldData = sb.ToString();
193 break;
194
195 case ColumnModularizeType.CompanionFile:
196 // if we're not supposed to ignore this identifier and the value does not start with
197 // a digit, we must have a companion file so modularize it
198 if (!this.SuppressModularizationIdentifiers.Contains(fieldData) &&
199 0 < fieldData.Length && !Char.IsDigit(fieldData, 0))
200 {
201 fieldData = String.Concat(fieldData, ".", this.ModularizationGuid);
202 }
203 break;
204
205 case ColumnModularizeType.Icon:
206 if (!this.SuppressModularizationIdentifiers.Contains(fieldData))
207 {
208 var start = fieldData.LastIndexOf(".", StringComparison.Ordinal);
209 if (-1 == start)
210 {
211 fieldData = String.Concat(fieldData, ".", this.ModularizationGuid);
212 }
213 else
214 {
215 fieldData = String.Concat(fieldData.Substring(0, start), ".", this.ModularizationGuid, fieldData.Substring(start));
216 }
217 }
218 break;
219
220 case ColumnModularizeType.SemicolonDelimited:
221 var keys = fieldData.Split(';');
222 for (var i = 0; i < keys.Length; ++i)
223 {
224 if (!String.IsNullOrEmpty(keys[i]))
225 {
226 keys[i] = String.Concat(keys[i], ".", this.ModularizationGuid);
227 }
228 }
229
230 fieldData = String.Join(";", keys);
231 break;
232 }
233 }
234
235 return fieldData;
236 }
237 }
238}
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/UpdateControlTextCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/UpdateControlTextCommand.cs
index 9579e0f8..dddc9380 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/UpdateControlTextCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/UpdateControlTextCommand.cs
@@ -5,7 +5,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind
5 using System; 5 using System;
6 using System.IO; 6 using System.IO;
7 using WixToolset.Data; 7 using WixToolset.Data;
8 using WixToolset.Data.Rows; 8 using WixToolset.Data.WindowsInstaller;
9 using WixToolset.Data.WindowsInstaller.Rows;
9 10
10 internal class UpdateControlTextCommand 11 internal class UpdateControlTextCommand
11 { 12 {
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/UpdateFileFacadesCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/UpdateFileFacadesCommand.cs
index a9eb2a8f..cf620e72 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/UpdateFileFacadesCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/UpdateFileFacadesCommand.cs
@@ -14,6 +14,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
14 using WixToolset.Core.Bind; 14 using WixToolset.Core.Bind;
15 using WixToolset.Data; 15 using WixToolset.Data;
16 using WixToolset.Data.Tuples; 16 using WixToolset.Data.Tuples;
17 using WixToolset.Data.WindowsInstaller;
17 using WixToolset.Msi; 18 using WixToolset.Msi;
18 19
19 /// <summary> 20 /// <summary>
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs
index db74eda5..0767adb0 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/UpdateMediaSequencesCommand.cs
@@ -2,13 +2,13 @@
2 2
3namespace WixToolset.Core.WindowsInstaller.Bind 3namespace WixToolset.Core.WindowsInstaller.Bind
4{ 4{
5 using System;
6 using System.Collections.Generic; 5 using System.Collections.Generic;
7 using System.Linq; 6 using System.Linq;
8 using WixToolset.Core.Bind; 7 using WixToolset.Core.Bind;
9 using WixToolset.Data; 8 using WixToolset.Data;
10 using WixToolset.Data.Rows;
11 using WixToolset.Data.Tuples; 9 using WixToolset.Data.Tuples;
10 using WixToolset.Data.WindowsInstaller;
11 using WixToolset.Data.WindowsInstaller.Rows;
12 12
13 internal class UpdateMediaSequencesCommand 13 internal class UpdateMediaSequencesCommand
14 { 14 {
diff --git a/src/WixToolset.Core.WindowsInstaller/Data/actions.xml b/src/WixToolset.Core.WindowsInstaller/Data/actions.xml
new file mode 100644
index 00000000..f65b792d
--- /dev/null
+++ b/src/WixToolset.Core.WindowsInstaller/Data/actions.xml
@@ -0,0 +1,76 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<actions xmlns="http://wixtoolset.org/schemas/v4/wi/actions">
6 <action name="InstallInitialize" sequence="1500" AdminExecuteSequence="yes" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" />
7 <action name="InstallExecute" condition="NOT Installed" sequence="6500" InstallExecuteSequence="yes" />
8 <action name="InstallExecuteAgain" condition="NOT Installed" sequence="6550" InstallExecuteSequence="yes" />
9 <action name="InstallFinalize" sequence="6600" AdminExecuteSequence="yes" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" />
10 <action name="InstallFiles" sequence="4000" AdminExecuteSequence="yes" InstallExecuteSequence="yes" />
11 <action name="InstallAdminPackage" sequence="3900" AdminExecuteSequence="yes" />
12 <action name="FileCost" sequence="900" AdminExecuteSequence="yes" AdminUISequence="yes" InstallExecuteSequence="yes" InstallUISequence="yes" />
13 <action name="CostInitialize" sequence="800" AdminExecuteSequence="yes" AdminUISequence="yes" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" InstallUISequence="yes" />
14 <action name="CostFinalize" sequence="1000" AdminExecuteSequence="yes" AdminUISequence="yes" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" InstallUISequence="yes" />
15 <action name="InstallValidate" sequence="1400" AdminExecuteSequence="yes" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" />
16 <action name="ExecuteAction" sequence="1300" AdminUISequence="yes" InstallUISequence="yes" />
17 <action name="CreateShortcuts" sequence="4500" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" />
18 <action name="MsiPublishAssemblies" sequence="6250" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" />
19 <action name="PublishComponents" sequence="6200" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" />
20 <action name="PublishFeatures" sequence="6300" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" />
21 <action name="PublishProduct" sequence="6400" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" />
22 <action name="RegisterClassInfo" sequence="4600" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" />
23 <action name="RegisterExtensionInfo" sequence="4700" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" />
24 <action name="RegisterMIMEInfo" sequence="4900" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" />
25 <action name="RegisterProgIdInfo" sequence="4800" AdvtExecuteSequence="yes" InstallExecuteSequence="yes" />
26 <action name="AllocateRegistrySpace" condition="NOT Installed" sequence="1550" InstallExecuteSequence="yes" />
27 <action name="AppSearch" sequence="50" InstallExecuteSequence="yes" InstallUISequence="yes" />
28 <action name="BindImage" sequence="4300" InstallExecuteSequence="yes" />
29 <action name="CCPSearch" condition="NOT Installed" sequence="500" InstallExecuteSequence="yes" InstallUISequence="yes" />
30 <action name="CreateFolders" sequence="3700" InstallExecuteSequence="yes" />
31 <action name="DeleteServices" condition="VersionNT" sequence="2000" InstallExecuteSequence="yes" />
32 <action name="DuplicateFiles" sequence="4210" InstallExecuteSequence="yes" />
33 <action name="FindRelatedProducts" sequence="25" InstallExecuteSequence="yes" InstallUISequence="yes" />
34 <action name="InstallODBC" sequence="5400" InstallExecuteSequence="yes" />
35 <action name="InstallServices" condition="VersionNT" sequence="5800" InstallExecuteSequence="yes" />
36 <action name="MsiConfigureServices" condition="VersionNT>=600" sequence="5850" InstallExecuteSequence="yes" />
37 <action name="IsolateComponents" sequence="950" InstallExecuteSequence="yes" InstallUISequence="yes" />
38 <action name="LaunchConditions" sequence="100" AdminExecuteSequence="yes" AdminUISequence="yes" InstallExecuteSequence="yes" InstallUISequence="yes" />
39 <action name="MigrateFeatureStates" sequence="1200" InstallExecuteSequence="yes" InstallUISequence="yes" />
40 <action name="MoveFiles" sequence="3800" InstallExecuteSequence="yes" />
41 <action name="PatchFiles" sequence="4090" AdminExecuteSequence="yes" InstallExecuteSequence="yes" />
42 <action name="ProcessComponents" sequence="1600" InstallExecuteSequence="yes" />
43 <action name="RegisterComPlus" sequence="5700" InstallExecuteSequence="yes" />
44 <action name="RegisterFonts" sequence="5300" InstallExecuteSequence="yes" />
45 <action name="RegisterProduct" sequence="6100" InstallExecuteSequence="yes" />
46 <action name="RegisterTypeLibraries" sequence="5500" InstallExecuteSequence="yes" />
47 <action name="RegisterUser" sequence="6000" InstallExecuteSequence="yes" />
48 <action name="RemoveDuplicateFiles" sequence="3400" InstallExecuteSequence="yes" />
49 <action name="RemoveEnvironmentStrings" sequence="3300" InstallExecuteSequence="yes" />
50 <action name="RemoveFiles" sequence="3500" InstallExecuteSequence="yes" />
51 <action name="RemoveFolders" sequence="3600" InstallExecuteSequence="yes" />
52 <action name="RemoveIniValues" sequence="3100" InstallExecuteSequence="yes" />
53 <action name="RemoveODBC" sequence="2400" InstallExecuteSequence="yes" />
54 <action name="RemoveRegistryValues" sequence="2600" InstallExecuteSequence="yes" />
55 <action name="RemoveShortcuts" sequence="3200" InstallExecuteSequence="yes" />
56 <action name="RMCCPSearch" condition="NOT Installed" sequence="600" InstallExecuteSequence="yes" InstallUISequence="yes" />
57 <action name="SelfRegModules" sequence="5600" InstallExecuteSequence="yes" />
58 <action name="SelfUnregModules" sequence="2200" InstallExecuteSequence="yes" />
59 <action name="SetODBCFolders" sequence="1100" InstallExecuteSequence="yes" />
60 <action name="StartServices" condition="VersionNT" sequence="5900" InstallExecuteSequence="yes" />
61 <action name="StopServices" condition="VersionNT" sequence="1900" InstallExecuteSequence="yes" />
62 <action name="MsiUnpublishAssemblies" sequence="1750" InstallExecuteSequence="yes" />
63 <action name="UnpublishComponents" sequence="1700" InstallExecuteSequence="yes" />
64 <action name="UnpublishFeatures" sequence="1800" InstallExecuteSequence="yes" />
65 <action name="UnregisterClassInfo" sequence="2700" InstallExecuteSequence="yes" />
66 <action name="UnregisterComPlus" sequence="2100" InstallExecuteSequence="yes" />
67 <action name="UnregisterExtensionInfo" sequence="2800" InstallExecuteSequence="yes" />
68 <action name="UnregisterFonts" sequence="2500" InstallExecuteSequence="yes" />
69 <action name="UnregisterMIMEInfo" sequence="3000" InstallExecuteSequence="yes" />
70 <action name="UnregisterProgIdInfo" sequence="2900" InstallExecuteSequence="yes" />
71 <action name="UnregisterTypeLibraries" sequence="2300" InstallExecuteSequence="yes" />
72 <action name="ValidateProductID" sequence="700" InstallExecuteSequence="yes" InstallUISequence="yes" />
73 <action name="WriteEnvironmentStrings" sequence="5200" InstallExecuteSequence="yes" />
74 <action name="WriteIniValues" sequence="5100" InstallExecuteSequence="yes" />
75 <action name="WriteRegistryValues" sequence="5000" InstallExecuteSequence="yes" />
76</actions>
diff --git a/src/WixToolset.Core.WindowsInstaller/Data/tables.xml b/src/WixToolset.Core.WindowsInstaller/Data/tables.xml
new file mode 100644
index 00000000..e4b5e954
--- /dev/null
+++ b/src/WixToolset.Core.WindowsInstaller/Data/tables.xml
@@ -0,0 +1,1962 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<tableDefinitions xmlns="http://wixtoolset.org/schemas/v4/wi/tables">
6 <tableDefinition name="ActionText">
7 <columnDefinition name="Action" type="string" length="72" primaryKey="yes" modularize="column"
8 category="identifier" description="Name of action to be described."/>
9 <columnDefinition name="Description" type="localized" length="0" nullable="yes" escapeIdtCharacters="yes"
10 category="text" description="Localized description displayed in progress dialog and log when action is executing."/>
11 <columnDefinition name="Template" type="localized" length="0" nullable="yes" escapeIdtCharacters="yes" modularize="property"
12 category="template" description="Optional localized format template used to format action data records for display during action execution."/>
13 </tableDefinition>
14 <tableDefinition name="AdminExecuteSequence">
15 <columnDefinition name="Action" type="string" length="72" primaryKey="yes"
16 category="identifier" description="Name of action to invoke, either in the engine or the handler DLL."/>
17 <columnDefinition name="Condition" type="string" length="255" nullable="yes" localizable="yes"
18 category="condition" description="Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData."/>
19 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
20 minValue="-4" maxValue="32767" description="Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action."/>
21 </tableDefinition>
22 <tableDefinition name="Condition">
23 <columnDefinition name="Feature_" type="string" length="38" primaryKey="yes"
24 keyTable="Feature" keyColumn="1" category="identifier" description="Reference to a Feature entry in Feature table."/>
25 <columnDefinition name="Level" type="number" length="2" primaryKey="yes"
26 minValue="0" maxValue="32767" description="New selection Level to set in Feature table if Condition evaluates to TRUE."/>
27 <columnDefinition name="Condition" type="string" length="255" nullable="yes" localizable="yes"
28 category="condition" description="Expression evaluated to determine if Level in the Feature table is to change."/>
29 </tableDefinition>
30 <tableDefinition name="AdminUISequence">
31 <columnDefinition name="Action" type="string" length="72" primaryKey="yes"
32 category="identifier" description="Name of action to invoke, either in the engine or the handler DLL."/>
33 <columnDefinition name="Condition" type="string" length="255" nullable="yes" localizable="yes"
34 category="condition" description="Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData."/>
35 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
36 minValue="-4" maxValue="32767" description="Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action."/>
37 </tableDefinition>
38 <tableDefinition name="AdvtExecuteSequence">
39 <columnDefinition name="Action" type="string" length="72" primaryKey="yes"
40 category="identifier" description="Name of action to invoke, either in the engine or the handler DLL."/>
41 <columnDefinition name="Condition" type="string" length="255" nullable="yes" localizable="yes"
42 category="condition" description="Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData."/>
43 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
44 minValue="-4" maxValue="32767" description="Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action."/>
45 </tableDefinition>
46 <tableDefinition name="AdvtUISequence">
47 <columnDefinition name="Action" type="string" length="72" primaryKey="yes"
48 category="identifier" description="Name of action to invoke, either in the engine or the handler DLL."/>
49 <columnDefinition name="Condition" type="string" length="255" nullable="yes" localizable="yes"
50 category="condition" description="Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData."/>
51 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
52 minValue="-4" maxValue="32767" description="Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action."/>
53 </tableDefinition>
54 <tableDefinition name="AppId" createSymbols="yes">
55 <columnDefinition name="AppId" type="string" length="38" primaryKey="yes"
56 category="guid"/>
57 <columnDefinition name="RemoteServerName" type="string" length="255" nullable="yes" modularize="property"
58 category="formatted"/>
59 <columnDefinition name="LocalService" type="string" length="255" nullable="yes"
60 category="text"/>
61 <columnDefinition name="ServiceParameters" type="string" length="255" nullable="yes"
62 category="text"/>
63 <columnDefinition name="DllSurrogate" type="string" length="255" nullable="yes"
64 category="text"/>
65 <columnDefinition name="ActivateAtStorage" type="number" length="2" nullable="yes"
66 minValue="0" maxValue="1"/>
67 <columnDefinition name="RunAsInteractiveUser" type="number" length="2" nullable="yes"
68 minValue="0" maxValue="1"/>
69 </tableDefinition>
70 <tableDefinition name="AppSearch">
71 <columnDefinition name="Property" type="string" length="72" primaryKey="yes" modularize="column"
72 category="identifier" description="The property associated with a Signature"/>
73 <columnDefinition name="Signature_" type="string" length="72" primaryKey="yes" modularize="column"
74 keyTable="Signature;RegLocator;IniLocator;DrLocator;CompLocator" keyColumn="1" category="identifier" description="The Signature_ represents a unique file signature and is also the foreign key in the Signature, RegLocator, IniLocator, CompLocator and the DrLocator tables."/>
75 </tableDefinition>
76 <tableDefinition name="Property" createSymbols="yes">
77 <columnDefinition name="Property" type="string" length="72" primaryKey="yes" modularize="column"
78 category="identifier" description="Name of property, uppercase if settable by launcher or loader."/>
79 <columnDefinition name="Value" type="localized" length="0" escapeIdtCharacters="yes"
80 category="text" description="String value for property. Never null or empty."/>
81 </tableDefinition>
82 <tableDefinition name="BBControl" createSymbols="yes">
83 <columnDefinition name="Billboard_" type="string" length="50" primaryKey="yes" modularize="column"
84 keyTable="Billboard" keyColumn="1" category="identifier" description="External key to the Billboard table, name of the billboard."/>
85 <columnDefinition name="BBControl" type="string" length="50" primaryKey="yes"
86 category="identifier" description="Name of the control. This name must be unique within a billboard, but can repeat on different billboard."/>
87 <columnDefinition name="Type" type="string" length="50"
88 category="identifier" description="The type of the control."/>
89 <columnDefinition name="X" type="number" length="2" localizable="yes"
90 minValue="0" maxValue="32767" description="Horizontal coordinate of the upper left corner of the bounding rectangle of the control."/>
91 <columnDefinition name="Y" type="number" length="2" localizable="yes"
92 minValue="0" maxValue="32767" description="Vertical coordinate of the upper left corner of the bounding rectangle of the control."/>
93 <columnDefinition name="Width" type="number" length="2" localizable="yes"
94 minValue="0" maxValue="32767" description="Width of the bounding rectangle of the control."/>
95 <columnDefinition name="Height" type="number" length="2" localizable="yes"
96 minValue="0" maxValue="32767" description="Height of the bounding rectangle of the control."/>
97 <columnDefinition name="Attributes" type="number" length="4" nullable="yes"
98 minValue="0" maxValue="2147483647" description="A 32-bit word that specifies the attribute flags to be applied to this control."/>
99 <columnDefinition name="Text" type="localized" length="50" nullable="yes" escapeIdtCharacters="yes"
100 category="text" description="A string used to set the initial text contained within a control (if appropriate)."/>
101 </tableDefinition>
102 <tableDefinition name="Billboard" createSymbols="yes">
103 <columnDefinition name="Billboard" type="string" length="50" primaryKey="yes" modularize="column"
104 category="identifier" description="Name of the billboard."/>
105 <columnDefinition name="Feature_" type="string" length="38"
106 keyTable="Feature" keyColumn="1" category="identifier" description="An external key to the Feature Table. The billboard is shown only if this feature is being installed."/>
107 <columnDefinition name="Action" type="string" length="50" nullable="yes"
108 category="identifier" description="The name of an action. The billboard is displayed during the progress messages received from this action."/>
109 <columnDefinition name="Ordering" type="number" length="2" nullable="yes"
110 minValue="0" maxValue="32767" description="A positive integer. If there is more than one billboard corresponding to an action they will be shown in the order defined by this column."/>
111 </tableDefinition>
112 <tableDefinition name="Feature" createSymbols="yes">
113 <columnDefinition name="Feature" type="string" length="38" primaryKey="yes"
114 category="identifier" description="Primary key used to identify a particular feature record."/>
115 <columnDefinition name="Feature_Parent" type="string" length="38" nullable="yes"
116 keyTable="Feature" keyColumn="1" category="identifier" description="Optional key of a parent record in the same table. If the parent is not selected, then the record will not be installed. Null indicates a root item."/>
117 <columnDefinition name="Title" type="localized" length="64" nullable="yes" escapeIdtCharacters="yes"
118 category="text" description="Short text identifying a visible feature item."/>
119 <columnDefinition name="Description" type="localized" length="255" nullable="yes" escapeIdtCharacters="yes"
120 category="text" description="Longer descriptive text describing a visible feature item."/>
121 <columnDefinition name="Display" type="number" length="2" nullable="yes"
122 minValue="0" maxValue="32767" description="Numeric sort order, used to force a specific display ordering."/>
123 <columnDefinition name="Level" type="number" length="2"
124 minValue="0" maxValue="32767" description="The install level at which record will be initially selected. An install level of 0 will disable an item and prevent its display."/>
125 <columnDefinition name="Directory_" type="string" length="72" nullable="yes" modularize="column"
126 keyTable="Directory" keyColumn="1" category="upperCase" description="The name of the Directory that can be configured by the UI. A non-null value will enable the browse button."/>
127 <columnDefinition name="Attributes" type="number" length="2"
128 set="0;1;2;4;5;6;8;9;10;16;17;18;20;21;22;24;25;26;32;33;34;36;37;38;48;49;50;52;53;54" description="Feature attributes"/>
129 </tableDefinition>
130 <tableDefinition name="Binary" createSymbols="yes">
131 <columnDefinition name="Name" type="string" length="72" primaryKey="yes" modularize="column"
132 category="identifier" description="Unique key identifying the binary data."/>
133 <columnDefinition name="Data" type="object" length="0"
134 category="binary" description="The unformatted binary data."/>
135 </tableDefinition>
136 <tableDefinition name="BindImage">
137 <columnDefinition name="File_" type="string" length="72" primaryKey="yes" modularize="column"
138 keyTable="File" keyColumn="1" category="identifier" description="The index into the File table. This must be an executable file."/>
139 <columnDefinition name="Path" type="string" length="255" nullable="yes" modularize="property"
140 category="paths" description="A list of ; delimited paths that represent the paths to be searched for the import DLLS. The list is usually a list of properties each enclosed within square brackets [] ."/>
141 </tableDefinition>
142 <tableDefinition name="File" createSymbols="yes">
143 <columnDefinition name="File" type="string" length="72" primaryKey="yes" modularize="column"
144 category="identifier" description="Primary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored."/>
145 <columnDefinition name="Component_" type="string" length="72" modularize="column"
146 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key referencing Component that controls the file."/>
147 <columnDefinition name="FileName" type="localized" length="255"
148 category="filename" description="File name used for installation, may be localized. This may contain a &quot;short name|long name&quot; pair."/>
149 <columnDefinition name="FileSize" type="number" length="4"
150 minValue="0" maxValue="2147483647" description="Size of file in bytes (long integer)."/>
151 <columnDefinition name="Version" type="string" length="72" nullable="yes" modularize="companionFile"
152 keyTable="File" keyColumn="1" category="version" description="Version string for versioned files; Blank for unversioned files."/>
153 <columnDefinition name="Language" type="string" length="20" nullable="yes"
154 category="language" description="List of decimal language Ids, comma-separated if more than one."/>
155 <columnDefinition name="Attributes" type="number" length="2" nullable="yes"
156 minValue="0" maxValue="32767" description="Integer containing bit flags representing file attributes (with the decimal value of each bit position in parentheses)"/>
157 <columnDefinition name="Sequence" type="number" length="4"
158 minValue="1" maxValue="2147483647" description="Sequence with respect to the media images; order must track cabinet order."/>
159 </tableDefinition>
160 <tableDefinition name="CCPSearch">
161 <columnDefinition name="Signature_" type="string" length="72" primaryKey="yes"
162 keyTable="Signature;RegLocator;IniLocator;DrLocator;CompLocator" keyColumn="1" category="identifier" description="The Signature_ represents a unique file signature and is also the foreign key in the Signature, RegLocator, IniLocator, CompLocator and the DrLocator tables."/>
163 </tableDefinition>
164 <tableDefinition name="CheckBox" createSymbols="yes">
165 <columnDefinition name="Property" type="string" length="72" primaryKey="yes" modularize="column"
166 category="identifier" description="A named property to be tied to the item."/>
167 <columnDefinition name="Value" type="string" length="64" nullable="yes" modularize="property"
168 category="formatted" description="The value string associated with the item."/>
169 </tableDefinition>
170 <tableDefinition name="Class" createSymbols="yes">
171 <columnDefinition name="CLSID" type="string" length="38" primaryKey="yes"
172 category="guid" description="The CLSID of an OLE factory."/>
173 <columnDefinition name="Context" type="string" length="32" primaryKey="yes"
174 category="identifier" description="The numeric server context for this server. CLSCTX_xxxx"/>
175 <columnDefinition name="Component_" type="string" length="72" primaryKey="yes" modularize="column"
176 keyTable="Component" keyColumn="1" category="identifier" description="Required foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent."/>
177 <columnDefinition name="ProgId_Default" type="string" length="255" nullable="yes"
178 keyTable="ProgId" keyColumn="1" category="text" description="Optional ProgId associated with this CLSID."/>
179 <columnDefinition name="Description" type="localized" length="255" nullable="yes" escapeIdtCharacters="yes"
180 category="text" description="Localized description for the Class."/>
181 <columnDefinition name="AppId_" type="string" length="38" nullable="yes"
182 keyTable="AppId" keyColumn="1" category="guid" description="Optional AppID containing DCOM information for associated application (string GUID)."/>
183 <columnDefinition name="FileTypeMask" type="string" length="255" nullable="yes"
184 category="text" description="Optional string containing information for the HKCRthis CLSID) key. If multiple patterns exist, they must be delimited by a semicolon, and numeric subkeys will be generated: 0,1,2..."/>
185 <columnDefinition name="Icon_" type="string" length="72" nullable="yes" modularize="icon"
186 keyTable="Icon" keyColumn="1" category="identifier" description="Optional foreign key into the Icon Table, specifying the icon file associated with this CLSID. Will be written under the DefaultIcon key."/>
187 <columnDefinition name="IconIndex" type="number" length="2" nullable="yes"
188 minValue="-32767" maxValue="32767" description="Optional icon index."/>
189 <columnDefinition name="DefInprocHandler" type="string" length="32" nullable="yes"
190 category="filename" set="1;2;3" description="Optional default inproc handler. Only optionally provided if Context=CLSCTX_LOCAL_SERVER. Typically &quot;ole32.dll&quot; or &quot;mapi32.dll&quot;"/>
191 <columnDefinition name="Argument" type="string" length="255" nullable="yes"
192 category="formatted" description="optional argument for LocalServers."/>
193 <columnDefinition name="Feature_" type="string" length="38"
194 keyTable="Feature" keyColumn="1" category="identifier" description="Required foreign key into the Feature Table, specifying the feature to validate or install in order for the CLSID factory to be operational."/>
195 <columnDefinition name="Attributes" type="number" length="2" nullable="yes"
196 maxValue="32767" description="Class registration attributes."/>
197 </tableDefinition>
198 <tableDefinition name="Component" createSymbols="yes">
199 <columnDefinition name="Component" type="string" length="72" primaryKey="yes" modularize="column"
200 category="identifier" description="Primary key used to identify a particular component record."/>
201 <columnDefinition name="ComponentId" type="string" length="38" nullable="yes"
202 category="guid" description="A string GUID unique to this component, version, and language."/>
203 <columnDefinition name="Directory_" type="string" length="72" modularize="column"
204 keyTable="Directory" keyColumn="1" category="identifier" description="Required key of a Directory table record. This is actually a property name whose value contains the actual path, set either by the AppSearch action or with the default setting obtained from the Directory table."/>
205 <columnDefinition name="Attributes" type="number" length="2"
206 description="Remote execution option, one of irsEnum"/>
207 <columnDefinition name="Condition" type="string" length="255" nullable="yes" modularize="condition" localizable="yes"
208 category="condition" description="A conditional statement that will disable this component if the specified condition evaluates to the 'True' state. If a component is disabled, it will not be installed, regardless of the 'Action' state associated with the component."/>
209 <columnDefinition name="KeyPath" type="string" length="72" nullable="yes" modularize="column"
210 keyTable="File;Registry;ODBCDataSource" keyColumn="1" category="identifier" description="Either the primary key into the File table, Registry table, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it."/>
211 </tableDefinition>
212 <tableDefinition name="Icon" createSymbols="yes">
213 <columnDefinition name="Name" type="string" length="72" primaryKey="yes" modularize="icon"
214 category="identifier" description="Primary key. Name of the icon file."/>
215 <columnDefinition name="Data" type="object" length="0"
216 category="binary" description="Binary stream. The binary icon data in PE (.DLL or .EXE) or icon (.ICO) format."/>
217 </tableDefinition>
218 <tableDefinition name="ProgId">
219 <columnDefinition name="ProgId" type="string" length="255" primaryKey="yes"
220 category="text" description="The Program Identifier. Primary key."/>
221 <columnDefinition name="ProgId_Parent" type="string" length="255" nullable="yes"
222 keyTable="ProgId" keyColumn="1" category="text" description="The Parent Program Identifier. If specified, the ProgId column becomes a version independent prog id."/>
223 <columnDefinition name="Class_" type="string" length="38" nullable="yes"
224 keyTable="Class" keyColumn="1" category="guid" description="The CLSID of an OLE factory corresponding to the ProgId."/>
225 <columnDefinition name="Description" type="localized" length="255" nullable="yes" escapeIdtCharacters="yes"
226 category="text" description="Localized description for the Program identifier."/>
227 <columnDefinition name="Icon_" type="string" length="72" nullable="yes" modularize="icon"
228 keyTable="Icon" keyColumn="1" category="identifier" description="Optional foreign key into the Icon Table, specifying the icon file associated with this ProgId. Will be written under the DefaultIcon key."/>
229 <columnDefinition name="IconIndex" type="number" length="2" nullable="yes"
230 minValue="-32767" maxValue="32767" description="Optional icon index."/>
231 </tableDefinition>
232 <tableDefinition name="ComboBox">
233 <columnDefinition name="Property" type="string" length="72" primaryKey="yes" modularize="column"
234 category="identifier" description="A named property to be tied to this item. All the items tied to the same property become part of the same combobox."/>
235 <columnDefinition name="Order" type="number" length="2" primaryKey="yes"
236 minValue="1" maxValue="32767" description="A positive integer used to determine the ordering of the items within one list. The integers do not have to be consecutive."/>
237 <columnDefinition name="Value" type="string" length="64" modularize="property" localizable="yes"
238 category="formatted" description="The value string associated with this item. Selecting the line will set the associated property to this value."/>
239 <columnDefinition name="Text" type="localized" length="64" nullable="yes" modularize="property" escapeIdtCharacters="yes"
240 category="formatted" description="The visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value."/>
241 </tableDefinition>
242 <tableDefinition name="CompLocator">
243 <columnDefinition name="Signature_" type="string" length="72" primaryKey="yes" modularize="column"
244 category="identifier" description="The table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table."/>
245 <columnDefinition name="ComponentId" type="string" length="38"
246 category="guid" description="A string GUID unique to this component, version, and language."/>
247 <columnDefinition name="Type" type="number" length="2" nullable="yes"
248 minValue="0" maxValue="1" description="A boolean value that determines if the registry value is a filename or a directory location."/>
249 </tableDefinition>
250 <tableDefinition name="Complus">
251 <columnDefinition name="Component_" type="string" length="72" primaryKey="yes" modularize="column"
252 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key referencing Component that controls the ComPlus component."/>
253 <columnDefinition name="ExpType" type="number" length="2" nullable="yes"
254 minValue="0" maxValue="32767" description="ComPlus component attributes."/>
255 </tableDefinition>
256 <tableDefinition name="Directory" createSymbols="yes">
257 <columnDefinition name="Directory" type="string" length="72" primaryKey="yes" modularize="column"
258 category="identifier" description="Unique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory."/>
259 <columnDefinition name="Directory_Parent" type="string" length="72" nullable="yes" modularize="column"
260 keyTable="Directory" keyColumn="1" category="identifier" description="Reference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree."/>
261 <columnDefinition name="DefaultDir" type="localized" length="255"
262 category="defaultDir" description="The default sub-path under parent's path."/>
263 </tableDefinition>
264 <tableDefinition name="Control">
265 <columnDefinition name="Dialog_" type="string" length="72" primaryKey="yes" modularize="column"
266 keyTable="Dialog" keyColumn="1" category="identifier" description="External key to the Dialog table, name of the dialog."/>
267 <columnDefinition name="Control" type="string" length="50" primaryKey="yes"
268 category="identifier" description="Name of the control. This name must be unique within a dialog, but can repeat on different dialogs. "/>
269 <columnDefinition name="Type" type="string" length="20"
270 category="identifier" description="The type of the control."/>
271 <columnDefinition name="X" type="number" length="2" localizable="yes"
272 minValue="0" maxValue="32767" description="Horizontal coordinate of the upper left corner of the bounding rectangle of the control."/>
273 <columnDefinition name="Y" type="number" length="2" localizable="yes"
274 minValue="0" maxValue="32767" description="Vertical coordinate of the upper left corner of the bounding rectangle of the control."/>
275 <columnDefinition name="Width" type="number" length="2" localizable="yes"
276 minValue="0" maxValue="32767" description="Width of the bounding rectangle of the control."/>
277 <columnDefinition name="Height" type="number" length="2" localizable="yes"
278 minValue="0" maxValue="32767" description="Height of the bounding rectangle of the control."/>
279 <columnDefinition name="Attributes" type="number" length="4" nullable="yes"
280 minValue="0" maxValue="2147483647" description="A 32-bit word that specifies the attribute flags to be applied to this control."/>
281 <columnDefinition name="Property" type="string" length="72" nullable="yes" modularize="column"
282 category="identifier" description="The name of a defined property to be linked to this control. "/>
283 <columnDefinition name="Text" type="localized" length="0" nullable="yes" modularize="controlText" escapeIdtCharacters="yes"
284 category="formatted" description="A string used to set the initial text contained within a control (if appropriate)."/>
285 <columnDefinition name="Control_Next" type="string" length="50" nullable="yes"
286 keyTable="Control" keyColumn="2" category="identifier" description="The name of an other control on the same dialog. This link defines the tab order of the controls. The links have to form one or more cycles!"/>
287 <columnDefinition name="Help" type="localized" length="50" nullable="yes" escapeIdtCharacters="yes"
288 category="text" description="The help strings used with the button. The text is optional. "/>
289 </tableDefinition>
290 <tableDefinition name="Dialog" createSymbols="yes">
291 <columnDefinition name="Dialog" type="string" length="72" primaryKey="yes" modularize="column"
292 category="identifier" description="Name of the dialog."/>
293 <columnDefinition name="HCentering" type="number" length="2"
294 minValue="0" maxValue="100" description="Horizontal position of the dialog on a 0-100 scale. 0 means left end, 100 means right end of the screen, 50 center."/>
295 <columnDefinition name="VCentering" type="number" length="2"
296 minValue="0" maxValue="100" description="Vertical position of the dialog on a 0-100 scale. 0 means top end, 100 means bottom end of the screen, 50 center."/>
297 <columnDefinition name="Width" type="number" length="2"
298 minValue="0" maxValue="32767" description="Width of the bounding rectangle of the dialog."/>
299 <columnDefinition name="Height" type="number" length="2"
300 minValue="0" maxValue="32767" description="Height of the bounding rectangle of the dialog."/>
301 <columnDefinition name="Attributes" type="number" length="4" nullable="yes"
302 minValue="0" maxValue="2147483647" description="A 32-bit word that specifies the attribute flags to be applied to this dialog."/>
303 <columnDefinition name="Title" type="localized" length="128" nullable="yes" modularize="property" escapeIdtCharacters="yes"
304 category="formatted" description="A text string specifying the title to be displayed in the title bar of the dialog's window."/>
305 <columnDefinition name="Control_First" type="string" length="50"
306 keyTable="Control" keyColumn="2" category="identifier" description="Defines the control that has the focus when the dialog is created."/>
307 <columnDefinition name="Control_Default" type="string" length="50" nullable="yes"
308 keyTable="Control" keyColumn="2" category="identifier" description="Defines the default control. Hitting return is equivalent to pushing this button."/>
309 <columnDefinition name="Control_Cancel" type="string" length="50" nullable="yes"
310 keyTable="Control" keyColumn="2" category="identifier" description="Defines the cancel control. Hitting escape or clicking on the close icon on the dialog is equivalent to pushing this button."/>
311 </tableDefinition>
312 <tableDefinition name="ControlCondition">
313 <columnDefinition name="Dialog_" type="string" length="72" primaryKey="yes" modularize="column"
314 keyTable="Dialog" keyColumn="1" category="identifier" description="A foreign key to the Dialog table, name of the dialog."/>
315 <columnDefinition name="Control_" type="string" length="50" primaryKey="yes"
316 keyTable="Control" keyColumn="2" category="identifier" description="A foreign key to the Control table, name of the control."/>
317 <columnDefinition name="Action" type="string" length="50" primaryKey="yes"
318 set="Default;Disable;Enable;Hide;Show" description="The desired action to be taken on the specified control."/>
319 <columnDefinition name="Condition" type="string" length="255" primaryKey="yes" modularize="condition" localizable="yes"
320 category="condition" description="A standard conditional statement that specifies under which conditions the action should be triggered."/>
321 </tableDefinition>
322 <tableDefinition name="ControlEvent" createSymbols="yes">
323 <columnDefinition name="Dialog_" type="string" length="72" primaryKey="yes" modularize="column"
324 keyTable="Dialog" keyColumn="1" category="identifier" description="A foreign key to the Dialog table, name of the dialog."/>
325 <columnDefinition name="Control_" type="string" length="50" primaryKey="yes"
326 keyTable="Control" keyColumn="2" category="identifier" description="A foreign key to the Control table, name of the control"/>
327 <columnDefinition name="Event" type="string" length="50" primaryKey="yes" modularize="property"
328 category="formatted" description="An identifier that specifies the type of the event that should take place when the user interacts with control specified by the first two entries."/>
329 <columnDefinition name="Argument" type="string" length="255" primaryKey="yes" modularize="controlEventArgument" localizable="yes"
330 category="formatted" description="A value to be used as a modifier when triggering a particular event."/>
331 <columnDefinition name="Condition" type="string" length="255" primaryKey="yes" nullable="yes" modularize="condition" localizable="yes"
332 category="condition" description="A standard conditional statement that specifies under which conditions an event should be triggered."/>
333 <columnDefinition name="Ordering" type="number" length="2" nullable="yes"
334 minValue="0" maxValue="2147483647" description="An integer used to order several events tied to the same control. Can be left blank."/>
335 </tableDefinition>
336 <tableDefinition name="CreateFolder">
337 <columnDefinition name="Directory_" type="string" length="72" primaryKey="yes" modularize="column"
338 keyTable="Directory" keyColumn="1" category="identifier" description="Primary key, could be foreign key into the Directory table."/>
339 <columnDefinition name="Component_" type="string" length="72" primaryKey="yes" modularize="column"
340 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key into the Component table."/>
341 </tableDefinition>
342 <tableDefinition name="CustomAction" createSymbols="yes">
343 <columnDefinition name="Action" type="string" length="72" primaryKey="yes" modularize="column"
344 category="identifier" description="Primary key, name of action, normally appears in sequence table unless private use."/>
345 <columnDefinition name="Type" type="number" length="2"
346 minValue="1" maxValue="32767" description="The numeric custom action type, consisting of source location, code type, entry, option flags."/>
347 <columnDefinition name="Source" type="string" length="72" nullable="yes" modularize="column"
348 category="customSource" description="The table reference of the source of the code."/>
349 <columnDefinition name="Target" type="string" length="255" nullable="yes" modularize="property" escapeIdtCharacters="yes" localizable="yes"
350 category="formatted" description="Excecution parameter, depends on the type of custom action"/>
351 <columnDefinition name="ExtendedType" type="number" length="4" nullable="yes" minValue="0" maxValue="2147483647"
352 description="A numeric custom action type that extends code type or option flags of the Type column."/>
353 </tableDefinition>
354 <tableDefinition name="DrLocator" createSymbols="yes">
355 <columnDefinition name="Signature_" type="string" length="72" primaryKey="yes" modularize="column"
356 category="identifier" description="The Signature_ represents a unique file signature and is also the foreign key in the Signature table."/>
357 <columnDefinition name="Parent" type="string" length="72" primaryKey="yes" nullable="yes" modularize="column"
358 category="identifier" description="The parent file signature. It is also a foreign key in the Signature table. If null and the Path column does not expand to a full path, then all the fixed drives of the user system are searched using the Path."/>
359 <columnDefinition name="Path" type="string" length="255" primaryKey="yes" nullable="yes" modularize="property"
360 category="anyPath" description="The path on the user system. This is a either a subpath below the value of the Parent or a full path. The path may contain properties enclosed within [ ] that will be expanded."/>
361 <columnDefinition name="Depth" type="number" length="2" nullable="yes"
362 minValue="0" maxValue="32767" description="The depth below the path to which the Signature_ is recursively searched. If absent, the depth is assumed to be 0."/>
363 </tableDefinition>
364 <tableDefinition name="DuplicateFile">
365 <columnDefinition name="FileKey" type="string" length="72" primaryKey="yes" modularize="column"
366 category="identifier" description="Primary key used to identify a particular file entry"/>
367 <columnDefinition name="Component_" type="string" length="72" modularize="column"
368 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key referencing Component that controls the duplicate file."/>
369 <columnDefinition name="File_" type="string" length="72" modularize="column"
370 keyTable="File" keyColumn="1" category="identifier" description="Foreign key referencing the source file to be duplicated."/>
371 <columnDefinition name="DestName" type="localized" length="255" nullable="yes"
372 category="filename" description="Filename to be given to the duplicate file."/>
373 <columnDefinition name="DestFolder" type="string" length="72" nullable="yes" modularize="column"
374 category="identifier" description="Name of a property whose value is assumed to resolve to the full pathname to a destination folder."/>
375 </tableDefinition>
376 <tableDefinition name="Environment">
377 <columnDefinition name="Environment" type="string" length="72" primaryKey="yes" modularize="column"
378 category="identifier" description="Unique identifier for the environmental variable setting"/>
379 <columnDefinition name="Name" type="localized" length="255"
380 category="text" description="The name of the environmental value."/>
381 <columnDefinition name="Value" type="localized" length="255" nullable="yes" modularize="property"
382 category="formatted" description="The value to set in the environmental settings."/>
383 <columnDefinition name="Component_" type="string" length="72" modularize="column"
384 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key into the Component table referencing component that controls the installing of the environmental value."/>
385 </tableDefinition>
386 <tableDefinition name="Error" createSymbols="yes">
387 <columnDefinition name="Error" type="number" length="2" primaryKey="yes"
388 minValue="0" maxValue="32767" description="Integer error number, obtained from header file IError(...) macros."/>
389 <columnDefinition name="Message" type="localized" length="0" nullable="yes" escapeIdtCharacters="yes" useCData="yes" modularize="property"
390 category="template" description="Error formatting template, obtained from user ed. or localizers."/>
391 </tableDefinition>
392 <tableDefinition name="EventMapping">
393 <columnDefinition name="Dialog_" type="string" length="72" primaryKey="yes" modularize="column"
394 keyTable="Dialog" keyColumn="1" category="identifier" description="A foreign key to the Dialog table, name of the Dialog."/>
395 <columnDefinition name="Control_" type="string" length="50" primaryKey="yes"
396 keyTable="Control" keyColumn="2" category="identifier" description="A foreign key to the Control table, name of the control."/>
397 <columnDefinition name="Event" type="string" length="50" primaryKey="yes"
398 category="identifier" description="An identifier that specifies the type of the event that the control subscribes to."/>
399 <columnDefinition name="Attribute" type="string" length="50"
400 category="identifier" description="The name of the control attribute, that is set when this event is received."/>
401 </tableDefinition>
402 <tableDefinition name="Extension">
403 <columnDefinition name="Extension" type="string" length="255" primaryKey="yes"
404 category="text" description="The extension associated with the table row."/>
405 <columnDefinition name="Component_" type="string" length="72" primaryKey="yes" modularize="column"
406 keyTable="Component" keyColumn="1" category="identifier" description="Required foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent."/>
407 <columnDefinition name="ProgId_" type="string" length="255" nullable="yes"
408 keyTable="ProgId" keyColumn="1" category="text" description="Optional ProgId associated with this extension."/>
409 <columnDefinition name="MIME_" type="string" length="64" nullable="yes"
410 keyTable="MIME" keyColumn="1" category="text" description="Optional Context identifier, typically &quot;type/format&quot; associated with the extension"/>
411 <columnDefinition name="Feature_" type="string" length="38"
412 keyTable="Feature" keyColumn="1" category="identifier" description="Required foreign key into the Feature Table, specifying the feature to validate or install in order for the CLSID factory to be operational."/>
413 </tableDefinition>
414 <tableDefinition name="MIME">
415 <columnDefinition name="ContentType" type="string" length="64" primaryKey="yes"
416 category="text" description="Primary key. Context identifier, typically &quot;type/format&quot;."/>
417 <columnDefinition name="Extension_" type="string" length="255"
418 keyTable="Extension" keyColumn="1" category="text" description="Optional associated extension (without dot)"/>
419 <columnDefinition name="CLSID" type="string" length="38" nullable="yes"
420 category="guid" description="Optional associated CLSID."/>
421 </tableDefinition>
422 <tableDefinition name="FeatureComponents">
423 <columnDefinition name="Feature_" type="string" length="38" primaryKey="yes"
424 keyTable="Feature" keyColumn="1" category="identifier" description="Foreign key into Feature table."/>
425 <columnDefinition name="Component_" type="string" length="72" primaryKey="yes" modularize="column"
426 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key into Component table."/>
427 </tableDefinition>
428 <tableDefinition name="FileSFPCatalog">
429 <columnDefinition name="File_" type="string" length="72" primaryKey="yes" modularize="column"
430 keyTable="File" keyColumn="1" category="identifier" description="File associated with the catalog"/>
431 <columnDefinition name="SFPCatalog_" type="string" length="255" primaryKey="yes"
432 keyTable="SFPCatalog" keyColumn="1" category="filename" description="Catalog associated with the file"/>
433 </tableDefinition>
434 <tableDefinition name="SFPCatalog">
435 <columnDefinition name="SFPCatalog" type="string" length="255" primaryKey="yes"
436 category="filename" description="File name for the catalog."/>
437 <columnDefinition name="Catalog" type="object" length="0"
438 category="binary" description="SFP Catalog"/>
439 <columnDefinition name="Dependency" type="string" length="0" nullable="yes" modularize="property"
440 category="formatted" description="Parent catalog - only used by SFP"/>
441 </tableDefinition>
442 <tableDefinition name="Font">
443 <columnDefinition name="File_" type="string" length="72" primaryKey="yes" modularize="column"
444 keyTable="File" keyColumn="1" category="identifier" description="Primary key, foreign key into File table referencing font file."/>
445 <columnDefinition name="FontTitle" type="string" length="128" nullable="yes"
446 category="text" description="Font name."/>
447 </tableDefinition>
448 <tableDefinition name="IniFile">
449 <columnDefinition name="IniFile" type="string" length="72" primaryKey="yes" modularize="column"
450 category="identifier" description="Primary key, non-localized token."/>
451 <columnDefinition name="FileName" type="localized" length="255"
452 category="filename" description="The .INI file name in which to write the information"/>
453 <columnDefinition name="DirProperty" type="string" length="72" nullable="yes" modularize="column"
454 category="identifier" description="Foreign key into the Directory table denoting the directory where the .INI file is."/>
455 <columnDefinition name="Section" type="localized" length="96" modularize="property"
456 category="formatted" description="The .INI file Section."/>
457 <columnDefinition name="Key" type="localized" length="128" modularize="property"
458 category="formatted" description="The .INI file key below Section."/>
459 <columnDefinition name="Value" type="localized" length="255" modularize="property" escapeIdtCharacters="yes"
460 category="formatted" description="The value to be written."/>
461 <columnDefinition name="Action" type="number" length="2"
462 set="0;1;3" description="The type of modification to be made, one of iifEnum"/>
463 <columnDefinition name="Component_" type="string" length="72" modularize="column"
464 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key into the Component table referencing component that controls the installing of the .INI value."/>
465 </tableDefinition>
466 <tableDefinition name="IniLocator">
467 <columnDefinition name="Signature_" type="string" length="72" primaryKey="yes" modularize="column"
468 category="identifier" description="The table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table."/>
469 <columnDefinition name="FileName" type="string" length="255"
470 category="filename" description="The .INI file name."/>
471 <columnDefinition name="Section" type="string" length="96"
472 category="text" description="Section name within in file (within square brackets in INI file)."/>
473 <columnDefinition name="Key" type="string" length="128"
474 category="text" description="Key value (followed by an equals sign in INI file)."/>
475 <columnDefinition name="Field" type="number" length="2" nullable="yes"
476 minValue="0" maxValue="32767" description="The field in the .INI line. If Field is null or 0 the entire line is read."/>
477 <columnDefinition name="Type" type="number" length="2" nullable="yes"
478 minValue="0" maxValue="2" description="An integer value that determines if the .INI value read is a filename or a directory location or to be used as is w/o interpretation."/>
479 </tableDefinition>
480 <tableDefinition name="InstallExecuteSequence">
481 <columnDefinition name="Action" type="string" length="72" primaryKey="yes"
482 category="identifier" description="Name of action to invoke, either in the engine or the handler DLL."/>
483 <columnDefinition name="Condition" type="string" length="255" nullable="yes" localizable="yes"
484 category="condition" description="Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData."/>
485 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
486 minValue="-4" maxValue="32767" description="Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action."/>
487 </tableDefinition>
488 <tableDefinition name="InstallUISequence">
489 <columnDefinition name="Action" type="string" length="72" primaryKey="yes"
490 category="identifier" description="Name of action to invoke, either in the engine or the handler DLL."/>
491 <columnDefinition name="Condition" type="string" length="255" nullable="yes" localizable="yes"
492 category="condition" description="Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData."/>
493 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
494 minValue="-4" maxValue="32767" description="Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action."/>
495 </tableDefinition>
496 <tableDefinition name="IsolatedComponent">
497 <columnDefinition name="Component_Shared" type="string" length="72" primaryKey="yes" modularize="column"
498 keyTable="Component" keyColumn="1" category="identifier" description="Key to Component table item to be isolated"/>
499 <columnDefinition name="Component_Application" type="string" length="72" primaryKey="yes" modularize="column"
500 keyTable="Component" keyColumn="1" category="identifier" description="Key to Component table item for application"/>
501 </tableDefinition>
502 <tableDefinition name="LaunchCondition">
503 <columnDefinition name="Condition" type="string" length="255" primaryKey="yes" localizable="yes"
504 category="condition" description="Expression which must evaluate to TRUE in order for install to commence."/>
505 <columnDefinition name="Description" type="localized" length="255" escapeIdtCharacters="yes"
506 category="formatted" description="Localizable text to display when condition fails and install must abort."/>
507 </tableDefinition>
508 <tableDefinition name="ListBox">
509 <columnDefinition name="Property" type="string" length="72" primaryKey="yes" modularize="column"
510 category="identifier" description="A named property to be tied to this item. All the items tied to the same property become part of the same listbox."/>
511 <columnDefinition name="Order" type="number" length="2" primaryKey="yes"
512 minValue="1" maxValue="32767" description="A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive."/>
513 <columnDefinition name="Value" type="string" length="64" modularize="property"
514 category="formatted" description="The value string associated with this item. Selecting the line will set the associated property to this value."/>
515 <columnDefinition name="Text" type="localized" length="64" nullable="yes" escapeIdtCharacters="yes"
516 category="text" description="The visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value."/>
517 </tableDefinition>
518 <tableDefinition name="ListView">
519 <columnDefinition name="Property" type="string" length="72" primaryKey="yes" modularize="column"
520 category="identifier" description="A named property to be tied to this item. All the items tied to the same property become part of the same listview."/>
521 <columnDefinition name="Order" type="number" length="2" primaryKey="yes"
522 minValue="1" maxValue="32767" description="A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive."/>
523 <columnDefinition name="Value" type="string" length="64" modularize="property"
524 category="formatted" description="The value string associated with this item. Selecting the line will set the associated property to this value."/>
525 <columnDefinition name="Text" type="localized" length="64" nullable="yes" escapeIdtCharacters="yes" modularize="property"
526 category="formatted" description="The visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value."/>
527 <columnDefinition name="Binary_" type="string" length="72" nullable="yes" modularize="column"
528 keyTable="Binary" keyColumn="1" category="identifier" description="The name of the icon to be displayed with the icon. The binary information is looked up from the Binary Table."/>
529 </tableDefinition>
530 <tableDefinition name="LockPermissions">
531 <columnDefinition name="LockObject" type="string" length="72" primaryKey="yes" modularize="column"
532 category="identifier" description="Foreign key into Registry or File table"/>
533 <columnDefinition name="Table" type="string" length="32" primaryKey="yes"
534 category="identifier" set="Directory;File;Registry" description="Reference to another table name"/>
535 <columnDefinition name="Domain" type="string" length="255" primaryKey="yes" nullable="yes" modularize="property"
536 category="formatted" description="Domain name for user whose permissions are being set. (usually a property)"/>
537 <columnDefinition name="User" type="string" length="255" primaryKey="yes" modularize="property"
538 category="formatted" description="User for permissions to be set. (usually a property)"/>
539 <columnDefinition name="Permission" type="number" length="4" nullable="yes"
540 minValue="-2147483647" maxValue="2147483647" description="Permission Access mask. Full Control = 268435456 (GENERIC_ALL = 0x10000000)"/>
541 </tableDefinition>
542 <tableDefinition name="MsiLockPermissionsEx">
543 <columnDefinition name="MsiLockPermissionsEx" type="string" length="72" primaryKey="yes" modularize="column"
544 category="identifier" description="Primary key, non-localized token"/>
545 <columnDefinition name="LockObject" type="string" length="72" modularize="column"
546 category="identifier" description="Foreign key into Registry, File, CreateFolder, or ServiceInstall table"/>
547 <columnDefinition name="Table" type="string" length="32"
548 category="identifier" set="CreateFolder;File;Registry;ServiceInstall" description="Reference to another table name"/>
549 <columnDefinition name="SDDLText" type="string" length="0" modularize="property"
550 category="formattedSddl" description="String to indicate permissions to be applied to the LockObject"/>
551 <columnDefinition name="Condition" type="string" length="255" modularize="property" nullable="yes"
552 category="formatted" description="Expression which must evaluate to TRUE in order for this set of permissions to be applied"/>
553 </tableDefinition>
554 <tableDefinition name="Media" createSymbols="yes">
555 <columnDefinition name="DiskId" type="number" length="2" primaryKey="yes"
556 minValue="1" maxValue="32767" description="Primary key, integer to determine sort order for table."/>
557 <columnDefinition name="LastSequence" type="number" length="4"
558 minValue="0" maxValue="2147483647" description="File sequence number for the last file for this media."/>
559 <columnDefinition name="DiskPrompt" type="localized" length="64" nullable="yes" escapeIdtCharacters="yes"
560 category="text" description="Disk name: the visible text actually printed on the disk. This will be used to prompt the user when this disk needs to be inserted."/>
561 <columnDefinition name="Cabinet" type="string" length="255" nullable="yes"
562 category="cabinet" description="If some or all of the files stored on the media are compressed in a cabinet, the name of that cabinet."/>
563 <columnDefinition name="VolumeLabel" type="string" length="32" nullable="yes"
564 category="text" description="The label attributed to the volume."/>
565 <columnDefinition name="Source" type="string" length="72" nullable="yes"
566 category="property" description="The property defining the location of the cabinet file."/>
567 </tableDefinition>
568 <tableDefinition name="MoveFile">
569 <columnDefinition name="FileKey" type="string" length="72" primaryKey="yes" modularize="column"
570 category="identifier" description="Primary key that uniquely identifies a particular MoveFile record"/>
571 <columnDefinition name="Component_" type="string" length="72" modularize="column"
572 keyTable="Component" keyColumn="1" category="identifier" description="If this component is not &quot;selected&quot; for installation or removal, no action will be taken on the associated MoveFile entry"/>
573 <columnDefinition name="SourceName" type="localized" length="255" nullable="yes"
574 category="text" description="Name of the source file(s) to be moved or copied. Can contain the '*' or '?' wildcards."/>
575 <columnDefinition name="DestName" type="localized" length="255" nullable="yes"
576 category="filename" description="Name to be given to the original file after it is moved or copied. If blank, the destination file will be given the same name as the source file"/>
577 <columnDefinition name="SourceFolder" type="string" length="72" nullable="yes" modularize="column"
578 category="identifier" description="Name of a property whose value is assumed to resolve to the full path to the source directory"/>
579 <columnDefinition name="DestFolder" type="string" length="72" modularize="column"
580 category="identifier" description="Name of a property whose value is assumed to resolve to the full path to the destination directory"/>
581 <columnDefinition name="Options" type="number" length="2"
582 minValue="0" maxValue="1" description="Integer value specifying the MoveFile operating mode, one of imfoEnum"/>
583 </tableDefinition>
584 <tableDefinition name="MsiAssembly">
585 <columnDefinition name="Component_" type="string" length="72" primaryKey="yes" modularize="column"
586 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key into Component table."/>
587 <columnDefinition name="Feature_" type="string" length="38"
588 keyTable="Feature" keyColumn="1" category="identifier" description="Foreign key into Feature table."/>
589 <columnDefinition name="File_Manifest" type="string" length="72" nullable="yes" modularize="column"
590 keyTable="File" keyColumn="1" category="identifier" description="Foreign key into the File table denoting the manifest file for the assembly."/>
591 <columnDefinition name="File_Application" type="string" length="72" nullable="yes" modularize="column"
592 keyTable="File" keyColumn="1" category="identifier" description="Foreign key into File table, denoting the application context for private assemblies. Null for global assemblies."/>
593 <columnDefinition name="Attributes" type="number" length="2" nullable="yes"
594 description="Assembly attributes"/>
595 </tableDefinition>
596 <tableDefinition name="MsiAssemblyName">
597 <columnDefinition name="Component_" type="string" length="72" primaryKey="yes" modularize="column"
598 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key into Component table."/>
599 <columnDefinition name="Name" type="string" length="255" primaryKey="yes"
600 category="text" description="The name part of the name-value pairs for the assembly name."/>
601 <columnDefinition name="Value" type="string" length="255"
602 category="text" description="The value part of the name-value pairs for the assembly name."/>
603 </tableDefinition>
604 <tableDefinition name="MsiDigitalCertificate">
605 <columnDefinition name="DigitalCertificate" type="string" length="72" primaryKey="yes"
606 category="identifier" description="A unique identifier for the row"/>
607 <columnDefinition name="CertData" type="object" length="0"
608 category="binary" description="A certificate context blob for a signer certificate"/>
609 </tableDefinition>
610 <tableDefinition name="MsiDigitalSignature">
611 <columnDefinition name="Table" type="string" length="32" primaryKey="yes"
612 set="Media" description="Reference to another table name (only Media table is supported)"/>
613 <columnDefinition name="SignObject" type="string" length="72" primaryKey="yes"
614 category="text" description="Foreign key to Media table"/>
615 <columnDefinition name="DigitalCertificate_" type="string" length="72"
616 keyTable="MsiDigitalCertificate" keyColumn="1" category="identifier" description="Foreign key to MsiDigitalCertificate table identifying the signer certificate"/>
617 <columnDefinition name="Hash" type="object" length="0" nullable="yes"
618 category="binary" description="The encoded hash blob from the digital signature"/>
619 </tableDefinition>
620 <tableDefinition name="MsiEmbeddedChainer" createSymbols="yes">
621 <columnDefinition name="MsiEmbeddedChainer" type="string" length="72" primaryKey="yes" modularize="column"
622 category="identifier" description="The primary key for the table."/>
623 <columnDefinition name="Condition" type="string" length="255" nullable="yes" localizable="yes"
624 category="condition" description="A conditional statement for running the user-defined function."/>
625 <columnDefinition name="CommandLine" type="string" length="255" nullable="yes" modularize="property"
626 category="formatted" description="The value in this field is a part of the command line string passed to the executable file identified in the Source column."/>
627 <columnDefinition name="Source" type="string" length="72" modularize="column"
628 category="customSource" description="The location of the executable file for the user-defined function."/>
629 <columnDefinition name="Type" type="number" length="2"
630 set="2;18;50" description="The functions listed in the MsiEmbeddedChainer table are described using the following custom action numeric types."/>
631 </tableDefinition>
632 <tableDefinition name="MsiEmbeddedUI">
633 <columnDefinition name="MsiEmbeddedUI" type="string" length="72" primaryKey="yes" modularize="column"
634 category="identifier" description="The primary key for the table."/>
635 <columnDefinition name="FileName" type="localized" length="255"
636 category="text" description="The name of the file that receives the binary information in the Data column."/>
637 <columnDefinition name="Attributes" type="number" length="2"
638 set="0;1;2;3" description="Information about the data in the Data column."/>
639 <columnDefinition name="MessageFilter" type="number" length="4" nullable="yes"
640 description="Specifies the types of messages that are sent to the user interface DLL."/>
641 <columnDefinition name="Data" type="object" length="0"
642 category="binary" description="This column contains binary information."/>
643 </tableDefinition>
644 <tableDefinition name="MsiFileHash">
645 <columnDefinition name="File_" type="string" length="72" primaryKey="yes" modularize="column"
646 keyTable="File" keyColumn="1" category="identifier" description="Primary key, foreign key into File table referencing file with this hash"/>
647 <columnDefinition name="Options" type="number" length="2"
648 minValue="0" maxValue="32767" description="Various options and attributes for this hash."/>
649 <columnDefinition name="HashPart1" type="number" length="4"
650 description="Size of file in bytes (long integer)."/>
651 <columnDefinition name="HashPart2" type="number" length="4"
652 description="Size of file in bytes (long integer)."/>
653 <columnDefinition name="HashPart3" type="number" length="4"
654 description="Size of file in bytes (long integer)."/>
655 <columnDefinition name="HashPart4" type="number" length="4"
656 description="Size of file in bytes (long integer)."/>
657 </tableDefinition>
658 <tableDefinition name="MsiPackageCertificate">
659 <columnDefinition name="PackageCertificate" type="string" length="72" primaryKey="yes"
660 category="identifier" description="Primary key. A unique identifier for the row."/>
661 <columnDefinition name="DigitalCertificate_" type="string" length="72" primaryKey="yes"
662 keyTable="MsiDigitalCertificate" keyColumn="1" category="identifier" description="Foreign key to MsiDigitalCertificate table identifying the signer certificate."/>
663 </tableDefinition>
664 <tableDefinition name="MsiPatchCertificate">
665 <columnDefinition name="PatchCertificate" type="string" length="72" primaryKey="yes"
666 category="identifier" description="Primary key. A unique identifier for the row."/>
667 <columnDefinition name="DigitalCertificate_" type="string" length="72" primaryKey="yes"
668 keyTable="MsiDigitalCertificate" keyColumn="1" category="identifier" description="Foreign key to MsiDigitalCertificate table identifying the signer certificate."/>
669 </tableDefinition>
670 <tableDefinition name="MsiPatchHeaders">
671 <columnDefinition name="StreamRef" type="string" length="38" primaryKey="yes"
672 category="identifier" description="Primary key. A unique identifier for the row."/>
673 <columnDefinition name="Header" type="object" length="0"
674 category="binary" description="Binary stream. The patch header, used for patch validation."/>
675 </tableDefinition>
676 <tableDefinition name="PatchMetadata">
677 <columnDefinition name="Company" type="string" length="72" primaryKey="yes" nullable="yes"
678 category="identifier" description="Primary key. The name of the company."/>
679 <columnDefinition name="Property" type="string" length="72" primaryKey="yes"
680 category="identifier" description="Primary key. The name of the property."/>
681 <columnDefinition name="Value" type="localized" length="0" escapeIdtCharacters="yes"
682 category="text" description="Non-null, non-empty value of the metadata property."/>
683 </tableDefinition>
684 <tableDefinition name="MsiPatchMetadata">
685 <columnDefinition name="Company" type="string" length="72" primaryKey="yes" nullable="yes"
686 />
687 <columnDefinition name="Property" type="string" length="72" primaryKey="yes"
688 />
689 <columnDefinition name="Value" type="localized" length="0"
690 />
691 </tableDefinition>
692 <tableDefinition name="MsiPatchOldAssemblyFile">
693 <columnDefinition name="File_" type="string" length="72" primaryKey="yes" modularize="column"
694 keyTable="File" keyColumn="1" category="identifier" description="Foreign key into File table. Patch-only table."/>
695 <columnDefinition name="Assembly_" type="string" length="72" primaryKey="yes" modularize="column"
696 keyTable="MsiPatchOldAssemblyName" keyColumn="1" category="identifier" description="Foreign key into MsiPatchOldAssemblyName table."/>
697 </tableDefinition>
698 <tableDefinition name="MsiPatchOldAssemblyName">
699 <columnDefinition name="Assembly" type="string" length="72" primaryKey="yes" modularize="column"
700 category="identifier" description="A unique identifier for the row."/>
701 <columnDefinition name="Name" type="string" length="255" primaryKey="yes"
702 category="text" description="The name part of the name-value pairs for the assembly name. This represents the old name for the assembly."/>
703 <columnDefinition name="Value" type="string" length="255"
704 category="text" description="The value part of the name-value pairs for the assembly name. This represents the old name for the assembly."/>
705 </tableDefinition>
706 <tableDefinition name="PatchSequence">
707 <columnDefinition name="PatchFamily" type="string" length="72" primaryKey="yes"
708 category="identifier" description="Primary key. The name of the family for the patch."/>
709 <columnDefinition name="Target" type="string" length="72" primaryKey="yes" nullable="yes"
710 category="text" description="Primary key. Determines product code filtering for family."/>
711 <columnDefinition name="Sequence" type="string" length="72" nullable="yes"
712 category="text" description="Sequence information in version (x.x.x.x) format."/>
713 <columnDefinition name="Supersede" type="number" length="4" nullable="yes"
714 description="Indicates that this patch supersedes earlier patches."/>
715 </tableDefinition>
716 <tableDefinition name="MsiPatchSequence" createSymbols="yes">
717 <columnDefinition name="PatchFamily" type="string" length="72" primaryKey="yes"
718 />
719 <columnDefinition name="ProductCode" type="string" length="38" primaryKey="yes" nullable="yes"
720 />
721 <columnDefinition name="Sequence" type="string" length="72"
722 />
723 <columnDefinition name="Attributes" type="number" length="4" nullable="yes"
724 />
725 </tableDefinition>
726 <tableDefinition name="ODBCAttribute">
727 <columnDefinition name="Driver_" type="string" length="72" primaryKey="yes" modularize="column"
728 keyTable="ODBCDriver" keyColumn="1" category="identifier" description="Reference to ODBC driver in ODBCDriver table"/>
729 <columnDefinition name="Attribute" type="string" length="40" primaryKey="yes"
730 category="text" description="Name of ODBC driver attribute"/>
731 <columnDefinition name="Value" type="localized" length="255" nullable="yes"
732 category="formatted" description="Value for ODBC driver attribute"/>
733 </tableDefinition>
734 <tableDefinition name="ODBCDriver">
735 <columnDefinition name="Driver" type="string" length="72" primaryKey="yes" modularize="column"
736 category="identifier" description="Primary key, non-localized.internal token for driver"/>
737 <columnDefinition name="Component_" type="string" length="72" modularize="column"
738 keyTable="Component" keyColumn="1" category="identifier" description="Reference to associated component"/>
739 <columnDefinition name="Description" type="string" length="255"
740 category="text" description="Text used as registered name for driver, non-localized"/>
741 <columnDefinition name="File_" type="string" length="72" modularize="column"
742 keyTable="File" keyColumn="1" category="identifier" description="Reference to key driver file"/>
743 <columnDefinition name="File_Setup" type="string" length="72" nullable="yes" modularize="column"
744 keyTable="File" keyColumn="1" category="identifier" description="Optional reference to key driver setup DLL"/>
745 </tableDefinition>
746 <tableDefinition name="ODBCDataSource">
747 <columnDefinition name="DataSource" type="string" length="72" primaryKey="yes" modularize="column"
748 category="identifier" description="Primary key, non-localized.internal token for data source"/>
749 <columnDefinition name="Component_" type="string" length="72" modularize="column"
750 keyTable="Component" keyColumn="1" category="identifier" description="Reference to associated component"/>
751 <columnDefinition name="Description" type="string" length="255"
752 category="text" description="Text used as registered name for data source"/>
753 <columnDefinition name="DriverDescription" type="string" length="255"
754 category="text" description="Reference to driver description, may be existing driver"/>
755 <columnDefinition name="Registration" type="number" length="2"
756 minValue="0" maxValue="1" description="Registration option: 0=machine, 1=user, others t.b.d."/>
757 </tableDefinition>
758 <tableDefinition name="ODBCSourceAttribute">
759 <columnDefinition name="DataSource_" type="string" length="72" primaryKey="yes" modularize="column"
760 keyTable="ODBCDataSource" keyColumn="1" category="identifier" description="Reference to ODBC data source in ODBCDataSource table"/>
761 <columnDefinition name="Attribute" type="string" length="32" primaryKey="yes"
762 category="text" description="Name of ODBC data source attribute"/>
763 <columnDefinition name="Value" type="localized" length="255" nullable="yes"
764 category="formatted" description="Value for ODBC data source attribute"/>
765 </tableDefinition>
766 <tableDefinition name="ODBCTranslator">
767 <columnDefinition name="Translator" type="string" length="72" primaryKey="yes" modularize="column"
768 category="identifier" description="Primary key, non-localized.internal token for translator"/>
769 <columnDefinition name="Component_" type="string" length="72" modularize="column"
770 keyTable="Component" keyColumn="1" category="identifier" description="Reference to associated component"/>
771 <columnDefinition name="Description" type="string" length="255"
772 category="text" description="Text used as registered name for translator"/>
773 <columnDefinition name="File_" type="string" length="72" modularize="column"
774 keyTable="File" keyColumn="1" category="identifier" description="Reference to key translator file"/>
775 <columnDefinition name="File_Setup" type="string" length="72" nullable="yes" modularize="column"
776 keyTable="File" keyColumn="1" category="identifier" description="Optional reference to key translator setup DLL"/>
777 </tableDefinition>
778 <tableDefinition name="Patch">
779 <columnDefinition name="File_" type="string" length="72" primaryKey="yes" modularize="column"
780 category="identifier" description="Primary key, non-localized token, foreign key to File table, must match identifier in cabinet."/>
781 <columnDefinition name="Sequence" type="number" length="4" primaryKey="yes"
782 minValue="0" maxValue="2147483647" description="Primary key, sequence with respect to the media images; order must track cabinet order."/>
783 <columnDefinition name="PatchSize" type="number" length="4"
784 minValue="0" maxValue="2147483647" description="Size of patch in bytes (long integer)."/>
785 <columnDefinition name="Attributes" type="number" length="2"
786 minValue="0" maxValue="32767" description="Integer containing bit flags representing patch attributes"/>
787 <columnDefinition name="Header" type="object" length="0" nullable="yes"
788 category="binary" description="Binary stream. The patch header, used for patch validation."/>
789 <columnDefinition name="StreamRef_" type="string" length="38" nullable="yes"
790 category="identifier" description="Identifier. Foreign key to the StreamRef column of the MsiPatchHeaders table."/>
791 </tableDefinition>
792 <tableDefinition name="PatchPackage">
793 <columnDefinition name="PatchId" type="string" length="38" primaryKey="yes"
794 category="guid" description="A unique string GUID representing this patch."/>
795 <columnDefinition name="Media_" type="number" length="2"
796 minValue="0" maxValue="32767" description="Foreign key to DiskId column of Media table. Indicates the disk containing the patch package."/>
797 </tableDefinition>
798 <tableDefinition name="PublishComponent">
799 <columnDefinition name="ComponentId" type="string" length="38" primaryKey="yes"
800 category="guid" description="A string GUID that represents the component id that will be requested by the alien product."/>
801 <columnDefinition name="Qualifier" type="string" length="255" primaryKey="yes"
802 category="text" description="This is defined only when the ComponentId column is an Qualified Component Id. This is the Qualifier for ProvideComponentIndirect."/>
803 <columnDefinition name="Component_" type="string" length="72" primaryKey="yes" modularize="column"
804 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key into the Component table."/>
805 <columnDefinition name="AppData" type="localized" length="0" nullable="yes" escapeIdtCharacters="yes"
806 category="text" description="This is localisable Application specific data that can be associated with a Qualified Component."/>
807 <columnDefinition name="Feature_" type="string" length="38"
808 keyTable="Feature" keyColumn="1" category="identifier" description="Foreign key into the Feature table."/>
809 </tableDefinition>
810 <tableDefinition name="RadioButton">
811 <columnDefinition name="Property" type="string" length="72" primaryKey="yes" modularize="column"
812 category="identifier" description="A named property to be tied to this radio button. All the buttons tied to the same property become part of the same group."/>
813 <columnDefinition name="Order" type="number" length="2" primaryKey="yes"
814 minValue="1" maxValue="32767" description="A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive."/>
815 <columnDefinition name="Value" type="string" length="64" modularize="property" escapeIdtCharacters="yes"
816 category="formatted" description="The value string associated with this button. Selecting the button will set the associated property to this value."/>
817 <columnDefinition name="X" type="number" length="2" localizable="yes"
818 minValue="0" maxValue="32767" description="The horizontal coordinate of the upper left corner of the bounding rectangle of the radio button."/>
819 <columnDefinition name="Y" type="number" length="2" localizable="yes"
820 minValue="0" maxValue="32767" description="The vertical coordinate of the upper left corner of the bounding rectangle of the radio button."/>
821 <columnDefinition name="Width" type="number" length="2" localizable="yes"
822 minValue="0" maxValue="32767" description="The width of the button."/>
823 <columnDefinition name="Height" type="number" length="2" localizable="yes"
824 minValue="0" maxValue="32767" description="The height of the button."/>
825 <columnDefinition name="Text" type="localized" length="0" nullable="yes" escapeIdtCharacters="yes"
826 category="text" description="The visible title to be assigned to the radio button."/>
827 <columnDefinition name="Help" type="localized" length="50" nullable="yes" escapeIdtCharacters="yes"
828 category="text" description="The help strings used with the button. The text is optional."/>
829 </tableDefinition>
830 <tableDefinition name="Registry">
831 <columnDefinition name="Registry" type="string" length="72" primaryKey="yes" modularize="column"
832 category="identifier" description="Primary key, non-localized token."/>
833 <columnDefinition name="Root" type="number" length="2"
834 minValue="-1" maxValue="3" description="The predefined root key for the registry value, one of rrkEnum."/>
835 <columnDefinition name="Key" type="localized" length="255" modularize="property"
836 category="regPath" description="The key for the registry value."/>
837 <columnDefinition name="Name" type="localized" length="255" nullable="yes" modularize="property"
838 category="formatted" description="The registry value name."/>
839 <columnDefinition name="Value" type="localized" length="0" nullable="yes" modularize="property" escapeIdtCharacters="yes"
840 category="formatted" description="The registry value."/>
841 <columnDefinition name="Component_" type="string" length="72" modularize="column"
842 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key into the Component table referencing component that controls the installing of the registry value."/>
843 </tableDefinition>
844 <tableDefinition name="RegLocator" createSymbols="yes">
845 <columnDefinition name="Signature_" type="string" length="72" primaryKey="yes" modularize="column"
846 category="identifier" description="The table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table. If the type is 0, the registry values refers a directory, and _Signature is not a foreign key."/>
847 <columnDefinition name="Root" type="number" length="2"
848 minValue="0" maxValue="3" description="The predefined root key for the registry value, one of rrkEnum."/>
849 <columnDefinition name="Key" type="string" length="255" modularize="property" localizable="yes"
850 category="regPath" description="The key for the registry value."/>
851 <columnDefinition name="Name" type="string" length="255" nullable="yes" modularize="property" localizable="yes"
852 category="formatted" description="The registry value name."/>
853 <columnDefinition name="Type" type="number" length="2" nullable="yes"
854 minValue="0" maxValue="18" description="An integer value that determines if the registry value is a filename or a directory location or to be used as is w/o interpretation."/>
855 </tableDefinition>
856 <tableDefinition name="RemoveFile">
857 <columnDefinition name="FileKey" type="string" length="72" primaryKey="yes" modularize="column"
858 category="identifier" description="Primary key used to identify a particular file entry"/>
859 <columnDefinition name="Component_" type="string" length="72" modularize="column"
860 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key referencing Component that controls the file to be removed."/>
861 <columnDefinition name="FileName" type="localized" length="255" nullable="yes"
862 category="wildCardFilename" description="Name of the file to be removed."/>
863 <columnDefinition name="DirProperty" type="string" length="72" modularize="column"
864 category="identifier" description="Name of a property whose value is assumed to resolve to the full pathname to the folder of the file to be removed."/>
865 <columnDefinition name="InstallMode" type="number" length="2"
866 set="1;2;3" description="Installation option, one of iimEnum."/>
867 </tableDefinition>
868 <tableDefinition name="RemoveIniFile">
869 <columnDefinition name="RemoveIniFile" type="string" length="72" primaryKey="yes" modularize="column"
870 category="identifier" description="Primary key, non-localized token."/>
871 <columnDefinition name="FileName" type="localized" length="255"
872 category="filename" description="The .INI file name in which to delete the information"/>
873 <columnDefinition name="DirProperty" type="string" length="72" nullable="yes" modularize="column"
874 category="identifier" description="Foreign key into the Directory table denoting the directory where the .INI file is."/>
875 <columnDefinition name="Section" type="localized" length="96" modularize="property"
876 category="formatted" description="The .INI file Section."/>
877 <columnDefinition name="Key" type="localized" length="128" modularize="property"
878 category="formatted" description="The .INI file key below Section."/>
879 <columnDefinition name="Value" type="localized" length="255" nullable="yes" modularize="property"
880 category="formatted" description="The value to be deleted. The value is required when Action is iifIniRemoveTag"/>
881 <columnDefinition name="Action" type="number" length="2"
882 set="2;4" description="The type of modification to be made, one of iifEnum."/>
883 <columnDefinition name="Component_" type="string" length="72" modularize="column"
884 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key into the Component table referencing component that controls the deletion of the .INI value."/>
885 </tableDefinition>
886 <tableDefinition name="RemoveRegistry">
887 <columnDefinition name="RemoveRegistry" type="string" length="72" primaryKey="yes" modularize="column"
888 category="identifier" description="Primary key, non-localized token."/>
889 <columnDefinition name="Root" type="number" length="2"
890 minValue="-1" maxValue="3" description="The predefined root key for the registry value, one of rrkEnum"/>
891 <columnDefinition name="Key" type="localized" length="255" modularize="property"
892 category="regPath" description="The key for the registry value."/>
893 <columnDefinition name="Name" type="localized" length="255" nullable="yes" modularize="property"
894 category="formatted" description="The registry value name."/>
895 <columnDefinition name="Component_" type="string" length="72" modularize="column"
896 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key into the Component table referencing component that controls the deletion of the registry value."/>
897 </tableDefinition>
898 <tableDefinition name="ReserveCost">
899 <columnDefinition name="ReserveKey" type="string" length="72" primaryKey="yes" modularize="column"
900 category="identifier" description="Primary key that uniquely identifies a particular ReserveCost record"/>
901 <columnDefinition name="Component_" type="string" length="72" modularize="column"
902 keyTable="Component" keyColumn="1" category="identifier" description="Reserve a specified amount of space if this component is to be installed."/>
903 <columnDefinition name="ReserveFolder" type="string" length="72" nullable="yes" modularize="column"
904 category="identifier" description="Name of a property whose value is assumed to resolve to the full path to the destination directory"/>
905 <columnDefinition name="ReserveLocal" type="number" length="4"
906 minValue="0" maxValue="2147483647" description="Disk space to reserve if linked component is installed locally."/>
907 <columnDefinition name="ReserveSource" type="number" length="4"
908 minValue="0" maxValue="2147483647" description="Disk space to reserve if linked component is installed to run from the source location."/>
909 </tableDefinition>
910 <tableDefinition name="SelfReg">
911 <columnDefinition name="File_" type="string" length="72" primaryKey="yes" modularize="column"
912 keyTable="File" keyColumn="1" category="identifier" description="Foreign key into the File table denoting the module that needs to be registered."/>
913 <columnDefinition name="Cost" type="number" length="2" nullable="yes"
914 minValue="0" maxValue="32767" description="The cost of registering the module."/>
915 </tableDefinition>
916 <tableDefinition name="ServiceControl">
917 <columnDefinition name="ServiceControl" type="string" length="72" primaryKey="yes" modularize="column"
918 category="identifier" description="Primary key, non-localized token."/>
919 <columnDefinition name="Name" type="localized" length="255" modularize="property"
920 category="formatted" description="Name of a service. /, \, comma and space are invalid"/>
921 <columnDefinition name="Event" type="number" length="2"
922 minValue="0" maxValue="187" description="Bit field: Install: 0x1 = Start, 0x2 = Stop, 0x8 = Delete, Uninstall: 0x10 = Start, 0x20 = Stop, 0x80 = Delete"/>
923 <columnDefinition name="Arguments" type="localized" length="255" nullable="yes" modularize="property"
924 category="formatted" description="Arguments for the service. Separate by [~]."/>
925 <columnDefinition name="Wait" type="number" length="2" nullable="yes"
926 minValue="0" maxValue="1" description="Boolean for whether to wait for the service to fully start"/>
927 <columnDefinition name="Component_" type="string" length="72" modularize="column"
928 keyTable="Component" keyColumn="1" category="identifier" description="Required foreign key into the Component Table that controls the startup of the service"/>
929 </tableDefinition>
930 <tableDefinition name="ServiceInstall">
931 <columnDefinition name="ServiceInstall" type="string" length="72" primaryKey="yes" modularize="column"
932 category="identifier" description="Primary key, non-localized token."/>
933 <columnDefinition name="Name" type="string" length="255" modularize="property"
934 category="formatted" description="Internal Name of the Service"/>
935 <columnDefinition name="DisplayName" type="localized" length="255" nullable="yes" escapeIdtCharacters="yes" modularize="property"
936 category="formatted" description="External Name of the Service"/>
937 <columnDefinition name="ServiceType" type="number" length="4"
938 minValue="-2147483647" maxValue="2147483647" description="Type of the service"/>
939 <columnDefinition name="StartType" type="number" length="4"
940 minValue="0" maxValue="4" description="Type of the service"/>
941 <columnDefinition name="ErrorControl" type="number" length="4"
942 minValue="-2147483647" maxValue="2147483647" description="Severity of error if service fails to start"/>
943 <columnDefinition name="LoadOrderGroup" type="string" length="255" nullable="yes" modularize="property"
944 category="formatted" description="LoadOrderGroup"/>
945 <columnDefinition name="Dependencies" type="string" length="255" nullable="yes" modularize="property"
946 category="formatted" description="Other services this depends on to start. Separate by [~], and end with [~][~]"/>
947 <columnDefinition name="StartName" type="string" length="255" nullable="yes" modularize="property"
948 category="formatted" description="User or object name to run service as"/>
949 <columnDefinition name="Password" type="string" length="255" nullable="yes" modularize="property"
950 category="formatted" description="password to run service with. (with StartName)"/>
951 <columnDefinition name="Arguments" type="string" length="255" nullable="yes" modularize="property"
952 category="formatted" description="Arguments to include in every start of the service, passed to WinMain"/>
953 <columnDefinition name="Component_" type="string" length="72" modularize="column"
954 keyTable="Component" keyColumn="1" category="identifier" description="Required foreign key into the Component Table that controls the startup of the service"/>
955 <columnDefinition name="Description" type="localized" length="255" nullable="yes" escapeIdtCharacters="yes" modularize="property"
956 category="text" description="Description of service."/>
957 </tableDefinition>
958 <tableDefinition name="MsiServiceConfig">
959 <columnDefinition name="MsiServiceConfig" type="string" length="72" primaryKey="yes" modularize="column"
960 category="identifier" description="Primary key, non-localized token."/>
961 <columnDefinition name="Name" type="localized" length="255" modularize="property"
962 category="formatted" description="Name of a service. /, \, comma and space are invalid"/>
963 <columnDefinition name="Event" type="number" length="2"
964 minValue="0" maxValue="7" description="Bit field: 0x1 = Install, 0x2 = Uninstall, 0x4 = Reinstall"/>
965 <columnDefinition name="ConfigType" type="number" length="4"
966 minValue="-2147483647" maxValue="2147483647" description="Service Configuration Option"/>
967 <columnDefinition name="Argument" type="string" length="0" nullable="yes"
968 category="text" description="Argument(s) for service configuration. Value depends on the content of the ConfigType field"/>
969 <columnDefinition name="Component_" type="string" length="72" modularize="column"
970 keyTable="Component" keyColumn="1" category="identifier" description="Required foreign key into the Component Table that controls the configuration of the service"/>
971 </tableDefinition>
972 <tableDefinition name="MsiServiceConfigFailureActions">
973 <columnDefinition name="MsiServiceConfigFailureActions" type="string" length="72" primaryKey="yes" modularize="column"
974 category="identifier" description="Primary key, non-localized token"/>
975 <columnDefinition name="Name" type="localized" length="255" modularize="property"
976 category="formatted" description="Name of a service. /, \, comma and space are invalid"/>
977 <columnDefinition name="Event" type="number" length="2"
978 minValue="0" maxValue="7" description="Bit field: 0x1 = Install, 0x2 = Uninstall, 0x4 = Reinstall"/>
979 <columnDefinition name="ResetPeriod" type="number" length="4" nullable="yes"
980 minValue="0" maxValue="2147483647" description="Time in seconds after which to reset the failure count to zero. Leave blank if it should never be reset"/>
981 <columnDefinition name="RebootMessage" type="localized" length="255" nullable="yes"
982 category="formatted" description="Message to be broadcast to server users before rebooting"/>
983 <columnDefinition name="Command" type="localized" length="255" nullable="yes"
984 category="formatted" description="Command line of the process to CreateProcess function to execute"/>
985 <columnDefinition name="Actions" type="string" length="0" nullable="yes"
986 category="text" description="A list of integer actions separated by [~] delimiters: 0 = SC_ACTION_NONE, 1 = SC_ACTION_RESTART, 2 = SC_ACTION_REBOOT, 3 = SC_ACTION_RUN_COMMAND. Terminate with [~][~]"/>
987 <columnDefinition name="DelayActions" type="string" length="0" nullable="yes"
988 category="text" description="A list of delays (time in milli-seconds), separated by [~] delmiters, to wait before taking the corresponding Action. Terminate with [~][~]"/>
989 <columnDefinition name="Component_" type="string" length="72" modularize="column"
990 keyTable="Component" keyColumn="1" category="identifier" description="Required foreign key into the Component Table that controls the configuration of failure actions for the service"/>
991 </tableDefinition>
992 <tableDefinition name="Shortcut">
993 <columnDefinition name="Shortcut" type="string" length="72" primaryKey="yes" modularize="column"
994 category="identifier" description="Primary key, non-localized token."/>
995 <columnDefinition name="Directory_" type="string" length="72" modularize="column"
996 keyTable="Directory" keyColumn="1" category="identifier" description="Foreign key into the Directory table denoting the directory where the shortcut file is created."/>
997 <columnDefinition name="Name" type="localized" length="128"
998 category="filename" description="The name of the shortcut to be created."/>
999 <columnDefinition name="Component_" type="string" length="72" modularize="column"
1000 keyTable="Component" keyColumn="1" category="identifier" description="Foreign key into the Component table denoting the component whose selection gates the the shortcut creation/deletion."/>
1001 <columnDefinition name="Target" type="string" length="72" modularize="property"
1002 category="shortcut" description="The shortcut target. This is usually a property that is expanded to a file or a folder that the shortcut points to."/>
1003 <columnDefinition name="Arguments" type="string" length="255" nullable="yes" modularize="property"
1004 category="formatted" description="The command-line arguments for the shortcut."/>
1005 <columnDefinition name="Description" type="localized" length="255" nullable="yes" escapeIdtCharacters="yes"
1006 category="text" description="The description for the shortcut."/>
1007 <columnDefinition name="Hotkey" type="number" length="2" nullable="yes"
1008 minValue="0" maxValue="32767" description="The hotkey for the shortcut. It has the virtual-key code for the key in the low-order byte, and the modifier flags in the high-order byte. "/>
1009 <columnDefinition name="Icon_" type="string" length="72" nullable="yes" modularize="icon"
1010 keyTable="Icon" keyColumn="1" category="identifier" description="Foreign key into the File table denoting the external icon file for the shortcut."/>
1011 <columnDefinition name="IconIndex" type="number" length="2" nullable="yes"
1012 minValue="-32767" maxValue="32767" description="The icon index for the shortcut."/>
1013 <columnDefinition name="ShowCmd" type="number" length="2" nullable="yes"
1014 set="1;3;7" description="The show command for the application window.The following values may be used."/>
1015 <columnDefinition name="WkDir" type="string" length="72" nullable="yes" modularize="column"
1016 category="identifier" description="Name of property defining location of working directory."/>
1017 <columnDefinition name="DisplayResourceDLL" type="string" length="255" nullable="yes" modularize="property"
1018 category="formatted" description="The Formatted string providing the full path to the language neutral file containing the MUI Manifest."/>
1019 <columnDefinition name="DisplayResourceId" type="number" length="2" nullable="yes"
1020 minValue="0" maxValue="32767" description="The display name index for the shortcut. This must be a non-negative number."/>
1021 <columnDefinition name="DescriptionResourceDLL" type="string" length="255" nullable="yes" modularize="property"
1022 category="formatted" description="The Formatted string providing the full path to the language neutral file containing the MUI Manifest."/>
1023 <columnDefinition name="DescriptionResourceId" type="number" length="2" nullable="yes"
1024 minValue="0" maxValue="32767" description="The description name index for the shortcut. This must be a non-negative number."/>
1025 </tableDefinition>
1026 <tableDefinition name="MsiShortcutProperty">
1027 <columnDefinition name="MsiShortcutProperty" type="string" length="72" primaryKey="yes" modularize="column"
1028 category="identifier" description="Primary key, non-localized token"/>
1029 <columnDefinition name="Shortcut_" type="string" length="72" modularize="column"
1030 keyTable="Shortcut" keyColumn="1" category="identifier" description="Foreign key into the Shortcut table"/>
1031 <columnDefinition name="PropertyKey" type="string" length="0" modularize="property"
1032 category="formatted" description="Canonical string representation of the Property Key being set"/>
1033 <columnDefinition name="PropVariantValue" type="string" length="0" modularize="property"
1034 category="formatted" description="String representation of the value in the property"/>
1035 </tableDefinition>
1036 <tableDefinition name="Signature" createSymbols="yes">
1037 <columnDefinition name="Signature" type="string" length="72" primaryKey="yes" modularize="column"
1038 category="identifier" description="The table key. The Signature represents a unique file signature."/>
1039 <columnDefinition name="FileName" type="string" length="255"
1040 category="text" description="The name of the file. This may contain a &quot;short name|long name&quot; pair."/>
1041 <columnDefinition name="MinVersion" type="string" length="20" nullable="yes"
1042 category="text" description="The minimum version of the file."/>
1043 <columnDefinition name="MaxVersion" type="string" length="20" nullable="yes"
1044 category="text" description="The maximum version of the file."/>
1045 <columnDefinition name="MinSize" type="number" length="4" nullable="yes"
1046 minValue="0" maxValue="2147483647" description="The minimum size of the file."/>
1047 <columnDefinition name="MaxSize" type="number" length="4" nullable="yes"
1048 minValue="0" maxValue="2147483647" description="The maximum size of the file. "/>
1049 <columnDefinition name="MinDate" type="number" length="4" nullable="yes"
1050 minValue="0" maxValue="2147483647" description="The minimum creation date of the file."/>
1051 <columnDefinition name="MaxDate" type="number" length="4" nullable="yes"
1052 minValue="0" maxValue="2147483647" description="The maximum creation date of the file."/>
1053 <columnDefinition name="Languages" type="string" length="255" nullable="yes"
1054 category="language" description="The languages supported by the file."/>
1055 </tableDefinition>
1056 <tableDefinition name="TextStyle">
1057 <columnDefinition name="TextStyle" type="string" length="72" primaryKey="yes"
1058 category="identifier" description="Name of the style. The primary key of this table. This name is embedded in the texts to indicate a style change."/>
1059 <columnDefinition name="FaceName" type="string" length="32" localizable="yes"
1060 category="text" description="A string indicating the name of the font used. Required. The string must be at most 31 characters long."/>
1061 <columnDefinition name="Size" type="number" length="2" localizable="yes"
1062 minValue="0" maxValue="32767" description="The size of the font used. This size is given in our units (1/12 of the system font height). Assuming that the system font is set to 12 point size, this is equivalent to the point size."/>
1063 <columnDefinition name="Color" type="number" length="4" nullable="yes"
1064 minValue="0" maxValue="16777215" description="A long integer indicating the color of the string in the RGB format (Red, Green, Blue each 0-255, RGB = R + 256*G + 256^2*B)."/>
1065 <columnDefinition name="StyleBits" type="number" length="2" nullable="yes"
1066 minValue="0" maxValue="15" description="A combination of style bits."/>
1067 </tableDefinition>
1068 <tableDefinition name="TypeLib">
1069 <columnDefinition name="LibID" type="string" length="38" primaryKey="yes"
1070 category="guid" description="The GUID that represents the library."/>
1071 <columnDefinition name="Language" type="number" length="2" primaryKey="yes"
1072 minValue="0" maxValue="32767" description="The language of the library."/>
1073 <columnDefinition name="Component_" type="string" length="72" primaryKey="yes" modularize="column"
1074 keyTable="Component" keyColumn="1" category="identifier" description="Required foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent."/>
1075 <columnDefinition name="Version" type="number" length="4" nullable="yes"
1076 minValue="0" maxValue="16777215" description="The version of the library. The minor version is in the lower 8 bits of the integer. The major version is in the next 16 bits. "/>
1077 <columnDefinition name="Description" type="localized" length="128" nullable="yes" escapeIdtCharacters="yes"
1078 category="text"/>
1079 <columnDefinition name="Directory_" type="string" length="72" nullable="yes" modularize="column"
1080 keyTable="Directory" keyColumn="1" category="identifier" description="Optional. The foreign key into the Directory table denoting the path to the help file for the type library."/>
1081 <columnDefinition name="Feature_" type="string" length="38"
1082 keyTable="Feature" keyColumn="1" category="identifier" description="Required foreign key into the Feature Table, specifying the feature to validate or install in order for the type library to be operational."/>
1083 <columnDefinition name="Cost" type="number" length="4" nullable="yes"
1084 minValue="0" maxValue="2147483647" description="The cost associated with the registration of the typelib. This column is currently optional."/>
1085 </tableDefinition>
1086 <tableDefinition name="UIText">
1087 <columnDefinition name="Key" type="string" length="72" primaryKey="yes"
1088 category="identifier" description="A unique key that identifies the particular string."/>
1089 <columnDefinition name="Text" type="localized" length="255" nullable="yes" escapeIdtCharacters="yes"
1090 category="text" description="The localized version of the string."/>
1091 </tableDefinition>
1092 <tableDefinition name="Upgrade">
1093 <columnDefinition name="UpgradeCode" type="string" length="38" primaryKey="yes"
1094 category="guid" description="The UpgradeCode GUID belonging to the products in this set."/>
1095 <columnDefinition name="VersionMin" type="string" length="20" primaryKey="yes" nullable="yes"
1096 category="text" description="The minimum ProductVersion of the products in this set. The set may or may not include products with this particular version."/>
1097 <columnDefinition name="VersionMax" type="string" length="20" primaryKey="yes" nullable="yes"
1098 category="text" description="The maximum ProductVersion of the products in this set. The set may or may not include products with this particular version."/>
1099 <columnDefinition name="Language" type="string" length="255" primaryKey="yes" nullable="yes" localizable="yes"
1100 category="language" description="A comma-separated list of languages for either products in this set or products not in this set."/>
1101 <columnDefinition name="Attributes" type="number" length="4" primaryKey="yes"
1102 minValue="0" maxValue="2147483647" description="The attributes of this product set."/>
1103 <columnDefinition name="Remove" type="string" length="255" nullable="yes"
1104 category="formatted" description="The list of features to remove when uninstalling a product from this set. The default is &quot;ALL&quot;."/>
1105 <columnDefinition name="ActionProperty" type="string" length="72"
1106 category="upperCase" description="The property to set when a product in this set is found."/>
1107 </tableDefinition>
1108 <tableDefinition name="Verb">
1109 <columnDefinition name="Extension_" type="string" length="255" primaryKey="yes"
1110 keyTable="Extension" keyColumn="1" category="text" description="The extension associated with the table row."/>
1111 <columnDefinition name="Verb" type="string" length="32" primaryKey="yes"
1112 category="text" description="The verb for the command."/>
1113 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
1114 minValue="0" maxValue="32767" description="Order within the verbs for a particular extension. Also used simply to specify the default verb."/>
1115 <columnDefinition name="Command" type="localized" length="255" nullable="yes" modularize="property"
1116 category="formatted" description="The command text."/>
1117 <columnDefinition name="Argument" type="localized" length="255" nullable="yes" modularize="property"
1118 category="formatted" description="Optional value for the command arguments."/>
1119 </tableDefinition>
1120 <!-- Merge Module -->
1121 <tableDefinition name="ModuleAdminExecuteSequence">
1122 <columnDefinition name="Action" type="string" length="64" primaryKey="yes" modularize="column"
1123 category="identifier" description="Action to insert"/>
1124 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
1125 minValue="-4" maxValue="32767" description="Standard Sequence number"/>
1126 <columnDefinition name="BaseAction" type="string" length="64" nullable="yes" modularize="column"
1127 keyTable="ModuleAdminExecuteSequence" keyColumn="1" category="identifier" description="Base action to determine insert location."/>
1128 <columnDefinition name="After" type="number" length="2" nullable="yes"
1129 minValue="0" maxValue="1" description="Before (0) or After (1)"/>
1130 <columnDefinition name="Condition" type="string" length="255" nullable="yes" modularize="condition" localizable="yes"
1131 category="condition"/>
1132 </tableDefinition>
1133 <tableDefinition name="ModuleAdminUISequence">
1134 <columnDefinition name="Action" type="string" length="64" primaryKey="yes" modularize="column"
1135 category="identifier" description="Action to insert"/>
1136 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
1137 minValue="-4" maxValue="32767" description="Standard Sequence number"/>
1138 <columnDefinition name="BaseAction" type="string" length="64" nullable="yes" modularize="column"
1139 keyTable="ModuleAdminUISequence" keyColumn="1" category="identifier" description="Base action to determine insert location."/>
1140 <columnDefinition name="After" type="number" length="2" nullable="yes"
1141 minValue="0" maxValue="1" description="Before (0) or After (1)"/>
1142 <columnDefinition name="Condition" type="string" length="255" nullable="yes" modularize="condition" localizable="yes"
1143 category="condition"/>
1144 </tableDefinition>
1145 <tableDefinition name="ModuleAdvtExecuteSequence">
1146 <columnDefinition name="Action" type="string" length="64" primaryKey="yes" modularize="column"
1147 category="identifier" description="Action to insert"/>
1148 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
1149 minValue="-4" maxValue="32767" description="Standard Sequence number"/>
1150 <columnDefinition name="BaseAction" type="string" length="64" nullable="yes" modularize="column"
1151 keyTable="ModuleAdvtExecuteSequence" keyColumn="1" category="identifier" description="Base action to determine insert location."/>
1152 <columnDefinition name="After" type="number" length="2" nullable="yes"
1153 minValue="0" maxValue="1" description="Before (0) or After (1)"/>
1154 <columnDefinition name="Condition" type="string" length="255" nullable="yes" modularize="condition" localizable="yes"
1155 category="condition"/>
1156 </tableDefinition>
1157 <tableDefinition name="ModuleAdvtUISequence">
1158 <columnDefinition name="Action" type="string" length="64" primaryKey="yes" modularize="column"
1159 category="identifier" description="Action to insert"/>
1160 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
1161 minValue="-4" maxValue="32767" description="Standard Sequence number"/>
1162 <columnDefinition name="BaseAction" type="string" length="64" nullable="yes" modularize="column"
1163 keyTable="ModuleAdvtUISequence" keyColumn="1" category="identifier" description="Base action to determine insert location."/>
1164 <columnDefinition name="After" type="number" length="2" nullable="yes"
1165 minValue="0" maxValue="1" description="Before (0) or After (1)"/>
1166 <columnDefinition name="Condition" type="string" length="255" nullable="yes" modularize="condition" localizable="yes"
1167 category="condition"/>
1168 </tableDefinition>
1169 <tableDefinition name="ModuleComponents">
1170 <columnDefinition name="Component" type="string" length="72" primaryKey="yes" modularize="column"
1171 keyTable="Component" keyColumn="1" category="identifier" description="Component contained in the module."/>
1172 <columnDefinition name="ModuleID" type="string" length="72" primaryKey="yes" modularize="column"
1173 keyTable="ModuleSignature" keyColumn="1" category="identifier" description="Module containing the component."/>
1174 <columnDefinition name="Language" type="number" length="2" primaryKey="yes" localizable="yes"
1175 keyTable="ModuleSignature" keyColumn="2" description="Default language ID for module (may be changed by transform)."/>
1176 </tableDefinition>
1177 <tableDefinition name="ModuleSignature">
1178 <columnDefinition name="ModuleID" type="string" length="72" primaryKey="yes" modularize="column"
1179 category="identifier" description="Module identifier (String.GUID)."/>
1180 <columnDefinition name="Language" type="number" length="2" primaryKey="yes" localizable="yes"
1181 description="Default decimal language of module."/>
1182 <columnDefinition name="Version" type="string" length="32"
1183 category="version" description="Version of the module."/>
1184 </tableDefinition>
1185 <tableDefinition name="ModuleConfiguration">
1186 <columnDefinition name="Name" type="string" length="72" primaryKey="yes"
1187 category="identifier" description="Unique identifier for this row."/>
1188 <columnDefinition name="Format" type="number" length="2"
1189 minValue="0" maxValue="3" description="Format of this item."/>
1190 <columnDefinition name="Type" type="string" length="72" nullable="yes"
1191 category="identifier" description="Additional type information for this item."/>
1192 <columnDefinition name="ContextData" type="localized" length="0" nullable="yes"
1193 category="text" description="Additional context information about this item."/>
1194 <columnDefinition name="DefaultValue" type="localized" length="0" nullable="yes"
1195 category="text" description="Default value for this item."/>
1196 <columnDefinition name="Attributes" type="number" length="4" nullable="yes"
1197 minValue="0" maxValue="3" description="Additional type-specific attributes."/>
1198 <columnDefinition name="DisplayName" type="localized" length="72" nullable="yes"
1199 category="text" description="A short human-readable name for this item."/>
1200 <columnDefinition name="Description" type="localized" length="0" nullable="yes"
1201 category="text" description="A human-readable description."/>
1202 <columnDefinition name="HelpLocation" type="string" length="0" nullable="yes"
1203 category="text" description="Filename or namespace of the context-sensitive help for this item."/>
1204 <columnDefinition name="HelpKeyword" type="string" length="0" nullable="yes"
1205 category="text" description="Keyword index into the HelpLocation for this item."/>
1206 </tableDefinition>
1207 <tableDefinition name="ModuleDependency">
1208 <columnDefinition name="ModuleID" type="string" length="72" primaryKey="yes" modularize="column"
1209 keyTable="ModuleSignature" keyColumn="1" category="identifier" description="Module requiring the dependency."/>
1210 <columnDefinition name="ModuleLanguage" type="number" length="2" primaryKey="yes" localizable="yes"
1211 keyTable="ModuleSignature" keyColumn="2" description="Language of module requiring the dependency."/>
1212 <columnDefinition name="RequiredID" type="string" length="72" primaryKey="yes"
1213 description="String.GUID of required module."/>
1214 <columnDefinition name="RequiredLanguage" type="number" length="2" primaryKey="yes" localizable="yes"
1215 description="LanguageID of the required module."/>
1216 <columnDefinition name="RequiredVersion" type="string" length="32" nullable="yes"
1217 category="version" description="Version of the required version."/>
1218 </tableDefinition>
1219 <tableDefinition name="ModuleExclusion">
1220 <columnDefinition name="ModuleID" type="string" length="72" primaryKey="yes" modularize="column"
1221 keyTable="ModuleSignature" keyColumn="1" category="identifier" description="String.GUID of module with exclusion requirement."/>
1222 <columnDefinition name="ModuleLanguage" type="number" length="2" primaryKey="yes" localizable="yes"
1223 keyTable="ModuleSignature" keyColumn="2" description="LanguageID of module with exclusion requirement."/>
1224 <columnDefinition name="ExcludedID" type="string" length="72" primaryKey="yes"
1225 description="String.GUID of excluded module."/>
1226 <columnDefinition name="ExcludedLanguage" type="number" length="2" primaryKey="yes" localizable="yes"
1227 description="Language of excluded module."/>
1228 <columnDefinition name="ExcludedMinVersion" type="string" length="32" nullable="yes"
1229 category="version" description="Minimum version of excluded module."/>
1230 <columnDefinition name="ExcludedMaxVersion" type="string" length="32" nullable="yes"
1231 category="version" description="Maximum version of excluded module."/>
1232 </tableDefinition>
1233 <tableDefinition name="ModuleIgnoreTable">
1234 <columnDefinition name="Table" type="string" length="72" primaryKey="yes"
1235 category="identifier" description="Table name to ignore during merge operation."/>
1236 </tableDefinition>
1237 <tableDefinition name="ModuleInstallExecuteSequence">
1238 <columnDefinition name="Action" type="string" length="64" primaryKey="yes" modularize="column"
1239 category="identifier" description="Action to insert"/>
1240 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
1241 minValue="-4" maxValue="32767" description="Standard Sequence number"/>
1242 <columnDefinition name="BaseAction" type="string" length="64" nullable="yes" modularize="column"
1243 keyTable="ModuleInstallExecuteSequence" keyColumn="1" category="identifier" description="Base action to determine insert location."/>
1244 <columnDefinition name="After" type="number" length="2" nullable="yes"
1245 minValue="0" maxValue="1" description="Before (0) or After (1)"/>
1246 <columnDefinition name="Condition" type="string" length="255" nullable="yes" modularize="condition" localizable="yes"
1247 category="condition"/>
1248 </tableDefinition>
1249 <tableDefinition name="ModuleInstallUISequence">
1250 <columnDefinition name="Action" type="string" length="64" primaryKey="yes" modularize="column"
1251 category="identifier" description="Action to insert"/>
1252 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"
1253 minValue="-4" maxValue="32767" description="Standard Sequence number"/>
1254 <columnDefinition name="BaseAction" type="string" length="64" nullable="yes" modularize="column"
1255 keyTable="ModuleInstallUISequence" keyColumn="1" category="identifier" description="Base action to determine insert location."/>
1256 <columnDefinition name="After" type="number" length="2" nullable="yes"
1257 minValue="0" maxValue="1" description="Before (0) or After (1)"/>
1258 <columnDefinition name="Condition" type="string" length="255" nullable="yes" modularize="condition" localizable="yes"
1259 category="condition"/>
1260 </tableDefinition>
1261 <tableDefinition name="ModuleSubstitution">
1262 <columnDefinition name="Table" type="string" length="72" primaryKey="yes"
1263 category="identifier" description="Table containing the data to be modified."/>
1264 <columnDefinition name="Row" type="string" length="0" primaryKey="yes" modularize="semicolonDelimited"
1265 category="text" description="Row containing the data to be modified."/>
1266 <columnDefinition name="Column" type="string" length="72" primaryKey="yes"
1267 category="identifier" description="Column containing the data to be modified."/>
1268 <columnDefinition name="Value" type="localized" length="0" nullable="yes"
1269 category="text" description="Template for modification data."/>
1270 </tableDefinition>
1271 <tableDefinition name="Properties">
1272 <columnDefinition name="Name" type="string" length="72" primaryKey="yes"
1273 category="text" description="Primary key, non-localized token"/>
1274 <columnDefinition name="Value" type="string" length="0"
1275 category="text" description="Value of the property"/>
1276 </tableDefinition>
1277 <tableDefinition name="ImageFamilies">
1278 <columnDefinition name="Family" type="string" length="8" primaryKey="yes"
1279 category="text" description="Primary key"/>
1280 <columnDefinition name="MediaSrcPropName" type="string" length="72" nullable="yes"
1281 category="text"/>
1282 <columnDefinition name="MediaDiskId" type="number" length="0" nullable="yes"
1283 category="integer"/>
1284 <columnDefinition name="FileSequenceStart" type="number" length="4" nullable="yes"
1285 minValue="1" maxValue="214743647" category="integer"/>
1286 <columnDefinition name="DiskPrompt" type="string" length="128" nullable="yes" escapeIdtCharacters="yes" localizable="yes"
1287 category="text"/>
1288 <columnDefinition name="VolumeLabel" type="string" length="32" nullable="yes"
1289 category="text"/>
1290 </tableDefinition>
1291 <tableDefinition name="UpgradedImages">
1292 <columnDefinition name="Upgraded" type="string" length="13" primaryKey="yes"
1293 category="text" description="Primary key"/>
1294 <columnDefinition name="MsiPath" type="string" length="255"
1295 category="text"/>
1296 <columnDefinition name="PatchMsiPath" type="string" length="255" nullable="yes"
1297 category="text"/>
1298 <columnDefinition name="SymbolPaths" type="string" length="255" nullable="yes"
1299 category="text"/>
1300 <columnDefinition name="Family" type="string" length="8"
1301 keyTable="ImageFamilies" keyColumn="1" category="text" description="Foreign key, Family to which this image belongs"/>
1302 </tableDefinition>
1303 <tableDefinition name="UpgradedFilesToIgnore">
1304 <columnDefinition name="Upgraded" type="string" length="13" primaryKey="yes"
1305 keyTable="UpgradedImages" keyColumn="1" category="text" description="Foreign key, Upgraded image"/>
1306 <columnDefinition name="FTK" type="string" length="255" primaryKey="yes" modularize="column"
1307 keyTable="File" keyColumn="1" category="text" description="Foreign key, File to ignore"/>
1308 </tableDefinition>
1309 <tableDefinition name="UpgradedFiles_OptionalData">
1310 <columnDefinition name="Upgraded" type="string" length="13" primaryKey="yes"
1311 keyTable="UpgradedImages" keyColumn="1" category="text" description="Foreign key, Upgraded image"/>
1312 <columnDefinition name="FTK" type="string" length="255" primaryKey="yes" modularize="column"
1313 keyTable="File" keyColumn="1" category="text" description="Foreign key, File to ignore"/>
1314 <columnDefinition name="SymbolPaths" type="string" length="255" nullable="yes"
1315 category="text"/>
1316 <columnDefinition name="AllowIgnoreOnPatchError" type="number" length="0" nullable="yes"
1317 category="integer"/>
1318 <columnDefinition name="IncludeWholeFile" type="number" length="0" nullable="yes"
1319 category="integer"/>
1320 </tableDefinition>
1321 <tableDefinition name="TargetImages" createSymbols="yes">
1322 <columnDefinition name="Target" type="string" length="13" primaryKey="yes"
1323 category="text"/>
1324 <columnDefinition name="MsiPath" type="string" length="255"
1325 category="text"/>
1326 <columnDefinition name="SymbolPaths" type="string" length="255" nullable="yes"
1327 category="text"/>
1328 <columnDefinition name="Upgraded" type="string" length="13"
1329 keyTable="UpgradedImages" keyColumn="1" category="text" description="Foreign key, Upgraded image"/>
1330 <columnDefinition name="Order" type="number" length="0"
1331 category="integer"/>
1332 <columnDefinition name="ProductValidateFlags" type="string" length="16" nullable="yes"
1333 category="text"/>
1334 <columnDefinition name="IgnoreMissingSrcFiles" type="number" length="0"
1335 category="integer"/>
1336 </tableDefinition>
1337 <tableDefinition name="TargetFiles_OptionalData">
1338 <columnDefinition name="Target" type="string" length="13" primaryKey="yes"
1339 keyTable="TargetImages" keyColumn="1" category="text" description="Foreign key, Target image"/>
1340 <columnDefinition name="FTK" type="string" length="255" primaryKey="yes" modularize="column"
1341 keyTable="File" keyColumn="1" category="text" description="Foreign key, File to ignore"/>
1342 <columnDefinition name="SymbolPaths" type="string" length="255" nullable="yes"
1343 category="text"/>
1344 <columnDefinition name="IgnoreOffsets" type="string" length="255" nullable="yes"
1345 category="text"/>
1346 <columnDefinition name="IgnoreLengths" type="string" length="255" nullable="yes"
1347 category="text"/>
1348 <columnDefinition name="RetainOffsets" type="string" length="255" nullable="yes"
1349 category="text"/>
1350 </tableDefinition>
1351 <tableDefinition name="FamilyFileRanges">
1352 <columnDefinition name="Family" type="string" length="8" primaryKey="yes"
1353 keyTable="ImageFamilies" keyColumn="1" category="text" description="Foreign key, Family"/>
1354 <columnDefinition name="FTK" type="string" length="255" primaryKey="yes" modularize="column"
1355 keyTable="File" keyColumn="1" category="text" description="Foreign key, File to ignore"/>
1356 <columnDefinition name="RetainOffsets" type="string" length="128"
1357 category="text"/>
1358 <columnDefinition name="RetainLengths" type="string" length="128"
1359 category="text"/>
1360 </tableDefinition>
1361 <tableDefinition name="ExternalFiles">
1362 <columnDefinition name="Family" type="string" length="8" primaryKey="yes"
1363 keyTable="ImageFamilies" keyColumn="1" category="text" description="Foreign key, Family"/>
1364 <columnDefinition name="FTK" type="string" length="255" primaryKey="yes" modularize="column"
1365 keyTable="File" keyColumn="1" category="text" description="Foreign key, File to ignore"/>
1366 <columnDefinition name="FilePath" type="string" length="255" primaryKey="yes"
1367 category="text"/>
1368 <columnDefinition name="SymbolPaths" type="string" length="255" nullable="yes"
1369 category="text"/>
1370 <columnDefinition name="IgnoreOffsets" type="string" length="255" nullable="yes"
1371 category="text"/>
1372 <columnDefinition name="IgnoreLengths" type="string" length="255" nullable="yes"
1373 category="text"/>
1374 <columnDefinition name="RetainOffsets" type="string" length="255" nullable="yes"
1375 category="text"/>
1376 <columnDefinition name="Order" type="number" length="0"
1377 category="integer"/>
1378 </tableDefinition>
1379 <tableDefinition name="WixAction" createSymbols="yes" unreal="yes">
1380 <columnDefinition name="SequenceTable" type="string" length="62" primaryKey="yes"/>
1381 <columnDefinition name="Action" type="string" length="72" primaryKey="yes"/>
1382 <columnDefinition name="Condition" type="string" length="255" nullable="yes" localizable="yes"/>
1383 <columnDefinition name="Sequence" type="number" length="2" nullable="yes"/>
1384 <columnDefinition name="Before" type="string" length="72" nullable="yes"/>
1385 <columnDefinition name="After" type="string" length="72" nullable="yes"/>
1386 <columnDefinition name="Overridable" type="number" length="2" nullable="yes"/>
1387 </tableDefinition>
1388 <tableDefinition name="WixBBControl" createSymbols="yes" unreal="yes">
1389 <columnDefinition name="Billboard_" type="string" length="50" primaryKey="yes" modularize="column"/>
1390 <columnDefinition name="BBControl_" type="string" length="50" primaryKey="yes"/>
1391 <columnDefinition name="SourceFile" type="object" length="0"/>
1392 </tableDefinition>
1393 <tableDefinition name="WixComplexReference" unreal="yes">
1394 <columnDefinition name="Parent" type="string" length="0" localizable="yes"/>
1395 <columnDefinition name="ParentAttributes" type="number" length="4"/>
1396 <columnDefinition name="ParentLanguage" type="string" length="0" nullable="yes"/>
1397 <columnDefinition name="Child" type="string" length="0" localizable="yes"/>
1398 <columnDefinition name="ChildAttributes" type="number" length="4"/>
1399 <columnDefinition name="Attributes" type="number" length="4"/>
1400 </tableDefinition>
1401 <tableDefinition name="WixComponentGroup" createSymbols="yes" unreal="yes">
1402 <columnDefinition name="WixComponentGroup" type="string" length="0" primaryKey="yes"/>
1403 </tableDefinition>
1404 <tableDefinition name="WixControl" unreal="yes">
1405 <columnDefinition name="Dialog_" type="string" length="72" primaryKey="yes" modularize="column"/>
1406 <columnDefinition name="Control_" type="string" length="50" primaryKey="yes"/>
1407 <columnDefinition name="SourceFile" type="object" length="0"/>
1408 </tableDefinition>
1409 <tableDefinition name="WixCustomRow" unreal="yes">
1410 <columnDefinition name="Table" type="string" length="62"/>
1411 <columnDefinition name="FieldData" type="string" length="0"/>
1412 </tableDefinition>
1413 <tableDefinition name="WixCustomTable" createSymbols="yes" unreal="yes">
1414 <columnDefinition name="Table" type="string" length="62" primaryKey="yes"/>
1415 <columnDefinition name="ColumnCount" type="number" length="2"/>
1416 <columnDefinition name="ColumnNames" type="string" length="0"/>
1417 <columnDefinition name="ColumnTypes" type="string" length="0"/>
1418 <columnDefinition name="PrimaryKeys" type="string" length="0"/>
1419 <columnDefinition name="MinValues" type="string" length="0"/>
1420 <columnDefinition name="MaxValues" type="string" length="0"/>
1421 <columnDefinition name="KeyTables" type="string" length="0"/>
1422 <columnDefinition name="KeyColumns" type="string" length="0"/>
1423 <columnDefinition name="Categories" type="string" length="0"/>
1424 <columnDefinition name="Sets" type="string" length="0"/>
1425 <columnDefinition name="Descriptions" type="string" length="0"/>
1426 <columnDefinition name="Modularizations" type="string" length="0"/>
1427 <columnDefinition name="BootstrapperApplicationData" type="number" length="2"/>
1428 </tableDefinition>
1429 <tableDefinition name="WixDirectory" unreal="yes">
1430 <columnDefinition name="Directory_" type="string" length="0" primaryKey="yes" modularize="column"/>
1431 <columnDefinition name="ComponentGuidGenerationSeed" type="string" length="38" nullable="yes"/>
1432 </tableDefinition>
1433 <tableDefinition name="WixEnsureTable" unreal="yes">
1434 <columnDefinition name="Table" type="string" length="31"/>
1435 </tableDefinition>
1436 <tableDefinition name="WixFeatureGroup" createSymbols="yes" unreal="yes">
1437 <columnDefinition name="WixFeatureGroup" type="string" length="0" primaryKey="yes"/>
1438 </tableDefinition>
1439 <tableDefinition name="WixPatchFamilyGroup" createSymbols="yes" unreal="yes">
1440 <columnDefinition name="WixPatchFamilyGroup" type="string" length="0" primaryKey="yes"/>
1441 </tableDefinition>
1442 <tableDefinition name="WixGroup" unreal="yes">
1443 <columnDefinition name="ParentId" type="string" length="0" primaryKey="yes" nullable="no" category="identifier"
1444 description="Primary key used to identify a particular record in a parent table."/>
1445 <columnDefinition name="ParentType" type="string" length="0" primaryKey="yes" nullable="no"
1446 description="Primary key used to identify a particular parent type in a parent table."/>
1447 <columnDefinition name="ChildId" type="string" length="0" primaryKey="yes" nullable="no" category="identifier"
1448 description="Primary key used to identify a particular record in a child table."/>
1449 <columnDefinition name="ChildType" type="string" length="0" primaryKey="yes" nullable="no"
1450 description="Primary key used to identify a particular child type in a child table."/>
1451 </tableDefinition>
1452 <tableDefinition name="WixFeatureModules" unreal="yes">
1453 <columnDefinition name="Feature_" type="string" length="38" primaryKey="yes"/>
1454 <columnDefinition name="WixMerge_" type="string" length="72" primaryKey="yes"/>
1455 </tableDefinition>
1456 <tableDefinition name="WixFile" unreal="yes">
1457 <columnDefinition name="File_" type="string" length="0" category="identifier" primaryKey="yes"
1458 modularize="column" keyTable="File" keyColumn="1" />
1459 <columnDefinition name="AssemblyType" type="number" length="2" minValue="0" maxValue="1" />
1460 <columnDefinition name="File_AssemblyManifest" type="string" length="72" category="identifier" nullable="yes"
1461 modularize="column" keyTable="File" keyColumn="1" />
1462 <columnDefinition name="File_AssemblyApplication" type="string" length="72" category="identifier" nullable="yes"
1463 modularize="column" keyTable="File" keyColumn="1" />
1464 <columnDefinition name="Directory_" type="string" length="72" modularize="column" keyTable="Directory" keyColumn="1" />
1465 <columnDefinition name="DiskId" type="number" length="4" nullable="yes"/>
1466 <columnDefinition name="Source" type="object" length="0"/>
1467 <columnDefinition name="ProcessorArchitecture" type="string" length="0" nullable="yes"/>
1468 <columnDefinition name="PatchGroup" type="number" length="4" />
1469 <columnDefinition name="Attributes" type="number" length="4"/>
1470 <columnDefinition name="PatchAttributes" type="number" length="4" nullable="yes"/>
1471 <columnDefinition name="DeltaPatchHeaderSource" type="string" length="0" nullable="yes"/>
1472 </tableDefinition>
1473 <tableDefinition name="WixBindUpdatedFiles" unreal="yes">
1474 <columnDefinition name="File_" type="string" length="0" primaryKey="yes" modularize="column" keyTable="File" keyColumn="1" category="identifier" />
1475 </tableDefinition>
1476 <tableDefinition name="WixBuildInfo" unreal="yes">
1477 <columnDefinition name="WixVersion" type="string" length="20"
1478 category="text" description="Version number of WiX."/>
1479 <columnDefinition name="WixOutputFile" type="string" length="0" nullable="yes" escapeIdtCharacters="yes"
1480 category="text" description="Path to output file, if supplied."/>
1481 <columnDefinition name="WixProjectFile" type="string" length="0" nullable="yes" escapeIdtCharacters="yes"
1482 category="text" description="Path to .wixproj file, if supplied."/>
1483 <columnDefinition name="WixPdbFile" type="string" length="0" nullable="yes" escapeIdtCharacters="yes"
1484 category="text" description="Path to .wixpdb file, if supplied."/>
1485 </tableDefinition>
1486 <tableDefinition name="WixFragment" createSymbols="yes" unreal="yes">
1487 <columnDefinition name="WixFragment" type="string" length="0" primaryKey="yes"/>
1488 </tableDefinition>
1489 <tableDefinition name="WixInstanceComponent" unreal="yes">
1490 <columnDefinition name="Component_" type="string" length="0" primaryKey="yes" modularize="column"/>
1491 </tableDefinition>
1492 <tableDefinition name="WixInstanceTransforms" unreal="yes" createSymbols="yes">
1493 <columnDefinition name="Id" type="string" length="0" primaryKey="yes"/>
1494 <columnDefinition name="PropertyId" type="string" length="0"/>
1495 <columnDefinition name="ProductCode" type="string" length="0" category="guid"/>
1496 <columnDefinition name="ProductName" type="localized" localizable="yes" length="0" nullable="yes"/>
1497 <columnDefinition name="UpgradeCode" type="string" length="38" category="guid" nullable="yes"/>
1498 </tableDefinition>
1499 <tableDefinition name="WixMedia" unreal="yes">
1500 <columnDefinition name="DiskId_" type="number" length="2" primaryKey="yes"/>
1501 <columnDefinition name="CompressionLevel" type="number" length="2" nullable="yes" minValue="0" maxValue="4" />
1502 <columnDefinition name="Layout" type="string" length="0" nullable="yes"/>
1503 </tableDefinition>
1504 <tableDefinition name="WixMediaTemplate" unreal="yes">
1505 <columnDefinition name="CabinetTemplate" type="string" length="0" nullable="yes"/>
1506 <columnDefinition name="CompressionLevel" type="number" length="2" nullable="yes" minValue="0" maxValue="4" />
1507 <columnDefinition name="DiskPrompt" type="string" length="0" nullable="yes"/>
1508 <columnDefinition name="VolumeLabel" type="string" length="0" nullable="yes"/>
1509 <columnDefinition name="MaximumUncompressedMediaSize" type="number" length="4" />
1510 <columnDefinition name="MaximumCabinetSizeForLargeFileSplitting" type="number" length="4" />
1511 </tableDefinition>
1512 <tableDefinition name="WixMerge" createSymbols="yes" unreal="yes">
1513 <columnDefinition name="WixMerge" type="string" length="72" primaryKey="yes"/>
1514 <columnDefinition name="Language" type="number" length="2" localizable="yes"/>
1515 <columnDefinition name="Directory_" type="string" nullable="yes" length="72"/>
1516 <columnDefinition name="SourceFile" type="object" length="0"/>
1517 <columnDefinition name="DiskId" type="number" length="2"/>
1518 <columnDefinition name="FileCompression" type="number" length="2" nullable="yes"/>
1519 <columnDefinition name="ConfigurationData" type="string" length="255" nullable="yes"/>
1520 <columnDefinition name="Feature_" type="string" length="72"/>
1521 </tableDefinition>
1522 <tableDefinition name="WixOrdering" createSymbols="yes" unreal="yes">
1523 <columnDefinition name="ItemType" type="string" length="0" primaryKey="yes" nullable="no"
1524 description="Primary key used to identify the item in another table."/>
1525 <columnDefinition name="ItemId_" type="string" length="72" category="identifier" primaryKey="yes"
1526 description="Reference to an entry in another table."/>
1527 <columnDefinition name="DependsOnType" type="string" length="0" primaryKey="yes" nullable="no"
1528 description="Primary key used to identify the item in another table."/>
1529 <columnDefinition name="DependsOnId_" type="string" length="72" category="identifier" primaryKey="yes"
1530 description="Reference to an entry in another table."/>
1531 </tableDefinition>
1532 <tableDefinition name="WixDeltaPatchFile" unreal="yes">
1533 <columnDefinition name="File_" type="string" length="72" primaryKey="yes" modularize="column" keyTable="File" keyColumn="1" />
1534 <columnDefinition name="RetainLengths" type="preserved" length="0" nullable="yes" category="text"/>
1535 <columnDefinition name="IgnoreOffsets" type="preserved" length="0" nullable="yes" category="text"/>
1536 <columnDefinition name="IgnoreLengths" type="preserved" length="0" nullable="yes" category="text"/>
1537 <columnDefinition name="RetainOffsets" type="preserved" length="0" nullable="yes" category="text"/>
1538 <columnDefinition name="SymbolPaths" type="preserved" length="0" nullable="yes" category="text"/>
1539 </tableDefinition>
1540 <tableDefinition name="WixDeltaPatchSymbolPaths" unreal="yes">
1541 <columnDefinition name="Id" type="string" length="72" primaryKey="yes" />
1542 <columnDefinition name="Type" type="number" length="2" primaryKey="yes" minValue="0" maxValue="4" />
1543 <columnDefinition name="SymbolPaths" type="preserved" length="0" category="text"/>
1544 </tableDefinition>
1545 <tableDefinition name="WixProperty" unreal="yes">
1546 <columnDefinition name="Property_" type="string" length="72" modularize="column"/>
1547 <columnDefinition name="Attributes" type="number" length="4"/>
1548 </tableDefinition>
1549 <tableDefinition name="WixSimpleReference" unreal="yes">
1550 <columnDefinition name="Table" type="string" length="32"/>
1551 <columnDefinition name="PrimaryKeys" type="string" length="0"/>
1552 </tableDefinition>
1553 <tableDefinition name="WixSuppressAction" unreal="yes">
1554 <columnDefinition name="SequenceTable" type="string" length="72" primaryKey="yes"/>
1555 <columnDefinition name="Action" type="string" length="72" primaryKey="yes"/>
1556 </tableDefinition>
1557 <tableDefinition name="WixSuppressModularization" unreal="yes">
1558 <columnDefinition name="WixSuppressModularization" type="string" length="72"/>
1559 </tableDefinition>
1560 <tableDefinition name="WixPatchBaseline" unreal="yes">
1561 <columnDefinition name="WixPatchBaseline" type="string" length="72" primaryKey="yes"
1562 category="identifier" description="Primary key used to identify sets of transforms in a patch."/>
1563 <columnDefinition name="DiskId" type="number" length="2"/>
1564 <columnDefinition name="ValidationFlags" type="number" length="4" category="integer" description="Patch transform validation flags for the associated patch baseline."/>
1565 </tableDefinition>
1566 <tableDefinition name="WixPatchRef" unreal="yes">
1567 <columnDefinition name="Table" type="string" length="32"/>
1568 <columnDefinition name="PrimaryKeys" type="string" length="0"/>
1569 </tableDefinition>
1570 <tableDefinition name="WixPatchId" unreal="yes">
1571 <columnDefinition name="ProductCode" type="string" length="38" nullable="no"/>
1572 <columnDefinition name="ClientPatchId" type="string" length="72" nullable="no"/>
1573 <columnDefinition name="OptimizePatchSizeForLargeFiles" type="number" length="2" nullable="yes"
1574 minValue="0" maxValue="1"/>
1575 <columnDefinition name="ApiPatchingSymbolFlags" type="number" length="4" nullable="yes"
1576 minValue="0" maxValue="7"/>
1577 </tableDefinition>
1578 <tableDefinition name="WixPatchTarget" unreal="yes">
1579 <columnDefinition name="ProductCode" type="string" length="38" nullable="no" />
1580 </tableDefinition>
1581 <tableDefinition name="WixPatchMetadata" unreal="yes">
1582 <columnDefinition name="Property" type="string" length="72" primaryKey="yes"/>
1583 <columnDefinition name="Value" type="localized" length="0"/>
1584 </tableDefinition>
1585 <tableDefinition name="WixUI" createSymbols="yes" unreal="yes">
1586 <columnDefinition name="WixUI" type="string" length="0" primaryKey="yes"/>
1587 </tableDefinition>
1588 <tableDefinition name="WixVariable" unreal="yes">
1589 <columnDefinition name="WixVariable" type="string" length="0"/>
1590 <columnDefinition name="Value" type="localized" length="0" nullable="yes"/>
1591 <columnDefinition name="Attributes" type="number" length="4"/>
1592 </tableDefinition>
1593 <tableDefinition name="WixBundleContainer" createSymbols="yes" unreal="yes">
1594 <columnDefinition name="WixBundleContainer" type="string" length="0" category="identifier" primaryKey="yes"/>
1595 <columnDefinition name="Name" type="string" length="0"/>
1596 <columnDefinition name="Type" type="number" length="2" minValue="0" maxValue="1" />
1597 <columnDefinition name="DownloadUrl" type="string" length="0" nullable="yes" />
1598 <columnDefinition name="Size" type="number" length="4" minValue="0" nullable="yes" />
1599 <columnDefinition name="Hash" type="string" length="0" nullable="yes" />
1600 <columnDefinition name="AttachedContainerIndex" type="number" length="2" nullable="yes" />
1601 <columnDefinition name="WorkingPath" type="string" length="0" nullable="yes" />
1602 </tableDefinition>
1603 <tableDefinition name="WixBundlePayloadGroup" createSymbols="yes" unreal="yes">
1604 <columnDefinition name="WixBundlePayloadGroup" type="string" length="0" category="identifier" primaryKey="yes"/>
1605 </tableDefinition>
1606 <tableDefinition name="WixBundlePayload" createSymbols="yes" unreal="yes">
1607 <columnDefinition name="WixBundlePayload" type="string" length="0" category="identifier" primaryKey="yes"/>
1608 <columnDefinition name="Name" type="string" length="0" nullable="yes"/>
1609 <columnDefinition name="SourceFile" type="object" length="0" nullable="yes"/>
1610 <columnDefinition name="DownloadUrl" type="string" length="0" nullable="yes" />
1611 <columnDefinition name="Compressed" type="number" length="2" minValue="0" maxValue="2" />
1612 <columnDefinition name="UnresolvedSourceFile" type="string" length="0" nullable="yes" />
1613 <columnDefinition name="DisplayName" type="string" length="0" nullable="yes" />
1614 <columnDefinition name="Description" type="string" length="0" nullable="yes" />
1615 <columnDefinition name="EnableSignatureValidation" type="number" length="2" nullable="yes" minValue="0" maxValue="1" />
1616 <columnDefinition name="FileSize" type="number" length="4" minValue="0" maxValue="2147483647" nullable="yes" />
1617 <columnDefinition name="Version" type="string" length="24" nullable="yes" />
1618 <columnDefinition name="Hash" type="string" length="0" nullable="yes" />
1619 <columnDefinition name="PublicKey" type="string" length="0" nullable="yes" />
1620 <columnDefinition name="Thumbprint" type="string" length="0" nullable="yes" />
1621 <columnDefinition name="Catalog_" type="string" length="0" nullable="yes" category="identifier"
1622 keyTable="WixBundleCatalog" keyColumn="1" description="Reference to a catalog entry in the WixBundleCatalog table."/>
1623 <columnDefinition name="Container_" type="string" length="0" nullable="yes"
1624 keyTable="WixBundleContainer" keyColumn="1" description="Reference to a container entry in the WixBundleContainer table."/>
1625 <columnDefinition name="Package" type="string" length="0" nullable="yes" />
1626 <columnDefinition name="ContentFile" type="number" length="2" nullable="yes" minValue="0" maxValue="1" />
1627 <columnDefinition name="EmbeddedId" type="string" length="0" nullable="yes" />
1628 <columnDefinition name="LayoutOnly" type="number" length="2" nullable="yes" minValue="0" maxValue="1" />
1629 <columnDefinition name="Packaging" type="number" length="2" nullable="yes" minValue="1" maxValue="2" />
1630 <columnDefinition name="ParentPackagePayload_" type="string" length="0" nullable="yes" />
1631 </tableDefinition>
1632 <tableDefinition name="WixBundlePatchTargetCode" createSymbols="yes" unreal="yes">
1633 <columnDefinition name="PackageId" type="string" length="0" category="identifier" primaryKey="yes" />
1634 <columnDefinition name="TargetCode" type="string" length="0" nullable="yes" primaryKey="yes" />
1635 <columnDefinition name="Attributes" type="number" length="4" nullable="yes" minValue="0" maxValue="2147483647" />
1636 </tableDefinition>
1637 <tableDefinition name="WixBundle" unreal="yes">
1638 <columnDefinition name="Version" type="string" length="24" />
1639 <columnDefinition name="Copyright" type="string" length="0" nullable="yes" />
1640 <columnDefinition name="Name" type="string" length="0" nullable="yes" />
1641 <columnDefinition name="AboutUrl" type="string" length="0" nullable="yes" />
1642 <columnDefinition name="DisableModify" type="number" length="2" nullable="yes" minValue="0" maxValue="2"/>
1643 <columnDefinition name="DisableRemove" type="number" length="2" nullable="yes" minValue="0" maxValue="1"/>
1644 <columnDefinition name="DisableRepair" type="number" length="2" nullable="yes" minValue="0" maxValue="1"/>
1645 <columnDefinition name="HelpTelephone" type="string" length="0" nullable="yes" />
1646 <columnDefinition name="HelpUrl" type="string" length="0" nullable="yes" />
1647 <columnDefinition name="Manufacturer" type="string" length="0" nullable="yes" />
1648 <columnDefinition name="UpdateUrl" type="string" length="0" nullable="yes" />
1649 <columnDefinition name="Compressed" type="number" length="2" nullable="yes" minValue="0" maxValue="1" />
1650 <columnDefinition name="LogPrefixAndExtension" type="string" length="0" nullable="yes" />
1651 <columnDefinition name="IconSourceFile" type="object" length="0" nullable="yes" />
1652 <columnDefinition name="SplashScreenSourceFile" type="object" length="0" nullable="yes" />
1653 <columnDefinition name="Condition" type="string" length="0" nullable="yes" />
1654 <columnDefinition name="Tag" type="string" length="0" nullable="yes" />
1655 <columnDefinition name="Platform" type="string" length="4" />
1656 <columnDefinition name="ParentName" type="string" length="0" nullable="yes" />
1657 <columnDefinition name="UpgradeCode" type="string" length="38" category="guid" />
1658 <columnDefinition name="BundleId" type="string" length="38" category="guid" description="Only valid after binding." />
1659 <columnDefinition name="ProviderKey" type="string" length="38" category="guid" nullable="yes" description="Only valid after binding." />
1660 <columnDefinition name="PerMachine" type="number" length="2" nullable="yes" minValue="0" maxValue="1" description="Only valid after binding." />
1661 </tableDefinition>
1662 <tableDefinition name="WixApprovedExeForElevation" createSymbols="yes" unreal="yes">
1663 <columnDefinition name="Id" type="string" length="0" category="identifier" primaryKey="yes" />
1664 <columnDefinition name="Key" type="string" length="0" />
1665 <columnDefinition name="Value" type="string" length="0" nullable="yes" />
1666 <columnDefinition name="Attributes" type="number" length="4" minValue="0" maxValue="1" />
1667 </tableDefinition>
1668 <tableDefinition name="WixBundleUpdate" unreal="yes">
1669 <columnDefinition name="Location" type="string" length="0" />
1670 <columnDefinition name="Attributes" type="number" length="4" nullable="yes" />
1671 </tableDefinition>
1672 <tableDefinition name="WixBootstrapperApplication" createSymbols="yes" unreal="yes">
1673 <columnDefinition name="Id" type="string" length="0" category="identifier" primaryKey="yes"/>
1674 </tableDefinition>
1675 <tableDefinition name="WixUpdateRegistration" unreal="yes">
1676 <columnDefinition name="Manufacturer" type="string" length="0" />
1677 <columnDefinition name="Department" type="string" length="0" nullable="yes" />
1678 <columnDefinition name="ProductFamily" type="string" length="0" nullable="yes" />
1679 <columnDefinition name="Name" type="string" length="0" />
1680 <columnDefinition name="Classification" type="string" length="0" />
1681 </tableDefinition>
1682 <tableDefinition name="WixBundleCatalog" createSymbols="yes" unreal="yes">
1683 <columnDefinition name="WixBundleCatalog" type="string" length="0" category="identifier" primaryKey="yes"/>
1684 <columnDefinition name="Payload_" type="string" length="0" category="identifier"
1685 keyTable="WixBundlePayload" keyColumn="1" description="Reference to a payload entry in the WixBundlePayload table." />
1686 </tableDefinition>
1687 <tableDefinition name="WixChain" unreal="yes">
1688 <columnDefinition name="Attributes" type="number" length="4" nullable="no" minValue="0" maxValue="2147483647" description="A 32-bit word that specifies the attribute flags to be applied to the chain."/>
1689 </tableDefinition>
1690 <tableDefinition name="WixChainItem" createSymbols="yes" unreal="yes">
1691 <columnDefinition name="Id" type="string" length="0" category="identifier" primaryKey="yes"/>
1692 </tableDefinition>
1693 <tableDefinition name="WixBundleRollbackBoundary" createSymbols="yes" unreal="yes">
1694 <columnDefinition name="WixChainItem_" type="string" length="0" category="identifier" primaryKey="yes"
1695 keyTable="WixChainItem" keyColumn="1" description="Reference to a WixChainItem entry in the WixChainItem table."/>
1696 <columnDefinition name="Vital" type="number" length="2" nullable="yes" minValue="0" maxValue="1"/>
1697 <columnDefinition name="Transaction" type="number" length="2" nullable="yes" minValue="0" maxValue="1"/>
1698 </tableDefinition>
1699 <tableDefinition name="WixBundlePackageGroup" createSymbols="yes" unreal="yes">
1700 <columnDefinition name="WixBundlePackageGroup" type="string" length="0" category="identifier" primaryKey="yes"/>
1701 </tableDefinition>
1702 <tableDefinition name="WixBundlePackage" createSymbols="yes" unreal="yes">
1703 <columnDefinition name="WixChainItem_" type="string" length="0" category="identifier" primaryKey="yes"
1704 keyTable="WixChainItem" keyColumn="1" description="Reference to a WixChainItem entry in the WixChainItem table."/>
1705 <columnDefinition name="Type" type="number" length="2" minValue="0" maxValue="3" />
1706 <columnDefinition name="Payload_" type="string" length="0" category="identifier"
1707 keyTable="WixBundlePayload" keyColumn="1" description="Reference to a payload entry in the WixBundlePayload table."/>
1708 <columnDefinition name="Attributes" type="number" length="4" nullable="no" minValue="0" maxValue="2147483647" description="A 32-bit word that specifies the attribute flags to be applied to this package."/>
1709 <columnDefinition name="InstallCondition" type="string" length="0" nullable="yes"/>
1710 <columnDefinition name="Cache" type="number" length="2" nullable="yes" minValue="0" maxValue="2"/>
1711 <columnDefinition name="CacheId" type="string" length="0" nullable="yes"/>
1712 <columnDefinition name="Vital" type="number" length="2" nullable="yes" minValue="0" maxValue="1"/>
1713 <columnDefinition name="PerMachine" type="number" length="2" nullable="yes" minValue="0" maxValue="2"/>
1714 <columnDefinition name="LogPathVariable" type="string" length="0" nullable="yes"/>
1715 <columnDefinition name="RollbackLogPathVariable" type="string" length="0" nullable="yes"/>
1716 <columnDefinition name="Size" type="number" length="4"/>
1717 <columnDefinition name="InstallSize" type="number" length="4"/>
1718 <columnDefinition name="Version" type="string" length="24" category="version" nullable="yes" />
1719 <columnDefinition name="Language" type="number" length="2" nullable="yes" />
1720 <columnDefinition name="DisplayName" type="string" length="0" nullable="yes" />
1721 <columnDefinition name="Description" type="string" length="0" nullable="yes" />
1722 <columnDefinition name="RollbackBoundary_" type="string" length="0" nullable="yes"
1723 keyTable="WixBundleRollbackBoundary" keyColumn="1" description="Reference to a rollback boundary entry in the WixBundleRollbackBoundary table."/>
1724 <columnDefinition name="RollbackBoundaryBackward_" type="string" length="0" nullable="yes"
1725 keyTable="WixBundleRollbackBoundary" keyColumn="1" description="Reference to a rollback boundary entry in the WixBundleRollbackBoundary table."/>
1726 <columnDefinition name="x64" type="number" length="2" nullable="yes" minValue="0" maxValue="1"/>
1727 </tableDefinition>
1728 <tableDefinition name="WixBundleExePackage" createSymbols="yes" unreal="yes">
1729 <columnDefinition name="WixBundlePackage_" type="string" length="0" category="identifier" primaryKey="yes"
1730 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table."/>
1731 <columnDefinition name="Attributes" type="number" length="4" nullable="no" minValue="0" maxValue="2147483647" description="A 32-bit word that specifies the attribute flags to be applied to this MSI package."/>
1732 <columnDefinition name="DetectCondition" type="string" length="0" nullable="yes"/>
1733 <columnDefinition name="InstallCommand" type="string" length="0" nullable="yes"/>
1734 <columnDefinition name="RepairCommand" type="string" length="0" nullable="yes"/>
1735 <columnDefinition name="UninstallCommand" type="string" length="0" nullable="yes"/>
1736 <columnDefinition name="ExeProtocol" type="string" length="0" nullable="yes"/>
1737 </tableDefinition>
1738 <tableDefinition name="WixBundleMsiPackage" createSymbols="yes" unreal="yes">
1739 <columnDefinition name="WixBundlePackage_" type="string" length="0" category="identifier" primaryKey="yes"
1740 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table."/>
1741 <columnDefinition name="Attributes" type="number" length="4" nullable="no" minValue="0" maxValue="2147483647" description="A 32-bit word that specifies the attribute flags to be applied to this MSI package."/>
1742 <columnDefinition name="ProductCode" type="string" length="38" category="guid" />
1743 <columnDefinition name="UpgradeCode" type="string" length="38" category="guid" nullable="yes" />
1744 <columnDefinition name="ProductVersion" type="string" length="20" />
1745 <columnDefinition name="ProductLanguage" type="number" length="2" />
1746 <columnDefinition name="ProductName" type="string" length="0" />
1747 <columnDefinition name="Manufacturer" type="string" length="0" nullable="yes" />
1748 </tableDefinition>
1749 <tableDefinition name="WixBundleMspPackage" createSymbols="yes" unreal="yes">
1750 <columnDefinition name="WixBundlePackage_" type="string" length="0" category="identifier" primaryKey="yes"
1751 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table."/>
1752 <columnDefinition name="Attributes" type="number" length="2" nullable="yes" minValue="0" maxValue="1" />
1753 <columnDefinition name="PatchCode" type="string" length="38" category="guid" nullable="yes" />
1754 <columnDefinition name="Manufacturer" type="string" length="0" nullable="yes" />
1755 <columnDefinition name="PatchXml" type="string" length="0" nullable="yes" />
1756 </tableDefinition>
1757 <tableDefinition name="WixBundleMsuPackage" createSymbols="yes" unreal="yes">
1758 <columnDefinition name="WixBundlePackage_" type="string" length="0" category="identifier" primaryKey="yes"
1759 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table."/>
1760 <columnDefinition name="DetectCondition" type="string" length="0" nullable="yes"/>
1761 <columnDefinition name="MsuKB" type="string" length="0" nullable="yes"/>
1762 </tableDefinition>
1763 <tableDefinition name="WixBundlePackageExitCode" createSymbols="yes" unreal="yes">
1764 <columnDefinition name="WixBundlePackage_" type="string" length="0" category="identifier" primaryKey="yes"
1765 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table for the parent Exe."/>
1766 <columnDefinition name="Code" type="number" length="0" category="integer" nullable="yes" primaryKey="yes" />
1767 <columnDefinition name="Behavior" type="number" length="2" category="integer" minValue="0" maxValue="3" />
1768 </tableDefinition>
1769 <tableDefinition name="WixBundleMsiFeature" createSymbols="yes" unreal="yes">
1770 <columnDefinition name="WixBundlePackage_" type="string" length="0" category="identifier" primaryKey="yes"
1771 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table."/>
1772 <columnDefinition name="Name" type="string" length="0" category="identifier" primaryKey="yes" />
1773 <columnDefinition name="Size" type="number" length="4" />
1774 <columnDefinition name="Parent" type="string" length="0" />
1775 <columnDefinition name="Title" type="string" length="0" />
1776 <columnDefinition name="Description" type="string" length="0" />
1777 <columnDefinition name="Display" type="number" length="2" />
1778 <columnDefinition name="Level" type="number" length="2" />
1779 <columnDefinition name="Directory" type="string" length="0" />
1780 <columnDefinition name="Attributes" type="number" length="2" />
1781 </tableDefinition>
1782 <tableDefinition name="WixBundleMsiProperty" createSymbols="yes" unreal="yes">
1783 <columnDefinition name="WixBundlePackage_" type="string" length="0" category="identifier" primaryKey="yes"
1784 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table."/>
1785 <columnDefinition name="Name" type="string" length="0" category="identifier" primaryKey="yes" />
1786 <columnDefinition name="Value" type="string" length="0" />
1787 <columnDefinition name="Condition" type="string" length="0" nullable="yes" />
1788 </tableDefinition>
1789 <tableDefinition name="WixBundleSlipstreamMsp" createSymbols="yes" unreal="yes">
1790 <columnDefinition name="WixBundlePackage_" type="string" length="0" category="identifier" primaryKey="yes"
1791 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table for the parent Msi."/>
1792 <columnDefinition name="WixBundlePackage_Msp" type="string" length="0" category="identifier" primaryKey="yes"
1793 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table for the referenced Msp." />
1794 </tableDefinition>
1795 <tableDefinition name="WixBundlePackageCommandLine" createSymbols="yes" unreal="yes">
1796 <columnDefinition name="WixBundlePackage_" type="string" length="0" category="identifier" primaryKey="yes"
1797 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table." />
1798 <columnDefinition name="InstallArgument" type="string" length="0" nullable="yes" />
1799 <columnDefinition name="UninstallArgument" type="string" length="0" nullable="yes" />
1800 <columnDefinition name="RepairArgument" type="string" length="0" nullable="yes" />
1801 <columnDefinition name="Condition" type="string" length="0" nullable="yes" />
1802 </tableDefinition>
1803 <tableDefinition name="WixRelatedBundle" unreal="yes">
1804 <columnDefinition name="Id" type="string" length="38" category="guid" primaryKey="yes" />
1805 <columnDefinition name="Action" type="number" length="4" />
1806 </tableDefinition>
1807 <tableDefinition name="WixBundleRelatedPackage" unreal="yes">
1808 <columnDefinition name="WixBundlePackage_" type="string" length="0" category="identifier" primaryKey="yes"
1809 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table."/>
1810 <columnDefinition name="Id" type="string" length="0" category="identifier" primaryKey="yes" />
1811 <columnDefinition name="MinVersion" type="string" length="0" />
1812 <columnDefinition name="MaxVersion" type="string" length="0" />
1813 <columnDefinition name="Languages" type="string" length="0" />
1814 <columnDefinition name="MinInclusive" type="number" length="2" minValue="0" maxValue="1"/>
1815 <columnDefinition name="MaxInclusive" type="number" length="2" minValue="0" maxValue="1"/>
1816 <columnDefinition name="LangInclusive" type="number" length="2" minValue="0" maxValue="1"/>
1817 <columnDefinition name="OnlyDetect" type="number" length="2" minValue="0" maxValue="1"/>
1818 </tableDefinition>
1819 <tableDefinition name="WixBundleVariable" createSymbols="yes" unreal="yes">
1820 <columnDefinition name="WixBundleVariable" type="string" length="0" category="identifier" primaryKey="yes" />
1821 <columnDefinition name="Value" type="string" length="0" nullable="yes" />
1822 <columnDefinition name="Type" type="string" length="0" nullable="yes" />
1823 <columnDefinition name="Hidden" type="number" length="2" minValue="0" maxValue="1"/>
1824 <columnDefinition name="Persisted" type="number" length="2" minValue="0" maxValue="1"/>
1825 </tableDefinition>
1826 <tableDefinition name="WixBundleProperties" unreal="yes" bootstrapperApplicationData="yes">
1827 <columnDefinition name="DisplayName" type="string" length="0" nullable="yes"/>
1828 <columnDefinition name="LogPathVariable" type="string" length="0" nullable="yes"/>
1829 <columnDefinition name="Compressed" type="string" length="0" nullable="yes"/>
1830 <columnDefinition name="Id" type="string" length="0" nullable="yes"/>
1831 <columnDefinition name="UpgradeCode" type="string" length="0" nullable="yes"/>
1832 <columnDefinition name="PerMachine" type="string" length="0" nullable="yes"/>
1833 </tableDefinition>
1834 <tableDefinition name="WixPackageFeatureInfo" unreal="yes" bootstrapperApplicationData="yes">
1835 <columnDefinition name="Package" type="string" length="0" />
1836 <columnDefinition name="Feature" type="string" length="0" />
1837 <columnDefinition name="Size" type="string" length="0" />
1838 <columnDefinition name="Parent" type="string" length="0" nullable="yes" />
1839 <columnDefinition name="Title" type="string" length="0" nullable="yes" />
1840 <columnDefinition name="Description" type="string" length="0" nullable="yes" />
1841 <columnDefinition name="Display" type="string" length="0" nullable="yes" />
1842 <columnDefinition name="Level" type="string" length="0" />
1843 <columnDefinition name="Directory" type="string" length="0" nullable="yes"/>
1844 <columnDefinition name="Attributes" type="string" length="0" />
1845 </tableDefinition>
1846 <tableDefinition name="WixPackageProperties" unreal="yes" bootstrapperApplicationData="yes">
1847 <columnDefinition name="Package" type="string" length="0" category="identifier" primaryKey="yes"
1848 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table."/>
1849 <columnDefinition name="Vital" type="string" length="0" nullable="yes" minValue="0" maxValue="1" />
1850 <columnDefinition name="DisplayName" type="string" length="0" nullable="yes"/>
1851 <columnDefinition name="Description" type="string" length="0" nullable="yes"/>
1852 <columnDefinition name="DownloadSize" type="string" length="0" nullable="yes"/>
1853 <columnDefinition name="PackageSize" type="string" length="0" nullable="yes"/>
1854 <columnDefinition name="InstalledSize" type="string" length="0" nullable="yes"/>
1855 <columnDefinition name="PackageType" type="string" length="0" nullable="no"/>
1856 <columnDefinition name="Permanent" type="string" length="0" nullable="yes"/>
1857 <columnDefinition name="LogPathVariable" type="string" length="0" nullable="yes"/>
1858 <columnDefinition name="RollbackLogPathVariable" type="string" length="0" nullable="yes"/>
1859 <columnDefinition name="Compressed" type="string" length="0" nullable="yes"/>
1860 <columnDefinition name="DisplayInternalUI" type="string" length="0" nullable="yes"/>
1861 <columnDefinition name="ProductCode" type="string" length="0" nullable="yes"/>
1862 <columnDefinition name="UpgradeCode" type="string" length="0" nullable="yes"/>
1863 <columnDefinition name="Version" type="string" length="0" nullable="yes"/>
1864 <columnDefinition name="InstallCondition" type="string" length="0" nullable="yes" />
1865 <columnDefinition name="Cache" type="string" length="0" nullable="yes" minValue="0" maxValue="2" />
1866 </tableDefinition>
1867 <tableDefinition name="WixPayloadProperties" unreal="yes" bootstrapperApplicationData="yes">
1868 <columnDefinition name="Payload" type="string" length="0" category="identifier" primaryKey="yes" />
1869 <columnDefinition name="Package" type="string" length="0" category="identifier" primaryKey="yes" nullable="yes"
1870 keyTable="WixBundlePackage" keyColumn="1" description="Reference to a chain package entry in the WixBundlePackage table."/>
1871 <columnDefinition name="Container" type="string" length="0" nullable="yes"
1872 keyTable="WixBundleContainer" keyColumn="1" description="Reference to a container entry in the WixBundleContainer table."/>
1873 <columnDefinition name="Name" type="string" length="0" />
1874 <columnDefinition name="Size" type="string" length="0" />
1875 <columnDefinition name="DownloadUrl" type="string" length="0" nullable="yes" />
1876 <columnDefinition name="LayoutOnly" type="string" length="3" nullable="no" />
1877 </tableDefinition>
1878 <tableDefinition name="_Streams" unreal="yes">
1879 <columnDefinition name="Name" type="string" length="62" primaryKey="yes"/>
1880 <columnDefinition name="Data" type="object" length="0" nullable="yes"/>
1881 </tableDefinition>
1882 <tableDefinition name="_SummaryInformation">
1883 <columnDefinition name="PropertyId" type="number" length="2" primaryKey="yes"/>
1884 <columnDefinition name="Value" type="localized" length="255" escapeIdtCharacters="yes"/>
1885 </tableDefinition>
1886 <tableDefinition name="_TransformView" unreal="yes">
1887 <columnDefinition name="Table" type="string" length="0" primaryKey="yes"/>
1888 <columnDefinition name="Column" type="string" length="0" primaryKey="yes"/>
1889 <columnDefinition name="Row" type="string" length="0"/>
1890 <columnDefinition name="Data" type="string" length="0"/>
1891 <columnDefinition name="Current" type="string" length="0"/>
1892 </tableDefinition>
1893 <tableDefinition name="_Validation">
1894 <columnDefinition name="Table" type="string" length="32" primaryKey="yes"
1895 category="identifier" description="Name of table"/>
1896 <columnDefinition name="Column" type="string" length="32" primaryKey="yes"
1897 category="identifier" description="Name of column"/>
1898 <columnDefinition name="Nullable" type="string" length="4"
1899 set="Y;N" description="Whether the column is nullable"/>
1900 <columnDefinition name="MinValue" type="number" length="4" nullable="yes"
1901 minValue="-2147483647" maxValue="2147483647" description="Minimum value allowed"/>
1902 <columnDefinition name="MaxValue" type="number" length="4" nullable="yes"
1903 minValue="-2147483647" maxValue="2147483647" description="Maximum value allowed"/>
1904 <columnDefinition name="KeyTable" type="string" length="255" nullable="yes"
1905 category="identifier" description="For foreign key, Name of table to which data must link"/>
1906 <columnDefinition name="KeyColumn" type="number" length="2" nullable="yes"
1907 minValue="1" maxValue="32" description="Column to which foreign key connects"/>
1908 <columnDefinition name="Category" type="string" length="32" nullable="yes"
1909 set="Text;Formatted;Template;Condition;Guid;Path;Version;Language;Identifier;Binary;UpperCase;LowerCase;Filename;Paths;AnyPath;WildCardFilename;RegPath;CustomSource;Property;Cabinet;Shortcut;FormattedSDDLText;Integer;DoubleInteger;TimeDate;DefaultDir" description="String category"/>
1910 <columnDefinition name="Set" type="string" length="255" nullable="yes"
1911 category="text" description="Set of values that are permitted"/>
1912 <columnDefinition name="Description" type="string" length="255" nullable="yes"
1913 category="text" description="Description of column"/>
1914 </tableDefinition>
1915 <!-- WixSearch tables are used by multiple extensions and binder knows about them. -->
1916 <tableDefinition name="WixSearch" createSymbols="yes" unreal="yes">
1917 <columnDefinition name="WixSearch" type="string" length="72" category="identifier" primaryKey="yes" />
1918 <columnDefinition name="Variable" type="string" length="72" category="identifier" nullable="yes" />
1919 <columnDefinition name="Condition" type="string" length="255" category="condition" nullable="yes" />
1920 </tableDefinition>
1921 <tableDefinition name="WixSearchRelation" createSymbols="yes" unreal="yes">
1922 <columnDefinition name="WixSearch_" type="string" length="72" category="identifier" primaryKey="yes"
1923 keyTable="WixSearch" keyColumn="1" description="Reference to a WixSearch entry in the WixSearch table."/>
1924 <columnDefinition name="ParentId_" type="string" length="72" category="identifier" primaryKey="yes"
1925 keyTable="WixSearch" keyColumn="1" description="Reference to a WixSearch entry in the WixSearch table."/>
1926 <columnDefinition name="Attributes" type="number" length="4" category="doubleInteger" />
1927 </tableDefinition>
1928 <tableDefinition name="WixFileSearch" createSymbols="yes" unreal="yes">
1929 <columnDefinition name="WixSearch_" type="string" length="72" category="identifier" primaryKey="yes"
1930 keyTable="WixSearch" keyColumn="1" description="Reference to a WixSearch entry in the WixSearch table."/>
1931 <columnDefinition name="Path" type="string" category="text" length="255" />
1932 <columnDefinition name="MinVersion" type="string" length="24" category="version" nullable="yes" />
1933 <columnDefinition name="MaxVersion" type="string" length="24" category="version" nullable="yes" />
1934 <columnDefinition name="MinSize" type="number" length="4" category="doubleInteger" nullable="yes" />
1935 <columnDefinition name="MaxSize" type="number" length="4" category="doubleInteger" nullable="yes" />
1936 <columnDefinition name="MinDate" type="number" length="4" category="doubleInteger" nullable="yes" />
1937 <columnDefinition name="MaxDate" type="number" length="4" category="doubleInteger" nullable="yes" />
1938 <columnDefinition name="Languages" type="string" category="text" length="0" nullable="yes" />
1939 <columnDefinition name="Attributes" type="number" length="4" category="doubleInteger" />
1940 </tableDefinition>
1941 <tableDefinition name="WixRegistrySearch" createSymbols="yes" unreal="yes">
1942 <columnDefinition name="WixSearch_" type="string" length="72" category="identifier" primaryKey="yes"
1943 keyTable="WixSearch" keyColumn="1" description="Reference to a WixSearch entry in the WixSearch table."/>
1944 <columnDefinition name="Root" type="number" length="2" category="doubleInteger" />
1945 <columnDefinition name="Key" type="string" category="text" length="255" />
1946 <columnDefinition name="Value" type="string" category="text" length="255" nullable="yes" />
1947 <columnDefinition name="Attributes" type="number" length="4" category="doubleInteger" />
1948 </tableDefinition>
1949 <tableDefinition name="WixComponentSearch" createSymbols="yes" unreal="yes">
1950 <columnDefinition name="WixSearch_" type="string" length="72" category="identifier" primaryKey="yes"
1951 keyTable="WixSearch" keyColumn="1" description="Reference to a WixSearch entry in the WixSearch table."/>
1952 <columnDefinition name="Guid" type="string" length="38" category="guid" />
1953 <columnDefinition name="ProductCode" type="string" length="38" category="guid" nullable="yes" />
1954 <columnDefinition name="Attributes" type="number" length="4" category="doubleInteger" />
1955 </tableDefinition>
1956 <tableDefinition name="WixProductSearch" createSymbols="yes" unreal="yes">
1957 <columnDefinition name="WixSearch_" type="string" length="72" category="identifier" primaryKey="yes"
1958 keyTable="WixSearch" keyColumn="1" description="Reference to a WixSearch entry in the WixSearch table."/>
1959 <columnDefinition name="Guid" type="string" length="38" category="guid" />
1960 <columnDefinition name="Attributes" type="number" length="4" category="doubleInteger" />
1961 </tableDefinition>
1962</tableDefinitions>
diff --git a/src/WixToolset.Core.WindowsInstaller/Differ.cs b/src/WixToolset.Core.WindowsInstaller/Differ.cs
index bdd06d32..9bbde302 100644
--- a/src/WixToolset.Core.WindowsInstaller/Differ.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Differ.cs
@@ -1,14 +1,14 @@
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. 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 2
3namespace WixToolset 3namespace WixToolset.Core.WindowsInstaller
4{ 4{
5 using System; 5 using System;
6 using System.Collections; 6 using System.Collections;
7 using System.Collections.Generic; 7 using System.Collections.Generic;
8 using System.Globalization; 8 using System.Globalization;
9 using WixToolset.Core;
10 using WixToolset.Data; 9 using WixToolset.Data;
11 using WixToolset.Data.Rows; 10 using WixToolset.Data.WindowsInstaller;
11 using WixToolset.Data.WindowsInstaller.Rows;
12 using WixToolset.Extensibility; 12 using WixToolset.Extensibility;
13 using WixToolset.Msi; 13 using WixToolset.Msi;
14 14
diff --git a/src/WixToolset.Core.WindowsInstaller/Inscribe/InscribeMsiPackageCommand.cs b/src/WixToolset.Core.WindowsInstaller/Inscribe/InscribeMsiPackageCommand.cs
index 58384325..5c56d9aa 100644
--- a/src/WixToolset.Core.WindowsInstaller/Inscribe/InscribeMsiPackageCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Inscribe/InscribeMsiPackageCommand.cs
@@ -9,7 +9,9 @@ namespace WixToolset.Core.WindowsInstaller.Inscribe
9 using System.Runtime.InteropServices; 9 using System.Runtime.InteropServices;
10 using System.Security.Cryptography.X509Certificates; 10 using System.Security.Cryptography.X509Certificates;
11 using WixToolset.Core.Native; 11 using WixToolset.Core.Native;
12 using WixToolset.Core.WindowsInstaller.Bind;
12 using WixToolset.Data; 13 using WixToolset.Data;
14 using WixToolset.Data.WindowsInstaller;
13 using WixToolset.Extensibility; 15 using WixToolset.Extensibility;
14 using WixToolset.Msi; 16 using WixToolset.Msi;
15 17
@@ -250,13 +252,19 @@ namespace WixToolset.Core.WindowsInstaller.Inscribe
250 252
251 if (digitalCertificateTable.Rows.Count > 0) 253 if (digitalCertificateTable.Rows.Count > 0)
252 { 254 {
253 database.ImportTable(codepage, digitalCertificateTable, this.Context.IntermediateFolder, true); 255 var command = new CreateIdtFileCommand(digitalCertificateTable, codepage, this.Context.IntermediateFolder, true);
256 command.Execute();
257
258 database.Import(command.IdtPath);
254 shouldCommit = true; 259 shouldCommit = true;
255 } 260 }
256 261
257 if (digitalSignatureTable.Rows.Count > 0) 262 if (digitalSignatureTable.Rows.Count > 0)
258 { 263 {
259 database.ImportTable(codepage, digitalSignatureTable, this.Context.IntermediateFolder, true); 264 var command = new CreateIdtFileCommand(digitalSignatureTable, codepage, this.Context.IntermediateFolder, true);
265 command.Execute();
266
267 database.Import(command.IdtPath);
260 shouldCommit = true; 268 shouldCommit = true;
261 } 269 }
262 270
diff --git a/src/WixToolset.Core.WindowsInstaller/Msi/Database.cs b/src/WixToolset.Core.WindowsInstaller/Msi/Database.cs
index 801ebdde..ccb0e6cf 100644
--- a/src/WixToolset.Core.WindowsInstaller/Msi/Database.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Msi/Database.cs
@@ -3,13 +3,11 @@
3namespace WixToolset.Msi 3namespace WixToolset.Msi
4{ 4{
5 using System; 5 using System;
6 using System.ComponentModel;
7 using System.Globalization; 6 using System.Globalization;
8 using System.IO; 7 using System.IO;
9 using System.Text;
10 using System.Threading; 8 using System.Threading;
11 using WixToolset.Data;
12 using WixToolset.Core.Native; 9 using WixToolset.Core.Native;
10 using WixToolset.Data;
13 11
14 /// <summary> 12 /// <summary>
15 /// Wrapper class for managing MSI API database handles. 13 /// Wrapper class for managing MSI API database handles.
@@ -25,8 +23,7 @@ namespace WixToolset.Msi
25 /// <param name="type">Persist mode to use when opening the database.</param> 23 /// <param name="type">Persist mode to use when opening the database.</param>
26 public Database(string path, OpenDatabase type) 24 public Database(string path, OpenDatabase type)
27 { 25 {
28 uint handle = 0; 26 int error = MsiInterop.MsiOpenDatabase(path, new IntPtr((int)type), out var handle);
29 int error = MsiInterop.MsiOpenDatabase(path, new IntPtr((int)type), out handle);
30 if (0 != error) 27 if (0 != error)
31 { 28 {
32 throw new MsiException(error); 29 throw new MsiException(error);
@@ -153,9 +150,9 @@ namespace WixToolset.Msi
153 /// <param name="fileName">Specifies the name of the exported table archive file.</param> 150 /// <param name="fileName">Specifies the name of the exported table archive file.</param>
154 public void Export(string tableName, string folderPath, string fileName) 151 public void Export(string tableName, string folderPath, string fileName)
155 { 152 {
156 if (null == folderPath || 0 == folderPath.Length) 153 if (String.IsNullOrEmpty(folderPath))
157 { 154 {
158 folderPath = System.Environment.CurrentDirectory; 155 folderPath = Environment.CurrentDirectory;
159 } 156 }
160 157
161 int error = MsiInterop.MsiDatabaseExport(this.Handle, tableName, folderPath, fileName); 158 int error = MsiInterop.MsiDatabaseExport(this.Handle, tableName, folderPath, fileName);
@@ -241,63 +238,13 @@ namespace WixToolset.Msi
241 /// primary key columns for a specified table.</returns> 238 /// primary key columns for a specified table.</returns>
242 public Record PrimaryKeys(string tableName) 239 public Record PrimaryKeys(string tableName)
243 { 240 {
244 uint recordHandle; 241 var error = MsiInterop.MsiDatabaseGetPrimaryKeys(this.Handle, tableName, out var recordHandle);
245 int error = MsiInterop.MsiDatabaseGetPrimaryKeys(this.Handle, tableName, out recordHandle); 242 if (error != 0)
246 if (0 != error)
247 { 243 {
248 throw new MsiException(error); 244 throw new MsiException(error);
249 } 245 }
250 246
251 return new Record(recordHandle); 247 return new Record(recordHandle);
252 } 248 }
253
254 /// <summary>
255 /// Imports a table into the database.
256 /// </summary>
257 /// <param name="codepage">Codepage of the database to import table to.</param>
258 /// <param name="table">Table to import into database.</param>
259 /// <param name="baseDirectory">The base directory where intermediate files are created.</param>
260 /// <param name="keepAddedColumns">Whether to keep columns added in a transform.</param>
261 public void ImportTable(int codepage, Table table, string baseDirectory, bool keepAddedColumns)
262 {
263 // write out the table to an IDT file
264 string idtPath = Path.Combine(baseDirectory, String.Concat(table.Name, ".idt"));
265 Encoding encoding;
266
267 // If UTF8 encoding, use the UTF8-specific constructor to avoid writing
268 // the byte order mark at the beginning of the file
269 if (Encoding.UTF8.CodePage == codepage)
270 {
271 encoding = new UTF8Encoding(false, true);
272 }
273 else
274 {
275 if (0 == codepage)
276 {
277 codepage = Encoding.ASCII.CodePage;
278 }
279
280 encoding = Encoding.GetEncoding(codepage, new EncoderExceptionFallback(), new DecoderExceptionFallback());
281 }
282
283 using (StreamWriter idtWriter = new StreamWriter(idtPath, false, encoding))
284 {
285 table.ToIdtDefinition(idtWriter, keepAddedColumns);
286 }
287
288 // try to import the table into the MSI
289 try
290 {
291 this.Import(idtPath);
292 }
293 catch (WixInvalidIdtException)
294 {
295 table.ValidateRows();
296
297 // If ValidateRows finds anything it doesn't like, it throws. Otherwise, we'll
298 // throw WixInvalidIdtException here which is caught in light and turns off tidy.
299 throw new WixInvalidIdtException(idtPath, table.Name);
300 }
301 }
302 } 249 }
303} 250}
diff --git a/src/WixToolset.Core.WindowsInstaller/Msi/WixInvalidIdtException.cs b/src/WixToolset.Core.WindowsInstaller/Msi/WixInvalidIdtException.cs
new file mode 100644
index 00000000..a603d5a7
--- /dev/null
+++ b/src/WixToolset.Core.WindowsInstaller/Msi/WixInvalidIdtException.cs
@@ -0,0 +1,33 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Msi
4{
5 using System;
6 using WixToolset.Data;
7
8 /// <summary>
9 /// WiX invalid idt exception.
10 /// </summary>
11 [Serializable]
12 public sealed class WixInvalidIdtException : WixException
13 {
14 /// <summary>
15 /// Instantiate a new WixInvalidIdtException.
16 /// </summary>
17 /// <param name="idtFile">The invalid idt file.</param>
18 public WixInvalidIdtException(string idtFile) :
19 base(WixDataErrors.InvalidIdt(new SourceLineNumber(idtFile), idtFile))
20 {
21 }
22
23 /// <summary>
24 /// Instantiate a new WixInvalidIdtException.
25 /// </summary>
26 /// <param name="idtFile">The invalid idt file.</param>
27 /// <param name="tableName">The table name of the invalid idt file.</param>
28 public WixInvalidIdtException(string idtFile, string tableName) :
29 base(WixDataErrors.InvalidIdt(new SourceLineNumber(idtFile), idtFile, tableName))
30 {
31 }
32 }
33}
diff --git a/src/WixToolset.Core.WindowsInstaller/MsiBackend.cs b/src/WixToolset.Core.WindowsInstaller/MsiBackend.cs
index 2590c14f..4753677a 100644
--- a/src/WixToolset.Core.WindowsInstaller/MsiBackend.cs
+++ b/src/WixToolset.Core.WindowsInstaller/MsiBackend.cs
@@ -14,12 +14,26 @@ namespace WixToolset.Core.WindowsInstaller
14 { 14 {
15 public BindResult Bind(IBindContext context) 15 public BindResult Bind(IBindContext context)
16 { 16 {
17 var backendExtensions = context.ExtensionManager.Create<IWindowsInstallerBackendExtension>();
18
19 foreach (var extension in backendExtensions)
20 {
21 extension.PreBackendBind(context);
22 }
23
17 var validator = Validator.CreateFromContext(context, "darice.cub"); 24 var validator = Validator.CreateFromContext(context, "darice.cub");
18 25
19 var command = new BindDatabaseCommand(context, validator); 26 var command = new BindDatabaseCommand(context, backendExtensions, validator);
20 command.Execute(); 27 command.Execute();
21 28
22 return new BindResult(command.FileTransfers, command.ContentFilePaths); 29 var result = new BindResult(command.FileTransfers, command.ContentFilePaths);
30
31 foreach (var extension in backendExtensions)
32 {
33 extension.PostBackendBind(result);
34 }
35
36 return result;
23 } 37 }
24 38
25 public bool Inscribe(IInscribeContext context) 39 public bool Inscribe(IInscribeContext context)
diff --git a/src/WixToolset.Core.WindowsInstaller/MsmBackend.cs b/src/WixToolset.Core.WindowsInstaller/MsmBackend.cs
index e39eb883..2323f8dd 100644
--- a/src/WixToolset.Core.WindowsInstaller/MsmBackend.cs
+++ b/src/WixToolset.Core.WindowsInstaller/MsmBackend.cs
@@ -13,12 +13,26 @@ namespace WixToolset.Core.WindowsInstaller
13 { 13 {
14 public BindResult Bind(IBindContext context) 14 public BindResult Bind(IBindContext context)
15 { 15 {
16 var backendExtensions = context.ExtensionManager.Create<IWindowsInstallerBackendExtension>();
17
18 foreach (var extension in backendExtensions)
19 {
20 extension.PreBackendBind(context);
21 }
22
16 var validator = Validator.CreateFromContext(context, "mergemod.cub"); 23 var validator = Validator.CreateFromContext(context, "mergemod.cub");
17 24
18 var command = new BindDatabaseCommand(context, validator); 25 var command = new BindDatabaseCommand(context, backendExtensions, validator);
19 command.Execute(); 26 command.Execute();
20 27
21 return new BindResult(command.FileTransfers, command.ContentFilePaths); 28 var result = new BindResult(command.FileTransfers, command.ContentFilePaths);
29
30 foreach (var extension in backendExtensions)
31 {
32 extension.PostBackendBind(result);
33 }
34
35 return result;
22 } 36 }
23 37
24 public bool Inscribe(IInscribeContext context) 38 public bool Inscribe(IInscribeContext context)
diff --git a/src/WixToolset.Core.WindowsInstaller/Patch.cs b/src/WixToolset.Core.WindowsInstaller/Patch.cs
index 8e617fdb..24a54859 100644
--- a/src/WixToolset.Core.WindowsInstaller/Patch.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Patch.cs
@@ -3,14 +3,11 @@
3namespace WixToolset.Data 3namespace WixToolset.Data
4{ 4{
5 using System; 5 using System;
6 using System.Collections;
7 using System.Collections.Generic; 6 using System.Collections.Generic;
8 using System.Diagnostics.CodeAnalysis; 7 using System.Diagnostics.CodeAnalysis;
9 using System.Globalization; 8 using WixToolset.Core.WindowsInstaller;
10 using WixToolset.Data.Rows; 9 using WixToolset.Data.WindowsInstaller;
11 using WixToolset.Extensibility; 10 using WixToolset.Extensibility;
12 using WixToolset.Core.Native;
13 using WixToolset.Msi;
14 11
15 /// <summary> 12 /// <summary>
16 /// Contains output tables and logic for building an MSP package. 13 /// Contains output tables and logic for building an MSP package.
diff --git a/src/WixToolset.Core.WindowsInstaller/RowDictionary.cs b/src/WixToolset.Core.WindowsInstaller/RowDictionary.cs
new file mode 100644
index 00000000..101ebefd
--- /dev/null
+++ b/src/WixToolset.Core.WindowsInstaller/RowDictionary.cs
@@ -0,0 +1,84 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Core.WindowsInstaller
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Data.WindowsInstaller;
8
9 /// <summary>
10 /// A dictionary of rows. Unlike the <see cref="RowIndexedCollection"/> this
11 /// will throw when multiple rows with the same key are added.
12 /// </summary>
13 public sealed class RowDictionary<T> : Dictionary<string, T> where T : Row
14 {
15 /// <summary>
16 /// Creates an empty <see cref="RowDictionary"/>.
17 /// </summary>
18 public RowDictionary()
19 : base(StringComparer.InvariantCulture)
20 {
21 }
22
23 /// <summary>
24 /// Creates and populates a <see cref="RowDictionary"/> with the rows from the given enumerator.
25 /// </summary>
26 /// <param name="Rows">Rows to add.</param>
27 public RowDictionary(IEnumerable<T> rows)
28 : this()
29 {
30 foreach (T row in rows)
31 {
32 this.Add(row);
33 }
34 }
35
36 /// <summary>
37 /// Creates and populates a <see cref="RowDictionary"/> with the rows from the given <see cref="Table"/>.
38 /// </summary>
39 /// <param name="table">The table to index.</param>
40 /// <remarks>
41 /// Rows added to the index are not automatically added to the given <paramref name="table"/>.
42 /// </remarks>
43 public RowDictionary(Table table)
44 : this()
45 {
46 if (null != table)
47 {
48 foreach (T row in table.Rows)
49 {
50 this.Add(row);
51 }
52 }
53 }
54
55 /// <summary>
56 /// Adds a row to the dictionary using the row key.
57 /// </summary>
58 /// <param name="row">Row to add to the dictionary.</param>
59 public void Add(T row)
60 {
61 this.Add(row.GetKey(), row);
62 }
63
64 /// <summary>
65 /// Gets the row by integer key.
66 /// </summary>
67 /// <param name="key">Integer key to look up.</param>
68 /// <returns>Row or null if key is not found.</returns>
69 public T Get(int key)
70 {
71 return this.Get(key.ToString());
72 }
73
74 /// <summary>
75 /// Gets the row by string key.
76 /// </summary>
77 /// <param name="key">String key to look up.</param>
78 /// <returns>Row or null if key is not found.</returns>
79 public T Get(string key)
80 {
81 return this.TryGetValue(key, out var result) ? result : null;
82 }
83 }
84}
diff --git a/src/WixToolset.Core.WindowsInstaller/Rows/WixActionRowCollection.cs b/src/WixToolset.Core.WindowsInstaller/Rows/WixActionRowCollection.cs
new file mode 100644
index 00000000..d72198ee
--- /dev/null
+++ b/src/WixToolset.Core.WindowsInstaller/Rows/WixActionRowCollection.cs
@@ -0,0 +1,328 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Core.WindowsInstaller.Rows
4{
5 using System;
6 using System.Collections;
7 using System.Diagnostics;
8 using System.Globalization;
9 using System.Xml;
10 using WixToolset.Data.Tuples;
11 using WixToolset.Data.WindowsInstaller.Rows;
12
13 /// <summary>
14 /// A collection of action rows sorted by their sequence table and action name.
15 /// </summary>
16 internal sealed class WixActionRowCollection : ICollection
17 {
18 private SortedList collection;
19
20 /// <summary>
21 /// Creates a new action table object.
22 /// </summary>
23 public WixActionRowCollection()
24 {
25 this.collection = new SortedList();
26 }
27
28 /// <summary>
29 /// Gets the number of items in the collection.
30 /// </summary>
31 /// <value>Number of items in collection.</value>
32 public int Count
33 {
34 get { return this.collection.Count; }
35 }
36
37 /// <summary>
38 /// Gets if the collection has been synchronized.
39 /// </summary>
40 /// <value>True if the collection has been synchronized.</value>
41 public bool IsSynchronized
42 {
43 get { return this.collection.IsSynchronized; }
44 }
45
46 /// <summary>
47 /// Gets the object used to synchronize the collection.
48 /// </summary>
49 /// <value>Oject used the synchronize the collection.</value>
50 public object SyncRoot
51 {
52 get { return this; }
53 }
54
55 /// <summary>
56 /// Get an ActionRow by its sequence table and action name.
57 /// </summary>
58 /// <param name="sequenceTable">The sequence table of the ActionRow.</param>
59 /// <param name="action">The action name of the ActionRow.</param>
60 public WixActionRow this[SequenceTable sequenceTable, string action]
61 {
62 get { return (WixActionRow)this.collection[GetKey(sequenceTable, action)]; }
63 }
64
65 /// <summary>
66 /// Add an ActionRow to the collection.
67 /// </summary>
68 /// <param name="actionRow">The ActionRow to add.</param>
69 /// <param name="overwrite">true to overwrite an existing ActionRow; false otherwise.</param>
70 public void Add(WixActionRow actionRow, bool overwrite)
71 {
72 string key = GetKey(actionRow.SequenceTable, actionRow.Action);
73
74 if (overwrite)
75 {
76 this.collection[key] = actionRow;
77 }
78 else
79 {
80 this.collection.Add(key, actionRow);
81 }
82 }
83
84 /// <summary>
85 /// Add an ActionRow to the collection.
86 /// </summary>
87 /// <param name="actionRow">The ActionRow to add.</param>
88 public void Add(WixActionRow actionRow)
89 {
90 this.Add(actionRow, false);
91 }
92
93 /// <summary>
94 /// Determines if the collection contains an ActionRow with a specific sequence table and name.
95 /// </summary>
96 /// <param name="sequenceTable">The sequence table of the ActionRow.</param>
97 /// <param name="action">The action name of the ActionRow.</param>
98 /// <returns>true if the ActionRow was found; false otherwise.</returns>
99 public bool Contains(SequenceTable sequenceTable, string action)
100 {
101 return this.collection.Contains(GetKey(sequenceTable, action));
102 }
103
104 /// <summary>
105 /// Copies the collection into an array.
106 /// </summary>
107 /// <param name="array">Array to copy the collection into.</param>
108 /// <param name="index">Index to start copying from.</param>
109 public void CopyTo(System.Array array, int index)
110 {
111 this.collection.Values.CopyTo(array, index);
112 }
113
114 /// <summary>
115 /// Gets the enumerator for the collection.
116 /// </summary>
117 /// <returns>The enumerator for the collection.</returns>
118 public IEnumerator GetEnumerator()
119 {
120 return this.collection.Values.GetEnumerator();
121 }
122
123 /// <summary>
124 /// Remove an ActionRow from the collection.
125 /// </summary>
126 /// <param name="sequenceTable">The sequence table of the ActionRow.</param>
127 /// <param name="action">The action name of the ActionRow.</param>
128 public void Remove(SequenceTable sequenceTable, string action)
129 {
130 this.collection.Remove(GetKey(sequenceTable, action));
131 }
132
133 /// <summary>
134 /// Load an action table from an XmlReader.
135 /// </summary>
136 /// <param name="reader">Reader to get data from.</param>
137 /// <returns>The ActionRowCollection represented by the xml.</returns>
138 internal static WixActionRowCollection Load(XmlReader reader)
139 {
140 reader.MoveToContent();
141
142 return Parse(reader);
143 }
144
145 /// <summary>
146 /// Creates a new action table object and populates it from an Xml reader.
147 /// </summary>
148 /// <param name="reader">Reader to get data from.</param>
149 /// <returns>The parsed ActionTable.</returns>
150 private static WixActionRowCollection Parse(XmlReader reader)
151 {
152 if (!reader.LocalName.Equals("actions"))
153 {
154 throw new XmlException();
155 }
156
157 WixActionRowCollection actionRows = new WixActionRowCollection();
158 bool empty = reader.IsEmptyElement;
159
160 while (reader.MoveToNextAttribute())
161 {
162 }
163
164 if (!empty)
165 {
166 bool done = false;
167
168 // loop through all the fields in a row
169 while (!done && reader.Read())
170 {
171 switch (reader.NodeType)
172 {
173 case XmlNodeType.Element:
174 switch (reader.LocalName)
175 {
176 case "action":
177 WixActionRow[] parsedActionRows = ParseActions(reader);
178
179 foreach (WixActionRow actionRow in parsedActionRows)
180 {
181 actionRows.Add(actionRow);
182 }
183 break;
184 default:
185 throw new XmlException();
186 }
187 break;
188 case XmlNodeType.EndElement:
189 done = true;
190 break;
191 }
192 }
193
194 if (!done)
195 {
196 throw new XmlException();
197 }
198 }
199
200 return actionRows;
201 }
202
203 /// <summary>
204 /// Get the key for storing an ActionRow.
205 /// </summary>
206 /// <param name="sequenceTable">The sequence table of the ActionRow.</param>
207 /// <param name="action">The action name of the ActionRow.</param>
208 /// <returns>The string key.</returns>
209 private static string GetKey(SequenceTable sequenceTable, string action)
210 {
211 return GetKey(sequenceTable.ToString(), action);
212 }
213
214 /// <summary>
215 /// Get the key for storing an ActionRow.
216 /// </summary>
217 /// <param name="sequenceTable">The sequence table of the ActionRow.</param>
218 /// <param name="action">The action name of the ActionRow.</param>
219 /// <returns>The string key.</returns>
220 private static string GetKey(string sequenceTable, string action)
221 {
222 return String.Concat(sequenceTable, '/', action);
223 }
224
225 /// <summary>
226 /// Parses ActionRows from the Xml reader.
227 /// </summary>
228 /// <param name="reader">Xml reader that contains serialized ActionRows.</param>
229 /// <returns>The parsed ActionRows.</returns>
230 internal static WixActionRow[] ParseActions(XmlReader reader)
231 {
232 Debug.Assert("action" == reader.LocalName);
233
234 string id = null;
235 string condition = null;
236 bool empty = reader.IsEmptyElement;
237 int sequence = int.MinValue;
238 int sequenceCount = 0;
239 SequenceTable[] sequenceTables = new SequenceTable[Enum.GetValues(typeof(SequenceTable)).Length];
240
241 while (reader.MoveToNextAttribute())
242 {
243 switch (reader.Name)
244 {
245 case "name":
246 id = reader.Value;
247 break;
248 case "AdminExecuteSequence":
249 if (reader.Value.Equals("yes"))
250 {
251 sequenceTables[sequenceCount] = SequenceTable.AdminExecuteSequence;
252 ++sequenceCount;
253 }
254 break;
255 case "AdminUISequence":
256 if (reader.Value.Equals("yes"))
257 {
258 sequenceTables[sequenceCount] = SequenceTable.AdminUISequence;
259 ++sequenceCount;
260 }
261 break;
262 case "AdvtExecuteSequence":
263 if (reader.Value.Equals("yes"))
264 {
265 sequenceTables[sequenceCount] = SequenceTable.AdvtExecuteSequence;
266 ++sequenceCount;
267 }
268 break;
269 case "condition":
270 condition = reader.Value;
271 break;
272 case "InstallExecuteSequence":
273 if (reader.Value.Equals("yes"))
274 {
275 sequenceTables[sequenceCount] = SequenceTable.InstallExecuteSequence;
276 ++sequenceCount;
277 }
278 break;
279 case "InstallUISequence":
280 if (reader.Value.Equals("yes"))
281 {
282 sequenceTables[sequenceCount] = SequenceTable.InstallUISequence;
283 ++sequenceCount;
284 }
285 break;
286 case "sequence":
287 sequence = Convert.ToInt32(reader.Value, CultureInfo.InvariantCulture);
288 break;
289 }
290 }
291
292 if (null == id)
293 {
294 throw new XmlException();
295 }
296
297 if (int.MinValue == sequence)
298 {
299 throw new XmlException();
300 }
301 else if (1 > sequence)
302 {
303 throw new XmlException();
304 }
305
306 if (0 == sequenceCount)
307 {
308 throw new XmlException();
309 }
310
311 if (!empty && reader.Read() && XmlNodeType.EndElement != reader.MoveToContent())
312 {
313 throw new XmlException();
314 }
315
316 // create the actions
317 WixActionRow[] actionRows = new WixActionRow[sequenceCount];
318 for (int i = 0; i < sequenceCount; i++)
319 {
320 //WixActionRow actionRow = new WixActionRow(sequenceTables[i], id, condition, sequence);
321 //actionRows[i] = actionRow;
322 throw new NotImplementedException();
323 }
324
325 return actionRows;
326 }
327 }
328}
diff --git a/src/WixToolset.Core.WindowsInstaller/Unbind/ExtractCabinetsCommand.cs b/src/WixToolset.Core.WindowsInstaller/Unbind/ExtractCabinetsCommand.cs
index 7985c120..1757e06f 100644
--- a/src/WixToolset.Core.WindowsInstaller/Unbind/ExtractCabinetsCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Unbind/ExtractCabinetsCommand.cs
@@ -9,7 +9,8 @@ namespace WixToolset.Core.WindowsInstaller.Unbind
9 using System.IO; 9 using System.IO;
10 using WixToolset.Core.Native; 10 using WixToolset.Core.Native;
11 using WixToolset.Data; 11 using WixToolset.Data;
12 using WixToolset.Data.Rows; 12 using WixToolset.Data.WindowsInstaller;
13 using WixToolset.Data.WindowsInstaller.Rows;
13 using WixToolset.Msi; 14 using WixToolset.Msi;
14 15
15 internal class ExtractCabinetsCommand 16 internal class ExtractCabinetsCommand
diff --git a/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindDatabaseCommand.cs b/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindDatabaseCommand.cs
index 9cd7b775..72e0c3c8 100644
--- a/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindDatabaseCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindDatabaseCommand.cs
@@ -10,7 +10,8 @@ namespace WixToolset.Core.WindowsInstaller.Unbind
10 using System.Text.RegularExpressions; 10 using System.Text.RegularExpressions;
11 using WixToolset.Core.Native; 11 using WixToolset.Core.Native;
12 using WixToolset.Data; 12 using WixToolset.Data;
13 using WixToolset.Data.Rows; 13 using WixToolset.Data.WindowsInstaller;
14 using WixToolset.Data.WindowsInstaller.Rows;
14 using WixToolset.Msi; 15 using WixToolset.Msi;
15 16
16 internal class UnbindDatabaseCommand 17 internal class UnbindDatabaseCommand
@@ -155,13 +156,10 @@ namespace WixToolset.Core.WindowsInstaller.Unbind
155 ColumnCategory columnCategory = ColumnCategory.Unknown; 156 ColumnCategory columnCategory = ColumnCategory.Unknown;
156 ColumnModularizeType columnModularizeType = ColumnModularizeType.None; 157 ColumnModularizeType columnModularizeType = ColumnModularizeType.None;
157 bool primary = tablePrimaryKeys.Contains(columnName); 158 bool primary = tablePrimaryKeys.Contains(columnName);
158 bool minValueSet = false; 159 int? minValue = null;
159 int minValue = -1; 160 int? maxValue = null;
160 bool maxValueSet = false;
161 int maxValue = -1;
162 string keyTable = null; 161 string keyTable = null;
163 bool keyColumnSet = false; 162 int? keyColumn = null;
164 int keyColumn = -1;
165 string category = null; 163 string category = null;
166 string set = null; 164 string set = null;
167 string description = null; 165 string description = null;
@@ -205,16 +203,13 @@ namespace WixToolset.Core.WindowsInstaller.Unbind
205 if (null != validationRecord) 203 if (null != validationRecord)
206 { 204 {
207 string validationNullable = validationRecord.GetString(3); 205 string validationNullable = validationRecord.GetString(3);
208 minValueSet = !validationRecord.IsNull(4); 206 minValue = validationRecord.IsNull(4) ? null : (int?)validationRecord.GetInteger(4);
209 minValue = (minValueSet ? validationRecord.GetInteger(4) : -1); 207 maxValue = validationRecord.IsNull(5) ? null : (int?)validationRecord.GetInteger(5);
210 maxValueSet = !validationRecord.IsNull(5); 208 keyTable = validationRecord.IsNull(6) ? null : validationRecord.GetString(6);
211 maxValue = (maxValueSet ? validationRecord.GetInteger(5) : -1); 209 keyColumn = validationRecord.IsNull(7) ? null : (int?)validationRecord.GetInteger(7);
212 keyTable = (!validationRecord.IsNull(6) ? validationRecord.GetString(6) : null); 210 category = validationRecord.IsNull(8) ? null : validationRecord.GetString(8);
213 keyColumnSet = !validationRecord.IsNull(7); 211 set = validationRecord.IsNull(9) ? null : validationRecord.GetString(9);
214 keyColumn = (keyColumnSet ? validationRecord.GetInteger(7) : -1); 212 description = validationRecord.IsNull(10) ? null : validationRecord.GetString(10);
215 category = (!validationRecord.IsNull(8) ? validationRecord.GetString(8) : null);
216 set = (!validationRecord.IsNull(9) ? validationRecord.GetString(9) : null);
217 description = (!validationRecord.IsNull(10) ? validationRecord.GetString(10) : null);
218 213
219 // check the validation nullable value against the column definition 214 // check the validation nullable value against the column definition
220 if (null == validationNullable) 215 if (null == validationNullable)
@@ -264,7 +259,7 @@ namespace WixToolset.Core.WindowsInstaller.Unbind
264 columnModularizeType = ColumnModularizeType.Column; 259 columnModularizeType = ColumnModularizeType.Column;
265 } 260 }
266 261
267 columns.Add(new ColumnDefinition(columnName, columnType, length, primary, nullable, columnModularizeType, (ColumnType.Localized == columnType), minValueSet, minValue, maxValueSet, maxValue, keyTable, keyColumnSet, keyColumn, columnCategory, set, description, true, true)); 262 columns.Add(new ColumnDefinition(columnName, columnType, length, primary, nullable, columnCategory, minValue, maxValue, keyTable, keyColumn, set, description, columnModularizeType, (ColumnType.Localized == columnType), true));
268 } 263 }
269 } 264 }
270 265
diff --git a/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindTranformCommand.cs b/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindTranformCommand.cs
index 7eb81ac7..70f751f5 100644
--- a/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindTranformCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindTranformCommand.cs
@@ -11,6 +11,7 @@ namespace WixToolset.Core.WindowsInstaller.Unbind
11 using WixToolset.Core.Native; 11 using WixToolset.Core.Native;
12 using WixToolset.Core.WindowsInstaller.Bind; 12 using WixToolset.Core.WindowsInstaller.Bind;
13 using WixToolset.Data; 13 using WixToolset.Data;
14 using WixToolset.Data.WindowsInstaller;
14 using WixToolset.Extensibility; 15 using WixToolset.Extensibility;
15 using WixToolset.Msi; 16 using WixToolset.Msi;
16 17
diff --git a/src/WixToolset.Core.WindowsInstaller/Validator.cs b/src/WixToolset.Core.WindowsInstaller/Validator.cs
index 652a8a07..eb17d8af 100644
--- a/src/WixToolset.Core.WindowsInstaller/Validator.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Validator.cs
@@ -9,14 +9,15 @@ namespace WixToolset.Core.WindowsInstaller
9 using System.Diagnostics.CodeAnalysis; 9 using System.Diagnostics.CodeAnalysis;
10 using System.Globalization; 10 using System.Globalization;
11 using System.IO; 11 using System.IO;
12 using System.Linq;
13 using System.Reflection;
12 using System.Threading; 14 using System.Threading;
15 using WixToolset.Core.Native;
13 using WixToolset.Data; 16 using WixToolset.Data;
17 using WixToolset.Data.WindowsInstaller;
14 using WixToolset.Extensibility; 18 using WixToolset.Extensibility;
15 using WixToolset.Core.Native;
16 using WixToolset.Msi;
17 using System.Linq;
18 using System.Reflection;
19 using WixToolset.Extensibility.Services; 19 using WixToolset.Extensibility.Services;
20 using WixToolset.Msi;
20 21
21 /// <summary> 22 /// <summary>
22 /// Runs internal consistency evaluators (ICEs) from cub files against a database. 23 /// Runs internal consistency evaluators (ICEs) from cub files against a database.
diff --git a/src/WixToolset.Core.WindowsInstaller/ValidatorExtension.cs b/src/WixToolset.Core.WindowsInstaller/ValidatorExtension.cs
index 44ec3106..67f5962c 100644
--- a/src/WixToolset.Core.WindowsInstaller/ValidatorExtension.cs
+++ b/src/WixToolset.Core.WindowsInstaller/ValidatorExtension.cs
@@ -5,6 +5,7 @@ namespace WixToolset.Extensibility
5 using System; 5 using System;
6 using System.Collections; 6 using System.Collections;
7 using WixToolset.Data; 7 using WixToolset.Data;
8 using WixToolset.Data.WindowsInstaller;
8 9
9 /// <summary> 10 /// <summary>
10 /// Base class for creating a validator extension. This default implementation 11 /// Base class for creating a validator extension. This default implementation
diff --git a/src/WixToolset.Core.WindowsInstaller/WindowsInstallerStandardInternal.cs b/src/WixToolset.Core.WindowsInstaller/WindowsInstallerStandardInternal.cs
new file mode 100644
index 00000000..3b4721a6
--- /dev/null
+++ b/src/WixToolset.Core.WindowsInstaller/WindowsInstallerStandardInternal.cs
@@ -0,0 +1,64 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Core.WindowsInstaller
4{
5 using System;
6 using System.Reflection;
7 using System.Xml;
8 using WixToolset.Core.WindowsInstaller.Rows;
9 using WixToolset.Data.WindowsInstaller;
10
11 /// <summary>
12 /// Represents the Windows Installer standard objects.
13 /// </summary>
14 internal static class WindowsInstallerStandardInternal
15 {
16 private static readonly object lockObject = new object();
17
18 private static TableDefinitionCollection tableDefinitions;
19 private static WixActionRowCollection standardActions;
20
21 /// <summary>
22 /// Gets the table definitions stored in this assembly.
23 /// </summary>
24 /// <returns>Table definition collection for tables stored in this assembly.</returns>
25 public static TableDefinitionCollection GetTableDefinitions()
26 {
27 lock (lockObject)
28 {
29 if (null == WindowsInstallerStandardInternal.tableDefinitions)
30 {
31 using (XmlReader reader = XmlReader.Create(Assembly.GetExecutingAssembly().GetManifestResourceStream("WixToolset.Core.WindowsInstaller.Data.tables.xml")))
32 {
33 WindowsInstallerStandardInternal.tableDefinitions = TableDefinitionCollection.Load(reader);
34 }
35 }
36 }
37
38 return WindowsInstallerStandardInternal.tableDefinitions;
39 }
40
41 /// <summary>
42 /// Gets the standard actions stored in this assembly.
43 /// </summary>
44 /// <returns>Collection of standard actions in this assembly.</returns>
45 public static WixActionRowCollection GetStandardActionRows()
46 {
47#if REVISIT_FOR_PATCHING
48 lock (lockObject)
49 {
50 if (null == WindowsInstallerStandardInternal.standardActions)
51 {
52 using (XmlReader reader = XmlReader.Create(Assembly.GetExecutingAssembly().GetManifestResourceStream("WixToolset.Core.WindowsInstaller.Data.actions.xml")))
53 {
54 WindowsInstallerStandardInternal.standardActions = WixActionRowCollection.Load(reader);
55 }
56 }
57 }
58
59 return WindowsInstallerStandardInternal.standardActions;
60#endif
61 throw new NotImplementedException();
62 }
63 }
64}
diff --git a/src/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj b/src/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj
index da49f31c..4a26d031 100644
--- a/src/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj
+++ b/src/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj
@@ -13,6 +13,11 @@
13 </PropertyGroup> 13 </PropertyGroup>
14 14
15 <ItemGroup> 15 <ItemGroup>
16 <EmbeddedResource Include="Data\actions.xml" />
17 <EmbeddedResource Include="Data\tables.xml" />
18 </ItemGroup>
19
20 <ItemGroup>
16 <ProjectReference Include="$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj') " /> 21 <ProjectReference Include="$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj') " />
17 <PackageReference Include="WixToolset.Data" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj') " /> 22 <PackageReference Include="WixToolset.Data" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj') " />
18 23
@@ -22,8 +27,6 @@
22 <ProjectReference Include="$(WixToolsetRootFolder)\Core.Native\src\WixToolset.Core.Native\WixToolset.Core.Native.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Core.Native\src\WixToolset.Core.Native\WixToolset.Core.Native.csproj') " /> 27 <ProjectReference Include="$(WixToolsetRootFolder)\Core.Native\src\WixToolset.Core.Native\WixToolset.Core.Native.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Core.Native\src\WixToolset.Core.Native\WixToolset.Core.Native.csproj') " />
23 28
24 <ProjectReference Include="..\WixToolset.Core\WixToolset.Core.csproj" /> 29 <ProjectReference Include="..\WixToolset.Core\WixToolset.Core.csproj" />
25
26 <ProjectReference Include="..\WixToolset.Data.WindowsInstaller\WixToolset.Data.WindowsInstaller.csproj" />
27 <PackageReference Include="WixToolset.Core.Native" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Core.Native\src\WixToolset.Core.Native\WixToolset.Core.Native.csproj') " /> 30 <PackageReference Include="WixToolset.Core.Native" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Core.Native\src\WixToolset.Core.Native\WixToolset.Core.Native.csproj') " />
28 </ItemGroup> 31 </ItemGroup>
29 32