Fix for added elements to reference platform-specific extension custom actions.
Bob Arnson committed
Apr 23, 2021 at 17:50 UTC
0177cb5b9b08351266816097ea9e8561b9ec0973
3 files changed
+189
-2
src/WixToolset.Converters/WixConverter.cs
+113
@@ -105,6 +105,7 @@ namespace WixToolset.Converters
105
private static readonly XName PermissionExElementName = WixNamespace + "PermissionEx";
106
private static readonly XName ProductElementName = WixNamespace + "Product";
107
private static readonly XName ProgressTextElementName = WixNamespace + "ProgressText";
108
+ private static readonly XName PropertyRefElementName = WixNamespace + "PropertyRef";
109
private static readonly XName PublishElementName = WixNamespace + "Publish";
110
private static readonly XName ProvidesElementName = WixNamespace + "Provides";
111
private static readonly XName RequiresElementName = WixNamespace + "Requires";
@@ -138,6 +139,7 @@ namespace WixToolset.Converters
139
private static readonly XName UtilRegistrySearchName = WixUtilNamespace + "RegistrySearch";
140
private static readonly XName UtilXmlConfigElementName = WixUtilNamespace + "XmlConfig";
141
private static readonly XName CustomActionElementName = WixNamespace + "CustomAction";
142
+ private static readonly XName CustomActionRefElementName = WixNamespace + "CustomActionRef";
143
private static readonly XName PropertyElementName = WixNamespace + "Property";
144
private static readonly XName Wix4ElementName = WixNamespace + "Wix";
145
private static readonly XName Wix3ElementName = Wix3Namespace + "Wix";
@@ -230,12 +232,14 @@ namespace WixToolset.Converters
232
{ WixConverter.PermissionExElementName, this.ConvertPermissionExElement },
233
{ WixConverter.ProductElementName, this.ConvertProductElement },
234
{ WixConverter.ProgressTextElementName, this.ConvertProgressTextElement },
235
+ { WixConverter.PropertyRefElementName, this.ConvertPropertyRefElement },
236
{ WixConverter.PublishElementName, this.ConvertPublishElement },
237
{ WixConverter.MultiStringValueElementName, this.ConvertMultiStringValueElement },
238
{ WixConverter.RegistryKeyElementName, this.ConvertRegistryKeyElement },
239
{ WixConverter.RegistrySearchElementName, this.ConvertRegistrySearchElement },
240
{ WixConverter.RemotePayloadElementName, this.ConvertRemotePayloadElement },
241
{ WixConverter.RequiredPrivilegeElementName, this.ConvertRequiredPrivilegeElement },
242
+ { WixConverter.CustomActionRefElementName, this.ConvertCustomActionRefElement },
243
{ WixConverter.ServiceArgumentElementName, this.ConvertServiceArgumentElement },
244
{ WixConverter.SetDirectoryElementName, this.ConvertSetDirectoryElement },
245
{ WixConverter.SetPropertyElementName, this.ConvertSetPropertyElement },
@@ -1293,6 +1297,110 @@ namespace WixToolset.Converters
1297
xAttribute?.Remove();
1298
}
1299
1300
+ private void ConvertPropertyRefElement(XElement element)
1301
+ {
1302
+ var newElementName = String.Empty;
1303
+
1304
+ var id = element.Attribute("Id");
1305
+ switch (id?.Value)
1306
+ {
1307
+ case "WIX_SUITE_BACKOFFICE":
1308
+ case "WIX_SUITE_BLADE":
1309
+ case "WIX_SUITE_COMMUNICATIONS":
1310
+ case "WIX_SUITE_COMPUTE_SERVER":
1311
+ case "WIX_SUITE_DATACENTER":
1312
+ case "WIX_SUITE_EMBEDDED_RESTRICTED":
1313
+ case "WIX_SUITE_EMBEDDEDNT":
1314
+ case "WIX_SUITE_ENTERPRISE":
1315
+ case "WIX_SUITE_MEDIACENTER":
1316
+ case "WIX_SUITE_PERSONAL":
1317
+ case "WIX_SUITE_SECURITY_APPLIANCE":
1318
+ case "WIX_SUITE_SERVERR2":
1319
+ case "WIX_SUITE_SINGLEUSERTS":
1320
+ case "WIX_SUITE_SMALLBUSINESS":
1321
+ case "WIX_SUITE_SMALLBUSINESS_RESTRICTED":
1322
+ case "WIX_SUITE_STARTER":
1323
+ case "WIX_SUITE_STORAGE_SERVER":
1324
+ case "WIX_SUITE_TABLETPC":
1325
+ case "WIX_SUITE_TERMINAL":
1326
+ case "WIX_SUITE_WH_SERVER":
1327
+ newElementName = "QueryWindowsSuiteInfo";
1328
+ break;
1329
+ case "WIX_DIR_ADMINTOOLS":
1330
+ case "WIX_DIR_ALTSTARTUP":
1331
+ case "WIX_DIR_CDBURN_AREA":
1332
+ case "WIX_DIR_COMMON_ADMINTOOLS":
1333
+ case "WIX_DIR_COMMON_ALTSTARTUP":
1334
+ case "WIX_DIR_COMMON_DOCUMENTS":
1335
+ case "WIX_DIR_COMMON_FAVORITES":
1336
+ case "WIX_DIR_COMMON_MUSIC":
1337
+ case "WIX_DIR_COMMON_PICTURES":
1338
+ case "WIX_DIR_COMMON_VIDEO":
1339
+ case "WIX_DIR_COOKIES":
1340
+ case "WIX_DIR_DESKTOP":
1341
+ case "WIX_DIR_HISTORY":
1342
+ case "WIX_DIR_INTERNET_CACHE":
1343
+ case "WIX_DIR_MYMUSIC":
1344
+ case "WIX_DIR_MYPICTURES":
1345
+ case "WIX_DIR_MYVIDEO":
1346
+ case "WIX_DIR_NETHOOD":
1347
+ case "WIX_DIR_PERSONAL":
1348
+ case "WIX_DIR_PRINTHOOD":
1349
+ case "WIX_DIR_PROFILE":
1350
+ case "WIX_DIR_RECENT":
1351
+ case "WIX_DIR_RESOURCES":
1352
+ newElementName = "QueryWindowsDirectories";
1353
+ break;
1354
+ case "WIX_DWM_COMPOSITION_ENABLED":
1355
+ case "WIX_WDDM_DRIVER_PRESENT":
1356
+ newElementName = "QueryWindowsDriverInfo";
1357
+ break;
1358
+ case "WIX_ACCOUNT_LOCALSYSTEM":
1359
+ case "WIX_ACCOUNT_LOCALSERVICE":
1360
+ case "WIX_ACCOUNT_NETWORKSERVICE":
1361
+ case "WIX_ACCOUNT_ADMINISTRATORS":
1362
+ case "WIX_ACCOUNT_USERS":
1363
+ case "WIX_ACCOUNT_GUESTS":
1364
+ case "WIX_ACCOUNT_PERFLOGUSERS":
1365
+ case "WIX_ACCOUNT_PERFLOGUSERS_NODOMAIN":
1366
+ newElementName = "QueryWindowsWellKnownSIDs";
1367
+ break;
1368
+ }
1369
+
1370
+ if (!String.IsNullOrEmpty(newElementName)
1371
+ && this.OnError(ConverterTestType.UtilReferencesReplaced, element, "Custom action and property reference {0} to WixUtilExtension have been replaced with strongly-typed elements.", id))
1372
+ {
1373
+ element.AddAfterSelf(new XElement(WixUtilNamespace + newElementName));
1374
+ element.Remove();
1375
+ }
1376
+ }
1377
+
1378
+ private void ConvertCustomActionRefElement(XElement element)
1379
+ {
1380
+ var newElementName = String.Empty;
1381
+
1382
+ var id = element.Attribute("Id");
1383
+ switch (id?.Value)
1384
+ {
1385
+ case "WixBroadcastSettingChange":
1386
+ case "WixBroadcastEnvironmentChange":
1387
+ case "WixCheckRebootRequired":
1388
+ case "WixExitEarlyWithSuccess":
1389
+ case "WixFailWhenDeferred":
1390
+ case "WixWaitForEvent":
1391
+ case "WixWaitForEventDeferred":
1392
+ newElementName = id?.Value.Substring(3); // strip leading Wix
1393
+ break;
1394
+ }
1395
+
1396
+ if (!String.IsNullOrEmpty(newElementName)
1397
+ && this.OnError(ConverterTestType.UtilReferencesReplaced, element, "Custom action and property reference {0} to WixUtilExtension have been replaced with strongly-typed elements.", id))
1398
+ {
1399
+ element.AddAfterSelf(new XElement(WixUtilNamespace + newElementName));
1400
+ element.Remove();
1401
+ }
1402
+ }
1403
+
1404
private void ConvertPublishElement(XElement element)
1405
{
1406
this.ConvertInnerTextToAttribute(element, "Condition");
@@ -2317,6 +2425,11 @@ namespace WixToolset.Converters
2425
/// Standard directories should no longer be defined using the Directory element.
2426
/// </summary>
2427
DefiningStandardDirectoryDeprecated,
2428
+
2429
+ /// <summary>
2430
+ /// Naked custom action and property references replaced with WixUtilExtension elements.
2431
+ /// </summary>
2432
+ UtilReferencesReplaced,
2433
}
2434
}
2435
}
src/test/WixToolsetTest.Converters/ConverterIntegrationFixture.cs
+1
-2
@@ -8,7 +8,6 @@ namespace WixToolsetTest.Converters
8
using WixBuildTools.TestSupport;
9
using WixToolset.Converters;
10
using WixToolset.Core;
11
- using WixToolset.Core.ExtensibilityServices;
11
using WixToolset.Core.TestPackage;
12
using WixToolsetTest.Converters.Mocks;
13
using Xunit;
@@ -88,7 +87,7 @@ namespace WixToolsetTest.Converters
87
var converter = new WixConverter(messaging, 4);
88
var errors = converter.ConvertFile(targetFile, true);
89
91
- Assert.Equal(10, errors);
90
+ Assert.Single(messaging.Messages.Where(m => m.Id == 5/*WixConverter.ConverterTestType.UnauthorizedAccessException*/));
91
}
92
}
93
src/test/WixToolsetTest.Converters/UtilExtensionFixture.cs
+75
@@ -111,5 +111,80 @@ namespace WixToolsetTest.Converters
111
var actualLines = UnformattedDocumentLines(document);
112
WixAssert.CompareLineByLine(expected, actualLines);
113
}
114
+
115
+
116
+ [Fact]
117
+ public void FixXmlConfigValueCData()
118
+ {
119
+ var parse = String.Join(Environment.NewLine,
120
+ "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi' xmlns:util='http://schemas.microsoft.com/wix/UtilExtension'>",
121
+ " <Fragment>",
122
+ " <util:XmlConfig Id='Change' ElementPath='book'>",
123
+ " <![CDATA[a<>b]]>",
124
+ " </util:XmlConfig>",
125
+ " </Fragment>",
126
+ "</Wix>");
127
+
128
+ var expected = new[]
129
+ {
130
+ "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\" xmlns:util=\"http://wixtoolset.org/schemas/v4/wxs/util\">",
131
+ " <Fragment>",
132
+ " <util:XmlConfig Id=\"Change\" ElementPath=\"book\" Value=\"a<>b\" />",
133
+ " </Fragment>",
134
+ "</Wix>"
135
+ };
136
+
137
+ var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
138
+
139
+ var messaging = new MockMessaging();
140
+ var converter = new WixConverter(messaging, 2, null, null);
141
+
142
+ var errors = converter.ConvertDocument(document);
143
+ Assert.Equal(3, errors);
144
+
145
+ var actualLines = UnformattedDocumentLines(document);
146
+ WixAssert.CompareLineByLine(expected, actualLines);
147
+ }
148
+
149
+ [Fact]
150
+ public void FixQueryOsPropertyRefs()
151
+ {
152
+ var parse = String.Join(Environment.NewLine,
153
+ "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi' xmlns:util='http://schemas.microsoft.com/wix/UtilExtension'>",
154
+ " <Fragment>",
155
+ " <PropertyRef Id=\"WIX_SUITE_ENTERPRISE\" />",
156
+ " <PropertyRef Id=\"WIX_DIR_COMMON_DOCUMENTS\" />",
157
+ " <CustomActionRef Id=\"WixFailWhenDeferred\" />",
158
+ " <UI>",
159
+ " <PropertyRef Id=\"WIX_ACCOUNT_LOCALSERVICE\" />",
160
+ " </UI>",
161
+ " </Fragment>",
162
+ "</Wix>");
163
+
164
+ var expected = new[]
165
+ {
166
+ "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\" xmlns:util=\"http://wixtoolset.org/schemas/v4/wxs/util\">",
167
+ " <Fragment>",
168
+ " <util:QueryWindowsSuiteInfo />",
169
+ " <util:QueryWindowsDirectories />",
170
+ " <util:FailWhenDeferred />",
171
+ " <UI>",
172
+ " <util:QueryWindowsWellKnownSIDs />",
173
+ " </UI>",
174
+ " </Fragment>",
175
+ "</Wix>"
176
+ };
177
+
178
+ var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
179
+
180
+ var messaging = new MockMessaging();
181
+ var converter = new WixConverter(messaging, 2, null, null);
182
+
183
+ var errors = converter.ConvertDocument(document);
184
+ Assert.Equal(6, errors);
185
+
186
+ var actualLines = UnformattedDocumentLines(document);
187
+ WixAssert.CompareLineByLine(expected, actualLines);
188
+ }
189
}
190
}