main
cs 112 lines 3.52 KB
Raw
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, WindowsInstallerData 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 WindowsInstallerData 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 /// <param name="tableDefinitions">Table definitions to use for strongly-typed rows.</param>
40 /// <returns>New SubStorage object.</returns>
41 internal static SubStorage Read(XmlReader reader, TableDefinitionCollection tableDefinitions)
42 {
43 if (reader.LocalName != "subStorage")
44 {
45 throw new XmlException();
46 }
47
48 WindowsInstallerData data = null;
49 string name = null;
50
51 var empty = reader.IsEmptyElement;
52
53 while (reader.MoveToNextAttribute())
54 {
55 switch (reader.LocalName)
56 {
57 case "name":
58 name = reader.Value;
59 break;
60 }
61 }
62
63 if (!empty)
64 {
65 var done = false;
66
67 while (!done && reader.Read())
68 {
69 switch (reader.NodeType)
70 {
71 case XmlNodeType.Element:
72 switch (reader.LocalName)
73 {
74 case WindowsInstallerData.XmlElementName:
75 data = WindowsInstallerData.Read(reader, tableDefinitions, true);
76 break;
77 default:
78 throw new XmlException();
79 }
80 break;
81
82 case XmlNodeType.EndElement:
83 done = true;
84 break;
85 }
86 }
87
88 if (!done)
89 {
90 throw new XmlException();
91 }
92 }
93
94 return new SubStorage(name, data);
95 }
96
97 /// <summary>
98 /// Persists a SubStorage in an XML format.
99 /// </summary>
100 /// <param name="writer">XmlWriter where the SubStorage should persist itself as XML.</param>
101 internal void Write(XmlWriter writer)
102 {
103 writer.WriteStartElement("subStorage", WindowsInstallerData.XmlNamespaceUri);
104
105 writer.WriteAttributeString("name", this.Name);
106
107 this.Data.Write(writer);
108
109 writer.WriteEndElement();
110 }
111 }
112 }