diff options
author | Rob Mensching <rob@firegiant.com> | 2017-12-07 14:17:39 -0800 |
---|---|---|
committer | Rob Mensching <rob@firegiant.com> | 2017-12-07 14:17:39 -0800 |
commit | 221da62c05ef2b515eb507c77655514cd0ec32a4 (patch) | |
tree | fabec5b8ac871f17de6fe0aad3e6188b9af42bfb /src | |
parent | ca376995792d2e2a1a7f39760989496702a8f603 (diff) | |
download | wix-221da62c05ef2b515eb507c77655514cd0ec32a4.tar.gz wix-221da62c05ef2b515eb507c77655514cd0ec32a4.tar.bz2 wix-221da62c05ef2b515eb507c77655514cd0ec32a4.zip |
Reintegrate MSI constructs into WxToolset.Data.WindowsInstaller namespace
Diffstat (limited to 'src')
62 files changed, 8105 insertions, 0 deletions
diff --git a/src/WixToolset.Data/WindowsInstaller/ColumnCategory.cs b/src/WixToolset.Data/WindowsInstaller/ColumnCategory.cs new file mode 100644 index 00000000..0d50b7fd --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/ColumnCategory.cs | |||
@@ -0,0 +1,91 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
4 | { | ||
5 | /// <summary> | ||
6 | /// Column validation category type | ||
7 | /// </summary> | ||
8 | public enum ColumnCategory | ||
9 | { | ||
10 | /// <summary>Unknown category, default and invalid.</summary> | ||
11 | Unknown, | ||
12 | |||
13 | /// <summary>Text category.</summary> | ||
14 | Text, | ||
15 | |||
16 | /// <summary>UpperCase category.</summary> | ||
17 | UpperCase, | ||
18 | |||
19 | /// <summary>LowerCase category.</summary> | ||
20 | LowerCase, | ||
21 | |||
22 | /// <summary>Integer category.</summary> | ||
23 | Integer, | ||
24 | |||
25 | /// <summary>DoubleInteger category.</summary> | ||
26 | DoubleInteger, | ||
27 | |||
28 | /// <summary>TimeDate category.</summary> | ||
29 | TimeDate, | ||
30 | |||
31 | /// <summary>Identifier category.</summary> | ||
32 | Identifier, | ||
33 | |||
34 | /// <summary>Property category.</summary> | ||
35 | Property, | ||
36 | |||
37 | /// <summary>Filename category.</summary> | ||
38 | Filename, | ||
39 | |||
40 | /// <summary>WildCardFilename category.</summary> | ||
41 | WildCardFilename, | ||
42 | |||
43 | /// <summary>Path category.</summary> | ||
44 | Path, | ||
45 | |||
46 | /// <summary>Paths category.</summary> | ||
47 | Paths, | ||
48 | |||
49 | /// <summary>AnyPath category.</summary> | ||
50 | AnyPath, | ||
51 | |||
52 | /// <summary>DefaultDir category.</summary> | ||
53 | DefaultDir, | ||
54 | |||
55 | /// <summary>RegPath category.</summary> | ||
56 | RegPath, | ||
57 | |||
58 | /// <summary>Formatted category.</summary> | ||
59 | Formatted, | ||
60 | |||
61 | /// <summary>Template category.</summary> | ||
62 | Template, | ||
63 | |||
64 | /// <summary>Condition category.</summary> | ||
65 | Condition, | ||
66 | |||
67 | /// <summary>Guid category.</summary> | ||
68 | Guid, | ||
69 | |||
70 | /// <summary>Version category.</summary> | ||
71 | Version, | ||
72 | |||
73 | /// <summary>Language category.</summary> | ||
74 | Language, | ||
75 | |||
76 | /// <summary>Binary category.</summary> | ||
77 | Binary, | ||
78 | |||
79 | /// <summary>CustomSource category.</summary> | ||
80 | CustomSource, | ||
81 | |||
82 | /// <summary>Cabinet category.</summary> | ||
83 | Cabinet, | ||
84 | |||
85 | /// <summary>Shortcut category.</summary> | ||
86 | Shortcut, | ||
87 | |||
88 | /// <summary>Formatted SDDL category.</summary> | ||
89 | FormattedSDDLText, | ||
90 | } | ||
91 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/ColumnDefinition.cs b/src/WixToolset.Data/WindowsInstaller/ColumnDefinition.cs new file mode 100644 index 00000000..b6d4f29f --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/ColumnDefinition.cs | |||
@@ -0,0 +1,685 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
4 | { | ||
5 | using System; | ||
6 | using System.Globalization; | ||
7 | using System.Xml; | ||
8 | |||
9 | /// <summary> | ||
10 | /// Definition of a table's column. | ||
11 | /// </summary> | ||
12 | public sealed class ColumnDefinition : IComparable<ColumnDefinition> | ||
13 | { | ||
14 | /// <summary> | ||
15 | /// Creates a new column definition. | ||
16 | /// </summary> | ||
17 | /// <param name="name">Name of column.</param> | ||
18 | /// <param name="type">Type of column</param> | ||
19 | /// <param name="length">Length of column.</param> | ||
20 | /// <param name="primaryKey">If column is primary key.</param> | ||
21 | /// <param name="nullable">If column is nullable.</param> | ||
22 | /// <param name="category">Validation category for column.</param> | ||
23 | /// <param name="minValue">Optional minimum value for the column.</param> | ||
24 | /// <param name="maxValue">Optional maximum value for the colum.</param> | ||
25 | /// <param name="keyTable">Optional name of table for foreign key.</param> | ||
26 | /// <param name="keyColumn">Optional name of column for foreign key.</param> | ||
27 | /// <param name="possibilities">Set of possible values for column.</param> | ||
28 | /// <param name="description">Description of column in vaidation table.</param> | ||
29 | /// <param name="modularizeType">Type of modularization for column</param> | ||
30 | /// <param name="forceLocalizable">If the column is localizable.</param> | ||
31 | /// <param name="useCData">If whitespace should be preserved in a CDATA node.</param> | ||
32 | public ColumnDefinition(string name, ColumnType type, int length, bool primaryKey, bool nullable, ColumnCategory category, long? minValue = null, long? maxValue = null, string keyTable = null, int? keyColumn = null, string possibilities = null, string description = null, ColumnModularizeType? modularizeType = null, bool forceLocalizable = false, bool useCData = false) | ||
33 | { | ||
34 | this.Name = name; | ||
35 | this.Type = type; | ||
36 | this.Length = length; | ||
37 | this.PrimaryKey = primaryKey; | ||
38 | this.Nullable = nullable; | ||
39 | this.ModularizeType = CalculateModularizationType(modularizeType, category); | ||
40 | this.IsLocalizable = forceLocalizable || ColumnType.Localized == type; | ||
41 | this.MinValue = minValue; | ||
42 | this.MaxValue = maxValue; | ||
43 | this.KeyTable = keyTable; | ||
44 | this.KeyColumn = keyColumn; | ||
45 | this.Category = category; | ||
46 | this.Possibilities = possibilities; | ||
47 | this.Description = description; | ||
48 | this.UseCData = useCData; | ||
49 | } | ||
50 | |||
51 | /// <summary> | ||
52 | /// Gets whether this column was added via a transform. | ||
53 | /// </summary> | ||
54 | /// <value>Whether this column was added via a transform.</value> | ||
55 | public bool Added { get; set; } | ||
56 | |||
57 | /// <summary> | ||
58 | /// Gets the name of the column. | ||
59 | /// </summary> | ||
60 | /// <value>Name of column.</value> | ||
61 | public string Name { get; } | ||
62 | |||
63 | /// <summary> | ||
64 | /// Gets the type of the column. | ||
65 | /// </summary> | ||
66 | /// <value>Type of column.</value> | ||
67 | public ColumnType Type { get; } | ||
68 | |||
69 | /// <summary> | ||
70 | /// Gets the length of the column. | ||
71 | /// </summary> | ||
72 | /// <value>Length of column.</value> | ||
73 | public int Length { get; } | ||
74 | |||
75 | /// <summary> | ||
76 | /// Gets if the column is a primary key. | ||
77 | /// </summary> | ||
78 | /// <value>true if column is primary key.</value> | ||
79 | public bool PrimaryKey { get; } | ||
80 | |||
81 | /// <summary> | ||
82 | /// Gets if the column is nullable. | ||
83 | /// </summary> | ||
84 | /// <value>true if column is nullable.</value> | ||
85 | public bool Nullable { get; } | ||
86 | |||
87 | /// <summary> | ||
88 | /// Gets the type of modularization for this column. | ||
89 | /// </summary> | ||
90 | /// <value>Column's modularization type.</value> | ||
91 | public ColumnModularizeType ModularizeType { get; } | ||
92 | |||
93 | /// <summary> | ||
94 | /// Gets if the column is localizable. Can be because the type is localizable, or because the column | ||
95 | /// was explicitly set to be so. | ||
96 | /// </summary> | ||
97 | /// <value>true if column is localizable.</value> | ||
98 | public bool IsLocalizable { get; } | ||
99 | |||
100 | /// <summary> | ||
101 | /// Gets the minimum value for the column. | ||
102 | /// </summary> | ||
103 | /// <value>Minimum value for the column.</value> | ||
104 | public long? MinValue { get; } | ||
105 | |||
106 | /// <summary> | ||
107 | /// Gets the maximum value for the column. | ||
108 | /// </summary> | ||
109 | /// <value>Maximum value for the column.</value> | ||
110 | public long? MaxValue { get; } | ||
111 | |||
112 | /// <summary> | ||
113 | /// Gets the table that has the foreign key for this column | ||
114 | /// </summary> | ||
115 | /// <value>Foreign key table name.</value> | ||
116 | public string KeyTable { get; } | ||
117 | |||
118 | /// <summary> | ||
119 | /// Gets the foreign key column that this column refers to. | ||
120 | /// </summary> | ||
121 | /// <value>Foreign key column.</value> | ||
122 | public int? KeyColumn { get; } | ||
123 | |||
124 | /// <summary> | ||
125 | /// Gets the validation category for this column. | ||
126 | /// </summary> | ||
127 | /// <value>Validation category.</value> | ||
128 | public ColumnCategory Category { get; } | ||
129 | |||
130 | /// <summary> | ||
131 | /// Gets the set of possibilities for this column. | ||
132 | /// </summary> | ||
133 | /// <value>Set of possibilities for this column.</value> | ||
134 | public string Possibilities { get; } | ||
135 | |||
136 | /// <summary> | ||
137 | /// Gets the description for this column. | ||
138 | /// </summary> | ||
139 | /// <value>Description of column.</value> | ||
140 | public string Description { get; } | ||
141 | |||
142 | /// <summary> | ||
143 | /// Gets if whitespace should be preserved in a CDATA node. | ||
144 | /// </summary> | ||
145 | /// <value>true if whitespace should be preserved in a CDATA node.</value> | ||
146 | public bool UseCData { get; } | ||
147 | |||
148 | /// <summary> | ||
149 | /// Parses a column definition in a table definition. | ||
150 | /// </summary> | ||
151 | /// <param name="reader">Reader to get data from.</param> | ||
152 | /// <returns>The ColumnDefintion represented by the Xml.</returns> | ||
153 | internal static ColumnDefinition Read(XmlReader reader) | ||
154 | { | ||
155 | if (!reader.LocalName.Equals("columnDefinition")) | ||
156 | { | ||
157 | throw new XmlException(); | ||
158 | } | ||
159 | |||
160 | bool added = false; | ||
161 | ColumnCategory category = ColumnCategory.Unknown; | ||
162 | string description = null; | ||
163 | bool empty = reader.IsEmptyElement; | ||
164 | int? keyColumn = null; | ||
165 | string keyTable = null; | ||
166 | int length = -1; | ||
167 | bool localizable = false; | ||
168 | long? maxValue = null; | ||
169 | long? minValue = null; | ||
170 | var modularize = ColumnModularizeType.None; | ||
171 | string name = null; | ||
172 | bool nullable = false; | ||
173 | string possibilities = null; | ||
174 | bool primaryKey = false; | ||
175 | var type = ColumnType.Unknown; | ||
176 | bool useCData = false; | ||
177 | |||
178 | // parse the attributes | ||
179 | while (reader.MoveToNextAttribute()) | ||
180 | { | ||
181 | switch (reader.LocalName) | ||
182 | { | ||
183 | case "added": | ||
184 | added = reader.Value.Equals("yes"); | ||
185 | break; | ||
186 | case "category": | ||
187 | switch (reader.Value) | ||
188 | { | ||
189 | case "anyPath": | ||
190 | category = ColumnCategory.AnyPath; | ||
191 | break; | ||
192 | case "binary": | ||
193 | category = ColumnCategory.Binary; | ||
194 | break; | ||
195 | case "cabinet": | ||
196 | category = ColumnCategory.Cabinet; | ||
197 | break; | ||
198 | case "condition": | ||
199 | category = ColumnCategory.Condition; | ||
200 | break; | ||
201 | case "customSource": | ||
202 | category = ColumnCategory.CustomSource; | ||
203 | break; | ||
204 | case "defaultDir": | ||
205 | category = ColumnCategory.DefaultDir; | ||
206 | break; | ||
207 | case "doubleInteger": | ||
208 | category = ColumnCategory.DoubleInteger; | ||
209 | break; | ||
210 | case "filename": | ||
211 | category = ColumnCategory.Filename; | ||
212 | break; | ||
213 | case "formatted": | ||
214 | category = ColumnCategory.Formatted; | ||
215 | break; | ||
216 | case "formattedSddl": | ||
217 | category = ColumnCategory.FormattedSDDLText; | ||
218 | break; | ||
219 | case "guid": | ||
220 | category = ColumnCategory.Guid; | ||
221 | break; | ||
222 | case "identifier": | ||
223 | category = ColumnCategory.Identifier; | ||
224 | break; | ||
225 | case "integer": | ||
226 | category = ColumnCategory.Integer; | ||
227 | break; | ||
228 | case "language": | ||
229 | category = ColumnCategory.Language; | ||
230 | break; | ||
231 | case "lowerCase": | ||
232 | category = ColumnCategory.LowerCase; | ||
233 | break; | ||
234 | case "path": | ||
235 | category = ColumnCategory.Path; | ||
236 | break; | ||
237 | case "paths": | ||
238 | category = ColumnCategory.Paths; | ||
239 | break; | ||
240 | case "property": | ||
241 | category = ColumnCategory.Property; | ||
242 | break; | ||
243 | case "regPath": | ||
244 | category = ColumnCategory.RegPath; | ||
245 | break; | ||
246 | case "shortcut": | ||
247 | category = ColumnCategory.Shortcut; | ||
248 | break; | ||
249 | case "template": | ||
250 | category = ColumnCategory.Template; | ||
251 | break; | ||
252 | case "text": | ||
253 | category = ColumnCategory.Text; | ||
254 | break; | ||
255 | case "timeDate": | ||
256 | category = ColumnCategory.TimeDate; | ||
257 | break; | ||
258 | case "upperCase": | ||
259 | category = ColumnCategory.UpperCase; | ||
260 | break; | ||
261 | case "version": | ||
262 | category = ColumnCategory.Version; | ||
263 | break; | ||
264 | case "wildCardFilename": | ||
265 | category = ColumnCategory.WildCardFilename; | ||
266 | break; | ||
267 | default: | ||
268 | throw new InvalidOperationException(); | ||
269 | } | ||
270 | break; | ||
271 | case "description": | ||
272 | description = reader.Value; | ||
273 | break; | ||
274 | case "keyColumn": | ||
275 | keyColumn = Convert.ToInt32(reader.Value, 10); | ||
276 | break; | ||
277 | case "keyTable": | ||
278 | keyTable = reader.Value; | ||
279 | break; | ||
280 | case "length": | ||
281 | length = Convert.ToInt32(reader.Value, 10); | ||
282 | break; | ||
283 | case "localizable": | ||
284 | localizable = reader.Value.Equals("yes"); | ||
285 | break; | ||
286 | case "maxValue": | ||
287 | maxValue = Convert.ToInt32(reader.Value, 10); | ||
288 | break; | ||
289 | case "minValue": | ||
290 | minValue = Convert.ToInt32(reader.Value, 10); | ||
291 | break; | ||
292 | case "modularize": | ||
293 | switch (reader.Value) | ||
294 | { | ||
295 | case "column": | ||
296 | modularize = ColumnModularizeType.Column; | ||
297 | break; | ||
298 | case "companionFile": | ||
299 | modularize = ColumnModularizeType.CompanionFile; | ||
300 | break; | ||
301 | case "condition": | ||
302 | modularize = ColumnModularizeType.Condition; | ||
303 | break; | ||
304 | case "controlEventArgument": | ||
305 | modularize = ColumnModularizeType.ControlEventArgument; | ||
306 | break; | ||
307 | case "controlText": | ||
308 | modularize = ColumnModularizeType.ControlText; | ||
309 | break; | ||
310 | case "icon": | ||
311 | modularize = ColumnModularizeType.Icon; | ||
312 | break; | ||
313 | case "none": | ||
314 | modularize = ColumnModularizeType.None; | ||
315 | break; | ||
316 | case "property": | ||
317 | modularize = ColumnModularizeType.Property; | ||
318 | break; | ||
319 | case "semicolonDelimited": | ||
320 | modularize = ColumnModularizeType.SemicolonDelimited; | ||
321 | break; | ||
322 | default: | ||
323 | throw new XmlException(); | ||
324 | } | ||
325 | break; | ||
326 | case "name": | ||
327 | switch (reader.Value) | ||
328 | { | ||
329 | case "CREATE": | ||
330 | case "DELETE": | ||
331 | case "DROP": | ||
332 | case "INSERT": | ||
333 | throw new XmlException(); | ||
334 | default: | ||
335 | name = reader.Value; | ||
336 | break; | ||
337 | } | ||
338 | break; | ||
339 | case "nullable": | ||
340 | nullable = reader.Value.Equals("yes"); | ||
341 | break; | ||
342 | case "primaryKey": | ||
343 | primaryKey = reader.Value.Equals("yes"); | ||
344 | break; | ||
345 | case "set": | ||
346 | possibilities = reader.Value; | ||
347 | break; | ||
348 | case "type": | ||
349 | switch (reader.Value) | ||
350 | { | ||
351 | case "localized": | ||
352 | type = ColumnType.Localized; | ||
353 | break; | ||
354 | case "number": | ||
355 | type = ColumnType.Number; | ||
356 | break; | ||
357 | case "object": | ||
358 | type = ColumnType.Object; | ||
359 | break; | ||
360 | case "string": | ||
361 | type = ColumnType.String; | ||
362 | break; | ||
363 | case "preserved": | ||
364 | type = ColumnType.Preserved; | ||
365 | break; | ||
366 | default: | ||
367 | throw new XmlException(); | ||
368 | } | ||
369 | break; | ||
370 | case "useCData": | ||
371 | useCData = reader.Value.Equals("yes"); | ||
372 | break; | ||
373 | } | ||
374 | } | ||
375 | |||
376 | // parse the child elements (there should be none) | ||
377 | if (!empty) | ||
378 | { | ||
379 | bool done = false; | ||
380 | |||
381 | while (!done && reader.Read()) | ||
382 | { | ||
383 | switch (reader.NodeType) | ||
384 | { | ||
385 | case XmlNodeType.Element: | ||
386 | throw new XmlException(); | ||
387 | case XmlNodeType.EndElement: | ||
388 | done = true; | ||
389 | break; | ||
390 | } | ||
391 | } | ||
392 | |||
393 | if (!done) | ||
394 | { | ||
395 | throw new XmlException(); | ||
396 | } | ||
397 | } | ||
398 | |||
399 | ColumnDefinition columnDefinition = new ColumnDefinition(name, type, length, primaryKey, nullable, category, minValue, maxValue, keyTable, keyColumn, possibilities, description, modularize, localizable, useCData); | ||
400 | columnDefinition.Added = added; | ||
401 | |||
402 | return columnDefinition; | ||
403 | } | ||
404 | |||
405 | /// <summary> | ||
406 | /// Persists a ColumnDefinition in an XML format. | ||
407 | /// </summary> | ||
408 | /// <param name="writer">XmlWriter where the Output should persist itself as XML.</param> | ||
409 | internal void Write(XmlWriter writer) | ||
410 | { | ||
411 | writer.WriteStartElement("columnDefinition", TableDefinitionCollection.XmlNamespaceUri); | ||
412 | |||
413 | writer.WriteAttributeString("name", this.Name); | ||
414 | |||
415 | switch (this.Type) | ||
416 | { | ||
417 | case ColumnType.Localized: | ||
418 | writer.WriteAttributeString("type", "localized"); | ||
419 | break; | ||
420 | case ColumnType.Number: | ||
421 | writer.WriteAttributeString("type", "number"); | ||
422 | break; | ||
423 | case ColumnType.Object: | ||
424 | writer.WriteAttributeString("type", "object"); | ||
425 | break; | ||
426 | case ColumnType.String: | ||
427 | writer.WriteAttributeString("type", "string"); | ||
428 | break; | ||
429 | case ColumnType.Preserved: | ||
430 | writer.WriteAttributeString("type", "preserved"); | ||
431 | break; | ||
432 | } | ||
433 | |||
434 | writer.WriteAttributeString("length", this.Length.ToString(CultureInfo.InvariantCulture.NumberFormat)); | ||
435 | |||
436 | if (this.PrimaryKey) | ||
437 | { | ||
438 | writer.WriteAttributeString("primaryKey", "yes"); | ||
439 | } | ||
440 | |||
441 | if (this.Nullable) | ||
442 | { | ||
443 | writer.WriteAttributeString("nullable", "yes"); | ||
444 | } | ||
445 | |||
446 | if (this.IsLocalizable) | ||
447 | { | ||
448 | writer.WriteAttributeString("localizable", "yes"); | ||
449 | } | ||
450 | |||
451 | if (this.Added) | ||
452 | { | ||
453 | writer.WriteAttributeString("added", "yes"); | ||
454 | } | ||
455 | |||
456 | switch (this.ModularizeType) | ||
457 | { | ||
458 | case ColumnModularizeType.Column: | ||
459 | writer.WriteAttributeString("modularize", "column"); | ||
460 | break; | ||
461 | case ColumnModularizeType.CompanionFile: | ||
462 | writer.WriteAttributeString("modularize", "companionFile"); | ||
463 | break; | ||
464 | case ColumnModularizeType.Condition: | ||
465 | writer.WriteAttributeString("modularize", "condition"); | ||
466 | break; | ||
467 | case ColumnModularizeType.ControlEventArgument: | ||
468 | writer.WriteAttributeString("modularize", "controlEventArgument"); | ||
469 | break; | ||
470 | case ColumnModularizeType.ControlText: | ||
471 | writer.WriteAttributeString("modularize", "controlText"); | ||
472 | break; | ||
473 | case ColumnModularizeType.Icon: | ||
474 | writer.WriteAttributeString("modularize", "icon"); | ||
475 | break; | ||
476 | case ColumnModularizeType.None: | ||
477 | // this is the default value | ||
478 | break; | ||
479 | case ColumnModularizeType.Property: | ||
480 | writer.WriteAttributeString("modularize", "property"); | ||
481 | break; | ||
482 | case ColumnModularizeType.SemicolonDelimited: | ||
483 | writer.WriteAttributeString("modularize", "semicolonDelimited"); | ||
484 | break; | ||
485 | } | ||
486 | |||
487 | if (this.MinValue.HasValue) | ||
488 | { | ||
489 | writer.WriteAttributeString("minValue", this.MinValue.Value.ToString(CultureInfo.InvariantCulture.NumberFormat)); | ||
490 | } | ||
491 | |||
492 | if (this.MaxValue.HasValue) | ||
493 | { | ||
494 | writer.WriteAttributeString("maxValue", this.MaxValue.Value.ToString(CultureInfo.InvariantCulture.NumberFormat)); | ||
495 | } | ||
496 | |||
497 | if (!String.IsNullOrEmpty(this.KeyTable)) | ||
498 | { | ||
499 | writer.WriteAttributeString("keyTable", this.KeyTable); | ||
500 | } | ||
501 | |||
502 | if (this.KeyColumn.HasValue) | ||
503 | { | ||
504 | writer.WriteAttributeString("keyColumn", this.KeyColumn.HasValue.ToString(CultureInfo.InvariantCulture.NumberFormat)); | ||
505 | } | ||
506 | |||
507 | switch (this.Category) | ||
508 | { | ||
509 | case ColumnCategory.AnyPath: | ||
510 | writer.WriteAttributeString("category", "anyPath"); | ||
511 | break; | ||
512 | case ColumnCategory.Binary: | ||
513 | writer.WriteAttributeString("category", "binary"); | ||
514 | break; | ||
515 | case ColumnCategory.Cabinet: | ||
516 | writer.WriteAttributeString("category", "cabinet"); | ||
517 | break; | ||
518 | case ColumnCategory.Condition: | ||
519 | writer.WriteAttributeString("category", "condition"); | ||
520 | break; | ||
521 | case ColumnCategory.CustomSource: | ||
522 | writer.WriteAttributeString("category", "customSource"); | ||
523 | break; | ||
524 | case ColumnCategory.DefaultDir: | ||
525 | writer.WriteAttributeString("category", "defaultDir"); | ||
526 | break; | ||
527 | case ColumnCategory.DoubleInteger: | ||
528 | writer.WriteAttributeString("category", "doubleInteger"); | ||
529 | break; | ||
530 | case ColumnCategory.Filename: | ||
531 | writer.WriteAttributeString("category", "filename"); | ||
532 | break; | ||
533 | case ColumnCategory.Formatted: | ||
534 | writer.WriteAttributeString("category", "formatted"); | ||
535 | break; | ||
536 | case ColumnCategory.FormattedSDDLText: | ||
537 | writer.WriteAttributeString("category", "formattedSddl"); | ||
538 | break; | ||
539 | case ColumnCategory.Guid: | ||
540 | writer.WriteAttributeString("category", "guid"); | ||
541 | break; | ||
542 | case ColumnCategory.Identifier: | ||
543 | writer.WriteAttributeString("category", "identifier"); | ||
544 | break; | ||
545 | case ColumnCategory.Integer: | ||
546 | writer.WriteAttributeString("category", "integer"); | ||
547 | break; | ||
548 | case ColumnCategory.Language: | ||
549 | writer.WriteAttributeString("category", "language"); | ||
550 | break; | ||
551 | case ColumnCategory.LowerCase: | ||
552 | writer.WriteAttributeString("category", "lowerCase"); | ||
553 | break; | ||
554 | case ColumnCategory.Path: | ||
555 | writer.WriteAttributeString("category", "path"); | ||
556 | break; | ||
557 | case ColumnCategory.Paths: | ||
558 | writer.WriteAttributeString("category", "paths"); | ||
559 | break; | ||
560 | case ColumnCategory.Property: | ||
561 | writer.WriteAttributeString("category", "property"); | ||
562 | break; | ||
563 | case ColumnCategory.RegPath: | ||
564 | writer.WriteAttributeString("category", "regPath"); | ||
565 | break; | ||
566 | case ColumnCategory.Shortcut: | ||
567 | writer.WriteAttributeString("category", "shortcut"); | ||
568 | break; | ||
569 | case ColumnCategory.Template: | ||
570 | writer.WriteAttributeString("category", "template"); | ||
571 | break; | ||
572 | case ColumnCategory.Text: | ||
573 | writer.WriteAttributeString("category", "text"); | ||
574 | break; | ||
575 | case ColumnCategory.TimeDate: | ||
576 | writer.WriteAttributeString("category", "timeDate"); | ||
577 | break; | ||
578 | case ColumnCategory.UpperCase: | ||
579 | writer.WriteAttributeString("category", "upperCase"); | ||
580 | break; | ||
581 | case ColumnCategory.Version: | ||
582 | writer.WriteAttributeString("category", "version"); | ||
583 | break; | ||
584 | case ColumnCategory.WildCardFilename: | ||
585 | writer.WriteAttributeString("category", "wildCardFilename"); | ||
586 | break; | ||
587 | } | ||
588 | |||
589 | if (!String.IsNullOrEmpty(this.Possibilities)) | ||
590 | { | ||
591 | writer.WriteAttributeString("set", this.Possibilities); | ||
592 | } | ||
593 | |||
594 | if (!String.IsNullOrEmpty(this.Description)) | ||
595 | { | ||
596 | writer.WriteAttributeString("description", this.Description); | ||
597 | } | ||
598 | |||
599 | if (this.UseCData) | ||
600 | { | ||
601 | writer.WriteAttributeString("useCData", "yes"); | ||
602 | } | ||
603 | |||
604 | writer.WriteEndElement(); | ||
605 | } | ||
606 | |||
607 | /// <summary> | ||
608 | /// Compare this column definition to another column definition. | ||
609 | /// </summary> | ||
610 | /// <remarks> | ||
611 | /// Only Windows Installer traits are compared, allowing for updates to WiX-specific table definitions. | ||
612 | /// </remarks> | ||
613 | /// <param name="other">The <see cref="ColumnDefinition"/> to compare with this one.</param> | ||
614 | /// <returns>0 if the columns' core propeties are the same; otherwise, non-0.</returns> | ||
615 | public int CompareTo(ColumnDefinition other) | ||
616 | { | ||
617 | // by definition, this object is greater than null | ||
618 | if (null == other) | ||
619 | { | ||
620 | return 1; | ||
621 | } | ||
622 | |||
623 | // compare column names | ||
624 | int ret = String.Compare(this.Name, other.Name, StringComparison.Ordinal); | ||
625 | |||
626 | // compare column types | ||
627 | if (0 == ret) | ||
628 | { | ||
629 | ret = this.Type == other.Type ? 0 : -1; | ||
630 | |||
631 | // compare column lengths | ||
632 | if (0 == ret) | ||
633 | { | ||
634 | ret = this.Length == other.Length ? 0 : -1; | ||
635 | |||
636 | // compare whether both are primary keys | ||
637 | if (0 == ret) | ||
638 | { | ||
639 | ret = this.PrimaryKey == other.PrimaryKey ? 0 : -1; | ||
640 | |||
641 | // compare nullability | ||
642 | if (0 == ret) | ||
643 | { | ||
644 | ret = this.Nullable == other.Nullable ? 0 : -1; | ||
645 | } | ||
646 | } | ||
647 | } | ||
648 | } | ||
649 | |||
650 | return ret; | ||
651 | } | ||
652 | |||
653 | private static ColumnModularizeType CalculateModularizationType(ColumnModularizeType? modularizeType, ColumnCategory category) | ||
654 | { | ||
655 | if (modularizeType.HasValue) | ||
656 | { | ||
657 | return modularizeType.Value; | ||
658 | } | ||
659 | |||
660 | switch (category) | ||
661 | { | ||
662 | case ColumnCategory.Identifier: | ||
663 | case ColumnCategory.CustomSource: | ||
664 | return ColumnModularizeType.Column; | ||
665 | |||
666 | case ColumnCategory.Condition: | ||
667 | return ColumnModularizeType.Condition; | ||
668 | |||
669 | case ColumnCategory.AnyPath: | ||
670 | case ColumnCategory.Formatted: | ||
671 | case ColumnCategory.FormattedSDDLText: | ||
672 | case ColumnCategory.Path: | ||
673 | case ColumnCategory.Paths: | ||
674 | case ColumnCategory.RegPath: | ||
675 | case ColumnCategory.Template: | ||
676 | return ColumnModularizeType.Property; | ||
677 | |||
678 | case ColumnCategory.Shortcut: | ||
679 | return ColumnModularizeType.Property; | ||
680 | } | ||
681 | |||
682 | return ColumnModularizeType.None; | ||
683 | } | ||
684 | } | ||
685 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/ColumnModularizeType.cs b/src/WixToolset.Data/WindowsInstaller/ColumnModularizeType.cs new file mode 100644 index 00000000..d44f55a7 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/ColumnModularizeType.cs | |||
@@ -0,0 +1,37 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
4 | { | ||
5 | /// <summary> | ||
6 | /// Specifies if the column should be modularized. | ||
7 | /// </summary> | ||
8 | public enum ColumnModularizeType | ||
9 | { | ||
10 | /// <summary>Column should not be modularized.</summary> | ||
11 | None, | ||
12 | |||
13 | /// <summary>Column should be modularized.</summary> | ||
14 | Column, | ||
15 | |||
16 | /// <summary>When the column is an primary or foreign key to the Icon table it should be modularized special.</summary> | ||
17 | Icon, | ||
18 | |||
19 | /// <summary>When the column is a companion file it should be modularized.</summary> | ||
20 | CompanionFile, | ||
21 | |||
22 | /// <summary>Column is a condition and should be modularized.</summary> | ||
23 | Condition, | ||
24 | |||
25 | /// <summary>Special modularization type for the ControlEvent table's Argument column.</summary> | ||
26 | ControlEventArgument, | ||
27 | |||
28 | /// <summary>Special modularization type for the Control table's Text column.</summary> | ||
29 | ControlText, | ||
30 | |||
31 | /// <summary>Any Properties in the column should be modularized.</summary> | ||
32 | Property, | ||
33 | |||
34 | /// <summary>Semi-colon list of keys, all of which need to be modularized.</summary> | ||
35 | SemicolonDelimited, | ||
36 | } | ||
37 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/ColumnType.cs b/src/WixToolset.Data/WindowsInstaller/ColumnType.cs new file mode 100644 index 00000000..423125db --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/ColumnType.cs | |||
@@ -0,0 +1,28 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
4 | { | ||
5 | /// <summary> | ||
6 | /// Defines MSI column types. | ||
7 | /// </summary> | ||
8 | public enum ColumnType | ||
9 | { | ||
10 | /// <summary>Unknown column type, default and invalid.</summary> | ||
11 | Unknown, | ||
12 | |||
13 | /// <summary>Column is a string.</summary> | ||
14 | String, | ||
15 | |||
16 | /// <summary>Column is a localizable string.</summary> | ||
17 | Localized, | ||
18 | |||
19 | /// <summary>Column is a number.</summary> | ||
20 | Number, | ||
21 | |||
22 | /// <summary>Column is a binary stream.</summary> | ||
23 | Object, | ||
24 | |||
25 | /// <summary>Column is a string that is preserved in transforms (like Object).</summary> | ||
26 | Preserved, | ||
27 | } | ||
28 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Field.cs b/src/WixToolset.Data/WindowsInstaller/Field.cs new file mode 100644 index 00000000..11cd2c33 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Field.cs | |||
@@ -0,0 +1,312 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
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.ValidateValue(this.Column, 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.ValidateValue(this.Column, 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 | /// Validate a value for this column. | ||
145 | /// </summary> | ||
146 | /// <param name="value">The value to validate.</param> | ||
147 | /// <returns>Validated value.</returns> | ||
148 | internal object ValidateValue(ColumnDefinition column, object value) | ||
149 | { | ||
150 | if (null == value) | ||
151 | { | ||
152 | if (!column.Nullable) | ||
153 | { | ||
154 | throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Cannot set column '{0}' with a null value because this is a required field.", column.Name)); | ||
155 | } | ||
156 | } | ||
157 | else // check numerical values against their specified minimum and maximum values. | ||
158 | { | ||
159 | if (ColumnType.Number == column.Type && !column.IsLocalizable) | ||
160 | { | ||
161 | // For now all enums in the tables can be represented by integers. This if statement would need to | ||
162 | // be enhanced if that ever changes. | ||
163 | if (value is int || value.GetType().IsEnum) | ||
164 | { | ||
165 | int intValue = (int)value; | ||
166 | |||
167 | // validate the value against the minimum allowed value | ||
168 | if (column.MinValue.HasValue && column.MinValue > intValue) | ||
169 | { | ||
170 | 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}.", column.Name, intValue, column.MinValue)); | ||
171 | } | ||
172 | |||
173 | // validate the value against the maximum allowed value | ||
174 | if (column.MaxValue.HasValue && column.MaxValue < intValue) | ||
175 | { | ||
176 | 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}.", column.Name, intValue, column.MaxValue)); | ||
177 | } | ||
178 | |||
179 | return intValue; | ||
180 | } | ||
181 | else if (value is long longValue) | ||
182 | { | ||
183 | // validate the value against the minimum allowed value | ||
184 | if (column.MinValue.HasValue && column.MinValue > longValue) | ||
185 | { | ||
186 | 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}.", column.Name, longValue, column.MinValue)); | ||
187 | } | ||
188 | |||
189 | // validate the value against the maximum allowed value | ||
190 | if (column.MaxValue.HasValue && column.MaxValue < longValue) | ||
191 | { | ||
192 | 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}.", column.Name, longValue, column.MaxValue)); | ||
193 | } | ||
194 | |||
195 | return longValue; | ||
196 | } | ||
197 | else | ||
198 | { | ||
199 | throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Cannot set number column '{0}' with a value of type '{1}'.", column.Name, value.GetType().ToString())); | ||
200 | } | ||
201 | } | ||
202 | else | ||
203 | { | ||
204 | if (!(value is string)) | ||
205 | { | ||
206 | //throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Cannot set string column '{0}' with a value of type '{1}'.", this.name, value.GetType().ToString())); | ||
207 | return value.ToString(); | ||
208 | } | ||
209 | } | ||
210 | } | ||
211 | |||
212 | return value; | ||
213 | } | ||
214 | |||
215 | /// <summary> | ||
216 | /// Parse a field from the xml. | ||
217 | /// </summary> | ||
218 | /// <param name="reader">XmlReader where the intermediate is persisted.</param> | ||
219 | internal virtual void Read(XmlReader reader) | ||
220 | { | ||
221 | Debug.Assert("field" == reader.LocalName); | ||
222 | |||
223 | bool empty = reader.IsEmptyElement; | ||
224 | |||
225 | while (reader.MoveToNextAttribute()) | ||
226 | { | ||
227 | switch (reader.LocalName) | ||
228 | { | ||
229 | case "modified": | ||
230 | this.Modified = reader.Value.Equals("yes"); | ||
231 | break; | ||
232 | case "previousData": | ||
233 | this.PreviousData = reader.Value; | ||
234 | break; | ||
235 | } | ||
236 | } | ||
237 | |||
238 | if (!empty) | ||
239 | { | ||
240 | bool done = false; | ||
241 | |||
242 | while (!done && reader.Read()) | ||
243 | { | ||
244 | switch (reader.NodeType) | ||
245 | { | ||
246 | case XmlNodeType.Element: | ||
247 | throw new XmlException(); | ||
248 | case XmlNodeType.CDATA: | ||
249 | case XmlNodeType.Text: | ||
250 | case XmlNodeType.SignificantWhitespace: | ||
251 | if (0 < reader.Value.Length) | ||
252 | { | ||
253 | if (ColumnType.Number == this.Column.Type && !this.Column.IsLocalizable) | ||
254 | { | ||
255 | // older wix files could persist data as a long value (which would overflow an int) | ||
256 | // since the Convert class always throws exceptions for overflows, read in integral | ||
257 | // values as a long to avoid the overflow, then cast it to an int (this operation can | ||
258 | // overflow without throwing an exception inside an unchecked block) | ||
259 | this.data = unchecked((int)Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture)); | ||
260 | } | ||
261 | else | ||
262 | { | ||
263 | this.data = reader.Value; | ||
264 | } | ||
265 | } | ||
266 | break; | ||
267 | case XmlNodeType.EndElement: | ||
268 | done = true; | ||
269 | break; | ||
270 | } | ||
271 | } | ||
272 | |||
273 | if (!done) | ||
274 | { | ||
275 | throw new XmlException(); | ||
276 | } | ||
277 | } | ||
278 | } | ||
279 | |||
280 | /// <summary> | ||
281 | /// Persists a field in an XML format. | ||
282 | /// </summary> | ||
283 | /// <param name="writer">XmlWriter where the Field should persist itself as XML.</param> | ||
284 | internal virtual void Write(XmlWriter writer) | ||
285 | { | ||
286 | writer.WriteStartElement("field", Intermediate.XmlNamespaceUri); | ||
287 | |||
288 | if (this.Modified) | ||
289 | { | ||
290 | writer.WriteAttributeString("modified", "yes"); | ||
291 | } | ||
292 | |||
293 | if (null != this.PreviousData) | ||
294 | { | ||
295 | writer.WriteAttributeString("previousData", this.PreviousData); | ||
296 | } | ||
297 | |||
298 | // Convert the data to a string that will persist nicely (nulls as String.Empty). | ||
299 | string text = Convert.ToString(this.data, CultureInfo.InvariantCulture); | ||
300 | if (this.Column.UseCData) | ||
301 | { | ||
302 | writer.WriteCData(text); | ||
303 | } | ||
304 | else | ||
305 | { | ||
306 | writer.WriteString(text); | ||
307 | } | ||
308 | |||
309 | writer.WriteEndElement(); | ||
310 | } | ||
311 | } | ||
312 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/ObjectField.cs b/src/WixToolset.Data/WindowsInstaller/ObjectField.cs new file mode 100644 index 00000000..016693f5 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/ObjectField.cs | |||
@@ -0,0 +1,183 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
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 new file mode 100644 index 00000000..6164622d --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Output.cs | |||
@@ -0,0 +1,274 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
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 | /// Loads an output from a path on disk. | ||
63 | /// </summary> | ||
64 | /// <param name="path">Path to output file saved on disk.</param> | ||
65 | /// <param name="suppressVersionCheck">Suppresses wix.dll version mismatch check.</param> | ||
66 | /// <returns>Output object.</returns> | ||
67 | public static Output Load(string path, bool suppressVersionCheck) | ||
68 | { | ||
69 | using (FileStream stream = File.OpenRead(path)) | ||
70 | using (FileStructure fs = FileStructure.Read(stream)) | ||
71 | { | ||
72 | if (FileFormat.Wixout != fs.FileFormat) | ||
73 | { | ||
74 | throw new WixUnexpectedFileFormatException(path, FileFormat.Wixout, fs.FileFormat); | ||
75 | } | ||
76 | |||
77 | Uri uri = new Uri(Path.GetFullPath(path)); | ||
78 | using (XmlReader reader = XmlReader.Create(fs.GetDataStream(), null, uri.AbsoluteUri)) | ||
79 | { | ||
80 | try | ||
81 | { | ||
82 | reader.MoveToContent(); | ||
83 | return Output.Read(reader, suppressVersionCheck); | ||
84 | } | ||
85 | catch (XmlException xe) | ||
86 | { | ||
87 | throw new WixCorruptFileException(path, fs.FileFormat, xe); | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | } | ||
92 | |||
93 | /// <summary> | ||
94 | /// Saves an output to a path on disk. | ||
95 | /// </summary> | ||
96 | /// <param name="path">Path to save output file to on disk.</param> | ||
97 | public void Save(string path) | ||
98 | { | ||
99 | Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(path))); | ||
100 | |||
101 | using (FileStream stream = File.Create(path)) | ||
102 | using (FileStructure fs = FileStructure.Create(stream, FileFormat.Wixout, null)) | ||
103 | using (XmlWriter writer = XmlWriter.Create(fs.GetDataStream())) | ||
104 | { | ||
105 | writer.WriteStartDocument(); | ||
106 | this.Write(writer); | ||
107 | writer.WriteEndDocument(); | ||
108 | } | ||
109 | } | ||
110 | |||
111 | /// <summary> | ||
112 | /// Processes an XmlReader and builds up the output object. | ||
113 | /// </summary> | ||
114 | /// <param name="reader">Reader to get data from.</param> | ||
115 | /// <param name="suppressVersionCheck">Suppresses wix.dll version mismatch check.</param> | ||
116 | /// <returns>The Output represented by the Xml.</returns> | ||
117 | internal static Output Read(XmlReader reader, bool suppressVersionCheck) | ||
118 | { | ||
119 | if (!reader.LocalName.Equals("wixOutput")) | ||
120 | { | ||
121 | throw new XmlException(); | ||
122 | } | ||
123 | |||
124 | bool empty = reader.IsEmptyElement; | ||
125 | Output output = new Output(SourceLineNumber.CreateFromUri(reader.BaseURI)); | ||
126 | Version version = null; | ||
127 | |||
128 | while (reader.MoveToNextAttribute()) | ||
129 | { | ||
130 | switch (reader.LocalName) | ||
131 | { | ||
132 | case "codepage": | ||
133 | output.Codepage = Convert.ToInt32(reader.Value, CultureInfo.InvariantCulture.NumberFormat); | ||
134 | break; | ||
135 | case "type": | ||
136 | switch (reader.Value) | ||
137 | { | ||
138 | case "Bundle": | ||
139 | output.Type = OutputType.Bundle; | ||
140 | break; | ||
141 | case "Module": | ||
142 | output.Type = OutputType.Module; | ||
143 | break; | ||
144 | case "Patch": | ||
145 | output.Type = OutputType.Patch; | ||
146 | break; | ||
147 | case "PatchCreation": | ||
148 | output.Type = OutputType.PatchCreation; | ||
149 | break; | ||
150 | case "Product": | ||
151 | output.Type = OutputType.Product; | ||
152 | break; | ||
153 | case "Transform": | ||
154 | output.Type = OutputType.Transform; | ||
155 | break; | ||
156 | default: | ||
157 | throw new XmlException(); | ||
158 | } | ||
159 | break; | ||
160 | case "version": | ||
161 | version = new Version(reader.Value); | ||
162 | break; | ||
163 | } | ||
164 | } | ||
165 | |||
166 | if (!suppressVersionCheck && null != version && !Output.CurrentVersion.Equals(version)) | ||
167 | { | ||
168 | throw new WixException(WixDataErrors.VersionMismatch(SourceLineNumber.CreateFromUri(reader.BaseURI), "wixOutput", version.ToString(), Output.CurrentVersion.ToString())); | ||
169 | } | ||
170 | |||
171 | // loop through the rest of the xml building up the Output object | ||
172 | TableDefinitionCollection tableDefinitions = null; | ||
173 | List<Table> tables = new List<Table>(); | ||
174 | if (!empty) | ||
175 | { | ||
176 | bool done = false; | ||
177 | |||
178 | // loop through all the fields in a row | ||
179 | while (!done && reader.Read()) | ||
180 | { | ||
181 | switch (reader.NodeType) | ||
182 | { | ||
183 | case XmlNodeType.Element: | ||
184 | switch (reader.LocalName) | ||
185 | { | ||
186 | case "subStorage": | ||
187 | output.SubStorages.Add(SubStorage.Read(reader)); | ||
188 | break; | ||
189 | case "table": | ||
190 | if (null == tableDefinitions) | ||
191 | { | ||
192 | throw new XmlException(); | ||
193 | } | ||
194 | tables.Add(Table.Read(reader, tableDefinitions)); | ||
195 | break; | ||
196 | case "tableDefinitions": | ||
197 | tableDefinitions = TableDefinitionCollection.Read(reader); | ||
198 | break; | ||
199 | default: | ||
200 | throw new XmlException(); | ||
201 | } | ||
202 | break; | ||
203 | case XmlNodeType.EndElement: | ||
204 | done = true; | ||
205 | break; | ||
206 | } | ||
207 | } | ||
208 | |||
209 | if (!done) | ||
210 | { | ||
211 | throw new XmlException(); | ||
212 | } | ||
213 | } | ||
214 | |||
215 | output.Tables = new TableIndexedCollection(tables); | ||
216 | return output; | ||
217 | } | ||
218 | |||
219 | /// <summary> | ||
220 | /// Ensure this output contains a particular table. | ||
221 | /// </summary> | ||
222 | /// <param name="tableDefinition">Definition of the table that should exist.</param> | ||
223 | /// <param name="section">Optional section to use for the table. If one is not provided, the entry section will be used.</param> | ||
224 | /// <returns>The table in this output.</returns> | ||
225 | public Table EnsureTable(TableDefinition tableDefinition) | ||
226 | { | ||
227 | if (!this.Tables.TryGetTable(tableDefinition.Name, out Table table)) | ||
228 | { | ||
229 | table = new Table(tableDefinition); | ||
230 | this.Tables.Add(table); | ||
231 | } | ||
232 | |||
233 | return table; | ||
234 | } | ||
235 | |||
236 | /// <summary> | ||
237 | /// Persists an output in an XML format. | ||
238 | /// </summary> | ||
239 | /// <param name="writer">XmlWriter where the Output should persist itself as XML.</param> | ||
240 | internal void Write(XmlWriter writer) | ||
241 | { | ||
242 | writer.WriteStartElement("wixOutput", XmlNamespaceUri); | ||
243 | |||
244 | writer.WriteAttributeString("type", this.Type.ToString()); | ||
245 | |||
246 | if (0 != this.Codepage) | ||
247 | { | ||
248 | writer.WriteAttributeString("codepage", this.Codepage.ToString(CultureInfo.InvariantCulture)); | ||
249 | } | ||
250 | |||
251 | writer.WriteAttributeString("version", Output.CurrentVersion.ToString()); | ||
252 | |||
253 | // Collect all the table definitions and write them. | ||
254 | TableDefinitionCollection tableDefinitions = new TableDefinitionCollection(); | ||
255 | foreach (Table table in this.Tables) | ||
256 | { | ||
257 | tableDefinitions.Add(table.Definition); | ||
258 | } | ||
259 | tableDefinitions.Write(writer); | ||
260 | |||
261 | foreach (Table table in this.Tables.OrderBy(t => t.Name)) | ||
262 | { | ||
263 | table.Write(writer); | ||
264 | } | ||
265 | |||
266 | foreach (SubStorage subStorage in this.SubStorages) | ||
267 | { | ||
268 | subStorage.Write(writer); | ||
269 | } | ||
270 | |||
271 | writer.WriteEndElement(); | ||
272 | } | ||
273 | } | ||
274 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Pdb.cs b/src/WixToolset.Data/WindowsInstaller/Pdb.cs new file mode 100644 index 00000000..41700b0d --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Pdb.cs | |||
@@ -0,0 +1,163 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
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 new file mode 100644 index 00000000..cb8b81d8 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Row.cs | |||
@@ -0,0 +1,387 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
4 | { | ||
5 | using System; | ||
6 | using System.Diagnostics; | ||
7 | using System.Globalization; | ||
8 | using System.Text; | ||
9 | using System.Xml; | ||
10 | |||
11 | /// <summary> | ||
12 | /// Row containing data for a table. | ||
13 | /// </summary> | ||
14 | public class Row | ||
15 | { | ||
16 | private static long rowCount; | ||
17 | |||
18 | /// <summary> | ||
19 | /// Creates a row that belongs to a table. | ||
20 | /// </summary> | ||
21 | /// <param name="sourceLineNumbers">Original source lines for this row.</param> | ||
22 | /// <param name="table">Table this row belongs to and should get its column definitions from.</param> | ||
23 | /// <remarks>The compiler should use this constructor exclusively.</remarks> | ||
24 | public Row(SourceLineNumber sourceLineNumbers, Table table) | ||
25 | : this(sourceLineNumbers, table.Definition) | ||
26 | { | ||
27 | this.Table = table; | ||
28 | } | ||
29 | |||
30 | /// <summary> | ||
31 | /// Creates a row that does not belong to a table. | ||
32 | /// </summary> | ||
33 | /// <param name="sourceLineNumbers">Original source lines for this row.</param> | ||
34 | /// <param name="tableDefinition">TableDefinition this row should get its column definitions from.</param> | ||
35 | /// <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> | ||
36 | public Row(SourceLineNumber sourceLineNumbers, TableDefinition tableDefinition) | ||
37 | { | ||
38 | this.Number = rowCount++; | ||
39 | this.SourceLineNumbers = sourceLineNumbers; | ||
40 | this.Fields = new Field[tableDefinition.Columns.Count]; | ||
41 | this.TableDefinition = tableDefinition; | ||
42 | |||
43 | for (var i = 0; i < this.Fields.Length; ++i) | ||
44 | { | ||
45 | this.Fields[i] = Field.Create(this.TableDefinition.Columns[i]); | ||
46 | } | ||
47 | } | ||
48 | |||
49 | /// <summary> | ||
50 | /// Creates a shallow copy of a row from another row. | ||
51 | /// </summary> | ||
52 | /// <param name="source">The row the data is copied from.</param> | ||
53 | protected Row(Row source) | ||
54 | { | ||
55 | this.Table = source.Table; | ||
56 | this.TableDefinition = source.TableDefinition; | ||
57 | this.Number = source.Number; | ||
58 | this.Operation = source.Operation; | ||
59 | this.Redundant = source.Redundant; | ||
60 | this.SectionId = source.SectionId; | ||
61 | this.SourceLineNumbers = source.SourceLineNumbers; | ||
62 | this.Fields = source.Fields; | ||
63 | } | ||
64 | |||
65 | /// <summary> | ||
66 | /// Gets or sets the row transform operation. | ||
67 | /// </summary> | ||
68 | /// <value>The row transform operation.</value> | ||
69 | public RowOperation Operation { get; set; } | ||
70 | |||
71 | /// <summary> | ||
72 | /// Gets or sets wether the row is a duplicate of another row thus redundant. | ||
73 | /// </summary> | ||
74 | public bool Redundant { get; set; } | ||
75 | |||
76 | /// <summary> | ||
77 | /// Gets or sets the SectionId property on the row. | ||
78 | /// </summary> | ||
79 | /// <value>The SectionId property on the row.</value> | ||
80 | public string SectionId { get; set; } | ||
81 | |||
82 | /// <summary> | ||
83 | /// Gets the source file and line number for the row. | ||
84 | /// </summary> | ||
85 | /// <value>Source file and line number.</value> | ||
86 | public SourceLineNumber SourceLineNumbers { get; } | ||
87 | |||
88 | /// <summary> | ||
89 | /// Gets the table this row belongs to. | ||
90 | /// </summary> | ||
91 | /// <value>null if Row does not belong to a Table, or owner Table otherwise.</value> | ||
92 | public Table Table { get; } | ||
93 | |||
94 | /// <summary> | ||
95 | /// Gets the table definition for this row. | ||
96 | /// </summary> | ||
97 | /// <remarks>A Row always has a TableDefinition, even if the Row does not belong to a Table.</remarks> | ||
98 | /// <value>TableDefinition for Row.</value> | ||
99 | public TableDefinition TableDefinition { get; } | ||
100 | |||
101 | /// <summary> | ||
102 | /// Gets the fields contained by this row. | ||
103 | /// </summary> | ||
104 | /// <value>Array of field objects</value> | ||
105 | public Field[] Fields { get; } | ||
106 | |||
107 | /// <summary> | ||
108 | /// Gets the unique number for the row. | ||
109 | /// </summary> | ||
110 | /// <value>Number for row.</value> | ||
111 | public long Number { get; } | ||
112 | |||
113 | /// <summary> | ||
114 | /// Gets or sets the value of a particular field in the row. | ||
115 | /// </summary> | ||
116 | /// <param name="field">field index.</param> | ||
117 | /// <value>Value of a field in the row.</value> | ||
118 | public object this[int field] | ||
119 | { | ||
120 | get { return this.Fields[field].Data; } | ||
121 | set { this.Fields[field].Data = value; } | ||
122 | } | ||
123 | |||
124 | /// <summary> | ||
125 | /// Gets the field as an integer. | ||
126 | /// </summary> | ||
127 | /// <returns>Field's data as an integer.</returns> | ||
128 | public int FieldAsInteger(int field) | ||
129 | { | ||
130 | return this.Fields[field].AsInteger(); | ||
131 | } | ||
132 | |||
133 | /// <summary> | ||
134 | /// Gets the field as an integer that could be null. | ||
135 | /// </summary> | ||
136 | /// <returns>Field's data as an integer that could be null.</returns> | ||
137 | public int? FieldAsNullableInteger(int field) | ||
138 | { | ||
139 | return this.Fields[field].AsNullableInteger(); | ||
140 | } | ||
141 | |||
142 | /// <summary> | ||
143 | /// Gets the field as a string. | ||
144 | /// </summary> | ||
145 | /// <returns>Field's data as a string.</returns> | ||
146 | public string FieldAsString(int field) | ||
147 | { | ||
148 | return this.Fields[field].AsString(); | ||
149 | } | ||
150 | |||
151 | /// <summary> | ||
152 | /// Sets the value of a particular field in the row without validating. | ||
153 | /// </summary> | ||
154 | /// <param name="field">field index.</param> | ||
155 | /// <param name="value">Value of a field in the row.</param> | ||
156 | /// <returns>True if successful, false if validation failed.</returns> | ||
157 | public bool BestEffortSetField(int field, object value) | ||
158 | { | ||
159 | return this.Fields[field].BestEffortSet(value); | ||
160 | } | ||
161 | |||
162 | /// <summary> | ||
163 | /// Get the value used to represent the row in a keyed row collection. | ||
164 | /// </summary> | ||
165 | /// <returns>Primary key or row number if no primary key is available.</returns> | ||
166 | public string GetKey() | ||
167 | { | ||
168 | return this.GetPrimaryKey() ?? Convert.ToString(this.Number, CultureInfo.InvariantCulture); | ||
169 | } | ||
170 | |||
171 | /// <summary> | ||
172 | /// Get the primary key of this row. | ||
173 | /// </summary> | ||
174 | /// <param name="delimiter">Delimiter character for multiple column primary keys.</param> | ||
175 | /// <returns>The primary key or null if the row's table has no primary key columns.</returns> | ||
176 | public string GetPrimaryKey(char delimiter = '/') | ||
177 | { | ||
178 | return this.GetPrimaryKey(delimiter, String.Empty); | ||
179 | } | ||
180 | |||
181 | /// <summary> | ||
182 | /// Get the primary key of this row. | ||
183 | /// </summary> | ||
184 | /// <param name="delimiter">Delimiter character for multiple column primary keys.</param> | ||
185 | /// <param name="nullReplacement">String to represent null values in the primary key.</param> | ||
186 | /// <returns>The primary key or null if the row's table has no primary key columns.</returns> | ||
187 | public string GetPrimaryKey(char delimiter, string nullReplacement) | ||
188 | { | ||
189 | var foundPrimaryKey = false; | ||
190 | var primaryKey = new StringBuilder(); | ||
191 | |||
192 | foreach (var field in this.Fields) | ||
193 | { | ||
194 | if (field.Column.PrimaryKey) | ||
195 | { | ||
196 | if (foundPrimaryKey) | ||
197 | { | ||
198 | primaryKey.Append(delimiter); | ||
199 | } | ||
200 | |||
201 | primaryKey.Append((null == field.Data) ? nullReplacement : Convert.ToString(field.Data, CultureInfo.InvariantCulture)); | ||
202 | |||
203 | foundPrimaryKey = true; | ||
204 | } | ||
205 | else // primary keys must be the first columns of a row so the first non-primary key means we can stop looking. | ||
206 | { | ||
207 | break; | ||
208 | } | ||
209 | } | ||
210 | |||
211 | return foundPrimaryKey ? primaryKey.ToString() : null; | ||
212 | } | ||
213 | |||
214 | /// <summary> | ||
215 | /// Returns true if the specified field is null or an empty string. | ||
216 | /// </summary> | ||
217 | /// <param name="field">Index of the field to check.</param> | ||
218 | /// <returns>true if the specified field is null or an empty string, false otherwise.</returns> | ||
219 | public bool IsColumnEmpty(int field) | ||
220 | { | ||
221 | if (null == this.Fields[field].Data) | ||
222 | { | ||
223 | return true; | ||
224 | } | ||
225 | |||
226 | string dataString = this.Fields[field].Data as string; | ||
227 | if (null != dataString && 0 == dataString.Length) | ||
228 | { | ||
229 | return true; | ||
230 | } | ||
231 | |||
232 | return false; | ||
233 | } | ||
234 | |||
235 | /// <summary> | ||
236 | /// Tests if the passed in row is identical. | ||
237 | /// </summary> | ||
238 | /// <param name="row">Row to compare against.</param> | ||
239 | /// <returns>True if two rows are identical.</returns> | ||
240 | public bool IsIdentical(Row row) | ||
241 | { | ||
242 | bool identical = (this.TableDefinition.Name == row.TableDefinition.Name && this.Fields.Length == row.Fields.Length); | ||
243 | |||
244 | for (var i = 0; identical && i < this.Fields.Length; ++i) | ||
245 | { | ||
246 | if (!(this.Fields[i].IsIdentical(row.Fields[i]))) | ||
247 | { | ||
248 | identical = false; | ||
249 | } | ||
250 | } | ||
251 | |||
252 | return identical; | ||
253 | } | ||
254 | |||
255 | /// <summary> | ||
256 | /// Returns a string representation of the Row. | ||
257 | /// </summary> | ||
258 | /// <returns>A string representation of the Row.</returns> | ||
259 | public override string ToString() | ||
260 | { | ||
261 | return String.Join("/", (object[])this.Fields); | ||
262 | } | ||
263 | |||
264 | /// <summary> | ||
265 | /// Creates a Row from the XmlReader. | ||
266 | /// </summary> | ||
267 | /// <param name="reader">Reader to get data from.</param> | ||
268 | /// <param name="table">Table for this row.</param> | ||
269 | /// <returns>New row object.</returns> | ||
270 | internal static Row Read(XmlReader reader, Table table) | ||
271 | { | ||
272 | Debug.Assert("row" == reader.LocalName); | ||
273 | |||
274 | bool empty = reader.IsEmptyElement; | ||
275 | RowOperation operation = RowOperation.None; | ||
276 | bool redundant = false; | ||
277 | string sectionId = null; | ||
278 | SourceLineNumber sourceLineNumbers = null; | ||
279 | |||
280 | while (reader.MoveToNextAttribute()) | ||
281 | { | ||
282 | switch (reader.LocalName) | ||
283 | { | ||
284 | case "op": | ||
285 | operation = (RowOperation)Enum.Parse(typeof(RowOperation), reader.Value, true); | ||
286 | break; | ||
287 | case "redundant": | ||
288 | redundant = reader.Value.Equals("yes"); | ||
289 | break; | ||
290 | case "sectionId": | ||
291 | sectionId = reader.Value; | ||
292 | break; | ||
293 | case "sourceLineNumber": | ||
294 | sourceLineNumbers = SourceLineNumber.CreateFromEncoded(reader.Value); | ||
295 | break; | ||
296 | } | ||
297 | } | ||
298 | |||
299 | var row = table.CreateRow(sourceLineNumbers); | ||
300 | row.Operation = operation; | ||
301 | row.Redundant = redundant; | ||
302 | row.SectionId = sectionId; | ||
303 | |||
304 | // loop through all the fields in a row | ||
305 | if (!empty) | ||
306 | { | ||
307 | var done = false; | ||
308 | var field = 0; | ||
309 | |||
310 | // loop through all the fields in a row | ||
311 | while (!done && reader.Read()) | ||
312 | { | ||
313 | switch (reader.NodeType) | ||
314 | { | ||
315 | case XmlNodeType.Element: | ||
316 | switch (reader.LocalName) | ||
317 | { | ||
318 | case "field": | ||
319 | if (row.Fields.Length <= field) | ||
320 | { | ||
321 | if (!reader.IsEmptyElement) | ||
322 | { | ||
323 | throw new XmlException(); | ||
324 | } | ||
325 | } | ||
326 | else | ||
327 | { | ||
328 | row.Fields[field].Read(reader); | ||
329 | } | ||
330 | ++field; | ||
331 | break; | ||
332 | default: | ||
333 | throw new XmlException(); | ||
334 | } | ||
335 | break; | ||
336 | case XmlNodeType.EndElement: | ||
337 | done = true; | ||
338 | break; | ||
339 | } | ||
340 | } | ||
341 | |||
342 | if (!done) | ||
343 | { | ||
344 | throw new XmlException(); | ||
345 | } | ||
346 | } | ||
347 | |||
348 | return row; | ||
349 | } | ||
350 | |||
351 | /// <summary> | ||
352 | /// Persists a row in an XML format. | ||
353 | /// </summary> | ||
354 | /// <param name="writer">XmlWriter where the Row should persist itself as XML.</param> | ||
355 | internal void Write(XmlWriter writer) | ||
356 | { | ||
357 | writer.WriteStartElement("row", Intermediate.XmlNamespaceUri); | ||
358 | |||
359 | if (RowOperation.None != this.Operation) | ||
360 | { | ||
361 | writer.WriteAttributeString("op", this.Operation.ToString().ToLowerInvariant()); | ||
362 | } | ||
363 | |||
364 | if (this.Redundant) | ||
365 | { | ||
366 | writer.WriteAttributeString("redundant", "yes"); | ||
367 | } | ||
368 | |||
369 | if (null != this.SectionId) | ||
370 | { | ||
371 | writer.WriteAttributeString("sectionId", this.SectionId); | ||
372 | } | ||
373 | |||
374 | if (null != this.SourceLineNumbers) | ||
375 | { | ||
376 | writer.WriteAttributeString("sourceLineNumber", this.SourceLineNumbers.GetEncoded()); | ||
377 | } | ||
378 | |||
379 | for (int i = 0; i < this.Fields.Length; ++i) | ||
380 | { | ||
381 | this.Fields[i].Write(writer); | ||
382 | } | ||
383 | |||
384 | writer.WriteEndElement(); | ||
385 | } | ||
386 | } | ||
387 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/RowOperation.cs b/src/WixToolset.Data/WindowsInstaller/RowOperation.cs new file mode 100644 index 00000000..22908d2b --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/RowOperation.cs | |||
@@ -0,0 +1,30 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
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 new file mode 100644 index 00000000..bf962e73 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/BBControlRow.cs | |||
@@ -0,0 +1,113 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..50ef5313 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/ComponentRow.cs | |||
@@ -0,0 +1,244 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using WixToolset.Data.Msi; | ||
6 | |||
7 | /// <summary> | ||
8 | /// Specialization of a row for the Component table. | ||
9 | /// </summary> | ||
10 | public sealed class ComponentRow : Row | ||
11 | { | ||
12 | private string sourceFile; | ||
13 | |||
14 | /// <summary> | ||
15 | /// Creates a Control row that belongs to a table. | ||
16 | /// </summary> | ||
17 | /// <param name="sourceLineNumbers">Original source lines for this row.</param> | ||
18 | /// <param name="table">Table this Component row belongs to and should get its column definitions from.</param> | ||
19 | public ComponentRow(SourceLineNumber sourceLineNumbers, Table table) : | ||
20 | base(sourceLineNumbers, table) | ||
21 | { | ||
22 | } | ||
23 | |||
24 | /// <summary> | ||
25 | /// Gets or sets the identifier for this Component row. | ||
26 | /// </summary> | ||
27 | /// <value>Identifier for this Component row.</value> | ||
28 | public string Component | ||
29 | { | ||
30 | get { return (string)this.Fields[0].Data; } | ||
31 | set { this.Fields[0].Data = value; } | ||
32 | } | ||
33 | |||
34 | /// <summary> | ||
35 | /// Gets or sets the ComponentId for this Component row. | ||
36 | /// </summary> | ||
37 | /// <value>guid for this Component row.</value> | ||
38 | public string Guid | ||
39 | { | ||
40 | get { return (string)this.Fields[1].Data; } | ||
41 | set { this.Fields[1].Data = value; } | ||
42 | } | ||
43 | |||
44 | /// <summary> | ||
45 | /// Gets or sets the Directory_ of the Component. | ||
46 | /// </summary> | ||
47 | /// <value>Directory of the Component.</value> | ||
48 | public string Directory | ||
49 | { | ||
50 | get { return (string)this.Fields[2].Data; } | ||
51 | set { this.Fields[2].Data = value; } | ||
52 | } | ||
53 | |||
54 | /// <summary> | ||
55 | /// Gets or sets the local only attribute of the Component. | ||
56 | /// </summary> | ||
57 | /// <value>Local only attribute of the component.</value> | ||
58 | public bool IsLocalOnly | ||
59 | { | ||
60 | get { return MsiInterop.MsidbComponentAttributesLocalOnly == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesLocalOnly); } | ||
61 | set | ||
62 | { | ||
63 | if (value) | ||
64 | { | ||
65 | this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesLocalOnly; | ||
66 | } | ||
67 | else | ||
68 | { | ||
69 | this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesLocalOnly; | ||
70 | } | ||
71 | } | ||
72 | } | ||
73 | |||
74 | /// <summary> | ||
75 | /// Gets or sets the source only attribute of the Component. | ||
76 | /// </summary> | ||
77 | /// <value>Source only attribute of the component.</value> | ||
78 | public bool IsSourceOnly | ||
79 | { | ||
80 | get { return MsiInterop.MsidbComponentAttributesSourceOnly == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesSourceOnly); } | ||
81 | set | ||
82 | { | ||
83 | if (value) | ||
84 | { | ||
85 | this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesSourceOnly; | ||
86 | } | ||
87 | else | ||
88 | { | ||
89 | this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesSourceOnly; | ||
90 | } | ||
91 | } | ||
92 | } | ||
93 | |||
94 | /// <summary> | ||
95 | /// Gets or sets the optional attribute of the Component. | ||
96 | /// </summary> | ||
97 | /// <value>Optional attribute of the component.</value> | ||
98 | public bool IsOptional | ||
99 | { | ||
100 | get { return MsiInterop.MsidbComponentAttributesOptional == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesOptional); } | ||
101 | set | ||
102 | { | ||
103 | if (value) | ||
104 | { | ||
105 | this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesOptional; | ||
106 | } | ||
107 | else | ||
108 | { | ||
109 | this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesOptional; | ||
110 | } | ||
111 | } | ||
112 | } | ||
113 | |||
114 | /// <summary> | ||
115 | /// Gets or sets the registry key path attribute of the Component. | ||
116 | /// </summary> | ||
117 | /// <value>Registry key path attribute of the component.</value> | ||
118 | public bool IsRegistryKeyPath | ||
119 | { | ||
120 | get { return MsiInterop.MsidbComponentAttributesRegistryKeyPath == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesRegistryKeyPath); } | ||
121 | set | ||
122 | { | ||
123 | if (value) | ||
124 | { | ||
125 | this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesRegistryKeyPath; | ||
126 | } | ||
127 | else | ||
128 | { | ||
129 | this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesRegistryKeyPath; | ||
130 | } | ||
131 | } | ||
132 | } | ||
133 | |||
134 | /// <summary> | ||
135 | /// Gets or sets the shared dll ref count attribute of the Component. | ||
136 | /// </summary> | ||
137 | /// <value>Shared dll ref countattribute of the component.</value> | ||
138 | public bool IsSharedDll | ||
139 | { | ||
140 | get { return MsiInterop.MsidbComponentAttributesSharedDllRefCount == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesSharedDllRefCount); } | ||
141 | set | ||
142 | { | ||
143 | if (value) | ||
144 | { | ||
145 | this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesSharedDllRefCount; | ||
146 | } | ||
147 | else | ||
148 | { | ||
149 | this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesSharedDllRefCount; | ||
150 | } | ||
151 | } | ||
152 | } | ||
153 | |||
154 | /// <summary> | ||
155 | /// Gets or sets the permanent attribute of the Component. | ||
156 | /// </summary> | ||
157 | /// <value>Permanent attribute of the component.</value> | ||
158 | public bool IsPermanent | ||
159 | { | ||
160 | get { return MsiInterop.MsidbComponentAttributesPermanent == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesPermanent); } | ||
161 | set | ||
162 | { | ||
163 | if (value) | ||
164 | { | ||
165 | this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesPermanent; | ||
166 | } | ||
167 | else | ||
168 | { | ||
169 | this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesPermanent; | ||
170 | } | ||
171 | } | ||
172 | } | ||
173 | |||
174 | /// <summary> | ||
175 | /// Gets or sets the ODBC data source key path attribute of the Component. | ||
176 | /// </summary> | ||
177 | /// <value>ODBC data source key path attribute of the component.</value> | ||
178 | public bool IsOdbcDataSourceKeyPath | ||
179 | { | ||
180 | get { return MsiInterop.MsidbComponentAttributesODBCDataSource == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributesODBCDataSource); } | ||
181 | set | ||
182 | { | ||
183 | if (value) | ||
184 | { | ||
185 | this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributesODBCDataSource; | ||
186 | } | ||
187 | else | ||
188 | { | ||
189 | this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributesODBCDataSource; | ||
190 | } | ||
191 | } | ||
192 | } | ||
193 | |||
194 | /// <summary> | ||
195 | /// Gets or sets the 64 bit attribute of the Component. | ||
196 | /// </summary> | ||
197 | /// <value>64-bitness of the component.</value> | ||
198 | public bool Is64Bit | ||
199 | { | ||
200 | get { return MsiInterop.MsidbComponentAttributes64bit == ((int)this.Fields[3].Data & MsiInterop.MsidbComponentAttributes64bit); } | ||
201 | set | ||
202 | { | ||
203 | if (value) | ||
204 | { | ||
205 | this.Fields[3].Data = (int)this.Fields[3].Data | MsiInterop.MsidbComponentAttributes64bit; | ||
206 | } | ||
207 | else | ||
208 | { | ||
209 | this.Fields[3].Data = (int)this.Fields[3].Data & ~MsiInterop.MsidbComponentAttributes64bit; | ||
210 | } | ||
211 | } | ||
212 | } | ||
213 | |||
214 | /// <summary> | ||
215 | /// Gets or sets the condition of the Component. | ||
216 | /// </summary> | ||
217 | /// <value>Condition of the Component.</value> | ||
218 | public string Condition | ||
219 | { | ||
220 | get { return (string)this.Fields[4].Data; } | ||
221 | set { this.Fields[4].Data = value; } | ||
222 | } | ||
223 | |||
224 | /// <summary> | ||
225 | /// Gets or sets the key path of the Component. | ||
226 | /// </summary> | ||
227 | /// <value>Key path of the Component.</value> | ||
228 | public string KeyPath | ||
229 | { | ||
230 | get { return (string)this.Fields[5].Data; } | ||
231 | set { this.Fields[5].Data = value; } | ||
232 | } | ||
233 | |||
234 | /// <summary> | ||
235 | /// Gets or sets the source location to the file to fill in the Text of the control. | ||
236 | /// </summary> | ||
237 | /// <value>Source location to the file to fill in the Text of the control.</value> | ||
238 | public string SourceFile | ||
239 | { | ||
240 | get { return this.sourceFile; } | ||
241 | set { this.sourceFile = value; } | ||
242 | } | ||
243 | } | ||
244 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Rows/ContainerType.cs b/src/WixToolset.Data/WindowsInstaller/Rows/ContainerType.cs new file mode 100644 index 00000000..b983c2a6 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/ContainerType.cs | |||
@@ -0,0 +1,13 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..95289dea --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/ControlRow.cs | |||
@@ -0,0 +1,143 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..7fc34b3d --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/FileRow.cs | |||
@@ -0,0 +1,640 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..b931632f --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/MediaRow.cs | |||
@@ -0,0 +1,80 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..ad5197d9 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/PropertyRow.cs | |||
@@ -0,0 +1,40 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | /// <summary> | ||
6 | /// Specialization of a row for the upgrade table. | ||
7 | /// </summary> | ||
8 | public sealed class PropertyRow : 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 PropertyRow(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>Property identifier for the row.</value> | ||
24 | public string Property | ||
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 value for the row. | ||
32 | /// </summary> | ||
33 | /// <value>Property value for the row.</value> | ||
34 | public string Value | ||
35 | { | ||
36 | get { return (string)this.Fields[1].Data; } | ||
37 | set { this.Fields[1].Data = value; } | ||
38 | } | ||
39 | } | ||
40 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Rows/SummaryInfoRowCollection.cs b/src/WixToolset.Data/WindowsInstaller/Rows/SummaryInfoRowCollection.cs new file mode 100644 index 00000000..fc0410e9 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/SummaryInfoRowCollection.cs | |||
@@ -0,0 +1,41 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using System; | ||
6 | using System.Collections.ObjectModel; | ||
7 | |||
8 | /// <summary> | ||
9 | /// Indexed container class for summary information rows. | ||
10 | /// </summary> | ||
11 | public sealed class SummaryInfoRowCollection : KeyedCollection<int, Row> | ||
12 | { | ||
13 | /// <summary> | ||
14 | /// Creates the keyed collection from existing rows in a table. | ||
15 | /// </summary> | ||
16 | /// <param name="table">The summary information table to index.</param> | ||
17 | public SummaryInfoRowCollection(Table table) | ||
18 | { | ||
19 | if (0 != String.CompareOrdinal("_SummaryInformation", table.Name)) | ||
20 | { | ||
21 | string message = string.Format(WixDataStrings.EXP_UnsupportedTable, table.Name); | ||
22 | throw new ArgumentException(message, "table"); | ||
23 | } | ||
24 | |||
25 | foreach (Row row in table.Rows) | ||
26 | { | ||
27 | this.Add(row); | ||
28 | } | ||
29 | } | ||
30 | |||
31 | /// <summary> | ||
32 | /// Gets the summary property ID for the <paramref name="row"/>. | ||
33 | /// </summary> | ||
34 | /// <param name="row">The row to index.</param> | ||
35 | /// <returns>The summary property ID for the <paramref name="row"/>. | ||
36 | protected override int GetKeyForItem(Row row) | ||
37 | { | ||
38 | return (int)row[0]; | ||
39 | } | ||
40 | } | ||
41 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Rows/UpgradeRow.cs b/src/WixToolset.Data/WindowsInstaller/Rows/UpgradeRow.cs new file mode 100644 index 00000000..d757c8d3 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/UpgradeRow.cs | |||
@@ -0,0 +1,90 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..f7bc784d --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixActionRow.cs | |||
@@ -0,0 +1,118 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using System; | ||
6 | using System.Diagnostics; | ||
7 | using System.Globalization; | ||
8 | using System.Xml; | ||
9 | using WixToolset.Data.Tuples; | ||
10 | |||
11 | /// <summary> | ||
12 | /// Specialization of a row for the sequence tables. | ||
13 | /// </summary> | ||
14 | public sealed class WixActionRow : Row, IComparable | ||
15 | { | ||
16 | /// <summary> | ||
17 | /// Instantiates an ActionRow that belongs to a table. | ||
18 | /// </summary> | ||
19 | /// <param name="sourceLineNumbers">Original source lines for this row.</param> | ||
20 | /// <param name="table">Table this Action row belongs to and should get its column definitions from.</param> | ||
21 | public WixActionRow(SourceLineNumber sourceLineNumbers, Table table) : | ||
22 | base(sourceLineNumbers, table) | ||
23 | { | ||
24 | } | ||
25 | |||
26 | /// <summary> | ||
27 | /// Instantiates an ActionRow by copying data from another ActionRow. | ||
28 | /// </summary> | ||
29 | /// <param name="source">The row the data is copied from.</param> | ||
30 | /// <remarks>The previous and next action collections are not copied.</remarks> | ||
31 | private WixActionRow(WixActionRow source) | ||
32 | : base(source) | ||
33 | { | ||
34 | } | ||
35 | |||
36 | /// <summary> | ||
37 | /// Gets or sets the name of the action. | ||
38 | /// </summary> | ||
39 | /// <value>The name of the action.</value> | ||
40 | public string Action | ||
41 | { | ||
42 | get { return (string)this.Fields[1].Data; } | ||
43 | set { this.Fields[1].Data = value; } | ||
44 | } | ||
45 | |||
46 | /// <summary> | ||
47 | /// Gets the name of the action this action should be scheduled after. | ||
48 | /// </summary> | ||
49 | /// <value>The name of the action this action should be scheduled after.</value> | ||
50 | public string After | ||
51 | { | ||
52 | get { return (string)this.Fields[5].Data; } | ||
53 | set { this.Fields[5].Data = value; } | ||
54 | } | ||
55 | |||
56 | /// <summary> | ||
57 | /// Gets the name of the action this action should be scheduled before. | ||
58 | /// </summary> | ||
59 | /// <value>The name of the action this action should be scheduled before.</value> | ||
60 | public string Before | ||
61 | { | ||
62 | get { return (string)this.Fields[4].Data; } | ||
63 | set { this.Fields[4].Data = value; } | ||
64 | } | ||
65 | |||
66 | /// <summary> | ||
67 | /// Gets or sets the condition of the action. | ||
68 | /// </summary> | ||
69 | /// <value>The condition of the action.</value> | ||
70 | public string Condition | ||
71 | { | ||
72 | get { return (string)this.Fields[2].Data; } | ||
73 | set { this.Fields[2].Data = value; } | ||
74 | } | ||
75 | |||
76 | /// <summary> | ||
77 | /// Gets or sets whether this action is overridable. | ||
78 | /// </summary> | ||
79 | /// <value>Whether this action is overridable.</value> | ||
80 | public bool Overridable | ||
81 | { | ||
82 | get { return (1 == Convert.ToInt32(this.Fields[6].Data, CultureInfo.InvariantCulture)); } | ||
83 | set { this.Fields[6].Data = (value ? 1 : 0); } | ||
84 | } | ||
85 | |||
86 | /// <summary> | ||
87 | /// Gets or sets the sequence number of this action. | ||
88 | /// </summary> | ||
89 | /// <value>The sequence number of this action.</value> | ||
90 | public int Sequence | ||
91 | { | ||
92 | get { return Convert.ToInt32(this.Fields[3].Data, CultureInfo.InvariantCulture); } | ||
93 | set { this.Fields[3].Data = value; } | ||
94 | } | ||
95 | |||
96 | /// <summary> | ||
97 | /// Gets of sets the sequence table of this action. | ||
98 | /// </summary> | ||
99 | /// <value>The sequence table of this action.</value> | ||
100 | public SequenceTable SequenceTable | ||
101 | { | ||
102 | get { return (SequenceTable)Enum.Parse(typeof(SequenceTable), (string)this.Fields[0].Data); } | ||
103 | set { this.Fields[0].Data = value.ToString(); } | ||
104 | } | ||
105 | |||
106 | /// <summary> | ||
107 | /// Compares the current instance with another object of the same type. | ||
108 | /// </summary> | ||
109 | /// <param name="obj">Other reference to compare this one to.</param> | ||
110 | /// <returns>Returns less than 0 for less than, 0 for equals, and greater than 0 for greater.</returns> | ||
111 | public int CompareTo(object obj) | ||
112 | { | ||
113 | WixActionRow otherActionRow = (WixActionRow)obj; | ||
114 | |||
115 | return this.Sequence.CompareTo(otherActionRow.Sequence); | ||
116 | } | ||
117 | } | ||
118 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Rows/WixApprovedExeForElevationRow.cs b/src/WixToolset.Data/WindowsInstaller/Rows/WixApprovedExeForElevationRow.cs new file mode 100644 index 00000000..b3d85c8a --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixApprovedExeForElevationRow.cs | |||
@@ -0,0 +1,78 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | /// <summary> | ||
6 | /// Specialization of a row for the WixApprovedExeForElevation table. | ||
7 | /// </summary> | ||
8 | public class WixApprovedExeForElevationRow : Row | ||
9 | { | ||
10 | /// <summary> | ||
11 | /// Creates an ApprovedExeForElevation 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 ApprovedExeForElevation row belongs to and should get its column definitions from.</param> | ||
15 | public WixApprovedExeForElevationRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) : | ||
16 | base(sourceLineNumbers, tableDef) | ||
17 | { | ||
18 | } | ||
19 | |||
20 | /// <summary> | ||
21 | /// Creates an ApprovedExeForElevation 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 ApprovedExeForElevation row belongs to and should get its column definitions from.</param> | ||
25 | public WixApprovedExeForElevationRow(SourceLineNumber sourceLineNumbers, Table table) | ||
26 | : base(sourceLineNumbers, table) | ||
27 | { | ||
28 | } | ||
29 | |||
30 | /// <summary> | ||
31 | /// Gets or sets the ApprovedExeForElevation identifier. | ||
32 | /// </summary> | ||
33 | /// <value>The ApprovedExeForElevation 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 Key path. | ||
42 | /// </summary> | ||
43 | /// <value>The Key path.</value> | ||
44 | public string Key | ||
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 Value name. | ||
52 | /// </summary> | ||
53 | /// <value>The Value name.</value> | ||
54 | public string ValueName | ||
55 | { | ||
56 | get { return (string)this.Fields[2].Data; } | ||
57 | set { this.Fields[2].Data = value; } | ||
58 | } | ||
59 | |||
60 | /// <summary> | ||
61 | /// Gets or sets the attibutes. | ||
62 | /// </summary> | ||
63 | /// <value>The BundleApprovedExeForElevationAttributes.</value> | ||
64 | public BundleApprovedExeForElevationAttributes Attributes | ||
65 | { | ||
66 | get { return (BundleApprovedExeForElevationAttributes)this.Fields[3].Data; } | ||
67 | set { this.Fields[3].Data = (int)value; } | ||
68 | } | ||
69 | |||
70 | /// <summary> | ||
71 | /// Gets whether this row is 64-bit. | ||
72 | /// </summary> | ||
73 | public bool Win64 | ||
74 | { | ||
75 | get { return BundleApprovedExeForElevationAttributes.Win64 == (this.Attributes & BundleApprovedExeForElevationAttributes.Win64); } | ||
76 | } | ||
77 | } | ||
78 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleCatalogRow.cs b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleCatalogRow.cs new file mode 100644 index 00000000..0bebb5f3 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleCatalogRow.cs | |||
@@ -0,0 +1,50 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..1c138190 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleContainerRow.cs | |||
@@ -0,0 +1,78 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..95fc0f54 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleExePackageRow.cs | |||
@@ -0,0 +1,103 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using WixToolset.Data.Tuples; | ||
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 new file mode 100644 index 00000000..6230a20c --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleMsiFeatureRow.cs | |||
@@ -0,0 +1,93 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..fdd2b6cf --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleMsiPackageRow.cs | |||
@@ -0,0 +1,138 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..baa58f73 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleMsiPropertyRow.cs | |||
@@ -0,0 +1,58 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..23c331fd --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleMspPackageRow.cs | |||
@@ -0,0 +1,101 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using WixToolset.Data.Tuples; | ||
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 new file mode 100644 index 00000000..2a858d07 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleMsuPackageRow.cs | |||
@@ -0,0 +1,57 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..3f23c82c --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundlePackageCommandLineRow.cs | |||
@@ -0,0 +1,80 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | /// <summary> | ||
6 | /// Specialization of a row for the WixBundlePackageCommandLine table. | ||
7 | /// </summary> | ||
8 | public class WixBundlePackageCommandLineRow : Row | ||
9 | { | ||
10 | /// <summary> | ||
11 | /// Creates a WixBundlePackageCommandLineRow 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 WixBundlePackageCommandLineRow row belongs to and should get its column definitions from.</param> | ||
15 | public WixBundlePackageCommandLineRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) : | ||
16 | base(sourceLineNumbers, tableDef) | ||
17 | { | ||
18 | } | ||
19 | |||
20 | /// <summary> | ||
21 | /// Creates an WixBundlePackageCommandLineRow 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 WixBundlePackageCommandLineRow row belongs to and should get its column definitions from.</param> | ||
25 | public WixBundlePackageCommandLineRow(SourceLineNumber sourceLineNumbers, Table table) | ||
26 | : base(sourceLineNumbers, table) | ||
27 | { | ||
28 | } | ||
29 | |||
30 | /// <summary> | ||
31 | /// Gets or sets the package identifier. | ||
32 | /// </summary> | ||
33 | /// <value>The package identifier.</value> | ||
34 | public string ChainPackageId | ||
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 command-line argument for installation. | ||
42 | /// </summary> | ||
43 | /// <value>The command-line argument.</value> | ||
44 | public string InstallArgument | ||
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 command-line argument for uninstallation. | ||
52 | /// </summary> | ||
53 | /// <value>The command-line argument.</value> | ||
54 | public string UninstallArgument | ||
55 | { | ||
56 | get { return (string)this.Fields[2].Data; } | ||
57 | set { this.Fields[2].Data = value; } | ||
58 | } | ||
59 | |||
60 | /// <summary> | ||
61 | /// Gets or sets the command-line argument for repair. | ||
62 | /// </summary> | ||
63 | /// <value>The command-line argument.</value> | ||
64 | public string RepairArgument | ||
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 condition. | ||
72 | /// </summary> | ||
73 | /// <value>The condition.</value> | ||
74 | public string Condition | ||
75 | { | ||
76 | get { return (string)this.Fields[4].Data; } | ||
77 | set { this.Fields[4].Data = value; } | ||
78 | } | ||
79 | } | ||
80 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Rows/WixBundlePackageExitCodeRow.cs b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundlePackageExitCodeRow.cs new file mode 100644 index 00000000..2de40eb2 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundlePackageExitCodeRow.cs | |||
@@ -0,0 +1,53 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using WixToolset.Data.Tuples; | ||
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 new file mode 100644 index 00000000..8a1f438e --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundlePackageRow.cs | |||
@@ -0,0 +1,228 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using WixToolset.Data.Tuples; | ||
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 new file mode 100644 index 00000000..6e05e4b7 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundlePatchTargetCodeRow.cs | |||
@@ -0,0 +1,79 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using System; | ||
6 | |||
7 | /// <summary> | ||
8 | /// Attributes for the PatchTargetCode table. | ||
9 | /// </summary> | ||
10 | [Flags] | ||
11 | public enum WixBundlePatchTargetCodeAttributes : int | ||
12 | { | ||
13 | None = 0, | ||
14 | |||
15 | /// <summary> | ||
16 | /// The transform targets a specific ProductCode. | ||
17 | /// </summary> | ||
18 | TargetsProductCode = 1, | ||
19 | |||
20 | /// <summary> | ||
21 | /// The transform targets a specific UpgradeCode. | ||
22 | /// </summary> | ||
23 | TargetsUpgradeCode = 2, | ||
24 | } | ||
25 | |||
26 | /// <summary> | ||
27 | /// Specialization of a row for the PatchTargetCode table. | ||
28 | /// </summary> | ||
29 | public class WixBundlePatchTargetCodeRow : Row | ||
30 | { | ||
31 | /// <summary> | ||
32 | /// Creates a PatchTargetCodeRow row that does not belong to a table. | ||
33 | /// </summary> | ||
34 | /// <param name="sourceLineNumbers">Original source lines for this row.</param> | ||
35 | /// <param name="tableDef">TableDefinition this PatchTargetCode row belongs to and should get its column definitions from.</param> | ||
36 | public WixBundlePatchTargetCodeRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) : | ||
37 | base(sourceLineNumbers, tableDef) | ||
38 | { | ||
39 | } | ||
40 | |||
41 | /// <summary> | ||
42 | /// Creates a PatchTargetCodeRow 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 PatchTargetCode row belongs to and should get its column definitions from.</param> | ||
46 | public WixBundlePatchTargetCodeRow(SourceLineNumber sourceLineNumbers, Table table) : | ||
47 | base(sourceLineNumbers, table) | ||
48 | { | ||
49 | } | ||
50 | |||
51 | public string MspPackageId | ||
52 | { | ||
53 | get { return (string)this.Fields[0].Data; } | ||
54 | set { this.Fields[0].Data = value; } | ||
55 | } | ||
56 | |||
57 | public string TargetCode | ||
58 | { | ||
59 | get { return (string)this.Fields[1].Data; } | ||
60 | set { this.Fields[1].Data = value; } | ||
61 | } | ||
62 | |||
63 | public WixBundlePatchTargetCodeAttributes Attributes | ||
64 | { | ||
65 | get { return (WixBundlePatchTargetCodeAttributes)this.Fields[2].Data; } | ||
66 | set { this.Fields[2].Data = (int)value; } | ||
67 | } | ||
68 | |||
69 | public bool TargetsProductCode | ||
70 | { | ||
71 | get { return 0 != (WixBundlePatchTargetCodeAttributes.TargetsProductCode & this.Attributes); } | ||
72 | } | ||
73 | |||
74 | public bool TargetsUpgradeCode | ||
75 | { | ||
76 | get { return 0 != (WixBundlePatchTargetCodeAttributes.TargetsUpgradeCode & this.Attributes); } | ||
77 | } | ||
78 | } | ||
79 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Rows/WixBundlePayloadRow.cs b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundlePayloadRow.cs new file mode 100644 index 00000000..ca4d35cc --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundlePayloadRow.cs | |||
@@ -0,0 +1,185 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..5b0d2a18 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleRelatedPackageRow.cs | |||
@@ -0,0 +1,87 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..434a19e3 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleRollbackBoundaryRow.cs | |||
@@ -0,0 +1,59 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..22538606 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleRow.cs | |||
@@ -0,0 +1,228 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..0fea725f --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleSlipstreamMspRow.cs | |||
@@ -0,0 +1,48 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..68360ae9 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleUpdateRow.cs | |||
@@ -0,0 +1,36 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | /// <summary> | ||
6 | /// Bundle update info for binding Bundles. | ||
7 | /// </summary> | ||
8 | public class WixBundleUpdateRow : Row | ||
9 | { | ||
10 | /// <summary> | ||
11 | /// Creates a WixBundleUpdateRow 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 WixBundleUpdateRow row belongs to and should get its column definitions from.</param> | ||
15 | public WixBundleUpdateRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) : | ||
16 | base(sourceLineNumbers, tableDef) | ||
17 | { | ||
18 | } | ||
19 | |||
20 | /// <summary> | ||
21 | /// Creates a WixBundleUpdateRow 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 WixBundleUpdateRow row belongs to and should get its column definitions from.</param> | ||
25 | public WixBundleUpdateRow(SourceLineNumber sourceLineNumbers, Table table) : | ||
26 | base(sourceLineNumbers, table) | ||
27 | { | ||
28 | } | ||
29 | |||
30 | public string Location | ||
31 | { | ||
32 | get { return (string)this.Fields[0].Data; } | ||
33 | set { this.Fields[0].Data = value; } | ||
34 | } | ||
35 | } | ||
36 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleVariableRow.cs b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleVariableRow.cs new file mode 100644 index 00000000..64fa0336 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixBundleVariableRow.cs | |||
@@ -0,0 +1,80 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..8e08d613 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixChainItemRow.cs | |||
@@ -0,0 +1,39 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..78ba9766 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixChainRow.cs | |||
@@ -0,0 +1,65 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using WixToolset.Data.Tuples; | ||
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 new file mode 100644 index 00000000..2abd7656 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixComplexReferenceRow.cs | |||
@@ -0,0 +1,202 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using System; | ||
6 | using System.Diagnostics.CodeAnalysis; | ||
7 | |||
8 | /// <summary> | ||
9 | /// Specialization of a row for the WixComplexReference table. | ||
10 | /// </summary> | ||
11 | public sealed class WixComplexReferenceRow : Row, IComparable | ||
12 | { | ||
13 | /// <summary> | ||
14 | /// Creates a WixComplexReferenceRow row that belongs to a table. | ||
15 | /// </summary> | ||
16 | /// <param name="sourceLineNumbers">Original source lines for this row.</param> | ||
17 | /// <param name="table">Table this row belongs to and should get its column definitions from.</param> | ||
18 | public WixComplexReferenceRow(SourceLineNumber sourceLineNumbers, Table table) | ||
19 | : base(sourceLineNumbers, table) | ||
20 | { | ||
21 | } | ||
22 | |||
23 | /// <summary> | ||
24 | /// Gets the parent type of the complex reference. | ||
25 | /// </summary> | ||
26 | /// <value>Parent type of the complex reference.</value> | ||
27 | public ComplexReferenceParentType ParentType | ||
28 | { | ||
29 | get { return (ComplexReferenceParentType)Enum.ToObject(typeof(ComplexReferenceParentType), (int)this.Fields[1].Data); } | ||
30 | set { this.Fields[1].Data = (int)value; } | ||
31 | } | ||
32 | |||
33 | /// <summary> | ||
34 | /// Gets or sets the parent identifier of the complex reference. | ||
35 | /// </summary> | ||
36 | /// <value>Parent identifier of the complex reference.</value> | ||
37 | public string ParentId | ||
38 | { | ||
39 | get { return (string)this.Fields[0].Data; } | ||
40 | set { this.Fields[0].Data = value; } | ||
41 | } | ||
42 | |||
43 | /// <summary> | ||
44 | /// Gets the parent language of the complex reference. | ||
45 | /// </summary> | ||
46 | /// <value>Parent language of the complex reference.</value> | ||
47 | public string ParentLanguage | ||
48 | { | ||
49 | get { return (string)this.Fields[2].Data; } | ||
50 | set { this.Fields[2].Data = value; } | ||
51 | } | ||
52 | |||
53 | /// <summary> | ||
54 | /// Gets the child type of the complex reference. | ||
55 | /// </summary> | ||
56 | /// <value>Child type of the complex reference.</value> | ||
57 | public ComplexReferenceChildType ChildType | ||
58 | { | ||
59 | get { return (ComplexReferenceChildType)Enum.ToObject(typeof(ComplexReferenceChildType), (int)this.Fields[4].Data); } | ||
60 | set { this.Fields[4].Data = (int)value; } | ||
61 | } | ||
62 | |||
63 | /// <summary> | ||
64 | /// Gets the child identifier of the complex reference. | ||
65 | /// </summary> | ||
66 | /// <value>Child identifier of the complex reference.</value> | ||
67 | public string ChildId | ||
68 | { | ||
69 | get { return (string)this.Fields[3].Data; } | ||
70 | set { this.Fields[3].Data = value; } | ||
71 | } | ||
72 | |||
73 | /// <summary> | ||
74 | /// Gets if this is the primary complex reference. | ||
75 | /// </summary> | ||
76 | /// <value>true if primary complex reference.</value> | ||
77 | public bool IsPrimary | ||
78 | { | ||
79 | get | ||
80 | { | ||
81 | return (0x1 == ((int)this.Fields[5].Data & 0x1)); | ||
82 | } | ||
83 | |||
84 | set | ||
85 | { | ||
86 | if (null == this.Fields[5].Data) | ||
87 | { | ||
88 | this.Fields[5].Data = 0; | ||
89 | } | ||
90 | |||
91 | if (value) | ||
92 | { | ||
93 | this.Fields[5].Data = (int)this.Fields[5].Data | 0x1; | ||
94 | } | ||
95 | else | ||
96 | { | ||
97 | this.Fields[5].Data = (int)this.Fields[5].Data & ~0x1; | ||
98 | } | ||
99 | } | ||
100 | } | ||
101 | |||
102 | /// <summary> | ||
103 | /// Determines if two complex references are equivalent. | ||
104 | /// </summary> | ||
105 | /// <param name="obj">Complex reference to compare.</param> | ||
106 | /// <returns>True if complex references are equivalent.</returns> | ||
107 | public override bool Equals(object obj) | ||
108 | { | ||
109 | return 0 == this.CompareTo(obj); | ||
110 | } | ||
111 | |||
112 | /// <summary> | ||
113 | /// Gets the hash code for the complex reference. | ||
114 | /// </summary> | ||
115 | /// <returns>Hash code for the complex reference.</returns> | ||
116 | public override int GetHashCode() | ||
117 | { | ||
118 | return this.ChildType.GetHashCode() ^ this.ChildId.GetHashCode() ^ this.ParentType.GetHashCode() ^ this.ParentLanguage.GetHashCode() ^ this.ParentId.GetHashCode() ^ this.IsPrimary.GetHashCode(); | ||
119 | } | ||
120 | |||
121 | /// <summary> | ||
122 | /// Compares two complex references. | ||
123 | /// </summary> | ||
124 | /// <param name="obj">Complex reference to compare to.</param> | ||
125 | /// <returns>Zero if the objects are equivalent, negative number if the provided object is less, positive if greater.</returns> | ||
126 | public int CompareTo(object obj) | ||
127 | { | ||
128 | int comparison = this.CompareToWithoutConsideringPrimary(obj); | ||
129 | if (0 == comparison) | ||
130 | { | ||
131 | 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" | ||
132 | } | ||
133 | return comparison; | ||
134 | } | ||
135 | |||
136 | /// <summary> | ||
137 | /// Compares two complex references without considering the primary bit. | ||
138 | /// </summary> | ||
139 | /// <param name="obj">Complex reference to compare to.</param> | ||
140 | /// <returns>Zero if the objects are equivalent, negative number if the provided object is less, positive if greater.</returns> | ||
141 | [SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "System.ArgumentException.#ctor(System.String,System.String)")] | ||
142 | public int CompareToWithoutConsideringPrimary(object obj) | ||
143 | { | ||
144 | var other = obj as WixComplexReferenceRow ?? throw new ArgumentNullException(nameof(obj)); | ||
145 | |||
146 | int comparison = this.ChildType - other.ChildType; | ||
147 | if (0 == comparison) | ||
148 | { | ||
149 | comparison = String.Compare(this.ChildId, other.ChildId, StringComparison.Ordinal); | ||
150 | if (0 == comparison) | ||
151 | { | ||
152 | comparison = this.ParentType - other.ParentType; | ||
153 | if (0 == comparison) | ||
154 | { | ||
155 | string thisParentLanguage = null == this.ParentLanguage ? String.Empty : this.ParentLanguage; | ||
156 | string otherParentLanguage = null == other.ParentLanguage ? String.Empty : other.ParentLanguage; | ||
157 | comparison = String.Compare(thisParentLanguage, otherParentLanguage, StringComparison.Ordinal); | ||
158 | if (0 == comparison) | ||
159 | { | ||
160 | comparison = String.Compare(this.ParentId, other.ParentId, StringComparison.Ordinal); | ||
161 | } | ||
162 | } | ||
163 | } | ||
164 | } | ||
165 | |||
166 | return comparison; | ||
167 | } | ||
168 | |||
169 | /// <summary> | ||
170 | /// Creates a shallow copy of the ComplexReference. | ||
171 | /// </summary> | ||
172 | /// <returns>A shallow copy of the ComplexReference.</returns> | ||
173 | public WixComplexReferenceRow Clone() | ||
174 | { | ||
175 | WixComplexReferenceRow wixComplexReferenceRow = new WixComplexReferenceRow(this.SourceLineNumbers, this.Table); | ||
176 | wixComplexReferenceRow.ParentType = this.ParentType; | ||
177 | wixComplexReferenceRow.ParentId = this.ParentId; | ||
178 | wixComplexReferenceRow.ParentLanguage = this.ParentLanguage; | ||
179 | wixComplexReferenceRow.ChildType = this.ChildType; | ||
180 | wixComplexReferenceRow.ChildId = this.ChildId; | ||
181 | wixComplexReferenceRow.IsPrimary = this.IsPrimary; | ||
182 | |||
183 | return wixComplexReferenceRow; | ||
184 | } | ||
185 | |||
186 | /// <summary> | ||
187 | /// Changes all of the parent references to point to the passed in parent reference. | ||
188 | /// </summary> | ||
189 | /// <param name="parent">New parent complex reference.</param> | ||
190 | public void Reparent(WixComplexReferenceRow parent) | ||
191 | { | ||
192 | this.ParentId = parent.ParentId; | ||
193 | this.ParentLanguage = parent.ParentLanguage; | ||
194 | this.ParentType = parent.ParentType; | ||
195 | |||
196 | if (!this.IsPrimary) | ||
197 | { | ||
198 | this.IsPrimary = parent.IsPrimary; | ||
199 | } | ||
200 | } | ||
201 | } | ||
202 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Rows/WixDeltaPatchFileRow.cs b/src/WixToolset.Data/WindowsInstaller/Rows/WixDeltaPatchFileRow.cs new file mode 100644 index 00000000..9edcea92 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixDeltaPatchFileRow.cs | |||
@@ -0,0 +1,142 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..13899bd0 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixDeltaPatchSymbolPathsRow.cs | |||
@@ -0,0 +1,60 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..302272c4 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixFileRow.cs | |||
@@ -0,0 +1,163 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using WixToolset.Data.Tuples; | ||
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 new file mode 100644 index 00000000..e59df729 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixGroupRow.cs | |||
@@ -0,0 +1,62 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..dfe40c35 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixMediaRow.cs | |||
@@ -0,0 +1,60 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..b2a64356 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixMediaTemplateRow.cs | |||
@@ -0,0 +1,81 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..ac60452e --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixMergeRow.cs | |||
@@ -0,0 +1,147 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using System; | ||
6 | using System.Globalization; | ||
7 | |||
8 | /// <summary> | ||
9 | /// Specialization of a row for tracking merge statements. | ||
10 | /// </summary> | ||
11 | public sealed class WixMergeRow : Row | ||
12 | { | ||
13 | /// <summary> | ||
14 | /// Creates a Merge 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 Merge row belongs to and should get its column definitions from.</param> | ||
18 | public WixMergeRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) : | ||
19 | base(sourceLineNumbers, tableDef) | ||
20 | { | ||
21 | } | ||
22 | |||
23 | /// <summary>Creates a Merge row that belongs to a table.</summary> | ||
24 | /// <param name="sourceLineNumbers">Original source lines for this row.</param> | ||
25 | /// <param name="table">Table this Merge row belongs to and should get its column definitions from.</param> | ||
26 | public WixMergeRow(SourceLineNumber sourceLineNumbers, Table table) : | ||
27 | base(sourceLineNumbers, table) | ||
28 | { | ||
29 | } | ||
30 | |||
31 | /// <summary> | ||
32 | /// Gets and sets the id for a merge row. | ||
33 | /// </summary> | ||
34 | /// <value>Id for the row.</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 and sets the language for a merge row. | ||
43 | /// </summary> | ||
44 | /// <value>Language for the row.</value> | ||
45 | public string Language | ||
46 | { | ||
47 | get { return (string)this.Fields[1].Data; } | ||
48 | set { this.Fields[1].Data = value; } | ||
49 | } | ||
50 | |||
51 | /// <summary> | ||
52 | /// Gets and sets the directory for a merge row. | ||
53 | /// </summary> | ||
54 | /// <value>Direcotory for the row.</value> | ||
55 | public string Directory | ||
56 | { | ||
57 | get { return (string)this.Fields[2].Data; } | ||
58 | set { this.Fields[2].Data = value; } | ||
59 | } | ||
60 | |||
61 | /// <summary> | ||
62 | /// Gets and sets the path to the merge module for a merge row. | ||
63 | /// </summary> | ||
64 | /// <value>Source path for the row.</value> | ||
65 | public string SourceFile | ||
66 | { | ||
67 | get { return (string)this.Fields[3].Data; } | ||
68 | set { this.Fields[3].Data = value; } | ||
69 | } | ||
70 | |||
71 | /// <summary> | ||
72 | /// Gets and sets the disk id the merge module should be placed on for a merge row. | ||
73 | /// </summary> | ||
74 | /// <value>Disk identifier for row.</value> | ||
75 | public int DiskId | ||
76 | { | ||
77 | get { return (int)this.Fields[4].Data; } | ||
78 | set { this.Fields[4].Data = value; } | ||
79 | } | ||
80 | |||
81 | /// <summary> | ||
82 | /// Gets and sets the compression value for a merge row. | ||
83 | /// </summary> | ||
84 | /// <value>Compression for a merge row.</value> | ||
85 | public YesNoType FileCompression | ||
86 | { | ||
87 | get | ||
88 | { | ||
89 | if (null == this.Fields[5].Data) | ||
90 | { | ||
91 | return YesNoType.NotSet; | ||
92 | } | ||
93 | else if (1 == (int)this.Fields[5].Data) | ||
94 | { | ||
95 | return YesNoType.Yes; | ||
96 | } | ||
97 | else if (0 == (int)this.Fields[5].Data) | ||
98 | { | ||
99 | return YesNoType.No; | ||
100 | } | ||
101 | else | ||
102 | { | ||
103 | throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture, WixDataStrings.EXP_MergeTableFileCompressionColumnContainsInvalidValue, this.Fields[5].Data)); | ||
104 | } | ||
105 | } | ||
106 | set | ||
107 | { | ||
108 | if (YesNoType.Yes == value) | ||
109 | { | ||
110 | this.Fields[5].Data = 1; | ||
111 | } | ||
112 | else if (YesNoType.No == value) | ||
113 | { | ||
114 | this.Fields[5].Data = 0; | ||
115 | } | ||
116 | else if (YesNoType.NotSet == value) | ||
117 | { | ||
118 | this.Fields[5].Data = null; | ||
119 | } | ||
120 | else | ||
121 | { | ||
122 | throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture, WixDataStrings.EXP_CannotSetMergeTableFileCompressionColumnToInvalidValue, value)); | ||
123 | } | ||
124 | } | ||
125 | } | ||
126 | |||
127 | /// <summary> | ||
128 | /// Gets and sets the configuration data for a merge row. | ||
129 | /// </summary> | ||
130 | /// <value>Comma delimited string of "name=value" pairs.</value> | ||
131 | public string ConfigurationData | ||
132 | { | ||
133 | get { return (string)this.Fields[6].Data; } | ||
134 | set { this.Fields[6].Data = value; } | ||
135 | } | ||
136 | |||
137 | /// <summary> | ||
138 | /// Gets and sets the primary feature for a merge row. | ||
139 | /// </summary> | ||
140 | /// <value>The primary feature for a merge row.</value> | ||
141 | public string Feature | ||
142 | { | ||
143 | get { return (string)this.Fields[7].Data; } | ||
144 | set { this.Fields[7].Data = value; } | ||
145 | } | ||
146 | } | ||
147 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Rows/WixPayloadPropertiesRow.cs b/src/WixToolset.Data/WindowsInstaller/Rows/WixPayloadPropertiesRow.cs new file mode 100644 index 00000000..8bb9ef31 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixPayloadPropertiesRow.cs | |||
@@ -0,0 +1,72 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | /// <summary> | ||
6 | /// Specialization of a row for the WixPayloadProperties table. | ||
7 | /// </summary> | ||
8 | public class WixPayloadPropertiesRow : Row | ||
9 | { | ||
10 | /// <summary> | ||
11 | /// Creates a WixPayloadProperties 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 WixPayloadProperties row belongs to and should get its column definitions from.</param> | ||
15 | public WixPayloadPropertiesRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDef) : | ||
16 | base(sourceLineNumbers, tableDef) | ||
17 | { | ||
18 | } | ||
19 | |||
20 | /// <summary> | ||
21 | /// Creates a WixPayloadProperties 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 WixPayloadProperties row belongs to and should get its column definitions from.</param> | ||
25 | public WixPayloadPropertiesRow(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 Package | ||
37 | { | ||
38 | get { return (string)this.Fields[1].Data; } | ||
39 | set { this.Fields[1].Data = value; } | ||
40 | } | ||
41 | |||
42 | public string Container | ||
43 | { | ||
44 | get { return (string)this.Fields[2].Data; } | ||
45 | set { this.Fields[2].Data = value; } | ||
46 | } | ||
47 | |||
48 | public string Name | ||
49 | { | ||
50 | get { return (string)this.Fields[3].Data; } | ||
51 | set { this.Fields[3].Data = value; } | ||
52 | } | ||
53 | |||
54 | public string Size | ||
55 | { | ||
56 | get { return (string)this.Fields[4].Data; } | ||
57 | set { this.Fields[4].Data = value; } | ||
58 | } | ||
59 | |||
60 | public string DownloadUrl | ||
61 | { | ||
62 | get { return (string)this.Fields[5].Data; } | ||
63 | set { this.Fields[5].Data = value; } | ||
64 | } | ||
65 | |||
66 | public string LayoutOnly | ||
67 | { | ||
68 | get { return (string)this.Fields[6].Data; } | ||
69 | set { this.Fields[6].Data = value; } | ||
70 | } | ||
71 | } | ||
72 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Rows/WixPropertyRow.cs b/src/WixToolset.Data/WindowsInstaller/Rows/WixPropertyRow.cs new file mode 100644 index 00000000..2f356b71 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixPropertyRow.cs | |||
@@ -0,0 +1,118 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..d06429c5 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixRelatedBundleRow.cs | |||
@@ -0,0 +1,52 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..bf7dfb0e --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixSimpleReferenceRow.cs | |||
@@ -0,0 +1,61 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.Rows | ||
4 | { | ||
5 | using System; | ||
6 | |||
7 | /// <summary> | ||
8 | /// Specialization of a row for the WixSimpleReference table. | ||
9 | /// </summary> | ||
10 | public sealed class WixSimpleReferenceRow : Row | ||
11 | { | ||
12 | /// <summary> | ||
13 | /// Creates a WixSimpleReferenceRow 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 WixSimpleReferenceRow(SourceLineNumber sourceLineNumbers, Table table) | ||
18 | : base(sourceLineNumbers, table) | ||
19 | { | ||
20 | } | ||
21 | |||
22 | /// <summary> | ||
23 | /// Creates a WixSimpleReferenceRow that belongs to a table. | ||
24 | /// </summary> | ||
25 | /// <param name="sourceLineNumbers">Original source lines for this row.</param> | ||
26 | /// <param name="tableDefinitions">Table definitions for this row.</param> | ||
27 | public WixSimpleReferenceRow(SourceLineNumber sourceLineNumbers, TableDefinition tableDefinitions) | ||
28 | : base(sourceLineNumbers, tableDefinitions) | ||
29 | { | ||
30 | } | ||
31 | |||
32 | /// <summary> | ||
33 | /// Gets or sets the primary keys of the simple reference. | ||
34 | /// </summary> | ||
35 | /// <value>The primary keys of the simple reference.</value> | ||
36 | public string PrimaryKeys | ||
37 | { | ||
38 | get { return (string)this.Fields[1].Data; } | ||
39 | set { this.Fields[1].Data = value; } | ||
40 | } | ||
41 | |||
42 | /// <summary> | ||
43 | /// Gets the symbolic name. | ||
44 | /// </summary> | ||
45 | /// <value>Symbolic name.</value> | ||
46 | public string SymbolicName | ||
47 | { | ||
48 | get { return String.Concat(this.TableName, ":", this.PrimaryKeys); } | ||
49 | } | ||
50 | |||
51 | /// <summary> | ||
52 | /// Gets or sets the table name of the simple reference. | ||
53 | /// </summary> | ||
54 | /// <value>The table name of the simple reference.</value> | ||
55 | public string TableName | ||
56 | { | ||
57 | get { return (string)this.Fields[0].Data; } | ||
58 | set { this.Fields[0].Data = value; } | ||
59 | } | ||
60 | } | ||
61 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/Rows/WixUpdateRegistrationRow.cs b/src/WixToolset.Data/WindowsInstaller/Rows/WixUpdateRegistrationRow.cs new file mode 100644 index 00000000..8602d502 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Rows/WixUpdateRegistrationRow.cs | |||
@@ -0,0 +1,62 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller.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 new file mode 100644 index 00000000..c1981f1b --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/SubStorage.cs | |||
@@ -0,0 +1,109 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
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; } | ||
28 | |||
29 | /// <summary> | ||
30 | /// Gets the substorage data. | ||
31 | /// </summary> | ||
32 | /// <value>The substorage data.</value> | ||
33 | public Output Data { get; } | ||
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 new file mode 100644 index 00000000..7fcc1b31 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/Table.cs | |||
@@ -0,0 +1,333 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
4 | { | ||
5 | using System; | ||
6 | using System.Collections.Generic; | ||
7 | using System.Diagnostics; | ||
8 | using System.Xml; | ||
9 | using WixToolset.Data.WindowsInstaller.Rows; | ||
10 | |||
11 | /// <summary> | ||
12 | /// Object that represents a table in a database. | ||
13 | /// </summary> | ||
14 | public class Table | ||
15 | { | ||
16 | /// <summary> | ||
17 | /// Creates a table. | ||
18 | /// </summary> | ||
19 | /// <param name="tableDefinition">Definition of the table.</param> | ||
20 | public Table(TableDefinition tableDefinition) | ||
21 | { | ||
22 | this.Definition = tableDefinition; | ||
23 | this.Rows = new List<Row>(); | ||
24 | } | ||
25 | |||
26 | /// <summary> | ||
27 | /// Gets the table definition. | ||
28 | /// </summary> | ||
29 | /// <value>Definition of the table.</value> | ||
30 | public TableDefinition Definition { get; } | ||
31 | |||
32 | /// <summary> | ||
33 | /// Gets the name of the table. | ||
34 | /// </summary> | ||
35 | /// <value>Name of the table.</value> | ||
36 | public string Name => this.Definition.Name; | ||
37 | |||
38 | /// <summary> | ||
39 | /// Gets or sets the table transform operation. | ||
40 | /// </summary> | ||
41 | /// <value>The table transform operation.</value> | ||
42 | public TableOperation Operation { get; set; } | ||
43 | |||
44 | /// <summary> | ||
45 | /// Gets the rows contained in the table. | ||
46 | /// </summary> | ||
47 | /// <value>Rows contained in the table.</value> | ||
48 | public IList<Row> Rows { get; } | ||
49 | |||
50 | /// <summary> | ||
51 | /// Creates a new row in the table. | ||
52 | /// </summary> | ||
53 | /// <param name="sourceLineNumbers">Original source lines for this row.</param> | ||
54 | /// <param name="add">Specifies whether to only create the row or add it to the table automatically.</param> | ||
55 | /// <returns>Row created in table.</returns> | ||
56 | public Row CreateRow(SourceLineNumber sourceLineNumbers, bool add = true) | ||
57 | { | ||
58 | Row row; | ||
59 | |||
60 | switch (this.Name) | ||
61 | { | ||
62 | case "BBControl": | ||
63 | row = new BBControlRow(sourceLineNumbers, this); | ||
64 | break; | ||
65 | case "WixBundlePackage": | ||
66 | row = new WixBundlePackageRow(sourceLineNumbers, this); | ||
67 | break; | ||
68 | case "WixBundleExePackage": | ||
69 | row = new WixBundleExePackageRow(sourceLineNumbers, this); | ||
70 | break; | ||
71 | case "WixBundleMsiPackage": | ||
72 | row = new WixBundleMsiPackageRow(sourceLineNumbers, this); | ||
73 | break; | ||
74 | case "WixBundleMspPackage": | ||
75 | row = new WixBundleMspPackageRow(sourceLineNumbers, this); | ||
76 | break; | ||
77 | case "WixBundleMsuPackage": | ||
78 | row = new WixBundleMsuPackageRow(sourceLineNumbers, this); | ||
79 | break; | ||
80 | case "Component": | ||
81 | row = new ComponentRow(sourceLineNumbers, this); | ||
82 | break; | ||
83 | case "WixBundleContainer": | ||
84 | row = new WixBundleContainerRow(sourceLineNumbers, this); | ||
85 | break; | ||
86 | case "Control": | ||
87 | row = new ControlRow(sourceLineNumbers, this); | ||
88 | break; | ||
89 | case "File": | ||
90 | row = new FileRow(sourceLineNumbers, this); | ||
91 | break; | ||
92 | case "WixBundleMsiFeature": | ||
93 | row = new WixBundleMsiFeatureRow(sourceLineNumbers, this); | ||
94 | break; | ||
95 | case "WixBundleMsiProperty": | ||
96 | row = new WixBundleMsiPropertyRow(sourceLineNumbers, this); | ||
97 | break; | ||
98 | case "Media": | ||
99 | row = new MediaRow(sourceLineNumbers, this); | ||
100 | break; | ||
101 | case "WixBundlePayload": | ||
102 | row = new WixBundlePayloadRow(sourceLineNumbers, this); | ||
103 | break; | ||
104 | case "Property": | ||
105 | row = new PropertyRow(sourceLineNumbers, this); | ||
106 | break; | ||
107 | case "WixRelatedBundle": | ||
108 | row = new WixRelatedBundleRow(sourceLineNumbers, this); | ||
109 | break; | ||
110 | case "WixBundleRelatedPackage": | ||
111 | row = new WixBundleRelatedPackageRow(sourceLineNumbers, this); | ||
112 | break; | ||
113 | case "WixBundleRollbackBoundary": | ||
114 | row = new WixBundleRollbackBoundaryRow(sourceLineNumbers, this); | ||
115 | break; | ||
116 | case "Upgrade": | ||
117 | row = new UpgradeRow(sourceLineNumbers, this); | ||
118 | break; | ||
119 | case "WixBundleVariable": | ||
120 | row = new WixBundleVariableRow(sourceLineNumbers, this); | ||
121 | break; | ||
122 | case "WixAction": | ||
123 | row = new WixActionRow(sourceLineNumbers, this); | ||
124 | break; | ||
125 | case "WixApprovedExeForElevation": | ||
126 | row = new WixApprovedExeForElevationRow(sourceLineNumbers, this); | ||
127 | break; | ||
128 | case "WixBundle": | ||
129 | row = new WixBundleRow(sourceLineNumbers, this); | ||
130 | break; | ||
131 | case "WixBundlePackageExitCode": | ||
132 | row = new WixBundlePackageExitCodeRow(sourceLineNumbers, this); | ||
133 | break; | ||
134 | case "WixBundlePatchTargetCode": | ||
135 | row = new WixBundlePatchTargetCodeRow(sourceLineNumbers, this); | ||
136 | break; | ||
137 | case "WixBundleSlipstreamMsp": | ||
138 | row = new WixBundleSlipstreamMspRow(sourceLineNumbers, this); | ||
139 | break; | ||
140 | case "WixBundleUpdate": | ||
141 | row = new WixBundleUpdateRow(sourceLineNumbers, this); | ||
142 | break; | ||
143 | case "WixBundleCatalog": | ||
144 | row = new WixBundleCatalogRow(sourceLineNumbers, this); | ||
145 | break; | ||
146 | case "WixChain": | ||
147 | row = new WixChainRow(sourceLineNumbers, this); | ||
148 | break; | ||
149 | case "WixChainItem": | ||
150 | row = new WixChainItemRow(sourceLineNumbers, this); | ||
151 | break; | ||
152 | case "WixBundlePackageCommandLine": | ||
153 | row = new WixBundlePackageCommandLineRow(sourceLineNumbers, this); | ||
154 | break; | ||
155 | case "WixComplexReference": | ||
156 | row = new WixComplexReferenceRow(sourceLineNumbers, this); | ||
157 | break; | ||
158 | case "WixDeltaPatchFile": | ||
159 | row = new WixDeltaPatchFileRow(sourceLineNumbers, this); | ||
160 | break; | ||
161 | case "WixDeltaPatchSymbolPaths": | ||
162 | row = new WixDeltaPatchSymbolPathsRow(sourceLineNumbers, this); | ||
163 | break; | ||
164 | case "WixFile": | ||
165 | row = new WixFileRow(sourceLineNumbers, this); | ||
166 | break; | ||
167 | case "WixGroup": | ||
168 | row = new WixGroupRow(sourceLineNumbers, this); | ||
169 | break; | ||
170 | case "WixMedia": | ||
171 | row = new WixMediaRow(sourceLineNumbers, this); | ||
172 | break; | ||
173 | case "WixMediaTemplate": | ||
174 | row = new WixMediaTemplateRow(sourceLineNumbers, this); | ||
175 | break; | ||
176 | case "WixMerge": | ||
177 | row = new WixMergeRow(sourceLineNumbers, this); | ||
178 | break; | ||
179 | case "WixPayloadProperties": | ||
180 | row = new WixPayloadPropertiesRow(sourceLineNumbers, this); | ||
181 | break; | ||
182 | case "WixProperty": | ||
183 | row = new WixPropertyRow(sourceLineNumbers, this); | ||
184 | break; | ||
185 | case "WixSimpleReference": | ||
186 | row = new WixSimpleReferenceRow(sourceLineNumbers, this); | ||
187 | break; | ||
188 | case "WixUpdateRegistration": | ||
189 | row = new WixUpdateRegistrationRow(sourceLineNumbers, this); | ||
190 | break; | ||
191 | |||
192 | default: | ||
193 | row = new Row(sourceLineNumbers, this); | ||
194 | break; | ||
195 | } | ||
196 | |||
197 | if (add) | ||
198 | { | ||
199 | this.Rows.Add(row); | ||
200 | } | ||
201 | |||
202 | return row; | ||
203 | } | ||
204 | |||
205 | /// <summary> | ||
206 | /// Parse a table from the xml. | ||
207 | /// </summary> | ||
208 | /// <param name="reader">XmlReader where the intermediate is persisted.</param> | ||
209 | /// <param name="tableDefinitions">TableDefinitions to use in the intermediate.</param> | ||
210 | /// <returns>The parsed table.</returns> | ||
211 | internal static Table Read(XmlReader reader, TableDefinitionCollection tableDefinitions) | ||
212 | { | ||
213 | Debug.Assert("table" == reader.LocalName); | ||
214 | |||
215 | bool empty = reader.IsEmptyElement; | ||
216 | TableOperation operation = TableOperation.None; | ||
217 | string name = null; | ||
218 | |||
219 | while (reader.MoveToNextAttribute()) | ||
220 | { | ||
221 | switch (reader.LocalName) | ||
222 | { | ||
223 | case "name": | ||
224 | name = reader.Value; | ||
225 | break; | ||
226 | case "op": | ||
227 | switch (reader.Value) | ||
228 | { | ||
229 | case "add": | ||
230 | operation = TableOperation.Add; | ||
231 | break; | ||
232 | case "drop": | ||
233 | operation = TableOperation.Drop; | ||
234 | break; | ||
235 | default: | ||
236 | throw new XmlException(); | ||
237 | } | ||
238 | break; | ||
239 | } | ||
240 | } | ||
241 | |||
242 | if (null == name) | ||
243 | { | ||
244 | throw new XmlException(); | ||
245 | } | ||
246 | |||
247 | TableDefinition tableDefinition = tableDefinitions[name]; | ||
248 | Table table = new Table(tableDefinition); | ||
249 | table.Operation = operation; | ||
250 | |||
251 | if (!empty) | ||
252 | { | ||
253 | bool done = false; | ||
254 | |||
255 | // loop through all the rows in a table | ||
256 | while (!done && reader.Read()) | ||
257 | { | ||
258 | switch (reader.NodeType) | ||
259 | { | ||
260 | case XmlNodeType.Element: | ||
261 | switch (reader.LocalName) | ||
262 | { | ||
263 | case "row": | ||
264 | Row.Read(reader, table); | ||
265 | break; | ||
266 | default: | ||
267 | throw new XmlException(); | ||
268 | } | ||
269 | break; | ||
270 | case XmlNodeType.EndElement: | ||
271 | done = true; | ||
272 | break; | ||
273 | } | ||
274 | } | ||
275 | |||
276 | if (!done) | ||
277 | { | ||
278 | throw new XmlException(); | ||
279 | } | ||
280 | } | ||
281 | |||
282 | return table; | ||
283 | } | ||
284 | |||
285 | /// <summary> | ||
286 | /// Persists a row in an XML format. | ||
287 | /// </summary> | ||
288 | /// <param name="writer">XmlWriter where the Row should persist itself as XML.</param> | ||
289 | internal void Write(XmlWriter writer) | ||
290 | { | ||
291 | if (null == writer) | ||
292 | { | ||
293 | throw new ArgumentNullException("writer"); | ||
294 | } | ||
295 | |||
296 | writer.WriteStartElement("table", Intermediate.XmlNamespaceUri); | ||
297 | writer.WriteAttributeString("name", this.Name); | ||
298 | |||
299 | if (TableOperation.None != this.Operation) | ||
300 | { | ||
301 | writer.WriteAttributeString("op", this.Operation.ToString().ToLowerInvariant()); | ||
302 | } | ||
303 | |||
304 | foreach (var row in this.Rows) | ||
305 | { | ||
306 | row.Write(writer); | ||
307 | } | ||
308 | |||
309 | writer.WriteEndElement(); | ||
310 | } | ||
311 | |||
312 | /// <summary> | ||
313 | /// Validates the rows of this OutputTable and throws if it collides on | ||
314 | /// primary keys. | ||
315 | /// </summary> | ||
316 | public void ValidateRows() | ||
317 | { | ||
318 | var primaryKeys = new Dictionary<string, SourceLineNumber>(); | ||
319 | |||
320 | foreach (var row in this.Rows) | ||
321 | { | ||
322 | var primaryKey = row.GetPrimaryKey(); | ||
323 | |||
324 | if (primaryKeys.TryGetValue(primaryKey, out var collisionSourceLineNumber)) | ||
325 | { | ||
326 | throw new WixException(WixDataErrors.DuplicatePrimaryKey(collisionSourceLineNumber, primaryKey, this.Definition.Name)); | ||
327 | } | ||
328 | |||
329 | primaryKeys.Add(primaryKey, row.SourceLineNumbers); | ||
330 | } | ||
331 | } | ||
332 | } | ||
333 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/TableDefinition.cs b/src/WixToolset.Data/WindowsInstaller/TableDefinition.cs new file mode 100644 index 00000000..518f0926 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/TableDefinition.cs | |||
@@ -0,0 +1,218 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
4 | { | ||
5 | using System; | ||
6 | using System.Collections.Generic; | ||
7 | using System.Collections.ObjectModel; | ||
8 | using System.Xml; | ||
9 | |||
10 | /// <summary> | ||
11 | /// Definition of a table in a database. | ||
12 | /// </summary> | ||
13 | public sealed class TableDefinition : IComparable<TableDefinition> | ||
14 | { | ||
15 | /// <summary> | ||
16 | /// Tracks the maximum number of columns supported in a real table. | ||
17 | /// This is a Windows Installer limitation. | ||
18 | /// </summary> | ||
19 | public const int MaxColumnsInRealTable = 32; | ||
20 | |||
21 | /// <summary> | ||
22 | /// Creates a table definition. | ||
23 | /// </summary> | ||
24 | /// <param name="name">Name of table to create.</param> | ||
25 | /// <param name="columns">Column definitions for the table.</param> | ||
26 | /// <param name="unreal">Flag if table is unreal.</param> | ||
27 | /// <param name="bootstrapperApplicationData">Flag if table is part of UX Manifest.</param> | ||
28 | public TableDefinition(string name, IList<ColumnDefinition> columns, bool unreal = false, bool bootstrapperApplicationData = false) | ||
29 | { | ||
30 | this.Name = name; | ||
31 | this.Unreal = unreal; | ||
32 | this.BootstrapperApplicationData = bootstrapperApplicationData; | ||
33 | |||
34 | this.Columns = new ReadOnlyCollection<ColumnDefinition>(columns); | ||
35 | } | ||
36 | |||
37 | /// <summary> | ||
38 | /// Gets the name of the table. | ||
39 | /// </summary> | ||
40 | /// <value>Name of the table.</value> | ||
41 | public string Name { get; private set; } | ||
42 | |||
43 | /// <summary> | ||
44 | /// Gets if the table is unreal. | ||
45 | /// </summary> | ||
46 | /// <value>Flag if table is unreal.</value> | ||
47 | public bool Unreal { get; private set; } | ||
48 | |||
49 | /// <summary> | ||
50 | /// Gets if the table is a part of the bootstrapper application data manifest. | ||
51 | /// </summary> | ||
52 | /// <value>Flag if table is a part of the bootstrapper application data manifest.</value> | ||
53 | public bool BootstrapperApplicationData { get; private set; } | ||
54 | |||
55 | /// <summary> | ||
56 | /// Gets the collection of column definitions for this table. | ||
57 | /// </summary> | ||
58 | /// <value>Collection of column definitions for this table.</value> | ||
59 | public IList<ColumnDefinition> Columns { get; private set; } | ||
60 | |||
61 | /// <summary> | ||
62 | /// Gets the column definition in the table by index. | ||
63 | /// </summary> | ||
64 | /// <param name="columnIndex">Index of column to locate.</param> | ||
65 | /// <value>Column definition in the table by index.</value> | ||
66 | public ColumnDefinition this[int columnIndex] | ||
67 | { | ||
68 | get { return this.Columns[columnIndex]; } | ||
69 | } | ||
70 | |||
71 | /// <summary> | ||
72 | /// Compares this table definition to another table definition. | ||
73 | /// </summary> | ||
74 | /// <remarks> | ||
75 | /// Only Windows Installer traits are compared, allowing for updates to WiX-specific table definitions. | ||
76 | /// </remarks> | ||
77 | /// <param name="updated">The updated <see cref="TableDefinition"/> to compare with this target definition.</param> | ||
78 | /// <returns>0 if the tables' core properties are the same; otherwise, non-0.</returns> | ||
79 | public int CompareTo(TableDefinition updated) | ||
80 | { | ||
81 | // by definition, this object is greater than null | ||
82 | if (null == updated) | ||
83 | { | ||
84 | return 1; | ||
85 | } | ||
86 | |||
87 | // compare the table names | ||
88 | int ret = String.Compare(this.Name, updated.Name, StringComparison.Ordinal); | ||
89 | |||
90 | // compare the column count | ||
91 | if (0 == ret) | ||
92 | { | ||
93 | // transforms can only add columns | ||
94 | ret = Math.Min(0, updated.Columns.Count - this.Columns.Count); | ||
95 | |||
96 | // compare name, type, and length of each column | ||
97 | for (int i = 0; 0 == ret && this.Columns.Count > i; i++) | ||
98 | { | ||
99 | ColumnDefinition thisColumnDef = this.Columns[i]; | ||
100 | ColumnDefinition updatedColumnDef = updated.Columns[i]; | ||
101 | |||
102 | ret = thisColumnDef.CompareTo(updatedColumnDef); | ||
103 | } | ||
104 | } | ||
105 | |||
106 | return ret; | ||
107 | } | ||
108 | |||
109 | /// <summary> | ||
110 | /// Parses table definition from xml reader. | ||
111 | /// </summary> | ||
112 | /// <param name="reader">Reader to get data from.</param> | ||
113 | /// <returns>The TableDefintion represented by the Xml.</returns> | ||
114 | internal static TableDefinition Read(XmlReader reader) | ||
115 | { | ||
116 | bool empty = reader.IsEmptyElement; | ||
117 | string name = null; | ||
118 | bool unreal = false; | ||
119 | bool bootstrapperApplicationData = false; | ||
120 | |||
121 | while (reader.MoveToNextAttribute()) | ||
122 | { | ||
123 | switch (reader.LocalName) | ||
124 | { | ||
125 | case "name": | ||
126 | name = reader.Value; | ||
127 | break; | ||
128 | case "unreal": | ||
129 | unreal = reader.Value.Equals("yes"); | ||
130 | break; | ||
131 | case "bootstrapperApplicationData": | ||
132 | bootstrapperApplicationData = reader.Value.Equals("yes"); | ||
133 | break; | ||
134 | } | ||
135 | } | ||
136 | |||
137 | if (null == name) | ||
138 | { | ||
139 | throw new XmlException(); | ||
140 | } | ||
141 | |||
142 | List<ColumnDefinition> columns = new List<ColumnDefinition>(); | ||
143 | bool hasPrimaryKeyColumn = false; | ||
144 | |||
145 | // parse the child elements | ||
146 | if (!empty) | ||
147 | { | ||
148 | bool done = false; | ||
149 | |||
150 | while (!done && reader.Read()) | ||
151 | { | ||
152 | switch (reader.NodeType) | ||
153 | { | ||
154 | case XmlNodeType.Element: | ||
155 | switch (reader.LocalName) | ||
156 | { | ||
157 | case "columnDefinition": | ||
158 | ColumnDefinition columnDefinition = ColumnDefinition.Read(reader); | ||
159 | columns.Add(columnDefinition); | ||
160 | |||
161 | if (columnDefinition.PrimaryKey) | ||
162 | { | ||
163 | hasPrimaryKeyColumn = true; | ||
164 | } | ||
165 | break; | ||
166 | default: | ||
167 | throw new XmlException(); | ||
168 | } | ||
169 | break; | ||
170 | case XmlNodeType.EndElement: | ||
171 | done = true; | ||
172 | break; | ||
173 | } | ||
174 | } | ||
175 | |||
176 | if (!unreal && !bootstrapperApplicationData && !hasPrimaryKeyColumn) | ||
177 | { | ||
178 | throw new WixException(WixDataErrors.RealTableMissingPrimaryKeyColumn(SourceLineNumber.CreateFromUri(reader.BaseURI), name)); | ||
179 | } | ||
180 | |||
181 | if (!done) | ||
182 | { | ||
183 | throw new XmlException(); | ||
184 | } | ||
185 | } | ||
186 | |||
187 | return new TableDefinition(name, columns, unreal, bootstrapperApplicationData); | ||
188 | } | ||
189 | |||
190 | /// <summary> | ||
191 | /// Persists an output in an XML format. | ||
192 | /// </summary> | ||
193 | /// <param name="writer">XmlWriter where the Output should persist itself as XML.</param> | ||
194 | internal void Write(XmlWriter writer) | ||
195 | { | ||
196 | writer.WriteStartElement("tableDefinition", TableDefinitionCollection.XmlNamespaceUri); | ||
197 | |||
198 | writer.WriteAttributeString("name", this.Name); | ||
199 | |||
200 | if (this.Unreal) | ||
201 | { | ||
202 | writer.WriteAttributeString("unreal", "yes"); | ||
203 | } | ||
204 | |||
205 | if (this.BootstrapperApplicationData) | ||
206 | { | ||
207 | writer.WriteAttributeString("bootstrapperApplicationData", "yes"); | ||
208 | } | ||
209 | |||
210 | foreach (ColumnDefinition columnDefinition in this.Columns) | ||
211 | { | ||
212 | columnDefinition.Write(writer); | ||
213 | } | ||
214 | |||
215 | writer.WriteEndElement(); | ||
216 | } | ||
217 | } | ||
218 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/TableDefinitionCollection.cs b/src/WixToolset.Data/WindowsInstaller/TableDefinitionCollection.cs new file mode 100644 index 00000000..0954e9de --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/TableDefinitionCollection.cs | |||
@@ -0,0 +1,238 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
4 | { | ||
5 | using System.Collections; | ||
6 | using System.Collections.Generic; | ||
7 | using System.Linq; | ||
8 | using System.Xml; | ||
9 | |||
10 | /// <summary> | ||
11 | /// Collection for table definitions indexed by table name. | ||
12 | /// </summary> | ||
13 | public sealed class TableDefinitionCollection : ICollection<TableDefinition> | ||
14 | { | ||
15 | public const string XmlNamespaceUri = "http://wixtoolset.org/schemas/v4/wi/tables"; | ||
16 | |||
17 | private Dictionary<string, TableDefinition> collection; | ||
18 | |||
19 | /// <summary> | ||
20 | /// Instantiate a new TableDefinitionCollection class. | ||
21 | /// </summary> | ||
22 | public TableDefinitionCollection() | ||
23 | { | ||
24 | this.collection = new Dictionary<string, TableDefinition>(); | ||
25 | } | ||
26 | |||
27 | /// <summary> | ||
28 | /// Creates a shallow copy of the provided table definition collection. | ||
29 | /// </summary> | ||
30 | public TableDefinitionCollection(TableDefinitionCollection tableDefinitions) | ||
31 | { | ||
32 | this.collection = new Dictionary<string, TableDefinition>(tableDefinitions.collection); | ||
33 | } | ||
34 | |||
35 | /// <summary> | ||
36 | /// Gets the number of items in the collection. | ||
37 | /// </summary> | ||
38 | /// <value>Number of items in collection.</value> | ||
39 | public int Count | ||
40 | { | ||
41 | get { return this.collection.Count; } | ||
42 | } | ||
43 | |||
44 | /// <summary> | ||
45 | /// Table definition collections are never read-only. | ||
46 | /// </summary> | ||
47 | public bool IsReadOnly | ||
48 | { | ||
49 | get { return false; } | ||
50 | } | ||
51 | |||
52 | /// <summary> | ||
53 | /// Gets a table definition by name. | ||
54 | /// </summary> | ||
55 | /// <param name="tableName">Name of table to locate.</param> | ||
56 | public TableDefinition this[string tableName] | ||
57 | { | ||
58 | get | ||
59 | { | ||
60 | if (!this.collection.TryGetValue(tableName, out var table)) | ||
61 | { | ||
62 | throw new WixMissingTableDefinitionException(WixDataErrors.MissingTableDefinition(tableName)); | ||
63 | } | ||
64 | |||
65 | return table; | ||
66 | } | ||
67 | } | ||
68 | |||
69 | /// <summary> | ||
70 | /// Tries to get a table definition by name. | ||
71 | /// </summary> | ||
72 | /// <param name="tableName">Name of table to locate.</param> | ||
73 | /// <param name="table">Table definition if found.</param> | ||
74 | /// <returns>True if table definition was found otherwise false.</returns> | ||
75 | public bool TryGet(string tableName, out TableDefinition table) | ||
76 | { | ||
77 | return this.collection.TryGetValue(tableName, out table); | ||
78 | } | ||
79 | |||
80 | /// <summary> | ||
81 | /// Load a table definition collection from an XmlReader. | ||
82 | /// </summary> | ||
83 | /// <param name="reader">Reader to get data from.</param> | ||
84 | /// <param name="suppressSchema">Suppress xml schema validation while loading.</param> | ||
85 | /// <returns>The TableDefinitionCollection represented by the xml.</returns> | ||
86 | public static TableDefinitionCollection Load(XmlReader reader) | ||
87 | { | ||
88 | reader.MoveToContent(); | ||
89 | |||
90 | return Read(reader); | ||
91 | } | ||
92 | |||
93 | /// <summary> | ||
94 | /// Adds a table definition to the collection. | ||
95 | /// </summary> | ||
96 | /// <param name="tableDefinition">Table definition to add to the collection.</param> | ||
97 | /// <value>Indexes by table definition name.</value> | ||
98 | public void Add(TableDefinition tableDefinition) | ||
99 | { | ||
100 | this.collection.Add(tableDefinition.Name, tableDefinition); | ||
101 | } | ||
102 | |||
103 | /// <summary> | ||
104 | /// Removes all table definitions from the collection. | ||
105 | /// </summary> | ||
106 | public void Clear() | ||
107 | { | ||
108 | this.collection.Clear(); | ||
109 | } | ||
110 | |||
111 | /// <summary> | ||
112 | /// Checks if the collection contains a table name. | ||
113 | /// </summary> | ||
114 | /// <param name="tableName">The table to check in the collection.</param> | ||
115 | /// <returns>True if collection contains the table.</returns> | ||
116 | public bool Contains(string tableName) | ||
117 | { | ||
118 | return this.collection.ContainsKey(tableName); | ||
119 | } | ||
120 | |||
121 | /// <summary> | ||
122 | /// Checks if the collection contains a table. | ||
123 | /// </summary> | ||
124 | /// <param name="table">The table to check in the collection.</param> | ||
125 | /// <returns>True if collection contains the table.</returns> | ||
126 | public bool Contains(TableDefinition table) | ||
127 | { | ||
128 | return this.collection.ContainsKey(table.Name); | ||
129 | } | ||
130 | |||
131 | /// <summary> | ||
132 | /// Copies table definitions to an arry. | ||
133 | /// </summary> | ||
134 | /// <param name="array">Array to copy the table definitions to.</param> | ||
135 | /// <param name="index">Index in the array to start copying at.</param> | ||
136 | public void CopyTo(TableDefinition[] array, int index) | ||
137 | { | ||
138 | this.collection.Values.CopyTo(array, index); | ||
139 | } | ||
140 | |||
141 | /// <summary> | ||
142 | /// Removes a table definition from the collection. | ||
143 | /// </summary> | ||
144 | /// <param name="table">Table to remove from the collection.</param> | ||
145 | /// <returns>True if the table definition existed in the collection and was removed.</returns> | ||
146 | public bool Remove(TableDefinition table) | ||
147 | { | ||
148 | return this.collection.Remove(table.Name); | ||
149 | } | ||
150 | |||
151 | /// <summary> | ||
152 | /// Gets enumerator for the collection. | ||
153 | /// </summary> | ||
154 | /// <returns>Enumerator for the collection.</returns> | ||
155 | public IEnumerator<TableDefinition> GetEnumerator() | ||
156 | { | ||
157 | return this.collection.Values.GetEnumerator(); | ||
158 | } | ||
159 | |||
160 | /// <summary> | ||
161 | /// Gets the untyped enumerator for the collection. | ||
162 | /// </summary> | ||
163 | /// <returns>Untyped enumerator for the collection.</returns> | ||
164 | IEnumerator IEnumerable.GetEnumerator() | ||
165 | { | ||
166 | return this.collection.Values.GetEnumerator(); | ||
167 | } | ||
168 | |||
169 | /// <summary> | ||
170 | /// Loads a collection of table definitions from a XmlReader in memory. | ||
171 | /// </summary> | ||
172 | /// <param name="reader">Reader to get data from.</param> | ||
173 | /// <returns>The TableDefinitionCollection represented by the xml.</returns> | ||
174 | internal static TableDefinitionCollection Read(XmlReader reader) | ||
175 | { | ||
176 | if ("tableDefinitions" != reader.LocalName) | ||
177 | { | ||
178 | throw new XmlException(); | ||
179 | } | ||
180 | |||
181 | bool empty = reader.IsEmptyElement; | ||
182 | TableDefinitionCollection tableDefinitionCollection = new TableDefinitionCollection(); | ||
183 | |||
184 | while (reader.MoveToNextAttribute()) | ||
185 | { | ||
186 | } | ||
187 | |||
188 | // parse the child elements | ||
189 | if (!empty) | ||
190 | { | ||
191 | bool done = false; | ||
192 | |||
193 | while (!done && reader.Read()) | ||
194 | { | ||
195 | switch (reader.NodeType) | ||
196 | { | ||
197 | case XmlNodeType.Element: | ||
198 | switch (reader.LocalName) | ||
199 | { | ||
200 | case "tableDefinition": | ||
201 | tableDefinitionCollection.Add(TableDefinition.Read(reader)); | ||
202 | break; | ||
203 | default: | ||
204 | throw new XmlException(); | ||
205 | } | ||
206 | break; | ||
207 | case XmlNodeType.EndElement: | ||
208 | done = true; | ||
209 | break; | ||
210 | } | ||
211 | } | ||
212 | |||
213 | if (!done) | ||
214 | { | ||
215 | throw new XmlException(); | ||
216 | } | ||
217 | } | ||
218 | |||
219 | return tableDefinitionCollection; | ||
220 | } | ||
221 | |||
222 | /// <summary> | ||
223 | /// Persists a TableDefinitionCollection in an XML format. | ||
224 | /// </summary> | ||
225 | /// <param name="writer">XmlWriter where the TableDefinitionCollection should persist itself as XML.</param> | ||
226 | internal void Write(XmlWriter writer) | ||
227 | { | ||
228 | writer.WriteStartElement("tableDefinitions", XmlNamespaceUri); | ||
229 | |||
230 | foreach (TableDefinition tableDefinition in this.collection.Values.OrderBy(t => t.Name)) | ||
231 | { | ||
232 | tableDefinition.Write(writer); | ||
233 | } | ||
234 | |||
235 | writer.WriteEndElement(); | ||
236 | } | ||
237 | } | ||
238 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/TableIndexedCollection.cs b/src/WixToolset.Data/WindowsInstaller/TableIndexedCollection.cs new file mode 100644 index 00000000..1b7de72b --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/TableIndexedCollection.cs | |||
@@ -0,0 +1,143 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
4 | { | ||
5 | using System.Collections.Generic; | ||
6 | using System.Linq; | ||
7 | |||
8 | /// <summary> | ||
9 | /// Collection for tables. | ||
10 | /// </summary> | ||
11 | public sealed class TableIndexedCollection : ICollection<Table> | ||
12 | { | ||
13 | private Dictionary<string, Table> collection; | ||
14 | |||
15 | /// <summary> | ||
16 | /// Instantiate a new empty collection. | ||
17 | /// </summary> | ||
18 | public TableIndexedCollection() | ||
19 | { | ||
20 | this.collection = new Dictionary<string,Table>(); | ||
21 | } | ||
22 | |||
23 | /// <summary> | ||
24 | /// Instantiate a new collection populated with a set of tables. | ||
25 | /// </summary> | ||
26 | /// <param name="tables">Set of tables.</param> | ||
27 | public TableIndexedCollection(IEnumerable<Table> tables) | ||
28 | { | ||
29 | this.collection = tables.ToDictionary(t => t.Name); | ||
30 | } | ||
31 | |||
32 | /// <summary> | ||
33 | /// Gets the number of items in the collection. | ||
34 | /// </summary> | ||
35 | /// <value>Number of items in collection.</value> | ||
36 | public int Count => this.collection.Count; | ||
37 | |||
38 | /// <summary> | ||
39 | /// Table indexed collection is never read only. | ||
40 | /// </summary> | ||
41 | public bool IsReadOnly => false; | ||
42 | |||
43 | /// <summary> | ||
44 | /// Adds a table to the collection. | ||
45 | /// </summary> | ||
46 | /// <param name="table">Table to add to the collection.</param> | ||
47 | /// <remarks>Indexes the table by name.</remarks> | ||
48 | public void Add(Table table) | ||
49 | { | ||
50 | this.collection.Add(table.Name, table); | ||
51 | } | ||
52 | |||
53 | /// <summary> | ||
54 | /// Clear the tables from the collection. | ||
55 | /// </summary> | ||
56 | public void Clear() | ||
57 | { | ||
58 | this.collection.Clear(); | ||
59 | } | ||
60 | |||
61 | /// <summary> | ||
62 | /// Determines if a table is in the collection. | ||
63 | /// </summary> | ||
64 | /// <param name="table">Table to check if it is in the collection.</param> | ||
65 | /// <returns>True if the table name is in the collection, otherwise false.</returns> | ||
66 | public bool Contains(Table table) => this.collection.ContainsKey(table.Name); | ||
67 | |||
68 | /// <summary> | ||
69 | /// Copies the collection into an array. | ||
70 | /// </summary> | ||
71 | /// <param name="array">Array to copy the collection into.</param> | ||
72 | /// <param name="arrayIndex">Index to start copying from.</param> | ||
73 | public void CopyTo(Table[] array, int arrayIndex) | ||
74 | { | ||
75 | this.collection.Values.CopyTo(array, arrayIndex); | ||
76 | } | ||
77 | |||
78 | /// <summary> | ||
79 | /// Remove a table from the collection by name. | ||
80 | /// </summary> | ||
81 | /// <param name="tableName">Table name to remove from the collection.</param> | ||
82 | public void Remove(string tableName) | ||
83 | { | ||
84 | this.collection.Remove(tableName); | ||
85 | } | ||
86 | |||
87 | /// <summary> | ||
88 | /// Remove a table from the collection. | ||
89 | /// </summary> | ||
90 | /// <param name="table">Table with matching name to remove from the collection.</param> | ||
91 | public bool Remove(Table table) | ||
92 | { | ||
93 | return this.collection.Remove(table.Name); | ||
94 | } | ||
95 | |||
96 | /// <summary> | ||
97 | /// Gets an enumerator over the whole collection. | ||
98 | /// </summary> | ||
99 | /// <returns>Collection enumerator.</returns> | ||
100 | public IEnumerator<Table> GetEnumerator() | ||
101 | { | ||
102 | return this.collection.Values.GetEnumerator(); | ||
103 | } | ||
104 | |||
105 | /// <summary> | ||
106 | /// Gets an untyped enumerator over the whole collection. | ||
107 | /// </summary> | ||
108 | /// <returns>Untyped collection enumerator.</returns> | ||
109 | System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() | ||
110 | { | ||
111 | return this.collection.Values.GetEnumerator(); | ||
112 | } | ||
113 | |||
114 | /// <summary> | ||
115 | /// Gets a table by name. | ||
116 | /// </summary> | ||
117 | /// <param name="tableName">Name of table to locate.</param> | ||
118 | public Table this[string tableName] | ||
119 | { | ||
120 | get | ||
121 | { | ||
122 | Table table; | ||
123 | return this.collection.TryGetValue(tableName, out table) ? table : null; | ||
124 | } | ||
125 | |||
126 | set | ||
127 | { | ||
128 | this.collection[tableName] = value; | ||
129 | } | ||
130 | } | ||
131 | |||
132 | /// <summary> | ||
133 | /// Tries to find a table by name. | ||
134 | /// </summary> | ||
135 | /// <param name="tableName">Table name to locate.</param> | ||
136 | /// <param name="table">Found table.</param> | ||
137 | /// <returns>True if table with table name was found, otherwise false.</returns> | ||
138 | public bool TryGetTable(string tableName, out Table table) | ||
139 | { | ||
140 | return this.collection.TryGetValue(tableName, out table); | ||
141 | } | ||
142 | } | ||
143 | } | ||
diff --git a/src/WixToolset.Data/WindowsInstaller/TableOperation.cs b/src/WixToolset.Data/WindowsInstaller/TableOperation.cs new file mode 100644 index 00000000..ccd0ebca --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/TableOperation.cs | |||
@@ -0,0 +1,25 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
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/WixMissingTableDefinitionException.cs b/src/WixToolset.Data/WindowsInstaller/WixMissingTableDefinitionException.cs new file mode 100644 index 00000000..4b15c0e5 --- /dev/null +++ b/src/WixToolset.Data/WindowsInstaller/WixMissingTableDefinitionException.cs | |||
@@ -0,0 +1,22 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Data.WindowsInstaller | ||
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 | } | ||