diff options
Diffstat (limited to 'src/WixToolset.Core.Burn/Bind/SearchFacade.cs')
-rw-r--r-- | src/WixToolset.Core.Burn/Bind/SearchFacade.cs | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/WixToolset.Core.Burn/Bind/SearchFacade.cs b/src/WixToolset.Core.Burn/Bind/SearchFacade.cs new file mode 100644 index 00000000..65f3cb5b --- /dev/null +++ b/src/WixToolset.Core.Burn/Bind/SearchFacade.cs | |||
@@ -0,0 +1,197 @@ | |||
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.Core.Burn | ||
4 | { | ||
5 | using System; | ||
6 | using System.Xml; | ||
7 | using WixToolset.Data; | ||
8 | using WixToolset.Data.Tuples; | ||
9 | |||
10 | internal class SearchFacade | ||
11 | { | ||
12 | public SearchFacade(WixSearchTuple searchTuple, IntermediateTuple searchSpecificTuple) | ||
13 | { | ||
14 | this.SearchTuple = searchTuple; | ||
15 | this.SearchSpecificTuple = searchSpecificTuple; | ||
16 | } | ||
17 | |||
18 | public WixSearchTuple SearchTuple { get; } | ||
19 | |||
20 | public IntermediateTuple SearchSpecificTuple { get; } | ||
21 | |||
22 | /// <summary> | ||
23 | /// Generates Burn manifest and ParameterInfo-style markup a search. | ||
24 | /// </summary> | ||
25 | /// <param name="writer"></param> | ||
26 | public void WriteXml(XmlTextWriter writer) | ||
27 | { | ||
28 | switch (this.SearchSpecificTuple) | ||
29 | { | ||
30 | case WixComponentSearchTuple tuple: | ||
31 | this.WriteComponentSearchXml(writer, tuple); | ||
32 | break; | ||
33 | case WixFileSearchTuple tuple: | ||
34 | this.WriteFileSearchXml(writer, tuple); | ||
35 | break; | ||
36 | case WixProductSearchTuple tuple: | ||
37 | this.WriteProductSearchXml(writer, tuple); | ||
38 | break; | ||
39 | case WixRegistrySearchTuple tuple: | ||
40 | this.WriteRegistrySearchXml(writer, tuple); | ||
41 | break; | ||
42 | } | ||
43 | } | ||
44 | |||
45 | private void WriteCommonAttributes(XmlTextWriter writer) | ||
46 | { | ||
47 | writer.WriteAttributeString("Id", this.SearchTuple.Id.Id); | ||
48 | writer.WriteAttributeString("Variable", this.SearchTuple.Variable); | ||
49 | if (!String.IsNullOrEmpty(this.SearchTuple.Condition)) | ||
50 | { | ||
51 | writer.WriteAttributeString("Condition", this.SearchTuple.Condition); | ||
52 | } | ||
53 | } | ||
54 | |||
55 | private void WriteComponentSearchXml(XmlTextWriter writer, WixComponentSearchTuple searchTuple) | ||
56 | { | ||
57 | writer.WriteStartElement("MsiComponentSearch"); | ||
58 | |||
59 | this.WriteCommonAttributes(writer); | ||
60 | |||
61 | writer.WriteAttributeString("ComponentId", searchTuple.Guid); | ||
62 | |||
63 | if (!String.IsNullOrEmpty(searchTuple.ProductCode)) | ||
64 | { | ||
65 | writer.WriteAttributeString("ProductCode", searchTuple.ProductCode); | ||
66 | } | ||
67 | |||
68 | if (0 != (searchTuple.Attributes & WixComponentSearchAttributes.KeyPath)) | ||
69 | { | ||
70 | writer.WriteAttributeString("Type", "keyPath"); | ||
71 | } | ||
72 | else if (0 != (searchTuple.Attributes & WixComponentSearchAttributes.State)) | ||
73 | { | ||
74 | writer.WriteAttributeString("Type", "state"); | ||
75 | } | ||
76 | else if (0 != (searchTuple.Attributes & WixComponentSearchAttributes.WantDirectory)) | ||
77 | { | ||
78 | writer.WriteAttributeString("Type", "directory"); | ||
79 | } | ||
80 | |||
81 | writer.WriteEndElement(); | ||
82 | } | ||
83 | |||
84 | private void WriteFileSearchXml(XmlTextWriter writer, WixFileSearchTuple searchTuple) | ||
85 | { | ||
86 | writer.WriteStartElement((0 == (searchTuple.Attributes & WixFileSearchAttributes.IsDirectory)) ? "FileSearch" : "DirectorySearch"); | ||
87 | |||
88 | this.WriteCommonAttributes(writer); | ||
89 | |||
90 | writer.WriteAttributeString("Path", searchTuple.Path); | ||
91 | if (WixFileSearchAttributes.WantExists == (searchTuple.Attributes & WixFileSearchAttributes.WantExists)) | ||
92 | { | ||
93 | writer.WriteAttributeString("Type", "exists"); | ||
94 | } | ||
95 | else if (WixFileSearchAttributes.WantVersion == (searchTuple.Attributes & WixFileSearchAttributes.WantVersion)) | ||
96 | { | ||
97 | // Can never get here for DirectorySearch. | ||
98 | writer.WriteAttributeString("Type", "version"); | ||
99 | } | ||
100 | else | ||
101 | { | ||
102 | writer.WriteAttributeString("Type", "path"); | ||
103 | } | ||
104 | writer.WriteEndElement(); | ||
105 | } | ||
106 | |||
107 | private void WriteProductSearchXml(XmlTextWriter writer, WixProductSearchTuple tuple) | ||
108 | { | ||
109 | writer.WriteStartElement("MsiProductSearch"); | ||
110 | |||
111 | this.WriteCommonAttributes(writer); | ||
112 | |||
113 | if (0 != (tuple.Attributes & WixProductSearchAttributes.UpgradeCode)) | ||
114 | { | ||
115 | writer.WriteAttributeString("UpgradeCode", tuple.Guid); | ||
116 | } | ||
117 | else | ||
118 | { | ||
119 | writer.WriteAttributeString("ProductCode", tuple.Guid); | ||
120 | } | ||
121 | |||
122 | if (0 != (tuple.Attributes & WixProductSearchAttributes.Version)) | ||
123 | { | ||
124 | writer.WriteAttributeString("Type", "version"); | ||
125 | } | ||
126 | else if (0 != (tuple.Attributes & WixProductSearchAttributes.Language)) | ||
127 | { | ||
128 | writer.WriteAttributeString("Type", "language"); | ||
129 | } | ||
130 | else if (0 != (tuple.Attributes & WixProductSearchAttributes.State)) | ||
131 | { | ||
132 | writer.WriteAttributeString("Type", "state"); | ||
133 | } | ||
134 | else if (0 != (tuple.Attributes & WixProductSearchAttributes.Assignment)) | ||
135 | { | ||
136 | writer.WriteAttributeString("Type", "assignment"); | ||
137 | } | ||
138 | |||
139 | writer.WriteEndElement(); | ||
140 | } | ||
141 | |||
142 | private void WriteRegistrySearchXml(XmlTextWriter writer, WixRegistrySearchTuple tuple) | ||
143 | { | ||
144 | writer.WriteStartElement("RegistrySearch"); | ||
145 | |||
146 | this.WriteCommonAttributes(writer); | ||
147 | |||
148 | switch (tuple.Root) | ||
149 | { | ||
150 | case RegistryRootType.ClassesRoot: | ||
151 | writer.WriteAttributeString("Root", "HKCR"); | ||
152 | break; | ||
153 | case RegistryRootType.CurrentUser: | ||
154 | writer.WriteAttributeString("Root", "HKCU"); | ||
155 | break; | ||
156 | case RegistryRootType.LocalMachine: | ||
157 | writer.WriteAttributeString("Root", "HKLM"); | ||
158 | break; | ||
159 | case RegistryRootType.Users: | ||
160 | writer.WriteAttributeString("Root", "HKU"); | ||
161 | break; | ||
162 | } | ||
163 | |||
164 | writer.WriteAttributeString("Key", tuple.Key); | ||
165 | |||
166 | if (!String.IsNullOrEmpty(tuple.Value)) | ||
167 | { | ||
168 | writer.WriteAttributeString("Value", tuple.Value); | ||
169 | } | ||
170 | |||
171 | var existenceOnly = 0 != (tuple.Attributes & WixRegistrySearchAttributes.WantExists); | ||
172 | |||
173 | writer.WriteAttributeString("Type", existenceOnly ? "exists" : "value"); | ||
174 | |||
175 | if (0 != (tuple.Attributes & WixRegistrySearchAttributes.Win64)) | ||
176 | { | ||
177 | writer.WriteAttributeString("Win64", "yes"); | ||
178 | } | ||
179 | |||
180 | if (!existenceOnly) | ||
181 | { | ||
182 | if (0 != (tuple.Attributes & WixRegistrySearchAttributes.ExpandEnvironmentVariables)) | ||
183 | { | ||
184 | writer.WriteAttributeString("ExpandEnvironment", "yes"); | ||
185 | } | ||
186 | |||
187 | // We *always* say this is VariableType="string". If we end up | ||
188 | // needing to be more specific, we will have to expand the "Format" | ||
189 | // attribute to allow "number" and "version". | ||
190 | |||
191 | writer.WriteAttributeString("VariableType", "string"); | ||
192 | } | ||
193 | |||
194 | writer.WriteEndElement(); | ||
195 | } | ||
196 | } | ||
197 | } | ||