aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Data.WindowsInstaller
diff options
context:
space:
mode:
Diffstat (limited to 'src/WixToolset.Data.WindowsInstaller')
-rw-r--r--src/WixToolset.Data.WindowsInstaller/ColumnDefinition.cs1033
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Common.cs25
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Data/actions.xml76
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Data/tables.xml1962
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Field.cs266
-rw-r--r--src/WixToolset.Data.WindowsInstaller/ObjectField.cs183
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Output.cs337
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Pdb.cs163
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Row.cs620
-rw-r--r--src/WixToolset.Data.WindowsInstaller/RowDictionary.cs83
-rw-r--r--src/WixToolset.Data.WindowsInstaller/RowIndexedList.cs301
-rw-r--r--src/WixToolset.Data.WindowsInstaller/RowOperation.cs30
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/BBControlRow.cs113
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/ComponentRow.cs245
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/ContainerType.cs13
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/ControlRow.cs143
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/FileRow.cs640
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/MediaRow.cs80
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/PropertyRow.cs42
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/SummaryInfoRowCollection.cs42
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/UpgradeRow.cs90
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixActionRow.cs378
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixActionRowCollection.cs223
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixApprovedExeForElevationRow.cs79
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleCatalogRow.cs50
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleContainerRow.cs78
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleExePackageRow.cs103
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsiFeatureRow.cs93
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsiPackageRow.cs138
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsiPropertyRow.cs58
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMspPackageRow.cs101
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsuPackageRow.cs57
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePackageCommandLineRow.cs82
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePackageExitCodeRow.cs53
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePackageRow.cs228
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePatchTargetCodeRow.cs81
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePayloadRow.cs185
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleRelatedPackageRow.cs87
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleRollbackBoundaryRow.cs59
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleRow.cs228
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleSlipstreamMspRow.cs48
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleUpdateRow.cs38
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixBundleVariableRow.cs80
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixChainItemRow.cs39
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixChainRow.cs65
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixComplexReferenceRow.cs204
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixDeltaPatchFileRow.cs142
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixDeltaPatchSymbolPathsRow.cs60
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixFileRow.cs163
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixGroupRow.cs62
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixMediaRow.cs60
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixMediaTemplateRow.cs81
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixMergeRow.cs149
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixPayloadPropertiesRow.cs81
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixPropertyRow.cs118
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixRelatedBundleRow.cs52
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixSimpleReferenceRow.cs63
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Rows/WixUpdateRegistrationRow.cs62
-rw-r--r--src/WixToolset.Data.WindowsInstaller/SubStorage.cs109
-rw-r--r--src/WixToolset.Data.WindowsInstaller/Table.cs435
-rw-r--r--src/WixToolset.Data.WindowsInstaller/TableDefinition.cs334
-rw-r--r--src/WixToolset.Data.WindowsInstaller/TableDefinitionCollection.cs240
-rw-r--r--src/WixToolset.Data.WindowsInstaller/TableExtensions.cs23
-rw-r--r--src/WixToolset.Data.WindowsInstaller/TableIndexedCollection.cs153
-rw-r--r--src/WixToolset.Data.WindowsInstaller/TableOperation.cs25
-rw-r--r--src/WixToolset.Data.WindowsInstaller/WindowsInstallerStandardInternal.cs59
-rw-r--r--src/WixToolset.Data.WindowsInstaller/WixInvalidIdtException.cs32
-rw-r--r--src/WixToolset.Data.WindowsInstaller/WixMissingTableDefinitionException.cs22
-rw-r--r--src/WixToolset.Data.WindowsInstaller/WixToolset.Data.WindowsInstaller.csproj27
69 files changed, 0 insertions, 11874 deletions
diff --git a/src/WixToolset.Data.WindowsInstaller/ColumnDefinition.cs b/src/WixToolset.Data.WindowsInstaller/ColumnDefinition.cs
deleted file mode 100644
index 056be1e9..00000000
--- a/src/WixToolset.Data.WindowsInstaller/ColumnDefinition.cs
+++ /dev/null
@@ -1,1033 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Globalization;
7 using System.Xml;
8
9 /// <summary>
10 /// Defines MSI column types.
11 /// </summary>
12 public enum ColumnType
13 {
14 /// <summary>Unknown column type, default and invalid.</summary>
15 Unknown,
16
17 /// <summary>Column is a string.</summary>
18 String,
19
20 /// <summary>Column is a localizable string.</summary>
21 Localized,
22
23 /// <summary>Column is a number.</summary>
24 Number,
25
26 /// <summary>Column is a binary stream.</summary>
27 Object,
28
29 /// <summary>Column is a string that is preserved in transforms (like Object).</summary>
30 Preserved,
31 }
32
33 /// <summary>
34 /// Specifies if the column should be modularized.
35 /// </summary>
36 public enum ColumnModularizeType
37 {
38 /// <summary>Column should not be modularized.</summary>
39 None,
40
41 /// <summary>Column should be modularized.</summary>
42 Column,
43
44 /// <summary>When the column is an primary or foreign key to the Icon table it should be modularized special.</summary>
45 Icon,
46
47 /// <summary>When the column is a companion file it should be modularized.</summary>
48 CompanionFile,
49
50 /// <summary>Column is a condition and should be modularized.</summary>
51 Condition,
52
53 /// <summary>Special modularization type for the ControlEvent table's Argument column.</summary>
54 ControlEventArgument,
55
56 /// <summary>Special modularization type for the Control table's Text column.</summary>
57 ControlText,
58
59 /// <summary>Any Properties in the column should be modularized.</summary>
60 Property,
61
62 /// <summary>Semi-colon list of keys, all of which need to be modularized.</summary>
63 SemicolonDelimited,
64 }
65
66 /// <summary>
67 /// Column validation category type
68 /// </summary>
69 public enum ColumnCategory
70 {
71 /// <summary>Unknown category, default and invalid.</summary>
72 Unknown,
73
74 /// <summary>Text category.</summary>
75 Text,
76
77 /// <summary>UpperCase category.</summary>
78 UpperCase,
79
80 /// <summary>LowerCase category.</summary>
81 LowerCase,
82
83 /// <summary>Integer category.</summary>
84 Integer,
85
86 /// <summary>DoubleInteger category.</summary>
87 DoubleInteger,
88
89 /// <summary>TimeDate category.</summary>
90 TimeDate,
91
92 /// <summary>Identifier category.</summary>
93 Identifier,
94
95 /// <summary>Property category.</summary>
96 Property,
97
98 /// <summary>Filename category.</summary>
99 Filename,
100
101 /// <summary>WildCardFilename category.</summary>
102 WildCardFilename,
103
104 /// <summary>Path category.</summary>
105 Path,
106
107 /// <summary>Paths category.</summary>
108 Paths,
109
110 /// <summary>AnyPath category.</summary>
111 AnyPath,
112
113 /// <summary>DefaultDir category.</summary>
114 DefaultDir,
115
116 /// <summary>RegPath category.</summary>
117 RegPath,
118
119 /// <summary>Formatted category.</summary>
120 Formatted,
121
122 /// <summary>Template category.</summary>
123 Template,
124
125 /// <summary>Condition category.</summary>
126 Condition,
127
128 /// <summary>Guid category.</summary>
129 Guid,
130
131 /// <summary>Version category.</summary>
132 Version,
133
134 /// <summary>Language category.</summary>
135 Language,
136
137 /// <summary>Binary category.</summary>
138 Binary,
139
140 /// <summary>CustomSource category.</summary>
141 CustomSource,
142
143 /// <summary>Cabinet category.</summary>
144 Cabinet,
145
146 /// <summary>Shortcut category.</summary>
147 Shortcut,
148
149 /// <summary>Formatted SDDL category.</summary>
150 FormattedSDDLText,
151 }
152
153 /// <summary>
154 /// Definition of a table's column.
155 /// </summary>
156 public sealed class ColumnDefinition : IComparable<ColumnDefinition>
157 {
158 private string name;
159 private ColumnType type;
160 private int length;
161 private bool primaryKey;
162 private bool nullable;
163 private ColumnModularizeType modularize;
164 private bool localizable;
165 private bool added;
166
167 private bool minValueSet;
168 private long minValue;
169 private bool maxValueSet;
170 private long maxValue;
171 private string keyTable;
172 private bool keyColumnSet;
173 private int keyColumn;
174 private ColumnCategory category;
175 private string possibilities;
176 private string description;
177 private bool escapeIdtCharacters;
178 private bool useCData;
179
180 /// <summary>
181 /// Creates a new column definition.
182 /// </summary>
183 /// <param name="name">Name of column.</param>
184 /// <param name="type">Type of column</param>
185 /// <param name="length">Length of column.</param>
186 /// <param name="primaryKey">If column is primary key.</param>
187 /// <param name="nullable">If column is nullable.</param>
188 /// <param name="modularizeType">Type of modularization for column</param>
189 /// <param name="localizable">If the column is localizable.</param>
190 /// <param name="minValueSet">If the minimum of the value was set.</param>
191 /// <param name="minValue">Minimum value for the column.</param>
192 /// <param name="maxValueSet">If the maximum value was set.</param>
193 /// <param name="maxValue">Maximum value for the colum.</param>
194 /// <param name="keyTable">Optional name of table for foreign key.</param>
195 /// <param name="keyColumnSet">If the key column was set.</param>
196 /// <param name="keyColumn">Optional name of column for foreign key.</param>
197 /// <param name="category">Validation category for column.</param>
198 /// <param name="possibilities">Set of possible values for column.</param>
199 /// <param name="description">Description of column in vaidation table.</param>
200 /// <param name="escapeIdtCharacters">If characters should be escaped in IDT.</param>
201 /// <param name="useCData">If whitespace should be preserved in a CDATA node.</param>
202 public ColumnDefinition(string name, ColumnType type, int length, bool primaryKey, bool nullable, ColumnModularizeType modularizeType, bool localizable, bool minValueSet, long minValue, bool maxValueSet, long maxValue, string keyTable, bool keyColumnSet, int keyColumn, ColumnCategory category, string possibilities, string description, bool escapeIdtCharacters, bool useCData)
203 {
204 this.name = name;
205 this.type = type;
206 this.length = length;
207 this.primaryKey = primaryKey;
208 this.nullable = nullable;
209 this.modularize = modularizeType;
210 this.localizable = localizable;
211 this.minValueSet = minValueSet;
212 this.minValue = minValue;
213 this.maxValueSet = maxValueSet;
214 this.maxValue = maxValue;
215 this.keyTable = keyTable;
216 this.keyColumnSet = keyColumnSet;
217 this.keyColumn = keyColumn;
218 this.category = category;
219 this.possibilities = possibilities;
220 this.description = description;
221 this.escapeIdtCharacters = escapeIdtCharacters;
222 this.useCData = useCData;
223 }
224
225 /// <summary>
226 /// Gets whether this column was added via a transform.
227 /// </summary>
228 /// <value>Whether this column was added via a transform.</value>
229 public bool Added
230 {
231 get { return this.added; }
232 set { this.added = value; }
233 }
234
235 /// <summary>
236 /// Gets the name of the column.
237 /// </summary>
238 /// <value>Name of column.</value>
239 public string Name
240 {
241 get { return this.name; }
242 }
243
244 /// <summary>
245 /// Gets the type of the column.
246 /// </summary>
247 /// <value>Type of column.</value>
248 public ColumnType Type
249 {
250 get { return this.type; }
251 }
252
253 /// <summary>
254 /// Gets the length of the column.
255 /// </summary>
256 /// <value>Length of column.</value>
257 public int Length
258 {
259 get { return this.length; }
260 }
261
262 /// <summary>
263 /// Gets if the column is a primary key.
264 /// </summary>
265 /// <value>true if column is primary key.</value>
266 public bool PrimaryKey
267 {
268 get { return this.primaryKey; }
269 }
270
271 /// <summary>
272 /// Gets if the column is nullable.
273 /// </summary>
274 /// <value>true if column is nullable.</value>
275 public bool Nullable
276 {
277 get { return this.nullable; }
278 }
279
280 /// <summary>
281 /// Gets the type of modularization for this column.
282 /// </summary>
283 /// <value>Column's modularization type.</value>
284 public ColumnModularizeType ModularizeType
285 {
286 get { return this.modularize; }
287 }
288
289 /// <summary>
290 /// Gets if the column is localizable. Can be because the type is localizable, or because the column
291 /// was explicitly set to be so.
292 /// </summary>
293 /// <value>true if column is localizable.</value>
294 public bool IsLocalizable
295 {
296 get { return this.localizable || ColumnType.Localized == this.Type; }
297 }
298
299 /// <summary>
300 /// Gets if the minimum value of the column is set.
301 /// </summary>
302 /// <value>true if minimum value is set.</value>
303 public bool IsMinValueSet
304 {
305 get { return this.minValueSet; }
306 }
307
308 /// <summary>
309 /// Gets the minimum value for the column, only valid if IsMinValueSet returns true.
310 /// </summary>
311 /// <value>Minimum value for the column.</value>
312 public long MinValue
313 {
314 get { return this.minValue; }
315 }
316
317 /// <summary>
318 /// Gets if the maximum value of the column is set.
319 /// </summary>
320 /// <value>true if maximum value is set.</value>
321 public bool IsMaxValueSet
322 {
323 get { return this.maxValueSet; }
324 }
325
326 /// <summary>
327 /// Gets the maximum value for the column, only valid if IsMinValueSet returns true.
328 /// </summary>
329 /// <value>Maximum value for the column.</value>
330 public long MaxValue
331 {
332 get { return this.maxValue; }
333 }
334
335 /// <summary>
336 /// Gets the table that has the foreign key for this column
337 /// </summary>
338 /// <value>Foreign key table name.</value>
339 public string KeyTable
340 {
341 get { return this.keyTable; }
342 }
343
344 /// <summary>
345 /// Gets if the key column is set.
346 /// </summary>
347 /// <value>True if the key column is set.</value>
348 public bool IsKeyColumnSet
349 {
350 get { return this.keyColumnSet; }
351 }
352
353 /// <summary>
354 /// Gets the foreign key column that this column refers to.
355 /// </summary>
356 /// <value>Foreign key column.</value>
357 public int KeyColumn
358 {
359 get { return this.keyColumn; }
360 }
361
362 /// <summary>
363 /// Gets the validation category for this column.
364 /// </summary>
365 /// <value>Validation category.</value>
366 public ColumnCategory Category
367 {
368 get { return this.category; }
369 }
370
371 /// <summary>
372 /// Gets the set of possibilities for this column.
373 /// </summary>
374 /// <value>Set of possibilities for this column.</value>
375 public string Possibilities
376 {
377 get { return this.possibilities; }
378 }
379
380 /// <summary>
381 /// Gets the description for this column.
382 /// </summary>
383 /// <value>Description of column.</value>
384 public string Description
385 {
386 get { return this.description; }
387 }
388
389 /// <summary>
390 /// Gets if characters should be escaped to fit into IDT.
391 /// </summary>
392 /// <value>true if data should be escaped when adding to IDT.</value>
393 public bool EscapeIdtCharacters
394 {
395 get { return this.escapeIdtCharacters; }
396 }
397
398 /// <summary>
399 /// Gets if whitespace should be preserved in a CDATA node.
400 /// </summary>
401 /// <value>true if whitespace should be preserved in a CDATA node.</value>
402 public bool UseCData
403 {
404 get { return this.useCData; }
405 }
406
407 /// <summary>
408 /// Gets the type of the column in IDT format.
409 /// </summary>
410 /// <value>IDT format for column type.</value>
411 public string IdtType
412 {
413 get
414 {
415 char typeCharacter;
416 switch (this.type)
417 {
418 case ColumnType.Number:
419 typeCharacter = this.nullable ? 'I' : 'i';
420 break;
421 case ColumnType.Preserved:
422 case ColumnType.String:
423 typeCharacter = this.nullable ? 'S' : 's';
424 break;
425 case ColumnType.Localized:
426 typeCharacter = this.nullable ? 'L' : 'l';
427 break;
428 case ColumnType.Object:
429 typeCharacter = this.nullable ? 'V' : 'v';
430 break;
431 default:
432 throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture, WixDataStrings.EXP_UnknownColumnType, this.type));
433 }
434
435 return String.Concat(typeCharacter, this.length);
436 }
437 }
438
439 /// <summary>
440 /// Parses a column definition in a table definition.
441 /// </summary>
442 /// <param name="reader">Reader to get data from.</param>
443 /// <returns>The ColumnDefintion represented by the Xml.</returns>
444 internal static ColumnDefinition Read(XmlReader reader)
445 {
446 if (!reader.LocalName.Equals("columnDefinition"))
447 {
448 throw new XmlException();
449 }
450
451 bool added = false;
452 ColumnCategory category = ColumnCategory.Unknown;
453 string description = null;
454 bool empty = reader.IsEmptyElement;
455 bool escapeIdtCharacters = false;
456 int keyColumn = -1;
457 bool keyColumnSet = false;
458 string keyTable = null;
459 int length = -1;
460 bool localizable = false;
461 long maxValue = 0;
462 bool maxValueSet = false;
463 long minValue = 0;
464 bool minValueSet = false;
465 ColumnModularizeType modularize = ColumnModularizeType.None;
466 string name = null;
467 bool nullable = false;
468 string possibilities = null;
469 bool primaryKey = false;
470 ColumnType type = ColumnType.Unknown;
471 bool useCData = false;
472
473 // parse the attributes
474 while (reader.MoveToNextAttribute())
475 {
476 switch (reader.LocalName)
477 {
478 case "added":
479 added = reader.Value.Equals("yes");
480 break;
481 case "category":
482 switch (reader.Value)
483 {
484 case "anyPath":
485 category = ColumnCategory.AnyPath;
486 break;
487 case "binary":
488 category = ColumnCategory.Binary;
489 break;
490 case "cabinet":
491 category = ColumnCategory.Cabinet;
492 break;
493 case "condition":
494 category = ColumnCategory.Condition;
495 break;
496 case "customSource":
497 category = ColumnCategory.CustomSource;
498 break;
499 case "defaultDir":
500 category = ColumnCategory.DefaultDir;
501 break;
502 case "doubleInteger":
503 category = ColumnCategory.DoubleInteger;
504 break;
505 case "filename":
506 category = ColumnCategory.Filename;
507 break;
508 case "formatted":
509 category = ColumnCategory.Formatted;
510 break;
511 case "formattedSddl":
512 category = ColumnCategory.FormattedSDDLText;
513 break;
514 case "guid":
515 category = ColumnCategory.Guid;
516 break;
517 case "identifier":
518 category = ColumnCategory.Identifier;
519 break;
520 case "integer":
521 category = ColumnCategory.Integer;
522 break;
523 case "language":
524 category = ColumnCategory.Language;
525 break;
526 case "lowerCase":
527 category = ColumnCategory.LowerCase;
528 break;
529 case "path":
530 category = ColumnCategory.Path;
531 break;
532 case "paths":
533 category = ColumnCategory.Paths;
534 break;
535 case "property":
536 category = ColumnCategory.Property;
537 break;
538 case "regPath":
539 category = ColumnCategory.RegPath;
540 break;
541 case "shortcut":
542 category = ColumnCategory.Shortcut;
543 break;
544 case "template":
545 category = ColumnCategory.Template;
546 break;
547 case "text":
548 category = ColumnCategory.Text;
549 break;
550 case "timeDate":
551 category = ColumnCategory.TimeDate;
552 break;
553 case "upperCase":
554 category = ColumnCategory.UpperCase;
555 break;
556 case "version":
557 category = ColumnCategory.Version;
558 break;
559 case "wildCardFilename":
560 category = ColumnCategory.WildCardFilename;
561 break;
562 default:
563 throw new InvalidOperationException();
564 }
565 break;
566 case "description":
567 description = reader.Value;
568 break;
569 case "escapeIdtCharacters":
570 escapeIdtCharacters = reader.Value.Equals("yes");
571 break;
572 case "keyColumn":
573 keyColumnSet = true;
574 keyColumn = Convert.ToInt32(reader.Value, 10);
575 break;
576 case "keyTable":
577 keyTable = reader.Value;
578 break;
579 case "length":
580 length = Convert.ToInt32(reader.Value, 10);
581 break;
582 case "localizable":
583 localizable = reader.Value.Equals("yes");
584 break;
585 case "maxValue":
586 maxValueSet = true;
587 maxValue = Convert.ToInt32(reader.Value, 10);
588 break;
589 case "minValue":
590 minValueSet = true;
591 minValue = Convert.ToInt32(reader.Value, 10);
592 break;
593 case "modularize":
594 switch (reader.Value)
595 {
596 case "column":
597 modularize = ColumnModularizeType.Column;
598 break;
599 case "companionFile":
600 modularize = ColumnModularizeType.CompanionFile;
601 break;
602 case "condition":
603 modularize = ColumnModularizeType.Condition;
604 break;
605 case "controlEventArgument":
606 modularize = ColumnModularizeType.ControlEventArgument;
607 break;
608 case "controlText":
609 modularize = ColumnModularizeType.ControlText;
610 break;
611 case "icon":
612 modularize = ColumnModularizeType.Icon;
613 break;
614 case "none":
615 modularize = ColumnModularizeType.None;
616 break;
617 case "property":
618 modularize = ColumnModularizeType.Property;
619 break;
620 case "semicolonDelimited":
621 modularize = ColumnModularizeType.SemicolonDelimited;
622 break;
623 default:
624 throw new XmlException();
625 }
626 break;
627 case "name":
628 switch (reader.Value)
629 {
630 case "CREATE":
631 case "DELETE":
632 case "DROP":
633 case "INSERT":
634 throw new XmlException();
635 default:
636 name = reader.Value;
637 break;
638 }
639 break;
640 case "nullable":
641 nullable = reader.Value.Equals("yes");
642 break;
643 case "primaryKey":
644 primaryKey = reader.Value.Equals("yes");
645 break;
646 case "set":
647 possibilities = reader.Value;
648 break;
649 case "type":
650 switch (reader.Value)
651 {
652 case "localized":
653 type = ColumnType.Localized;
654 break;
655 case "number":
656 type = ColumnType.Number;
657 break;
658 case "object":
659 type = ColumnType.Object;
660 break;
661 case "string":
662 type = ColumnType.String;
663 break;
664 case "preserved":
665 type = ColumnType.Preserved;
666 break;
667 default:
668 throw new XmlException();
669 }
670 break;
671 case "useCData":
672 useCData = reader.Value.Equals("yes");
673 break;
674 }
675 }
676
677 // parse the child elements (there should be none)
678 if (!empty)
679 {
680 bool done = false;
681
682 while (!done && reader.Read())
683 {
684 switch (reader.NodeType)
685 {
686 case XmlNodeType.Element:
687 throw new XmlException();
688 case XmlNodeType.EndElement:
689 done = true;
690 break;
691 }
692 }
693
694 if (!done)
695 {
696 throw new XmlException();
697 }
698 }
699
700 ColumnDefinition columnDefinition = new ColumnDefinition(name, type, length, primaryKey, nullable, modularize, localizable, minValueSet, minValue, maxValueSet, maxValue, keyTable, keyColumnSet, keyColumn, category, possibilities, description, escapeIdtCharacters, useCData);
701 columnDefinition.Added = added;
702
703 return columnDefinition;
704 }
705
706 /// <summary>
707 /// Persists a ColumnDefinition in an XML format.
708 /// </summary>
709 /// <param name="writer">XmlWriter where the Output should persist itself as XML.</param>
710 internal void Write(XmlWriter writer)
711 {
712 writer.WriteStartElement("columnDefinition", TableDefinitionCollection.XmlNamespaceUri);
713
714 writer.WriteAttributeString("name", this.name);
715
716 switch (this.type)
717 {
718 case ColumnType.Localized:
719 writer.WriteAttributeString("type", "localized");
720 break;
721 case ColumnType.Number:
722 writer.WriteAttributeString("type", "number");
723 break;
724 case ColumnType.Object:
725 writer.WriteAttributeString("type", "object");
726 break;
727 case ColumnType.String:
728 writer.WriteAttributeString("type", "string");
729 break;
730 case ColumnType.Preserved:
731 writer.WriteAttributeString("type", "preserved");
732 break;
733 }
734
735 writer.WriteAttributeString("length", this.length.ToString(CultureInfo.InvariantCulture.NumberFormat));
736
737 if (this.primaryKey)
738 {
739 writer.WriteAttributeString("primaryKey", "yes");
740 }
741
742 if (this.nullable)
743 {
744 writer.WriteAttributeString("nullable", "yes");
745 }
746
747 if (this.localizable)
748 {
749 writer.WriteAttributeString("localizable", "yes");
750 }
751
752 if (this.added)
753 {
754 writer.WriteAttributeString("added", "yes");
755 }
756
757 switch (this.modularize)
758 {
759 case ColumnModularizeType.Column:
760 writer.WriteAttributeString("modularize", "column");
761 break;
762 case ColumnModularizeType.CompanionFile:
763 writer.WriteAttributeString("modularize", "companionFile");
764 break;
765 case ColumnModularizeType.Condition:
766 writer.WriteAttributeString("modularize", "condition");
767 break;
768 case ColumnModularizeType.ControlEventArgument:
769 writer.WriteAttributeString("modularize", "controlEventArgument");
770 break;
771 case ColumnModularizeType.ControlText:
772 writer.WriteAttributeString("modularize", "controlText");
773 break;
774 case ColumnModularizeType.Icon:
775 writer.WriteAttributeString("modularize", "icon");
776 break;
777 case ColumnModularizeType.None:
778 // this is the default value
779 break;
780 case ColumnModularizeType.Property:
781 writer.WriteAttributeString("modularize", "property");
782 break;
783 case ColumnModularizeType.SemicolonDelimited:
784 writer.WriteAttributeString("modularize", "semicolonDelimited");
785 break;
786 }
787
788 if (this.minValueSet)
789 {
790 writer.WriteAttributeString("minValue", this.minValue.ToString(CultureInfo.InvariantCulture.NumberFormat));
791 }
792
793 if (this.maxValueSet)
794 {
795 writer.WriteAttributeString("maxValue", this.maxValue.ToString(CultureInfo.InvariantCulture.NumberFormat));
796 }
797
798 if (!String.IsNullOrEmpty(this.keyTable))
799 {
800 writer.WriteAttributeString("keyTable", this.keyTable);
801 }
802
803 if (this.keyColumnSet)
804 {
805 writer.WriteAttributeString("keyColumn", this.keyColumn.ToString(CultureInfo.InvariantCulture.NumberFormat));
806 }
807
808 switch (this.category)
809 {
810 case ColumnCategory.AnyPath:
811 writer.WriteAttributeString("category", "anyPath");
812 break;
813 case ColumnCategory.Binary:
814 writer.WriteAttributeString("category", "binary");
815 break;
816 case ColumnCategory.Cabinet:
817 writer.WriteAttributeString("category", "cabinet");
818 break;
819 case ColumnCategory.Condition:
820 writer.WriteAttributeString("category", "condition");
821 break;
822 case ColumnCategory.CustomSource:
823 writer.WriteAttributeString("category", "customSource");
824 break;
825 case ColumnCategory.DefaultDir:
826 writer.WriteAttributeString("category", "defaultDir");
827 break;
828 case ColumnCategory.DoubleInteger:
829 writer.WriteAttributeString("category", "doubleInteger");
830 break;
831 case ColumnCategory.Filename:
832 writer.WriteAttributeString("category", "filename");
833 break;
834 case ColumnCategory.Formatted:
835 writer.WriteAttributeString("category", "formatted");
836 break;
837 case ColumnCategory.FormattedSDDLText:
838 writer.WriteAttributeString("category", "formattedSddl");
839 break;
840 case ColumnCategory.Guid:
841 writer.WriteAttributeString("category", "guid");
842 break;
843 case ColumnCategory.Identifier:
844 writer.WriteAttributeString("category", "identifier");
845 break;
846 case ColumnCategory.Integer:
847 writer.WriteAttributeString("category", "integer");
848 break;
849 case ColumnCategory.Language:
850 writer.WriteAttributeString("category", "language");
851 break;
852 case ColumnCategory.LowerCase:
853 writer.WriteAttributeString("category", "lowerCase");
854 break;
855 case ColumnCategory.Path:
856 writer.WriteAttributeString("category", "path");
857 break;
858 case ColumnCategory.Paths:
859 writer.WriteAttributeString("category", "paths");
860 break;
861 case ColumnCategory.Property:
862 writer.WriteAttributeString("category", "property");
863 break;
864 case ColumnCategory.RegPath:
865 writer.WriteAttributeString("category", "regPath");
866 break;
867 case ColumnCategory.Shortcut:
868 writer.WriteAttributeString("category", "shortcut");
869 break;
870 case ColumnCategory.Template:
871 writer.WriteAttributeString("category", "template");
872 break;
873 case ColumnCategory.Text:
874 writer.WriteAttributeString("category", "text");
875 break;
876 case ColumnCategory.TimeDate:
877 writer.WriteAttributeString("category", "timeDate");
878 break;
879 case ColumnCategory.UpperCase:
880 writer.WriteAttributeString("category", "upperCase");
881 break;
882 case ColumnCategory.Version:
883 writer.WriteAttributeString("category", "version");
884 break;
885 case ColumnCategory.WildCardFilename:
886 writer.WriteAttributeString("category", "wildCardFilename");
887 break;
888 }
889
890 if (!String.IsNullOrEmpty(this.possibilities))
891 {
892 writer.WriteAttributeString("set", this.possibilities);
893 }
894
895 if (!String.IsNullOrEmpty(this.description))
896 {
897 writer.WriteAttributeString("description", this.description);
898 }
899
900 if (this.escapeIdtCharacters)
901 {
902 writer.WriteAttributeString("escapeIdtCharacters", "yes");
903 }
904
905 if (this.useCData)
906 {
907 writer.WriteAttributeString("useCData", "yes");
908 }
909
910 writer.WriteEndElement();
911 }
912
913 /// <summary>
914 /// Validate a value for this column.
915 /// </summary>
916 /// <param name="value">The value to validate.</param>
917 /// <returns>Validated value.</returns>
918 internal object ValidateValue(object value)
919 {
920 if (null == value)
921 {
922 if (!this.nullable)
923 {
924 throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Cannot set column '{0}' with a null value because this is a required field.", this.name));
925 }
926 }
927 else // check numerical values against their specified minimum and maximum values.
928 {
929 if (ColumnType.Number == this.type && !this.IsLocalizable)
930 {
931 // For now all enums in the tables can be represented by integers. This if statement would need to
932 // be enhanced if that ever changes.
933 if (value is int || value.GetType().IsEnum)
934 {
935 int intValue = (int)value;
936
937 // validate the value against the minimum allowed value
938 if (this.minValueSet && this.minValue > intValue)
939 {
940 throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Cannot set column '{0}' with value {1} because it is less than the minimum allowed value for this column, {2}.", this.name, intValue, this.minValue));
941 }
942
943 // validate the value against the maximum allowed value
944 if (this.maxValueSet && this.maxValue < intValue)
945 {
946 throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Cannot set column '{0}' with value {1} because it is greater than the maximum allowed value for this column, {2}.", this.name, intValue, this.maxValue));
947 }
948
949 return intValue;
950 }
951 else if (value is long)
952 {
953 long longValue = (long)value;
954
955 // validate the value against the minimum allowed value
956 if (this.minValueSet && this.minValue > longValue)
957 {
958 throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Cannot set column '{0}' with value {1} because it is less than the minimum allowed value for this column, {2}.", this.name, longValue, this.minValue));
959 }
960
961 // validate the value against the maximum allowed value
962 if (this.maxValueSet && this.maxValue < longValue)
963 {
964 throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Cannot set column '{0}' with value {1} because it is greater than the maximum allowed value for this column, {2}.", this.name, longValue, this.maxValue));
965 }
966
967 return longValue;
968 }
969 else
970 {
971 throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Cannot set number column '{0}' with a value of type '{1}'.", this.name, value.GetType().ToString()));
972 }
973 }
974 else
975 {
976 if (!(value is string))
977 {
978 //throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Cannot set string column '{0}' with a value of type '{1}'.", this.name, value.GetType().ToString()));
979 return value.ToString();
980 }
981 }
982 }
983
984 return value;
985 }
986
987 /// <summary>
988 /// Compare this column definition to another column definition.
989 /// </summary>
990 /// <remarks>
991 /// Only Windows Installer traits are compared, allowing for updates to WiX-specific table definitions.
992 /// </remarks>
993 /// <param name="other">The <see cref="ColumnDefinition"/> to compare with this one.</param>
994 /// <returns>0 if the columns' core propeties are the same; otherwise, non-0.</returns>
995 public int CompareTo(ColumnDefinition other)
996 {
997 // by definition, this object is greater than null
998 if (null == other)
999 {
1000 return 1;
1001 }
1002
1003 // compare column names
1004 int ret = String.Compare(this.Name, other.Name, StringComparison.Ordinal);
1005
1006 // compare column types
1007 if (0 == ret)
1008 {
1009 ret = this.Type == other.Type ? 0 : -1;
1010
1011 // compare column lengths
1012 if (0 == ret)
1013 {
1014 ret = this.Length == other.Length ? 0 : -1;
1015
1016 // compare whether both are primary keys
1017 if (0 == ret)
1018 {
1019 ret = this.PrimaryKey == other.PrimaryKey ? 0 : -1;
1020
1021 // compare nullability
1022 if (0 == ret)
1023 {
1024 ret = this.Nullable == other.Nullable ? 0 : -1;
1025 }
1026 }
1027 }
1028 }
1029
1030 return ret;
1031 }
1032 }
1033}
diff --git a/src/WixToolset.Data.WindowsInstaller/Common.cs b/src/WixToolset.Data.WindowsInstaller/Common.cs
deleted file mode 100644
index a1e1e607..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Common.cs
+++ /dev/null
@@ -1,25 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Text.RegularExpressions;
7
8 internal static class Common
9 {
10 private static readonly Regex LegalIdentifierCharacters = new Regex(@"^[_A-Za-z][0-9A-Za-z_\.]*$", RegexOptions.Compiled);
11
12 public static bool IsIdentifier(string value)
13 {
14 if (!String.IsNullOrEmpty(value))
15 {
16 if (LegalIdentifierCharacters.IsMatch(value))
17 {
18 return true;
19 }
20 }
21
22 return false;
23 }
24 }
25}
diff --git a/src/WixToolset.Data.WindowsInstaller/Data/actions.xml b/src/WixToolset.Data.WindowsInstaller/Data/actions.xml
deleted file mode 100644
index f65b792d..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Data/actions.xml
+++ /dev/null
@@ -1,76 +0,0 @@
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.Data.WindowsInstaller/Data/tables.xml b/src/WixToolset.Data.WindowsInstaller/Data/tables.xml
deleted file mode 100644
index e4b5e954..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Data/tables.xml
+++ /dev/null
@@ -1,1962 +0,0 @@
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.Data.WindowsInstaller/Field.cs b/src/WixToolset.Data.WindowsInstaller/Field.cs
deleted file mode 100644
index 74b78229..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Field.cs
+++ /dev/null
@@ -1,266 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Diagnostics;
7 using System.Globalization;
8 using System.Xml;
9
10 /// <summary>
11 /// Field containing data for a column in a row.
12 /// </summary>
13 public class Field
14 {
15 private object data;
16
17 /// <summary>
18 /// Instantiates a new Field.
19 /// </summary>
20 /// <param name="columnDefinition">Column definition for this field.</param>
21 protected Field(ColumnDefinition columnDefinition)
22 {
23 this.Column = columnDefinition;
24 }
25
26 /// <summary>
27 /// Gets or sets the column definition for this field.
28 /// </summary>
29 /// <value>Column definition.</value>
30 public ColumnDefinition Column { get; private set; }
31
32 /// <summary>
33 /// Gets or sets the data for this field.
34 /// </summary>
35 /// <value>Data in the field.</value>
36 public object Data
37 {
38 get
39 {
40 return this.data;
41 }
42
43 set
44 {
45 // Validate the value before setting it.
46 this.data = this.Column.ValidateValue(value);
47 }
48 }
49
50 /// <summary>
51 /// Gets or sets whether this field is modified.
52 /// </summary>
53 /// <value>Whether this field is modified.</value>
54 public bool Modified { get; set; }
55
56 /// <summary>
57 /// Gets or sets the previous data.
58 /// </summary>
59 /// <value>The previous data.</value>
60 public string PreviousData { get; set; }
61
62 /// <summary>
63 /// Instantiate a new Field object of the correct type.
64 /// </summary>
65 /// <param name="columnDefinition">The column definition for the field.</param>
66 /// <returns>The new Field object.</returns>
67 public static Field Create(ColumnDefinition columnDefinition)
68 {
69 return (ColumnType.Object == columnDefinition.Type) ? new ObjectField(columnDefinition) : new Field(columnDefinition);
70 }
71
72 /// <summary>
73 /// Sets the value of a particular field in the row without validating.
74 /// </summary>
75 /// <param name="field">field index.</param>
76 /// <param name="value">Value of a field in the row.</param>
77 /// <returns>True if successful, false if validation failed.</returns>
78 public bool BestEffortSet(object value)
79 {
80 bool success = true;
81 object bestEffortValue = value;
82
83 try
84 {
85 bestEffortValue = this.Column.ValidateValue(value);
86 }
87 catch (InvalidOperationException)
88 {
89 success = false;
90 }
91
92 this.data = bestEffortValue;
93 return success;
94 }
95
96 /// <summary>
97 /// Determine if this field is identical to another field.
98 /// </summary>
99 /// <param name="field">The other field to compare to.</param>
100 /// <returns>true if they are equal; false otherwise.</returns>
101 public bool IsIdentical(Field field)
102 {
103 return (this.Column.Name == field.Column.Name &&
104 ((null != this.data && this.data.Equals(field.data)) || (null == this.data && null == field.data)));
105 }
106
107 /// <summary>
108 /// Overrides the built in object implementation to return the field's data as a string.
109 /// </summary>
110 /// <returns>Field's data as a string.</returns>
111 public override string ToString()
112 {
113 return this.AsString();
114 }
115
116 /// <summary>
117 /// Gets the field as an integer.
118 /// </summary>
119 /// <returns>Field's data as an integer.</returns>
120 public int AsInteger()
121 {
122 return (this.data is int) ? (int)this.data : Convert.ToInt32(this.data, CultureInfo.InvariantCulture);
123 }
124
125 /// <summary>
126 /// Gets the field as an integer that could be null.
127 /// </summary>
128 /// <returns>Field's data as an integer that could be null.</returns>
129 public int? AsNullableInteger()
130 {
131 return (null == this.data) ? (int?)null : (this.data is int) ? (int)this.data : Convert.ToInt32(this.data, CultureInfo.InvariantCulture);
132 }
133
134 /// <summary>
135 /// Gets the field as a string.
136 /// </summary>
137 /// <returns>Field's data as a string.</returns>
138 public string AsString()
139 {
140 return (null == this.data) ? null : Convert.ToString(this.data, CultureInfo.InvariantCulture);
141 }
142
143 /// <summary>
144 /// Parse a field from the xml.
145 /// </summary>
146 /// <param name="reader">XmlReader where the intermediate is persisted.</param>
147 internal virtual void Read(XmlReader reader)
148 {
149 Debug.Assert("field" == reader.LocalName);
150
151 bool empty = reader.IsEmptyElement;
152
153 while (reader.MoveToNextAttribute())
154 {
155 switch (reader.LocalName)
156 {
157 case "modified":
158 this.Modified = reader.Value.Equals("yes");
159 break;
160 case "previousData":
161 this.PreviousData = reader.Value;
162 break;
163 }
164 }
165
166 if (!empty)
167 {
168 bool done = false;
169
170 while (!done && reader.Read())
171 {
172 switch (reader.NodeType)
173 {
174 case XmlNodeType.Element:
175 throw new XmlException();
176 case XmlNodeType.CDATA:
177 case XmlNodeType.Text:
178 case XmlNodeType.SignificantWhitespace:
179 if (0 < reader.Value.Length)
180 {
181 if (ColumnType.Number == this.Column.Type && !this.Column.IsLocalizable)
182 {
183 // older wix files could persist data as a long value (which would overflow an int)
184 // since the Convert class always throws exceptions for overflows, read in integral
185 // values as a long to avoid the overflow, then cast it to an int (this operation can
186 // overflow without throwing an exception inside an unchecked block)
187 this.data = unchecked((int)Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture));
188 }
189 else
190 {
191 this.data = reader.Value;
192 }
193 }
194 break;
195 case XmlNodeType.EndElement:
196 done = true;
197 break;
198 }
199 }
200
201 if (!done)
202 {
203 throw new XmlException();
204 }
205 }
206 }
207
208 /// <summary>
209 /// Persists a field in an XML format.
210 /// </summary>
211 /// <param name="writer">XmlWriter where the Field should persist itself as XML.</param>
212 internal virtual void Write(XmlWriter writer)
213 {
214 writer.WriteStartElement("field", Intermediate.XmlNamespaceUri);
215
216 if (this.Modified)
217 {
218 writer.WriteAttributeString("modified", "yes");
219 }
220
221 if (null != this.PreviousData)
222 {
223 writer.WriteAttributeString("previousData", this.PreviousData);
224 }
225
226 // Convert the data to a string that will persist nicely (nulls as String.Empty).
227 string text = Convert.ToString(this.data, CultureInfo.InvariantCulture);
228 if (this.Column.UseCData)
229 {
230 writer.WriteCData(text);
231 }
232 else
233 {
234 writer.WriteString(text);
235 }
236
237 writer.WriteEndElement();
238 }
239
240 /// <summary>
241 /// Returns the field data in a format usable in IDT files.
242 /// </summary>
243 /// <returns>Field data in string IDT format.</returns>
244 internal string ToIdtValue()
245 {
246 if (null == this.data)
247 {
248 return null;
249 }
250 else
251 {
252 string fieldData = Convert.ToString(this.data, CultureInfo.InvariantCulture);
253
254 // special idt-specific escaping
255 if (this.Column.EscapeIdtCharacters)
256 {
257 fieldData = fieldData.Replace('\t', '\x10');
258 fieldData = fieldData.Replace('\r', '\x11');
259 fieldData = fieldData.Replace('\n', '\x19');
260 }
261
262 return fieldData;
263 }
264 }
265 }
266}
diff --git a/src/WixToolset.Data.WindowsInstaller/ObjectField.cs b/src/WixToolset.Data.WindowsInstaller/ObjectField.cs
deleted file mode 100644
index 42ef111b..00000000
--- a/src/WixToolset.Data.WindowsInstaller/ObjectField.cs
+++ /dev/null
@@ -1,183 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Diagnostics;
7 using System.Globalization;
8 using System.Xml;
9
10 /// <summary>
11 /// Field containing data for an object column in a row.
12 /// </summary>
13 public sealed class ObjectField : Field
14 {
15 /// <summary>
16 /// Instantiates a new Field.
17 /// </summary>
18 /// <param name="columnDefinition">Column definition for this field.</param>
19 internal ObjectField(ColumnDefinition columnDefinition) :
20 base(columnDefinition)
21 {
22 }
23
24 /// <summary>
25 /// Gets or sets the index of the embedded file in a library.
26 /// </summary>
27 /// <value>The index of the embedded file.</value>
28 public int? EmbeddedFileIndex { get; set; }
29
30 /// <summary>
31 /// Gets or sets the previous index of the embedded file in the library.
32 /// </summary>
33 /// <value>The previous index of the embedded file.</value>
34 public int? PreviousEmbeddedFileIndex { get; set; }
35
36 /// <summary>
37 /// Gets or sets the path to the embedded cabinet of the previous file.
38 /// </summary>
39 /// <value>The path of the cabinet containing the previous file.</value>
40 public Uri PreviousBaseUri { get; set; }
41
42 /// <summary>
43 /// Gets the base URI of the object field.
44 /// </summary>
45 /// <value>The base URI of the object field.</value>
46 public Uri BaseUri { get; private set; }
47
48 /// <summary>
49 /// Gets or sets the unresolved data for this field.
50 /// </summary>
51 /// <value>Unresolved Data in the field.</value>
52 public string UnresolvedData { get; set; }
53
54 /// <summary>
55 /// Gets or sets the unresolved previous data.
56 /// </summary>
57 /// <value>The unresolved previous data.</value>
58 public string UnresolvedPreviousData { get; set; }
59
60 /// <summary>
61 /// Parse a field from the xml.
62 /// </summary>
63 /// <param name="reader">XmlReader where the intermediate is persisted.</param>
64 internal override void Read(XmlReader reader)
65 {
66 Debug.Assert("field" == reader.LocalName);
67
68 bool empty = reader.IsEmptyElement;
69
70 this.BaseUri = new Uri(reader.BaseURI);
71
72 while (reader.MoveToNextAttribute())
73 {
74 switch (reader.LocalName)
75 {
76 case "cabinetFileId":
77 this.EmbeddedFileIndex = Convert.ToInt32(reader.Value);
78 break;
79 case "modified":
80 this.Modified = reader.Value.Equals("yes");
81 break;
82 case "previousData":
83 this.PreviousData = reader.Value;
84 break;
85 case "unresolvedPreviousData":
86 this.UnresolvedPreviousData = reader.Value;
87 break;
88 case "unresolvedData":
89 this.UnresolvedData = reader.Value;
90 break;
91 case "previousCabinetFileId":
92 this.PreviousEmbeddedFileIndex = Convert.ToInt32(reader.Value);
93 break;
94 }
95 }
96
97 if (!empty)
98 {
99 bool done = false;
100
101 while (!done && reader.Read())
102 {
103 switch (reader.NodeType)
104 {
105 case XmlNodeType.Element:
106 throw new XmlException();
107 case XmlNodeType.CDATA:
108 case XmlNodeType.Text:
109 if (0 < reader.Value.Length)
110 {
111 this.Data = reader.Value;
112 }
113 break;
114 case XmlNodeType.EndElement:
115 done = true;
116 break;
117 }
118 }
119
120 if (!done)
121 {
122 throw new XmlException();
123 }
124 }
125 }
126
127 /// <summary>
128 /// Persists a field in an XML format.
129 /// </summary>
130 /// <param name="writer">XmlWriter where the Field should persist itself as XML.</param>
131 internal override void Write(XmlWriter writer)
132 {
133 writer.WriteStartElement("field", Intermediate.XmlNamespaceUri);
134
135 if (this.EmbeddedFileIndex.HasValue)
136 {
137 writer.WriteStartAttribute("cabinetFileId");
138 writer.WriteValue(this.EmbeddedFileIndex);
139 writer.WriteEndAttribute();
140 }
141
142 if (this.Modified)
143 {
144 writer.WriteAttributeString("modified", "yes");
145 }
146
147 if (null != this.UnresolvedPreviousData)
148 {
149 writer.WriteAttributeString("unresolvedPreviousData", this.UnresolvedPreviousData);
150 }
151
152 if (null != this.PreviousData)
153 {
154 writer.WriteAttributeString("previousData", this.PreviousData);
155 }
156
157 if (null != this.UnresolvedData)
158 {
159 writer.WriteAttributeString("unresolvedData", this.UnresolvedData);
160 }
161
162 if (this.PreviousEmbeddedFileIndex.HasValue)
163 {
164 writer.WriteStartAttribute("previousCabinetFileId");
165 writer.WriteValue(this.PreviousEmbeddedFileIndex);
166 writer.WriteEndAttribute();
167 }
168
169 // Convert the data to a string that will persist nicely (nulls as String.Empty).
170 string text = Convert.ToString(this.Data, CultureInfo.InvariantCulture);
171 if (this.Column.UseCData)
172 {
173 writer.WriteCData(text);
174 }
175 else
176 {
177 writer.WriteString(text);
178 }
179
180 writer.WriteEndElement();
181 }
182 }
183}
diff --git a/src/WixToolset.Data.WindowsInstaller/Output.cs b/src/WixToolset.Data.WindowsInstaller/Output.cs
deleted file mode 100644
index 26772872..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Output.cs
+++ /dev/null
@@ -1,337 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Globalization;
8 using System.IO;
9 using System.Linq;
10 using System.Xml;
11
12 /// <summary>
13 /// Output is generated by the linker.
14 /// </summary>
15 public sealed class Output
16 {
17 public const string XmlNamespaceUri = "http://wixtoolset.org/schemas/v4/wixout";
18 private static readonly Version CurrentVersion = new Version("4.0.0.0");
19
20 /// <summary>
21 /// Creates a new empty output object.
22 /// </summary>
23 /// <param name="sourceLineNumbers">The source line information for the output.</param>
24 public Output(SourceLineNumber sourceLineNumbers)
25 {
26 this.SourceLineNumbers = sourceLineNumbers;
27 this.SubStorages = new List<SubStorage>();
28 this.Tables = new TableIndexedCollection();
29 }
30
31 /// <summary>
32 /// Gets the type of the output.
33 /// </summary>
34 /// <value>Type of the output.</value>
35 public OutputType Type { get; set; }
36
37 /// <summary>
38 /// Gets or sets the codepage for this output.
39 /// </summary>
40 /// <value>Codepage of the output.</value>
41 public int Codepage { get; set; }
42
43 /// <summary>
44 /// Gets the source line information for this output.
45 /// </summary>
46 /// <value>The source line information for this output.</value>
47 public SourceLineNumber SourceLineNumbers { get; private set; }
48
49 /// <summary>
50 /// Gets the substorages in this output.
51 /// </summary>
52 /// <value>The substorages in this output.</value>
53 public ICollection<SubStorage> SubStorages { get; private set; }
54
55 /// <summary>
56 /// Gets the tables contained in this output.
57 /// </summary>
58 /// <value>Collection of tables.</value>
59 public TableIndexedCollection Tables { get; private set; }
60
61 /// <summary>
62 /// Gets the output type corresponding to a given output filename extension.
63 /// </summary>
64 /// <param name="extension">Case-insensitive output filename extension.</param>
65 /// <returns>Output type for the extension.</returns>
66 public static OutputType GetOutputType(string extension)
67 {
68 if (extension.Equals(".exe", StringComparison.OrdinalIgnoreCase))
69 {
70 return OutputType.Bundle;
71 }
72 if (extension.Equals(".msi", StringComparison.OrdinalIgnoreCase))
73 {
74 return OutputType.Product;
75 }
76 else if (extension.Equals(".msm", StringComparison.OrdinalIgnoreCase))
77 {
78 return OutputType.Module;
79 }
80 else if (extension.Equals(".msp", StringComparison.OrdinalIgnoreCase))
81 {
82 return OutputType.Patch;
83 }
84 else if (extension.Equals(".mst", StringComparison.OrdinalIgnoreCase))
85 {
86 return OutputType.Transform;
87 }
88 else if (extension.Equals(".pcp", StringComparison.OrdinalIgnoreCase))
89 {
90 return OutputType.PatchCreation;
91 }
92 else
93 {
94 return OutputType.Unknown;
95 }
96 }
97
98 /// <summary>
99 /// Gets the filename extension corresponding to a given output type.
100 /// </summary>
101 /// <param name="type">One of the WiX output types.</param>
102 /// <returns>Filename extension for the output type, for example ".msi".</returns>
103 public static string GetExtension(OutputType type)
104 {
105 switch (type)
106 {
107 case OutputType.Bundle:
108 return ".exe";
109 case OutputType.Product:
110 return ".msi";
111 case OutputType.Module:
112 return ".msm";
113 case OutputType.Patch:
114 return ".msp";
115 case OutputType.Transform:
116 return ".mst";
117 case OutputType.PatchCreation:
118 return ".pcp";
119 default:
120 return ".wix";
121 }
122 }
123
124 /// <summary>
125 /// Loads an output from a path on disk.
126 /// </summary>
127 /// <param name="path">Path to output file saved on disk.</param>
128 /// <param name="suppressVersionCheck">Suppresses wix.dll version mismatch check.</param>
129 /// <returns>Output object.</returns>
130 public static Output Load(string path, bool suppressVersionCheck)
131 {
132 using (FileStream stream = File.OpenRead(path))
133 using (FileStructure fs = FileStructure.Read(stream))
134 {
135 if (FileFormat.Wixout != fs.FileFormat)
136 {
137 throw new WixUnexpectedFileFormatException(path, FileFormat.Wixout, fs.FileFormat);
138 }
139
140 Uri uri = new Uri(Path.GetFullPath(path));
141 using (XmlReader reader = XmlReader.Create(fs.GetDataStream(), null, uri.AbsoluteUri))
142 {
143 try
144 {
145 reader.MoveToContent();
146 return Output.Read(reader, suppressVersionCheck);
147 }
148 catch (XmlException xe)
149 {
150 throw new WixCorruptFileException(path, fs.FileFormat, xe);
151 }
152 }
153 }
154 }
155
156 /// <summary>
157 /// Saves an output to a path on disk.
158 /// </summary>
159 /// <param name="path">Path to save output file to on disk.</param>
160 public void Save(string path)
161 {
162 Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(path)));
163
164 using (FileStream stream = File.Create(path))
165 using (FileStructure fs = FileStructure.Create(stream, FileFormat.Wixout, null))
166 using (XmlWriter writer = XmlWriter.Create(fs.GetDataStream()))
167 {
168 writer.WriteStartDocument();
169 this.Write(writer);
170 writer.WriteEndDocument();
171 }
172 }
173
174 /// <summary>
175 /// Processes an XmlReader and builds up the output object.
176 /// </summary>
177 /// <param name="reader">Reader to get data from.</param>
178 /// <param name="suppressVersionCheck">Suppresses wix.dll version mismatch check.</param>
179 /// <returns>The Output represented by the Xml.</returns>
180 internal static Output Read(XmlReader reader, bool suppressVersionCheck)
181 {
182 if (!reader.LocalName.Equals("wixOutput"))
183 {
184 throw new XmlException();
185 }
186
187 bool empty = reader.IsEmptyElement;
188 Output output = new Output(SourceLineNumber.CreateFromUri(reader.BaseURI));
189 Version version = null;
190
191 while (reader.MoveToNextAttribute())
192 {
193 switch (reader.LocalName)
194 {
195 case "codepage":
196 output.Codepage = Convert.ToInt32(reader.Value, CultureInfo.InvariantCulture.NumberFormat);
197 break;
198 case "type":
199 switch (reader.Value)
200 {
201 case "Bundle":
202 output.Type = OutputType.Bundle;
203 break;
204 case "Module":
205 output.Type = OutputType.Module;
206 break;
207 case "Patch":
208 output.Type = OutputType.Patch;
209 break;
210 case "PatchCreation":
211 output.Type = OutputType.PatchCreation;
212 break;
213 case "Product":
214 output.Type = OutputType.Product;
215 break;
216 case "Transform":
217 output.Type = OutputType.Transform;
218 break;
219 default:
220 throw new XmlException();
221 }
222 break;
223 case "version":
224 version = new Version(reader.Value);
225 break;
226 }
227 }
228
229 if (!suppressVersionCheck && null != version && !Output.CurrentVersion.Equals(version))
230 {
231 throw new WixException(WixDataErrors.VersionMismatch(SourceLineNumber.CreateFromUri(reader.BaseURI), "wixOutput", version.ToString(), Output.CurrentVersion.ToString()));
232 }
233
234 // loop through the rest of the xml building up the Output object
235 TableDefinitionCollection tableDefinitions = null;
236 List<Table> tables = new List<Table>();
237 if (!empty)
238 {
239 bool done = false;
240
241 // loop through all the fields in a row
242 while (!done && reader.Read())
243 {
244 switch (reader.NodeType)
245 {
246 case XmlNodeType.Element:
247 switch (reader.LocalName)
248 {
249 case "subStorage":
250 output.SubStorages.Add(SubStorage.Read(reader));
251 break;
252 case "table":
253 if (null == tableDefinitions)
254 {
255 throw new XmlException();
256 }
257 tables.Add(Table.Read(reader, tableDefinitions));
258 break;
259 case "tableDefinitions":
260 tableDefinitions = TableDefinitionCollection.Read(reader);
261 break;
262 default:
263 throw new XmlException();
264 }
265 break;
266 case XmlNodeType.EndElement:
267 done = true;
268 break;
269 }
270 }
271
272 if (!done)
273 {
274 throw new XmlException();
275 }
276 }
277
278 output.Tables = new TableIndexedCollection(tables);
279 return output;
280 }
281
282 /// <summary>
283 /// Ensure this output contains a particular table.
284 /// </summary>
285 /// <param name="tableDefinition">Definition of the table that should exist.</param>
286 /// <param name="section">Optional section to use for the table. If one is not provided, the entry section will be used.</param>
287 /// <returns>The table in this output.</returns>
288 public Table EnsureTable(TableDefinition tableDefinition)
289 {
290 if (!this.Tables.TryGetTable(tableDefinition.Name, out Table table))
291 {
292 table = new Table(tableDefinition);
293 this.Tables.Add(table);
294 }
295
296 return table;
297 }
298
299 /// <summary>
300 /// Persists an output in an XML format.
301 /// </summary>
302 /// <param name="writer">XmlWriter where the Output should persist itself as XML.</param>
303 internal void Write(XmlWriter writer)
304 {
305 writer.WriteStartElement("wixOutput", XmlNamespaceUri);
306
307 writer.WriteAttributeString("type", this.Type.ToString());
308
309 if (0 != this.Codepage)
310 {
311 writer.WriteAttributeString("codepage", this.Codepage.ToString(CultureInfo.InvariantCulture));
312 }
313
314 writer.WriteAttributeString("version", Output.CurrentVersion.ToString());
315
316 // Collect all the table definitions and write them.
317 TableDefinitionCollection tableDefinitions = new TableDefinitionCollection();
318 foreach (Table table in this.Tables)
319 {
320 tableDefinitions.Add(table.Definition);
321 }
322 tableDefinitions.Write(writer);
323
324 foreach (Table table in this.Tables.OrderBy(t => t.Name))
325 {
326 table.Write(writer);
327 }
328
329 foreach (SubStorage subStorage in this.SubStorages)
330 {
331 subStorage.Write(writer);
332 }
333
334 writer.WriteEndElement();
335 }
336 }
337}
diff --git a/src/WixToolset.Data.WindowsInstaller/Pdb.cs b/src/WixToolset.Data.WindowsInstaller/Pdb.cs
deleted file mode 100644
index 03c3ddbb..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Pdb.cs
+++ /dev/null
@@ -1,163 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.IO;
7 using System.Xml;
8
9 /// <summary>
10 /// Pdb generated by the binder.
11 /// </summary>
12 public sealed class Pdb
13 {
14 public const string XmlNamespaceUri = "http://wixtoolset.org/schemas/v4/wixpdb";
15 private static readonly Version CurrentVersion = new Version("4.0.0.0");
16
17 /// <summary>
18 /// Creates a new empty pdb object.
19 /// </summary>
20 /// <param name="sourceLineNumbers">The source line information for the pdb.</param>
21 public Pdb()
22 {
23 }
24
25 /// <summary>
26 /// Gets or sets the output that is a part of this pdb.
27 /// </summary>
28 /// <value>Type of the output.</value>
29 public Output Output { get; set; }
30
31 /// <summary>
32 /// Loads a pdb from a path on disk.
33 /// </summary>
34 /// <param name="path">Path to pdb file saved on disk.</param>
35 /// <param name="suppressVersionCheck">Suppresses wix.dll version mismatch check.</param>
36 /// <returns>Pdb pdb.</returns>
37 public static Pdb Load(string path, bool suppressVersionCheck)
38 {
39 using (FileStream stream = File.OpenRead(path))
40 using (FileStructure fs = FileStructure.Read(stream))
41 {
42 if (FileFormat.Wixpdb != fs.FileFormat)
43 {
44 throw new WixUnexpectedFileFormatException(path, FileFormat.Wixpdb, fs.FileFormat);
45 }
46
47 Uri uri = new Uri(Path.GetFullPath(path));
48 using (XmlReader reader = XmlReader.Create(fs.GetDataStream(), null, uri.AbsoluteUri))
49 {
50 try
51 {
52 reader.MoveToContent();
53 return Pdb.Read(reader, suppressVersionCheck);
54 }
55 catch (XmlException xe)
56 {
57 throw new WixCorruptFileException(path, fs.FileFormat, xe);
58 }
59 }
60 }
61 }
62
63 /// <summary>
64 /// Saves a pdb to a path on disk.
65 /// </summary>
66 /// <param name="path">Path to save pdb file to on disk.</param>
67 public void Save(string path)
68 {
69 Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(path)));
70
71 using (FileStream stream = File.Create(path))
72 using (FileStructure fs = FileStructure.Create(stream, FileFormat.Wixpdb, null))
73 using (XmlWriter writer = XmlWriter.Create(fs.GetDataStream()))
74 {
75 writer.WriteStartDocument();
76 this.Write(writer);
77 writer.WriteEndDocument();
78 }
79 }
80
81 /// <summary>
82 /// Processes an XmlReader and builds up the pdb object.
83 /// </summary>
84 /// <param name="reader">Reader to get data from.</param>
85 /// <param name="suppressVersionCheck">Suppresses wix.dll version mismatch check.</param>
86 /// <returns>The Pdb represented by the Xml.</returns>
87 internal static Pdb Read(XmlReader reader, bool suppressVersionCheck)
88 {
89 if ("wixPdb" != reader.LocalName)
90 {
91 throw new XmlException();
92 }
93
94 bool empty = reader.IsEmptyElement;
95 Pdb pdb = new Pdb();
96 Version version = null;
97
98 while (reader.MoveToNextAttribute())
99 {
100 switch (reader.LocalName)
101 {
102 case "version":
103 version = new Version(reader.Value);
104 break;
105 }
106 }
107
108 if (!suppressVersionCheck && null != version && !Pdb.CurrentVersion.Equals(version))
109 {
110 throw new WixException(WixDataErrors.VersionMismatch(SourceLineNumber.CreateFromUri(reader.BaseURI), "wixPdb", version.ToString(), Pdb.CurrentVersion.ToString()));
111 }
112
113 // loop through the rest of the pdb building up the Output object
114 if (!empty)
115 {
116 bool done = false;
117
118 // loop through all the fields in a row
119 while (!done && reader.Read())
120 {
121 switch (reader.NodeType)
122 {
123 case XmlNodeType.Element:
124 switch (reader.LocalName)
125 {
126 case "wixOutput":
127 pdb.Output = Output.Read(reader, suppressVersionCheck);
128 break;
129 default:
130 throw new XmlException();
131 }
132 break;
133 case XmlNodeType.EndElement:
134 done = true;
135 break;
136 }
137 }
138
139 if (!done)
140 {
141 throw new XmlException();
142 }
143 }
144
145 return pdb;
146 }
147
148 /// <summary>
149 /// Persists a pdb in an XML format.
150 /// </summary>
151 /// <param name="writer">XmlWriter where the Pdb should persist itself as XML.</param>
152 internal void Write(XmlWriter writer)
153 {
154 writer.WriteStartElement("wixPdb", XmlNamespaceUri);
155
156 writer.WriteAttributeString("version", Pdb.CurrentVersion.ToString());
157
158 this.Output.Write(writer);
159
160 writer.WriteEndElement();
161 }
162 }
163}
diff --git a/src/WixToolset.Data.WindowsInstaller/Row.cs b/src/WixToolset.Data.WindowsInstaller/Row.cs
deleted file mode 100644
index 962ed0f4..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Row.cs
+++ /dev/null
@@ -1,620 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Diagnostics;
8 using System.Diagnostics.CodeAnalysis;
9 using System.Globalization;
10 using System.Text;
11 using System.Text.RegularExpressions;
12 using System.Xml;
13
14 /// <summary>
15 /// Row containing data for a table.
16 /// </summary>
17 public class Row
18 {
19 private static long rowCount;
20
21 private Field[] fields;
22
23 /// <summary>
24 /// Creates a row that belongs to a table.
25 /// </summary>
26 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
27 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
28 /// <remarks>The compiler should use this constructor exclusively.</remarks>
29 public Row(SourceLineNumber sourceLineNumbers, Table table)
30 : this(sourceLineNumbers, table.Definition)
31 {
32 this.Table = table;
33 }
34
35 /// <summary>
36 /// Creates a row that does not belong to a table.
37 /// </summary>
38 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
39 /// <param name="tableDefinition">TableDefinition this row should get its column definitions from.</param>
40 /// <remarks>This constructor is used in cases where there isn't a clear owner of the row. The linker uses this constructor for the rows it generates.</remarks>
41 public Row(SourceLineNumber sourceLineNumbers, TableDefinition tableDefinition)
42 {
43 this.Number = rowCount++;
44 this.SourceLineNumbers = sourceLineNumbers;
45 this.fields = new Field[tableDefinition.Columns.Count];
46 this.TableDefinition = tableDefinition;
47
48 for (int i = 0; i < this.fields.Length; ++i)
49 {
50 this.fields[i] = Field.Create(this.TableDefinition.Columns[i]);
51 }
52 }
53
54 /// <summary>
55 /// Creates a shallow copy of a row from another row.
56 /// </summary>
57 /// <param name="source">The row the data is copied from.</param>
58 protected Row(Row source)
59 {
60 this.Table = source.Table;
61 this.TableDefinition = source.TableDefinition;
62 this.Number = source.Number;
63 this.Access = source.Access;
64 this.Operation = source.Operation;
65 this.Redundant = source.Redundant;
66 this.SectionId = source.SectionId;
67 this.SourceLineNumbers = source.SourceLineNumbers;
68 this.fields = source.fields;
69 }
70
71 /// <summary>
72 /// Gets or sets the access to the row's primary key.
73 /// </summary>
74 /// <value>The row access modifier.</value>
75 public AccessModifier Access { get; set; }
76
77 /// <summary>
78 /// Gets or sets the row transform operation.
79 /// </summary>
80 /// <value>The row transform operation.</value>
81 public RowOperation Operation { get; set; }
82
83 /// <summary>
84 /// Gets or sets wether the row is a duplicate of another row thus redundant.
85 /// </summary>
86 public bool Redundant { get; set; }
87
88 /// <summary>
89 /// Gets or sets the SectionId property on the row.
90 /// </summary>
91 /// <value>The SectionId property on the row.</value>
92 public string SectionId { get; set; }
93
94 /// <summary>
95 /// Gets the source file and line number for the row.
96 /// </summary>
97 /// <value>Source file and line number.</value>
98 public SourceLineNumber SourceLineNumbers { get; private set; }
99
100 /// <summary>
101 /// Gets the table this row belongs to.
102 /// </summary>
103 /// <value>null if Row does not belong to a Table, or owner Table otherwise.</value>
104 public Table Table { get; private set; }
105
106 /// <summary>
107 /// Gets the table definition for this row.
108 /// </summary>
109 /// <remarks>A Row always has a TableDefinition, even if the Row does not belong to a Table.</remarks>
110 /// <value>TableDefinition for Row.</value>
111 public TableDefinition TableDefinition { get; private set; }
112
113 /// <summary>
114 /// Gets the fields contained by this row.
115 /// </summary>
116 /// <value>Array of field objects</value>
117 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
118 public Field[] Fields
119 {
120 get { return this.fields; }
121 }
122
123 /// <summary>
124 /// Gets the unique number for the row.
125 /// </summary>
126 /// <value>Number for row.</value>
127 public long Number { get; private set; }
128
129 /// <summary>
130 /// Gets or sets the value of a particular field in the row.
131 /// </summary>
132 /// <param name="field">field index.</param>
133 /// <value>Value of a field in the row.</value>
134 public object this[int field]
135 {
136 get { return this.fields[field].Data; }
137 set { this.fields[field].Data = value; }
138 }
139
140 /// <summary>
141 /// Gets the field as an integer.
142 /// </summary>
143 /// <returns>Field's data as an integer.</returns>
144 public int FieldAsInteger(int field)
145 {
146 return this.fields[field].AsInteger();
147 }
148
149 /// <summary>
150 /// Gets the field as an integer that could be null.
151 /// </summary>
152 /// <returns>Field's data as an integer that could be null.</returns>
153 public int? FieldAsNullableInteger(int field)
154 {
155 return this.fields[field].AsNullableInteger();
156 }
157
158 /// <summary>
159 /// Gets the field as a string.
160 /// </summary>
161 /// <returns>Field's data as a string.</returns>
162 public string FieldAsString(int field)
163 {
164 return this.fields[field].AsString();
165 }
166
167 /// <summary>
168 /// Sets the value of a particular field in the row without validating.
169 /// </summary>
170 /// <param name="field">field index.</param>
171 /// <param name="value">Value of a field in the row.</param>
172 /// <returns>True if successful, false if validation failed.</returns>
173 public bool BestEffortSetField(int field, object value)
174 {
175 return this.fields[field].BestEffortSet(value);
176 }
177
178 /// <summary>
179 /// Get the value used to represent the row in a keyed row collection.
180 /// </summary>
181 /// <returns>Primary key or row number if no primary key is available.</returns>
182 public string GetKey()
183 {
184 return this.GetPrimaryKey() ?? Convert.ToString(this.Number, CultureInfo.InvariantCulture);
185 }
186
187 /// <summary>
188 /// Get the primary key of this row.
189 /// </summary>
190 /// <param name="delimiter">Delimiter character for multiple column primary keys.</param>
191 /// <returns>The primary key or null if the row's table has no primary key columns.</returns>
192 public string GetPrimaryKey(char delimiter = '/')
193 {
194 return this.GetPrimaryKey(delimiter, String.Empty);
195 }
196
197 /// <summary>
198 /// Get the primary key of this row.
199 /// </summary>
200 /// <param name="delimiter">Delimiter character for multiple column primary keys.</param>
201 /// <param name="nullReplacement">String to represent null values in the primary key.</param>
202 /// <returns>The primary key or null if the row's table has no primary key columns.</returns>
203 public string GetPrimaryKey(char delimiter, string nullReplacement)
204 {
205 bool foundPrimaryKey = false;
206 StringBuilder primaryKey = new StringBuilder();
207
208 foreach (Field field in this.fields)
209 {
210 if (field.Column.PrimaryKey)
211 {
212 if (foundPrimaryKey)
213 {
214 primaryKey.Append(delimiter);
215 }
216
217 primaryKey.Append((null == field.Data) ? nullReplacement : Convert.ToString(field.Data, CultureInfo.InvariantCulture));
218
219 foundPrimaryKey = true;
220 }
221 else // primary keys must be the first columns of a row so the first non-primary key means we can stop looking.
222 {
223 break;
224 }
225 }
226
227 return foundPrimaryKey ? primaryKey.ToString() : null;
228 }
229
230 /// <summary>
231 /// Returns true if the specified field is null or an empty string.
232 /// </summary>
233 /// <param name="field">Index of the field to check.</param>
234 /// <returns>true if the specified field is null or an empty string, false otherwise.</returns>
235 public bool IsColumnEmpty(int field)
236 {
237 if (null == this.fields[field].Data)
238 {
239 return true;
240 }
241
242 string dataString = this.fields[field].Data as string;
243 if (null != dataString && 0 == dataString.Length)
244 {
245 return true;
246 }
247
248 return false;
249 }
250
251 /// <summary>
252 /// Tests if the passed in row is identical.
253 /// </summary>
254 /// <param name="row">Row to compare against.</param>
255 /// <returns>True if two rows are identical.</returns>
256 public bool IsIdentical(Row row)
257 {
258 bool identical = (this.TableDefinition.Name == row.TableDefinition.Name && this.fields.Length == row.fields.Length);
259
260 for (int i = 0; identical && i < this.fields.Length; ++i)
261 {
262 if (!(this.fields[i].IsIdentical(row.fields[i])))
263 {
264 identical = false;
265 }
266 }
267
268 return identical;
269 }
270
271 /// <summary>
272 /// Returns a string representation of the Row.
273 /// </summary>
274 /// <returns>A string representation of the Row.</returns>
275 public override string ToString()
276 {
277 return String.Join("/", (object[])this.fields);
278 }
279
280 /// <summary>
281 /// Creates a Row from the XmlReader.
282 /// </summary>
283 /// <param name="reader">Reader to get data from.</param>
284 /// <param name="table">Table for this row.</param>
285 /// <returns>New row object.</returns>
286 internal static Row Read(XmlReader reader, Table table)
287 {
288 Debug.Assert("row" == reader.LocalName);
289
290 bool empty = reader.IsEmptyElement;
291 AccessModifier access = AccessModifier.Public;
292 RowOperation operation = RowOperation.None;
293 bool redundant = false;
294 string sectionId = null;
295 SourceLineNumber sourceLineNumbers = null;
296
297 while (reader.MoveToNextAttribute())
298 {
299 switch (reader.LocalName)
300 {
301 case "access":
302 access = (AccessModifier)Enum.Parse(typeof(AccessModifier), reader.Value, true);
303 break;
304 case "op":
305 operation = (RowOperation)Enum.Parse(typeof(RowOperation), reader.Value, true);
306 break;
307 case "redundant":
308 redundant = reader.Value.Equals("yes");
309 break;
310 case "sectionId":
311 sectionId = reader.Value;
312 break;
313 case "sourceLineNumber":
314 sourceLineNumbers = SourceLineNumber.CreateFromEncoded(reader.Value);
315 break;
316 }
317 }
318
319 Row row = table.CreateRow(sourceLineNumbers);
320 row.Access = access;
321 row.Operation = operation;
322 row.Redundant = redundant;
323 row.SectionId = sectionId;
324
325 // loop through all the fields in a row
326 if (!empty)
327 {
328 bool done = false;
329 int field = 0;
330
331 // loop through all the fields in a row
332 while (!done && reader.Read())
333 {
334 switch (reader.NodeType)
335 {
336 case XmlNodeType.Element:
337 switch (reader.LocalName)
338 {
339 case "field":
340 if (row.Fields.Length <= field)
341 {
342 if (!reader.IsEmptyElement)
343 {
344 throw new XmlException();
345 }
346 }
347 else
348 {
349 row.fields[field].Read(reader);
350 }
351 ++field;
352 break;
353 default:
354 throw new XmlException();
355 }
356 break;
357 case XmlNodeType.EndElement:
358 done = true;
359 break;
360 }
361 }
362
363 if (!done)
364 {
365 throw new XmlException();
366 }
367 }
368
369 return row;
370 }
371
372 /// <summary>
373 /// Returns the row in a format usable in IDT files.
374 /// </summary>
375 /// <param name="keepAddedColumns">Whether to keep columns added in a transform.</param>
376 /// <returns>String with tab delimited field values.</returns>
377 internal string ToIdtDefinition(bool keepAddedColumns)
378 {
379 bool first = true;
380 StringBuilder sb = new StringBuilder();
381
382 foreach (Field field in this.fields)
383 {
384 // Conditionally keep columns added in a transform; otherwise,
385 // break because columns can only be added at the end.
386 if (field.Column.Added && !keepAddedColumns)
387 {
388 break;
389 }
390
391 if (first)
392 {
393 first = false;
394 }
395 else
396 {
397 sb.Append('\t');
398 }
399
400 sb.Append(field.ToIdtValue());
401 }
402 sb.Append("\r\n");
403
404 return sb.ToString();
405 }
406
407 /// <summary>
408 /// Gets the modularized version of the field data.
409 /// </summary>
410 /// <param name="field">The field to modularize.</param>
411 /// <param name="modularizationGuid">String containing the GUID of the Merge Module to append the the field value, if appropriate.</param>
412 /// <param name="suppressModularizationIdentifiers">Optional collection of identifiers that should not be modularized.</param>
413 /// <remarks>moduleGuid is expected to be null when not being used to compile a Merge Module.</remarks>
414 /// <returns>The modularized version of the field data.</returns>
415 internal string GetModularizedValue(Field field, string modularizationGuid, ISet<string> suppressModularizationIdentifiers)
416 {
417 Debug.Assert(null != field.Data && 0 < ((string)field.Data).Length);
418 string fieldData = Convert.ToString(field.Data, CultureInfo.InvariantCulture);
419
420 if (null != modularizationGuid && ColumnModularizeType.None != field.Column.ModularizeType && !(WindowsInstallerStandard.IsStandardAction(fieldData) || WindowsInstallerStandard.IsStandardProperty(fieldData)))
421 {
422 StringBuilder sb;
423 int start;
424 ColumnModularizeType modularizeType = field.Column.ModularizeType;
425
426 // special logic for the ControlEvent table's Argument column
427 // this column requires different modularization methods depending upon the value of the Event column
428 if (ColumnModularizeType.ControlEventArgument == field.Column.ModularizeType)
429 {
430 switch (this[2].ToString())
431 {
432 case "CheckExistingTargetPath": // redirectable property name
433 case "CheckTargetPath":
434 case "DoAction": // custom action name
435 case "NewDialog": // dialog name
436 case "SelectionBrowse":
437 case "SetTargetPath":
438 case "SpawnDialog":
439 case "SpawnWaitDialog":
440 if (Common.IsIdentifier(fieldData))
441 {
442 modularizeType = ColumnModularizeType.Column;
443 }
444 else
445 {
446 modularizeType = ColumnModularizeType.Property;
447 }
448 break;
449 default: // formatted
450 modularizeType = ColumnModularizeType.Property;
451 break;
452 }
453 }
454 else if (ColumnModularizeType.ControlText == field.Column.ModularizeType)
455 {
456 // icons are stored in the Binary table, so they get column-type modularization
457 if (("Bitmap" == this[2].ToString() || "Icon" == this[2].ToString()) && Common.IsIdentifier(fieldData))
458 {
459 modularizeType = ColumnModularizeType.Column;
460 }
461 else
462 {
463 modularizeType = ColumnModularizeType.Property;
464 }
465 }
466
467 switch (modularizeType)
468 {
469 case ColumnModularizeType.Column:
470 // ensure the value is an identifier (otherwise it shouldn't be modularized this way)
471 if (!Common.IsIdentifier(fieldData))
472 {
473 throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture, WixDataStrings.EXP_CannotModularizeIllegalID, fieldData));
474 }
475
476 // if we're not supposed to suppress modularization of this identifier
477 if (null == suppressModularizationIdentifiers || !suppressModularizationIdentifiers.Contains(fieldData))
478 {
479 fieldData = String.Concat(fieldData, ".", modularizationGuid);
480 }
481 break;
482
483 case ColumnModularizeType.Property:
484 case ColumnModularizeType.Condition:
485 Regex regex;
486 if (ColumnModularizeType.Property == modularizeType)
487 {
488 regex = new Regex(@"\[(?<identifier>[#$!]?[a-zA-Z_][a-zA-Z0-9_\.]*)]", RegexOptions.Singleline | RegexOptions.ExplicitCapture);
489 }
490 else
491 {
492 Debug.Assert(ColumnModularizeType.Condition == modularizeType);
493
494 // This heinous looking regular expression is actually quite an elegant way
495 // to shred the entire condition into the identifiers that need to be
496 // modularized. Let's break it down piece by piece:
497 //
498 // 1. Look for the operators: NOT, EQV, XOR, OR, AND, IMP (plus a space). Note that the
499 // regular expression is case insensitive so we don't have to worry about
500 // all the permutations of these strings.
501 // 2. Look for quoted strings. Quoted strings are just text and are ignored
502 // outright.
503 // 3. Look for environment variables. These look like identifiers we might
504 // otherwise be interested in but start with a percent sign. Like quoted
505 // strings these enviroment variable references are ignored outright.
506 // 4. Match all identifiers that are things that need to be modularized. Note
507 // the special characters (!, $, ?, &) that denote Component and Feature states.
508 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);
509
510 // less performant version of the above with captures showing where everything lives
511 // 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);
512 }
513
514 MatchCollection matches = regex.Matches(fieldData);
515
516 sb = new StringBuilder(fieldData);
517
518 // notice how this code walks backward through the list
519 // because it modifies the string as we through it
520 for (int i = matches.Count - 1; 0 <= i; i--)
521 {
522 Group group = matches[i].Groups["identifier"];
523 if (group.Success)
524 {
525 string identifier = group.Value;
526 if (!WindowsInstallerStandard.IsStandardProperty(identifier) && (null == suppressModularizationIdentifiers || !suppressModularizationIdentifiers.Contains(identifier)))
527 {
528 sb.Insert(group.Index + group.Length, '.');
529 sb.Insert(group.Index + group.Length + 1, modularizationGuid);
530 }
531 }
532 }
533
534 fieldData = sb.ToString();
535 break;
536
537 case ColumnModularizeType.CompanionFile:
538 // if we're not supposed to ignore this identifier and the value does not start with
539 // a digit, we must have a companion file so modularize it
540 if ((null == suppressModularizationIdentifiers || !suppressModularizationIdentifiers.Contains(fieldData)) &&
541 0 < fieldData.Length && !Char.IsDigit(fieldData, 0))
542 {
543 fieldData = String.Concat(fieldData, ".", modularizationGuid);
544 }
545 break;
546
547 case ColumnModularizeType.Icon:
548 if (null == suppressModularizationIdentifiers || !suppressModularizationIdentifiers.Contains(fieldData))
549 {
550 start = fieldData.LastIndexOf(".", StringComparison.Ordinal);
551 if (-1 == start)
552 {
553 fieldData = String.Concat(fieldData, ".", modularizationGuid);
554 }
555 else
556 {
557 fieldData = String.Concat(fieldData.Substring(0, start), ".", modularizationGuid, fieldData.Substring(start));
558 }
559 }
560 break;
561
562 case ColumnModularizeType.SemicolonDelimited:
563 string[] keys = fieldData.Split(';');
564 for (int i = 0; i < keys.Length; ++i)
565 {
566 keys[i] = String.Concat(keys[i], ".", modularizationGuid);
567 }
568 fieldData = String.Join(";", keys);
569 break;
570 }
571 }
572
573 return fieldData;
574 }
575
576 /// <summary>
577 /// Persists a row in an XML format.
578 /// </summary>
579 /// <param name="writer">XmlWriter where the Row should persist itself as XML.</param>
580 [SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase", Justification = "Changing the way this string normalizes would result " +
581 "in a change to the way intermediate files are generated, potentially causing extra churn in patches on an MSI built from an older version of WiX. " +
582 "Furthermore, there is no security hole here, as the strings won't need to make a round trip")]
583 internal void Write(XmlWriter writer)
584 {
585 writer.WriteStartElement("row", Intermediate.XmlNamespaceUri);
586
587 if (AccessModifier.Public != this.Access)
588 {
589 writer.WriteAttributeString("access", this.Access.ToString().ToLowerInvariant());
590 }
591
592 if (RowOperation.None != this.Operation)
593 {
594 writer.WriteAttributeString("op", this.Operation.ToString().ToLowerInvariant());
595 }
596
597 if (this.Redundant)
598 {
599 writer.WriteAttributeString("redundant", "yes");
600 }
601
602 if (null != this.SectionId)
603 {
604 writer.WriteAttributeString("sectionId", this.SectionId);
605 }
606
607 if (null != this.SourceLineNumbers)
608 {
609 writer.WriteAttributeString("sourceLineNumber", this.SourceLineNumbers.GetEncoded());
610 }
611
612 for (int i = 0; i < this.fields.Length; ++i)
613 {
614 this.fields[i].Write(writer);
615 }
616
617 writer.WriteEndElement();
618 }
619 }
620}
diff --git a/src/WixToolset.Data.WindowsInstaller/RowDictionary.cs b/src/WixToolset.Data.WindowsInstaller/RowDictionary.cs
deleted file mode 100644
index 5756db71..00000000
--- a/src/WixToolset.Data.WindowsInstaller/RowDictionary.cs
+++ /dev/null
@@ -1,83 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Collections.Generic;
7
8 /// <summary>
9 /// A dictionary of rows. Unlike the <see cref="RowIndexedCollection"/> this
10 /// will throw when multiple rows with the same key are added.
11 /// </summary>
12 public sealed class RowDictionary<T> : Dictionary<string, T> where T : Row
13 {
14 /// <summary>
15 /// Creates an empty <see cref="RowDictionary"/>.
16 /// </summary>
17 public RowDictionary()
18 : base(StringComparer.InvariantCulture)
19 {
20 }
21
22 /// <summary>
23 /// Creates and populates a <see cref="RowDictionary"/> with the rows from the given enumerator.
24 /// </summary>
25 /// <param name="Rows">Rows to add.</param>
26 public RowDictionary(IEnumerable<T> rows)
27 : this()
28 {
29 foreach (T row in rows)
30 {
31 this.Add(row);
32 }
33 }
34
35 /// <summary>
36 /// Creates and populates a <see cref="RowDictionary"/> with the rows from the given <see cref="Table"/>.
37 /// </summary>
38 /// <param name="table">The table to index.</param>
39 /// <remarks>
40 /// Rows added to the index are not automatically added to the given <paramref name="table"/>.
41 /// </remarks>
42 public RowDictionary(Table table)
43 : this()
44 {
45 if (null != table)
46 {
47 foreach (T row in table.Rows)
48 {
49 this.Add(row);
50 }
51 }
52 }
53
54 /// <summary>
55 /// Adds a row to the dictionary using the row key.
56 /// </summary>
57 /// <param name="row">Row to add to the dictionary.</param>
58 public void Add(T row)
59 {
60 this.Add(row.GetKey(), row);
61 }
62
63 /// <summary>
64 /// Gets the row by integer key.
65 /// </summary>
66 /// <param name="key">Integer key to look up.</param>
67 /// <returns>Row or null if key is not found.</returns>
68 public T Get(int key)
69 {
70 return this.Get(key.ToString());
71 }
72
73 /// <summary>
74 /// Gets the row by string key.
75 /// </summary>
76 /// <param name="key">String key to look up.</param>
77 /// <returns>Row or null if key is not found.</returns>
78 public T Get(string key)
79 {
80 return this.TryGetValue(key, out var result) ? result : null;
81 }
82 }
83}
diff --git a/src/WixToolset.Data.WindowsInstaller/RowIndexedList.cs b/src/WixToolset.Data.WindowsInstaller/RowIndexedList.cs
deleted file mode 100644
index 27c43a81..00000000
--- a/src/WixToolset.Data.WindowsInstaller/RowIndexedList.cs
+++ /dev/null
@@ -1,301 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Collections.Generic;
7
8 /// <summary>
9 /// A list of rows indexed by their primary key. Unlike a <see cref="RowDictionary"/>
10 /// this indexed list will track rows in their added order and will allow rows with
11 /// duplicate keys to be added to the list, although only the first row will be indexed.
12 /// </summary>
13 public sealed class RowIndexedList<T> : IList<T> where T : Row
14 {
15 private Dictionary<string, T> index;
16 private List<T> rows;
17 private List<T> duplicates;
18
19 /// <summary>
20 /// Creates an empty <see cref="RowIndexedList"/>.
21 /// </summary>
22 public RowIndexedList()
23 {
24 this.index = new Dictionary<string, T>(StringComparer.InvariantCulture);
25 this.rows = new List<T>();
26 this.duplicates = new List<T>();
27 }
28
29 /// <summary>
30 /// Creates and populates a <see cref="RowDictionary"/> with the rows from the given enumerator.
31 /// </summary>
32 /// <param name="rows">Rows to index.</param>
33 public RowIndexedList(IEnumerable<T> rows)
34 : this()
35 {
36 foreach (T row in rows)
37 {
38 this.Add(row);
39 }
40 }
41
42 /// <summary>
43 /// Creates and populates a <see cref="RowDictionary"/> with the rows from the given <see cref="Table"/>.
44 /// </summary>
45 /// <param name="table">The table to index.</param>
46 /// <remarks>
47 /// Rows added to the index are not automatically added to the given <paramref name="table"/>.
48 /// </remarks>
49 public RowIndexedList(Table table)
50 : this()
51 {
52 if (null != table)
53 {
54 foreach (T row in table.Rows)
55 {
56 this.Add(row);
57 }
58 }
59 }
60
61 /// <summary>
62 /// Gets the duplicates in the list.
63 /// </summary>
64 public IEnumerable<T> Duplicates { get { return this.duplicates; } }
65
66 /// <summary>
67 /// Gets the row by integer key.
68 /// </summary>
69 /// <param name="key">Integer key to look up.</param>
70 /// <returns>Row or null if key is not found.</returns>
71 public T Get(int key)
72 {
73 return this.Get(key.ToString());
74 }
75
76 /// <summary>
77 /// Gets the row by string key.
78 /// </summary>
79 /// <param name="key">String key to look up.</param>
80 /// <returns>Row or null if key is not found.</returns>
81 public T Get(string key)
82 {
83 T result;
84 return this.TryGet(key, out result) ? result : null;
85 }
86
87 /// <summary>
88 /// Gets the row by string key if it exists.
89 /// </summary>
90 /// <param name="key">Key of row to get.</param>
91 /// <param name="row">Row found.</param>
92 /// <returns>True if key was found otherwise false.</returns>
93 public bool TryGet(string key, out T row)
94 {
95 return this.index.TryGetValue(key, out row);
96 }
97
98 /// <summary>
99 /// Tries to add a row as long as it would not create a duplicate.
100 /// </summary>
101 /// <param name="row">Row to add.</param>
102 /// <returns>True if the row as added otherwise false.</returns>
103 public bool TryAdd(T row)
104 {
105 try
106 {
107 this.index.Add(row.GetKey(), row);
108 }
109 catch (ArgumentException) // if the key already exists, bail.
110 {
111 return false;
112 }
113
114 this.rows.Add(row);
115 return true;
116 }
117
118 /// <summary>
119 /// Adds a row to the list. If a row with the same key is already index, the row is
120 /// is not in the index but will still be part of the list and added to the duplicates
121 /// list.
122 /// </summary>
123 /// <param name="row"></param>
124 public void Add(T row)
125 {
126 this.rows.Add(row);
127 try
128 {
129 this.index.Add(row.GetKey(), row);
130 }
131 catch (ArgumentException) // if the key already exists, we have a duplicate.
132 {
133 this.duplicates.Add(row);
134 }
135 }
136
137 /// <summary>
138 /// Gets the index of a row.
139 /// </summary>
140 /// <param name="row">Iterates through the list of rows to find the index of a particular row.</param>
141 /// <returns>Index of row or -1 if not found.</returns>
142 public int IndexOf(T row)
143 {
144 return this.rows.IndexOf(row);
145 }
146
147 /// <summary>
148 /// Inserts a row at a particular index of the list.
149 /// </summary>
150 /// <param name="index">Index to insert the row after.</param>
151 /// <param name="row">Row to insert.</param>
152 public void Insert(int index, T row)
153 {
154 this.rows.Insert(index, row);
155 try
156 {
157 this.index.Add(row.GetKey(), row);
158 }
159 catch (ArgumentException) // if the key already exists, we have a duplicate.
160 {
161 this.duplicates.Add(row);
162 }
163 }
164
165 /// <summary>
166 /// Removes a row from a particular index.
167 /// </summary>
168 /// <param name="index">Index to remove the row at.</param>
169 public void RemoveAt(int index)
170 {
171 T row = this.rows[index];
172
173 this.rows.RemoveAt(index);
174
175 T indexRow;
176 if (this.index.TryGetValue(row.GetKey(), out indexRow) && indexRow == row)
177 {
178 this.index.Remove(row.GetKey());
179 }
180 else // only try to remove from duplicates if the row was not indexed (if it was indexed, it wasn't a dupe).
181 {
182 this.duplicates.Remove(row);
183 }
184 }
185
186 /// <summary>
187 /// Gets or sets a row at the specified index.
188 /// </summary>
189 /// <param name="index">Index to get the row.</param>
190 /// <returns>Row at specified index.</returns>
191 public T this[int index]
192 {
193 get
194 {
195 return this.rows[index];
196 }
197 set
198 {
199 this.rows[index] = value;
200 try
201 {
202 this.index.Add(value.GetKey(), value);
203 }
204 catch (ArgumentException) // if the key already exists, we have a duplicate.
205 {
206 this.duplicates.Add(value);
207 }
208 }
209 }
210
211 /// <summary>
212 /// Empties the list and it's index.
213 /// </summary>
214 public void Clear()
215 {
216 this.index.Clear();
217 this.rows.Clear();
218 this.duplicates.Clear();
219 }
220
221 /// <summary>
222 /// Searches the list for a row without using the index.
223 /// </summary>
224 /// <param name="row">Row to look for in the list.</param>
225 /// <returns>True if the row is in the list, otherwise false.</returns>
226 public bool Contains(T row)
227 {
228 return this.rows.Contains(row);
229 }
230
231 /// <summary>
232 /// Copies the rows of the list to an array.
233 /// </summary>
234 /// <param name="array">Array to copy the list into.</param>
235 /// <param name="arrayIndex">Index to start copying at.</param>
236 public void CopyTo(T[] array, int arrayIndex)
237 {
238 this.rows.CopyTo(array, arrayIndex);
239 }
240
241 /// <summary>
242 /// Number of rows in the list.
243 /// </summary>
244 public int Count
245 {
246 get { return this.rows.Count; }
247 }
248
249 /// <summary>
250 /// Indicates whether the list is read-only. Always false.
251 /// </summary>
252 public bool IsReadOnly
253 {
254 get { return false; }
255 }
256
257 /// <summary>
258 /// Removes a row from the list. Indexed rows will be removed but the colleciton will NOT
259 /// promote duplicates to the index automatically. The duplicate would also need to be removed
260 /// and re-added to be indexed.
261 /// </summary>
262 /// <param name="row"></param>
263 /// <returns></returns>
264 public bool Remove(T row)
265 {
266 bool removed = this.rows.Remove(row);
267 if (removed)
268 {
269 T indexRow;
270 if (this.index.TryGetValue(row.GetKey(), out indexRow) && indexRow == row)
271 {
272 this.index.Remove(row.GetKey());
273 }
274 else // only try to remove from duplicates if the row was not indexed (if it was indexed, it wasn't a dupe).
275 {
276 this.duplicates.Remove(row);
277 }
278 }
279
280 return removed;
281 }
282
283 /// <summary>
284 /// Gets an enumerator over the whole list.
285 /// </summary>
286 /// <returns>List enumerator.</returns>
287 public IEnumerator<T> GetEnumerator()
288 {
289 return this.rows.GetEnumerator();
290 }
291
292 /// <summary>
293 /// Gets an untyped enumerator over the whole list.
294 /// </summary>
295 /// <returns>Untyped list enumerator.</returns>
296 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
297 {
298 return this.rows.GetEnumerator();
299 }
300 }
301}
diff --git a/src/WixToolset.Data.WindowsInstaller/RowOperation.cs b/src/WixToolset.Data.WindowsInstaller/RowOperation.cs
deleted file mode 100644
index 30dadd4e..00000000
--- a/src/WixToolset.Data.WindowsInstaller/RowOperation.cs
+++ /dev/null
@@ -1,30 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 /// <summary>
6 /// The row transform operations.
7 /// </summary>
8 public enum RowOperation
9 {
10 /// <summary>
11 /// No operation.
12 /// </summary>
13 None,
14
15 /// <summary>
16 /// Added row.
17 /// </summary>
18 Add,
19
20 /// <summary>
21 /// Deleted row.
22 /// </summary>
23 Delete,
24
25 /// <summary>
26 /// Modified row.
27 /// </summary>
28 Modify
29 }
30}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/BBControlRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/BBControlRow.cs
deleted file mode 100644
index d0f08662..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/BBControlRow.cs
+++ /dev/null
@@ -1,113 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System.Diagnostics.CodeAnalysis;
6
7 /// <summary>
8 /// Specialization of a row for the Control table.
9 /// </summary>
10 public sealed class BBControlRow : Row
11 {
12 /// <summary>
13 /// Creates a Control row that belongs to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="table">Table this Control row belongs to and should get its column definitions from.</param>
17 public BBControlRow(SourceLineNumber sourceLineNumbers, Table table) :
18 base(sourceLineNumbers, table)
19 {
20 }
21
22 /// <summary>
23 /// Gets or sets the dialog of the Control row.
24 /// </summary>
25 /// <value>Primary key of the Control row.</value>
26 public string Billboard
27 {
28 get { return (string)this.Fields[0].Data; }
29 set { this.Fields[0].Data = value; }
30 }
31
32 /// <summary>
33 /// Gets or sets the identifier for this Control row.
34 /// </summary>
35 /// <value>Identifier for this Control row.</value>
36 public string BBControl
37 {
38 get { return (string)this.Fields[1].Data; }
39 set { this.Fields[1].Data = value; }
40 }
41
42 /// <summary>
43 /// Gets or sets the type of the BBControl.
44 /// </summary>
45 /// <value>Name of the BBControl.</value>
46 [SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods")]
47 public string Type
48 {
49 get { return this.Fields[2].AsString(); }
50 set { this.Fields[2].Data = value; }
51 }
52
53 /// <summary>
54 /// Gets or sets the X location of the BBControl.
55 /// </summary>
56 /// <value>X location of the BBControl.</value>
57 public string X
58 {
59 get { return this.Fields[3].AsString(); }
60 set { this.Fields[3].Data = value; }
61 }
62
63 /// <summary>
64 /// Gets or sets the Y location of the BBControl.
65 /// </summary>
66 /// <value>Y location of the BBControl.</value>
67 public string Y
68 {
69 get { return this.Fields[4].AsString(); }
70 set { this.Fields[4].Data = value; }
71 }
72
73 /// <summary>
74 /// Gets or sets the width of the BBControl.
75 /// </summary>
76 /// <value>Width of the BBControl.</value>
77 public string Width
78 {
79 get { return this.Fields[5].AsString(); }
80 set { this.Fields[5].Data = value; }
81 }
82
83 /// <summary>
84 /// Gets or sets the height of the BBControl.
85 /// </summary>
86 /// <value>Height of the BBControl.</value>
87 public string Height
88 {
89 get { return this.Fields[6].AsString(); }
90 set { this.Fields[6].Data = value; }
91 }
92
93 /// <summary>
94 /// Gets or sets the attributes for the BBControl.
95 /// </summary>
96 /// <value>Attributes for the BBControl.</value>
97 public int Attributes
98 {
99 get { return (int)this.Fields[7].Data; }
100 set { this.Fields[7].Data = value; }
101 }
102
103 /// <summary>
104 /// Gets or sets the text of the BBControl.
105 /// </summary>
106 /// <value>Text of the BBControl.</value>
107 public string Text
108 {
109 get { return (string)this.Fields[8].Data; }
110 set { this.Fields[8].Data = value; }
111 }
112 }
113}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/ComponentRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/ComponentRow.cs
deleted file mode 100644
index 3ff10175..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/ComponentRow.cs
+++ /dev/null
@@ -1,245 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6 using WixToolset.Data.Msi;
7
8 /// <summary>
9 /// Specialization of a row for the Component table.
10 /// </summary>
11 public sealed class ComponentRow : Row
12 {
13 private string sourceFile;
14
15 /// <summary>
16 /// Creates a Control row that belongs to a table.
17 /// </summary>
18 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
19 /// <param name="table">Table this Component row belongs to and should get its column definitions from.</param>
20 public ComponentRow(SourceLineNumber sourceLineNumbers, Table table) :
21 base(sourceLineNumbers, table)
22 {
23 }
24
25 /// <summary>
26 /// Gets or sets the identifier for this Component row.
27 /// </summary>
28 /// <value>Identifier for this Component row.</value>
29 public string Component
30 {
31 get { return (string)this.Fields[0].Data; }
32 set { this.Fields[0].Data = value; }
33 }
34
35 /// <summary>
36 /// Gets or sets the ComponentId for this Component row.
37 /// </summary>
38 /// <value>guid for this Component row.</value>
39 public string Guid
40 {
41 get { return (string)this.Fields[1].Data; }
42 set { this.Fields[1].Data = value; }
43 }
44
45 /// <summary>
46 /// Gets or sets the Directory_ of the Component.
47 /// </summary>
48 /// <value>Directory of the Component.</value>
49 public string Directory
50 {
51 get { return (string)this.Fields[2].Data; }
52 set { this.Fields[2].Data = value; }
53 }
54
55 /// <summary>
56 /// Gets or sets the local only attribute of the Component.
57 /// </summary>
58 /// <value>Local only attribute of the component.</value>
59 public bool IsLocalOnly
60 {
61 get { return MsiInterop.MsidbComponentAttributesLocalOnly == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesLocalOnly); }
62 set
63 {
64 if (value)
65 {
66 this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesLocalOnly;
67 }
68 else
69 {
70 this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesLocalOnly;
71 }
72 }
73 }
74
75 /// <summary>
76 /// Gets or sets the source only attribute of the Component.
77 /// </summary>
78 /// <value>Source only attribute of the component.</value>
79 public bool IsSourceOnly
80 {
81 get { return MsiInterop.MsidbComponentAttributesSourceOnly == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesSourceOnly); }
82 set
83 {
84 if (value)
85 {
86 this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesSourceOnly;
87 }
88 else
89 {
90 this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesSourceOnly;
91 }
92 }
93 }
94
95 /// <summary>
96 /// Gets or sets the optional attribute of the Component.
97 /// </summary>
98 /// <value>Optional attribute of the component.</value>
99 public bool IsOptional
100 {
101 get { return MsiInterop.MsidbComponentAttributesOptional == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesOptional); }
102 set
103 {
104 if (value)
105 {
106 this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesOptional;
107 }
108 else
109 {
110 this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesOptional;
111 }
112 }
113 }
114
115 /// <summary>
116 /// Gets or sets the registry key path attribute of the Component.
117 /// </summary>
118 /// <value>Registry key path attribute of the component.</value>
119 public bool IsRegistryKeyPath
120 {
121 get { return MsiInterop.MsidbComponentAttributesRegistryKeyPath == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesRegistryKeyPath); }
122 set
123 {
124 if (value)
125 {
126 this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesRegistryKeyPath;
127 }
128 else
129 {
130 this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesRegistryKeyPath;
131 }
132 }
133 }
134
135 /// <summary>
136 /// Gets or sets the shared dll ref count attribute of the Component.
137 /// </summary>
138 /// <value>Shared dll ref countattribute of the component.</value>
139 public bool IsSharedDll
140 {
141 get { return MsiInterop.MsidbComponentAttributesSharedDllRefCount == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesSharedDllRefCount); }
142 set
143 {
144 if (value)
145 {
146 this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesSharedDllRefCount;
147 }
148 else
149 {
150 this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesSharedDllRefCount;
151 }
152 }
153 }
154
155 /// <summary>
156 /// Gets or sets the permanent attribute of the Component.
157 /// </summary>
158 /// <value>Permanent attribute of the component.</value>
159 public bool IsPermanent
160 {
161 get { return MsiInterop.MsidbComponentAttributesPermanent == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesPermanent); }
162 set
163 {
164 if (value)
165 {
166 this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesPermanent;
167 }
168 else
169 {
170 this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesPermanent;
171 }
172 }
173 }
174
175 /// <summary>
176 /// Gets or sets the ODBC data source key path attribute of the Component.
177 /// </summary>
178 /// <value>ODBC data source key path attribute of the component.</value>
179 public bool IsOdbcDataSourceKeyPath
180 {
181 get { return MsiInterop.MsidbComponentAttributesODBCDataSource == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesODBCDataSource); }
182 set
183 {
184 if (value)
185 {
186 this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesODBCDataSource;
187 }
188 else
189 {
190 this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesODBCDataSource;
191 }
192 }
193 }
194
195 /// <summary>
196 /// Gets or sets the 64 bit attribute of the Component.
197 /// </summary>
198 /// <value>64-bitness of the component.</value>
199 public bool Is64Bit
200 {
201 get { return MsiInterop.MsidbComponentAttributes64bit == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributes64bit); }
202 set
203 {
204 if (value)
205 {
206 this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributes64bit;
207 }
208 else
209 {
210 this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributes64bit;
211 }
212 }
213 }
214
215 /// <summary>
216 /// Gets or sets the condition of the Component.
217 /// </summary>
218 /// <value>Condition of the Component.</value>
219 public string Condition
220 {
221 get { return (string)this.Fields[4].Data; }
222 set { this.Fields[4].Data = value; }
223 }
224
225 /// <summary>
226 /// Gets or sets the key path of the Component.
227 /// </summary>
228 /// <value>Key path of the Component.</value>
229 public string KeyPath
230 {
231 get { return (string)this.Fields[5].Data; }
232 set { this.Fields[5].Data = value; }
233 }
234
235 /// <summary>
236 /// Gets or sets the source location to the file to fill in the Text of the control.
237 /// </summary>
238 /// <value>Source location to the file to fill in the Text of the control.</value>
239 public string SourceFile
240 {
241 get { return this.sourceFile; }
242 set { this.sourceFile = value; }
243 }
244 }
245}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/ContainerType.cs b/src/WixToolset.Data.WindowsInstaller/Rows/ContainerType.cs
deleted file mode 100644
index 55a74235..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/ContainerType.cs
+++ /dev/null
@@ -1,13 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Types of bundle packages.
7 /// </summary>
8 public enum ContainerType
9 {
10 Attached,
11 Detached,
12 }
13}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/ControlRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/ControlRow.cs
deleted file mode 100644
index 8fa3f633..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/ControlRow.cs
+++ /dev/null
@@ -1,143 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System.Diagnostics.CodeAnalysis;
6
7 /// <summary>
8 /// Specialization of a row for the Control table.
9 /// </summary>
10 public sealed class ControlRow : Row
11 {
12 /// <summary>
13 /// Creates a Control row that belongs to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="table">Table this Control row belongs to and should get its column definitions from.</param>
17 public ControlRow(SourceLineNumber sourceLineNumbers, Table table) :
18 base(sourceLineNumbers, table)
19 {
20 }
21
22 /// <summary>
23 /// Gets or sets the dialog of the Control row.
24 /// </summary>
25 /// <value>Primary key of the Control row.</value>
26 public string Dialog
27 {
28 get { return (string)this.Fields[0].Data; }
29 set { this.Fields[0].Data = value; }
30 }
31
32 /// <summary>
33 /// Gets or sets the identifier for this Control row.
34 /// </summary>
35 /// <value>Identifier for this Control row.</value>
36 public string Control
37 {
38 get { return (string)this.Fields[1].Data; }
39 set { this.Fields[1].Data = value; }
40 }
41
42 /// <summary>
43 /// Gets or sets the type of the control.
44 /// </summary>
45 /// <value>Name of the control.</value>
46 [SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods")]
47 public string Type
48 {
49 get { return (string)this.Fields[2].Data; }
50 set { this.Fields[2].Data = value; }
51 }
52
53 /// <summary>
54 /// Gets or sets the X location of the control.
55 /// </summary>
56 /// <value>X location of the control.</value>
57 public string X
58 {
59 get { return this.Fields[3].AsString(); }
60 set { this.Fields[3].Data = value; }
61 }
62
63 /// <summary>
64 /// Gets or sets the Y location of the control.
65 /// </summary>
66 /// <value>Y location of the control.</value>
67 public string Y
68 {
69 get { return this.Fields[4].AsString(); }
70 set { this.Fields[4].Data = value; }
71 }
72
73 /// <summary>
74 /// Gets or sets the width of the control.
75 /// </summary>
76 /// <value>Width of the control.</value>
77 public string Width
78 {
79 get { return this.Fields[5].AsString(); }
80 set { this.Fields[5].Data = value; }
81 }
82
83 /// <summary>
84 /// Gets or sets the height of the control.
85 /// </summary>
86 /// <value>Height of the control.</value>
87 public string Height
88 {
89 get { return this.Fields[6].AsString(); }
90 set { this.Fields[6].Data = value; }
91 }
92
93 /// <summary>
94 /// Gets or sets the attributes for the control.
95 /// </summary>
96 /// <value>Attributes for the control.</value>
97 public int Attributes
98 {
99 get { return (int)this.Fields[7].Data; }
100 set { this.Fields[7].Data = value; }
101 }
102
103 /// <summary>
104 /// Gets or sets the Property associated with the control.
105 /// </summary>
106 /// <value>Property associated with the control.</value>
107 public string Property
108 {
109 get { return (string)this.Fields[8].Data; }
110 set { this.Fields[8].Data = value; }
111 }
112
113 /// <summary>
114 /// Gets or sets the text of the control.
115 /// </summary>
116 /// <value>Text of the control.</value>
117 public string Text
118 {
119 get { return (string)this.Fields[9].Data; }
120 set { this.Fields[9].Data = value; }
121 }
122
123 /// <summary>
124 /// Gets or sets the next control.
125 /// </summary>
126 /// <value>Next control.</value>
127 public string Next
128 {
129 get { return (string)this.Fields[10].Data; }
130 set { this.Fields[10].Data = value; }
131 }
132
133 /// <summary>
134 /// Gets or sets the help for the control.
135 /// </summary>
136 /// <value>Help for the control.</value>
137 public string Help
138 {
139 get { return (string)this.Fields[11].Data; }
140 set { this.Fields[11].Data = value; }
141 }
142 }
143}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/FileRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/FileRow.cs
deleted file mode 100644
index de5d5652..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/FileRow.cs
+++ /dev/null
@@ -1,640 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6 using System.Diagnostics;
7 using System.Globalization;
8 using WixToolset.Data.Msi;
9
10 /// <summary>
11 /// Specialization of a row for the file table.
12 /// </summary>
13 public sealed class FileRow : Row //, IComparable
14 {
15 //private string assemblyApplication;
16 //private string assemblyManifest;
17 //private FileAssemblyType assemblyType;
18 //private string directory;
19 //private int diskId;
20 //private bool fromModule;
21 //private bool isGeneratedShortFileName;
22 //private int patchGroup;
23 //private string processorArchitecture;
24 //private string source;
25 //private Row hashRow;
26 //private List<Row> assemblyNameRows;
27 //private string[] previousSource;
28 //private string symbols;
29 //private string[] previousSymbols;
30 //private PatchAttributeType patchAttributes;
31 //private string retainOffsets;
32 //private string retainLengths;
33 //private string ignoreOffsets;
34 //private string ignoreLengths;
35 //private string[] previousRetainOffsets;
36 //private string[] previousRetainLengths;
37 //private string[] previousIgnoreOffsets;
38 //private string[] previousIgnoreLengths;
39 //private string patch;
40
41 /// <summary>
42 /// Creates a File row that belongs to a table.
43 /// </summary>
44 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
45 /// <param name="table">Table this File row belongs to and should get its column definitions from.</param>
46 public FileRow(SourceLineNumber sourceLineNumbers, Table table)
47 : base(sourceLineNumbers, table)
48 {
49 //this.assemblyType = FileAssemblyType.NotAnAssembly;
50 //this.previousSource = new string[1];
51 //this.previousSymbols = new string[1];
52 //this.previousRetainOffsets = new string[1];
53 //this.previousRetainLengths = new string[1];
54 //this.previousIgnoreOffsets = new string[1];
55 //this.previousIgnoreLengths = new string[1];
56 }
57
58 /// <summary>
59 /// Creates a File row that does not belong to a table.
60 /// </summary>
61 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
62 /// <param name="tableDefinition">TableDefinition this Media row belongs to and should get its column definitions from.</param>
63 public FileRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDefinition)
64 : base(sourceLineNumbers, tableDefinition)
65 {
66 //this.assemblyType = FileAssemblyType.NotAnAssembly;
67 //this.previousSource = new string[1];
68 //this.previousSymbols = new string[1];
69 //this.previousRetainOffsets = new string[1];
70 //this.previousRetainLengths = new string[1];
71 //this.previousIgnoreOffsets = new string[1];
72 //this.previousIgnoreLengths = new string[1];
73 }
74
75 /// <summary>
76 /// Gets or sets the primary key of the file row.
77 /// </summary>
78 /// <value>Primary key of the file row.</value>
79 public string File
80 {
81 get { return (string)this.Fields[0].Data; }
82 set { this.Fields[0].Data = value; }
83 }
84
85 /// <summary>
86 /// Gets or sets the component this file row belongs to.
87 /// </summary>
88 /// <value>Component this file row belongs to.</value>
89 public string Component
90 {
91 get { return (string)this.Fields[1].Data; }
92 set { this.Fields[1].Data = value; }
93 }
94
95 /// <summary>
96 /// Gets or sets the name of the file.
97 /// </summary>
98 /// <value>Name of the file.</value>
99 public string FileName
100 {
101 get { return (string)this.Fields[2].Data; }
102 set { this.Fields[2].Data = value; }
103 }
104
105 /// <summary>
106 /// Gets or sets the real filesystem name of the file (without a pipe). This is typically the long name of the file.
107 /// However, if no long name is available, falls back to the short name.
108 /// </summary>
109 /// <value>Long Name of the file - or if no long name is available, falls back to the short name.</value>
110 public string LongFileName
111 {
112 get
113 {
114 string fileName = this.FileName;
115 int index = fileName.IndexOf('|');
116
117 // If it doesn't contain a pipe, just return the whole string
118 if (-1 == index)
119 {
120 return fileName;
121 }
122 else // otherwise, extract the part of the string after the pipe
123 {
124 return fileName.Substring(index + 1);
125 }
126 }
127 }
128
129 /// <summary>
130 /// Gets or sets the size of the file.
131 /// </summary>
132 /// <value>Size of the file.</value>
133 public int FileSize
134 {
135 get { return (int)this.Fields[3].Data; }
136 set { this.Fields[3].Data = value; }
137 }
138
139 /// <summary>
140 /// Gets or sets the version of the file.
141 /// </summary>
142 /// <value>Version of the file.</value>
143 public string Version
144 {
145 get { return (string)this.Fields[4].Data; }
146 set { this.Fields[4].Data = value; }
147 }
148
149 /// <summary>
150 /// Gets or sets the LCID of the file.
151 /// </summary>
152 /// <value>LCID of the file.</value>
153 public string Language
154 {
155 get { return (string)this.Fields[5].Data; }
156 set { this.Fields[5].Data = value; }
157 }
158
159 /// <summary>
160 /// Gets or sets the attributes on a file.
161 /// </summary>
162 /// <value>Attributes on a file.</value>
163 public int Attributes
164 {
165 get { return Convert.ToInt32(this.Fields[6].Data, CultureInfo.InvariantCulture); }
166 set { this.Fields[6].Data = value; }
167 }
168
169 /// <summary>
170 /// Gets or sets whether this file should be compressed.
171 /// </summary>
172 /// <value>Whether this file should be compressed.</value>
173 public YesNoType Compressed
174 {
175 get
176 {
177 bool compressedFlag = (0 < (this.Attributes & MsiInterop.MsidbFileAttributesCompressed));
178 bool noncompressedFlag = (0 < (this.Attributes & MsiInterop.MsidbFileAttributesNoncompressed));
179
180 if (compressedFlag && noncompressedFlag)
181 {
182 throw new WixException(WixDataErrors.IllegalFileCompressionAttributes(this.SourceLineNumbers));
183 }
184 else if (compressedFlag)
185 {
186 return YesNoType.Yes;
187 }
188 else if (noncompressedFlag)
189 {
190 return YesNoType.No;
191 }
192 else
193 {
194 return YesNoType.NotSet;
195 }
196 }
197
198 set
199 {
200 if (YesNoType.Yes == value)
201 {
202 // these are mutually exclusive
203 this.Attributes |= MsiInterop.MsidbFileAttributesCompressed;
204 this.Attributes &= ~MsiInterop.MsidbFileAttributesNoncompressed;
205 }
206 else if (YesNoType.No == value)
207 {
208 // these are mutually exclusive
209 this.Attributes |= MsiInterop.MsidbFileAttributesNoncompressed;
210 this.Attributes &= ~MsiInterop.MsidbFileAttributesCompressed;
211 }
212 else // not specified
213 {
214 Debug.Assert(YesNoType.NotSet == value);
215
216 // clear any compression bits
217 this.Attributes &= ~MsiInterop.MsidbFileAttributesCompressed;
218 this.Attributes &= ~MsiInterop.MsidbFileAttributesNoncompressed;
219 }
220 }
221 }
222
223 /// <summary>
224 /// Gets or sets the sequence of the file row.
225 /// </summary>
226 /// <value>Sequence of the file row.</value>
227 public int Sequence
228 {
229 get { return (int)this.Fields[7].Data; }
230 set { this.Fields[7].Data = value; }
231 }
232
233 /////// <summary>
234 /////// Gets or sets the type of assembly of file row.
235 /////// </summary>
236 /////// <value>Assembly type for file row.</value>
237 ////public FileAssemblyType AssemblyType
238 ////{
239 //// get { return this.assemblyType; }
240 //// set { this.assemblyType = value; }
241 ////}
242
243 /////// <summary>
244 /////// Gets or sets the identifier for the assembly application.
245 /////// </summary>
246 /////// <value>Identifier for the assembly application.</value>
247 ////public string AssemblyApplication
248 ////{
249 //// get { return this.assemblyApplication; }
250 //// set { this.assemblyApplication = value; }
251 ////}
252
253 /////// <summary>
254 /////// Gets or sets the identifier for the assembly manifest.
255 /////// </summary>
256 /////// <value>Identifier for the assembly manifest.</value>
257 ////public string AssemblyManifest
258 ////{
259 //// get { return this.assemblyManifest; }
260 //// set { this.assemblyManifest = value; }
261 ////}
262
263 /////// <summary>
264 /////// Gets or sets the directory of the file.
265 /////// </summary>
266 /////// <value>Directory of the file.</value>
267 ////public string Directory
268 ////{
269 //// get { return this.directory; }
270 //// set { this.directory = value; }
271 ////}
272
273 /////// <summary>
274 /////// Gets or sets the disk id for this file.
275 /////// </summary>
276 /////// <value>Disk id for the file.</value>
277 ////public int DiskId
278 ////{
279 //// get { return this.diskId; }
280 //// set { this.diskId = value; }
281 ////}
282
283 /////// <summary>
284 /////// Gets or sets the source location to the file.
285 /////// </summary>
286 /////// <value>Source location to the file.</value>
287 ////public string Source
288 ////{
289 //// get { return this.source; }
290 //// set { this.source = value; }
291 ////}
292
293 /////// <summary>
294 /////// Gets or sets the source location to the previous file.
295 /////// </summary>
296 /////// <value>Source location to the previous file.</value>
297 ////public string PreviousSource
298 ////{
299 //// get { return this.previousSource[0]; }
300 //// set { this.previousSource[0] = value; }
301 ////}
302
303 /////// <summary>
304 /////// Gets the source location to the previous files.
305 /////// </summary>
306 /////// <value>Source location to the previous files.</value>
307 ////[SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
308 ////public string[] PreviousSourceArray
309 ////{
310 //// get { return this.previousSource; }
311 ////}
312
313 /////// <summary>
314 /////// Gets or sets the architecture the file executes on.
315 /////// </summary>
316 /////// <value>Architecture the file executes on.</value>
317 ////public string ProcessorArchitecture
318 ////{
319 //// get { return this.processorArchitecture; }
320 //// set { this.processorArchitecture = value; }
321 ////}
322
323 /////// <summary>
324 /////// Gets of sets the patch group of a patch-added file.
325 /////// </summary>
326 /////// <value>The patch group of a patch-added file.</value>
327 ////public int PatchGroup
328 ////{
329 //// get { return this.patchGroup; }
330 //// set { this.patchGroup = value; }
331 ////}
332
333 /////// <summary>
334 /////// Gets or sets the patch header of the file.
335 /////// </summary>
336 /////// <value>Patch header of the file.</value>
337 ////public string Patch
338 ////{
339 //// get { return this.patch; }
340 //// set { this.patch = value; }
341 ////}
342
343 /////// <summary>
344 /////// Gets or sets the locations to find the file's symbols.
345 /////// </summary>
346 /////// <value>Symbol paths for the file.</value>
347 ////public string Symbols
348 ////{
349 //// get { return this.symbols; }
350 //// set { this.symbols = value; }
351 ////}
352
353 /////// <summary>
354 /////// Gets or sets the locations to find the file's previous symbols.
355 /////// </summary>
356 /////// <value>Symbol paths for the previous file.</value>
357 ////public string PreviousSymbols
358 ////{
359 //// get { return this.previousSymbols[0]; }
360 //// set { this.previousSymbols[0] = value; }
361 ////}
362
363 /////// <summary>
364 /////// Gets the locations to find the files' previous symbols.
365 /////// </summary>
366 /////// <value>Symbol paths for the previous files.</value>
367 ////[SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
368 ////public string[] PreviousSymbolsArray
369 ////{
370 //// get { return this.previousSymbols; }
371 ////}
372
373 /////// <summary>
374 /////// Gets or sets the generated short file name attribute.
375 /////// </summary>
376 /////// <value>The generated short file name attribute.</value>
377 ////public bool IsGeneratedShortFileName
378 ////{
379 //// get { return this.isGeneratedShortFileName; }
380
381 //// set { this.isGeneratedShortFileName = value; }
382 ////}
383
384 /////// <summary>
385 /////// Gets or sets whether this row came from a merge module.
386 /////// </summary>
387 /////// <value>Whether this row came from a merge module.</value>
388 ////public bool FromModule
389 ////{
390 //// get { return this.fromModule; }
391 //// set { this.fromModule = value; }
392 ////}
393
394 /////// <summary>
395 /////// Gets or sets the MsiFileHash row created for this FileRow.
396 /////// </summary>
397 /////// <value>Row for MsiFileHash table.</value>
398 ////public Row HashRow
399 ////{
400 //// get { return this.hashRow; }
401 //// set { this.hashRow = value; }
402 ////}
403
404 /////// <summary>
405 /////// Gets or sets the set of MsiAssemblyName rows created for this FileRow.
406 /////// </summary>
407 /////// <value>RowCollection of MsiAssemblyName table.</value>
408 ////[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
409 ////public List<Row> AssemblyNameRows
410 ////{
411 //// get { return this.assemblyNameRows; }
412 //// set { this.assemblyNameRows = value; }
413 ////}
414
415 /////// <summary>
416 /////// Gets or sets the patching attributes to the file.
417 /////// </summary>
418 /////// <value>Patching attributes of the file.</value>
419 ////public PatchAttributeType PatchAttributes
420 ////{
421 //// get { return this.patchAttributes; }
422 //// set { this.patchAttributes = value; }
423 ////}
424
425 /////// <summary>
426 /////// Gets or sets the delta patch retain-length list for the file.
427 /////// </summary>
428 /////// <value>RetainLength list for the file.</value>
429 ////public string RetainLengths
430 ////{
431 //// get { return this.retainLengths; }
432 //// set { this.retainLengths = value; }
433 ////}
434
435 /////// <summary>
436 /////// Gets or sets the delta patch ignore-offset list for the file.
437 /////// </summary>
438 /////// <value>IgnoreOffset list for the file.</value>
439 ////public string IgnoreOffsets
440 ////{
441 //// get { return this.ignoreOffsets; }
442 //// set { this.ignoreOffsets = value; }
443 ////}
444
445 /////// <summary>
446 /////// Gets or sets the delta patch ignore-length list for the file.
447 /////// </summary>
448 /////// <value>IgnoreLength list for the file.</value>
449 ////public string IgnoreLengths
450 ////{
451 //// get { return this.ignoreLengths; }
452 //// set { this.ignoreLengths = value; }
453 ////}
454
455 /////// <summary>
456 /////// Gets or sets the delta patch retain-offset list for the file.
457 /////// </summary>
458 /////// <value>RetainOffset list for the file.</value>
459 ////public string RetainOffsets
460 ////{
461 //// get { return this.retainOffsets; }
462 //// set { this.retainOffsets = value; }
463 ////}
464
465 /////// <summary>
466 /////// Gets or sets the delta patch retain-length list for the previous file.
467 /////// </summary>
468 /////// <value>RetainLength list for the previous file.</value>
469 ////public string PreviousRetainLengths
470 ////{
471 //// get { return this.previousRetainLengths[0]; }
472 //// set { this.previousRetainLengths[0] = value; }
473 ////}
474
475 /////// <summary>
476 /////// Gets the delta patch retain-length list for the previous files.
477 /////// </summary>
478 /////// <value>RetainLength list for the previous files.</value>
479 ////[SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
480 ////public string[] PreviousRetainLengthsArray
481 ////{
482 //// get { return this.previousRetainLengths; }
483 ////}
484
485 /////// <summary>
486 /////// Gets or sets the delta patch ignore-offset list for the previous file.
487 /////// </summary>
488 /////// <value>IgnoreOffset list for the previous file.</value>
489 ////public string PreviousIgnoreOffsets
490 ////{
491 //// get { return this.previousIgnoreOffsets[0]; }
492 //// set { this.previousIgnoreOffsets[0] = value; }
493 ////}
494
495 /////// <summary>
496 /////// Gets the delta patch ignore-offset list for the previous files.
497 /////// </summary>
498 /////// <value>IgnoreOffset list for the previous files.</value>
499 ////[SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
500 ////public string[] PreviousIgnoreOffsetsArray
501 ////{
502 //// get { return this.previousIgnoreOffsets; }
503 ////}
504
505 /////// <summary>
506 /////// Gets or sets the delta patch ignore-length list for the previous file.
507 /////// </summary>
508 /////// <value>IgnoreLength list for the previous file.</value>
509 ////public string PreviousIgnoreLengths
510 ////{
511 //// get { return this.previousIgnoreLengths[0]; }
512 //// set { this.previousIgnoreLengths[0] = value; }
513 ////}
514
515 /////// <summary>
516 /////// Gets the delta patch ignore-length list for the previous files.
517 /////// </summary>
518 /////// <value>IgnoreLength list for the previous files.</value>
519 ////[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
520 ////public string[] PreviousIgnoreLengthsArray
521 ////{
522 //// get { return this.previousIgnoreLengths; }
523 ////}
524
525 /////// <summary>
526 /////// Gets or sets the delta patch retain-offset list for the previous file.
527 /////// </summary>
528 /////// <value>RetainOffset list for the previous file.</value>
529 ////public string PreviousRetainOffsets
530 ////{
531 //// get { return this.previousRetainOffsets[0]; }
532 //// set { this.previousRetainOffsets[0] = value; }
533 ////}
534
535 /////// <summary>
536 /////// Gets the delta patch retain-offset list for the previous files.
537 /////// </summary>
538 /////// <value>RetainOffset list for the previous files.</value>
539 ////[SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
540 ////public string[] PreviousRetainOffsetsArray
541 ////{
542 //// get { return this.previousRetainOffsets; }
543 ////}
544
545 /////// <summary>
546 /////// Compares the current FileRow with another object of the same type.
547 /////// </summary>
548 /////// <param name="obj">An object to compare with this instance.</param>
549 /////// <returns>An integer that indicates the relative order of the comparands.</returns>
550 ////[SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "System.ArgumentException.#ctor(System.String)")]
551 ////[SuppressMessage("Microsoft.Globalization", "CA1309:UseOrdinalStringComparison")]
552 ////public int CompareTo(object obj)
553 ////{
554 //// if (this == obj)
555 //// {
556 //// return 0;
557 //// }
558
559 //// FileRow fileRow = obj as FileRow;
560 //// if (null == fileRow)
561 //// {
562 //// throw new ArgumentException(WixDataStrings.EXP_OtherObjectIsNotFileRow);
563 //// }
564
565 //// int compared = this.DiskId - fileRow.DiskId;
566 //// if (0 == compared)
567 //// {
568 //// compared = this.patchGroup - fileRow.patchGroup;
569
570 //// if (0 == compared)
571 //// {
572 //// compared = String.Compare(this.File, fileRow.File, StringComparison.InvariantCulture);
573 //// }
574 //// }
575
576 //// return compared;
577 ////}
578
579 /////// <summary>
580 /////// Copies data from another FileRow object.
581 /////// </summary>
582 /////// <param name="src">An row to get data from.</param>
583 ////public void CopyFrom(FileRow src)
584 ////{
585 //// for (int i = 0; i < src.Fields.Length; i++)
586 //// {
587 //// this[i] = src[i];
588 //// }
589 //// this.assemblyManifest = src.assemblyManifest;
590 //// this.assemblyType = src.assemblyType;
591 //// this.directory = src.directory;
592 //// this.diskId = src.diskId;
593 //// this.fromModule = src.fromModule;
594 //// this.isGeneratedShortFileName = src.isGeneratedShortFileName;
595 //// this.patchGroup = src.patchGroup;
596 //// this.processorArchitecture = src.processorArchitecture;
597 //// this.source = src.source;
598 //// this.PreviousSource = src.PreviousSource;
599 //// this.Operation = src.Operation;
600 //// this.symbols = src.symbols;
601 //// this.PreviousSymbols = src.PreviousSymbols;
602 //// this.patchAttributes = src.patchAttributes;
603 //// this.retainOffsets = src.retainOffsets;
604 //// this.retainLengths = src.retainLengths;
605 //// this.ignoreOffsets = src.ignoreOffsets;
606 //// this.ignoreLengths = src.ignoreLengths;
607 //// this.PreviousRetainOffsets = src.PreviousRetainOffsets;
608 //// this.PreviousRetainLengths = src.PreviousRetainLengths;
609 //// this.PreviousIgnoreOffsets = src.PreviousIgnoreOffsets;
610 //// this.PreviousIgnoreLengths = src.PreviousIgnoreLengths;
611 ////}
612
613 /////// <summary>
614 /////// Appends previous data from another FileRow object.
615 /////// </summary>
616 /////// <param name="src">An row to get data from.</param>
617 ////public void AppendPreviousDataFrom(FileRow src)
618 ////{
619 //// AppendStringToArray(ref this.previousSource, src.previousSource[0]);
620 //// AppendStringToArray(ref this.previousSymbols, src.previousSymbols[0]);
621 //// AppendStringToArray(ref this.previousRetainOffsets, src.previousRetainOffsets[0]);
622 //// AppendStringToArray(ref this.previousRetainLengths, src.previousRetainLengths[0]);
623 //// AppendStringToArray(ref this.previousIgnoreOffsets, src.previousIgnoreOffsets[0]);
624 //// AppendStringToArray(ref this.previousIgnoreLengths, src.previousIgnoreLengths[0]);
625 ////}
626
627 /////// <summary>
628 /////// Helper method for AppendPreviousDataFrom.
629 /////// </summary>
630 /////// <param name="source">Destination array.</param>
631 /////// <param name="destination">Source string.</param>
632 ////private static void AppendStringToArray(ref string[] destination, string source)
633 ////{
634 //// string[] result = new string[destination.Length + 1];
635 //// destination.CopyTo(result, 0);
636 //// result[destination.Length] = source;
637 //// destination = result;
638 ////}
639 }
640}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/MediaRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/MediaRow.cs
deleted file mode 100644
index f387a8d2..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/MediaRow.cs
+++ /dev/null
@@ -1,80 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the Media table.
7 /// </summary>
8 public sealed class MediaRow : Row
9 {
10 /// <summary>
11 /// Creates a Media row that belongs to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="table">Table this Media row belongs to and should get its column definitions from.</param>
15 public MediaRow(SourceLineNumber sourceLineNumbers, Table table)
16 : base(sourceLineNumbers, table)
17 {
18 }
19
20 /// <summary>
21 /// Gets or sets the disk id for this media row.
22 /// </summary>
23 /// <value>Disk id.</value>
24 public int DiskId
25 {
26 get { return (int)this.Fields[0].Data; }
27 set { this.Fields[0].Data = value; }
28 }
29
30 /// <summary>
31 /// Gets or sets the last sequence number for this media row.
32 /// </summary>
33 /// <value>Last sequence number.</value>
34 public int LastSequence
35 {
36 get { return (int)this.Fields[1].Data; }
37 set { this.Fields[1].Data = value; }
38 }
39
40 /// <summary>
41 /// Gets or sets the disk prompt for this media row.
42 /// </summary>
43 /// <value>Disk prompt.</value>
44 public string DiskPrompt
45 {
46 get { return (string)this.Fields[2].Data; }
47 set { this.Fields[2].Data = value; }
48 }
49
50 /// <summary>
51 /// Gets or sets the cabinet name for this media row.
52 /// </summary>
53 /// <value>Cabinet name.</value>
54 public string Cabinet
55 {
56 get { return (string)this.Fields[3].Data; }
57 set { this.Fields[3].Data = value; }
58 }
59
60 /// <summary>
61 /// Gets or sets the volume label for this media row.
62 /// </summary>
63 /// <value>Volume label.</value>
64 public string VolumeLabel
65 {
66 get { return (string)this.Fields[4].Data; }
67 set { this.Fields[4].Data = value; }
68 }
69
70 /// <summary>
71 /// Gets or sets the source for this media row.
72 /// </summary>
73 /// <value>Source.</value>
74 public string Source
75 {
76 get { return (string)this.Fields[5].Data; }
77 set { this.Fields[5].Data = value; }
78 }
79 }
80}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/PropertyRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/PropertyRow.cs
deleted file mode 100644
index 558df760..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/PropertyRow.cs
+++ /dev/null
@@ -1,42 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6
7 /// <summary>
8 /// Specialization of a row for the upgrade table.
9 /// </summary>
10 public sealed class PropertyRow : Row
11 {
12 /// <summary>
13 /// Creates an Upgrade row that belongs to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="table">Table this Upgrade row belongs to and should get its column definitions from.</param>
17 public PropertyRow(SourceLineNumber sourceLineNumbers, Table table) :
18 base(sourceLineNumbers, table)
19 {
20 }
21
22 /// <summary>
23 /// Gets and sets the upgrade code for the row.
24 /// </summary>
25 /// <value>Property identifier for the row.</value>
26 public string Property
27 {
28 get { return (string)this.Fields[0].Data; }
29 set { this.Fields[0].Data = value; }
30 }
31
32 /// <summary>
33 /// Gets and sets the value for the row.
34 /// </summary>
35 /// <value>Property value for the row.</value>
36 public string Value
37 {
38 get { return (string)this.Fields[1].Data; }
39 set { this.Fields[1].Data = value; }
40 }
41 }
42}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/SummaryInfoRowCollection.cs b/src/WixToolset.Data.WindowsInstaller/Rows/SummaryInfoRowCollection.cs
deleted file mode 100644
index bc931f15..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/SummaryInfoRowCollection.cs
+++ /dev/null
@@ -1,42 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6 using System.Collections;
7 using System.Collections.ObjectModel;
8
9 /// <summary>
10 /// Indexed container class for summary information rows.
11 /// </summary>
12 public sealed class SummaryInfoRowCollection : KeyedCollection<int, Row>
13 {
14 /// <summary>
15 /// Creates the keyed collection from existing rows in a table.
16 /// </summary>
17 /// <param name="table">The summary information table to index.</param>
18 public SummaryInfoRowCollection(Table table)
19 {
20 if (0 != String.CompareOrdinal("_SummaryInformation", table.Name))
21 {
22 string message = string.Format(WixDataStrings.EXP_UnsupportedTable, table.Name);
23 throw new ArgumentException(message, "table");
24 }
25
26 foreach (Row row in table.Rows)
27 {
28 this.Add(row);
29 }
30 }
31
32 /// <summary>
33 /// Gets the summary property ID for the <paramref name="row"/>.
34 /// </summary>
35 /// <param name="row">The row to index.</param>
36 /// <returns>The summary property ID for the <paramref name="row"/>.
37 protected override int GetKeyForItem(Row row)
38 {
39 return (int)row[0];
40 }
41 }
42}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/UpgradeRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/UpgradeRow.cs
deleted file mode 100644
index 807a9f93..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/UpgradeRow.cs
+++ /dev/null
@@ -1,90 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the upgrade table.
7 /// </summary>
8 public sealed class UpgradeRow : Row
9 {
10 /// <summary>
11 /// Creates an Upgrade row that belongs to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="table">Table this Upgrade row belongs to and should get its column definitions from.</param>
15 public UpgradeRow(SourceLineNumber sourceLineNumbers, Table table) :
16 base(sourceLineNumbers, table)
17 {
18 }
19
20 /// <summary>
21 /// Gets and sets the upgrade code for the row.
22 /// </summary>
23 /// <value>Upgrade code for the row.</value>
24 public string UpgradeCode
25 {
26 get { return (string)this.Fields[0].Data; }
27 set { this.Fields[0].Data = value; }
28 }
29
30 /// <summary>
31 /// Gets and sets the version minimum for the row.
32 /// </summary>
33 /// <value>Version minimum for the row.</value>
34 public string VersionMin
35 {
36 get { return (string)this.Fields[1].Data; }
37 set { this.Fields[1].Data = value; }
38 }
39
40 /// <summary>
41 /// Gets and sets the version maximum for the row.
42 /// </summary>
43 /// <value>Version maximum for the row.</value>
44 public string VersionMax
45 {
46 get { return (string)this.Fields[2].Data; }
47 set { this.Fields[2].Data = value; }
48 }
49
50 /// <summary>
51 /// Gets and sets the language for the row.
52 /// </summary>
53 /// <value>Language for the row.</value>
54 public string Language
55 {
56 get { return (string)this.Fields[3].Data; }
57 set { this.Fields[3].Data = value; }
58 }
59
60 /// <summary>
61 /// Gets and sets the attributes for the row.
62 /// </summary>
63 /// <value>Attributes for the row.</value>
64 public int Attributes
65 {
66 get { return (int)this.Fields[4].Data; }
67 set { this.Fields[4].Data = value; }
68 }
69
70 /// <summary>
71 /// Gets and sets the remove code for the row.
72 /// </summary>
73 /// <value>Remove code for the row.</value>
74 public string Remove
75 {
76 get { return (string)this.Fields[5].Data; }
77 set { this.Fields[5].Data = value; }
78 }
79
80 /// <summary>
81 /// Gets and sets the action property for the row.
82 /// </summary>
83 /// <value>Action property for the row.</value>
84 public string ActionProperty
85 {
86 get { return (string)this.Fields[6].Data; }
87 set { this.Fields[6].Data = value; }
88 }
89 }
90}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixActionRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixActionRow.cs
deleted file mode 100644
index d1be706e..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixActionRow.cs
+++ /dev/null
@@ -1,378 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Diagnostics;
8 using System.Globalization;
9 using System.Xml;
10 using System.Xml.Schema;
11 using WixToolset.Data.Tuples;
12
13 /// <summary>
14 /// The Sequence tables that actions may belong to.
15 /// </summary>
16 //public enum SequenceTable
17 //{
18 // /// <summary>AdminUISequence</summary>
19 // AdminUISequence,
20
21 // /// <summary>AdminExecuteSequence</summary>
22 // AdminExecuteSequence,
23
24 // /// <summary>AdvtExecuteSequence</summary>
25 // AdvtExecuteSequence,
26
27 // /// <summary>InstallUISequence</summary>
28 // InstallUISequence,
29
30 // /// <summary>InstallExecuteSequence</summary>
31 // InstallExecuteSequence
32 //}
33
34 /// <summary>
35 /// Specialization of a row for the sequence tables.
36 /// </summary>
37 public sealed class WixActionRow : Row, IComparable
38 {
39 private WixActionRowCollection previousActionRows;
40 private WixActionRowCollection nextActionRows;
41
42 /// <summary>
43 /// Instantiates an ActionRow that belongs to a table.
44 /// </summary>
45 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
46 /// <param name="table">Table this Action row belongs to and should get its column definitions from.</param>
47 public WixActionRow(SourceLineNumber sourceLineNumbers, Table table) :
48 base(sourceLineNumbers, table)
49 {
50 }
51
52 /// <summary>
53 /// Instantiates a standard ActionRow.
54 /// </summary>
55 /// <param name="sequenceTable">The sequence table of the standard action.</param>
56 /// <param name="action">The name of the standard action.</param>
57 /// <param name="condition">The condition of the standard action.</param>
58 /// <param name="sequence">The suggested sequence number of the standard action.</param>
59 //private WixActionRow(SequenceTable sequenceTable, string action, string condition, int sequence) :
60 // base(null, WindowsInstallerStandard.GetTableDefinitions()["WixAction"])
61 //{
62 // this.SequenceTable = sequenceTable;
63 // this.Action = action;
64 // this.Condition = condition;
65 // this.Sequence = sequence;
66 // this.Overridable = true; // all standard actions are overridable by default
67 //}
68
69 /// <summary>
70 /// Instantiates an ActionRow by copying data from another ActionRow.
71 /// </summary>
72 /// <param name="source">The row the data is copied from.</param>
73 /// <remarks>The previous and next action collections are not copied.</remarks>
74 private WixActionRow(WixActionRow source)
75 : base(source)
76 {
77 }
78
79 /// <summary>
80 /// Gets or sets the name of the action.
81 /// </summary>
82 /// <value>The name of the action.</value>
83 public string Action
84 {
85 get { return (string)this.Fields[1].Data; }
86 set { this.Fields[1].Data = value; }
87 }
88
89 /// <summary>
90 /// Gets the name of the action this action should be scheduled after.
91 /// </summary>
92 /// <value>The name of the action this action should be scheduled after.</value>
93 public string After
94 {
95 get { return (string)this.Fields[5].Data; }
96 set { this.Fields[5].Data = value; }
97 }
98
99 /// <summary>
100 /// Gets the name of the action this action should be scheduled before.
101 /// </summary>
102 /// <value>The name of the action this action should be scheduled before.</value>
103 public string Before
104 {
105 get { return (string)this.Fields[4].Data; }
106 set { this.Fields[4].Data = value; }
107 }
108
109 /// <summary>
110 /// Gets or sets the condition of the action.
111 /// </summary>
112 /// <value>The condition of the action.</value>
113 public string Condition
114 {
115 get { return (string)this.Fields[2].Data; }
116 set { this.Fields[2].Data = value; }
117 }
118
119 /// <summary>
120 /// Gets or sets whether this action is overridable.
121 /// </summary>
122 /// <value>Whether this action is overridable.</value>
123 public bool Overridable
124 {
125 get { return (1 == Convert.ToInt32(this.Fields[6].Data, CultureInfo.InvariantCulture)); }
126 set { this.Fields[6].Data = (value ? 1 : 0); }
127 }
128
129 /// <summary>
130 /// Gets or sets the sequence number of this action.
131 /// </summary>
132 /// <value>The sequence number of this action.</value>
133 public int Sequence
134 {
135 get { return Convert.ToInt32(this.Fields[3].Data, CultureInfo.InvariantCulture); }
136 set { this.Fields[3].Data = value; }
137 }
138
139 /// <summary>
140 /// Gets of sets the sequence table of this action.
141 /// </summary>
142 /// <value>The sequence table of this action.</value>
143 public SequenceTable SequenceTable
144 {
145 get { return (SequenceTable)Enum.Parse(typeof(SequenceTable), (string)this.Fields[0].Data); }
146 set { this.Fields[0].Data = value.ToString(); }
147 }
148
149 /// <summary>
150 /// Gets the actions that should be scheduled after this action.
151 /// </summary>
152 /// <value>The actions that should be scheduled after this action.</value>
153 public WixActionRowCollection NextActionRows
154 {
155 get
156 {
157 if (null == this.nextActionRows)
158 {
159 this.nextActionRows = new WixActionRowCollection();
160 }
161
162 return this.nextActionRows;
163 }
164 }
165
166 /// <summary>
167 /// Gets the actions that should be scheduled before this action.
168 /// </summary>
169 /// <value>The actions that should be scheduled before this action.</value>
170 public WixActionRowCollection PreviousActionRows
171 {
172 get
173 {
174 if (null == this.previousActionRows)
175 {
176 this.previousActionRows = new WixActionRowCollection();
177 }
178
179 return this.previousActionRows;
180 }
181 }
182
183 /// <summary>
184 /// Creates a clone of the action row.
185 /// </summary>
186 /// <returns>A shallow copy of the source object.</returns>
187 /// <remarks>The previous and next action collections are not copied.</remarks>
188 public WixActionRow Clone()
189 {
190 return new WixActionRow(this);
191 }
192
193 /// <summary>
194 /// Compares the current instance with another object of the same type.
195 /// </summary>
196 /// <param name="obj">Other reference to compare this one to.</param>
197 /// <returns>Returns less than 0 for less than, 0 for equals, and greater than 0 for greater.</returns>
198 public int CompareTo(object obj)
199 {
200 WixActionRow otherActionRow = (WixActionRow)obj;
201
202 return this.Sequence.CompareTo(otherActionRow.Sequence);
203 }
204
205 /// <summary>
206 /// Parses ActionRows from the Xml reader.
207 /// </summary>
208 /// <param name="reader">Xml reader that contains serialized ActionRows.</param>
209 /// <returns>The parsed ActionRows.</returns>
210 internal static WixActionRow[] Parse(XmlReader reader)
211 {
212 Debug.Assert("action" == reader.LocalName);
213
214 string id = null;
215 string condition = null;
216 bool empty = reader.IsEmptyElement;
217 int sequence = int.MinValue;
218 int sequenceCount = 0;
219 SequenceTable[] sequenceTables = new SequenceTable[Enum.GetValues(typeof(SequenceTable)).Length];
220
221 while (reader.MoveToNextAttribute())
222 {
223 switch (reader.Name)
224 {
225 case "name":
226 id = reader.Value;
227 break;
228 case "AdminExecuteSequence":
229 if (reader.Value.Equals("yes"))
230 {
231 sequenceTables[sequenceCount] = SequenceTable.AdminExecuteSequence;
232 ++sequenceCount;
233 }
234 break;
235 case "AdminUISequence":
236 if (reader.Value.Equals("yes"))
237 {
238 sequenceTables[sequenceCount] = SequenceTable.AdminUISequence;
239 ++sequenceCount;
240 }
241 break;
242 case "AdvtExecuteSequence":
243 if (reader.Value.Equals("yes"))
244 {
245 sequenceTables[sequenceCount] = SequenceTable.AdvtExecuteSequence;
246 ++sequenceCount;
247 }
248 break;
249 case "condition":
250 condition = reader.Value;
251 break;
252 case "InstallExecuteSequence":
253 if (reader.Value.Equals("yes"))
254 {
255 sequenceTables[sequenceCount] = SequenceTable.InstallExecuteSequence;
256 ++sequenceCount;
257 }
258 break;
259 case "InstallUISequence":
260 if (reader.Value.Equals("yes"))
261 {
262 sequenceTables[sequenceCount] = SequenceTable.InstallUISequence;
263 ++sequenceCount;
264 }
265 break;
266 case "sequence":
267 sequence = Convert.ToInt32(reader.Value, CultureInfo.InvariantCulture);
268 break;
269 }
270 }
271
272 if (null == id)
273 {
274 throw new XmlException();
275 }
276
277 if (int.MinValue == sequence)
278 {
279 throw new XmlException();
280 }
281 else if (1 > sequence)
282 {
283 throw new XmlException();
284 }
285
286 if (0 == sequenceCount)
287 {
288 throw new XmlException();
289 }
290
291 if (!empty && reader.Read() && XmlNodeType.EndElement != reader.MoveToContent())
292 {
293 throw new XmlException();
294 }
295
296 // create the actions
297 WixActionRow[] actionRows = new WixActionRow[sequenceCount];
298 for (int i = 0; i < sequenceCount; i++)
299 {
300 //WixActionRow actionRow = new WixActionRow(sequenceTables[i], id, condition, sequence);
301 //actionRows[i] = actionRow;
302 throw new NotImplementedException();
303 }
304
305 return actionRows;
306 }
307
308#if DEAD_CODE
309 /// <summary>
310 /// Determines whether this ActionRow contains the specified ActionRow as a child in its dependency tree.
311 /// </summary>
312 /// <param name="actionRow">The possible child ActionRow.</param>
313 /// <returns>true if the ActionRow is a child of this ActionRow; false otherwise.</returns>
314 public bool ContainsChildActionRow(WixActionRow actionRow)
315 {
316 if (null != this.previousActionRows)
317 {
318 if (this.previousActionRows.Contains(actionRow.SequenceTable, actionRow.Action))
319 {
320 return true;
321 }
322 }
323
324 if (null != this.nextActionRows)
325 {
326 if (this.nextActionRows.Contains(actionRow.SequenceTable, actionRow.Action))
327 {
328 return true;
329 }
330 }
331
332 return false;
333 }
334
335 /// <summary>
336 /// Get all the actions scheduled before this one in a particular sequence table.
337 /// </summary>
338 /// <param name="sequenceTable">The sequence table.</param>
339 /// <param name="allPreviousActionRows">A RowCollection which will contain all the previous actions.</param>
340 public void GetAllPreviousActionRows(SequenceTable sequenceTable, IList<WixActionRow> allPreviousActionRows)
341 {
342 if (null != this.previousActionRows)
343 {
344 foreach (WixActionRow actionRow in this.previousActionRows)
345 {
346 if (sequenceTable == actionRow.SequenceTable)
347 {
348 actionRow.GetAllPreviousActionRows(sequenceTable, allPreviousActionRows);
349 allPreviousActionRows.Add(actionRow);
350 actionRow.GetAllNextActionRows(sequenceTable, allPreviousActionRows);
351 }
352 }
353 }
354 }
355
356 /// <summary>
357 /// Get all the actions scheduled after this one in a particular sequence table.
358 /// </summary>
359 /// <param name="sequenceTable">The sequence table.</param>
360 /// <param name="allNextActionRows">A RowCollection which will contain all the next actions.</param>
361 public void GetAllNextActionRows(SequenceTable sequenceTable, IList<WixActionRow> allNextActionRows)
362 {
363 if (null != this.nextActionRows)
364 {
365 foreach (WixActionRow actionRow in this.nextActionRows)
366 {
367 if (sequenceTable == actionRow.SequenceTable)
368 {
369 actionRow.GetAllPreviousActionRows(sequenceTable, allNextActionRows);
370 allNextActionRows.Add(actionRow);
371 actionRow.GetAllNextActionRows(sequenceTable, allNextActionRows);
372 }
373 }
374 }
375 }
376#endif
377 }
378}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixActionRowCollection.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixActionRowCollection.cs
deleted file mode 100644
index 9fab6b5d..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixActionRowCollection.cs
+++ /dev/null
@@ -1,223 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6 using System.Collections;
7 using System.Diagnostics;
8 using System.Xml;
9 using WixToolset.Data.Tuples;
10
11 /// <summary>
12 /// A collection of action rows sorted by their sequence table and action name.
13 /// </summary>
14 public sealed class WixActionRowCollection : ICollection
15 {
16 private SortedList collection;
17
18 /// <summary>
19 /// Creates a new action table object.
20 /// </summary>
21 public WixActionRowCollection()
22 {
23 this.collection = new SortedList();
24 }
25
26 /// <summary>
27 /// Gets the number of items in the collection.
28 /// </summary>
29 /// <value>Number of items in collection.</value>
30 public int Count
31 {
32 get { return this.collection.Count; }
33 }
34
35 /// <summary>
36 /// Gets if the collection has been synchronized.
37 /// </summary>
38 /// <value>True if the collection has been synchronized.</value>
39 public bool IsSynchronized
40 {
41 get { return this.collection.IsSynchronized; }
42 }
43
44 /// <summary>
45 /// Gets the object used to synchronize the collection.
46 /// </summary>
47 /// <value>Oject used the synchronize the collection.</value>
48 public object SyncRoot
49 {
50 get { return this; }
51 }
52
53 /// <summary>
54 /// Get an ActionRow by its sequence table and action name.
55 /// </summary>
56 /// <param name="sequenceTable">The sequence table of the ActionRow.</param>
57 /// <param name="action">The action name of the ActionRow.</param>
58 public WixActionRow this[SequenceTable sequenceTable, string action]
59 {
60 get { return (WixActionRow)this.collection[GetKey(sequenceTable, action)]; }
61 }
62
63 /// <summary>
64 /// Add an ActionRow to the collection.
65 /// </summary>
66 /// <param name="actionRow">The ActionRow to add.</param>
67 /// <param name="overwrite">true to overwrite an existing ActionRow; false otherwise.</param>
68 public void Add(WixActionRow actionRow, bool overwrite)
69 {
70 string key = GetKey(actionRow.SequenceTable, actionRow.Action);
71
72 if (overwrite)
73 {
74 this.collection[key] = actionRow;
75 }
76 else
77 {
78 this.collection.Add(key, actionRow);
79 }
80 }
81
82 /// <summary>
83 /// Add an ActionRow to the collection.
84 /// </summary>
85 /// <param name="actionRow">The ActionRow to add.</param>
86 public void Add(WixActionRow actionRow)
87 {
88 this.Add(actionRow, false);
89 }
90
91 /// <summary>
92 /// Determines if the collection contains an ActionRow with a specific sequence table and name.
93 /// </summary>
94 /// <param name="sequenceTable">The sequence table of the ActionRow.</param>
95 /// <param name="action">The action name of the ActionRow.</param>
96 /// <returns>true if the ActionRow was found; false otherwise.</returns>
97 public bool Contains(SequenceTable sequenceTable, string action)
98 {
99 return this.collection.Contains(GetKey(sequenceTable, action));
100 }
101
102 /// <summary>
103 /// Copies the collection into an array.
104 /// </summary>
105 /// <param name="array">Array to copy the collection into.</param>
106 /// <param name="index">Index to start copying from.</param>
107 public void CopyTo(System.Array array, int index)
108 {
109 this.collection.Values.CopyTo(array, index);
110 }
111
112 /// <summary>
113 /// Gets the enumerator for the collection.
114 /// </summary>
115 /// <returns>The enumerator for the collection.</returns>
116 public IEnumerator GetEnumerator()
117 {
118 return this.collection.Values.GetEnumerator();
119 }
120
121 /// <summary>
122 /// Remove an ActionRow from the collection.
123 /// </summary>
124 /// <param name="sequenceTable">The sequence table of the ActionRow.</param>
125 /// <param name="action">The action name of the ActionRow.</param>
126 public void Remove(SequenceTable sequenceTable, string action)
127 {
128 this.collection.Remove(GetKey(sequenceTable, action));
129 }
130
131 /// <summary>
132 /// Load an action table from an XmlReader.
133 /// </summary>
134 /// <param name="reader">Reader to get data from.</param>
135 /// <returns>The ActionRowCollection represented by the xml.</returns>
136 internal static WixActionRowCollection Load(XmlReader reader)
137 {
138 reader.MoveToContent();
139
140 return Parse(reader);
141 }
142
143 /// <summary>
144 /// Creates a new action table object and populates it from an Xml reader.
145 /// </summary>
146 /// <param name="reader">Reader to get data from.</param>
147 /// <returns>The parsed ActionTable.</returns>
148 private static WixActionRowCollection Parse(XmlReader reader)
149 {
150 if (!reader.LocalName.Equals("actions"))
151 {
152 throw new XmlException();
153 }
154
155 WixActionRowCollection actionRows = new WixActionRowCollection();
156 bool empty = reader.IsEmptyElement;
157
158 while (reader.MoveToNextAttribute())
159 {
160 }
161
162 if (!empty)
163 {
164 bool done = false;
165
166 // loop through all the fields in a row
167 while (!done && reader.Read())
168 {
169 switch (reader.NodeType)
170 {
171 case XmlNodeType.Element:
172 switch (reader.LocalName)
173 {
174 case "action":
175 WixActionRow[] parsedActionRows = WixActionRow.Parse(reader);
176
177 foreach (WixActionRow actionRow in parsedActionRows)
178 {
179 actionRows.Add(actionRow);
180 }
181 break;
182 default:
183 throw new XmlException();
184 }
185 break;
186 case XmlNodeType.EndElement:
187 done = true;
188 break;
189 }
190 }
191
192 if (!done)
193 {
194 throw new XmlException();
195 }
196 }
197
198 return actionRows;
199 }
200
201 /// <summary>
202 /// Get the key for storing an ActionRow.
203 /// </summary>
204 /// <param name="sequenceTable">The sequence table of the ActionRow.</param>
205 /// <param name="action">The action name of the ActionRow.</param>
206 /// <returns>The string key.</returns>
207 private static string GetKey(SequenceTable sequenceTable, string action)
208 {
209 return GetKey(sequenceTable.ToString(), action);
210 }
211
212 /// <summary>
213 /// Get the key for storing an ActionRow.
214 /// </summary>
215 /// <param name="sequenceTable">The sequence table of the ActionRow.</param>
216 /// <param name="action">The action name of the ActionRow.</param>
217 /// <returns>The string key.</returns>
218 private static string GetKey(string sequenceTable, string action)
219 {
220 return String.Concat(sequenceTable, '/', action);
221 }
222 }
223}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixApprovedExeForElevationRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixApprovedExeForElevationRow.cs
deleted file mode 100644
index c10a39ab..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixApprovedExeForElevationRow.cs
+++ /dev/null
@@ -1,79 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5
6 /// <summary>
7 /// Specialization of a row for the WixApprovedExeForElevation table.
8 /// </summary>
9 public class WixApprovedExeForElevationRow : Row
10 {
11 /// <summary>
12 /// Creates an ApprovedExeForElevation row that does not belong to a table.
13 /// </summary>
14 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
15 /// <param name="tableDef">TableDefinition this ApprovedExeForElevation row belongs to and should get its column definitions from.</param>
16 public WixApprovedExeForElevationRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
17 base(sourceLineNumbers, tableDef)
18 {
19 }
20
21 /// <summary>
22 /// Creates an ApprovedExeForElevation row that belongs to a table.
23 /// </summary>
24 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
25 /// <param name="table">Table this ApprovedExeForElevation row belongs to and should get its column definitions from.</param>
26 public WixApprovedExeForElevationRow(SourceLineNumber sourceLineNumbers, Table table)
27 : base(sourceLineNumbers, table)
28 {
29 }
30
31 /// <summary>
32 /// Gets or sets the ApprovedExeForElevation identifier.
33 /// </summary>
34 /// <value>The ApprovedExeForElevation identifier.</value>
35 public string Id
36 {
37 get { return (string)this.Fields[0].Data; }
38 set { this.Fields[0].Data = value; }
39 }
40
41 /// <summary>
42 /// Gets or sets the Key path.
43 /// </summary>
44 /// <value>The Key path.</value>
45 public string Key
46 {
47 get { return (string)this.Fields[1].Data; }
48 set { this.Fields[1].Data = value; }
49 }
50
51 /// <summary>
52 /// Gets or sets the Value name.
53 /// </summary>
54 /// <value>The Value name.</value>
55 public string ValueName
56 {
57 get { return (string)this.Fields[2].Data; }
58 set { this.Fields[2].Data = value; }
59 }
60
61 /// <summary>
62 /// Gets or sets the attibutes.
63 /// </summary>
64 /// <value>The BundleApprovedExeForElevationAttributes.</value>
65 public BundleApprovedExeForElevationAttributes Attributes
66 {
67 get { return (BundleApprovedExeForElevationAttributes)this.Fields[3].Data; }
68 set { this.Fields[3].Data = (int)value; }
69 }
70
71 /// <summary>
72 /// Gets whether this row is 64-bit.
73 /// </summary>
74 public bool Win64
75 {
76 get { return BundleApprovedExeForElevationAttributes.Win64 == (this.Attributes & BundleApprovedExeForElevationAttributes.Win64); }
77 }
78 }
79}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleCatalogRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleCatalogRow.cs
deleted file mode 100644
index 05c1e597..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleCatalogRow.cs
+++ /dev/null
@@ -1,50 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the WixCatalog table.
7 /// </summary>
8 public sealed class WixBundleCatalogRow : Row
9 {
10 /// <summary>
11 /// Creates a Catalog row that does not belong to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="tableDef">TableDefinition this Catalog row belongs to and should get its column definitions from.</param>
15 public WixBundleCatalogRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
16 base(sourceLineNumbers, tableDef)
17 {
18 }
19
20 /// <summary>
21 /// Creates a Catalog row that belongs to a table.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
24 /// <param name="table">Table this Catalog row belongs to and should get its column definitions from.</param>
25 public WixBundleCatalogRow(SourceLineNumber sourceLineNumbers, Table table)
26 : base(sourceLineNumbers, table)
27 {
28 }
29
30 /// <summary>
31 /// Gets or sets the catalog identifier.
32 /// </summary>
33 /// <value>The catalog identifier.</value>
34 public string Id
35 {
36 get { return (string)this.Fields[0].Data; }
37 set { this.Fields[0].Data = value; }
38 }
39
40 /// <summary>
41 /// Gets or sets the payload identifier.
42 /// </summary>
43 /// <value>The payload identifier.</value>
44 public string Payload
45 {
46 get { return (string)this.Fields[1].Data; }
47 set { this.Fields[1].Data = value; }
48 }
49 }
50}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleContainerRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleContainerRow.cs
deleted file mode 100644
index 7b03dcc5..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleContainerRow.cs
+++ /dev/null
@@ -1,78 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the Container table.
7 /// </summary>
8 public class WixBundleContainerRow : Row
9 {
10 /// <summary>
11 /// Creates a ContainerRow row that does not belong to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="tableDef">TableDefinition this Media row belongs to and should get its column definitions from.</param>
15 public WixBundleContainerRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
16 base(sourceLineNumbers, tableDef)
17 {
18 }
19
20 /// <summary>
21 /// Creates a ContainerRow row that belongs to a table.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
24 /// <param name="table">Table this Media row belongs to and should get its column definitions from.</param>
25 public WixBundleContainerRow(SourceLineNumber sourceLineNumbers, Table table) :
26 base(sourceLineNumbers, table)
27 {
28 }
29
30 public string Id
31 {
32 get { return (string)this.Fields[0].Data; }
33 set { this.Fields[0].Data = value; }
34 }
35
36 public string Name
37 {
38 get { return (string)this.Fields[1].Data; }
39 set { this.Fields[1].Data = value; }
40 }
41
42 public ContainerType Type
43 {
44 get { return (ContainerType)this.Fields[2].Data; }
45 set { this.Fields[2].Data = (int)value; }
46 }
47
48 public string DownloadUrl
49 {
50 get { return (string)this.Fields[3].Data; }
51 set { this.Fields[3].Data = value; }
52 }
53
54 public long Size
55 {
56 get { return (long)this.Fields[4].Data; }
57 set { this.Fields[4].Data = value; }
58 }
59
60 public string Hash
61 {
62 get { return (string)this.Fields[5].Data; }
63 set { this.Fields[5].Data = value; }
64 }
65
66 public int AttachedContainerIndex
67 {
68 get { return (null == this.Fields[6].Data) ? -1 : (int)this.Fields[6].Data; }
69 set { this.Fields[6].Data = value; }
70 }
71
72 public string WorkingPath
73 {
74 get { return (string)this.Fields[7].Data; }
75 set { this.Fields[7].Data = value; }
76 }
77 }
78}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleExePackageRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleExePackageRow.cs
deleted file mode 100644
index 3bf06d49..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleExePackageRow.cs
+++ /dev/null
@@ -1,103 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3using WixToolset.Data.Tuples;
4
5namespace WixToolset.Data.Rows
6{
7 /// <summary>
8 /// Specialization of a row for the WixBundleExePackage table.
9 /// </summary>
10 public sealed class WixBundleExePackageRow : Row
11 {
12 /// <summary>
13 /// Creates a WixBundleExePackage row that does not belong to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="tableDef">TableDefinition this row belongs to and should get its column definitions from.</param>
17 public WixBundleExePackageRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
18 base(sourceLineNumbers, tableDef)
19 {
20 }
21
22 /// <summary>
23 /// Creates a WixBundleExePackageRow row that belongs to a table.
24 /// </summary>
25 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
26 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
27 public WixBundleExePackageRow(SourceLineNumber sourceLineNumbers, Table table) :
28 base(sourceLineNumbers, table)
29 {
30 }
31
32 /// <summary>
33 /// Gets or sets the foreign key identifier to the ChainPackage row.
34 /// </summary>
35 public string ChainPackageId
36 {
37 get { return (string)this.Fields[0].Data; }
38 set { this.Fields[0].Data = value; }
39 }
40
41 /// <summary>
42 /// Gets or sets the raw Exe attributes of a patch.
43 /// </summary>
44 public WixBundleExePackageAttributes Attributes
45 {
46 get { return (WixBundleExePackageAttributes)this.Fields[1].Data; }
47 set { this.Fields[1].Data = value; }
48 }
49
50 /// <summary>
51 /// Gets or sets the protcol for the executable package.
52 /// </summary>
53 public string DetectCondition
54 {
55 get { return (string)this.Fields[2].Data; }
56 set { this.Fields[2].Data = value; }
57 }
58
59 /// <summary>
60 /// Gets or sets the install command for the executable package.
61 /// </summary>
62 public string InstallCommand
63 {
64 get { return (string)this.Fields[3].Data; }
65 set { this.Fields[3].Data = value; }
66 }
67
68 /// <summary>
69 /// Gets or sets the repair command for the executable package.
70 /// </summary>
71 public string RepairCommand
72 {
73 get { return (string)this.Fields[4].Data; }
74 set { this.Fields[4].Data = value; }
75 }
76
77 /// <summary>
78 /// Gets or sets the uninstall command for the executable package.
79 /// </summary>
80 public string UninstallCommand
81 {
82 get { return (string)this.Fields[5].Data; }
83 set { this.Fields[5].Data = value; }
84 }
85
86 /// <summary>
87 /// Gets or sets the protcol for the executable package.
88 /// </summary>
89 public string ExeProtocol
90 {
91 get { return (string)this.Fields[6].Data; }
92 set { this.Fields[6].Data = value; }
93 }
94
95 /// <summary>
96 /// Gets whether the executable package is repairable.
97 /// </summary>
98 public bool Repairable
99 {
100 get { return 0 != (this.Attributes & WixBundleExePackageAttributes.Repairable); }
101 }
102 }
103}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsiFeatureRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsiFeatureRow.cs
deleted file mode 100644
index 551eae20..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsiFeatureRow.cs
+++ /dev/null
@@ -1,93 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the MsiFeature table.
7 /// </summary>
8 public class WixBundleMsiFeatureRow : Row
9 {
10 /// <summary>
11 /// Creates a MsiFeatureRow row that does not belong to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="tableDef">TableDefinition this Media row belongs to and should get its column definitions from.</param>
15 public WixBundleMsiFeatureRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
16 base(sourceLineNumbers, tableDef)
17 {
18 }
19
20 /// <summary>
21 /// Creates a MsiFeatureRow row that belongs to a table.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
24 /// <param name="table">Table this Media row belongs to and should get its column definitions from.</param>
25 public WixBundleMsiFeatureRow(SourceLineNumber sourceLineNumbers, Table table) :
26 base(sourceLineNumbers, table)
27 {
28 }
29
30 /// <summary>
31 /// Gets or sets the foreign key identifier to the ChainPackage row.
32 /// </summary>
33 public string ChainPackageId
34 {
35 get { return (string)this.Fields[0].Data; }
36 set { this.Fields[0].Data = value; }
37 }
38
39 public string Name
40 {
41 get { return (string)this.Fields[1].Data; }
42 set { this.Fields[1].Data = value; }
43 }
44
45 public long Size
46 {
47 get { return (long)this.Fields[2].Data; }
48 set { this.Fields[2].Data = value; }
49 }
50
51 public string Parent
52 {
53 get { return (string)this.Fields[3].Data; }
54 set { this.Fields[3].Data = value; }
55 }
56
57 public string Title
58 {
59 get { return (string)this.Fields[4].Data; }
60 set { this.Fields[4].Data = value; }
61 }
62
63 public string Description
64 {
65 get { return (string)this.Fields[5].Data; }
66 set { this.Fields[5].Data = value; }
67 }
68
69 public int Display
70 {
71 get { return (int)this.Fields[6].Data; }
72 set { this.Fields[6].Data = value; }
73 }
74
75 public int Level
76 {
77 get { return (int)this.Fields[7].Data; }
78 set { this.Fields[7].Data = value; }
79 }
80
81 public string Directory
82 {
83 get { return (string)this.Fields[8].Data; }
84 set { this.Fields[8].Data = value; }
85 }
86
87 public int Attributes
88 {
89 get { return (int)this.Fields[9].Data; }
90 set { this.Fields[9].Data = value; }
91 }
92 }
93}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsiPackageRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsiPackageRow.cs
deleted file mode 100644
index 70d85e26..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsiPackageRow.cs
+++ /dev/null
@@ -1,138 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6 using System.Globalization;
7 using WixToolset.Data.Tuples;
8
9 /// <summary>
10 /// Specialization of a row for the WixBundleMsiPackage table.
11 /// </summary>
12 public sealed class WixBundleMsiPackageRow : Row
13 {
14 /// <summary>
15 /// Creates a WixBundleMsiPackage row that does not belong to a table.
16 /// </summary>
17 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
18 /// <param name="tableDef">TableDefinition this row belongs to and should get its column definitions from.</param>
19 public WixBundleMsiPackageRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
20 base(sourceLineNumbers, tableDef)
21 {
22 }
23
24 /// <summary>
25 /// Creates a WixBundleMsiPackageRow row that belongs to a table.
26 /// </summary>
27 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
28 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
29 public WixBundleMsiPackageRow(SourceLineNumber sourceLineNumbers, Table table) :
30 base(sourceLineNumbers, table)
31 {
32 }
33
34 /// <summary>
35 /// Gets or sets the foreign key identifier to the ChainPackage row.
36 /// </summary>
37 public string ChainPackageId
38 {
39 get { return (string)this.Fields[0].Data; }
40 set { this.Fields[0].Data = value; }
41 }
42
43 /// <summary>
44 /// Gets or sets the raw MSI attributes of a package.
45 /// </summary>
46 public WixBundleMsiPackageAttributes Attributes
47 {
48 get { return (WixBundleMsiPackageAttributes)this.Fields[1].Data; }
49 set { this.Fields[1].Data = value; }
50 }
51
52 /// <summary>
53 /// Gets or sets the MSI package's product code.
54 /// </summary>
55 public string ProductCode
56 {
57 get { return (string)this.Fields[2].Data; }
58 set { this.Fields[2].Data = value; }
59 }
60
61 /// <summary>
62 /// Gets or sets the MSI package's upgrade code.
63 /// </summary>
64 public string UpgradeCode
65 {
66 get { return (string)this.Fields[3].Data; }
67 set { this.Fields[3].Data = value; }
68 }
69
70 /// <summary>
71 /// Gets or sets the product version of the MSI package.
72 /// </summary>
73 public string ProductVersion
74 {
75 get { return (string)this.Fields[4].Data; }
76 set { this.Fields[4].Data = value; }
77 }
78
79 /// <summary>
80 /// Gets or sets the language of the MSI package.
81 /// </summary>
82 public int ProductLanguage
83 {
84 get { return Convert.ToInt32(this.Fields[5].Data, CultureInfo.InvariantCulture); }
85 set { this.Fields[5].Data = value; }
86 }
87
88 /// <summary>
89 /// Gets or sets the product name of the MSI package.
90 /// </summary>
91 public string ProductName
92 {
93 get { return (string)this.Fields[6].Data; }
94 set { this.Fields[6].Data = value; }
95 }
96
97 /// <summary>
98 /// Gets or sets the MSI package's manufacturer.
99 /// </summary>
100 public string Manufacturer
101 {
102 get { return (string)this.Fields[7].Data; }
103 set { this.Fields[7].Data = value; }
104 }
105
106 /// <summary>
107 /// Gets the display internal UI of a package.
108 /// </summary>
109 public bool DisplayInternalUI
110 {
111 get { return 0 != (this.Attributes & WixBundleMsiPackageAttributes.DisplayInternalUI); }
112 }
113
114 /// <summary>
115 /// Gets the display internal UI of a package.
116 /// </summary>
117 public bool EnableFeatureSelection
118 {
119 get { return 0 != (this.Attributes & WixBundleMsiPackageAttributes.EnableFeatureSelection); }
120 }
121
122 /// <summary>
123 /// Gets the display internal UI of a package.
124 /// </summary>
125 public bool ForcePerMachine
126 {
127 get { return 0 != (this.Attributes & WixBundleMsiPackageAttributes.ForcePerMachine); }
128 }
129
130 /// <summary>
131 /// Gets the suppress loose file payload generation of a package.
132 /// </summary>
133 public bool SuppressLooseFilePayloadGeneration
134 {
135 get { return 0 != (this.Attributes & WixBundleMsiPackageAttributes.SuppressLooseFilePayloadGeneration); }
136 }
137 }
138}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsiPropertyRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsiPropertyRow.cs
deleted file mode 100644
index 524f7929..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsiPropertyRow.cs
+++ /dev/null
@@ -1,58 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the WixBundleMsiProperty table.
7 /// </summary>
8 public sealed class WixBundleMsiPropertyRow : Row
9 {
10 /// <summary>
11 /// Creates an WixBundleMsiProperty row that belongs to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="table">Table this WixBundleMsiProperty row belongs to and should get its column definitions from.</param>
15 public WixBundleMsiPropertyRow(SourceLineNumber sourceLineNumbers, Table table) :
16 base(sourceLineNumbers, table)
17 {
18 }
19
20 /// <summary>
21 /// Gets or sets the foreign key identifier to the ChainPackage row.
22 /// </summary>
23 public string ChainPackageId
24 {
25 get { return (string)this.Fields[0].Data; }
26 set { this.Fields[0].Data = value; }
27 }
28
29 /// <summary>
30 /// Gets and sets the property identity.
31 /// </summary>
32 public string Name
33 {
34 get { return (string)this.Fields[1].Data; }
35 set { this.Fields[1].Data = value; }
36 }
37
38 /// <summary>
39 /// Gets and sets the value for the row.
40 /// </summary>
41 /// <value>MsiProperty value for the row.</value>
42 public string Value
43 {
44 get { return (string)this.Fields[2].Data; }
45 set { this.Fields[2].Data = value; }
46 }
47
48 /// <summary>
49 /// Gets and sets the condition for the row.
50 /// </summary>
51 /// <value>MsiProperty condition for the row.</value>
52 public string Condition
53 {
54 get { return (string)this.Fields[3].Data; }
55 set { this.Fields[3].Data = value; }
56 }
57 }
58}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMspPackageRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMspPackageRow.cs
deleted file mode 100644
index 053fc915..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMspPackageRow.cs
+++ /dev/null
@@ -1,101 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3using WixToolset.Data.Tuples;
4
5namespace WixToolset.Data.Rows
6{
7 /// <summary>
8 /// Specialization of a row for the ChainMspPackage table.
9 /// </summary>
10 public sealed class WixBundleMspPackageRow : Row
11 {
12 /// <summary>
13 /// Creates a ChainMspPackage row that does not belong to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="tableDef">TableDefinition this row belongs to and should get its column definitions from.</param>
17 public WixBundleMspPackageRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
18 base(sourceLineNumbers, tableDef)
19 {
20 }
21
22 /// <summary>
23 /// Creates a WixBundleMspPackage row that belongs to a table.
24 /// </summary>
25 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
26 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
27 public WixBundleMspPackageRow(SourceLineNumber sourceLineNumbers, Table table) :
28 base(sourceLineNumbers, table)
29 {
30 }
31
32 /// <summary>
33 /// Gets or sets the foreign key identifier to the ChainPackage row.
34 /// </summary>
35 public string ChainPackageId
36 {
37 get { return (string)this.Fields[0].Data; }
38 set { this.Fields[0].Data = value; }
39 }
40
41 /// <summary>
42 /// Gets or sets the raw MSP attributes of a patch.
43 /// </summary>
44 public WixBundleMspPackageAttributes Attributes
45 {
46 get { return (WixBundleMspPackageAttributes)this.Fields[1].Data; }
47 set { this.Fields[1].Data = value; }
48 }
49
50 /// <summary>
51 /// Gets or sets the patch code.
52 /// </summary>
53 public string PatchCode
54 {
55 get { return (string)this.Fields[2].Data; }
56 set { this.Fields[2].Data = value; }
57 }
58
59 /// <summary>
60 /// Gets or sets the patch's manufacturer.
61 /// </summary>
62 public string Manufacturer
63 {
64 get { return (string)this.Fields[3].Data; }
65 set { this.Fields[3].Data = value; }
66 }
67
68 /// <summary>
69 /// Gets or sets the patch's xml.
70 /// </summary>
71 public string PatchXml
72 {
73 get { return (string)this.Fields[4].Data; }
74 set { this.Fields[4].Data = value; }
75 }
76
77 /// <summary>
78 /// Gets the display internal UI of a patch.
79 /// </summary>
80 public bool DisplayInternalUI
81 {
82 get { return 0 != (this.Attributes & WixBundleMspPackageAttributes.DisplayInternalUI); }
83 }
84
85 /// <summary>
86 /// Gets whether to slipstream the patch.
87 /// </summary>
88 public bool Slipstream
89 {
90 get { return 0 != (this.Attributes & WixBundleMspPackageAttributes.Slipstream); }
91 }
92
93 /// <summary>
94 /// Gets whether the patch targets an unspecified number of packages.
95 /// </summary>
96 public bool TargetUnspecified
97 {
98 get { return 0 != (this.Attributes & WixBundleMspPackageAttributes.TargetUnspecified); }
99 }
100 }
101}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsuPackageRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsuPackageRow.cs
deleted file mode 100644
index 0df635c2..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleMsuPackageRow.cs
+++ /dev/null
@@ -1,57 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the WixBundleMsuPackage table.
7 /// </summary>
8 public sealed class WixBundleMsuPackageRow : Row
9 {
10 /// <summary>
11 /// Creates a WixBundleMsuPackage row that does not belong to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="tableDef">TableDefinition this row belongs to and should get its column definitions from.</param>
15 public WixBundleMsuPackageRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
16 base(sourceLineNumbers, tableDef)
17 {
18 }
19
20 /// <summary>
21 /// Creates a WixBundleMsuPackage row that belongs to a table.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
24 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
25 public WixBundleMsuPackageRow(SourceLineNumber sourceLineNumbers, Table table) :
26 base(sourceLineNumbers, table)
27 {
28 }
29
30 /// <summary>
31 /// Gets or sets the foreign key identifier to the ChainPackage row.
32 /// </summary>
33 public string ChainPackageId
34 {
35 get { return (string)this.Fields[0].Data; }
36 set { this.Fields[0].Data = value; }
37 }
38
39 /// <summary>
40 /// Gets or sets the detection condition the package.
41 /// </summary>
42 public string DetectCondition
43 {
44 get { return (string)this.Fields[1].Data; }
45 set { this.Fields[1].Data = value; }
46 }
47
48 /// <summary>
49 /// Gets or sets the KB of the package.
50 /// </summary>
51 public string MsuKB
52 {
53 get { return (string)this.Fields[2].Data; }
54 set { this.Fields[2].Data = value; }
55 }
56 }
57}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePackageCommandLineRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePackageCommandLineRow.cs
deleted file mode 100644
index eba647d5..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePackageCommandLineRow.cs
+++ /dev/null
@@ -1,82 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6
7 /// <summary>
8 /// Specialization of a row for the WixBundlePackageCommandLine table.
9 /// </summary>
10 public class WixBundlePackageCommandLineRow : Row
11 {
12 /// <summary>
13 /// Creates a WixBundlePackageCommandLineRow row that does not belong to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="tableDef">TableDefinition this WixBundlePackageCommandLineRow row belongs to and should get its column definitions from.</param>
17 public WixBundlePackageCommandLineRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
18 base(sourceLineNumbers, tableDef)
19 {
20 }
21
22 /// <summary>
23 /// Creates an WixBundlePackageCommandLineRow row that belongs to a table.
24 /// </summary>
25 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
26 /// <param name="table">Table this WixBundlePackageCommandLineRow row belongs to and should get its column definitions from.</param>
27 public WixBundlePackageCommandLineRow(SourceLineNumber sourceLineNumbers, Table table)
28 : base(sourceLineNumbers, table)
29 {
30 }
31
32 /// <summary>
33 /// Gets or sets the package identifier.
34 /// </summary>
35 /// <value>The package identifier.</value>
36 public string ChainPackageId
37 {
38 get { return (string)this.Fields[0].Data; }
39 set { this.Fields[0].Data = value; }
40 }
41
42 /// <summary>
43 /// Gets or sets the command-line argument for installation.
44 /// </summary>
45 /// <value>The command-line argument.</value>
46 public string InstallArgument
47 {
48 get { return (string)this.Fields[1].Data; }
49 set { this.Fields[1].Data = value; }
50 }
51
52 /// <summary>
53 /// Gets or sets the command-line argument for uninstallation.
54 /// </summary>
55 /// <value>The command-line argument.</value>
56 public string UninstallArgument
57 {
58 get { return (string)this.Fields[2].Data; }
59 set { this.Fields[2].Data = value; }
60 }
61
62 /// <summary>
63 /// Gets or sets the command-line argument for repair.
64 /// </summary>
65 /// <value>The command-line argument.</value>
66 public string RepairArgument
67 {
68 get { return (string)this.Fields[3].Data; }
69 set { this.Fields[3].Data = value; }
70 }
71
72 /// <summary>
73 /// Gets or sets the condition.
74 /// </summary>
75 /// <value>The condition.</value>
76 public string Condition
77 {
78 get { return (string)this.Fields[4].Data; }
79 set { this.Fields[4].Data = value; }
80 }
81 }
82}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePackageExitCodeRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePackageExitCodeRow.cs
deleted file mode 100644
index 2beed8da..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePackageExitCodeRow.cs
+++ /dev/null
@@ -1,53 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3using WixToolset.Data.Tuples;
4
5namespace WixToolset.Data.Rows
6{
7 /// <summary>
8 /// Specialization of a row for the ExitCode table.
9 /// </summary>
10 public class WixBundlePackageExitCodeRow : Row
11 {
12 /// <summary>
13 /// Creates a ExitCodeRow row that does not belong to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="tableDef">TableDefinition this Media row belongs to and should get its column definitions from.</param>
17 public WixBundlePackageExitCodeRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
18 base(sourceLineNumbers, tableDef)
19 {
20 }
21
22 /// <summary>
23 /// Creates a ExitCodeRow row that belongs to a table.
24 /// </summary>
25 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
26 /// <param name="table">Table this Media row belongs to and should get its column definitions from.</param>
27 public WixBundlePackageExitCodeRow(SourceLineNumber sourceLineNumbers, Table table) :
28 base(sourceLineNumbers, table)
29 {
30 }
31
32 /// <summary>
33 /// Gets or sets the foreign key identifier to the ChainPackage row.
34 /// </summary>
35 public string ChainPackageId
36 {
37 get { return (string)this.Fields[0].Data; }
38 set { this.Fields[0].Data = value; }
39 }
40
41 public int? Code
42 {
43 get { return (null == this.Fields[1].Data) ? (int?)null : (int?)this.Fields[1].Data; }
44 set { this.Fields[1].Data = value; }
45 }
46
47 public ExitCodeBehaviorType Behavior
48 {
49 get { return (ExitCodeBehaviorType)this.Fields[2].Data; }
50 set { this.Fields[2].Data = (int)value; }
51 }
52 }
53}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePackageRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePackageRow.cs
deleted file mode 100644
index 973c43b9..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePackageRow.cs
+++ /dev/null
@@ -1,228 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3using WixToolset.Data.Tuples;
4
5namespace WixToolset.Data.Rows
6{
7 /// <summary>
8 /// Specialization of a row for the WixBundlePackage table.
9 /// </summary>
10 public sealed class WixBundlePackageRow : Row
11 {
12 /// <summary>
13 /// Creates a WixBundlePackage row that does not belong to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="tableDef">TableDefinition this row belongs to and should get its column definitions from.</param>
17 public WixBundlePackageRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
18 base(sourceLineNumbers, tableDef)
19 {
20 }
21
22 /// <summary>
23 /// Creates a WixBundlePackage row that belongs to a table.
24 /// </summary>
25 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
26 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
27 public WixBundlePackageRow(SourceLineNumber sourceLineNumbers, Table table) :
28 base(sourceLineNumbers, table)
29 {
30 }
31
32 /// <summary>
33 /// Gets or sets the foreign key to the WixChainItem.
34 /// </summary>
35 public string WixChainItemId
36 {
37 get { return (string)this.Fields[0].Data; }
38 set { this.Fields[0].Data = value; }
39 }
40
41 /// <summary>
42 /// Gets or sets the item type.
43 /// </summary>
44 public WixBundlePackageType Type
45 {
46 get { return (WixBundlePackageType)this.Fields[1].Data; }
47 set { this.Fields[1].Data = (int)value; }
48 }
49
50 /// <summary>
51 /// Gets or sets the indentifier of the package's payload.
52 /// </summary>
53 public string PackagePayload
54 {
55 get { return (string)this.Fields[2].Data; }
56 set { this.Fields[2].Data = value; }
57 }
58
59 /// <summary>
60 /// Gets or sets the raw attributes of a package.
61 /// </summary>
62 public WixBundlePackageAttributes Attributes
63 {
64 get { return (WixBundlePackageAttributes)this.Fields[3].Data; }
65 set { this.Fields[3].Data = value; }
66 }
67
68 /// <summary>
69 /// Gets or sets the install condition of the package.
70 /// </summary>
71 public string InstallCondition
72 {
73 get { return (string)this.Fields[4].Data; }
74 set { this.Fields[4].Data = value; }
75 }
76
77 /// <summary>
78 /// Gets or sets the language of the package.
79 /// </summary>
80 public YesNoAlwaysType Cache
81 {
82 get { return (null == this.Fields[5].Data) ? YesNoAlwaysType.NotSet : (YesNoAlwaysType)this.Fields[5].Data; }
83 set { this.Fields[5].Data = (int)value; }
84 }
85
86 /// <summary>
87 /// Gets or sets the indentifier of the package's cache.
88 /// </summary>
89 public string CacheId
90 {
91 get { return (string)this.Fields[6].Data; }
92 set { this.Fields[6].Data = value; }
93 }
94
95 /// <summary>
96 /// Gets or sets whether the package is vital.
97 /// </summary>
98 public YesNoType Vital
99 {
100 get { return (null == this.Fields[7].Data) ? YesNoType.NotSet : (YesNoType)this.Fields[7].Data; }
101 set { this.Fields[7].Data = (int)value; }
102 }
103
104 /// <summary>
105 /// Gets or sets whether the package is per-machine.
106 /// </summary>
107 public YesNoDefaultType PerMachine
108 {
109 get { return (null == this.Fields[8].Data) ? YesNoDefaultType.NotSet : (YesNoDefaultType)this.Fields[8].Data; }
110 set { this.Fields[8].Data = (int)value; }
111 }
112
113 /// <summary>
114 /// Gets or sets the variable that points to the log for the package.
115 /// </summary>
116 public string LogPathVariable
117 {
118 get { return (string)this.Fields[9].Data; }
119 set { this.Fields[9].Data = value; }
120 }
121
122 /// <summary>
123 /// Gets or sets the variable that points to the rollback log for the package.
124 /// </summary>
125 public string RollbackLogPathVariable
126 {
127 get { return (string)this.Fields[10].Data; }
128 set { this.Fields[10].Data = value; }
129 }
130
131 /// <summary>
132 /// Gets or sets the size of the package.
133 /// </summary>
134 public long Size
135 {
136 get { return (long)this.Fields[11].Data; }
137 set { this.Fields[11].Data = value; }
138 }
139
140 /// <summary>
141 /// Gets or sets the install size of the package.
142 /// </summary>
143 public long? InstallSize
144 {
145 get { return (long?)this.Fields[12].Data; }
146 set { this.Fields[12].Data = value; }
147 }
148
149 /// <summary>
150 /// Gets or sets the version of the package.
151 /// </summary>
152 public string Version
153 {
154 get { return (string)this.Fields[13].Data; }
155 set { this.Fields[13].Data = value; }
156 }
157
158 /// <summary>
159 /// Gets or sets the language of the package.
160 /// </summary>
161 public int Language
162 {
163 get { return (int)this.Fields[14].Data; }
164 set { this.Fields[14].Data = value; }
165 }
166
167 /// <summary>
168 /// Gets or sets the display name of the package.
169 /// </summary>
170 public string DisplayName
171 {
172 get { return (string)this.Fields[15].Data; }
173 set { this.Fields[15].Data = value; }
174 }
175
176 /// <summary>
177 /// Gets or sets the description of the package.
178 /// </summary>
179 public string Description
180 {
181 get { return (string)this.Fields[16].Data; }
182 set { this.Fields[16].Data = value; }
183 }
184
185 /// <summary>
186 /// Gets or sets the rollback boundary identifier for the package.
187 /// </summary>
188 public string RollbackBoundary
189 {
190 get { return (string)this.Fields[17].Data; }
191 set { this.Fields[17].Data = value; }
192 }
193
194 /// <summary>
195 /// Gets or sets the backward rollback boundary identifier for the package.
196 /// </summary>
197 public string RollbackBoundaryBackward
198 {
199 get { return (string)this.Fields[18].Data; }
200 set { this.Fields[18].Data = value; }
201 }
202
203 /// <summary>
204 /// Gets or sets whether the package is x64.
205 /// </summary>
206 public YesNoType x64
207 {
208 get { return (null == this.Fields[19].Data) ? YesNoType.NotSet : (YesNoType)this.Fields[19].Data; }
209 set { this.Fields[19].Data = (int)value; }
210 }
211
212 /// <summary>
213 /// Gets whether the package is permanent.
214 /// </summary>
215 public bool Permanent
216 {
217 get { return 0 != (this.Attributes & WixBundlePackageAttributes.Permanent); }
218 }
219
220 /// <summary>
221 /// Gets whether the package is visible.
222 /// </summary>
223 public bool Visible
224 {
225 get { return 0 != (this.Attributes & WixBundlePackageAttributes.Visible); }
226 }
227 }
228}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePatchTargetCodeRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePatchTargetCodeRow.cs
deleted file mode 100644
index e25f4a55..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePatchTargetCodeRow.cs
+++ /dev/null
@@ -1,81 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Text;
8
9 /// <summary>
10 /// Attributes for the PatchTargetCode table.
11 /// </summary>
12 [Flags]
13 public enum WixBundlePatchTargetCodeAttributes : int
14 {
15 None = 0,
16
17 /// <summary>
18 /// The transform targets a specific ProductCode.
19 /// </summary>
20 TargetsProductCode = 1,
21
22 /// <summary>
23 /// The transform targets a specific UpgradeCode.
24 /// </summary>
25 TargetsUpgradeCode = 2,
26 }
27
28 /// <summary>
29 /// Specialization of a row for the PatchTargetCode table.
30 /// </summary>
31 public class WixBundlePatchTargetCodeRow : Row
32 {
33 /// <summary>
34 /// Creates a PatchTargetCodeRow row that does not belong to a table.
35 /// </summary>
36 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
37 /// <param name="tableDef">TableDefinition this PatchTargetCode row belongs to and should get its column definitions from.</param>
38 public WixBundlePatchTargetCodeRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
39 base(sourceLineNumbers, tableDef)
40 {
41 }
42
43 /// <summary>
44 /// Creates a PatchTargetCodeRow row that belongs to a table.
45 /// </summary>
46 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
47 /// <param name="table">Table this PatchTargetCode row belongs to and should get its column definitions from.</param>
48 public WixBundlePatchTargetCodeRow(SourceLineNumber sourceLineNumbers, Table table) :
49 base(sourceLineNumbers, table)
50 {
51 }
52
53 public string MspPackageId
54 {
55 get { return (string)this.Fields[0].Data; }
56 set { this.Fields[0].Data = value; }
57 }
58
59 public string TargetCode
60 {
61 get { return (string)this.Fields[1].Data; }
62 set { this.Fields[1].Data = value; }
63 }
64
65 public WixBundlePatchTargetCodeAttributes Attributes
66 {
67 get { return (WixBundlePatchTargetCodeAttributes)this.Fields[2].Data; }
68 set { this.Fields[2].Data = (int)value; }
69 }
70
71 public bool TargetsProductCode
72 {
73 get { return 0 != (WixBundlePatchTargetCodeAttributes.TargetsProductCode & this.Attributes); }
74 }
75
76 public bool TargetsUpgradeCode
77 {
78 get { return 0 != (WixBundlePatchTargetCodeAttributes.TargetsUpgradeCode & this.Attributes); }
79 }
80 }
81}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePayloadRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePayloadRow.cs
deleted file mode 100644
index 8aac8aa0..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundlePayloadRow.cs
+++ /dev/null
@@ -1,185 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6 using System.IO;
7
8 /// <summary>
9 /// Specialization of a row for the PayloadInfo table.
10 /// </summary>
11 public class WixBundlePayloadRow : Row
12 {
13 /// <summary>
14 /// Creates a PayloadRow row that does not belong to a table.
15 /// </summary>
16 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
17 /// <param name="tableDef">TableDefinition this Media row belongs to and should get its column definitions from.</param>
18 public WixBundlePayloadRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
19 base(sourceLineNumbers, tableDef)
20 {
21 }
22
23 /// <summary>
24 /// Creates a PayloadRow row that belongs to a table.
25 /// </summary>
26 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
27 /// <param name="table">Table this Media row belongs to and should get its column definitions from.</param>
28 public WixBundlePayloadRow(SourceLineNumber sourceLineNumbers, Table table) :
29 base(sourceLineNumbers, table)
30 {
31 }
32
33 public string Id
34 {
35 get { return (string)this.Fields[0].Data; }
36 set { this.Fields[0].Data = value; }
37 }
38
39 public string Name
40 {
41 get { return (string)this.Fields[1].Data; }
42 set { this.Fields[1].Data = value; }
43 }
44
45 public string SourceFile
46 {
47 get { return (string)this.Fields[2].Data; }
48 set { this.Fields[2].Data = value; }
49 }
50
51 public string DownloadUrl
52 {
53 get { return (string)this.Fields[3].Data; }
54 set { this.Fields[3].Data = value; }
55 }
56
57 public YesNoDefaultType Compressed
58 {
59 get { return (YesNoDefaultType)this.Fields[4].Data; }
60 set { this.Fields[4].Data = (int)value; }
61 }
62
63 public string UnresolvedSourceFile
64 {
65 get { return (string)this.Fields[5].Data; }
66 set { this.Fields[5].Data = value; }
67 }
68
69 public string DisplayName
70 {
71 get { return (string)this.Fields[6].Data; }
72 set { this.Fields[6].Data = value; }
73 }
74
75 public string Description
76 {
77 get { return (string)this.Fields[7].Data; }
78 set { this.Fields[7].Data = value; }
79 }
80
81 public bool EnableSignatureValidation
82 {
83 get { return (null != this.Fields[8].Data) && (1 == (int)this.Fields[8].Data); }
84 set { this.Fields[8].Data = value ? 1 : 0; }
85 }
86
87 public int FileSize
88 {
89 get { return (int)this.Fields[9].Data; }
90 set { this.Fields[9].Data = value; }
91 }
92
93 public string Version
94 {
95 get { return (string)this.Fields[10].Data; }
96 set { this.Fields[10].Data = value; }
97 }
98
99 public string Hash
100 {
101 get { return (string)this.Fields[11].Data; }
102 set { this.Fields[11].Data = value; }
103 }
104
105 public string PublicKey
106 {
107 get { return (string)this.Fields[12].Data; }
108 set { this.Fields[12].Data = value; }
109 }
110
111 public string Thumbprint
112 {
113 get { return (string)this.Fields[13].Data; }
114 set { this.Fields[13].Data = value; }
115 }
116
117 public string Catalog
118 {
119 get { return (string)this.Fields[14].Data; }
120 set { this.Fields[14].Data = value; }
121 }
122
123 public string Container
124 {
125 get { return (string)this.Fields[15].Data; }
126 set { this.Fields[15].Data = value; }
127 }
128
129 public string Package
130 {
131 get { return (string)this.Fields[16].Data; }
132 set { this.Fields[16].Data = value; }
133 }
134
135 public bool ContentFile
136 {
137 get { return (null != this.Fields[17].Data) && (1 == (int)this.Fields[17].Data); }
138 set { this.Fields[17].Data = value ? 1 : 0; }
139 }
140
141 public string EmbeddedId
142 {
143 get { return (string)this.Fields[18].Data; }
144 set { this.Fields[18].Data = value; }
145 }
146
147 public bool LayoutOnly
148 {
149 get { return (null != this.Fields[19].Data) && (1 == (int)this.Fields[19].Data); }
150 set { this.Fields[19].Data = value ? 1 : 0; }
151 }
152
153 public PackagingType Packaging
154 {
155 get
156 {
157 object data = this.Fields[20].Data;
158 return (null == data) ? PackagingType.Unknown : (PackagingType)data;
159 }
160
161 set
162 {
163 if (PackagingType.Unknown == value)
164 {
165 this.Fields[20].Data = null;
166 }
167 else
168 {
169 this.Fields[20].Data = (int)value;
170 }
171 }
172 }
173
174 public string ParentPackagePayload
175 {
176 get { return (string)this.Fields[21].Data; }
177 set { this.Fields[21].Data = value; }
178 }
179
180 public string FullFileName
181 {
182 get { return String.IsNullOrEmpty(this.SourceFile) ? String.Empty : Path.GetFullPath(this.SourceFile); }
183 }
184 }
185}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleRelatedPackageRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleRelatedPackageRow.cs
deleted file mode 100644
index ea9ff99e..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleRelatedPackageRow.cs
+++ /dev/null
@@ -1,87 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the RelatedPackage table.
7 /// </summary>
8 public class WixBundleRelatedPackageRow : Row
9 {
10 /// <summary>
11 /// Creates a RelatedPackageRow row that does not belong to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="tableDef">TableDefinition this Media row belongs to and should get its column definitions from.</param>
15 public WixBundleRelatedPackageRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
16 base(sourceLineNumbers, tableDef)
17 {
18 }
19
20 /// <summary>
21 /// Creates a RelatedPackageRow row that belongs to a table.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
24 /// <param name="table">Table this Media row belongs to and should get its column definitions from.</param>
25 public WixBundleRelatedPackageRow(SourceLineNumber sourceLineNumbers, Table table) :
26 base(sourceLineNumbers, table)
27 {
28 }
29
30 /// <summary>
31 /// Gets or sets the foreign key identifier to the ChainPackage row.
32 /// </summary>
33 public string ChainPackageId
34 {
35 get { return (string)this.Fields[0].Data; }
36 set { this.Fields[0].Data = value; }
37 }
38
39 public string Id
40 {
41 get { return (string)this.Fields[1].Data; }
42 set { this.Fields[1].Data = value; }
43 }
44
45 public string MinVersion
46 {
47 get { return (string)this.Fields[2].Data; }
48 set { this.Fields[2].Data = value; }
49 }
50
51 public string MaxVersion
52 {
53 get { return (string)this.Fields[3].Data; }
54 set { this.Fields[3].Data = value; }
55 }
56
57 public string Languages
58 {
59 get { return (string)this.Fields[4].Data; }
60 set { this.Fields[4].Data = value; }
61 }
62
63 public bool MinInclusive
64 {
65 get { return 1 == (int)this.Fields[5].Data; }
66 set { this.Fields[5].Data = value ? 1 : 0; }
67 }
68
69 public bool MaxInclusive
70 {
71 get { return 1 == (int)this.Fields[6].Data; }
72 set { this.Fields[6].Data = value ? 1 : 0; }
73 }
74
75 public bool LangInclusive
76 {
77 get { return 1 == (int)this.Fields[7].Data; }
78 set { this.Fields[7].Data = value ? 1 : 0; }
79 }
80
81 public bool OnlyDetect
82 {
83 get { return 1 == (int)this.Fields[8].Data; }
84 set { this.Fields[8].Data = value ? 1 : 0; }
85 }
86 }
87}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleRollbackBoundaryRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleRollbackBoundaryRow.cs
deleted file mode 100644
index d0a994c0..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleRollbackBoundaryRow.cs
+++ /dev/null
@@ -1,59 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the WixBundleRollbackBoundary table.
7 /// </summary>
8 public sealed class WixBundleRollbackBoundaryRow : Row
9 {
10 /// <summary>
11 /// Creates a WixBundleRollbackBoundary row that does not belong to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="tableDef">TableDefinition this row belongs to and should get its column definitions from.</param>
15 public WixBundleRollbackBoundaryRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
16 base(sourceLineNumbers, tableDef)
17 {
18 }
19
20 /// <summary>
21 /// Creates a RollbackBoundaryRow row that belongs to a table.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
24 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
25 public WixBundleRollbackBoundaryRow(SourceLineNumber sourceLineNumbers, Table table) :
26 base(sourceLineNumbers, table)
27 {
28 }
29
30 /// <summary>
31 /// Gets or sets the foreign key identifier to the ChainPackage row.
32 /// </summary>
33 public string ChainPackageId
34 {
35 get { return (string)this.Fields[0].Data; }
36 set { this.Fields[0].Data = value; }
37 }
38
39 /// <summary>
40 /// Gets or sets whether the package is vital.
41 /// </summary>
42 /// <value>Vitality of the package.</value>
43 public YesNoType Vital
44 {
45 get { return (null == this.Fields[1].Data) ? YesNoType.NotSet : (YesNoType)this.Fields[1].Data; }
46 set { this.Fields[1].Data = (int)value; }
47 }
48
49 /// <summary>
50 /// Gets or sets whether the rollback-boundary should be installed as an MSI transaction.
51 /// </summary>
52 /// <value>Vitality of the package.</value>
53 public YesNoType Transaction
54 {
55 get { return (null == this.Fields[2].Data) ? YesNoType.NotSet : (YesNoType)this.Fields[2].Data; }
56 set { this.Fields[2].Data = (int)value; }
57 }
58 }
59}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleRow.cs
deleted file mode 100644
index 4c96d6cc..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleRow.cs
+++ /dev/null
@@ -1,228 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6
7 /// <summary>
8 /// Bundle info for binding Bundles.
9 /// </summary>
10 public class WixBundleRow : Row
11 {
12 /// <summary>
13 /// Creates a WixBundleRow row that does not belong to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="tableDef">TableDefinition this WixBundleRow row belongs to and should get its column definitions from.</param>
17 public WixBundleRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
18 base(sourceLineNumbers, tableDef)
19 {
20 }
21
22 /// <summary>
23 /// Creates a WixBundleRow row that belongs to a table.
24 /// </summary>
25 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
26 /// <param name="table">Table this WixBundleRow row belongs to and should get its column definitions from.</param>
27 public WixBundleRow(SourceLineNumber sourceLineNumbers, Table table) :
28 base(sourceLineNumbers, table)
29 {
30 }
31
32 public string Version
33 {
34 get { return (string)this.Fields[0].Data; }
35 set { this.Fields[0].Data = value; }
36 }
37
38 public string Copyright
39 {
40 get { return (string)this.Fields[1].Data; }
41 set { this.Fields[1].Data = value; }
42 }
43
44 public string Name
45 {
46 get { return (string)this.Fields[2].Data; }
47 set { this.Fields[2].Data = value; }
48 }
49
50 public string AboutUrl
51 {
52 get { return (string)this.Fields[3].Data; }
53 set { this.Fields[3].Data = value; }
54 }
55
56 public int DisableModify
57 {
58 get { return (null == this.Fields[4].Data) ? 0 : (int)this.Fields[4].Data; }
59 set { this.Fields[4].Data = value; }
60 }
61
62 public bool DisableRemove
63 {
64 get { return (null != this.Fields[5].Data && 0 != (int)this.Fields[5].Data); }
65 set { this.Fields[5].Data = value ? 1 : 0; }
66 }
67
68 // There is no 6. It used to be DisableRepair.
69
70 public string HelpTelephone
71 {
72 get { return (string)this.Fields[7].Data; }
73 set { this.Fields[7].Data = value; }
74 }
75
76 public string HelpLink
77 {
78 get { return (string)this.Fields[8].Data; }
79 set { this.Fields[8].Data = value; }
80 }
81
82 public string Publisher
83 {
84 get { return (string)this.Fields[9].Data; }
85 set { this.Fields[9].Data = value; }
86 }
87
88 public string UpdateUrl
89 {
90 get { return (string)this.Fields[10].Data; }
91 set { this.Fields[10].Data = value; }
92 }
93
94 public YesNoDefaultType Compressed
95 {
96 get { return (null == this.Fields[11].Data) ? YesNoDefaultType.Default : (0 == (int)this.Fields[11].Data) ? YesNoDefaultType.No : YesNoDefaultType.Yes; }
97 set { this.Fields[11].Data = (int)value; }
98 }
99
100 public PackagingType DefaultPackagingType
101 {
102 get { return (YesNoDefaultType.No == this.Compressed) ? PackagingType.External : PackagingType.Embedded; }
103 }
104
105 public string LogPathPrefixExtension
106 {
107 get { return (string)this.Fields[12].Data ?? String.Empty; }
108 set { this.Fields[12].Data = value; }
109 }
110
111 public string LogPathVariable
112 {
113 get
114 {
115 string[] logVariableAndPrefixExtension = this.LogPathPrefixExtension.Split(':');
116 return logVariableAndPrefixExtension[0];
117 }
118 }
119
120 public string LogPrefix
121 {
122 get
123 {
124 string[] logVariableAndPrefixExtension = this.LogPathPrefixExtension.Split(':');
125 if (2 > logVariableAndPrefixExtension.Length)
126 {
127 return String.Empty;
128 }
129 string logPrefixAndExtension = logVariableAndPrefixExtension[1];
130 int extensionIndex = logPrefixAndExtension.LastIndexOf('.');
131 return logPrefixAndExtension.Substring(0, extensionIndex);
132 }
133 }
134
135 public string LogExtension
136 {
137 get
138 {
139 string[] logVariableAndPrefixExtension = this.LogPathPrefixExtension.Split(':');
140 if (2 > logVariableAndPrefixExtension.Length)
141 {
142 return String.Empty;
143 }
144 string logPrefixAndExtension = logVariableAndPrefixExtension[1];
145 int extensionIndex = logPrefixAndExtension.LastIndexOf('.');
146 return logPrefixAndExtension.Substring(extensionIndex + 1);
147 }
148 }
149
150 public string IconPath
151 {
152 get { return (string)this.Fields[13].Data; }
153 set { this.Fields[13].Data = value; }
154 }
155
156 public string SplashScreenBitmapPath
157 {
158 get { return (string)this.Fields[14].Data; }
159 set { this.Fields[14].Data = value; }
160 }
161
162 public string Condition
163 {
164 get { return (string)this.Fields[15].Data; }
165 set { this.Fields[15].Data = value; }
166 }
167
168 public string Tag
169 {
170 get { return (string)this.Fields[16].Data; }
171 set { this.Fields[16].Data = value; }
172 }
173
174 public Platform Platform
175 {
176 get { return (Platform)Enum.Parse(typeof(Platform), (string)this.Fields[17].Data); }
177 set { this.Fields[17].Data = value.ToString(); }
178 }
179
180 public string ParentName
181 {
182 get { return (string)this.Fields[18].Data; }
183 set { this.Fields[18].Data = value; }
184 }
185
186 public string UpgradeCode
187 {
188 get { return (string)this.Fields[19].Data; }
189 set { this.Fields[19].Data = value; }
190 }
191
192 public Guid BundleId
193 {
194 get
195 {
196 if (null == this.Fields[20].Data)
197 {
198 this.Fields[20].Data = Guid.NewGuid().ToString("B");
199 }
200
201 return new Guid((string)this.Fields[20].Data);
202 }
203
204 set { this.Fields[20].Data = value.ToString(); }
205 }
206
207 public string ProviderKey
208 {
209 get
210 {
211 if (null == this.Fields[21].Data)
212 {
213 this.Fields[21].Data = this.BundleId.ToString("B");
214 }
215
216 return (string)this.Fields[21].Data;
217 }
218
219 set { this.Fields[21].Data = value; }
220 }
221
222 public bool PerMachine
223 {
224 get { return (null != this.Fields[22].Data && 0 != (int)this.Fields[22].Data); }
225 set { this.Fields[22].Data = value ? 1 : 0; }
226 }
227 }
228}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleSlipstreamMspRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleSlipstreamMspRow.cs
deleted file mode 100644
index d11b23ef..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleSlipstreamMspRow.cs
+++ /dev/null
@@ -1,48 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the SlipstreamMsp table.
7 /// </summary>
8 public class WixBundleSlipstreamMspRow : Row
9 {
10 /// <summary>
11 /// Creates a SlipstreamMspRow row that does not belong to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="tableDef">TableDefinition this Media row belongs to and should get its column definitions from.</param>
15 public WixBundleSlipstreamMspRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
16 base(sourceLineNumbers, tableDef)
17 {
18 }
19
20 /// <summary>
21 /// Creates a SlipstreamMspRow row that belongs to a table.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
24 /// <param name="table">Table this Media row belongs to and should get its column definitions from.</param>
25 public WixBundleSlipstreamMspRow(SourceLineNumber sourceLineNumbers, Table table) :
26 base(sourceLineNumbers, table)
27 {
28 }
29
30 /// <summary>
31 /// Gets or sets the foreign key identifier to the ChainPackage row.
32 /// </summary>
33 public string ChainPackageId
34 {
35 get { return (string)this.Fields[0].Data; }
36 set { this.Fields[0].Data = value; }
37 }
38
39 /// <summary>
40 /// Gets or sets the foreign key identifier to the ChainPackage row for the MSP package.
41 /// </summary>
42 public string MspPackageId
43 {
44 get { return (string)this.Fields[1].Data; }
45 set { this.Fields[1].Data = value; }
46 }
47 }
48}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleUpdateRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleUpdateRow.cs
deleted file mode 100644
index e0150685..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleUpdateRow.cs
+++ /dev/null
@@ -1,38 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6
7 /// <summary>
8 /// Bundle update info for binding Bundles.
9 /// </summary>
10 public class WixBundleUpdateRow : Row
11 {
12 /// <summary>
13 /// Creates a WixBundleUpdateRow row that does not belong to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="tableDef">TableDefinition this WixBundleUpdateRow row belongs to and should get its column definitions from.</param>
17 public WixBundleUpdateRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
18 base(sourceLineNumbers, tableDef)
19 {
20 }
21
22 /// <summary>
23 /// Creates a WixBundleUpdateRow row that belongs to a table.
24 /// </summary>
25 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
26 /// <param name="table">Table this WixBundleUpdateRow row belongs to and should get its column definitions from.</param>
27 public WixBundleUpdateRow(SourceLineNumber sourceLineNumbers, Table table) :
28 base(sourceLineNumbers, table)
29 {
30 }
31
32 public string Location
33 {
34 get { return (string)this.Fields[0].Data; }
35 set { this.Fields[0].Data = value; }
36 }
37 }
38}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleVariableRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleVariableRow.cs
deleted file mode 100644
index e7ff1a4d..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixBundleVariableRow.cs
+++ /dev/null
@@ -1,80 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the Variable table.
7 /// </summary>
8 public sealed class WixBundleVariableRow : Row
9 {
10 /// <summary>
11 /// Creates a Variable row that does not belong to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="tableDef">TableDefinition this Media row belongs to and should get its column definitions from.</param>
15 public WixBundleVariableRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
16 base(sourceLineNumbers, tableDef)
17 {
18 }
19
20 /// <summary>
21 /// Creates a Variable row that belongs to a table.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
24 /// <param name="table">Table this Media row belongs to and should get its column definitions from.</param>
25 public WixBundleVariableRow(SourceLineNumber sourceLineNumbers, Table table)
26 : base(sourceLineNumbers, table)
27 {
28 }
29
30 /// <summary>
31 /// Gets or sets the variable identifier.
32 /// </summary>
33 /// <value>The variable identifier.</value>
34 public string Id
35 {
36 get { return (string)this.Fields[0].Data; }
37 set { this.Fields[0].Data = value; }
38 }
39
40 /// <summary>
41 /// Gets or sets the variable's value.
42 /// </summary>
43 /// <value>The variable's value.</value>
44 public string Value
45 {
46 get { return (string)this.Fields[1].Data; }
47 set { this.Fields[1].Data = value; }
48 }
49
50 /// <summary>
51 /// Gets or sets the variable's type.
52 /// </summary>
53 /// <value>The variable's type.</value>
54 public string Type
55 {
56 get { return (string)this.Fields[2].Data; }
57 set { this.Fields[2].Data = value; }
58 }
59
60 /// <summary>
61 /// Gets or sets whether this variable is hidden.
62 /// </summary>
63 /// <value>Whether this variable is hidden.</value>
64 public bool Hidden
65 {
66 get { return (null == this.Fields[3].Data || 0 == ((int)this.Fields[3].Data)) ? false : true; }
67 set { this.Fields[3].Data = value ? 1 : 0; }
68 }
69
70 /// <summary>
71 /// Gets or sets whether this variable is persisted.
72 /// </summary>
73 /// <value>Whether this variable is persisted.</value>
74 public bool Persisted
75 {
76 get { return (null == this.Fields[4].Data || 0 == ((int)this.Fields[4].Data)) ? false : true; }
77 set { this.Fields[4].Data = value ? 1 : 0; }
78 }
79 }
80}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixChainItemRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixChainItemRow.cs
deleted file mode 100644
index 12538d71..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixChainItemRow.cs
+++ /dev/null
@@ -1,39 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the WixChainItem table.
7 /// </summary>
8 public sealed class WixChainItemRow : Row
9 {
10 /// <summary>
11 /// Creates a WixChainItem row that does not belong to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="tableDef">TableDefinition this ChainItem row belongs to and should get its column definitions from.</param>
15 public WixChainItemRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
16 base(sourceLineNumbers, tableDef)
17 {
18 }
19
20 /// <summary>
21 /// Creates a WixChainItem row that belongs to a table.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
24 /// <param name="table">Table this ChainItem row belongs to and should get its column definitions from.</param>
25 public WixChainItemRow(SourceLineNumber sourceLineNumbers, Table table)
26 : base(sourceLineNumbers, table)
27 {
28 }
29
30 /// <summary>
31 /// Gets or sets the WixChainItem identifier.
32 /// </summary>
33 public string Id
34 {
35 get { return (string)this.Fields[0].Data; }
36 set { this.Fields[0].Data = value; }
37 }
38 }
39}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixChainRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixChainRow.cs
deleted file mode 100644
index 54fff72c..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixChainRow.cs
+++ /dev/null
@@ -1,65 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3using WixToolset.Data.Tuples;
4
5namespace WixToolset.Data.Rows
6{
7 /// <summary>
8 /// Specialization of a row for the WixChain table.
9 /// </summary>
10 public sealed class WixChainRow : Row
11 {
12 /// <summary>
13 /// Creates a WixChain row that does not belong to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="tableDef">TableDefinition this row belongs to and should get its column definitions from.</param>
17 public WixChainRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
18 base(sourceLineNumbers, tableDef)
19 {
20 }
21
22 /// <summary>
23 /// Creates a WixChainRow row that belongs to a table.
24 /// </summary>
25 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
26 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
27 public WixChainRow(SourceLineNumber sourceLineNumbers, Table table) :
28 base(sourceLineNumbers, table)
29 {
30 }
31
32 /// <summary>
33 /// Gets or sets the raw chain attributes.
34 /// </summary>
35 public WixChainAttributes Attributes
36 {
37 get { return (WixChainAttributes)this.Fields[0].Data; }
38 set { this.Fields[0].Data = value; }
39 }
40
41 /// <summary>
42 /// Gets the disable rollback state of a chain.
43 /// </summary>
44 public bool DisableRollback
45 {
46 get { return 0 != (this.Attributes & WixChainAttributes.DisableRollback); }
47 }
48
49 /// <summary>
50 /// Gets disable system restore state of a chain.
51 /// </summary>
52 public bool DisableSystemRestore
53 {
54 get { return 0 != (this.Attributes & WixChainAttributes.DisableSystemRestore); }
55 }
56
57 /// <summary>
58 /// Gets parallel cache of a chain.
59 /// </summary>
60 public bool ParallelCache
61 {
62 get { return 0 != (this.Attributes & WixChainAttributes.ParallelCache); }
63 }
64 }
65}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixComplexReferenceRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixComplexReferenceRow.cs
deleted file mode 100644
index 40ca4592..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixComplexReferenceRow.cs
+++ /dev/null
@@ -1,204 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6 using System.Diagnostics;
7 using System.Diagnostics.CodeAnalysis;
8 using System.Xml;
9
10 /// <summary>
11 /// Specialization of a row for the WixComplexReference table.
12 /// </summary>
13 public sealed class WixComplexReferenceRow : Row, IComparable
14 {
15 /// <summary>
16 /// Creates a WixComplexReferenceRow row that belongs to a table.
17 /// </summary>
18 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
19 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
20 public WixComplexReferenceRow(SourceLineNumber sourceLineNumbers, Table table)
21 : base(sourceLineNumbers, table)
22 {
23 }
24
25 /// <summary>
26 /// Gets the parent type of the complex reference.
27 /// </summary>
28 /// <value>Parent type of the complex reference.</value>
29 public ComplexReferenceParentType ParentType
30 {
31 get { return (ComplexReferenceParentType)Enum.ToObject(typeof(ComplexReferenceParentType), (int)this.Fields[1].Data); }
32 set { this.Fields[1].Data = (int)value; }
33 }
34
35 /// <summary>
36 /// Gets or sets the parent identifier of the complex reference.
37 /// </summary>
38 /// <value>Parent identifier of the complex reference.</value>
39 public string ParentId
40 {
41 get { return (string)this.Fields[0].Data; }
42 set { this.Fields[0].Data = value; }
43 }
44
45 /// <summary>
46 /// Gets the parent language of the complex reference.
47 /// </summary>
48 /// <value>Parent language of the complex reference.</value>
49 public string ParentLanguage
50 {
51 get { return (string)this.Fields[2].Data; }
52 set { this.Fields[2].Data = value; }
53 }
54
55 /// <summary>
56 /// Gets the child type of the complex reference.
57 /// </summary>
58 /// <value>Child type of the complex reference.</value>
59 public ComplexReferenceChildType ChildType
60 {
61 get { return (ComplexReferenceChildType)Enum.ToObject(typeof(ComplexReferenceChildType), (int)this.Fields[4].Data); }
62 set { this.Fields[4].Data = (int)value; }
63 }
64
65 /// <summary>
66 /// Gets the child identifier of the complex reference.
67 /// </summary>
68 /// <value>Child identifier of the complex reference.</value>
69 public string ChildId
70 {
71 get { return (string)this.Fields[3].Data; }
72 set { this.Fields[3].Data = value; }
73 }
74
75 /// <summary>
76 /// Gets if this is the primary complex reference.
77 /// </summary>
78 /// <value>true if primary complex reference.</value>
79 public bool IsPrimary
80 {
81 get
82 {
83 return (0x1 == ((int)this.Fields[5].Data & 0x1));
84 }
85
86 set
87 {
88 if (null == this.Fields[5].Data)
89 {
90 this.Fields[5].Data = 0;
91 }
92
93 if (value)
94 {
95 this.Fields[5].Data = (int)this.Fields[5].Data | 0x1;
96 }
97 else
98 {
99 this.Fields[5].Data = (int)this.Fields[5].Data & ~0x1;
100 }
101 }
102 }
103
104 /// <summary>
105 /// Determines if two complex references are equivalent.
106 /// </summary>
107 /// <param name="obj">Complex reference to compare.</param>
108 /// <returns>True if complex references are equivalent.</returns>
109 public override bool Equals(object obj)
110 {
111 return 0 == this.CompareTo(obj);
112 }
113
114 /// <summary>
115 /// Gets the hash code for the complex reference.
116 /// </summary>
117 /// <returns>Hash code for the complex reference.</returns>
118 public override int GetHashCode()
119 {
120 return this.ChildType.GetHashCode() ^ this.ChildId.GetHashCode() ^ this.ParentType.GetHashCode() ^ this.ParentLanguage.GetHashCode() ^ this.ParentId.GetHashCode() ^ this.IsPrimary.GetHashCode();
121 }
122
123 /// <summary>
124 /// Compares two complex references.
125 /// </summary>
126 /// <param name="obj">Complex reference to compare to.</param>
127 /// <returns>Zero if the objects are equivalent, negative number if the provided object is less, positive if greater.</returns>
128 public int CompareTo(object obj)
129 {
130 int comparison = this.CompareToWithoutConsideringPrimary(obj);
131 if (0 == comparison)
132 {
133 comparison = ((WixComplexReferenceRow)obj).IsPrimary.CompareTo(this.IsPrimary); // Note: the order of these is purposely switched to ensure that "Yes" is lower than "No" and "NotSet"
134 }
135 return comparison;
136 }
137
138 /// <summary>
139 /// Compares two complex references without considering the primary bit.
140 /// </summary>
141 /// <param name="obj">Complex reference to compare to.</param>
142 /// <returns>Zero if the objects are equivalent, negative number if the provided object is less, positive if greater.</returns>
143 [SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "System.ArgumentException.#ctor(System.String,System.String)")]
144 public int CompareToWithoutConsideringPrimary(object obj)
145 {
146 var other = obj as WixComplexReferenceRow ?? throw new ArgumentNullException(nameof(obj));
147
148 int comparison = this.ChildType - other.ChildType;
149 if (0 == comparison)
150 {
151 comparison = String.Compare(this.ChildId, other.ChildId, StringComparison.Ordinal);
152 if (0 == comparison)
153 {
154 comparison = this.ParentType - other.ParentType;
155 if (0 == comparison)
156 {
157 string thisParentLanguage = null == this.ParentLanguage ? String.Empty : this.ParentLanguage;
158 string otherParentLanguage = null == other.ParentLanguage ? String.Empty : other.ParentLanguage;
159 comparison = String.Compare(thisParentLanguage, otherParentLanguage, StringComparison.Ordinal);
160 if (0 == comparison)
161 {
162 comparison = String.Compare(this.ParentId, other.ParentId, StringComparison.Ordinal);
163 }
164 }
165 }
166 }
167
168 return comparison;
169 }
170
171 /// <summary>
172 /// Creates a shallow copy of the ComplexReference.
173 /// </summary>
174 /// <returns>A shallow copy of the ComplexReference.</returns>
175 public WixComplexReferenceRow Clone()
176 {
177 WixComplexReferenceRow wixComplexReferenceRow = new WixComplexReferenceRow(this.SourceLineNumbers, this.Table);
178 wixComplexReferenceRow.ParentType = this.ParentType;
179 wixComplexReferenceRow.ParentId = this.ParentId;
180 wixComplexReferenceRow.ParentLanguage = this.ParentLanguage;
181 wixComplexReferenceRow.ChildType = this.ChildType;
182 wixComplexReferenceRow.ChildId = this.ChildId;
183 wixComplexReferenceRow.IsPrimary = this.IsPrimary;
184
185 return wixComplexReferenceRow;
186 }
187
188 /// <summary>
189 /// Changes all of the parent references to point to the passed in parent reference.
190 /// </summary>
191 /// <param name="parent">New parent complex reference.</param>
192 public void Reparent(WixComplexReferenceRow parent)
193 {
194 this.ParentId = parent.ParentId;
195 this.ParentLanguage = parent.ParentLanguage;
196 this.ParentType = parent.ParentType;
197
198 if (!this.IsPrimary)
199 {
200 this.IsPrimary = parent.IsPrimary;
201 }
202 }
203 }
204}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixDeltaPatchFileRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixDeltaPatchFileRow.cs
deleted file mode 100644
index 000779d9..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixDeltaPatchFileRow.cs
+++ /dev/null
@@ -1,142 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the WixDeltaPatchFile table.
7 /// </summary>
8 public sealed class WixDeltaPatchFileRow : Row
9 {
10 /// <summary>
11 /// Creates a WixDeltaPatchFile row that does not belong to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="tableDef">TableDefinition this Media row belongs to and should get its column definitions from.</param>
15 public WixDeltaPatchFileRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
16 base(sourceLineNumbers, tableDef)
17 {
18 }
19
20 /// <summary>
21 /// Creates a WixDeltaPatchFile row that belongs to a table.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
24 /// <param name="table">Table this File row belongs to and should get its column definitions from.</param>
25 public WixDeltaPatchFileRow(SourceLineNumber sourceLineNumbers, Table table) :
26 base(sourceLineNumbers, table)
27 {
28 }
29
30 /// <summary>
31 /// Gets or sets the primary key of the file row.
32 /// </summary>
33 /// <value>Primary key of the file row.</value>
34 public string File
35 {
36 get { return (string)this.Fields[0].Data; }
37 set { this.Fields[0].Data = value; }
38 }
39
40 /// <summary>
41 /// Gets or sets the delta patch retain-length list for the file.
42 /// </summary>
43 /// <value>RetainLength list for the file.</value>
44 public string RetainLengths
45 {
46 get { return (string)this.Fields[1].Data; }
47 set { this.Fields[1].Data = value; }
48 }
49
50 /// <summary>
51 /// Gets or sets the previous delta patch retain-length list for the file.
52 /// </summary>
53 /// <value>Previous RetainLength list for the file.</value>
54 public string PreviousRetainLengths
55 {
56 get { return this.Fields[1].PreviousData; }
57 set { this.Fields[1].PreviousData = value; }
58 }
59
60 /// <summary>
61 /// Gets or sets the delta patch ignore-offset list for the file.
62 /// </summary>
63 /// <value>IgnoreOffset list for the file.</value>
64 public string IgnoreOffsets
65 {
66 get { return (string)this.Fields[2].Data; }
67 set { this.Fields[2].Data = value; }
68 }
69
70 /// <summary>
71 /// Gets or sets the previous delta patch ignore-offset list for the file.
72 /// </summary>
73 /// <value>Previous IgnoreOffset list for the file.</value>
74 public string PreviousIgnoreOffsets
75 {
76 get { return this.Fields[2].PreviousData; }
77 set { this.Fields[2].PreviousData = value; }
78 }
79
80 /// <summary>
81 /// Gets or sets the delta patch ignore-length list for the file.
82 /// </summary>
83 /// <value>IgnoreLength list for the file.</value>
84 public string IgnoreLengths
85 {
86 get { return (string)this.Fields[3].Data; }
87 set { this.Fields[3].Data = value; }
88 }
89
90 /// <summary>
91 /// Gets or sets the previous delta patch ignore-length list for the file.
92 /// </summary>
93 /// <value>Previous IgnoreLength list for the file.</value>
94 public string PreviousIgnoreLengths
95 {
96 get { return this.Fields[3].PreviousData; }
97 set { this.Fields[3].PreviousData = value; }
98 }
99
100 /// <summary>
101 /// Gets or sets the delta patch retain-offset list for the file.
102 /// </summary>
103 /// <value>RetainOffset list for the file.</value>
104 public string RetainOffsets
105 {
106 get { return (string)this.Fields[4].Data; }
107 set { this.Fields[4].Data = value; }
108 }
109
110 /// <summary>
111 /// Gets or sets the previous delta patch retain-offset list for the file.
112 /// </summary>
113 /// <value>PreviousRetainOffset list for the file.</value>
114 public string PreviousRetainOffsets
115 {
116 get { return this.Fields[4].PreviousData; }
117 set { this.Fields[4].PreviousData = value; }
118 }
119
120 /// <summary>
121 /// Gets or sets the symbol paths for the file.
122 /// </summary>
123 /// <value>SymbolPath list for the file.</value>
124 /// <remarks>This is set during binding.</remarks>
125 public string Symbols
126 {
127 get { return (string)this.Fields[5].Data; }
128 set { this.Fields[5].Data = value; }
129 }
130
131 /// <summary>
132 /// Gets or sets the previous symbol paths for the file.
133 /// </summary>
134 /// <value>PreviousSymbolPath list for the file.</value>
135 /// <remarks>This is set during binding.</remarks>
136 public string PreviousSymbols
137 {
138 get { return (string)this.Fields[5].PreviousData; }
139 set { this.Fields[5].PreviousData = value; }
140 }
141 }
142}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixDeltaPatchSymbolPathsRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixDeltaPatchSymbolPathsRow.cs
deleted file mode 100644
index 3be5a56d..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixDeltaPatchSymbolPathsRow.cs
+++ /dev/null
@@ -1,60 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using WixToolset.Data.Tuples;
6
7 /// <summary>
8 /// Specialization of a row for the WixDeltaPatchSymbolPaths table.
9 /// </summary>
10 public sealed class WixDeltaPatchSymbolPathsRow : Row
11 {
12 /// <summary>
13 /// Creates a WixDeltaPatchSymbolPaths row that does not belong to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="tableDef">TableDefinition this row belongs to and should get its column definitions from.</param>
17 public WixDeltaPatchSymbolPathsRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
18 base(sourceLineNumbers, tableDef)
19 {
20 }
21
22 /// <summary>
23 /// Creates a WixDeltaPatchSymbolPaths row that belongs to a table.
24 /// </summary>
25 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
26 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
27 public WixDeltaPatchSymbolPathsRow(SourceLineNumber sourceLineNumbers, Table table) :
28 base(sourceLineNumbers, table)
29 {
30 }
31
32 /// <summary>
33 /// Gets or sets the identifier the symbol paths apply to.
34 /// </summary>
35 /// <value>RetainLength list for the file.</value>
36 public string Id
37 {
38 get { return (string)this.Fields[0].Data; }
39 set { this.Fields[0].Data = value; }
40 }
41
42 /// <summary>
43 /// Gets or sets the type of the identifier.
44 /// </summary>
45 public SymbolPathType Type
46 {
47 get { return (SymbolPathType)this.Fields[1].AsInteger(); }
48 set { this.Fields[1].Data = value; }
49 }
50
51 /// <summary>
52 /// Gets or sets the delta patch symbol paths.
53 /// </summary>
54 public string SymbolPaths
55 {
56 get { return (string)this.Fields[2].Data; }
57 set { this.Fields[2].Data = value; }
58 }
59 }
60}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixFileRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixFileRow.cs
deleted file mode 100644
index c006355a..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixFileRow.cs
+++ /dev/null
@@ -1,163 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3using WixToolset.Data.Tuples;
4
5namespace WixToolset.Data.Rows
6{
7 /// <summary>
8 /// Specialization of a row for the WixFile table.
9 /// </summary>
10 public sealed class WixFileRow : Row
11 {
12 /// <summary>
13 /// Creates a WixFile row that does not belong to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="tableDef">TableDefinition this row belongs to and should get its column definitions from.</param>
17 public WixFileRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
18 base(sourceLineNumbers, tableDef)
19 {
20 }
21
22 /// <summary>
23 /// Creates a WixFile row that belongs to a table.
24 /// </summary>
25 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
26 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
27 public WixFileRow(SourceLineNumber sourceLineNumbers, Table table) :
28 base(sourceLineNumbers, table)
29 {
30 }
31
32 /// <summary>
33 /// Gets or sets the primary key of the file row.
34 /// </summary>
35 /// <value>Primary key of the file row.</value>
36 public string File
37 {
38 get { return (string)this.Fields[0].Data; }
39 set { this.Fields[0].Data = value; }
40 }
41
42 /// <summary>
43 /// Gets or sets the assembly type of the file row.
44 /// </summary>
45 /// <value>Assembly type of the file row.</value>
46 public FileAssemblyType AssemblyType
47 {
48 get { return (null == this.Fields[1]) ? FileAssemblyType.NotAnAssembly : (FileAssemblyType)this.Fields[1].AsInteger(); }
49 set { this.Fields[1].Data = (int)value; }
50 }
51
52 /// <summary>
53 /// Gets or sets the identifier for the assembly manifest.
54 /// </summary>
55 /// <value>Identifier for the assembly manifest.</value>
56 public string AssemblyManifest
57 {
58 get { return (string)this.Fields[2].Data; }
59 set { this.Fields[2].Data = value; }
60 }
61
62 /// <summary>
63 /// Gets or sets the application for the assembly.
64 /// </summary>
65 /// <value>Application for the assembly.</value>
66 public string AssemblyApplication
67 {
68 get { return (string)this.Fields[3].Data; }
69 set { this.Fields[3].Data = value; }
70 }
71
72 /// <summary>
73 /// Gets or sets the directory of the file.
74 /// </summary>
75 /// <value>Directory of the file.</value>
76 public string Directory
77 {
78 get { return (string)this.Fields[4].Data; }
79 set { this.Fields[4].Data = value; }
80 }
81
82 /// <summary>
83 /// Gets or sets the disk id for this file.
84 /// </summary>
85 /// <value>Disk id for the file.</value>
86 public int DiskId
87 {
88 get { return (int)this.Fields[5].Data; }
89 set { this.Fields[5].Data = value; }
90 }
91
92 /// <summary>
93 /// Gets or sets the source location to the file.
94 /// </summary>
95 /// <value>Source location to the file.</value>
96 public string Source
97 {
98 get { return (string)this.Fields[6].Data; }
99 set { this.Fields[6].Data = value; }
100 }
101
102 /// <summary>
103 /// Gets or sets the source location to the file.
104 /// </summary>
105 /// <value>Source location to the file.</value>
106 public string PreviousSource
107 {
108 get { return (string)this.Fields[6].PreviousData; }
109 set { this.Fields[6].PreviousData = value; }
110 }
111
112 /// <summary>
113 /// Gets or sets the architecture the file executes on.
114 /// </summary>
115 /// <value>Architecture the file executes on.</value>
116 public string ProcessorArchitecture
117 {
118 get { return (string)this.Fields[7].Data; }
119 set { this.Fields[7].Data = value; }
120 }
121
122 /// <summary>
123 /// Gets or sets the patch group of a patch-added file.
124 /// </summary>
125 /// <value>The patch group of a patch-added file.</value>
126 public int PatchGroup
127 {
128 get { return (null == this.Fields[8].Data) ? 0 : (int)this.Fields[8].Data; }
129 set { this.Fields[8].Data = value; }
130 }
131
132 /// <summary>
133 /// Gets or sets the attributes on a file.
134 /// </summary>
135 /// <value>Attributes on a file.</value>
136 public int Attributes
137 {
138 get { return (int)this.Fields[9].Data; }
139 set { this.Fields[9].Data = value; }
140 }
141
142 /// <summary>
143 /// Gets or sets the patching attributes to the file.
144 /// </summary>
145 /// <value>Patching attributes of the file.</value>
146 public PatchAttributeType PatchAttributes
147 {
148 get { return (PatchAttributeType)this.Fields[10].AsInteger(); }
149 set { this.Fields[10].Data = (int)value; }
150 }
151
152 /// <summary>
153 /// Gets or sets the path to the delta patch header.
154 /// </summary>
155 /// <value>Patch header path.</value>
156 /// <remarks>Set by the binder only when doing delta patching.</remarks>
157 public string DeltaPatchHeaderSource
158 {
159 get { return (string)this.Fields[11].Data; }
160 set { this.Fields[11].Data = value; }
161 }
162 }
163}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixGroupRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixGroupRow.cs
deleted file mode 100644
index d36338d1..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixGroupRow.cs
+++ /dev/null
@@ -1,62 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6
7 /// <summary>
8 /// Specialization of a row for the WixGroup table.
9 /// </summary>
10 public sealed class WixGroupRow : Row
11 {
12 /// <summary>
13 /// Creates a WixGroupRow row that belongs to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
17 public WixGroupRow(SourceLineNumber sourceLineNumbers, Table table)
18 : base(sourceLineNumbers, table)
19 {
20 }
21
22 /// <summary>
23 /// Gets or sets the parent identifier of the complex reference.
24 /// </summary>
25 /// <value>Parent identifier of the complex reference.</value>
26 public string ParentId
27 {
28 get { return (string)this.Fields[0].Data; }
29 set { this.Fields[0].Data = value; }
30 }
31
32 /// <summary>
33 /// Gets the parent type of the complex reference.
34 /// </summary>
35 /// <value>Parent type of the complex reference.</value>
36 public ComplexReferenceParentType ParentType
37 {
38 get { return (ComplexReferenceParentType)Enum.Parse(typeof(ComplexReferenceParentType), (string)this.Fields[1].Data); }
39 set { this.Fields[1].Data = value.ToString(); }
40 }
41
42 /// <summary>
43 /// Gets the child identifier of the complex reference.
44 /// </summary>
45 /// <value>Child identifier of the complex reference.</value>
46 public string ChildId
47 {
48 get { return (string)this.Fields[2].Data; }
49 set { this.Fields[2].Data = value; }
50 }
51
52 /// <summary>
53 /// Gets the child type of the complex reference.
54 /// </summary>
55 /// <value>Child type of the complex reference.</value>
56 public ComplexReferenceChildType ChildType
57 {
58 get { return (ComplexReferenceChildType)Enum.Parse(typeof(ComplexReferenceChildType), (string)this.Fields[3].Data); }
59 set { this.Fields[3].Data = value.ToString(); }
60 }
61 }
62}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixMediaRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixMediaRow.cs
deleted file mode 100644
index c1b3e155..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixMediaRow.cs
+++ /dev/null
@@ -1,60 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the WixMedia table.
7 /// </summary>
8 public sealed class WixMediaRow : Row
9 {
10 /// <summary>
11 /// Creates a WixMedia row that does not belong to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="tableDef">TableDefinition this Media row belongs to and should get its column definitions from.</param>
15 public WixMediaRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
16 base(sourceLineNumbers, tableDef)
17 {
18 }
19
20 /// <summary>
21 /// Creates a WixMedia row that belongs to a table.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
24 /// <param name="table">Table this Media row belongs to and should get its column definitions from.</param>
25 public WixMediaRow(SourceLineNumber sourceLineNumbers, Table table) :
26 base(sourceLineNumbers, table)
27 {
28 }
29
30 /// <summary>
31 /// Gets or sets the disk id for this media.
32 /// </summary>
33 /// <value>Disk id for the media.</value>
34 public int DiskId
35 {
36 get { return (int)this.Fields[0].Data; }
37 set { this.Fields[0].Data = value; }
38 }
39
40 /// <summary>
41 /// Gets or sets the compression level for this media row.
42 /// </summary>
43 /// <value>Compression level.</value>
44 public CompressionLevel? CompressionLevel
45 {
46 get { return (CompressionLevel?)this.Fields[1].AsNullableInteger(); }
47 set { this.Fields[1].Data = value; }
48 }
49
50 /// <summary>
51 /// Gets or sets the layout location for this media row.
52 /// </summary>
53 /// <value>Layout location to the root of the media.</value>
54 public string Layout
55 {
56 get { return (string)this.Fields[2].Data; }
57 set { this.Fields[2].Data = value; }
58 }
59 }
60}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixMediaTemplateRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixMediaTemplateRow.cs
deleted file mode 100644
index 27c5ccce..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixMediaTemplateRow.cs
+++ /dev/null
@@ -1,81 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 /// <summary>
6 /// Specialization of a row for the MediaTemplate table.
7 /// </summary>
8 public sealed class WixMediaTemplateRow : Row
9 {
10 /// <summary>
11 /// Creates a MediaTemplate row that belongs to a table.
12 /// </summary>
13 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
14 /// <param name="table">Table this MediaTeplate row belongs to and should get its column definitions from.</param>
15 public WixMediaTemplateRow(SourceLineNumber sourceLineNumbers, Table table)
16 : base(sourceLineNumbers, table)
17 {
18 }
19
20 /// <summary>
21 /// Gets or sets the cabinet template name for this media template row.
22 /// </summary>
23 /// <value>Cabinet name.</value>
24 public string CabinetTemplate
25 {
26 get { return (string)this.Fields[0].Data; }
27 set { this.Fields[0].Data = value; }
28 }
29
30 /// <summary>
31 /// Gets or sets the compression level for this media template row.
32 /// </summary>
33 /// <value>Compression level.</value>
34 public CompressionLevel? CompressionLevel
35 {
36 get { return (CompressionLevel?)this.Fields[1].AsNullableInteger(); }
37 set { this.Fields[1].Data = value; }
38 }
39
40 /// <summary>
41 /// Gets or sets the disk prompt for this media template row.
42 /// </summary>
43 /// <value>Disk prompt.</value>
44 public string DiskPrompt
45 {
46 get { return (string)this.Fields[2].Data; }
47 set { this.Fields[2].Data = value; }
48 }
49
50
51 /// <summary>
52 /// Gets or sets the volume label for this media template row.
53 /// </summary>
54 /// <value>Volume label.</value>
55 public string VolumeLabel
56 {
57 get { return (string)this.Fields[3].Data; }
58 set { this.Fields[3].Data = value; }
59 }
60
61 /// <summary>
62 /// Gets or sets the maximum uncompressed media size for this media template row.
63 /// </summary>
64 /// <value>Disk id.</value>
65 public int MaximumUncompressedMediaSize
66 {
67 get { return (int)this.Fields[4].Data; }
68 set { this.Fields[4].Data = value; }
69 }
70
71 /// <summary>
72 /// Gets or sets the Maximum Cabinet Size For Large File Splitting for this media template row.
73 /// </summary>
74 /// <value>Disk id.</value>
75 public int MaximumCabinetSizeForLargeFileSplitting
76 {
77 get { return (int)this.Fields[5].Data; }
78 set { this.Fields[5].Data = value; }
79 }
80 }
81}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixMergeRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixMergeRow.cs
deleted file mode 100644
index 54f2125c..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixMergeRow.cs
+++ /dev/null
@@ -1,149 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6 using System.Globalization;
7 using System.Text;
8 using System.Xml;
9
10 /// <summary>
11 /// Specialization of a row for tracking merge statements.
12 /// </summary>
13 public sealed class WixMergeRow : Row
14 {
15 /// <summary>
16 /// Creates a Merge row that does not belong to a table.
17 /// </summary>
18 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
19 /// <param name="tableDef">TableDefinition this Merge row belongs to and should get its column definitions from.</param>
20 public WixMergeRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
21 base(sourceLineNumbers, tableDef)
22 {
23 }
24
25 /// <summary>Creates a Merge row that belongs to a table.</summary>
26 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
27 /// <param name="table">Table this Merge row belongs to and should get its column definitions from.</param>
28 public WixMergeRow(SourceLineNumber sourceLineNumbers, Table table) :
29 base(sourceLineNumbers, table)
30 {
31 }
32
33 /// <summary>
34 /// Gets and sets the id for a merge row.
35 /// </summary>
36 /// <value>Id for the row.</value>
37 public string Id
38 {
39 get { return (string)this.Fields[0].Data; }
40 set { this.Fields[0].Data = value; }
41 }
42
43 /// <summary>
44 /// Gets and sets the language for a merge row.
45 /// </summary>
46 /// <value>Language for the row.</value>
47 public string Language
48 {
49 get { return (string)this.Fields[1].Data; }
50 set { this.Fields[1].Data = value; }
51 }
52
53 /// <summary>
54 /// Gets and sets the directory for a merge row.
55 /// </summary>
56 /// <value>Direcotory for the row.</value>
57 public string Directory
58 {
59 get { return (string)this.Fields[2].Data; }
60 set { this.Fields[2].Data = value; }
61 }
62
63 /// <summary>
64 /// Gets and sets the path to the merge module for a merge row.
65 /// </summary>
66 /// <value>Source path for the row.</value>
67 public string SourceFile
68 {
69 get { return (string)this.Fields[3].Data; }
70 set { this.Fields[3].Data = value; }
71 }
72
73 /// <summary>
74 /// Gets and sets the disk id the merge module should be placed on for a merge row.
75 /// </summary>
76 /// <value>Disk identifier for row.</value>
77 public int DiskId
78 {
79 get { return (int)this.Fields[4].Data; }
80 set { this.Fields[4].Data = value; }
81 }
82
83 /// <summary>
84 /// Gets and sets the compression value for a merge row.
85 /// </summary>
86 /// <value>Compression for a merge row.</value>
87 public YesNoType FileCompression
88 {
89 get
90 {
91 if (null == this.Fields[5].Data)
92 {
93 return YesNoType.NotSet;
94 }
95 else if (1 == (int)this.Fields[5].Data)
96 {
97 return YesNoType.Yes;
98 }
99 else if (0 == (int)this.Fields[5].Data)
100 {
101 return YesNoType.No;
102 }
103 else
104 {
105 throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture, WixDataStrings.EXP_MergeTableFileCompressionColumnContainsInvalidValue, this.Fields[5].Data));
106 }
107 }
108 set
109 {
110 if (YesNoType.Yes == value)
111 {
112 this.Fields[5].Data = 1;
113 }
114 else if (YesNoType.No == value)
115 {
116 this.Fields[5].Data = 0;
117 }
118 else if (YesNoType.NotSet == value)
119 {
120 this.Fields[5].Data = null;
121 }
122 else
123 {
124 throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture, WixDataStrings.EXP_CannotSetMergeTableFileCompressionColumnToInvalidValue, value));
125 }
126 }
127 }
128
129 /// <summary>
130 /// Gets and sets the configuration data for a merge row.
131 /// </summary>
132 /// <value>Comma delimited string of "name=value" pairs.</value>
133 public string ConfigurationData
134 {
135 get { return (string)this.Fields[6].Data; }
136 set { this.Fields[6].Data = value; }
137 }
138
139 /// <summary>
140 /// Gets and sets the primary feature for a merge row.
141 /// </summary>
142 /// <value>The primary feature for a merge row.</value>
143 public string Feature
144 {
145 get { return (string)this.Fields[7].Data; }
146 set { this.Fields[7].Data = value; }
147 }
148 }
149}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixPayloadPropertiesRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixPayloadPropertiesRow.cs
deleted file mode 100644
index 2e5f53ad..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixPayloadPropertiesRow.cs
+++ /dev/null
@@ -1,81 +0,0 @@
1//-------------------------------------------------------------------------------------------------
2// <copyright file="WixPayloadPropertiesRow.cs" company="Outercurve Foundation">
3// Copyright (c) 2004, Outercurve Foundation.
4// This software is released under Microsoft Reciprocal License (MS-RL).
5// The license and further copyright text can be found in the file
6// LICENSE.TXT at the root directory of the distribution.
7// </copyright>
8//-------------------------------------------------------------------------------------------------
9
10namespace WixToolset.Data.Rows
11{
12 using System;
13
14 /// <summary>
15 /// Specialization of a row for the WixPayloadProperties table.
16 /// </summary>
17 public class WixPayloadPropertiesRow : Row
18 {
19 /// <summary>
20 /// Creates a WixPayloadProperties row that does not belong to a table.
21 /// </summary>
22 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
23 /// <param name="tableDef">TableDefinition this WixPayloadProperties row belongs to and should get its column definitions from.</param>
24 public WixPayloadPropertiesRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
25 base(sourceLineNumbers, tableDef)
26 {
27 }
28
29 /// <summary>
30 /// Creates a WixPayloadProperties row that belongs to a table.
31 /// </summary>
32 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
33 /// <param name="table">Table this WixPayloadProperties row belongs to and should get its column definitions from.</param>
34 public WixPayloadPropertiesRow(SourceLineNumber sourceLineNumbers, Table table) :
35 base(sourceLineNumbers, table)
36 {
37 }
38
39 public string Id
40 {
41 get { return (string)this.Fields[0].Data; }
42 set { this.Fields[0].Data = value; }
43 }
44
45 public string Package
46 {
47 get { return (string)this.Fields[1].Data; }
48 set { this.Fields[1].Data = value; }
49 }
50
51 public string Container
52 {
53 get { return (string)this.Fields[2].Data; }
54 set { this.Fields[2].Data = value; }
55 }
56
57 public string Name
58 {
59 get { return (string)this.Fields[3].Data; }
60 set { this.Fields[3].Data = value; }
61 }
62
63 public string Size
64 {
65 get { return (string)this.Fields[4].Data; }
66 set { this.Fields[4].Data = value; }
67 }
68
69 public string DownloadUrl
70 {
71 get { return (string)this.Fields[5].Data; }
72 set { this.Fields[5].Data = value; }
73 }
74
75 public string LayoutOnly
76 {
77 get { return (string)this.Fields[6].Data; }
78 set { this.Fields[6].Data = value; }
79 }
80 }
81}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixPropertyRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixPropertyRow.cs
deleted file mode 100644
index 5285195c..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixPropertyRow.cs
+++ /dev/null
@@ -1,118 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6 using System.Globalization;
7
8 /// <summary>
9 /// Specialization of a row for the WixProperty table.
10 /// </summary>
11 public sealed class WixPropertyRow : Row
12 {
13 /// <summary>Creates a WixProperty row that belongs to a table.</summary>
14 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
15 /// <param name="table">Table this WixProperty row belongs to and should get its column definitions from.</param>
16 public WixPropertyRow(SourceLineNumber sourceLineNumbers, Table table) :
17 base(sourceLineNumbers, table)
18 {
19 }
20
21 /// <summary>
22 /// Gets and sets the id for this property row.
23 /// </summary>
24 /// <value>Id for the property.</value>
25 public string Id
26 {
27 get { return (string)this.Fields[0].Data; }
28 set { this.Fields[0].Data = value; }
29 }
30
31 /// <summary>
32 /// Gets and sets if this is an admin property row.
33 /// </summary>
34 /// <value>Flag if this is an admin property.</value>
35 public bool Admin
36 {
37 get
38 {
39 return (0x1 == (Convert.ToInt32(this.Fields[1].Data, CultureInfo.InvariantCulture) & 0x1));
40 }
41
42 set
43 {
44 if (null == this.Fields[1].Data)
45 {
46 this.Fields[1].Data = 0;
47 }
48
49 if (value)
50 {
51 this.Fields[1].Data = (int)this.Fields[1].Data | 0x1;
52 }
53 else
54 {
55 this.Fields[1].Data = (int)this.Fields[1].Data & ~0x1;
56 }
57 }
58 }
59
60 /// <summary>
61 /// Gets and sets if this is a hidden property row.
62 /// </summary>
63 /// <value>Flag if this is a hidden property.</value>
64 public bool Hidden
65 {
66 get
67 {
68 return (0x2 == (Convert.ToInt32(this.Fields[1].Data, CultureInfo.InvariantCulture) & 0x2));
69 }
70
71 set
72 {
73 if (null == this.Fields[1].Data)
74 {
75 this.Fields[1].Data = 0;
76 }
77
78 if (value)
79 {
80 this.Fields[1].Data = (int)this.Fields[1].Data | 0x2;
81 }
82 else
83 {
84 this.Fields[1].Data = (int)this.Fields[1].Data & ~0x2;
85 }
86 }
87 }
88
89 /// <summary>
90 /// Gets and sets if this is a secure property row.
91 /// </summary>
92 /// <value>Flag if this is a secure property.</value>
93 public bool Secure
94 {
95 get
96 {
97 return (0x4 == (Convert.ToInt32(this.Fields[1].Data, CultureInfo.InvariantCulture) & 0x4));
98 }
99
100 set
101 {
102 if (null == this.Fields[1].Data)
103 {
104 this.Fields[1].Data = 0;
105 }
106
107 if (value)
108 {
109 this.Fields[1].Data = (int)this.Fields[1].Data | 0x4;
110 }
111 else
112 {
113 this.Fields[1].Data = (int)this.Fields[1].Data & ~0x4;
114 }
115 }
116 }
117 }
118}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixRelatedBundleRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixRelatedBundleRow.cs
deleted file mode 100644
index 95fffde5..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixRelatedBundleRow.cs
+++ /dev/null
@@ -1,52 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using Serialize = WixToolset.Data.Serialize;
6
7 /// <summary>
8 /// Specialization of a row for the RelatedBundle table.
9 /// </summary>
10 public sealed class WixRelatedBundleRow : Row
11 {
12 /// <summary>
13 /// Creates a RelatedBundle row that does not belong to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="tableDef">TableDefinition this RelatedBundle row belongs to and should get its column definitions from.</param>
17 public WixRelatedBundleRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
18 base(sourceLineNumbers, tableDef)
19 {
20 }
21
22 /// <summary>
23 /// Creates a RelatedBundle row that belongs to a table.
24 /// </summary>
25 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
26 /// <param name="table">Table this RelatedBundle row belongs to and should get its column definitions from.</param>
27 public WixRelatedBundleRow(SourceLineNumber sourceLineNumbers, Table table)
28 : base(sourceLineNumbers, table)
29 {
30 }
31
32 /// <summary>
33 /// Gets or sets the related bundle identifier.
34 /// </summary>
35 /// <value>The related bundle identifier.</value>
36 public string Id
37 {
38 get { return (string)this.Fields[0].Data; }
39 set { this.Fields[0].Data = value; }
40 }
41
42 /// <summary>
43 /// Gets or sets the related bundle action.
44 /// </summary>
45 /// <value>The related bundle action.</value>
46 public Serialize.RelatedBundle.ActionType Action
47 {
48 get { return (Serialize.RelatedBundle.ActionType)this.Fields[1].Data; }
49 set { this.Fields[1].Data = (int)value; }
50 }
51 }
52}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixSimpleReferenceRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixSimpleReferenceRow.cs
deleted file mode 100644
index 3a2cf8f1..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixSimpleReferenceRow.cs
+++ /dev/null
@@ -1,63 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6 using System.Diagnostics;
7 using System.Xml;
8
9 /// <summary>
10 /// Specialization of a row for the WixSimpleReference table.
11 /// </summary>
12 public sealed class WixSimpleReferenceRow : Row
13 {
14 /// <summary>
15 /// Creates a WixSimpleReferenceRow that belongs to a table.
16 /// </summary>
17 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
18 /// <param name="table">Table this row belongs to and should get its column definitions from.</param>
19 public WixSimpleReferenceRow(SourceLineNumber sourceLineNumbers, Table table)
20 : base(sourceLineNumbers, table)
21 {
22 }
23
24 /// <summary>
25 /// Creates a WixSimpleReferenceRow that belongs to a table.
26 /// </summary>
27 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
28 /// <param name="tableDefinitions">Table definitions for this row.</param>
29 public WixSimpleReferenceRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDefinitions)
30 : base(sourceLineNumbers, tableDefinitions)
31 {
32 }
33
34 /// <summary>
35 /// Gets or sets the primary keys of the simple reference.
36 /// </summary>
37 /// <value>The primary keys of the simple reference.</value>
38 public string PrimaryKeys
39 {
40 get { return (string)this.Fields[1].Data; }
41 set { this.Fields[1].Data = value; }
42 }
43
44 /// <summary>
45 /// Gets the symbolic name.
46 /// </summary>
47 /// <value>Symbolic name.</value>
48 public string SymbolicName
49 {
50 get { return String.Concat(this.TableName, ":", this.PrimaryKeys); }
51 }
52
53 /// <summary>
54 /// Gets or sets the table name of the simple reference.
55 /// </summary>
56 /// <value>The table name of the simple reference.</value>
57 public string TableName
58 {
59 get { return (string)this.Fields[0].Data; }
60 set { this.Fields[0].Data = value; }
61 }
62 }
63}
diff --git a/src/WixToolset.Data.WindowsInstaller/Rows/WixUpdateRegistrationRow.cs b/src/WixToolset.Data.WindowsInstaller/Rows/WixUpdateRegistrationRow.cs
deleted file mode 100644
index 8d86f970..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Rows/WixUpdateRegistrationRow.cs
+++ /dev/null
@@ -1,62 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data.Rows
4{
5 using System;
6
7 /// <summary>
8 /// Update registration information for Binding.
9 /// </summary>
10 public class WixUpdateRegistrationRow : Row
11 {
12 /// <summary>
13 /// Creates a WixUpdateRegistrationRow row that does not belong to a table.
14 /// </summary>
15 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
16 /// <param name="tableDef">TableDefinition this WixUpdateRegistrationRow row belongs to and should get its column definitions from.</param>
17 public WixUpdateRegistrationRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) :
18 base(sourceLineNumbers, tableDef)
19 {
20 }
21
22 /// <summary>
23 /// Creates a WixUpdateRegistrationRow row that belongs to a table.
24 /// </summary>
25 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
26 /// <param name="table">Table this WixUpdateRegistrationRow row belongs to and should get its column definitions from.</param>
27 public WixUpdateRegistrationRow(SourceLineNumber sourceLineNumbers, Table table) :
28 base(sourceLineNumbers, table)
29 {
30 }
31
32 public string Manufacturer
33 {
34 get { return (string)this.Fields[0].Data; }
35 set { this.Fields[0].Data = value; }
36 }
37
38 public string Department
39 {
40 get { return (string)this.Fields[1].Data; }
41 set { this.Fields[1].Data = value; }
42 }
43
44 public string ProductFamily
45 {
46 get { return (string)this.Fields[2].Data; }
47 set { this.Fields[2].Data = value; }
48 }
49
50 public string Name
51 {
52 get { return (string)this.Fields[3].Data; }
53 set { this.Fields[3].Data = value; }
54 }
55
56 public string Classification
57 {
58 get { return (string)this.Fields[4].Data; }
59 set { this.Fields[4].Data = value; }
60 }
61 }
62}
diff --git a/src/WixToolset.Data.WindowsInstaller/SubStorage.cs b/src/WixToolset.Data.WindowsInstaller/SubStorage.cs
deleted file mode 100644
index e136bfe9..00000000
--- a/src/WixToolset.Data.WindowsInstaller/SubStorage.cs
+++ /dev/null
@@ -1,109 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System.Xml;
6
7 /// <summary>
8 /// Substorage inside an output.
9 /// </summary>
10 public sealed class SubStorage
11 {
12 /// <summary>
13 /// Instantiate a new substorage.
14 /// </summary>
15 /// <param name="name">The substorage name.</param>
16 /// <param name="data">The substorage data.</param>
17 public SubStorage(string name, Output data)
18 {
19 this.Name = name;
20 this.Data = data;
21 }
22
23 /// <summary>
24 /// Gets the substorage name.
25 /// </summary>
26 /// <value>The substorage name.</value>
27 public string Name { get; private set; }
28
29 /// <summary>
30 /// Gets the substorage data.
31 /// </summary>
32 /// <value>The substorage data.</value>
33 public Output Data { get; private set; }
34
35 /// <summary>
36 /// Creates a SubStorage from the XmlReader.
37 /// </summary>
38 /// <param name="reader">Reader to get data from.</param>
39 /// <returns>New SubStorage object.</returns>
40 internal static SubStorage Read(XmlReader reader)
41 {
42 if (!reader.LocalName.Equals("subStorage" == reader.LocalName))
43 {
44 throw new XmlException();
45 }
46
47 Output data = null;
48 bool empty = reader.IsEmptyElement;
49 string name = null;
50
51 while (reader.MoveToNextAttribute())
52 {
53 switch (reader.LocalName)
54 {
55 case "name":
56 name = reader.Value;
57 break;
58 }
59 }
60
61 if (!empty)
62 {
63 bool done = false;
64
65 while (!done && reader.Read())
66 {
67 switch (reader.NodeType)
68 {
69 case XmlNodeType.Element:
70 switch (reader.LocalName)
71 {
72 case "wixOutput":
73 data = Output.Read(reader, true);
74 break;
75 default:
76 throw new XmlException();
77 }
78 break;
79 case XmlNodeType.EndElement:
80 done = true;
81 break;
82 }
83 }
84
85 if (!done)
86 {
87 throw new XmlException();
88 }
89 }
90
91 return new SubStorage(name, data);
92 }
93
94 /// <summary>
95 /// Persists a SubStorage in an XML format.
96 /// </summary>
97 /// <param name="writer">XmlWriter where the SubStorage should persist itself as XML.</param>
98 internal void Write(XmlWriter writer)
99 {
100 writer.WriteStartElement("subStorage", Output.XmlNamespaceUri);
101
102 writer.WriteAttributeString("name", this.Name);
103
104 this.Data.Write(writer);
105
106 writer.WriteEndElement();
107 }
108 }
109}
diff --git a/src/WixToolset.Data.WindowsInstaller/Table.cs b/src/WixToolset.Data.WindowsInstaller/Table.cs
deleted file mode 100644
index 4c0df0ad..00000000
--- a/src/WixToolset.Data.WindowsInstaller/Table.cs
+++ /dev/null
@@ -1,435 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Diagnostics;
8 using System.Diagnostics.CodeAnalysis;
9 using System.Globalization;
10 using System.IO;
11 using System.Text;
12 using System.Xml;
13 using WixToolset.Data.Rows;
14
15 /// <summary>
16 /// Object that represents a table in a database.
17 /// </summary>
18 public sealed class Table
19 {
20 /// <summary>
21 /// Creates a table in a section.
22 /// </summary>
23 /// <param name="section">Section to add table to.</param>
24 /// <param name="tableDefinition">Definition of the table.</param>
25 public Table(TableDefinition tableDefinition)
26 {
27 this.Definition = tableDefinition;
28 this.Rows = new List<Row>();
29 }
30
31 /// <summary>
32 /// Gets the table definition.
33 /// </summary>
34 /// <value>Definition of the table.</value>
35 public TableDefinition Definition { get; private set; }
36
37 /// <summary>
38 /// Gets the name of the table.
39 /// </summary>
40 /// <value>Name of the table.</value>
41 public string Name
42 {
43 get { return this.Definition.Name; }
44 }
45
46 /// <summary>
47 /// Gets or sets the table transform operation.
48 /// </summary>
49 /// <value>The table transform operation.</value>
50 public TableOperation Operation { get; set; }
51
52 /// <summary>
53 /// Gets the rows contained in the table.
54 /// </summary>
55 /// <value>Rows contained in the table.</value>
56 public IList<Row> Rows { get; private set; }
57
58 /// <summary>
59 /// Creates a new row in the table.
60 /// </summary>
61 /// <param name="sourceLineNumbers">Original source lines for this row.</param>
62 /// <param name="add">Specifies whether to only create the row or add it to the table automatically.</param>
63 /// <returns>Row created in table.</returns>
64 public Row CreateRow(SourceLineNumber sourceLineNumbers, bool add = true)
65 {
66 Row row;
67
68 switch (this.Name)
69 {
70 case "BBControl":
71 row = new BBControlRow(sourceLineNumbers, this);
72 break;
73 case "WixBundlePackage":
74 row = new WixBundlePackageRow(sourceLineNumbers, this);
75 break;
76 case "WixBundleExePackage":
77 row = new WixBundleExePackageRow(sourceLineNumbers, this);
78 break;
79 case "WixBundleMsiPackage":
80 row = new WixBundleMsiPackageRow(sourceLineNumbers, this);
81 break;
82 case "WixBundleMspPackage":
83 row = new WixBundleMspPackageRow(sourceLineNumbers, this);
84 break;
85 case "WixBundleMsuPackage":
86 row = new WixBundleMsuPackageRow(sourceLineNumbers, this);
87 break;
88 case "Component":
89 row = new ComponentRow(sourceLineNumbers, this);
90 break;
91 case "WixBundleContainer":
92 row = new WixBundleContainerRow(sourceLineNumbers, this);
93 break;
94 case "Control":
95 row = new ControlRow(sourceLineNumbers, this);
96 break;
97 case "File":
98 row = new FileRow(sourceLineNumbers, this);
99 break;
100 case "WixBundleMsiFeature":
101 row = new WixBundleMsiFeatureRow(sourceLineNumbers, this);
102 break;
103 case "WixBundleMsiProperty":
104 row = new WixBundleMsiPropertyRow(sourceLineNumbers, this);
105 break;
106 case "Media":
107 row = new MediaRow(sourceLineNumbers, this);
108 break;
109 case "WixBundlePayload":
110 row = new WixBundlePayloadRow(sourceLineNumbers, this);
111 break;
112 case "Property":
113 row = new PropertyRow(sourceLineNumbers, this);
114 break;
115 case "WixRelatedBundle":
116 row = new WixRelatedBundleRow(sourceLineNumbers, this);
117 break;
118 case "WixBundleRelatedPackage":
119 row = new WixBundleRelatedPackageRow(sourceLineNumbers, this);
120 break;
121 case "WixBundleRollbackBoundary":
122 row = new WixBundleRollbackBoundaryRow(sourceLineNumbers, this);
123 break;
124 case "Upgrade":
125 row = new UpgradeRow(sourceLineNumbers, this);
126 break;
127 case "WixBundleVariable":
128 row = new WixBundleVariableRow(sourceLineNumbers, this);
129 break;
130 case "WixAction":
131 row = new WixActionRow(sourceLineNumbers, this);
132 break;
133 case "WixApprovedExeForElevation":
134 row = new WixApprovedExeForElevationRow(sourceLineNumbers, this);
135 break;
136 case "WixBundle":
137 row = new WixBundleRow(sourceLineNumbers, this);
138 break;
139 case "WixBundlePackageExitCode":
140 row = new WixBundlePackageExitCodeRow(sourceLineNumbers, this);
141 break;
142 case "WixBundlePatchTargetCode":
143 row = new WixBundlePatchTargetCodeRow(sourceLineNumbers, this);
144 break;
145 case "WixBundleSlipstreamMsp":
146 row = new WixBundleSlipstreamMspRow(sourceLineNumbers, this);
147 break;
148 case "WixBundleUpdate":
149 row = new WixBundleUpdateRow(sourceLineNumbers, this);
150 break;
151 case "WixBundleCatalog":
152 row = new WixBundleCatalogRow(sourceLineNumbers, this);
153 break;
154 case "WixChain":
155 row = new WixChainRow(sourceLineNumbers, this);
156 break;
157 case "WixChainItem":
158 row = new WixChainItemRow(sourceLineNumbers, this);
159 break;
160 case "WixBundlePackageCommandLine":
161 row = new WixBundlePackageCommandLineRow(sourceLineNumbers, this);
162 break;
163 case "WixComplexReference":
164 row = new WixComplexReferenceRow(sourceLineNumbers, this);
165 break;
166 case "WixDeltaPatchFile":
167 row = new WixDeltaPatchFileRow(sourceLineNumbers, this);
168 break;
169 case "WixDeltaPatchSymbolPaths":
170 row = new WixDeltaPatchSymbolPathsRow(sourceLineNumbers, this);
171 break;
172 case "WixFile":
173 row = new WixFileRow(sourceLineNumbers, this);
174 break;
175 case "WixGroup":
176 row = new WixGroupRow(sourceLineNumbers, this);
177 break;
178 case "WixMedia":
179 row = new WixMediaRow(sourceLineNumbers, this);
180 break;
181 case "WixMediaTemplate":
182 row = new WixMediaTemplateRow(sourceLineNumbers, this);
183 break;
184 case "WixMerge":
185 row = new WixMergeRow(sourceLineNumbers, this);
186 break;
187 case "WixPayloadProperties":
188 row = new WixPayloadPropertiesRow(sourceLineNumbers, this);
189 break;
190 case "WixProperty":
191 row = new WixPropertyRow(sourceLineNumbers, this);
192 break;
193 case "WixSimpleReference":
194 row = new WixSimpleReferenceRow(sourceLineNumbers, this);
195 break;
196 case "WixUpdateRegistration":
197 row = new WixUpdateRegistrationRow(sourceLineNumbers, this);
198 break;
199
200 default:
201 row = new Row(sourceLineNumbers, this);
202 break;
203 }
204
205 if (add)
206 {
207 this.Rows.Add(row);
208 }
209
210 return row;
211 }
212
213 /// <summary>
214 /// Parse a table from the xml.
215 /// </summary>
216 /// <param name="reader">XmlReader where the intermediate is persisted.</param>
217 /// <param name="section">Section to populate with persisted data.</param>
218 /// <param name="tableDefinitions">TableDefinitions to use in the intermediate.</param>
219 /// <returns>The parsed table.</returns>
220 internal static Table Read(XmlReader reader, TableDefinitionCollection tableDefinitions)
221 {
222 Debug.Assert("table" == reader.LocalName);
223
224 bool empty = reader.IsEmptyElement;
225 TableOperation operation = TableOperation.None;
226 string name = null;
227
228 while (reader.MoveToNextAttribute())
229 {
230 switch (reader.LocalName)
231 {
232 case "name":
233 name = reader.Value;
234 break;
235 case "op":
236 switch (reader.Value)
237 {
238 case "add":
239 operation = TableOperation.Add;
240 break;
241 case "drop":
242 operation = TableOperation.Drop;
243 break;
244 default:
245 throw new XmlException();
246 }
247 break;
248 }
249 }
250
251 if (null == name)
252 {
253 throw new XmlException();
254 }
255
256 TableDefinition tableDefinition = tableDefinitions[name];
257 Table table = new Table(tableDefinition);
258 table.Operation = operation;
259
260 if (!empty)
261 {
262 bool done = false;
263
264 // loop through all the rows in a table
265 while (!done && reader.Read())
266 {
267 switch (reader.NodeType)
268 {
269 case XmlNodeType.Element:
270 switch (reader.LocalName)
271 {
272 case "row":
273 Row.Read(reader, table);
274 break;
275 default:
276 throw new XmlException();
277 }
278 break;
279 case XmlNodeType.EndElement:
280 done = true;
281 break;
282 }
283 }
284
285 if (!done)
286 {
287 throw new XmlException();
288 }
289 }
290
291 return table;
292 }
293
294 /// <summary>
295 /// Modularize the table.
296 /// </summary>
297 /// <param name="modularizationGuid">String containing the GUID of the Merge Module, if appropriate.</param>
298 /// <param name="suppressModularizationIdentifiers">Optional collection of identifiers that should not be modularized.</param>
299 public void Modularize(string modularizationGuid, ISet<string> suppressModularizationIdentifiers)
300 {
301 List<int> modularizedColumns = new List<int>();
302
303 // find the modularized columns
304 for (int i = 0; i < this.Definition.Columns.Count; i++)
305 {
306 if (ColumnModularizeType.None != this.Definition.Columns[i].ModularizeType)
307 {
308 modularizedColumns.Add(i);
309 }
310 }
311
312 if (0 < modularizedColumns.Count)
313 {
314 foreach (Row row in this.Rows)
315 {
316 foreach (int modularizedColumn in modularizedColumns)
317 {
318 Field field = row.Fields[modularizedColumn];
319
320 if (null != field.Data)
321 {
322 field.Data = row.GetModularizedValue(field, modularizationGuid, suppressModularizationIdentifiers);
323 }
324 }
325 }
326 }
327 }
328
329 /// <summary>
330 /// Persists a row in an XML format.
331 /// </summary>
332 /// <param name="writer">XmlWriter where the Row should persist itself as XML.</param>
333 [SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase", Justification = "Changing the way this string normalizes would result " +
334 "in a change to the way the intermediate files are generated, potentially causing extra churn in patches on an MSI built from an older version of WiX. " +
335 "Furthermore, there is no security hole here, as the strings won't need to make a round trip")]
336 internal void Write(XmlWriter writer)
337 {
338 if (null == writer)
339 {
340 throw new ArgumentNullException("writer");
341 }
342
343 writer.WriteStartElement("table", Intermediate.XmlNamespaceUri);
344 writer.WriteAttributeString("name", this.Name);
345
346 if (TableOperation.None != this.Operation)
347 {
348 writer.WriteAttributeString("op", this.Operation.ToString().ToLowerInvariant());
349 }
350
351 foreach (Row row in this.Rows)
352 {
353 row.Write(writer);
354 }
355
356 writer.WriteEndElement();
357 }
358
359 /// <summary>
360 /// Writes the table in IDT format to the provided stream.
361 /// </summary>
362 /// <param name="writer">Stream to write the table to.</param>
363 /// <param name="keepAddedColumns">Whether to keep columns added in a transform.</param>
364 public void ToIdtDefinition(StreamWriter writer, bool keepAddedColumns)
365 {
366 if (this.Definition.Unreal)
367 {
368 return;
369 }
370
371 if (TableDefinition.MaxColumnsInRealTable < this.Definition.Columns.Count)
372 {
373 throw new WixException(WixDataErrors.TooManyColumnsInRealTable(this.Definition.Name, this.Definition.Columns.Count, TableDefinition.MaxColumnsInRealTable));
374 }
375
376 // Tack on the table header, and flush before we start writing bytes directly to the stream.
377 writer.Write(this.Definition.ToIdtDefinition(keepAddedColumns));
378 writer.Flush();
379
380 using (var binary = new BinaryWriter(writer.BaseStream, writer.Encoding, true))
381 {
382 // Create an encoding that replaces characters with question marks, and doesn't throw. We'll
383 // use this in case of errors
384 Encoding convertEncoding = Encoding.GetEncoding(writer.Encoding.CodePage);
385
386 foreach (Row row in this.Rows)
387 {
388 if (row.Redundant)
389 {
390 continue;
391 }
392
393 string rowString = row.ToIdtDefinition(keepAddedColumns);
394 byte[] rowBytes;
395
396 try
397 {
398 // GetBytes will throw an exception if any character doesn't match our current encoding
399 rowBytes = writer.Encoding.GetBytes(rowString);
400 }
401 catch (EncoderFallbackException)
402 {
403 Messaging.Instance.OnMessage(WixDataErrors.InvalidStringForCodepage(row.SourceLineNumbers, Convert.ToString(writer.Encoding.WindowsCodePage, CultureInfo.InvariantCulture)));
404
405 rowBytes = convertEncoding.GetBytes(rowString);
406 }
407
408 binary.Write(rowBytes, 0, rowBytes.Length);
409 }
410 }
411 }
412
413 /// <summary>
414 /// Validates the rows of this OutputTable and throws if it collides on
415 /// primary keys.
416 /// </summary>
417 public void ValidateRows()
418 {
419 Dictionary<string, SourceLineNumber> primaryKeys = new Dictionary<string, SourceLineNumber>();
420
421 foreach (Row row in this.Rows)
422 {
423 string primaryKey = row.GetPrimaryKey();
424
425 SourceLineNumber collisionSourceLineNumber;
426 if (primaryKeys.TryGetValue(primaryKey, out collisionSourceLineNumber))
427 {
428 throw new WixException(WixDataErrors.DuplicatePrimaryKey(collisionSourceLineNumber, primaryKey, this.Definition.Name));
429 }
430
431 primaryKeys.Add(primaryKey, row.SourceLineNumbers);
432 }
433 }
434 }
435}
diff --git a/src/WixToolset.Data.WindowsInstaller/TableDefinition.cs b/src/WixToolset.Data.WindowsInstaller/TableDefinition.cs
deleted file mode 100644
index 40aaac84..00000000
--- a/src/WixToolset.Data.WindowsInstaller/TableDefinition.cs
+++ /dev/null
@@ -1,334 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Collections.ObjectModel;
8 using System.Text;
9 using System.Xml;
10
11 /// <summary>
12 /// Definition of a table in a database.
13 /// </summary>
14 public sealed class TableDefinition : IComparable<TableDefinition>
15 {
16 /// <summary>
17 /// Tracks the maximum number of columns supported in a real table.
18 /// This is a Windows Installer limitation.
19 /// </summary>
20 public const int MaxColumnsInRealTable = 32;
21
22 /// <summary>
23 /// Creates a table definition.
24 /// </summary>
25 /// <param name="name">Name of table to create.</param>
26 /// <param name="createSymbols">Flag if rows in this table create symbols.</param>
27 /// <param name="unreal">Flag if table is unreal.</param>
28 /// <param name="bootstrapperApplicationData">Flag if table is part of UX Manifest.</param>
29 public TableDefinition(string name, IList<ColumnDefinition> columns, bool createSymbols, bool unreal, bool bootstrapperApplicationData = false)
30 {
31 this.Name = name;
32 this.CreateSymbols = createSymbols;
33 this.Unreal = unreal;
34 this.BootstrapperApplicationData = bootstrapperApplicationData;
35
36 this.Columns = new ReadOnlyCollection<ColumnDefinition>(columns);
37 }
38
39 /// <summary>
40 /// Gets if rows in this table create symbols.
41 /// </summary>
42 /// <value>Flag if rows in this table create symbols.</value>
43 public bool CreateSymbols { get; private set; }
44
45 /// <summary>
46 /// Gets the name of the table.
47 /// </summary>
48 /// <value>Name of the table.</value>
49 public string Name { get; private set; }
50
51 /// <summary>
52 /// Gets if the table is unreal.
53 /// </summary>
54 /// <value>Flag if table is unreal.</value>
55 public bool Unreal { get; private set; }
56
57 /// <summary>
58 /// Gets if the table is a part of the bootstrapper application data manifest.
59 /// </summary>
60 /// <value>Flag if table is a part of the bootstrapper application data manifest.</value>
61 public bool BootstrapperApplicationData { get; private set; }
62
63 /// <summary>
64 /// Gets the collection of column definitions for this table.
65 /// </summary>
66 /// <value>Collection of column definitions for this table.</value>
67 public IList<ColumnDefinition> Columns { get; private set; }
68
69 /// <summary>
70 /// Gets the column definition in the table by index.
71 /// </summary>
72 /// <param name="columnIndex">Index of column to locate.</param>
73 /// <value>Column definition in the table by index.</value>
74 public ColumnDefinition this[int columnIndex]
75 {
76 get { return this.Columns[columnIndex]; }
77 }
78
79 /// <summary>
80 /// Gets the table definition in IDT format.
81 /// </summary>
82 /// <param name="keepAddedColumns">Whether to keep columns added in a transform.</param>
83 /// <returns>Table definition in IDT format.</returns>
84 public string ToIdtDefinition(bool keepAddedColumns)
85 {
86 bool first = true;
87 StringBuilder columnString = new StringBuilder();
88 StringBuilder dataString = new StringBuilder();
89 StringBuilder tableString = new StringBuilder();
90
91 tableString.Append(this.Name);
92 foreach (ColumnDefinition column in this.Columns)
93 {
94 // conditionally keep columns added in a transform; otherwise,
95 // break because columns can only be added at the end
96 if (column.Added && !keepAddedColumns)
97 {
98 break;
99 }
100
101 if (!first)
102 {
103 columnString.Append('\t');
104 dataString.Append('\t');
105 }
106
107 columnString.Append(column.Name);
108 dataString.Append(column.IdtType);
109
110 if (column.PrimaryKey)
111 {
112 tableString.AppendFormat("\t{0}", column.Name);
113 }
114
115 first = false;
116 }
117 columnString.Append("\r\n");
118 columnString.Append(dataString);
119 columnString.Append("\r\n");
120 columnString.Append(tableString);
121 columnString.Append("\r\n");
122
123 return columnString.ToString();
124 }
125
126 /// <summary>
127 /// Adds the validation rows to the _Validation table.
128 /// </summary>
129 /// <param name="validationTable">The _Validation table.</param>
130 public void AddValidationRows(Table validationTable)
131 {
132 foreach (ColumnDefinition columnDef in this.Columns)
133 {
134 Row row = validationTable.CreateRow(null);
135
136 row[0] = this.Name;
137
138 row[1] = columnDef.Name;
139
140 if (columnDef.Nullable)
141 {
142 row[2] = "Y";
143 }
144 else
145 {
146 row[2] = "N";
147 }
148
149 if (columnDef.IsMinValueSet)
150 {
151 row[3] = columnDef.MinValue;
152 }
153
154 if (columnDef.IsMaxValueSet)
155 {
156 row[4] = columnDef.MaxValue;
157 }
158
159 row[5] = columnDef.KeyTable;
160
161 if (columnDef.IsKeyColumnSet)
162 {
163 row[6] = columnDef.KeyColumn;
164 }
165
166 if (ColumnCategory.Unknown != columnDef.Category)
167 {
168 row[7] = columnDef.Category.ToString();
169 }
170
171 row[8] = columnDef.Possibilities;
172
173 row[9] = columnDef.Description;
174 }
175 }
176
177 /// <summary>
178 /// Compares this table definition to another table definition.
179 /// </summary>
180 /// <remarks>
181 /// Only Windows Installer traits are compared, allowing for updates to WiX-specific table definitions.
182 /// </remarks>
183 /// <param name="updated">The updated <see cref="TableDefinition"/> to compare with this target definition.</param>
184 /// <returns>0 if the tables' core properties are the same; otherwise, non-0.</returns>
185 public int CompareTo(TableDefinition updated)
186 {
187 // by definition, this object is greater than null
188 if (null == updated)
189 {
190 return 1;
191 }
192
193 // compare the table names
194 int ret = String.Compare(this.Name, updated.Name, StringComparison.Ordinal);
195
196 // compare the column count
197 if (0 == ret)
198 {
199 // transforms can only add columns
200 ret = Math.Min(0, updated.Columns.Count - this.Columns.Count);
201
202 // compare name, type, and length of each column
203 for (int i = 0; 0 == ret && this.Columns.Count > i; i++)
204 {
205 ColumnDefinition thisColumnDef = this.Columns[i];
206 ColumnDefinition updatedColumnDef = updated.Columns[i];
207
208 ret = thisColumnDef.CompareTo(updatedColumnDef);
209 }
210 }
211
212 return ret;
213 }
214
215 /// <summary>
216 /// Parses table definition from xml reader.
217 /// </summary>
218 /// <param name="reader">Reader to get data from.</param>
219 /// <returns>The TableDefintion represented by the Xml.</returns>
220 internal static TableDefinition Read(XmlReader reader)
221 {
222 bool empty = reader.IsEmptyElement;
223 bool createSymbols = false;
224 string name = null;
225 bool unreal = false;
226 bool bootstrapperApplicationData = false;
227
228 while (reader.MoveToNextAttribute())
229 {
230 switch (reader.LocalName)
231 {
232 case "createSymbols":
233 createSymbols = reader.Value.Equals("yes");
234 break;
235 case "name":
236 name = reader.Value;
237 break;
238 case "unreal":
239 unreal = reader.Value.Equals("yes");
240 break;
241 case "bootstrapperApplicationData":
242 bootstrapperApplicationData = reader.Value.Equals("yes");
243 break;
244 }
245 }
246
247 if (null == name)
248 {
249 throw new XmlException();
250 }
251
252 List<ColumnDefinition> columns = new List<ColumnDefinition>();
253 bool hasPrimaryKeyColumn = false;
254
255 // parse the child elements
256 if (!empty)
257 {
258 bool done = false;
259
260 while (!done && reader.Read())
261 {
262 switch (reader.NodeType)
263 {
264 case XmlNodeType.Element:
265 switch (reader.LocalName)
266 {
267 case "columnDefinition":
268 ColumnDefinition columnDefinition = ColumnDefinition.Read(reader);
269 columns.Add(columnDefinition);
270
271 if (columnDefinition.PrimaryKey)
272 {
273 hasPrimaryKeyColumn = true;
274 }
275 break;
276 default:
277 throw new XmlException();
278 }
279 break;
280 case XmlNodeType.EndElement:
281 done = true;
282 break;
283 }
284 }
285
286 if (!unreal && !bootstrapperApplicationData && !hasPrimaryKeyColumn)
287 {
288 throw new WixException(WixDataErrors.RealTableMissingPrimaryKeyColumn(SourceLineNumber.CreateFromUri(reader.BaseURI), name));
289 }
290
291 if (!done)
292 {
293 throw new XmlException();
294 }
295 }
296
297 TableDefinition tableDefinition = new TableDefinition(name, columns, createSymbols, unreal, bootstrapperApplicationData);
298 return tableDefinition;
299 }
300
301 /// <summary>
302 /// Persists an output in an XML format.
303 /// </summary>
304 /// <param name="writer">XmlWriter where the Output should persist itself as XML.</param>
305 internal void Write(XmlWriter writer)
306 {
307 writer.WriteStartElement("tableDefinition", TableDefinitionCollection.XmlNamespaceUri);
308
309 writer.WriteAttributeString("name", this.Name);
310
311 if (this.CreateSymbols)
312 {
313 writer.WriteAttributeString("createSymbols", "yes");
314 }
315
316 if (this.Unreal)
317 {
318 writer.WriteAttributeString("unreal", "yes");
319 }
320
321 if (this.BootstrapperApplicationData)
322 {
323 writer.WriteAttributeString("bootstrapperApplicationData", "yes");
324 }
325
326 foreach (ColumnDefinition columnDefinition in this.Columns)
327 {
328 columnDefinition.Write(writer);
329 }
330
331 writer.WriteEndElement();
332 }
333 }
334}
diff --git a/src/WixToolset.Data.WindowsInstaller/TableDefinitionCollection.cs b/src/WixToolset.Data.WindowsInstaller/TableDefinitionCollection.cs
deleted file mode 100644
index 26d56387..00000000
--- a/src/WixToolset.Data.WindowsInstaller/TableDefinitionCollection.cs
+++ /dev/null
@@ -1,240 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Collections;
7 using System.Collections.Generic;
8 using System.Linq;
9 using System.Xml;
10
11 /// <summary>
12 /// Collection for table definitions indexed by table name.
13 /// </summary>
14 public sealed class TableDefinitionCollection : ICollection<TableDefinition>
15 {
16 public const string XmlNamespaceUri = "http://wixtoolset.org/schemas/v4/wi/tables";
17
18 private Dictionary<string, TableDefinition> collection;
19
20 /// <summary>
21 /// Instantiate a new TableDefinitionCollection class.
22 /// </summary>
23 public TableDefinitionCollection()
24 {
25 this.collection = new Dictionary<string,TableDefinition>();
26 }
27
28 /// <summary>
29 /// Creates a shallow copy of the provided table definition collection.
30 /// </summary>
31 public TableDefinitionCollection(TableDefinitionCollection tableDefinitions)
32 {
33 this.collection = new Dictionary<string, TableDefinition>(tableDefinitions.collection);
34 }
35
36 /// <summary>
37 /// Gets the number of items in the collection.
38 /// </summary>
39 /// <value>Number of items in collection.</value>
40 public int Count
41 {
42 get { return this.collection.Count; }
43 }
44
45 /// <summary>
46 /// Table definition collections are never read-only.
47 /// </summary>
48 public bool IsReadOnly
49 {
50 get { return false; }
51 }
52
53 /// <summary>
54 /// Gets a table definition by name.
55 /// </summary>
56 /// <param name="tableName">Name of table to locate.</param>
57 public TableDefinition this[string tableName]
58 {
59 get
60 {
61 TableDefinition table;
62 if (!this.collection.TryGetValue(tableName, out table))
63 {
64 throw new WixMissingTableDefinitionException(WixDataErrors.MissingTableDefinition(tableName));
65 }
66
67 return table;
68 }
69 }
70
71 /// <summary>
72 /// Tries to get a table definition by name.
73 /// </summary>
74 /// <param name="tableName">Name of table to locate.</param>
75 /// <param name="table">Table definition if found.</param>
76 /// <returns>True if table definition was found otherwise false.</returns>
77 public bool TryGet(string tableName, out TableDefinition table)
78 {
79 return this.collection.TryGetValue(tableName, out table);
80 }
81
82 /// <summary>
83 /// Load a table definition collection from an XmlReader.
84 /// </summary>
85 /// <param name="reader">Reader to get data from.</param>
86 /// <param name="suppressSchema">Suppress xml schema validation while loading.</param>
87 /// <returns>The TableDefinitionCollection represented by the xml.</returns>
88 public static TableDefinitionCollection Load(XmlReader reader)
89 {
90 reader.MoveToContent();
91
92 return Read(reader);
93 }
94
95 /// <summary>
96 /// Adds a table definition to the collection.
97 /// </summary>
98 /// <param name="tableDefinition">Table definition to add to the collection.</param>
99 /// <value>Indexes by table definition name.</value>
100 public void Add(TableDefinition tableDefinition)
101 {
102 this.collection.Add(tableDefinition.Name, tableDefinition);
103 }
104
105 /// <summary>
106 /// Removes all table definitions from the collection.
107 /// </summary>
108 public void Clear()
109 {
110 this.collection.Clear();
111 }
112
113 /// <summary>
114 /// Checks if the collection contains a table name.
115 /// </summary>
116 /// <param name="tableName">The table to check in the collection.</param>
117 /// <returns>True if collection contains the table.</returns>
118 public bool Contains(string tableName)
119 {
120 return this.collection.ContainsKey(tableName);
121 }
122
123 /// <summary>
124 /// Checks if the collection contains a table.
125 /// </summary>
126 /// <param name="table">The table to check in the collection.</param>
127 /// <returns>True if collection contains the table.</returns>
128 public bool Contains(TableDefinition table)
129 {
130 return this.collection.ContainsKey(table.Name);
131 }
132
133 /// <summary>
134 /// Copies table definitions to an arry.
135 /// </summary>
136 /// <param name="array">Array to copy the table definitions to.</param>
137 /// <param name="index">Index in the array to start copying at.</param>
138 public void CopyTo(TableDefinition[] array, int index)
139 {
140 this.collection.Values.CopyTo(array, index);
141 }
142
143 /// <summary>
144 /// Removes a table definition from the collection.
145 /// </summary>
146 /// <param name="table">Table to remove from the collection.</param>
147 /// <returns>True if the table definition existed in the collection and was removed.</returns>
148 public bool Remove(TableDefinition table)
149 {
150 return this.collection.Remove(table.Name);
151 }
152
153 /// <summary>
154 /// Gets enumerator for the collection.
155 /// </summary>
156 /// <returns>Enumerator for the collection.</returns>
157 public IEnumerator<TableDefinition> GetEnumerator()
158 {
159 return this.collection.Values.GetEnumerator();
160 }
161
162 /// <summary>
163 /// Gets the untyped enumerator for the collection.
164 /// </summary>
165 /// <returns>Untyped enumerator for the collection.</returns>
166 IEnumerator IEnumerable.GetEnumerator()
167 {
168 return this.collection.Values.GetEnumerator();
169 }
170
171 /// <summary>
172 /// Loads a collection of table definitions from a XmlReader in memory.
173 /// </summary>
174 /// <param name="reader">Reader to get data from.</param>
175 /// <returns>The TableDefinitionCollection represented by the xml.</returns>
176 internal static TableDefinitionCollection Read(XmlReader reader)
177 {
178 if ("tableDefinitions" != reader.LocalName)
179 {
180 throw new XmlException();
181 }
182
183 bool empty = reader.IsEmptyElement;
184 TableDefinitionCollection tableDefinitionCollection = new TableDefinitionCollection();
185
186 while (reader.MoveToNextAttribute())
187 {
188 }
189
190 // parse the child elements
191 if (!empty)
192 {
193 bool done = false;
194
195 while (!done && reader.Read())
196 {
197 switch (reader.NodeType)
198 {
199 case XmlNodeType.Element:
200 switch (reader.LocalName)
201 {
202 case "tableDefinition":
203 tableDefinitionCollection.Add(TableDefinition.Read(reader));
204 break;
205 default:
206 throw new XmlException();
207 }
208 break;
209 case XmlNodeType.EndElement:
210 done = true;
211 break;
212 }
213 }
214
215 if (!done)
216 {
217 throw new XmlException();
218 }
219 }
220
221 return tableDefinitionCollection;
222 }
223
224 /// <summary>
225 /// Persists a TableDefinitionCollection in an XML format.
226 /// </summary>
227 /// <param name="writer">XmlWriter where the TableDefinitionCollection should persist itself as XML.</param>
228 internal void Write(XmlWriter writer)
229 {
230 writer.WriteStartElement("tableDefinitions", XmlNamespaceUri);
231
232 foreach (TableDefinition tableDefinition in this.collection.Values.OrderBy(t => t.Name))
233 {
234 tableDefinition.Write(writer);
235 }
236
237 writer.WriteEndElement();
238 }
239 }
240}
diff --git a/src/WixToolset.Data.WindowsInstaller/TableExtensions.cs b/src/WixToolset.Data.WindowsInstaller/TableExtensions.cs
deleted file mode 100644
index 1be64ffe..00000000
--- a/src/WixToolset.Data.WindowsInstaller/TableExtensions.cs
+++ /dev/null
@@ -1,23 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System.Collections.Generic;
6 using System.Linq;
7
8 /// <summary>
9 /// Methods that extend <see cref="Table"/>.
10 /// </summary>
11 public static class TableExtensions
12 {
13 /// <summary>
14 /// Gets the rows contained in the table as a particular row type.
15 /// </summary>
16 /// <param name="table">Table to get rows from.</param>
17 /// <remarks>If the <paramref name="table"/> is null, an empty enumerable will be returned.</remarks>
18 public static IEnumerable<T> RowsAs<T>(this Table table) where T : Row
19 {
20 return (null == table) ? Enumerable.Empty<T>() : table.Rows.Cast<T>();
21 }
22 }
23}
diff --git a/src/WixToolset.Data.WindowsInstaller/TableIndexedCollection.cs b/src/WixToolset.Data.WindowsInstaller/TableIndexedCollection.cs
deleted file mode 100644
index 9f85efff..00000000
--- a/src/WixToolset.Data.WindowsInstaller/TableIndexedCollection.cs
+++ /dev/null
@@ -1,153 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Linq;
8
9 /// <summary>
10 /// Collection for tables.
11 /// </summary>
12 public sealed class TableIndexedCollection : ICollection<Table>
13 {
14 private Dictionary<string, Table> collection;
15
16 /// <summary>
17 /// Instantiate a new empty collection.
18 /// </summary>
19 public TableIndexedCollection()
20 {
21 this.collection = new Dictionary<string,Table>();
22 }
23
24 /// <summary>
25 /// Instantiate a new collection populated with a set of tables.
26 /// </summary>
27 /// <param name="tables">Set of tables.</param>
28 public TableIndexedCollection(IEnumerable<Table> tables)
29 {
30 this.collection = tables.ToDictionary(t => t.Name);
31 }
32
33 /// <summary>
34 /// Gets the number of items in the collection.
35 /// </summary>
36 /// <value>Number of items in collection.</value>
37 public int Count
38 {
39 get { return this.collection.Count; }
40 }
41
42 /// <summary>
43 /// Table indexed collection is never read only.
44 /// </summary>
45 public bool IsReadOnly
46 {
47 get { return false; }
48 }
49
50 /// <summary>
51 /// Adds a table to the collection.
52 /// </summary>
53 /// <param name="table">Table to add to the collection.</param>
54 /// <remarks>Indexes the table by name.</remarks>
55 public void Add(Table table)
56 {
57 this.collection.Add(table.Name, table);
58 }
59
60 /// <summary>
61 /// Clear the tables from the collection.
62 /// </summary>
63 public void Clear()
64 {
65 this.collection.Clear();
66 }
67
68 /// <summary>
69 /// Determines if a table is in the collection.
70 /// </summary>
71 /// <param name="table">Table to check if it is in the collection.</param>
72 /// <returns>True if the table name is in the collection, otherwise false.</returns>
73 public bool Contains(Table table)
74 {
75 return this.collection.ContainsKey(table.Name);
76 }
77
78 /// <summary>
79 /// Copies the collection into an array.
80 /// </summary>
81 /// <param name="array">Array to copy the collection into.</param>
82 /// <param name="arrayIndex">Index to start copying from.</param>
83 public void CopyTo(Table[] array, int arrayIndex)
84 {
85 this.collection.Values.CopyTo(array, arrayIndex);
86 }
87
88 /// <summary>
89 /// Remove a table from the collection by name.
90 /// </summary>
91 /// <param name="tableName">Table name to remove from the collection.</param>
92 public void Remove(string tableName)
93 {
94 this.collection.Remove(tableName);
95 }
96
97 /// <summary>
98 /// Remove a table from the collection.
99 /// </summary>
100 /// <param name="table">Table with matching name to remove from the collection.</param>
101 public bool Remove(Table table)
102 {
103 return this.collection.Remove(table.Name);
104 }
105
106 /// <summary>
107 /// Gets an enumerator over the whole collection.
108 /// </summary>
109 /// <returns>Collection enumerator.</returns>
110 public IEnumerator<Table> GetEnumerator()
111 {
112 return this.collection.Values.GetEnumerator();
113 }
114
115 /// <summary>
116 /// Gets an untyped enumerator over the whole collection.
117 /// </summary>
118 /// <returns>Untyped collection enumerator.</returns>
119 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
120 {
121 return this.collection.Values.GetEnumerator();
122 }
123
124 /// <summary>
125 /// Gets a table by name.
126 /// </summary>
127 /// <param name="tableName">Name of table to locate.</param>
128 public Table this[string tableName]
129 {
130 get
131 {
132 Table table;
133 return this.collection.TryGetValue(tableName, out table) ? table : null;
134 }
135
136 set
137 {
138 this.collection[tableName] = value;
139 }
140 }
141
142 /// <summary>
143 /// Tries to find a table by name.
144 /// </summary>
145 /// <param name="tableName">Table name to locate.</param>
146 /// <param name="table">Found table.</param>
147 /// <returns>True if table with table name was found, otherwise false.</returns>
148 public bool TryGetTable(string tableName, out Table table)
149 {
150 return this.collection.TryGetValue(tableName, out table);
151 }
152 }
153}
diff --git a/src/WixToolset.Data.WindowsInstaller/TableOperation.cs b/src/WixToolset.Data.WindowsInstaller/TableOperation.cs
deleted file mode 100644
index 8df44e73..00000000
--- a/src/WixToolset.Data.WindowsInstaller/TableOperation.cs
+++ /dev/null
@@ -1,25 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 /// <summary>
6 /// The table transform operations.
7 /// </summary>
8 public enum TableOperation
9 {
10 /// <summary>
11 /// No operation.
12 /// </summary>
13 None,
14
15 /// <summary>
16 /// Added table.
17 /// </summary>
18 Add,
19
20 /// <summary>
21 /// Dropped table.
22 /// </summary>
23 Drop,
24 }
25}
diff --git a/src/WixToolset.Data.WindowsInstaller/WindowsInstallerStandardInternal.cs b/src/WixToolset.Data.WindowsInstaller/WindowsInstallerStandardInternal.cs
deleted file mode 100644
index cc6754c3..00000000
--- a/src/WixToolset.Data.WindowsInstaller/WindowsInstallerStandardInternal.cs
+++ /dev/null
@@ -1,59 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System.Reflection;
6 using System.Xml;
7 using WixToolset.Data.Rows;
8
9 /// <summary>
10 /// Represents the Windows Installer standard objects.
11 /// </summary>
12 public static class WindowsInstallerStandardInternal
13 {
14 private static readonly object lockObject = new object();
15
16 private static TableDefinitionCollection tableDefinitions;
17 private static WixActionRowCollection standardActions;
18
19 /// <summary>
20 /// Gets the table definitions stored in this assembly.
21 /// </summary>
22 /// <returns>Table definition collection for tables stored in this assembly.</returns>
23 public static TableDefinitionCollection GetTableDefinitions()
24 {
25 lock (lockObject)
26 {
27 if (null == WindowsInstallerStandardInternal.tableDefinitions)
28 {
29 using (XmlReader reader = XmlReader.Create(Assembly.GetExecutingAssembly().GetManifestResourceStream("WixToolset.Data.WindowsInstaller.Data.tables.xml")))
30 {
31 WindowsInstallerStandardInternal.tableDefinitions = TableDefinitionCollection.Load(reader);
32 }
33 }
34 }
35
36 return WindowsInstallerStandardInternal.tableDefinitions;
37 }
38
39 /// <summary>
40 /// Gets the standard actions stored in this assembly.
41 /// </summary>
42 /// <returns>Collection of standard actions in this assembly.</returns>
43 public static WixActionRowCollection GetStandardActionRows()
44 {
45 lock (lockObject)
46 {
47 if (null == WindowsInstallerStandardInternal.standardActions)
48 {
49 using (XmlReader reader = XmlReader.Create(Assembly.GetExecutingAssembly().GetManifestResourceStream("WixToolset.Data.WindowsInstaller.Data.actions.xml")))
50 {
51 WindowsInstallerStandardInternal.standardActions = WixActionRowCollection.Load(reader);
52 }
53 }
54 }
55
56 return WindowsInstallerStandardInternal.standardActions;
57 }
58 }
59}
diff --git a/src/WixToolset.Data.WindowsInstaller/WixInvalidIdtException.cs b/src/WixToolset.Data.WindowsInstaller/WixInvalidIdtException.cs
deleted file mode 100644
index 33fd0591..00000000
--- a/src/WixToolset.Data.WindowsInstaller/WixInvalidIdtException.cs
+++ /dev/null
@@ -1,32 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6
7 /// <summary>
8 /// WiX invalid idt exception.
9 /// </summary>
10 [Serializable]
11 public sealed class WixInvalidIdtException : WixException
12 {
13 /// <summary>
14 /// Instantiate a new WixInvalidIdtException.
15 /// </summary>
16 /// <param name="idtFile">The invalid idt file.</param>
17 public WixInvalidIdtException(string idtFile) :
18 base(WixDataErrors.InvalidIdt(new SourceLineNumber(idtFile), idtFile))
19 {
20 }
21
22 /// <summary>
23 /// Instantiate a new WixInvalidIdtException.
24 /// </summary>
25 /// <param name="idtFile">The invalid idt file.</param>
26 /// <param name="tableName">The table name of the invalid idt file.</param>
27 public WixInvalidIdtException(string idtFile, string tableName) :
28 base(WixDataErrors.InvalidIdt(new SourceLineNumber(idtFile), idtFile, tableName))
29 {
30 }
31 }
32}
diff --git a/src/WixToolset.Data.WindowsInstaller/WixMissingTableDefinitionException.cs b/src/WixToolset.Data.WindowsInstaller/WixMissingTableDefinitionException.cs
deleted file mode 100644
index 6295813b..00000000
--- a/src/WixToolset.Data.WindowsInstaller/WixMissingTableDefinitionException.cs
+++ /dev/null
@@ -1,22 +0,0 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6
7 /// <summary>
8 /// Exception thrown when a table definition is missing.
9 /// </summary>
10 [Serializable]
11 public class WixMissingTableDefinitionException : WixException
12 {
13 /// <summary>
14 /// Instantiate new WixMissingTableDefinitionException.
15 /// </summary>
16 /// <param name="error">Localized error information.</param>
17 public WixMissingTableDefinitionException(MessageEventArgs error)
18 : base(error)
19 {
20 }
21 }
22}
diff --git a/src/WixToolset.Data.WindowsInstaller/WixToolset.Data.WindowsInstaller.csproj b/src/WixToolset.Data.WindowsInstaller/WixToolset.Data.WindowsInstaller.csproj
deleted file mode 100644
index bd8140c3..00000000
--- a/src/WixToolset.Data.WindowsInstaller/WixToolset.Data.WindowsInstaller.csproj
+++ /dev/null
@@ -1,27 +0,0 @@
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<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <Description>Data for Windows Installer</Description>
8 <Title>WiX Toolset Data Windows Installer</Title>
9 </PropertyGroup>
10
11 <ItemGroup>
12 <EmbeddedResource Include="Data\actions.xml" />
13 <EmbeddedResource Include="Data\tables.xml" />
14 </ItemGroup>
15
16 <ItemGroup>
17 <ProjectReference Include="$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj') " />
18 <PackageReference Include="WixToolset.Data" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj') " />
19
20 <ProjectReference Include="$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj') " />
21 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj') " />
22 </ItemGroup>
23
24 <ItemGroup>
25 <PackageReference Include="Nerdbank.GitVersioning" Version="2.0.41" PrivateAssets="all" />
26 </ItemGroup>
27</Project>