aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.Burn/Bind/SearchFacade.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/WixToolset.Core.Burn/Bind/SearchFacade.cs197
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
3namespace 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}