aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/api/burn/WixToolset.BootstrapperApplicationApi/IPackageInfo.cs5
-rw-r--r--src/api/burn/WixToolset.BootstrapperApplicationApi/PackageInfo.cs4
-rw-r--r--src/api/burn/balutil/balinfo.cpp4
-rw-r--r--src/api/burn/balutil/inc/balinfo.h1
-rw-r--r--src/ext/Bal/stdbas/WixInternalUIBootstrapperApplication.cpp25
-rw-r--r--src/ext/Bal/stdbas/WixStandardBootstrapperApplication.cpp85
-rw-r--r--src/ext/Bal/stdbas/precomp.h6
-rw-r--r--src/ext/Bal/stdbas/stdbas.cpp50
-rw-r--r--src/ext/Bal/stdbas/stdbas.vcxproj3
-rw-r--r--src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/BalExtensionFixture.cs55
-rw-r--r--src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/InternalUIBAFixture.cs3
-rw-r--r--src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/.Data/test.icobin0 -> 766 bytes
-rw-r--r--src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/Overridable/WrongCaseBundle.wxs2
-rw-r--r--src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixIuiBa/IuibaWarnings.wxs2
-rw-r--r--src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/BootstrapperApplicationId.wxs3
-rw-r--r--src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/Bundle.wxs3
-rw-r--r--src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/DisplayFilesInUseDialogConditionBundle.wxs13
-rw-r--r--src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/DisplayInternalUIConditionBundle.wxs3
-rw-r--r--src/ext/Bal/wixext/BalBurnBackendExtension.cs22
-rw-r--r--src/ext/Bal/wixext/BalCompiler.cs14
-rw-r--r--src/ext/Bal/wixext/BalWarnings.cs6
-rw-r--r--src/ext/Bal/wixext/Symbols/WixBalPackageInfoSymbol.cs8
-rw-r--r--src/ext/UI/wixlib/WixUI_uk-UA.wxl304
-rw-r--r--src/libs/dutil/WixToolset.DUtil/inc/thmutil.h13
-rw-r--r--src/libs/dutil/WixToolset.DUtil/thmutil.cpp22
-rw-r--r--src/test/burn/TestData/FilesInUseTests/WixStdBaBundle/WixStdBaBundle.wixproj1
-rw-r--r--src/test/burn/TestData/WixStdBaTests/BundleA/Bundle.wxs3
-rw-r--r--src/test/burn/TestData/WixStdBaTests/BundleA/test.icobin0 -> 766 bytes
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/InstallUninstallNET3WithoutPartitions.wixproj1
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/InstallUninstallNET4WithoutPartitions.wixproj1
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/InstallUninstallNativeWithoutPartitions.wixproj1
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/InstallUninstallWithPartitions.wixproj1
-rw-r--r--src/test/msi/TestData/CustomActionFail/CustomActionFail.csproj9
-rw-r--r--src/test/msi/TestData/CustomActionFail/Program.cs1
-rw-r--r--src/test/msi/TestData/FirewallExtensionTests/DynamicFirewallRules/DynamicFirewallRules.wixproj1
-rw-r--r--src/test/msi/TestData/FirewallExtensionTests/FirewallRules/FirewallRules.wixproj1
-rw-r--r--src/test/msi/TestData/FirewallExtensionTests/FirewallRulesInterfaces/FirewallRulesInterfaces.wixproj1
-rw-r--r--src/test/msi/TestData/FirewallExtensionTests/FirewallRulesProperties/FirewallRulesProperties.wixproj1
-rw-r--r--src/test/msi/TestData/FirewallExtensionTests/IgnoreFailedFirewallRules/IgnoreFailedFirewallRules.wixproj1
-rw-r--r--src/test/msi/TestData/FirewallExtensionTests/NestedService/NestedService.wixproj1
-rw-r--r--src/test/msi/TestData/FirewallExtensionTests/ProtocolRules/ProtocolRules.wixproj1
-rw-r--r--src/test/msi/TestData/FirewallExtensionTests/ScopeRules/ScopeRules.wixproj1
-rw-r--r--src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/MsmqInstall.wixproj1
-rw-r--r--src/test/msi/TestData/RemoveFolderExTests/RemoveFolderExTest/RemoveFolderExTest.wixproj1
-rw-r--r--src/test/msi/TestData/Templates/CustomActionFail.exebin4608 -> 0 bytes
-rw-r--r--src/test/msi/TestData/Templates/Product.wxs2
-rw-r--r--src/test/msi/TestData/UIExtensionTests/LocalizedWixUI/LocalizedWixUI.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionGroupTests/ProductA/ProductA.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionGroupTests/ProductAddCommentToExistingGroup/ProductAddCommentToExistingGroup.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionGroupTests/ProductCommentDelete/ProductCommentDelete.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionGroupTests/ProductCommentFail/ProductCommentFail.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionGroupTests/ProductFail/ProductFail.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionGroupTests/ProductFailIfExists/ProductFailIfExists.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionGroupTests/ProductNestedGroups/ProductNestedGroups.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionGroupTests/ProductNewGroupWithComment/ProductNewGroupWithComment.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionGroupTests/ProductNonVitalGroup/ProductNonVitalUserGroup.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionGroupTests/ProductRestrictedDomain/ProductRestrictedDomain.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionGroupTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionUserTests/ProductA/ProductA.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/ProductAddCommentToExistingUser.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/ProductCommentDelete.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/ProductCommentFail.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionUserTests/ProductFail/ProductFail.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionUserTests/ProductFailIfExists/ProductFailIfExists.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/ProductNewUserWithComment.wixproj3
-rw-r--r--src/test/msi/TestData/UtilExtensionUserTests/ProductNonVitalUserGroup/ProductNonVitalUserGroup.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionUserTests/ProductRestrictedDomain/ProductRestrictedDomain.wixproj1
-rw-r--r--src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj1
-rw-r--r--src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs67
-rw-r--r--src/wix/WixToolset.Core.WindowsInstaller/WindowsInstallerBackendErrors.cs6
-rw-r--r--src/wix/WixToolset.Core/Compiler.cs5183
-rw-r--r--src/wix/WixToolset.Core/Compiler_Bundle.cs14
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs9
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs51
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/LanguageFixture.cs14
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/Directory/AnonymousDirectories.wxs22
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.wxs3
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/data/test.icobin0 -> 766 bytes
-rw-r--r--src/xsd/bal.xsd15
79 files changed, 3268 insertions, 2826 deletions
diff --git a/src/api/burn/WixToolset.BootstrapperApplicationApi/IPackageInfo.cs b/src/api/burn/WixToolset.BootstrapperApplicationApi/IPackageInfo.cs
index e2512584..9b5e74cb 100644
--- a/src/api/burn/WixToolset.BootstrapperApplicationApi/IPackageInfo.cs
+++ b/src/api/burn/WixToolset.BootstrapperApplicationApi/IPackageInfo.cs
@@ -28,6 +28,11 @@ namespace WixToolset.BootstrapperApplicationApi
28 string DisplayInternalUICondition { get; } 28 string DisplayInternalUICondition { get; }
29 29
30 /// <summary> 30 /// <summary>
31 /// The authored bal:DisplayFilesInUseDialogCondition.
32 /// </summary>
33 string DisplayFilesInUseDialogCondition { get; }
34
35 /// <summary>
31 /// The package's display name. 36 /// The package's display name.
32 /// </summary> 37 /// </summary>
33 string DisplayName { get; } 38 string DisplayName { get; }
diff --git a/src/api/burn/WixToolset.BootstrapperApplicationApi/PackageInfo.cs b/src/api/burn/WixToolset.BootstrapperApplicationApi/PackageInfo.cs
index e835f9ea..81a8869f 100644
--- a/src/api/burn/WixToolset.BootstrapperApplicationApi/PackageInfo.cs
+++ b/src/api/burn/WixToolset.BootstrapperApplicationApi/PackageInfo.cs
@@ -121,6 +121,9 @@ namespace WixToolset.BootstrapperApplicationApi
121 public string DisplayInternalUICondition { get; internal set; } 121 public string DisplayInternalUICondition { get; internal set; }
122 122
123 /// <inheritdoc/> 123 /// <inheritdoc/>
124 public string DisplayFilesInUseDialogCondition { get; internal set; }
125
126 /// <inheritdoc/>
124 public string ProductCode { get; internal set; } 127 public string ProductCode { get; internal set; }
125 128
126 /// <inheritdoc/> 129 /// <inheritdoc/>
@@ -363,6 +366,7 @@ namespace WixToolset.BootstrapperApplicationApi
363 var package = (PackageInfo)ipackage; 366 var package = (PackageInfo)ipackage;
364 367
365 package.DisplayInternalUICondition = BootstrapperApplicationData.GetAttribute(node, "DisplayInternalUICondition"); 368 package.DisplayInternalUICondition = BootstrapperApplicationData.GetAttribute(node, "DisplayInternalUICondition");
369 package.DisplayFilesInUseDialogCondition = BootstrapperApplicationData.GetAttribute(node, "DisplayFilesInUseDialogCondition");
366 } 370 }
367 371
368 nodes = root.Select("/p:BootstrapperApplicationData/p:WixPrereqInformation", namespaceManager); 372 nodes = root.Select("/p:BootstrapperApplicationData/p:WixPrereqInformation", namespaceManager);
diff --git a/src/api/burn/balutil/balinfo.cpp b/src/api/burn/balutil/balinfo.cpp
index 38c4bd18..ff0dfd9f 100644
--- a/src/api/burn/balutil/balinfo.cpp
+++ b/src/api/burn/balutil/balinfo.cpp
@@ -291,6 +291,7 @@ DAPI_(void) BalInfoUninitialize(
291 ReleaseStr(pBundle->packages.rgPackages[i].sczDescription); 291 ReleaseStr(pBundle->packages.rgPackages[i].sczDescription);
292 ReleaseStr(pBundle->packages.rgPackages[i].sczId); 292 ReleaseStr(pBundle->packages.rgPackages[i].sczId);
293 ReleaseStr(pBundle->packages.rgPackages[i].sczDisplayInternalUICondition); 293 ReleaseStr(pBundle->packages.rgPackages[i].sczDisplayInternalUICondition);
294 ReleaseStr(pBundle->packages.rgPackages[i].sczDisplayFilesInUseDialogCondition);
294 ReleaseStr(pBundle->packages.rgPackages[i].sczProductCode); 295 ReleaseStr(pBundle->packages.rgPackages[i].sczProductCode);
295 ReleaseStr(pBundle->packages.rgPackages[i].sczUpgradeCode); 296 ReleaseStr(pBundle->packages.rgPackages[i].sczUpgradeCode);
296 ReleaseStr(pBundle->packages.rgPackages[i].sczVersion); 297 ReleaseStr(pBundle->packages.rgPackages[i].sczVersion);
@@ -517,6 +518,9 @@ static HRESULT ParseBalPackageInfoFromXml(
517 hr = XmlGetAttributeEx(pNode, L"DisplayInternalUICondition", &pPackage->sczDisplayInternalUICondition); 518 hr = XmlGetAttributeEx(pNode, L"DisplayInternalUICondition", &pPackage->sczDisplayInternalUICondition);
518 ExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get DisplayInternalUICondition setting for package."); 519 ExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get DisplayInternalUICondition setting for package.");
519 520
521 hr = XmlGetAttributeEx(pNode, L"DisplayFilesInUseDialogCondition", &pPackage->sczDisplayFilesInUseDialogCondition);
522 ExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get DisplayFilesInUseDialogCondition setting for package.");
523
520 hr = XmlGetAttributeEx(pNode, L"PrimaryPackageType", &scz); 524 hr = XmlGetAttributeEx(pNode, L"PrimaryPackageType", &scz);
521 ExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get PrimaryPackageType setting for package."); 525 ExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get PrimaryPackageType setting for package.");
522 526
diff --git a/src/api/burn/balutil/inc/balinfo.h b/src/api/burn/balutil/inc/balinfo.h
index 234284f6..8baee844 100644
--- a/src/api/burn/balutil/inc/balinfo.h
+++ b/src/api/burn/balutil/inc/balinfo.h
@@ -54,6 +54,7 @@ typedef struct _BAL_INFO_PACKAGE
54 BOOL fPermanent; 54 BOOL fPermanent;
55 BOOL fVital; 55 BOOL fVital;
56 LPWSTR sczDisplayInternalUICondition; 56 LPWSTR sczDisplayInternalUICondition;
57 LPWSTR sczDisplayFilesInUseDialogCondition;
57 LPWSTR sczProductCode; 58 LPWSTR sczProductCode;
58 LPWSTR sczUpgradeCode; 59 LPWSTR sczUpgradeCode;
59 LPWSTR sczVersion; 60 LPWSTR sczVersion;
diff --git a/src/ext/Bal/stdbas/WixInternalUIBootstrapperApplication.cpp b/src/ext/Bal/stdbas/WixInternalUIBootstrapperApplication.cpp
index 270ce40c..bae098d4 100644
--- a/src/ext/Bal/stdbas/WixInternalUIBootstrapperApplication.cpp
+++ b/src/ext/Bal/stdbas/WixInternalUIBootstrapperApplication.cpp
@@ -557,14 +557,19 @@ private:
557 HRESULT CreateMainWindow() 557 HRESULT CreateMainWindow()
558 { 558 {
559 HRESULT hr = S_OK; 559 HRESULT hr = S_OK;
560 WNDCLASSW wc = { }; 560 WNDCLASSEXW wc = { };
561 DWORD dwWindowStyle = WS_POPUP; 561 DWORD dwWindowStyle = WS_POPUP;
562 562
563 LoadBundleIcon(m_hModule, &m_hIcon, &m_hSmallIcon);
564
565 wc.cbSize = sizeof(WNDCLASSEXW);
563 wc.lpfnWndProc = CWixInternalUIBootstrapperApplication::WndProc; 566 wc.lpfnWndProc = CWixInternalUIBootstrapperApplication::WndProc;
564 wc.hInstance = m_hModule; 567 wc.hInstance = m_hModule;
565 wc.lpszClassName = WIXIUIBA_WINDOW_CLASS; 568 wc.lpszClassName = WIXIUIBA_WINDOW_CLASS;
569 wc.hIcon = m_hIcon;
570 wc.hIconSm = m_hSmallIcon;
566 571
567 if (!::RegisterClassW(&wc)) 572 if (!::RegisterClassExW(&wc))
568 { 573 {
569 ExitWithLastError(hr, "Failed to register window."); 574 ExitWithLastError(hr, "Failed to register window.");
570 } 575 }
@@ -601,6 +606,18 @@ private:
601 ::UnregisterClassW(WIXIUIBA_WINDOW_CLASS, m_hModule); 606 ::UnregisterClassW(WIXIUIBA_WINDOW_CLASS, m_hModule);
602 m_fRegistered = FALSE; 607 m_fRegistered = FALSE;
603 } 608 }
609
610 if (m_hIcon)
611 {
612 ::DestroyIcon(m_hIcon);
613 m_hIcon = NULL;
614 }
615
616 if (m_hSmallIcon)
617 {
618 ::DestroyIcon(m_hSmallIcon);
619 m_hSmallIcon = NULL;
620 }
604 } 621 }
605 622
606 // 623 //
@@ -807,6 +824,8 @@ public:
807 m_sczFailedMessage = NULL; 824 m_sczFailedMessage = NULL;
808 825
809 m_hUiThread = NULL; 826 m_hUiThread = NULL;
827 m_hIcon = NULL;
828 m_hSmallIcon = NULL;
810 m_fRegistered = FALSE; 829 m_fRegistered = FALSE;
811 m_hWnd = NULL; 830 m_hWnd = NULL;
812 831
@@ -847,6 +866,8 @@ private:
847 LPWSTR m_sczConfirmCloseMessage; 866 LPWSTR m_sczConfirmCloseMessage;
848 867
849 HANDLE m_hUiThread; 868 HANDLE m_hUiThread;
869 HICON m_hIcon;
870 HICON m_hSmallIcon;
850 BOOL m_fRegistered; 871 BOOL m_fRegistered;
851 HWND m_hWnd; 872 HWND m_hWnd;
852 873
diff --git a/src/ext/Bal/stdbas/WixStandardBootstrapperApplication.cpp b/src/ext/Bal/stdbas/WixStandardBootstrapperApplication.cpp
index 6cfe0b4c..c1e8b2b3 100644
--- a/src/ext/Bal/stdbas/WixStandardBootstrapperApplication.cpp
+++ b/src/ext/Bal/stdbas/WixStandardBootstrapperApplication.cpp
@@ -1231,34 +1231,52 @@ public: // IBootstrapperApplication
1231 __inout int* pResult 1231 __inout int* pResult
1232 ) 1232 )
1233 { 1233 {
1234 HRESULT hr = S_OK;
1235 BAL_INFO_PACKAGE* pPackage = NULL;
1236 BOOL fShowFilesInUseDialog = TRUE;
1234 1237
1235 if (!m_fShowingInternalUiThisPackage && wzPackageId && *wzPackageId) 1238 if (!m_fShowingInternalUiThisPackage && wzPackageId && *wzPackageId)
1236 { 1239 {
1237 BalLog(BOOTSTRAPPER_LOG_LEVEL_VERBOSE, "Package %ls has %d applications holding files in use.", wzPackageId, cFiles); 1240 BalLog(BOOTSTRAPPER_LOG_LEVEL_VERBOSE, "Package %ls has %d applications holding files in use.", wzPackageId, cFiles);
1238 1241
1239 switch (source) 1242 hr = BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage);
1243 if (SUCCEEDED(hr) && pPackage->sczDisplayFilesInUseDialogCondition)
1240 { 1244 {
1241 case BOOTSTRAPPER_FILES_IN_USE_TYPE_MSI: 1245 hr = BalEvaluateCondition(pPackage->sczDisplayFilesInUseDialogCondition, &fShowFilesInUseDialog);
1242 if (m_fShowStandardFilesInUse) 1246 BalExitOnFailure(hr, "Failed to evaluate condition for package '%ls': %ls", wzPackageId, pPackage->sczDisplayFilesInUseDialogCondition);
1243 { 1247 }
1244 return ShowMsiFilesInUse(cFiles, rgwzFiles, source, pResult); 1248
1245 } 1249 if (fShowFilesInUseDialog)
1246 break; 1250 {
1247 case BOOTSTRAPPER_FILES_IN_USE_TYPE_MSI_RM: 1251 switch (source)
1248 if (m_fShowRMFilesInUse)
1249 {
1250 return ShowMsiFilesInUse(cFiles, rgwzFiles, source, pResult);
1251 }
1252 break;
1253 case BOOTSTRAPPER_FILES_IN_USE_TYPE_NETFX:
1254 if (m_fShowNetfxFilesInUse)
1255 { 1252 {
1256 return ShowNetfxFilesInUse(cFiles, rgwzFiles, pResult); 1253 case BOOTSTRAPPER_FILES_IN_USE_TYPE_MSI:
1254 if (m_fShowStandardFilesInUse)
1255 {
1256 return ShowMsiFilesInUse(cFiles, rgwzFiles, source, pResult);
1257 }
1258 break;
1259 case BOOTSTRAPPER_FILES_IN_USE_TYPE_MSI_RM:
1260 if (m_fShowRMFilesInUse)
1261 {
1262 return ShowMsiFilesInUse(cFiles, rgwzFiles, source, pResult);
1263 }
1264 break;
1265 case BOOTSTRAPPER_FILES_IN_USE_TYPE_NETFX:
1266 if (m_fShowNetfxFilesInUse)
1267 {
1268 return ShowNetfxFilesInUse(cFiles, rgwzFiles, pResult);
1269 }
1270 break;
1257 } 1271 }
1258 break; 1272 }
1273 else
1274 {
1275 *pResult = IDIGNORE;
1259 } 1276 }
1260 } 1277 }
1261 1278
1279 LExit:
1262 return __super::OnExecuteFilesInUse(wzPackageId, cFiles, rgwzFiles, nRecommendation, source, pResult); 1280 return __super::OnExecuteFilesInUse(wzPackageId, cFiles, rgwzFiles, nRecommendation, source, pResult);
1263 } 1281 }
1264 1282
@@ -3283,26 +3301,24 @@ private:
3283 HRESULT CreateMainWindow() 3301 HRESULT CreateMainWindow()
3284 { 3302 {
3285 HRESULT hr = S_OK; 3303 HRESULT hr = S_OK;
3286 WNDCLASSW wc = { }; 3304 WNDCLASSEXW wc = { sizeof(WNDCLASSEXW)};
3287 DWORD dwWindowStyle = 0; 3305 DWORD dwWindowStyle = 0;
3288 int x = CW_USEDEFAULT; 3306 int x = CW_USEDEFAULT;
3289 int y = CW_USEDEFAULT; 3307 int y = CW_USEDEFAULT;
3290 POINT ptCursor = { }; 3308 POINT ptCursor = { };
3291 3309
3292 ThemeInitializeWindowClass(m_pTheme, &wc, CWixStandardBootstrapperApplication::WndProc, m_hModule, WIXSTDBA_WINDOW_CLASS); 3310 ThemeInitializeWindowClassEx(m_pTheme, &wc, CWixStandardBootstrapperApplication::WndProc, m_hModule, WIXSTDBA_WINDOW_CLASS);
3293 3311
3294 // If the theme did not provide an icon, try using the icon from the bundle engine. 3312 // If the theme did not provide an icon, try using the icon from the bundle then fallback to the bundle engine.
3295 if (!wc.hIcon) 3313 if (!wc.hIcon)
3296 { 3314 {
3297 HMODULE hBootstrapperEngine = ::GetModuleHandleW(NULL); 3315 LoadBundleIcon(m_hModule, &m_hIcon, &m_hSmallIcon);
3298 if (hBootstrapperEngine) 3316 wc.hIcon = m_hIcon;
3299 { 3317 wc.hIconSm = m_hSmallIcon;
3300 wc.hIcon = ::LoadIconW(hBootstrapperEngine, MAKEINTRESOURCEW(1));
3301 }
3302 } 3318 }
3303 3319
3304 // Register the window class and create the window. 3320 // Register the window class and create the window.
3305 if (!::RegisterClassW(&wc)) 3321 if (!::RegisterClassExW(&wc))
3306 { 3322 {
3307 ExitWithLastError(hr, "Failed to register window."); 3323 ExitWithLastError(hr, "Failed to register window.");
3308 } 3324 }
@@ -3340,7 +3356,6 @@ private:
3340 return hr; 3356 return hr;
3341 } 3357 }
3342 3358
3343
3344 // 3359 //
3345 // InitializeTaskbarButton - initializes taskbar button for progress. 3360 // InitializeTaskbarButton - initializes taskbar button for progress.
3346 // 3361 //
@@ -3379,6 +3394,18 @@ private:
3379 ::UnregisterClassW(WIXSTDBA_WINDOW_CLASS, m_hModule); 3394 ::UnregisterClassW(WIXSTDBA_WINDOW_CLASS, m_hModule);
3380 m_fRegistered = FALSE; 3395 m_fRegistered = FALSE;
3381 } 3396 }
3397
3398 if (m_hIcon)
3399 {
3400 ::DestroyIcon(m_hIcon);
3401 m_hIcon = NULL;
3402 }
3403
3404 if (m_hSmallIcon)
3405 {
3406 ::DestroyIcon(m_hSmallIcon);
3407 m_hSmallIcon = NULL;
3408 }
3382 } 3409 }
3383 3410
3384 3411
@@ -4804,6 +4831,8 @@ public:
4804 m_pTheme = NULL; 4831 m_pTheme = NULL;
4805 memset(m_rgdwPageIds, 0, sizeof(m_rgdwPageIds)); 4832 memset(m_rgdwPageIds, 0, sizeof(m_rgdwPageIds));
4806 m_hUiThread = NULL; 4833 m_hUiThread = NULL;
4834 m_hIcon = NULL;
4835 m_hSmallIcon = NULL;
4807 m_fRegistered = FALSE; 4836 m_fRegistered = FALSE;
4808 m_hWnd = NULL; 4837 m_hWnd = NULL;
4809 4838
@@ -5092,6 +5121,8 @@ private:
5092 THEME_ASSIGN_CONTROL_ID m_rgInitControls[LAST_WIXSTDBA_CONTROL - WIXSTDBA_FIRST_ASSIGN_CONTROL_ID]; 5121 THEME_ASSIGN_CONTROL_ID m_rgInitControls[LAST_WIXSTDBA_CONTROL - WIXSTDBA_FIRST_ASSIGN_CONTROL_ID];
5093 DWORD m_rgdwPageIds[countof(vrgwzPageNames)]; 5122 DWORD m_rgdwPageIds[countof(vrgwzPageNames)];
5094 HANDLE m_hUiThread; 5123 HANDLE m_hUiThread;
5124 HICON m_hIcon;
5125 HICON m_hSmallIcon;
5095 BOOL m_fRegistered; 5126 BOOL m_fRegistered;
5096 HWND m_hWnd; 5127 HWND m_hWnd;
5097 5128
diff --git a/src/ext/Bal/stdbas/precomp.h b/src/ext/Bal/stdbas/precomp.h
index a6c4cfe4..0faf1548 100644
--- a/src/ext/Bal/stdbas/precomp.h
+++ b/src/ext/Bal/stdbas/precomp.h
@@ -42,3 +42,9 @@
42 42
43#include "stdbas.messages.h" 43#include "stdbas.messages.h"
44#include "WixStandardBootstrapperApplication.h" 44#include "WixStandardBootstrapperApplication.h"
45
46HRESULT LoadBundleIcon(
47 __in HMODULE hModule,
48 __out HICON* phIcon,
49 __out HICON* phSmallIcon
50);
diff --git a/src/ext/Bal/stdbas/stdbas.cpp b/src/ext/Bal/stdbas/stdbas.cpp
new file mode 100644
index 00000000..909bdc23
--- /dev/null
+++ b/src/ext/Bal/stdbas/stdbas.cpp
@@ -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#include "precomp.h"
4
5static const LPCWSTR WIX_BUNDLE_ICON_FILENAME = L"WixBundle.ico";
6
7
8//
9// LoadBundleIcon - loads the icon that was (optionally) authored in the bundle otherwise use the one embedded in the bootstrapper application.
10//
11HRESULT LoadBundleIcon(
12 __in HMODULE hModule,
13 __out HICON* phIcon,
14 __out HICON* phSmallIcon
15)
16{
17 HRESULT hr = S_OK;
18 LPWSTR sczIconPath = NULL;
19 int nIconWidth = ::GetSystemMetrics(SM_CXICON);
20 int nIconHeight = ::GetSystemMetrics(SM_CYICON);
21 int nSmallIconWidth = ::GetSystemMetrics(SM_CXSMICON);
22 int nSmallIconHeight = ::GetSystemMetrics(SM_CYSMICON);
23 HICON hIcon = NULL;
24 HICON hSmallIcon = NULL;
25
26 // First look for the optional authored bundle icon.
27 hr = PathRelativeToModule(&sczIconPath, WIX_BUNDLE_ICON_FILENAME, hModule);
28 ExitOnFailure(hr, "Failed to get path to bundle icon: %ls", WIX_BUNDLE_ICON_FILENAME);
29
30 if (FileExistsEx(sczIconPath, NULL))
31 {
32 hIcon = reinterpret_cast<HICON>(::LoadImageW(NULL, sczIconPath, IMAGE_ICON, nIconWidth, nIconHeight, LR_LOADFROMFILE));
33
34 hSmallIcon = reinterpret_cast<HICON>(::LoadImageW(NULL, sczIconPath, IMAGE_ICON, nSmallIconWidth, nSmallIconHeight, LR_LOADFROMFILE));
35 }
36 else // fallback to the first icon resource in the bootstrapper application.
37 {
38 hIcon = reinterpret_cast<HICON>(::LoadImageW(hModule, MAKEINTRESOURCEW(1), IMAGE_ICON, nIconWidth, nIconHeight, LR_DEFAULTCOLOR));
39
40 hSmallIcon = reinterpret_cast<HICON>(::LoadImageW(hModule, MAKEINTRESOURCEW(1), IMAGE_ICON, nSmallIconWidth, nSmallIconHeight, LR_DEFAULTCOLOR));
41 }
42
43 *phIcon = hIcon;
44 *phSmallIcon = hSmallIcon;
45
46LExit:
47 ReleaseStr(sczIconPath);
48
49 return hr;
50}
diff --git a/src/ext/Bal/stdbas/stdbas.vcxproj b/src/ext/Bal/stdbas/stdbas.vcxproj
index fb2b0682..ba990af7 100644
--- a/src/ext/Bal/stdbas/stdbas.vcxproj
+++ b/src/ext/Bal/stdbas/stdbas.vcxproj
@@ -60,6 +60,7 @@
60 <ClCompile Include="precomp.cpp"> 60 <ClCompile Include="precomp.cpp">
61 <PrecompiledHeader>Create</PrecompiledHeader> 61 <PrecompiledHeader>Create</PrecompiledHeader>
62 </ClCompile> 62 </ClCompile>
63 <ClCompile Include="stdbas.cpp" />
63 <ClCompile Include="WixInternalUIBootstrapperApplication.cpp" /> 64 <ClCompile Include="WixInternalUIBootstrapperApplication.cpp" />
64 <ClCompile Include="WixStandardBootstrapperApplication.cpp" /> 65 <ClCompile Include="WixStandardBootstrapperApplication.cpp" />
65 </ItemGroup> 66 </ItemGroup>
@@ -80,4 +81,4 @@ rc.exe -fo "$(OutDir)stdbas.res" "$(IntDir)stdbas.messages.rc"</Command>
80 </ItemGroup> 81 </ItemGroup>
81 82
82 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> 83 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
83</Project> 84</Project> \ No newline at end of file
diff --git a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/BalExtensionFixture.cs b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/BalExtensionFixture.cs
index 07d3dacb..e599b8e2 100644
--- a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/BalExtensionFixture.cs
+++ b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/BalExtensionFixture.cs
@@ -24,7 +24,8 @@ namespace WixToolsetTest.BootstrapperApplications
24 { 24 {
25 var baseFolder = fs.GetFolder(); 25 var baseFolder = fs.GetFolder();
26 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe"); 26 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe");
27 var bundleSourceFolder = TestData.Get(@"TestData\WixStdBa"); 27 var bundleSourceFolder = TestData.Get(@"TestData", "WixStdBa");
28 var dataFolder = TestData.Get(@"TestData", ".Data");
28 var intermediateFolder = Path.Combine(baseFolder, "obj"); 29 var intermediateFolder = Path.Combine(baseFolder, "obj");
29 var baFolderPath = Path.Combine(baseFolder, "ba"); 30 var baFolderPath = Path.Combine(baseFolder, "ba");
30 var extractFolderPath = Path.Combine(baseFolder, "extract"); 31 var extractFolderPath = Path.Combine(baseFolder, "extract");
@@ -36,6 +37,7 @@ namespace WixToolsetTest.BootstrapperApplications
36 "-ext", TestData.Get(@"WixToolset.BootstrapperApplications.wixext.dll"), 37 "-ext", TestData.Get(@"WixToolset.BootstrapperApplications.wixext.dll"),
37 "-intermediateFolder", intermediateFolder, 38 "-intermediateFolder", intermediateFolder,
38 "-bindpath", Path.Combine(bundleSourceFolder, "data"), 39 "-bindpath", Path.Combine(bundleSourceFolder, "data"),
40 "-bindpath", dataFolder,
39 "-o", bundleFile, 41 "-o", bundleFile,
40 }); 42 });
41 compileResult.AssertSuccess(); 43 compileResult.AssertSuccess();
@@ -56,6 +58,46 @@ namespace WixToolsetTest.BootstrapperApplications
56 } 58 }
57 59
58 [TestMethod] 60 [TestMethod]
61 public void CanBuildUsingDisplayFilesInUseDialogCondition()
62 {
63 using (var fs = new DisposableFileSystem())
64 {
65 var baseFolder = fs.GetFolder();
66 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe");
67 var bundleSourceFolder = TestData.Get(@"TestData", "WixStdBa");
68 var dataFolder = TestData.Get(@"TestData", ".Data");
69 var intermediateFolder = Path.Combine(baseFolder, "obj");
70 var baFolderPath = Path.Combine(baseFolder, "ba");
71 var extractFolderPath = Path.Combine(baseFolder, "extract");
72
73 var compileResult = WixRunner.Execute(new[]
74 {
75 "build",
76 Path.Combine(bundleSourceFolder, "DisplayFilesInUseDialogConditionBundle.wxs"),
77 "-ext", TestData.Get(@"WixToolset.BootstrapperApplications.wixext.dll"),
78 "-intermediateFolder", intermediateFolder,
79 "-bindpath", Path.Combine(bundleSourceFolder, "data"),
80 "-bindpath", dataFolder,
81 "-o", bundleFile,
82 });
83 compileResult.AssertSuccess();
84
85 Assert.IsTrue(File.Exists(bundleFile));
86
87 var extractResult = BundleExtractor.ExtractBAContainer(null, bundleFile, baFolderPath, extractFolderPath);
88 extractResult.AssertSuccess();
89
90 var balPackageInfos = extractResult.GetBADataTestXmlLines("/ba:BootstrapperApplicationData/ba:WixBalPackageInfo");
91 WixAssert.CompareLineByLine(new string[]
92 {
93 "<WixBalPackageInfo PackageId='test.msi' DisplayFilesInUseDialogCondition='1' />",
94 }, balPackageInfos);
95
96 Assert.IsTrue(File.Exists(Path.Combine(baFolderPath, "thm.wxl")));
97 }
98 }
99
100 [TestMethod]
59 public void CanBuildUsingBootstrapperApplicationId() 101 public void CanBuildUsingBootstrapperApplicationId()
60 { 102 {
61 using (var fs = new DisposableFileSystem()) 103 using (var fs = new DisposableFileSystem())
@@ -63,6 +105,7 @@ namespace WixToolsetTest.BootstrapperApplications
63 var baseFolder = fs.GetFolder(); 105 var baseFolder = fs.GetFolder();
64 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe"); 106 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe");
65 var bundleSourceFolder = TestData.Get("TestData", "WixStdBa"); 107 var bundleSourceFolder = TestData.Get("TestData", "WixStdBa");
108 var dataFolder = TestData.Get(@"TestData", ".Data");
66 var intermediateFolder = Path.Combine(baseFolder, "obj"); 109 var intermediateFolder = Path.Combine(baseFolder, "obj");
67 var baFolderPath = Path.Combine(baseFolder, "ba"); 110 var baFolderPath = Path.Combine(baseFolder, "ba");
68 var extractFolderPath = Path.Combine(baseFolder, "extract"); 111 var extractFolderPath = Path.Combine(baseFolder, "extract");
@@ -74,6 +117,7 @@ namespace WixToolsetTest.BootstrapperApplications
74 "-ext", TestData.Get(@"WixToolset.BootstrapperApplications.wixext.dll"), 117 "-ext", TestData.Get(@"WixToolset.BootstrapperApplications.wixext.dll"),
75 "-intermediateFolder", intermediateFolder, 118 "-intermediateFolder", intermediateFolder,
76 "-bindpath", Path.Combine(bundleSourceFolder, "data"), 119 "-bindpath", Path.Combine(bundleSourceFolder, "data"),
120 "-bindpath", dataFolder,
77 "-o", bundleFile, 121 "-o", bundleFile,
78 }); 122 });
79 compileResult.AssertSuccess(); 123 compileResult.AssertSuccess();
@@ -103,7 +147,8 @@ namespace WixToolsetTest.BootstrapperApplications
103 { 147 {
104 var baseFolder = fs.GetFolder(); 148 var baseFolder = fs.GetFolder();
105 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe"); 149 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe");
106 var bundleSourceFolder = TestData.Get(@"TestData\Overridable"); 150 var bundleSourceFolder = TestData.Get(@"TestData", "Overridable");
151 var dataFolder = TestData.Get(@"TestData", ".Data");
107 var intermediateFolder = Path.Combine(baseFolder, "obj"); 152 var intermediateFolder = Path.Combine(baseFolder, "obj");
108 var baFolderPath = Path.Combine(baseFolder, "ba"); 153 var baFolderPath = Path.Combine(baseFolder, "ba");
109 var extractFolderPath = Path.Combine(baseFolder, "extract"); 154 var extractFolderPath = Path.Combine(baseFolder, "extract");
@@ -114,6 +159,7 @@ namespace WixToolsetTest.BootstrapperApplications
114 Path.Combine(bundleSourceFolder, "Bundle.wxs"), 159 Path.Combine(bundleSourceFolder, "Bundle.wxs"),
115 "-ext", TestData.Get(@"WixToolset.BootstrapperApplications.wixext.dll"), 160 "-ext", TestData.Get(@"WixToolset.BootstrapperApplications.wixext.dll"),
116 "-intermediateFolder", intermediateFolder, 161 "-intermediateFolder", intermediateFolder,
162 "-bindpath", dataFolder,
117 "-o", bundleFile, 163 "-o", bundleFile,
118 }); 164 });
119 compileResult.AssertSuccess(); 165 compileResult.AssertSuccess();
@@ -144,7 +190,8 @@ namespace WixToolsetTest.BootstrapperApplications
144 { 190 {
145 var baseFolder = fs.GetFolder(); 191 var baseFolder = fs.GetFolder();
146 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe"); 192 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe");
147 var bundleSourceFolder = TestData.Get(@"TestData\WixStdBa"); 193 var bundleSourceFolder = TestData.Get(@"TestData", "WixStdBa");
194 var dataFolder = TestData.Get(@"TestData", ".Data");
148 var intermediateFolder = Path.Combine(baseFolder, "obj"); 195 var intermediateFolder = Path.Combine(baseFolder, "obj");
149 196
150 var compileResult = WixRunner.Execute(new[] 197 var compileResult = WixRunner.Execute(new[]
@@ -153,6 +200,7 @@ namespace WixToolsetTest.BootstrapperApplications
153 Path.Combine(bundleSourceFolder, "Bundle.wxs"), 200 Path.Combine(bundleSourceFolder, "Bundle.wxs"),
154 "-ext", TestData.Get(@"WixToolset.BootstrapperApplications.wixext.dll"), 201 "-ext", TestData.Get(@"WixToolset.BootstrapperApplications.wixext.dll"),
155 "-intermediateFolder", intermediateFolder, 202 "-intermediateFolder", intermediateFolder,
203 "-bindpath", dataFolder,
156 "-o", bundleFile, 204 "-o", bundleFile,
157 }); 205 });
158 compileResult.AssertSuccess(); 206 compileResult.AssertSuccess();
@@ -298,6 +346,7 @@ namespace WixToolsetTest.BootstrapperApplications
298 { 346 {
299 "bal:Condition/@Condition contains the built-in Variable 'WixBundleAction', which is not available when it is evaluated. (Unavailable Variables are: 'WixBundleAction'.). Rewrite the condition to avoid Variables that are never valid during its evaluation.", 347 "bal:Condition/@Condition contains the built-in Variable 'WixBundleAction', which is not available when it is evaluated. (Unavailable Variables are: 'WixBundleAction'.). Rewrite the condition to avoid Variables that are never valid during its evaluation.",
300 "Overridable variable 'TEST1' collides with 'Test1' with Bundle/@CommandLineVariables value 'caseInsensitive'.", 348 "Overridable variable 'TEST1' collides with 'Test1' with Bundle/@CommandLineVariables value 'caseInsensitive'.",
349 "The *Package/@bal:DisplayFilesInUseDialogCondition attribute's value '=' is not a valid bundle condition.",
301 "The *Package/@bal:DisplayInternalUICondition attribute's value '=' is not a valid bundle condition.", 350 "The *Package/@bal:DisplayInternalUICondition attribute's value '=' is not a valid bundle condition.",
302 "The location of the Variable related to the previous error.", 351 "The location of the Variable related to the previous error.",
303 }, messages.ToArray()); 352 }, messages.ToArray());
diff --git a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/InternalUIBAFixture.cs b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/InternalUIBAFixture.cs
index 72e31540..7b4d00fc 100644
--- a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/InternalUIBAFixture.cs
+++ b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/InternalUIBAFixture.cs
@@ -168,6 +168,7 @@ namespace WixToolsetTest.BootstrapperApplications
168 "WixInternalUIBootstrapperApplication does not support the value of 'force' for Cache on prereq packages. Prereq packages are only cached when they need to be installed.", 168 "WixInternalUIBootstrapperApplication does not support the value of 'force' for Cache on prereq packages. Prereq packages are only cached when they need to be installed.",
169 "WixInternalUIBootstrapperApplication ignores InstallCondition for the primary package so that the MSI UI is always shown.", 169 "WixInternalUIBootstrapperApplication ignores InstallCondition for the primary package so that the MSI UI is always shown.",
170 "WixInternalUIBootstrapperApplication ignores DisplayInternalUICondition for the primary package so that the MSI UI is always shown.", 170 "WixInternalUIBootstrapperApplication ignores DisplayInternalUICondition for the primary package so that the MSI UI is always shown.",
171 "WixInternalUIBootstrapperApplication ignores DisplayFilesInUseDialogCondition for the primary package so that the MSI UI is always shown.",
171 "When using WixInternalUIBootstrapperApplication, all prereq packages should be before the primary package in the chain. The prereq packages are always installed before the primary package.", 172 "When using WixInternalUIBootstrapperApplication, all prereq packages should be before the primary package in the chain. The prereq packages are always installed before the primary package.",
172 }, compileResult.Messages.Select(m => m.ToString()).ToArray()); 173 }, compileResult.Messages.Select(m => m.ToString()).ToArray());
173 174
@@ -181,7 +182,7 @@ namespace WixToolsetTest.BootstrapperApplications
181 var balPackageInfos = extractResult.GetBADataTestXmlLines("/ba:BootstrapperApplicationData/ba:WixBalPackageInfo"); 182 var balPackageInfos = extractResult.GetBADataTestXmlLines("/ba:BootstrapperApplicationData/ba:WixBalPackageInfo");
182 WixAssert.CompareLineByLine(new string[] 183 WixAssert.CompareLineByLine(new string[]
183 { 184 {
184 "<WixBalPackageInfo PackageId='test.msi' DisplayInternalUICondition='DISPLAYTEST' PrimaryPackageType='default' />", 185 "<WixBalPackageInfo PackageId='test.msi' DisplayInternalUICondition='DISPLAYTEST' DisplayFilesInUseDialogCondition='DISPLAYTEST' PrimaryPackageType='default' />",
185 }, balPackageInfos); 186 }, balPackageInfos);
186 187
187 var mbaPrereqInfos = extractResult.GetBADataTestXmlLines("/ba:BootstrapperApplicationData/ba:WixPrereqInformation"); 188 var mbaPrereqInfos = extractResult.GetBADataTestXmlLines("/ba:BootstrapperApplicationData/ba:WixPrereqInformation");
diff --git a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/.Data/test.ico b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/.Data/test.ico
new file mode 100644
index 00000000..906ce324
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/.Data/test.ico
Binary files differ
diff --git a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/Overridable/WrongCaseBundle.wxs b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/Overridable/WrongCaseBundle.wxs
index 67dfc589..33b2d64c 100644
--- a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/Overridable/WrongCaseBundle.wxs
+++ b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/Overridable/WrongCaseBundle.wxs
@@ -9,7 +9,7 @@
9 <Variable Name="TEST1" bal:Overridable="yes" /> 9 <Variable Name="TEST1" bal:Overridable="yes" />
10 <Chain> 10 <Chain>
11 <ExePackage Permanent="yes" DetectCondition="none" SourceFile="runtimes\win-x86\native\wixnative.exe" /> 11 <ExePackage Permanent="yes" DetectCondition="none" SourceFile="runtimes\win-x86\native\wixnative.exe" />
12 <MsiPackage SourceFile="test.msi" bal:DisplayInternalUICondition="!(loc.NonsensePlanCondition)" /> 12 <MsiPackage SourceFile="test.msi" bal:DisplayInternalUICondition="!(loc.NonsensePlanCondition)" bal:DisplayFilesInUseDialogCondition="!(loc.NonsensePlanCondition)" />
13 </Chain> 13 </Chain>
14 <bal:Condition Condition="!(loc.NonsenseDetectCondition)" Message="Unsupported" /> 14 <bal:Condition Condition="!(loc.NonsenseDetectCondition)" Message="Unsupported" />
15 </Bundle> 15 </Bundle>
diff --git a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixIuiBa/IuibaWarnings.wxs b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixIuiBa/IuibaWarnings.wxs
index 2cf9787d..9c9aa0f8 100644
--- a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixIuiBa/IuibaWarnings.wxs
+++ b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixIuiBa/IuibaWarnings.wxs
@@ -6,7 +6,7 @@
6 <bal:WixInternalUIBootstrapperApplication /> 6 <bal:WixInternalUIBootstrapperApplication />
7 </BootstrapperApplication> 7 </BootstrapperApplication>
8 <Chain> 8 <Chain>
9 <MsiPackage SourceFile="test.msi" InstallCondition="INSTALLTEST" bal:DisplayInternalUICondition="DISPLAYTEST" /> 9 <MsiPackage SourceFile="test.msi" InstallCondition="INSTALLTEST" bal:DisplayInternalUICondition="DISPLAYTEST" bal:DisplayFilesInUseDialogCondition="DISPLAYTEST" />
10 <ExePackage Permanent="yes" DetectCondition="none" SourceFile="runtimes\win-x86\native\wixnative.exe" Cache="force" /> 10 <ExePackage Permanent="yes" DetectCondition="none" SourceFile="runtimes\win-x86\native\wixnative.exe" Cache="force" />
11 </Chain> 11 </Chain>
12 </Bundle> 12 </Bundle>
diff --git a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/BootstrapperApplicationId.wxs b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/BootstrapperApplicationId.wxs
index e1945f53..44c15999 100644
--- a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/BootstrapperApplicationId.wxs
+++ b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/BootstrapperApplicationId.wxs
@@ -1,7 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" 2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"> 3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2"> 4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2"
5 IconSourceFile="test.ico">
5 <BootstrapperApplication Id="Custom"> 6 <BootstrapperApplication Id="Custom">
6 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" /> 7 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" />
7 </BootstrapperApplication> 8 </BootstrapperApplication>
diff --git a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/Bundle.wxs b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/Bundle.wxs
index c17b53ff..e0346900 100644
--- a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/Bundle.wxs
+++ b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/Bundle.wxs
@@ -1,7 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" 2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"> 3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2"> 4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2"
5 IconSourceFile="test.ico">
5 <BootstrapperApplication> 6 <BootstrapperApplication>
6 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" /> 7 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" />
7 </BootstrapperApplication> 8 </BootstrapperApplication>
diff --git a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/DisplayFilesInUseDialogConditionBundle.wxs b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/DisplayFilesInUseDialogConditionBundle.wxs
new file mode 100644
index 00000000..098d6f83
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/DisplayFilesInUseDialogConditionBundle.wxs
@@ -0,0 +1,13 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2"
5 IconSourceFile="test.ico">
6 <BootstrapperApplication>
7 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" />
8 </BootstrapperApplication>
9 <Chain>
10 <MsiPackage SourceFile="test.msi" bal:DisplayFilesInUseDialogCondition="1" />
11 </Chain>
12 </Bundle>
13</Wix>
diff --git a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/DisplayInternalUIConditionBundle.wxs b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/DisplayInternalUIConditionBundle.wxs
index f08cfe6a..2dea66fd 100644
--- a/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/DisplayInternalUIConditionBundle.wxs
+++ b/src/ext/Bal/test/WixToolsetTest.BootstrapperApplications/TestData/WixStdBa/DisplayInternalUIConditionBundle.wxs
@@ -1,7 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" 2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"> 3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2"> 4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2"
5 IconSourceFile="test.ico">
5 <BootstrapperApplication> 6 <BootstrapperApplication>
6 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" /> 7 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" />
7 </BootstrapperApplication> 8 </BootstrapperApplication>
diff --git a/src/ext/Bal/wixext/BalBurnBackendExtension.cs b/src/ext/Bal/wixext/BalBurnBackendExtension.cs
index 82195549..5831bb8a 100644
--- a/src/ext/Bal/wixext/BalBurnBackendExtension.cs
+++ b/src/ext/Bal/wixext/BalBurnBackendExtension.cs
@@ -51,6 +51,11 @@ namespace WixToolset.BootstrapperApplications
51 writer.WriteAttributeString("DisplayInternalUICondition", balPackageInfoSymbol.DisplayInternalUICondition); 51 writer.WriteAttributeString("DisplayInternalUICondition", balPackageInfoSymbol.DisplayInternalUICondition);
52 } 52 }
53 53
54 if (balPackageInfoSymbol.DisplayFilesInUseDialogCondition != null)
55 {
56 writer.WriteAttributeString("DisplayFilesInUseDialogCondition", balPackageInfoSymbol.DisplayFilesInUseDialogCondition);
57 }
58
54 if (balPackageInfoSymbol.PrimaryPackageType != BalPrimaryPackageType.None) 59 if (balPackageInfoSymbol.PrimaryPackageType != BalPrimaryPackageType.None)
55 { 60 {
56 writer.WriteAttributeString("PrimaryPackageType", balPackageInfoSymbol.PrimaryPackageType.ToString().ToLower()); 61 writer.WriteAttributeString("PrimaryPackageType", balPackageInfoSymbol.PrimaryPackageType.ToString().ToLower());
@@ -104,6 +109,7 @@ namespace WixToolset.BootstrapperApplications
104 109
105 this.VerifyBalConditions(section); 110 this.VerifyBalConditions(section);
106 this.VerifyDisplayInternalUICondition(section); 111 this.VerifyDisplayInternalUICondition(section);
112 this.VerifyDisplayFilesInUseDialogCondition(section);
107 this.VerifyOverridableVariables(section); 113 this.VerifyOverridableVariables(section);
108 114
109 var balBaSymbol = section.Symbols.OfType<WixBalBootstrapperApplicationSymbol>().SingleOrDefault(); 115 var balBaSymbol = section.Symbols.OfType<WixBalBootstrapperApplicationSymbol>().SingleOrDefault();
@@ -195,6 +201,17 @@ namespace WixToolset.BootstrapperApplications
195 } 201 }
196 } 202 }
197 203
204 private void VerifyDisplayFilesInUseDialogCondition(IntermediateSection section)
205 {
206 foreach (var balPackageInfoSymbol in section.Symbols.OfType<WixBalPackageInfoSymbol>().ToList())
207 {
208 if (balPackageInfoSymbol.DisplayFilesInUseDialogCondition != null)
209 {
210 this.BackendHelper.ValidateBundleCondition(balPackageInfoSymbol.SourceLineNumbers, "*Package", "bal:DisplayFilesInUseDialogCondition", balPackageInfoSymbol.DisplayFilesInUseDialogCondition, BundleConditionPhase.Plan);
211 }
212 }
213 }
214
198 private void VerifyPrimaryPackages(IntermediateSection section, SourceLineNumber baSourceLineNumbers) 215 private void VerifyPrimaryPackages(IntermediateSection section, SourceLineNumber baSourceLineNumbers)
199 { 216 {
200 WixBalPackageInfoSymbol defaultPrimaryPackage = null; 217 WixBalPackageInfoSymbol defaultPrimaryPackage = null;
@@ -420,6 +437,11 @@ namespace WixToolset.BootstrapperApplications
420 { 437 {
421 this.Messaging.Write(BalWarnings.IuibaPrimaryPackageDisplayInternalUICondition(packageSymbol.SourceLineNumbers)); 438 this.Messaging.Write(BalWarnings.IuibaPrimaryPackageDisplayInternalUICondition(packageSymbol.SourceLineNumbers));
422 } 439 }
440
441 if (balPackageInfoSymbol.DisplayFilesInUseDialogCondition != null)
442 {
443 this.Messaging.Write(BalWarnings.IuibaPrimaryPackageDisplayFilesInUseDialogCondition(packageSymbol.SourceLineNumbers));
444 }
423 } 445 }
424 446
425 private void VerifyOverridableVariables(IntermediateSection section) 447 private void VerifyOverridableVariables(IntermediateSection section)
diff --git a/src/ext/Bal/wixext/BalCompiler.cs b/src/ext/Bal/wixext/BalCompiler.cs
index 35c86233..b7d5f679 100644
--- a/src/ext/Bal/wixext/BalCompiler.cs
+++ b/src/ext/Bal/wixext/BalCompiler.cs
@@ -200,6 +200,20 @@ namespace WixToolset.BootstrapperApplications
200 break; 200 break;
201 } 201 }
202 break; 202 break;
203 case "DisplayFilesInUseDialogCondition":
204 switch (parentElement.Name.LocalName)
205 {
206 case "MsiPackage":
207 case "MspPackage":
208 var displayFilesInUseDialogCondition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute);
209 var packageInfo = this.GetBalPackageInfoSymbol(section, sourceLineNumbers, packageId);
210 packageInfo.DisplayFilesInUseDialogCondition = displayFilesInUseDialogCondition;
211 break;
212 default:
213 this.ParseHelper.UnexpectedAttribute(parentElement, attribute);
214 break;
215 }
216 break;
203 case "PrimaryPackageType": 217 case "PrimaryPackageType":
204 { 218 {
205 var primaryPackageType = BalPrimaryPackageType.None; 219 var primaryPackageType = BalPrimaryPackageType.None;
diff --git a/src/ext/Bal/wixext/BalWarnings.cs b/src/ext/Bal/wixext/BalWarnings.cs
index 8c5d892f..f86837f9 100644
--- a/src/ext/Bal/wixext/BalWarnings.cs
+++ b/src/ext/Bal/wixext/BalWarnings.cs
@@ -23,6 +23,11 @@ namespace WixToolset.BootstrapperApplications
23 return Message(sourceLineNumbers, Ids.IuibaPrimaryPackageDisplayInternalUICondition, "WixInternalUIBootstrapperApplication ignores DisplayInternalUICondition for the primary package so that the MSI UI is always shown."); 23 return Message(sourceLineNumbers, Ids.IuibaPrimaryPackageDisplayInternalUICondition, "WixInternalUIBootstrapperApplication ignores DisplayInternalUICondition for the primary package so that the MSI UI is always shown.");
24 } 24 }
25 25
26 public static Message IuibaPrimaryPackageDisplayFilesInUseDialogCondition(SourceLineNumber sourceLineNumbers)
27 {
28 return Message(sourceLineNumbers, Ids.IuibaPrimaryPackageDisplayFilesInUseDialogCondition, "WixInternalUIBootstrapperApplication ignores DisplayFilesInUseDialogCondition for the primary package so that the MSI UI is always shown.");
29 }
30
26 public static Message IuibaPrimaryPackageInstallCondition(SourceLineNumber sourceLineNumbers) 31 public static Message IuibaPrimaryPackageInstallCondition(SourceLineNumber sourceLineNumbers)
27 { 32 {
28 return Message(sourceLineNumbers, Ids.IuibaPrimaryPackageInstallCondition, "WixInternalUIBootstrapperApplication ignores InstallCondition for the primary package so that the MSI UI is always shown."); 33 return Message(sourceLineNumbers, Ids.IuibaPrimaryPackageInstallCondition, "WixInternalUIBootstrapperApplication ignores InstallCondition for the primary package so that the MSI UI is always shown.");
@@ -56,6 +61,7 @@ namespace WixToolset.BootstrapperApplications
56 IuibaPrimaryPackageDisplayInternalUICondition = 6504, 61 IuibaPrimaryPackageDisplayInternalUICondition = 6504,
57 IuibaPrereqPackageAfterPrimaryPackage = 6505, 62 IuibaPrereqPackageAfterPrimaryPackage = 6505,
58 DeprecatedBAFactoryAssemblyAttribute = 6506, 63 DeprecatedBAFactoryAssemblyAttribute = 6506,
64 IuibaPrimaryPackageDisplayFilesInUseDialogCondition = 6507,
59 } 65 }
60 } 66 }
61} 67}
diff --git a/src/ext/Bal/wixext/Symbols/WixBalPackageInfoSymbol.cs b/src/ext/Bal/wixext/Symbols/WixBalPackageInfoSymbol.cs
index e2636d33..6e90c2b9 100644
--- a/src/ext/Bal/wixext/Symbols/WixBalPackageInfoSymbol.cs
+++ b/src/ext/Bal/wixext/Symbols/WixBalPackageInfoSymbol.cs
@@ -14,6 +14,7 @@ namespace WixToolset.BootstrapperApplications
14 new IntermediateFieldDefinition(nameof(WixBalPackageInfoSymbolFields.PackageId), IntermediateFieldType.String), 14 new IntermediateFieldDefinition(nameof(WixBalPackageInfoSymbolFields.PackageId), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixBalPackageInfoSymbolFields.DisplayInternalUICondition), IntermediateFieldType.String), 15 new IntermediateFieldDefinition(nameof(WixBalPackageInfoSymbolFields.DisplayInternalUICondition), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(WixBalPackageInfoSymbolFields.PrimaryPackageType), IntermediateFieldType.Number), 16 new IntermediateFieldDefinition(nameof(WixBalPackageInfoSymbolFields.PrimaryPackageType), IntermediateFieldType.Number),
17 new IntermediateFieldDefinition(nameof(WixBalPackageInfoSymbolFields.DisplayFilesInUseDialogCondition), IntermediateFieldType.String),
17 }, 18 },
18 typeof(WixBalPackageInfoSymbol)); 19 typeof(WixBalPackageInfoSymbol));
19 } 20 }
@@ -28,6 +29,7 @@ namespace WixToolset.BootstrapperApplications.Symbols
28 PackageId, 29 PackageId,
29 DisplayInternalUICondition, 30 DisplayInternalUICondition,
30 PrimaryPackageType, 31 PrimaryPackageType,
32 DisplayFilesInUseDialogCondition,
31 } 33 }
32 34
33 public enum BalPrimaryPackageType 35 public enum BalPrimaryPackageType
@@ -68,5 +70,11 @@ namespace WixToolset.BootstrapperApplications.Symbols
68 get => (BalPrimaryPackageType)this.Fields[(int)WixBalPackageInfoSymbolFields.PrimaryPackageType].AsNumber(); 70 get => (BalPrimaryPackageType)this.Fields[(int)WixBalPackageInfoSymbolFields.PrimaryPackageType].AsNumber();
69 set => this.Set((int)WixBalPackageInfoSymbolFields.PrimaryPackageType, (int)value); 71 set => this.Set((int)WixBalPackageInfoSymbolFields.PrimaryPackageType, (int)value);
70 } 72 }
73
74 public string DisplayFilesInUseDialogCondition
75 {
76 get => this.Fields[(int)WixBalPackageInfoSymbolFields.DisplayFilesInUseDialogCondition].AsString();
77 set => this.Set((int)WixBalPackageInfoSymbolFields.DisplayFilesInUseDialogCondition, value);
78 }
71 } 79 }
72} 80}
diff --git a/src/ext/UI/wixlib/WixUI_uk-UA.wxl b/src/ext/UI/wixlib/WixUI_uk-UA.wxl
index d27f226e..645b6eee 100644
--- a/src/ext/UI/wixlib/WixUI_uk-UA.wxl
+++ b/src/ext/UI/wixlib/WixUI_uk-UA.wxl
@@ -17,8 +17,8 @@
17 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 17 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
18 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}ОзнайомтеÑÑ Ð· ліцензійною угодою Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 18 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}ОзнайомтеÑÑ Ð· ліцензійною угодою Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
19 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes" Value="Я &amp;приймаю умови ліцензійної угоди" /> 19 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes" Value="Я &amp;приймаю умови ліцензійної угоди" />
20 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes" Value="Щоб інÑталювати продукт із параметрами за промовчаннÑм Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, натиÑніть кнопку &quot;ІнÑталювати&quot;. Щоб змінити параметри інÑталÑції, натиÑніть кнопку &quot;Додатково&quot;." /> 20 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes" Value="Щоб інÑталювати продукт із параметрами за замовчуваннÑм Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, натиÑніть кнопку &quot;ІнÑталювати&quot;. Щоб змінити параметри інÑталÑції, натиÑніть кнопку &quot;Додатково&quot;." />
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes" Value="Щоб інÑталювати продукт із параметрами за промовчаннÑм Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, натиÑніть кнопку &quot;ІнÑталювати&quot;. Щоб змінити параметри інÑталÑції, натиÑніть кнопку &quot;Додатково&quot;." /> 21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes" Value="Щоб інÑталювати продукт із параметрами за замовчуваннÑм Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, натиÑніть кнопку &quot;ІнÑталювати&quot;. Щоб змінити параметри інÑталÑції, натиÑніть кнопку &quot;Додатково&quot;." />
22 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes" Value="&amp;ІнÑталювати" /> 22 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes" Value="&amp;ІнÑталювати" />
23 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes" Value="Д&amp;одатково" /> 23 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes" Value="Д&amp;одатково" />
24 <String Id="Advanced_Font_Normal_Size" Overridable="yes" Value="8" /> 24 <String Id="Advanced_Font_Normal_Size" Overridable="yes" Value="8" />
@@ -49,8 +49,8 @@
49 <String Id="CustomizeDlgReset" Overridable="yes" Value="&amp;СкиданнÑ" /> 49 <String Id="CustomizeDlgReset" Overridable="yes" Value="&amp;СкиданнÑ" />
50 <String Id="CustomizeDlgDiskCost" Overridable="yes" Value="ВикориÑÑ‚Ð°Ð½Ð½Ñ &amp;диÑкового проÑтору" /> 50 <String Id="CustomizeDlgDiskCost" Overridable="yes" Value="ВикориÑÑ‚Ð°Ð½Ð½Ñ &amp;диÑкового проÑтору" />
51 <String Id="CustomizeDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 51 <String Id="CustomizeDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
52 <String Id="CustomizeDlgText" Overridable="yes" Value="СпоÑіб інÑталÑції компонентів можна змінити, клацаючи піктограми в дереві нижче." /> 52 <String Id="CustomizeDlgText" Overridable="yes" Value="СпоÑіб інÑталÑції компонентів можна змінити, натиÑкаючи піктограми в дереві нижче." />
53 <String Id="CustomizeDlgDescription" Overridable="yes" Value="Виберіть ÑпоÑіб інÑталÑції компонентів." /> 53 <String Id="CustomizeDlgDescription" Overridable="yes" Value="Оберіть ÑпоÑіб інÑталÑції компонентів." />
54 <String Id="CustomizeDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Вибіркова інÑталÑціÑ" /> 54 <String Id="CustomizeDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Вибіркова інÑталÑціÑ" />
55 <String Id="CustomizeDlgItemDescription" Overridable="yes" Value="CustomizeDlgItemDescription-CustomizeDlgItemDescription" /> 55 <String Id="CustomizeDlgItemDescription" Overridable="yes" Value="CustomizeDlgItemDescription-CustomizeDlgItemDescription" />
56 <String Id="CustomizeDlgItemSize" Overridable="yes" Value="CustomizeDlgItemSize-CustomizeDlgItemSize" /> 56 <String Id="CustomizeDlgItemSize" Overridable="yes" Value="CustomizeDlgItemSize-CustomizeDlgItemSize" />
@@ -59,8 +59,8 @@
59 59
60 <String Id="DiskCostDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 60 <String Id="DiskCostDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
61 <String Id="DiskCostDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 61 <String Id="DiskCostDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
62 <String Id="DiskCostDlgText" Overridable="yes" Value="У виділених томах бракує диÑкового проÑтору Ð´Ð»Ñ Ñ–Ð½ÑталÑції вибраних компонентів. Можна видалити з виділених томів кілька файлів, інÑталювати менше компонентів або вибрати інші диÑки призначеннÑ." /> 62 <String Id="DiskCostDlgText" Overridable="yes" Value="У виділених томах бракує диÑкового проÑтору Ð´Ð»Ñ Ñ–Ð½ÑталÑції обраних компонентів. Можна видалити з виділених томів кілька файлів, інÑталювати менше компонентів або вибрати інші диÑки призначеннÑ." />
63 <String Id="DiskCostDlgDescription" Overridable="yes" Value="ДиÑковий проÑтір, необхідний Ð´Ð»Ñ Ñ–Ð½ÑталÑції вибраних компонентів." /> 63 <String Id="DiskCostDlgDescription" Overridable="yes" Value="ДиÑковий проÑтір, необхідний Ð´Ð»Ñ Ñ–Ð½ÑталÑції обраних компонентів." />
64 <String Id="DiskCostDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Вимоги до диÑкового проÑтору" /> 64 <String Id="DiskCostDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Вимоги до диÑкового проÑтору" />
65 <String Id="DiskCostDlgVolumeList" Overridable="yes" Value="{120}{70}{70}{70}{70}" /> 65 <String Id="DiskCostDlgVolumeList" Overridable="yes" Value="{120}{70}{70}{70}{70}" />
66 66
@@ -83,7 +83,7 @@
83 <String Id="FeaturesDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 83 <String Id="FeaturesDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
84 <String Id="FeaturesDlgTree" Overridable="yes" Value="Компоненти продукту" /> 84 <String Id="FeaturesDlgTree" Overridable="yes" Value="Компоненти продукту" />
85 <String Id="FeaturesDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 85 <String Id="FeaturesDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
86 <String Id="FeaturesDlgDescription" Overridable="yes" Value="Виберіть ÑпоÑіб інÑталÑції компонентів." /> 86 <String Id="FeaturesDlgDescription" Overridable="yes" Value="Оберіть ÑпоÑіб інÑталÑції компонентів." />
87 <String Id="FeaturesDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Компоненти продукту" /> 87 <String Id="FeaturesDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Компоненти продукту" />
88 <String Id="FeaturesDlgItemDescription" Overridable="yes" Value="FeaturesDlgItemDescription" /> 88 <String Id="FeaturesDlgItemDescription" Overridable="yes" Value="FeaturesDlgItemDescription" />
89 <String Id="FeaturesDlgItemSize" Overridable="yes" Value="FeaturesDlgItemSize" /> 89 <String Id="FeaturesDlgItemSize" Overridable="yes" Value="FeaturesDlgItemSize" />
@@ -93,14 +93,14 @@
93 <String Id="FilesInUse_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 93 <String Id="FilesInUse_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
94 <String Id="FilesInUseExit" Overridable="yes" Value="Ви&amp;хід" /> 94 <String Id="FilesInUseExit" Overridable="yes" Value="Ви&amp;хід" />
95 <String Id="FilesInUseBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 95 <String Id="FilesInUseBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
96 <String Id="FilesInUseText" Overridable="yes" Value="Ðаведені нижче заÑтоÑунки викориÑтовують файли, Ñкі підлÑгають оновленню під Ñ‡Ð°Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. Закривши ці заÑтоÑунки, натиÑніть кнопку &quot;&amp;Повторити&quot;, щоб продовжити інÑталÑцію, або кнопку &quot;Закрити&quot;, щоб припинити Ñ—Ñ—." /> 96 <String Id="FilesInUseText" Overridable="yes" Value="Ðаведені нижче додатки викориÑтовують файли, що підлÑгають оновленню під Ñ‡Ð°Ñ Ñ–Ð½ÑталÑції. Закривши ці додатки, натиÑніть кнопку &quot;&amp;Повторити&quot;, щоб продовжити інÑталÑцію, або кнопку &quot;Закрити&quot;, щоб припинити Ñ—Ñ—." />
97 <String Id="FilesInUseDescription" Overridable="yes" Value="ДеÑкі файли, що підлÑгають оновленню, зараз викориÑтовуютьÑÑ." /> 97 <String Id="FilesInUseDescription" Overridable="yes" Value="ДеÑкі файли, що підлÑгають оновленню, зараз викориÑтовуютьÑÑ." />
98 <String Id="FilesInUseTitle" Overridable="yes" Value="{\WixUI_Font_Title}Файли, Ñкі викориÑтовуютьÑÑ" /> 98 <String Id="FilesInUseTitle" Overridable="yes" Value="{\WixUI_Font_Title}Файли, Ñкі викориÑтовуютьÑÑ" />
99 99
100 <String Id="InstallDirDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 100 <String Id="InstallDirDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
101 <String Id="InstallDirDlgChange" Overridable="yes" Value="&amp;Змінити..." /> 101 <String Id="InstallDirDlgChange" Overridable="yes" Value="&amp;Змінити..." />
102 <String Id="InstallDirDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Папка призначеннÑ" /> 102 <String Id="InstallDirDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Папка призначеннÑ" />
103 <String Id="InstallDirDlgDescription" Overridable="yes" Value="Ð”Ð»Ñ Ñ–Ð½ÑталÑції в папку за промовчаннÑм натиÑніть кнопку &quot;Далі&quot;; щоб вибрати іншу папку, натиÑніть кнопку &quot;Змінити&quot;." /> 103 <String Id="InstallDirDlgDescription" Overridable="yes" Value="Ð”Ð»Ñ Ñ–Ð½ÑталÑції в папку за замовчуваннÑм натиÑніть кнопку &quot;Далі&quot;; щоб вибрати іншу папку, натиÑніть кнопку &quot;Змінити&quot;." />
104 <String Id="InstallDirDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 104 <String Id="InstallDirDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
105 <String Id="InstallDirDlgFolderLabel" Overridable="yes" Value="Папка Ð´Ð»Ñ Ñ–Ð½ÑталÑції програми [ProductName]:" /> 105 <String Id="InstallDirDlgFolderLabel" Overridable="yes" Value="Папка Ð´Ð»Ñ Ñ–Ð½ÑталÑції програми [ProductName]:" />
106 106
@@ -108,16 +108,16 @@
108 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 108 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
109 <String Id="InstallScopeDlgDescription" Overridable="yes" Value="Вибір типу й папки Ð´Ð»Ñ Ñ–Ð½ÑталÑції" /> 109 <String Id="InstallScopeDlgDescription" Overridable="yes" Value="Вибір типу й папки Ð´Ð»Ñ Ñ–Ð½ÑталÑції" />
110 <String Id="InstallScopeDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Тип інÑталÑції" /> 110 <String Id="InstallScopeDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Тип інÑталÑції" />
111 <String Id="InstallScopeDlgPerUser" Overridable="yes" Value="{\WixUI_Font_Emphasized}ІнÑталювати &amp;лише Ð´Ð»Ñ Ñебе ([LogonUser])" /> 111 <String Id="InstallScopeDlgPerUser" Overridable="yes" Value="{\WixUI_Font_Emphasized}ІнÑталювати &amp;Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ кориÑтувача ([LogonUser])" />
112 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes" Value="[ProductName] буде інÑтальовано в папку на рівні кориÑтувача; доÑтуп буде можливий лише з вашого облікового запиÑу кориÑтувача. Права локального адмініÑтратора не потрібні." /> 112 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes" Value="[ProductName] буде інÑтальовано в папку на рівні кориÑтувача; доÑтуп буде можливий лише з вашого облікового запиÑу кориÑтувача. Права локального адмініÑтратора не потрібні." />
113 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes" Value="[ProductName] не підтримує інÑталÑції на рівні кориÑтувача." /> 113 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes" Value="[ProductName] не підтримує інÑталÑції на рівні кориÑтувача." />
114 <String Id="InstallScopeDlgPerMachine" Overridable="yes" Value="{\WixUI_Font_Emphasized}ІнÑталювати Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів цього &amp;комп’ютера" /> 114 <String Id="InstallScopeDlgPerMachine" Overridable="yes" Value="{\WixUI_Font_Emphasized}ІнÑталювати Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів цього &amp;комп’ютеру" />
115 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes" Value="[ProductName] буде інÑтальовано в папку за промовчаннÑм на рівні комп’ютера; доÑтуп буде можливий Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів. Папку за промовчаннÑм Ð´Ð»Ñ Ñ–Ð½ÑталÑції можна змінити. Вам необхідні права локального адмініÑтратора." /> 115 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes" Value="[ProductName] буде інÑтальовано в папку за замовчуваннÑм на рівні комп’ютеру; доÑтуп буде можливий Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів. Папку за замовчуваннÑм Ð´Ð»Ñ Ñ–Ð½ÑталÑції можна змінити. Вам необхідні права локального адмініÑтратора." />
116 <String Id="InstallScopeDlgFolderLabel" Overridable="yes" Value="&amp;Папка Ð´Ð»Ñ Ñ–Ð½ÑталÑції:" /> 116 <String Id="InstallScopeDlgFolderLabel" Overridable="yes" Value="&amp;Папка Ð´Ð»Ñ Ñ–Ð½ÑталÑції:" />
117 <String Id="InstallScopeDlgChange" Overridable="yes" Value="&amp;Змінити..." /> 117 <String Id="InstallScopeDlgChange" Overridable="yes" Value="&amp;Змінити..." />
118 118
119 <String Id="InvalidDirDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 119 <String Id="InvalidDirDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
120 <String Id="InvalidDirDlgText" Overridable="yes" Value="Каталог Ð´Ð»Ñ Ñ–Ð½ÑталÑції має міÑтитиÑÑ Ð½Ð° локальному жорÑткому диÑку." /> 120 <String Id="InvalidDirDlgText" Overridable="yes" Value="Каталог Ð´Ð»Ñ Ñ–Ð½ÑталÑції має міÑтитиÑÑŒ на локальному жорÑткому диÑку." />
121 <String Id="InvalidDirDlgIcon" Overridable="yes" Value="WixUI_Ico_Info" /> 121 <String Id="InvalidDirDlgIcon" Overridable="yes" Value="WixUI_Ico_Info" />
122 <String Id="InvalidDirDlgIconTooltip" Overridable="yes" Value="Піктограма відомоÑтей" /> 122 <String Id="InvalidDirDlgIconTooltip" Overridable="yes" Value="Піктограма відомоÑтей" />
123 123
@@ -135,10 +135,10 @@
135 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes" Value="&amp;Видалити" /> 135 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes" Value="&amp;Видалити" />
136 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes" Value="Видалити інÑталÑцію" /> 136 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes" Value="Видалити інÑталÑцію" />
137 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 137 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
138 <String Id="MaintenanceTypeDlgDescription" Overridable="yes" Value="Виберіть операцію, Ñку потрібно виконати." /> 138 <String Id="MaintenanceTypeDlgDescription" Overridable="yes" Value="Оберіть операцію, Ñку потрібно виконати." />
139 <String Id="MaintenanceTypeDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Змінити, відновити або видалити інÑталÑцію" /> 139 <String Id="MaintenanceTypeDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Змінити, відновити або видалити інÑталÑцію" />
140 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes" Value="Дає змогу змінити ÑпоÑіб інÑталÑції компонентів." /> 140 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes" Value="Дає змогу змінити ÑпоÑіб інÑталÑції компонентів." />
141 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes" Value="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName] немає компонентів, Ñкі можна вибрати окремо." /> 141 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes" Value="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName] немає компонентів, Ñкі можна обрати окремо." />
142 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes" Value="ВидалÑÑ” [ProductName] з комп’ютера." /> 142 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes" Value="ВидалÑÑ” [ProductName] з комп’ютера." />
143 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes" Value="Ðе можна видалити програму [ProductName]." /> 143 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes" Value="Ðе можна видалити програму [ProductName]." />
144 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes" Value="ВиправлÑÑ” помилки оÑтанньої інÑталÑції, відновлюючи втрачені або пошкоджені файли, Ñрлики й запиÑи реєÑтру." /> 144 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes" Value="ВиправлÑÑ” помилки оÑтанньої інÑталÑції, відновлюючи втрачені або пошкоджені файли, Ñрлики й запиÑи реєÑтру." />
@@ -151,26 +151,26 @@
151 151
152 <String Id="MsiRMFilesInUse_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 152 <String Id="MsiRMFilesInUse_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
153 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 153 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
154 <String Id="MsiRMFilesInUseText" Overridable="yes" Value="Ðаведені нижче заÑтоÑунки викориÑтовують файли, Ñкі підлÑгають оновленню під Ñ‡Ð°Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. Можна дозволити майÑтру інÑталÑції закрити та Ñпробувати перезапуÑтити Ñ—Ñ… або перезавантажити комп’ютер пізніше." /> 154 <String Id="MsiRMFilesInUseText" Overridable="yes" Value="Ðаведені нижче додатки викориÑтовують файли, що підлÑгають оновленню під Ñ‡Ð°Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. Можна дозволити майÑтру інÑталÑції закрити та Ñпробувати перезапуÑтити Ñ—Ñ… або перезавантажити комп’ютер пізніше." />
155 <String Id="MsiRMFilesInUseDescription" Overridable="yes" Value="ДеÑкі файли, що підлÑгають оновленню, зараз викориÑтовуютьÑÑ." /> 155 <String Id="MsiRMFilesInUseDescription" Overridable="yes" Value="ДеÑкі файли, що підлÑгають оновленню, зараз викориÑтовуютьÑÑ." />
156 <String Id="MsiRMFilesInUseTitle" Overridable="yes" Value="{\WixUI_Font_Title}Файли, Ñкі викориÑтовуютьÑÑ" /> 156 <String Id="MsiRMFilesInUseTitle" Overridable="yes" Value="{\WixUI_Font_Title}Файли, Ñкі викориÑтовуютьÑÑ" />
157 <String Id="MsiRMFilesInUseUseRM" Overridable="yes" Value="&amp;Закрийте ці заÑтоÑунки та Ñпробуйте Ñ—Ñ… перезапуÑтити." /> 157 <String Id="MsiRMFilesInUseUseRM" Overridable="yes" Value="&amp;Закрийте ці додатки та Ñпробуйте Ñ—Ñ… перезапуÑтити." />
158 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes" Value="&amp;Ðе закривати заÑтоÑунки. Потрібно буде перезавантажити комп’ютер." /> 158 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes" Value="&amp;Ðе закривати додатки. Потрібно буде перезавантажити комп’ютер." />
159 159
160 <String Id="OutOfDiskDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 160 <String Id="OutOfDiskDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
161 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 161 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
162 <String Id="OutOfDiskDlgText" Overridable="yes" Value="У виділених томах бракує диÑкового проÑтору Ð´Ð»Ñ Ñ–Ð½ÑталÑції вибраних компонентів. Можна видалити з виділених томів кілька файлів, інÑталювати менше компонентів або вибрати інший диÑк призначеннÑ." /> 162 <String Id="OutOfDiskDlgText" Overridable="yes" Value="У виділених томах бракує диÑкового проÑтору Ð´Ð»Ñ Ñ–Ð½ÑталÑції обраних компонентів. Можна видалити з виділених томів кілька файлів, інÑталювати менше компонентів або обрати інший диÑк призначеннÑ." />
163 <String Id="OutOfDiskDlgDescription" Overridable="yes" Value="ОбÑÑг, необхідний Ð´Ð»Ñ Ñ–Ð½ÑталÑції, перевищує обÑÑг вільного диÑкового проÑтору." /> 163 <String Id="OutOfDiskDlgDescription" Overridable="yes" Value="ОбÑÑг, необхідний Ð´Ð»Ñ Ñ–Ð½ÑталÑції, перевищує обÑÑг вільного диÑкового проÑтору." />
164 <String Id="OutOfDiskDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Бракує диÑкового проÑтору" /> 164 <String Id="OutOfDiskDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Бракує диÑкового проÑтору" />
165 <String Id="OutOfDiskDlgVolumeList" Overridable="yes" Value="{120}{70}{70}{70}{70}" /> 165 <String Id="OutOfDiskDlgVolumeList" Overridable="yes" Value="{120}{70}{70}{70}{70}" />
166 166
167 <String Id="OutOfRbDiskDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 167 <String Id="OutOfRbDiskDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
168 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 168 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
169 <String Id="OutOfRbDiskDlgText" Overridable="yes" Value="У виділених томах бракує диÑкового проÑтору Ð´Ð»Ñ Ñ–Ð½ÑталÑції вибраних компонентів. Можна видалити з виділених томів кілька файлів, інÑталювати менше компонентів або вибрати інший диÑк призначеннÑ." /> 169 <String Id="OutOfRbDiskDlgText" Overridable="yes" Value="У виділених томах бракує диÑкового проÑтору Ð´Ð»Ñ Ñ–Ð½ÑталÑції обраних компонентів. Можна видалити з виділених томів кілька файлів, інÑталювати менше компонентів або обрати інший диÑк призначеннÑ." />
170 <String Id="OutOfRbDiskDlgDescription" Overridable="yes" Value="ОбÑÑг, необхідний Ð´Ð»Ñ Ñ–Ð½ÑталÑції, перевищує обÑÑг вільного диÑкового проÑтору." /> 170 <String Id="OutOfRbDiskDlgDescription" Overridable="yes" Value="ОбÑÑг, необхідний Ð´Ð»Ñ Ñ–Ð½ÑталÑції, перевищує обÑÑг вільного диÑкового проÑтору." />
171 <String Id="OutOfRbDiskDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Бракує диÑкового проÑтору" /> 171 <String Id="OutOfRbDiskDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Бракує диÑкового проÑтору" />
172 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes" Value="{120}{70}{70}{70}{70}" /> 172 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes" Value="{120}{70}{70}{70}{70}" />
173 <String Id="OutOfRbDiskDlgText2" Overridable="yes" Value="Інший варіант – вимкнути в інÑталÑторі функцію відкочуваннÑ. У такому разі інÑталÑтор не зможе відновити вихідний Ñтан комп’ютера піÑÐ»Ñ Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу інÑталÑції. Щоб погодитиÑÑ Ð½Ð° цей ризик Ñ– вимкнути функцію відкочуваннÑ, натиÑніть кнопку &quot;Так&quot;." /> 173 <String Id="OutOfRbDiskDlgText2" Overridable="yes" Value="Інший варіант – вимкнути в інÑталÑторі функцію відкочуваннÑ. У такому разі інÑталÑтор не зможе відновити вихідний Ñтан комп’ютеру піÑÐ»Ñ Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу інÑталÑції. Щоб погодитиÑÑ Ð½Ð° цей ризик Ñ– вимкнути функцію відкочуваннÑ, натиÑніть кнопку &quot;Так&quot;." />
174 174
175 <String Id="PrepareDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 175 <String Id="PrepareDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
176 <String Id="PrepareDlgBitmap" Overridable="yes" Value="WixUI_Bmp_Dialog" /> 176 <String Id="PrepareDlgBitmap" Overridable="yes" Value="WixUI_Bmp_Dialog" />
@@ -189,7 +189,7 @@
189 <String Id="ProgressDlgTitleRemoving" Overridable="yes" Value="{\WixUI_Font_Title}Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 189 <String Id="ProgressDlgTitleRemoving" Overridable="yes" Value="{\WixUI_Font_Title}Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
190 <String Id="ProgressDlgTextUpdating" Overridable="yes" Value="Зачекайте, доки майÑтер інÑталÑції оновить програму [ProductName]." /> 190 <String Id="ProgressDlgTextUpdating" Overridable="yes" Value="Зачекайте, доки майÑтер інÑталÑції оновить програму [ProductName]." />
191 <String Id="ProgressDlgTitleUpdating" Overridable="yes" Value="{\WixUI_Font_Title}ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 191 <String Id="ProgressDlgTitleUpdating" Overridable="yes" Value="{\WixUI_Font_Title}ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
192 <String Id="ProgressDlgProgressBar" Overridable="yes" Value="Перебіг виконаннÑ" /> 192 <String Id="ProgressDlgProgressBar" Overridable="yes" Value="Ðиконано" />
193 <String Id="ProgressDlgStatusLabel" Overridable="yes" Value="Стан:" /> 193 <String Id="ProgressDlgStatusLabel" Overridable="yes" Value="Стан:" />
194 194
195 <String Id="ResumeDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 195 <String Id="ResumeDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
@@ -207,9 +207,9 @@
207 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes" Value="Повна інÑталÑціÑ" /> 207 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes" Value="Повна інÑталÑціÑ" />
208 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 208 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
209 <String Id="SetupTypeDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Вибір типу інÑталÑції" /> 209 <String Id="SetupTypeDlgTitle" Overridable="yes" Value="{\WixUI_Font_Title}Вибір типу інÑталÑції" />
210 <String Id="SetupTypeDlgDescription" Overridable="yes" Value="Виберіть потрібний тип інÑталÑції" /> 210 <String Id="SetupTypeDlgDescription" Overridable="yes" Value="Оберіть потрібний тип інÑталÑції" />
211 <String Id="SetupTypeDlgTypicalText" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð½Ð°Ð¹Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ñ–ÑˆÐ¸Ñ… компонентів програми (рекомендовано Ð´Ð»Ñ Ð±Ñ–Ð»ÑŒÑˆÐ¾Ñті кориÑтувачів)." /> 211 <String Id="SetupTypeDlgTypicalText" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð½Ð°Ð¹Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ñ–ÑˆÐ¸Ñ… компонентів програми (рекомендовано Ð´Ð»Ñ Ð±Ñ–Ð»ÑŒÑˆÐ¾Ñті кориÑтувачів)." />
212 <String Id="SetupTypeDlgCustomText" Overridable="yes" Value="МожливіÑть вибрати компоненти програми та міÑце Ñ—Ñ… інÑталÑції (рекомендовано Ð´Ð»Ñ Ð´Ð¾Ñвідчених кориÑтувачів)." /> 212 <String Id="SetupTypeDlgCustomText" Overridable="yes" Value="МожливіÑть обрати компоненти програми та міÑце Ñ—Ñ… інÑталÑції (рекомендовано Ð´Ð»Ñ Ð´Ð¾Ñвідчених кориÑтувачів)." />
213 <String Id="SetupTypeDlgCompleteText" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ ÑƒÑÑ–Ñ… програмних компонентів (найбільші вимоги до диÑкового проÑтору)." /> 213 <String Id="SetupTypeDlgCompleteText" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ ÑƒÑÑ–Ñ… програмних компонентів (найбільші вимоги до диÑкового проÑтору)." />
214 214
215 <String Id="UserExit_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 215 <String Id="UserExit_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
@@ -221,19 +221,19 @@
221 <String Id="VerifyReadyDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 221 <String Id="VerifyReadyDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
222 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" /> 222 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes" Value="WixUI_Bmp_Banner" />
223 <String Id="VerifyReadyDlgInstall" Overridable="yes" Value="&amp;ІнÑталювати" /> 223 <String Id="VerifyReadyDlgInstall" Overridable="yes" Value="&amp;ІнÑталювати" />
224 <String Id="VerifyReadyDlgInstallText" Overridable="yes" Value="Щоб розпочати інÑталÑцію, натиÑніть кнопку &quot;ІнÑталювати&quot;. Щоб перевірити або змінити будь-Ñкі наÑтройки інÑталÑції, натиÑніть кнопку &quot;Ðазад&quot;. Щоб закрити майÑтер, натиÑніть кнопку &quot;СкаÑувати&quot;." /> 224 <String Id="VerifyReadyDlgInstallText" Overridable="yes" Value="Щоб розпочати інÑталÑцію, натиÑніть кнопку &quot;ІнÑталювати&quot;. Щоб перевірити або змінити будь-Ñкі Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½ÑталÑції, натиÑніть кнопку &quot;Ðазад&quot;. Щоб закрити майÑтер, натиÑніть кнопку &quot;СкаÑувати&quot;." />
225 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes" Value="{\WixUI_Font_Title}УÑе готово до інÑталÑції програми [ProductName]" /> 225 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes" Value="{\WixUI_Font_Title}УÑе готово до інÑталÑції програми [ProductName]" />
226 <String Id="VerifyReadyDlgChange" Overridable="yes" Value="&amp;Змінити" /> 226 <String Id="VerifyReadyDlgChange" Overridable="yes" Value="&amp;Змінити" />
227 <String Id="VerifyReadyDlgChangeText" Overridable="yes" Value="Щоб розпочати інÑталÑцію, натиÑніть кнопку &quot;Змінити&quot;. Щоб перевірити або змінити будь-Ñкі наÑтройки інÑталÑції, натиÑніть кнопку &quot;Ðазад&quot;. Щоб закрити майÑтер, натиÑніть кнопку &quot;СкаÑувати&quot;." /> 227 <String Id="VerifyReadyDlgChangeText" Overridable="yes" Value="Щоб розпочати інÑталÑцію, натиÑніть кнопку &quot;Змінити&quot;. Щоб перевірити або змінити будь-Ñкі Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½ÑталÑції, натиÑніть кнопку &quot;Ðазад&quot;. Щоб закрити майÑтер, натиÑніть кнопку &quot;СкаÑувати&quot;." />
228 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes" Value="{\WixUI_Font_Title}УÑе готово до Ð·Ð¼Ñ–Ð½ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 228 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes" Value="{\WixUI_Font_Title}УÑе готово до Ð·Ð¼Ñ–Ð½ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
229 <String Id="VerifyReadyDlgRepair" Overridable="yes" Value="Відно&amp;вити" /> 229 <String Id="VerifyReadyDlgRepair" Overridable="yes" Value="Відно&amp;вити" />
230 <String Id="VerifyReadyDlgRepairText" Overridable="yes" Value="Щоб відновити інÑталÑцію програми [ProductName], натиÑніть кнопку &quot;Відновити&quot;. Щоб перевірити або змінити будь-Ñкі наÑтройки інÑталÑції, натиÑніть кнопку &quot;Ðазад&quot;. Щоб закрити майÑтер, натиÑніть кнопку &quot;СкаÑувати&quot;." /> 230 <String Id="VerifyReadyDlgRepairText" Overridable="yes" Value="Щоб відновити інÑталÑцію програми [ProductName], натиÑніть кнопку &quot;Відновити&quot;. Щоб перевірити або змінити будь-Ñкі Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½ÑталÑції, натиÑніть кнопку &quot;Ðазад&quot;. Щоб закрити майÑтер, натиÑніть кнопку &quot;СкаÑувати&quot;." />
231 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes" Value="{\WixUI_Font_Title}УÑе готово до Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 231 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes" Value="{\WixUI_Font_Title}УÑе готово до Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
232 <String Id="VerifyReadyDlgRemove" Overridable="yes" Value="&amp;Видалити" /> 232 <String Id="VerifyReadyDlgRemove" Overridable="yes" Value="&amp;Видалити" />
233 <String Id="VerifyReadyDlgRemoveText" Overridable="yes" Value="Щоб видалити програму [ProductName] з цього комп’ютера, натиÑніть кнопку &quot;Видалити&quot;. Щоб перевірити або змінити будь-Ñкі наÑтройки інÑталÑції, натиÑніть кнопку &quot;Ðазад&quot;. Щоб закрити майÑтер, натиÑніть кнопку &quot;СкаÑувати&quot;." /> 233 <String Id="VerifyReadyDlgRemoveText" Overridable="yes" Value="Щоб видалити програму [ProductName] з цього комп’ютера, натиÑніть кнопку &quot;Видалити&quot;. Щоб перевірити або змінити будь-Ñкі Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½ÑталÑції, натиÑніть кнопку &quot;Ðазад&quot;. Щоб закрити майÑтер, натиÑніть кнопку &quot;СкаÑувати&quot;." />
234 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes" Value="{\WixUI_Font_Title}УÑе готово до Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 234 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes" Value="{\WixUI_Font_Title}УÑе готово до Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
235 <String Id="VerifyReadyDlgUpdate" Overridable="yes" Value="&amp;Оновити" /> 235 <String Id="VerifyReadyDlgUpdate" Overridable="yes" Value="&amp;Оновити" />
236 <String Id="VerifyReadyDlgUpdateText" Overridable="yes" Value="Щоб оновити програму [ProductName] зі Ñвого комп’ютера, натиÑніть кнопку &quot;Оновити&quot;. Щоб перевірити або змінити будь-Ñкі наÑтройки інÑталÑції, натиÑніть кнопку &quot;Ðазад&quot;. Щоб закрити майÑтер, натиÑніть кнопку &quot;СкаÑувати&quot;." /> 236 <String Id="VerifyReadyDlgUpdateText" Overridable="yes" Value="Щоб оновити програму [ProductName] зі Ñвого комп’ютера, натиÑніть кнопку &quot;Оновити&quot;. Щоб перевірити або змінити будь-Ñкі Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½ÑталÑції, натиÑніть кнопку &quot;Ðазад&quot;. Щоб закрити майÑтер, натиÑніть кнопку &quot;СкаÑувати&quot;." />
237 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes" Value="{\WixUI_Font_Title}УÑе готово до Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 237 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes" Value="{\WixUI_Font_Title}УÑе готово до Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
238 238
239 <String Id="WaitForCostingDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" /> 239 <String Id="WaitForCostingDlg_Title" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ [ProductName]" />
@@ -258,7 +258,7 @@
258 <String Id="ProgressTextInstallValidate" Overridable="yes" Value="Перевірка інÑталÑції" /> 258 <String Id="ProgressTextInstallValidate" Overridable="yes" Value="Перевірка інÑталÑції" />
259 <String Id="ProgressTextInstallFiles" Overridable="yes" Value="ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… файлів" /> 259 <String Id="ProgressTextInstallFiles" Overridable="yes" Value="ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… файлів" />
260 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes" Value="Файл: [1], каталог: [9], розмір: [6]" /> 260 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes" Value="Файл: [1], каталог: [9], розмір: [6]" />
261 <String Id="ProgressTextInstallAdminPackage" Overridable="yes" Value="ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² мережної інÑталÑції" /> 261 <String Id="ProgressTextInstallAdminPackage" Overridable="yes" Value="ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² мережевої інÑталÑції" />
262 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes" Value="Файл: [1], каталог: [9], розмір: [6]" /> 262 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes" Value="Файл: [1], каталог: [9], розмір: [6]" />
263 <String Id="ProgressTextFileCost" Overridable="yes" Value="ОбчиÑÐ»ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¾Ð³Ð¾ диÑкового проÑтору" /> 263 <String Id="ProgressTextFileCost" Overridable="yes" Value="ОбчиÑÐ»ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¾Ð³Ð¾ диÑкового проÑтору" />
264 <String Id="ProgressTextCostInitialize" Overridable="yes" Value="ОбчиÑÐ»ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¾Ð³Ð¾ диÑкового проÑтору" /> 264 <String Id="ProgressTextCostInitialize" Overridable="yes" Value="ОбчиÑÐ»ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¾Ð³Ð¾ диÑкового проÑтору" />
@@ -266,7 +266,7 @@
266 <String Id="ProgressTextCreateShortcuts" Overridable="yes" Value="Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñрликів" /> 266 <String Id="ProgressTextCreateShortcuts" Overridable="yes" Value="Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñрликів" />
267 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes" Value="Ярлик: [1]" /> 267 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes" Value="Ярлик: [1]" />
268 <String Id="ProgressTextPublishComponents" Overridable="yes" Value="ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ð´Ð°Ñ‚Ð½Ð¸Ñ… компонентів" /> 268 <String Id="ProgressTextPublishComponents" Overridable="yes" Value="ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ð´Ð°Ñ‚Ð½Ð¸Ñ… компонентів" />
269 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes" Value="Ідентифікатор компонента: [1], кваліфікатор: [2]" /> 269 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes" Value="Ідентифікатор компоненту: [1], кваліфікатор: [2]" />
270 <String Id="ProgressTextPublishFeatures" Overridable="yes" Value="ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹ продукту" /> 270 <String Id="ProgressTextPublishFeatures" Overridable="yes" Value="ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹ продукту" />
271 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes" Value="ФункціÑ: [1]" /> 271 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes" Value="ФункціÑ: [1]" />
272 <String Id="ProgressTextPublishProduct" Overridable="yes" Value="ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð¾Ð¼Ð¾Ñтей про продукт" /> 272 <String Id="ProgressTextPublishProduct" Overridable="yes" Value="ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð¾Ð¼Ð¾Ñтей про продукт" />
@@ -280,7 +280,7 @@
280 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes" Value="Ідентифікатор програми: [1]" /> 280 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes" Value="Ідентифікатор програми: [1]" />
281 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes" Value="Ð’Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¼Ñ–ÑÑ†Ñ Ð² реєÑтрі" /> 281 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes" Value="Ð’Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¼Ñ–ÑÑ†Ñ Ð² реєÑтрі" />
282 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes" Value="Вільне міÑце: [1]" /> 282 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes" Value="Вільне міÑце: [1]" />
283 <String Id="ProgressTextAppSearch" Overridable="yes" Value="Пошук інÑтальованих заÑтоÑунків" /> 283 <String Id="ProgressTextAppSearch" Overridable="yes" Value="Пошук інÑтальованих додатків" />
284 <String Id="ProgressTextAppSearchTemplate" Overridable="yes" Value="ВлаÑтивіÑть: [1]. ПідпиÑ: [2]" /> 284 <String Id="ProgressTextAppSearchTemplate" Overridable="yes" Value="ВлаÑтивіÑть: [1]. ПідпиÑ: [2]" />
285 <String Id="ProgressTextBindImage" Overridable="yes" Value="Зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½ÑƒÐ²Ð°Ð½Ð¸Ñ… файлів" /> 285 <String Id="ProgressTextBindImage" Overridable="yes" Value="Зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½ÑƒÐ²Ð°Ð½Ð¸Ñ… файлів" />
286 <String Id="ProgressTextBindImageTemplate" Overridable="yes" Value="Файл: [1]" /> 286 <String Id="ProgressTextBindImageTemplate" Overridable="yes" Value="Файл: [1]" />
@@ -291,21 +291,21 @@
291 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes" Value="Служба: [1]" /> 291 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes" Value="Служба: [1]" />
292 <String Id="ProgressTextDuplicateFiles" Overridable="yes" Value="Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð¿Ñ–Ð¹ файлів" /> 292 <String Id="ProgressTextDuplicateFiles" Overridable="yes" Value="Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð¿Ñ–Ð¹ файлів" />
293 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes" Value="Файл: [1], каталог: [9], розмір: [6]" /> 293 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes" Value="Файл: [1], каталог: [9], розмір: [6]" />
294 <String Id="ProgressTextFindRelatedProducts" Overridable="yes" Value="Пошук пов’Ñзаних заÑтоÑунків" /> 294 <String Id="ProgressTextFindRelatedProducts" Overridable="yes" Value="Пошук пов’Ñзаних додатків" />
295 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes" Value="Знайдено заÑтоÑунок: [1]" /> 295 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes" Value="Знайдено додаток: [1]" />
296 <String Id="ProgressTextInstallODBC" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ñ–Ð² ODBC" /> 296 <String Id="ProgressTextInstallODBC" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ñ–Ð² ODBC" />
297 <String Id="ProgressTextInstallServices" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð½Ð¾Ð²Ð¸Ñ… Ñлужб" /> 297 <String Id="ProgressTextInstallServices" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ Ð½Ð¾Ð²Ð¸Ñ… Ñлужб" />
298 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes" Value="Служба: [2]" /> 298 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes" Value="Служба: [2]" />
299 <String Id="ProgressTextLaunchConditions" Overridable="yes" Value="Перевірка умов запуÑку" /> 299 <String Id="ProgressTextLaunchConditions" Overridable="yes" Value="Перевірка умов запуÑку" />
300 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes" Value="ÐœÑ–Ð³Ñ€Ð°Ñ†Ñ–Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð² компонентів із пов’Ñзаних заÑтоÑунків" /> 300 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes" Value="ÐœÑ–Ð³Ñ€Ð°Ñ†Ñ–Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð² компонентів із пов’Ñзаних додатків" />
301 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes" Value="ЗаÑтоÑунок: [1]" /> 301 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes" Value="ЗаÑтоÑунок: [1]" />
302 <String Id="ProgressTextMoveFiles" Overridable="yes" Value="ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²" /> 302 <String Id="ProgressTextMoveFiles" Overridable="yes" Value="ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²" />
303 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes" Value="Файл: [1], каталог: [9], розмір: [6]" /> 303 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes" Value="Файл: [1], каталог: [9], розмір: [6]" />
304 <String Id="ProgressTextPatchFiles" Overridable="yes" Value="Ð’Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²" /> 304 <String Id="ProgressTextPatchFiles" Overridable="yes" Value="Ð’Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²" />
305 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes" Value="Файл: [1], каталог: [2], розмір: [3]" /> 305 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes" Value="Файл: [1], каталог: [2], розмір: [3]" />
306 <String Id="ProgressTextProcessComponents" Overridable="yes" Value="ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÑ”Ñтрації компонентів" /> 306 <String Id="ProgressTextProcessComponents" Overridable="yes" Value="ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÑ”Ñтрації компонентів" />
307 <String Id="ProgressTextRegisterComPlus" Overridable="yes" Value="РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð·Ð°ÑтоÑунків Ñ– компонентів COM+" /> 307 <String Id="ProgressTextRegisterComPlus" Overridable="yes" Value="РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÑ–Ð² Ñ– компонентів COM+" />
308 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes" Value="Ідентифікатор заÑтоÑунку: [1]{{, тип заÑтоÑунку: [2], кориÑтувачі: [3], RSN: [4]}}" /> 308 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes" Value="Ідентифікатор додатку: [1]{{, тип заÑтоÑунку: [2], кориÑтувачі: [3], RSN: [4]}}" />
309 <String Id="ProgressTextRegisterFonts" Overridable="yes" Value="РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ñ–Ð²" /> 309 <String Id="ProgressTextRegisterFonts" Overridable="yes" Value="РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ñ–Ð²" />
310 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes" Value="Шрифт: [1]" /> 310 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes" Value="Шрифт: [1]" />
311 <String Id="ProgressTextRegisterProduct" Overridable="yes" Value="РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ñƒ" /> 311 <String Id="ProgressTextRegisterProduct" Overridable="yes" Value="РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ñƒ" />
@@ -318,8 +318,8 @@
318 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes" Value="Файл: [1], каталог: [9]" /> 318 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes" Value="Файл: [1], каталог: [9]" />
319 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes" Value="ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€Ñдків оточеннÑ" /> 319 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes" Value="ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€Ñдків оточеннÑ" />
320 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes" Value="Ім’Ñ: [1], значеннÑ: [2], Ð´Ñ–Ñ [3]" /> 320 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes" Value="Ім’Ñ: [1], значеннÑ: [2], Ð´Ñ–Ñ [3]" />
321 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes" Value="Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð°ÑтоÑунків" /> 321 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes" Value="Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÑ–Ð²" />
322 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes" Value="ЗаÑтоÑунок: [1], командний Ñ€Ñдок: [2]" /> 322 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes" Value="Додаток: [1], командний Ñ€Ñдок: [2]" />
323 <String Id="ProgressTextRemoveFiles" Overridable="yes" Value="Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²" /> 323 <String Id="ProgressTextRemoveFiles" Overridable="yes" Value="Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²" />
324 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes" Value="Файл: [1], каталог: [9]" /> 324 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes" Value="Файл: [1], каталог: [9]" />
325 <String Id="ProgressTextRemoveFolders" Overridable="yes" Value="Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ð¿Ð¾Ðº" /> 325 <String Id="ProgressTextRemoveFolders" Overridable="yes" Value="Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ð¿Ð¾Ðº" />
@@ -339,16 +339,16 @@
339 <String Id="ProgressTextSetODBCFolders" Overridable="yes" Value="Ð†Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñ–Ð² ODBC" /> 339 <String Id="ProgressTextSetODBCFolders" Overridable="yes" Value="Ð†Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñ–Ð² ODBC" />
340 <String Id="ProgressTextStartServices" Overridable="yes" Value="ЗапуÑк Ñлужб" /> 340 <String Id="ProgressTextStartServices" Overridable="yes" Value="ЗапуÑк Ñлужб" />
341 <String Id="ProgressTextStartServicesTemplate" Overridable="yes" Value="Служба: [1]" /> 341 <String Id="ProgressTextStartServicesTemplate" Overridable="yes" Value="Служба: [1]" />
342 <String Id="ProgressTextStopServices" Overridable="yes" Value="Ð—ÑƒÐ¿Ð¸Ð½ÐµÐ½Ð½Ñ Ñлужб" /> 342 <String Id="ProgressTextStopServices" Overridable="yes" Value="Зупинка Ñлужб" />
343 <String Id="ProgressTextStopServicesTemplate" Overridable="yes" Value="Служба: [1]" /> 343 <String Id="ProgressTextStopServicesTemplate" Overridable="yes" Value="Служба: [1]" />
344 <String Id="ProgressTextUnpublishComponents" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— придатних компонентів" /> 344 <String Id="ProgressTextUnpublishComponents" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— придатних компонентів" />
345 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes" Value="Ідентифікатор компонента: [1], кваліфікатор: [2]" /> 345 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes" Value="Ідентифікатор компоненту: [1], кваліфікатор: [2]" />
346 <String Id="ProgressTextUnpublishFeatures" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— функцій продукту" /> 346 <String Id="ProgressTextUnpublishFeatures" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— функцій продукту" />
347 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes" Value="ФункціÑ: [1]" /> 347 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes" Value="ФункціÑ: [1]" />
348 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації Ñерверів клаÑів" /> 348 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації Ñерверів клаÑів" />
349 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes" Value="Ідентифікатор клаÑу: [1]" /> 349 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes" Value="Ідентифікатор клаÑу: [1]" />
350 <String Id="ProgressTextUnregisterComPlus" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації заÑтоÑунків Ñ– компонентів COM+" /> 350 <String Id="ProgressTextUnregisterComPlus" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації додаткыв Ñ– компонентів COM+" />
351 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes" Value="Ідентифікатор заÑтоÑунку: [1]{{, тип заÑтоÑунку: [2]}}" /> 351 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes" Value="Ідентифікатор додатку: [1]{{, тип додатку: [2]}}" />
352 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації Ñерверів розширень" /> 352 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації Ñерверів розширень" />
353 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes" Value="РозширеннÑ: [1]" /> 353 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes" Value="РозширеннÑ: [1]" />
354 <String Id="ProgressTextUnregisterFonts" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації шрифтів" /> 354 <String Id="ProgressTextUnregisterFonts" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації шрифтів" />
@@ -365,15 +365,15 @@
365 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes" Value="Файл: [1], розділ: [2], ключ: [3], значеннÑ: [4]" /> 365 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes" Value="Файл: [1], розділ: [2], ключ: [3], значеннÑ: [4]" />
366 <String Id="ProgressTextWriteRegistryValues" Overridable="yes" Value="Ð—Ð°Ð¿Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ до ÑиÑтемного реєÑтру" /> 366 <String Id="ProgressTextWriteRegistryValues" Overridable="yes" Value="Ð—Ð°Ð¿Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ до ÑиÑтемного реєÑтру" />
367 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes" Value="Розділ: [1], ім’Ñ: [2], значеннÑ: [3]" /> 367 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes" Value="Розділ: [1], ім’Ñ: [2], значеннÑ: [3]" />
368 <String Id="ProgressTextAdvertise" Overridable="yes" Value="ÐŸÐ¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð¼Ð¾Ñтей про заÑтоÑунок" /> 368 <String Id="ProgressTextAdvertise" Overridable="yes" Value="ÐŸÐ¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð¼Ð¾Ñтей про додаток" />
369 <String Id="ProgressTextGenerateScript" Overridable="yes" Value="Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ð¹ Ñценарію Ð´Ð»Ñ Ð´Ñ–Ñ—:" /> 369 <String Id="ProgressTextGenerateScript" Overridable="yes" Value="Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ð¹ Ñценарію Ð´Ð»Ñ Ð´Ñ–Ñ—:" />
370 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes" Value="[1]" /> 370 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes" Value="[1]" />
371 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ ÑиÑтемного каталогу" /> 371 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes" Value="ІнÑталÑÑ†Ñ–Ñ ÑиÑтемного каталогу" />
372 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes" Value="Файл: [1], залежноÑті: [2]" /> 372 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes" Value="Файл: [1], залежноÑті: [2]" />
373 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes" Value="ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð¾Ð¼Ð¾Ñтей про ÑкладаннÑ" /> 373 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes" Value="ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð¾Ð¼Ð¾Ñтей про ÑкладаннÑ" />
374 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes" Value="КонтекÑÑ‚ заÑтоÑунку:[1], Ñ–Ð¼â€™Ñ ÑкладаннÑ:[2]" /> 374 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes" Value="КонтекÑÑ‚ додатку:[1], Ñ–Ð¼â€™Ñ ÑкладаннÑ:[2]" />
375 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— відомоÑтей про ÑкладаннÑ" /> 375 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes" Value="СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— відомоÑтей про ÑкладаннÑ" />
376 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes" Value="КонтекÑÑ‚ заÑтоÑунку:[1], Ñ–Ð¼â€™Ñ ÑкладаннÑ:[2]" /> 376 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes" Value="КонтекÑÑ‚ додатку:[1], Ñ–Ð¼â€™Ñ ÑкладаннÑ:[2]" />
377 <String Id="ProgressTextRollback" Overridable="yes" Value="Ð’Ñ–Ð´ÐºÐ¾Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ñ–Ñ—:" /> 377 <String Id="ProgressTextRollback" Overridable="yes" Value="Ð’Ñ–Ð´ÐºÐ¾Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ñ–Ñ—:" />
378 <String Id="ProgressTextRollbackTemplate" Overridable="yes" Value="[1]" /> 378 <String Id="ProgressTextRollbackTemplate" Overridable="yes" Value="[1]" />
379 <String Id="ProgressTextRollbackCleanup" Overridable="yes" Value="Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¸Ñ… файлів" /> 379 <String Id="ProgressTextRollbackCleanup" Overridable="yes" Value="Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¸Ñ… файлів" />
@@ -386,7 +386,7 @@
386 <String Id="Error1" Overridable="yes" Value="{{Помилка [1]. }}" /> 386 <String Id="Error1" Overridable="yes" Value="{{Помилка [1]. }}" />
387 <String Id="Error2" Overridable="yes" Value="ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ [1]." /> 387 <String Id="Error2" Overridable="yes" Value="ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ [1]." />
388 <String Id="Error4" Overridable="yes" Value="ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ [1]." /> 388 <String Id="Error4" Overridable="yes" Value="ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ [1]." />
389 <String Id="Error5" Overridable="yes" Value="Під Ñ‡Ð°Ñ Ñ–Ð½ÑталÑції цього пакета ÑталаÑÑ Ð½ÐµÐ¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð° помилка інÑталÑтора. Можливо, це вказує на проблему з пакетом. Код помилки – [1]. {{Ðргументи: [2], [3], [4]}}" /> 389 <String Id="Error5" Overridable="yes" Value="Під Ñ‡Ð°Ñ Ñ–Ð½ÑталÑції цього пакета ÑталаÑÑŒ неочікувана помилка інÑталÑтора. Можливо, це вказує на проблему з пакетом. Код помилки – [1]. {{Ðргументи: [2], [3], [4]}}" />
390 <String Id="Error7" Overridable="yes" Value="{{Ðемає міÑÑ†Ñ Ð½Ð° диÑку: }}" /> 390 <String Id="Error7" Overridable="yes" Value="{{Ðемає міÑÑ†Ñ Ð½Ð° диÑку: }}" />
391 <String Id="Error8" Overridable="yes" Value="Ð”Ñ–Ñ [Time]: [1]. [2]" /> 391 <String Id="Error8" Overridable="yes" Value="Ð”Ñ–Ñ [Time]: [1]. [2]" />
392 <String Id="Error9" Overridable="yes" Value="[ProductName]" /> 392 <String Id="Error9" Overridable="yes" Value="[ProductName]" />
@@ -397,152 +397,152 @@
397 <String Id="Error14" Overridable="yes" Value="Дію почато [Time]: [1]." /> 397 <String Id="Error14" Overridable="yes" Value="Дію почато [Time]: [1]." />
398 <String Id="Error15" Overridable="yes" Value="Дію завершено [Time]: [1]. Повернено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ [2]." /> 398 <String Id="Error15" Overridable="yes" Value="Дію завершено [Time]: [1]. Повернено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ [2]." />
399 <String Id="Error16" Overridable="yes" Value="ЗалишилоÑÑ Ñ‡Ð°Ñу: {[1] хв. }{[2] Ñек.}" /> 399 <String Id="Error16" Overridable="yes" Value="ЗалишилоÑÑ Ñ‡Ð°Ñу: {[1] хв. }{[2] Ñек.}" />
400 <String Id="Error17" Overridable="yes" Value="Бракує пам’Ñті. Закрийте інші заÑтоÑунки та повторіть Ñпробу." /> 400 <String Id="Error17" Overridable="yes" Value="Бракує пам’Ñті. Закрийте інші додатки та повторіть Ñпробу." />
401 <String Id="Error18" Overridable="yes" Value="ІнÑталÑтор не відповідає." /> 401 <String Id="Error18" Overridable="yes" Value="ІнÑталÑтор не відповідає." />
402 <String Id="Error19" Overridable="yes" Value="ІнÑталÑтор передчаÑно припинив роботу." /> 402 <String Id="Error19" Overridable="yes" Value="ІнÑталÑтор передчаÑно припинив роботу." />
403 <String Id="Error20" Overridable="yes" Value="Зачекайте: ÑиÑтема Windows наÑтроює програму [ProductName]" /> 403 <String Id="Error20" Overridable="yes" Value="Зачекайте: ÑиÑтема Windows налаштовує програму [ProductName]" />
404 <String Id="Error21" Overridable="yes" Value="Триває Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¸Ñ… даних..." /> 404 <String Id="Error21" Overridable="yes" Value="Триває збÑÑ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¸Ñ… даних..." />
405 <String Id="Error22" Overridable="yes" Value="Триває Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ–Ñ… верÑій цього заÑтоÑунку..." /> 405 <String Id="Error22" Overridable="yes" Value="Триває Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ–Ñ… верÑій цього додатку..." />
406 <String Id="Error23" Overridable="yes" Value="Підготовка до Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ–Ñ… верÑій цього заÑтоÑунку..." /> 406 <String Id="Error23" Overridable="yes" Value="Підготовка до Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ–Ñ… верÑій цього додатку..." />
407 <String Id="Error32" Overridable="yes" Value="Роботу програми інÑталÑції {[ProductName]} уÑпішно завершено." /> 407 <String Id="Error32" Overridable="yes" Value="Роботу програми інÑталÑції {[ProductName]} уÑпішно завершено." />
408 <String Id="Error33" Overridable="yes" Value="Помилка програми інÑталÑції {[ProductName]}." /> 408 <String Id="Error33" Overridable="yes" Value="Помилка програми інÑталÑції {[ProductName]}." />
409 <String Id="Error1101" Overridable="yes" Value="СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· файлу: [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑ, що цей файл Ñ–Ñнує та доÑтупний." /> 409 <String Id="Error1101" Overridable="yes" Value="СталаÑÑŒ помилка під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· файлу: [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑ, що цей файл Ñ–Ñнує та доÑтупний." />
410 <String Id="Error1301" Overridable="yes" Value="Ðе вдалоÑÑ Ñтворити файл &quot;[2]&quot;. Каталог із таким іменем уже Ñ–Ñнує. СкаÑуйте інÑталÑцію та виберіть інше розташуваннÑ." /> 410 <String Id="Error1301" Overridable="yes" Value="Ðе вдалоÑÑŒ Ñтворити файл &quot;[2]&quot;. Каталог з таким іменем уже Ñ–Ñнує. СкаÑуйте інÑталÑцію та оберіть інше розташуваннÑ." />
411 <String Id="Error1302" Overridable="yes" Value="Ð’Ñтавте диÑк: [2]" /> 411 <String Id="Error1302" Overridable="yes" Value="Ð’Ñтавте диÑк: [2]" />
412 <String Id="Error1303" Overridable="yes" Value="ІнÑталÑтор не має належних прав доÑтупу до цього каталогу: [2]. ÐŸÑ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ñ–Ð½ÑталÑції неможливе. Ввійдіть до ÑиÑтеми Ñк адмініÑтратор або звернітьÑÑ Ð´Ð¾ ÑиÑтемного адмініÑтратора." /> 412 <String Id="Error1303" Overridable="yes" Value="ІнÑталÑтор не має належних прав доÑтупу до цього каталогу: [2]. ÐŸÑ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ñ–Ð½ÑталÑції неможливе. Увійдіть до ÑиÑтеми Ñк адмініÑтратор або звернітьÑÑ Ð´Ð¾ ÑиÑтемного адмініÑтратора." />
413 <String Id="Error1304" Overridable="yes" Value="Помилка під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ файлу: [2]. ПереконайтеÑÑ, що маєте доÑтуп до цього каталогу." /> 413 <String Id="Error1304" Overridable="yes" Value="Помилка під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ файлу: [2]. ПереконайтеÑÑŒ, що маєте доÑтуп до цього каталогу." />
414 <String Id="Error1305" Overridable="yes" Value="СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· файлу [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑ, що цей файл Ñ–Ñнує та доÑтупний." /> 414 <String Id="Error1305" Overridable="yes" Value="СталаÑÑŒ помилка під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· файлу [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑŒ, що цей файл Ñ–Ñнує та доÑтупний." />
415 <String Id="Error1306" Overridable="yes" Value="Файл &quot;[2]&quot; відкрито в режимі монопольного доÑтупу в іншому заÑтоÑунку. Закрийте вÑÑ– інші заÑтоÑунки й натиÑніть кнопку &quot;Повторити&quot;." /> 415 <String Id="Error1306" Overridable="yes" Value="Файл &quot;[2]&quot; відкрито в режимі монопольного доÑтупу в іншому додатку. Закрийте вÑÑ– інші додатки й натиÑніть кнопку &quot;Повторити&quot;." />
416 <String Id="Error1307" Overridable="yes" Value="ÐедоÑтатньо міÑÑ†Ñ Ð½Ð° диÑку Ð´Ð»Ñ Ñ–Ð½ÑталÑції файлу: [2]. Звільніть міÑце й натиÑніть кнопку &quot;Повторити&quot; або натиÑніть кнопку &quot;СкаÑувати&quot;, щоб вийти." /> 416 <String Id="Error1307" Overridable="yes" Value="ÐедоÑтатньо міÑÑ†Ñ Ð½Ð° диÑку Ð´Ð»Ñ Ñ–Ð½ÑталÑції файлу: [2]. Звільніть міÑце й натиÑніть кнопку &quot;Повторити&quot; або натиÑніть кнопку &quot;СкаÑувати&quot;, щоб вийти." />
417 <String Id="Error1308" Overridable="yes" Value="Вихідний файл не знайдено: [2]. ПереконайтеÑÑ, що цей файл Ñ–Ñнує та доÑтупний." /> 417 <String Id="Error1308" Overridable="yes" Value="Вихідний файл не знайдено: [2]. ПереконайтеÑÑŒ, що цей файл Ñ–Ñнує та доÑтупний." />
418 <String Id="Error1309" Overridable="yes" Value="СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· файлу: [3]. {{ СиÑтемна помилка [2].}} ПереконайтеÑÑ, що цей файл Ñ–Ñнує та доÑтупний." /> 418 <String Id="Error1309" Overridable="yes" Value="СталаÑÑŒ помилка під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· файлу: [3]. {{ СиÑтемна помилка [2].}} ПереконайтеÑÑŒ, що цей файл Ñ–Ñнує та доÑтупний." />
419 <String Id="Error1310" Overridable="yes" Value="Помилка під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ файлу: [3]. {{ СиÑтемна помилка [2].}} ПереконайтеÑÑ, що маєте доÑтуп до цього каталогу." /> 419 <String Id="Error1310" Overridable="yes" Value="Помилка під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ файлу: [3]. {{ СиÑтемна помилка [2].}} ПереконайтеÑÑŒ, що маєте доÑтуп до цього каталогу." />
420 <String Id="Error1311" Overridable="yes" Value="Вихідний файл не знайдено{{(CAB-файл)}}: [2]. ПереконайтеÑÑ, що цей файл Ñ–Ñнує та доÑтупний." /> 420 <String Id="Error1311" Overridable="yes" Value="Вихідний файл не знайдено{{(CAB-файл)}}: [2]. ПереконайтеÑÑŒ, що цей файл Ñ–Ñнує та доÑтупний." />
421 <String Id="Error1312" Overridable="yes" Value="Ðе вдалоÑÑ Ñтворити каталог &quot;[2]&quot;. Файл із таким іменем уже Ñ–Ñнує. Перейменуйте або видаліть цей файл Ñ– натиÑніть кнопку &quot;Повторити&quot;. Щоб вийти, натиÑніть кнопку &quot;СкаÑувати&quot;." /> 421 <String Id="Error1312" Overridable="yes" Value="Ðе вдалоÑÑŒ Ñтворити каталог &quot;[2]&quot;. Файл із таким іменем уже Ñ–Ñнує. Перейменуйте або видаліть цей файл Ñ– натиÑніть кнопку &quot;Повторити&quot;. Щоб вийти, натиÑніть кнопку &quot;СкаÑувати&quot;." />
422 <String Id="Error1313" Overridable="yes" Value="Том [2] зараз недоÑтупний. Виберіть інший." /> 422 <String Id="Error1313" Overridable="yes" Value="Том [2] зараз недоÑтупний. Оберіть інший." />
423 <String Id="Error1314" Overridable="yes" Value="Указаний шлÑÑ… &quot;[2]&quot; недоÑтупний." /> 423 <String Id="Error1314" Overridable="yes" Value="Ðказаний шлÑÑ… &quot;[2]&quot; недоÑтупний." />
424 <String Id="Error1315" Overridable="yes" Value="Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до вказаної папки: [2]." /> 424 <String Id="Error1315" Overridable="yes" Value="Ðе вдалоÑÑŒ запиÑати до вказаної папки: [2]." />
425 <String Id="Error1316" Overridable="yes" Value="СталаÑÑ Ð¼ÐµÑ€ÐµÐ¶Ð½Ð° помилка під Ñ‡Ð°Ñ Ñпроби Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ: [2]" /> 425 <String Id="Error1316" Overridable="yes" Value="СталаÑÑŒ мережева помилка під Ñ‡Ð°Ñ Ñпроби Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ: [2]" />
426 <String Id="Error1317" Overridable="yes" Value="СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ñпроби ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ: [2]" /> 426 <String Id="Error1317" Overridable="yes" Value="СталаÑÑŒ помилка під Ñ‡Ð°Ñ Ñпроби ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ: [2]" />
427 <String Id="Error1318" Overridable="yes" Value="СталаÑÑ Ð¼ÐµÑ€ÐµÐ¶Ð½Ð° помилка під Ñ‡Ð°Ñ Ñпроби ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ: [2]" /> 427 <String Id="Error1318" Overridable="yes" Value="СталаÑÑŒ мережева помилка під Ñ‡Ð°Ñ Ñпроби ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ: [2]" />
428 <String Id="Error1319" Overridable="yes" Value="СталаÑÑ Ð¼ÐµÑ€ÐµÐ¶Ð½Ð° помилка під Ñ‡Ð°Ñ Ñпроби відкрити CAB-файл із вихідними файлами: [2]" /> 428 <String Id="Error1319" Overridable="yes" Value="СталаÑÑŒ мережева помилка під Ñ‡Ð°Ñ Ñпроби відкрити CAB-файл із вихідними файлами: [2]" />
429 <String Id="Error1320" Overridable="yes" Value="Указано задовгий шлÑÑ…: [2]" /> 429 <String Id="Error1320" Overridable="yes" Value="Ðказано задовгий шлÑÑ…: [2]" />
430 <String Id="Error1321" Overridable="yes" Value="ІнÑталÑтор не має належних прав Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ файлу: [2]." /> 430 <String Id="Error1321" Overridable="yes" Value="ІнÑталÑтор не має належних прав Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ файлу: [2]." />
431 <String Id="Error1322" Overridable="yes" Value="ЧаÑтина шлÑху до папки &quot;[2]&quot; неприпуÑтима: пуÑта або перевищує дозволену в ÑиÑтемі довжину." /> 431 <String Id="Error1322" Overridable="yes" Value="ЧаÑтина шлÑху до папки &quot;[2]&quot; неприпуÑтима: пуÑта або перевищує дозволену в ÑиÑтемі довжину." />
432 <String Id="Error1323" Overridable="yes" Value="ШлÑÑ… до папки &quot;[2]&quot; міÑтить неприпуÑтимі Ð´Ð»Ñ ÑˆÐ»Ñху Ñлова." /> 432 <String Id="Error1323" Overridable="yes" Value="ШлÑÑ… до папки &quot;[2]&quot; міÑтить неприпуÑтимі Ð´Ð»Ñ ÑˆÐ»Ñху Ñлова." />
433 <String Id="Error1324" Overridable="yes" Value="ШлÑÑ… до папки &quot;[2]&quot; міÑтить неприпуÑтимий Ñимвол." /> 433 <String Id="Error1324" Overridable="yes" Value="ШлÑÑ… до папки &quot;[2]&quot; міÑтить неприпуÑтимий Ñимвол." />
434 <String Id="Error1325" Overridable="yes" Value="&quot;[2]&quot; не Ñ” припуÑтимим коротким іменем файлу." /> 434 <String Id="Error1325" Overridable="yes" Value="&quot;[2]&quot; не Ñ” припуÑтимим коротким ім'Ñм файлу." />
435 <String Id="Error1326" Overridable="yes" Value="Помилка під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñ–Ð² безпеки файлу: [3] GetLastError: [2]" /> 435 <String Id="Error1326" Overridable="yes" Value="Помилка під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñ–Ð² безпеки файлу: [3] GetLastError: [2]" />
436 <String Id="Error1327" Overridable="yes" Value="Ðеправильний приÑтрій: [2]" /> 436 <String Id="Error1327" Overridable="yes" Value="Ðеправильний приÑтрій: [2]" />
437 <String Id="Error1328" Overridable="yes" Value="Помилка заÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ файлу [2]. Можливо, файл було оновлено в інший ÑпоÑіб, Ñ– це Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¶Ðµ не може його змінити. Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾ÐºÐ»Ð°Ð´Ð½Ñ–ÑˆÐ¸Ñ… відомоÑтей звернітьÑÑ Ð´Ð¾ поÑтачальника виправленнÑ. {{СиÑтемна помилка: [3]}}" /> 437 <String Id="Error1328" Overridable="yes" Value="Помилка заÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ файлу [2]. Можливо, файл було оновлено в інший ÑпоÑіб, Ñ– це Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¶Ðµ не може його змінити. Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾ÐºÐ»Ð°Ð´Ð½Ñ–ÑˆÐ¸Ñ… відомоÑтей звернітьÑÑ Ð´Ð¾ поÑтачальника виправленнÑ. {{СиÑтемна помилка: [3]}}" />
438 <String Id="Error1329" Overridable="yes" Value="Ðе вдалоÑÑ Ñ–Ð½Ñталювати потрібний файл, оÑкільки в CAB-файлі [2] немає цифрового підпиÑу. Це може Ñвідчити про Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð½Ñ CAB-файлу." /> 438 <String Id="Error1329" Overridable="yes" Value="Ðе вдалоÑÑŒ інÑталювати потрібний файл, оÑкільки в CAB-файлі [2] немає цифрового підпиÑу. Це може Ñвідчити про Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð½Ñ CAB-файлу." />
439 <String Id="Error1330" Overridable="yes" Value="Ðе вдалоÑÑ Ñ–Ð½Ñталювати потрібний файл, оÑкільки CAB-файл [2] міÑтить недійÑний цифровий підпиÑ. Це може Ñвідчити про Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð½Ñ CAB-файлу.{{ Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ WinVerifyTrust повернула помилку [3].}}" /> 439 <String Id="Error1330" Overridable="yes" Value="Ðе вдалоÑÑŒ інÑталювати потрібний файл, оÑкільки CAB-файл [2] міÑтить недійÑний цифровий підпиÑ. Це може Ñвідчити про Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð½Ñ CAB-файлу.{{ Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ WinVerifyTrust повернула помилку [3].}}" />
440 <String Id="Error1331" Overridable="yes" Value="Ðе вдалоÑÑ Ð½Ð°Ð»ÐµÐ¶Ð½Ð¾ Ñкопіювати файл [2]: помилка CRC." /> 440 <String Id="Error1331" Overridable="yes" Value="Ðе вдалоÑÑŒ належно Ñкопіювати файл [2]: помилка CRC." />
441 <String Id="Error1332" Overridable="yes" Value="Ðе вдалоÑÑ Ð½Ð°Ð»ÐµÐ¶Ð½Ð¾ переміÑтити файл [2]: помилка CRC." /> 441 <String Id="Error1332" Overridable="yes" Value="Ðе вдалоÑÑŒ належно переміÑтити файл [2]: помилка CRC." />
442 <String Id="Error1333" Overridable="yes" Value="Ðе вдалоÑÑ Ð½Ð°Ð»ÐµÐ¶Ð½Ð¾ виправити файл [2]: помилка CRC." /> 442 <String Id="Error1333" Overridable="yes" Value="Ðе вдалоÑÑŒ належно виправити файл [2]: помилка CRC." />
443 <String Id="Error1334" Overridable="yes" Value="Ðе вдалоÑÑ Ñ–Ð½Ñталювати файл &quot;[2]&quot;, оÑкільки його немає в CAB-файлі &quot;[3]&quot;. Це може Ñвідчити про помилку мережі, помилку Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð°ÐºÑ‚-диÑка або проблему з пакетом." /> 443 <String Id="Error1334" Overridable="yes" Value="Ðе вдалоÑÑŒ інÑталювати файл &quot;[2]&quot;, оÑкільки його немає в CAB-файлі &quot;[3]&quot;. Це може Ñвідчити про помилку мережі, помилку Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð°ÐºÑ‚-диÑку або проблему з пакетом." />
444 <String Id="Error1335" Overridable="yes" Value="Потрібний Ð´Ð»Ñ Ñ–Ð½ÑталÑції CAB-файл &quot;[2]&quot; пошкоджений Ñ– непридатний Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ. Це може Ñвідчити про помилку мережі, помилку Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð°ÐºÑ‚-диÑка або проблему з пакетом." /> 444 <String Id="Error1335" Overridable="yes" Value="Потрібний Ð´Ð»Ñ Ñ–Ð½ÑталÑції CAB-файл &quot;[2]&quot; пошкоджений Ñ– непридатний Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ. Це може Ñвідчити про помилку мережі, помилку Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð°ÐºÑ‚-диÑка або проблему з пакетом." />
445 <String Id="Error1336" Overridable="yes" Value="СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñового файлу, потрібного Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ–Ð½ÑталÑції.{{ Папка: [3]. Код ÑиÑтемної помилки: [2]}}" /> 445 <String Id="Error1336" Overridable="yes" Value="СталаÑÑŒ помилка під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñового файлу, потрібного Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ–Ð½ÑталÑції.{{ Папка: [3]. Код ÑиÑтемної помилки: [2]}}" />
446 <String Id="Error1401" Overridable="yes" Value="Ðе вдалоÑÑ Ñтворити розділ: [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 446 <String Id="Error1401" Overridable="yes" Value="Ðе вдалоÑÑŒ Ñтворити розділ: [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
447 <String Id="Error1402" Overridable="yes" Value="Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ розділ: [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 447 <String Id="Error1402" Overridable="yes" Value="Ðе вдалоÑÑŒ відкрити розділ: [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
448 <String Id="Error1403" Overridable="yes" Value="Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ [2] з розділу [3]. {{ СиÑтемна помилка [4].}} ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 448 <String Id="Error1403" Overridable="yes" Value="Ðе вдалоÑÑŒ видалити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ [2] з розділу [3]. {{ СиÑтемна помилка [4].}} ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
449 <String Id="Error1404" Overridable="yes" Value="Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ розділ [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 449 <String Id="Error1404" Overridable="yes" Value="Ðе вдалоÑÑŒ видалити розділ [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
450 <String Id="Error1405" Overridable="yes" Value="Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ [2] з розділу [3]. {{ СиÑтемна помилка [4].}} ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 450 <String Id="Error1405" Overridable="yes" Value="Ðе вдалоÑÑŒ прочитати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ [2] з розділу [3]. {{ СиÑтемна помилка [4].}} ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
451 <String Id="Error1406" Overridable="yes" Value="Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ [2] до розділу [3]. {{ СиÑтемна помилка [4].}} ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 451 <String Id="Error1406" Overridable="yes" Value="Ðе вдалоÑÑŒ запиÑати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ [2] до розділу [3]. {{ СиÑтемна помилка [4].}} ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
452 <String Id="Error1407" Overridable="yes" Value="Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ імена значень Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 452 <String Id="Error1407" Overridable="yes" Value="Ðе вдалоÑÑŒ отримати імена значень Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
453 <String Id="Error1408" Overridable="yes" Value="Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ імена підрозділів Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 453 <String Id="Error1408" Overridable="yes" Value="Ðе вдалоÑÑŒ отримати імена підрозділів Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
454 <String Id="Error1409" Overridable="yes" Value="Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ відомоÑті про безпеку Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 454 <String Id="Error1409" Overridable="yes" Value="Ðе вдалоÑÑŒ прочитати відомоÑті про безпеку Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ [2]. {{ СиÑтемна помилка [3].}} ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього розділу, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
455 <String Id="Error1410" Overridable="yes" Value="Ðе вдалоÑÑ Ð·Ð±Ñ–Ð»ÑŒÑˆÐ¸Ñ‚Ð¸ обÑÑг вільного міÑÑ†Ñ Ð² реєÑтрі. Ð”Ð»Ñ Ñ–Ð½ÑталÑції цього заÑтоÑунку в реєÑтрі має бути [2] КБ вільного міÑцÑ." /> 455 <String Id="Error1410" Overridable="yes" Value="Ðе вдалоÑÑŒ збільшити обÑÑг вільного міÑÑ†Ñ Ð² реєÑтрі. Ð”Ð»Ñ Ñ–Ð½ÑталÑції цього додатку в реєÑтрі має бути [2] КБ вільного міÑцÑ." />
456 <String Id="Error1500" Overridable="yes" Value="ОдночаÑно триває інший Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ–Ð½ÑталÑції. Ðеобхідно завершити його, перш ніж продовжити цю інÑталÑцію." /> 456 <String Id="Error1500" Overridable="yes" Value="ОдночаÑно триває інший Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ–Ð½ÑталÑції. Ðеобхідно завершити його, перш ніж продовжити цю інÑталÑцію." />
457 <String Id="Error1501" Overridable="yes" Value="Помилка доÑтупу до захищених даних. ПереконайтеÑÑ, що інÑталÑтор Windows наÑтроєно правильно, Ñ– повторіть інÑталÑцію." /> 457 <String Id="Error1501" Overridable="yes" Value="Помилка доÑтупу до захищених даних. ПереконайтеÑÑŒ, що інÑталÑтор Windows налаштован вірно, Ñ– повторіть інÑталÑцію." />
458 <String Id="Error1502" Overridable="yes" Value="КориÑтувач &quot;[2]&quot; раніше вже починав інÑталÑцію продукту &quot;[3]&quot;. Йому доведетьÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚Ð¸ Ñвій Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ–Ð½ÑталÑції, щоб мати змогу кориÑтуватиÑÑ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð¼. Зараз продовжитьÑÑ Ð²Ð°Ñˆ поточний Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ–Ð½ÑталÑції." /> 458 <String Id="Error1502" Overridable="yes" Value="КориÑтувач &quot;[2]&quot; раніше вже починав інÑталÑцію продукту &quot;[3]&quot;. Йому доведетьÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚Ð¸ Ñвій Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ–Ð½ÑталÑції, щоб мати змогу кориÑтуватиÑÑŒ продуктом. Зараз продовжитьÑÑ Ð²Ð°Ñˆ поточний Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ–Ð½ÑталÑції." />
459 <String Id="Error1503" Overridable="yes" Value="КориÑтувач &quot;[2]&quot; раніше вже починав інÑталÑцію продукту &quot;[3]&quot;. Йому доведетьÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚Ð¸ Ñвій Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ–Ð½ÑталÑції, щоб мати змогу кориÑтуватиÑÑ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð¼." /> 459 <String Id="Error1503" Overridable="yes" Value="КориÑтувач &quot;[2]&quot; раніше вже починав інÑталÑцію продукту &quot;[3]&quot;. Йому доведетьÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚Ð¸ Ñвій Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ–Ð½ÑталÑції, щоб мати змогу кориÑтуватиÑÑ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð¼." />
460 <String Id="Error1601" Overridable="yes" Value="Бракує міÑÑ†Ñ Ð½Ð° диÑку. Том: &quot;[2]&quot;; потрібно: [3] КБ; доÑтупно: [4] КБ. Звільніть міÑце на диÑку й повторіть Ñпробу." /> 460 <String Id="Error1601" Overridable="yes" Value="Бракує міÑÑ†Ñ Ð½Ð° диÑку. Том: &quot;[2]&quot;; потрібно: [3] КБ; доÑтупно: [4] КБ. Звільніть міÑце на диÑку й повторіть Ñпробу." />
461 <String Id="Error1602" Overridable="yes" Value="Справді ÑкаÑувати?" /> 461 <String Id="Error1602" Overridable="yes" Value="Справді ÑкаÑувати?" />
462 <String Id="Error1603" Overridable="yes" Value="Файл [2][3] зараз викориÑтовуєтьÑÑ{ в такому процеÑÑ–: ім’Ñ: [4], ідентифікатор: [5], заголовок вікна: &quot;[6]&quot;}. Закрийте цей заÑтоÑунок Ñ– повторіть Ñпробу." /> 462 <String Id="Error1603" Overridable="yes" Value="Файл [2][3] зараз викориÑтовуєтьÑÑ{ в такому процеÑÑ–: ім’Ñ: [4], ідентифікатор: [5], заголовок вікна: &quot;[6]&quot;}. Закрийте цей додаток Ñ– повторіть Ñпробу." />
463 <String Id="Error1604" Overridable="yes" Value="Уже інÑтальовано продукт &quot;[2]&quot;, неÑуміÑний із цим продуктом." /> 463 <String Id="Error1604" Overridable="yes" Value="Уже інÑтальовано продукт &quot;[2]&quot;, неÑуміÑний із цим продуктом." />
464 <String Id="Error1605" Overridable="yes" Value="У томі &quot;[2]&quot; бракує вільного міÑÑ†Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ñ–Ð½ÑталÑції з увімкнутим відновленнÑм. Потрібно [3] КБ, доÑтупно лише [4] КБ. Щоб продовжити інÑталÑцію без Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð¼Ð¾Ñтей про відновленнÑ, натиÑніть кнопку &quot;ПропуÑтити&quot;. Щоб знову перевірити обÑÑг вільного диÑкового проÑтору, натиÑніть кнопку &quot;Повторити&quot;. Щоб вийти із програми інÑталÑції, натиÑніть кнопку &quot;СкаÑувати&quot;." /> 464 <String Id="Error1605" Overridable="yes" Value="У томі &quot;[2]&quot; бракує вільного міÑÑ†Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ñ–Ð½ÑталÑції з увімкнутим відновленнÑм. Потрібно [3] КБ, доÑтупно лише [4] КБ. Щоб продовжити інÑталÑцію без Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð¼Ð¾Ñтей про відновленнÑ, натиÑніть кнопку &quot;ПропуÑтити&quot;. Щоб знову перевірити обÑÑг вільного диÑкового проÑтору, натиÑніть кнопку &quot;Повторити&quot;. Щоб вийти із програми інÑталÑції, натиÑніть кнопку &quot;СкаÑувати&quot;." />
465 <String Id="Error1606" Overridable="yes" Value="Мережна папка &quot;[2]&quot; недоÑтупна." /> 465 <String Id="Error1606" Overridable="yes" Value="Мережева папка &quot;[2]&quot; недоÑтупна." />
466 <String Id="Error1607" Overridable="yes" Value="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ñ–Ð½ÑталÑції необхідно закрити такі заÑтоÑунки:" /> 466 <String Id="Error1607" Overridable="yes" Value="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ñ–Ð½ÑталÑції необхідно закрити такі додатки:" />
467 <String Id="Error1608" Overridable="yes" Value="Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ інÑтальовані на комп’ютері ÑуміÑні продукти Ð´Ð»Ñ Ñ–Ð½ÑталÑції цього продукту." /> 467 <String Id="Error1608" Overridable="yes" Value="Ðе вдалоÑÑŒ знайти інÑтальовані на комп’ютері ÑуміÑні продукти Ð´Ð»Ñ Ñ–Ð½ÑталÑції цього продукту." />
468 <String Id="Error1609" Overridable="yes" Value="СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð·Ð°ÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ñтройок безпеки. [2] Ñ” неприпуÑтимим кориÑтувачем або групою. Можливо, ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° пакета або помилка Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ контролера домену мережі. Перевірте Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі й натиÑніть кнопку &quot;Повторити&quot;. Щоб завершити інÑталÑцію, натиÑніть кнопку &quot;СкаÑувати&quot;. {{Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ідентифікатор SID кориÑтувача; ÑиÑтемна помилка [3]}}" /> 468 <String Id="Error1609" Overridable="yes" Value="СталаÑÑŒ помилка під Ñ‡Ð°Ñ Ð·Ð°ÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ безпеки. [2] Ñ” неприпуÑтимим кориÑтувачем або групою. Можливо, ÑталаÑÑŒ помилка пакету або помилка Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ контролеру домену мережі. Перевірте Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі й натиÑніть кнопку &quot;Повторити&quot;. Щоб завершити інÑталÑцію, натиÑніть кнопку &quot;СкаÑувати&quot;. {{Ðе вдалоÑÑŒ знайти ідентифікатор SID кориÑтувача; ÑиÑтемна помилка [3]}}" />
469 <String Id="Error1701" Overridable="yes" Value="Розділ &quot;[2]&quot; неприпуÑтимий. ПереконайтеÑÑ, що введено правильний розділ." /> 469 <String Id="Error1701" Overridable="yes" Value="Розділ &quot;[2]&quot; неприпуÑтимий. ПереконайтеÑÑŒ, що введено правильний розділ." />
470 <String Id="Error1702" Overridable="yes" Value="Перед продовженнÑм наÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ [2] інÑталÑтору необхідно перезавантажити ÑиÑтему. Ð”Ð»Ñ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾Ð³Ð¾ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð°Ñ‚Ð¸Ñніть кнопку &quot;Так&quot;. Щоб пізніше перезавантажити ÑиÑтему вручну, натиÑніть кнопку &quot;ÐÑ–&quot;." /> 470 <String Id="Error1702" Overridable="yes" Value="Перед продовженнÑм Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ [2] інÑталÑтору необхідно перезавантажити ÑиÑтему. Ð”Ð»Ñ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾Ð³Ð¾ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð°Ñ‚Ð¸Ñніть кнопку &quot;Так&quot;. Щоб пізніше перезавантажити ÑиÑтему вручну, натиÑніть кнопку &quot;ÐÑ–&quot;." />
471 <String Id="Error1703" Overridable="yes" Value="Щоб внеÑені до конфігурації [2] зміни набрали Ñили, необхідно перезавантажити ÑиÑтему. Ð”Ð»Ñ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾Ð³Ð¾ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð°Ñ‚Ð¸Ñніть кнопку &quot;Так&quot;. Щоб пізніше перезавантажити ÑиÑтему вручну, натиÑніть кнопку &quot;ÐÑ–&quot;." /> 471 <String Id="Error1703" Overridable="yes" Value="Щоб внеÑені до конфігурації [2] зміни набрали Ñили, необхідно перезавантажити ÑиÑтему. Ð”Ð»Ñ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾Ð³Ð¾ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð°Ñ‚Ð¸Ñніть кнопку &quot;Так&quot;. Щоб пізніше перезавантажити ÑиÑтему вручну, натиÑніть кнопку &quot;ÐÑ–&quot;." />
472 <String Id="Error1704" Overridable="yes" Value="ІнÑталÑцію програми [2] наразі призупинено. Щоб продовжити, необхідно ÑкаÑувати зміни, внеÑені під Ñ‡Ð°Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. СкаÑувати ці зміни?" /> 472 <String Id="Error1704" Overridable="yes" Value="ІнÑталÑцію програми [2] наразі призупинено. Щоб продовжити, необхідно ÑкаÑувати зміни, внеÑені під Ñ‡Ð°Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. СкаÑувати ці зміни?" />
473 <String Id="Error1705" Overridable="yes" Value="Ðе завершено попередню інÑталÑцію програми. Щоб продовжити, необхідно ÑкаÑувати зміни, внеÑені під Ñ‡Ð°Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. СкаÑувати ці зміни?" /> 473 <String Id="Error1705" Overridable="yes" Value="Ðе завершено попередню інÑталÑцію програми. Щоб продовжити, необхідно ÑкаÑувати зміни, внеÑені під Ñ‡Ð°Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. СкаÑувати ці зміни?" />
474 <String Id="Error1706" Overridable="yes" Value="Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ пакет інÑталÑції Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ñƒ [2]. Повторіть інÑталÑцію за допомогою дійÑної копії пакета інÑталÑції &quot;[3]&quot;." /> 474 <String Id="Error1706" Overridable="yes" Value="Ðе вдалоÑÑŒ знайти пакет інÑталÑції Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ñƒ [2]. Повторіть інÑталÑцію за допомогою дійÑної копії пакету інÑталÑції &quot;[3]&quot;." />
475 <String Id="Error1707" Overridable="yes" Value="ІнÑталÑцію уÑпішно завершено." /> 475 <String Id="Error1707" Overridable="yes" Value="ІнÑталÑцію уÑпішно завершено." />
476 <String Id="Error1708" Overridable="yes" Value="Помилка інÑталÑції." /> 476 <String Id="Error1708" Overridable="yes" Value="Помилка інÑталÑції." />
477 <String Id="Error1709" Overridable="yes" Value="Продукт: [2] -- [3]" /> 477 <String Id="Error1709" Overridable="yes" Value="Продукт: [2] -- [3]" />
478 <String Id="Error1710" Overridable="yes" Value="Можна повернути комп’ютер до попереднього Ñтану або продовжити інÑталÑцію згодом. Відновити попередній Ñтан?" /> 478 <String Id="Error1710" Overridable="yes" Value="Можна повернути комп’ютер до попереднього Ñтану або продовжити інÑталÑцію згодом. Відновити попередній Ñтан?" />
479 <String Id="Error1711" Overridable="yes" Value="СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° диÑк відомоÑтей про інÑталÑцію. Перевірте, чи доÑтатньо міÑÑ†Ñ Ð½Ð° диÑку, Ñ– натиÑніть кнопку &quot;Повторити&quot;, або натиÑніть кнопку &quot;СкаÑувати&quot;, щоб завершити інÑталÑцію." /> 479 <String Id="Error1711" Overridable="yes" Value="СталаÑÑŒ помилка під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° диÑк відомоÑтей про інÑталÑцію. Перевірте, чи доÑтатньо міÑÑ†Ñ Ð½Ð° диÑку, Ñ– натиÑніть кнопку &quot;Повторити&quot;, або натиÑніть кнопку &quot;СкаÑувати&quot;, щоб завершити інÑталÑцію." />
480 <String Id="Error1712" Overridable="yes" Value="Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ принаймні один файл, необхідний Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ Ñтану комп’ютера. Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ." /> 480 <String Id="Error1712" Overridable="yes" Value="Ðе вдалоÑÑŒ знайти принаймні один файл, необхідний Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ Ñтану комп’ютера. Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ." />
481 <String Id="Error1713" Overridable="yes" Value="[2] не вдалоÑÑ Ñ–Ð½Ñталювати один із потрібних продуктів. ЗвернітьÑÑ Ð´Ð¾ групи технічної підтримки. {{СиÑтемна помилка: [3].}}" /> 481 <String Id="Error1713" Overridable="yes" Value="[2] не вдалоÑÑŒ інÑталювати один із потрібних продуктів. ЗвернітьÑÑ Ð´Ð¾ групи технічної підтримки. {{СиÑтемна помилка: [3].}}" />
482 <String Id="Error1714" Overridable="yes" Value="Стару верÑÑ–ÑŽ [2] не можна видалити. ЗвернітьÑÑ Ð´Ð¾ групи технічної підтримки. {{СиÑтемна помилка [3].}}" /> 482 <String Id="Error1714" Overridable="yes" Value="Стару верÑÑ–ÑŽ [2] не можна видалити. ЗвернітьÑÑ Ð´Ð¾ групи технічної підтримки. {{СиÑтемна помилка [3].}}" />
483 <String Id="Error1715" Overridable="yes" Value="ІнÑтальовано [2]" /> 483 <String Id="Error1715" Overridable="yes" Value="ІнÑтальовано [2]" />
484 <String Id="Error1716" Overridable="yes" Value="ÐаÑтроєно [2]" /> 484 <String Id="Error1716" Overridable="yes" Value="Ðалаштовано [2]" />
485 <String Id="Error1717" Overridable="yes" Value="Видалено [2]" /> 485 <String Id="Error1717" Overridable="yes" Value="Видалено [2]" />
486 <String Id="Error1718" Overridable="yes" Value="Файл [2] відхилено за політикою цифрового підпиÑу." /> 486 <String Id="Error1718" Overridable="yes" Value="Файл [2] відхилено за політикою цифрового підпиÑу." />
487 <String Id="Error1719" Overridable="yes" Value="Служба інÑталÑтора Windows недоÑтупна. Це може ÑтатиÑÑ, Ñкщо Windows запущено в безпечному режимі або інÑталÑтор Windows інÑтальовано неправильно. ЗвернітьÑÑ Ð¿Ð¾ допомогу до Ñлужби підтримки." /> 487 <String Id="Error1719" Overridable="yes" Value="Служба інÑталÑтора Windows недоÑтупна. Це може ÑтатиÑÑ, Ñкщо Windows запущено в безпечному режимі або інÑталÑтор Windows інÑтальовано невірно. ЗвернітьÑÑ Ð¿Ð¾ допомогу до Ñлужби підтримки." />
488 <String Id="Error1720" Overridable="yes" Value="СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° пакета інÑталÑтора Windows. Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ñценарій, потрібний Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки або поÑтачальника пакета. {{Додаткова Ð´Ñ–Ñ [2], помилка Ñценарію [3], [4]: [5] Ñ€Ñдок [6], Ñтовпець [7], [8] }}" /> 488 <String Id="Error1720" Overridable="yes" Value="СталаÑÑŒ помилка пакету інÑталÑтора Windows. Ðе вдалоÑÑŒ запуÑтити Ñценарій, потрібний Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки або поÑтачальника пакету. {{Додаткова Ð´Ñ–Ñ [2], помилка Ñценарію [3], [4]: [5] Ñ€Ñдок [6], Ñтовпчик [7], [8] }}" />
489 <String Id="Error1721" Overridable="yes" Value="СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° пакета інÑталÑтора Windows. Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити програму, потрібну Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки або поÑтачальника пакета. {{ДіÑ: [2], розташуваннÑ: [3], команда: [4] }}" /> 489 <String Id="Error1721" Overridable="yes" Value="СталаÑÑŒ помилка пакета інÑталÑтора Windows. Ðе вдалоÑÑŒ запуÑтити програму, потрібну Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки або поÑтачальника пакету. {{ДіÑ: [2], розташуваннÑ: [3], команда: [4] }}" />
490 <String Id="Error1722" Overridable="yes" Value="СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° пакета інÑталÑтора Windows. Програма, запущена у Ñкладі програми інÑталÑції, неправильно завершила роботу. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки або поÑтачальника пакета. {{Ð”Ñ–Ñ [2], розташуваннÑ: [3], команда: [4] }}" /> 490 <String Id="Error1722" Overridable="yes" Value="СталаÑÑŒ помилка пакета інÑталÑтора Windows. Програма, запущена у Ñкладі програми інÑталÑції, неправильно завершила роботу. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки або поÑтачальника пакету. {{Ð”Ñ–Ñ [2], розташуваннÑ: [3], команда: [4] }}" />
491 <String Id="Error1723" Overridable="yes" Value="СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° пакета інÑталÑтора Windows. Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити бібліотеку DLL, потрібну Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки або поÑтачальника пакета. {{Ð”Ñ–Ñ [2], елемент: [3], бібліотека: [4] }}" /> 491 <String Id="Error1723" Overridable="yes" Value="СталаÑÑŒ помилка пакета інÑталÑтора Windows. Ðе вдалоÑÑŒ запуÑтити бібліотеку DLL, потрібну Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки або поÑтачальника пакету. {{Ð”Ñ–Ñ [2], елемент: [3], бібліотека: [4] }}" />
492 <String Id="Error1724" Overridable="yes" Value="Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑƒÑпішно виконано." /> 492 <String Id="Error1724" Overridable="yes" Value="Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑƒÑпішно виконано." />
493 <String Id="Error1725" Overridable="yes" Value="Помилка видаленнÑ." /> 493 <String Id="Error1725" Overridable="yes" Value="Помилка видаленнÑ." />
494 <String Id="Error1726" Overridable="yes" Value="ÐžÐ³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ ÑƒÑпішно завершено." /> 494 <String Id="Error1726" Overridable="yes" Value="ÐžÐ³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ ÑƒÑпішно завершено." />
495 <String Id="Error1727" Overridable="yes" Value="Помилка оголошеннÑ." /> 495 <String Id="Error1727" Overridable="yes" Value="Помилка оголошеннÑ." />
496 <String Id="Error1728" Overridable="yes" Value="ÐаÑÑ‚ÑÐ¾ÑŽÐ²Ð°Ð½Ð½Ñ ÑƒÑпішно завершено." /> 496 <String Id="Error1728" Overridable="yes" Value="ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑƒÑпішно завершено." />
497 <String Id="Error1729" Overridable="yes" Value="Помилка наÑÑ‚ÑоюваннÑ." /> 497 <String Id="Error1729" Overridable="yes" Value="Помилка налаштуваннÑ." />
498 <String Id="Error1730" Overridable="yes" Value="Ð”Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ заÑтоÑунку необхідні права адмініÑтратора. Щоб видалити цей заÑтоÑунок, ввійдіть до ÑиÑтеми із правами адмініÑтратора або звернітьÑÑ Ð¿Ð¾ допомогу до групи технічної підтримки." /> 498 <String Id="Error1730" Overridable="yes" Value="Ð”Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ додатку необхідні права адмініÑтратора. Щоб видалити цей додаток, увійдіть до ÑиÑтеми із правами адмініÑтратора або звернітьÑÑ Ð¿Ð¾ допомогу до групи технічної підтримки." />
499 <String Id="Error1731" Overridable="yes" Value="Вихідний пакет інÑталÑції Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ñƒ [2] не Ñинхронізовано з пакетом клієнта. Повторіть інÑталÑцію за допомогою дійÑної копії пакета інÑталÑції &quot;[3]&quot;." /> 499 <String Id="Error1731" Overridable="yes" Value="Вихідний пакет інÑталÑції Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ñƒ [2] не Ñинхронізовано з пакетом клієнта. Повторіть інÑталÑцію за допомогою дійÑної копії пакету інÑталÑції &quot;[3]&quot;." />
500 <String Id="Error1732" Overridable="yes" Value="Щоб завершити інÑталÑцію [2], необхідно перезавантажити комп’ютер. Інші кориÑтувачі не вишли із ÑиÑтеми, Ñ– внаÑлідок Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¾Ð½Ð¸ можуть втратити результати Ñвоєї роботи. Перезавантажити зараз?" /> 500 <String Id="Error1732" Overridable="yes" Value="Щоб завершити інÑталÑцію [2], необхідно перезавантажити комп’ютер. Інші кориÑтувачі не вишли із ÑиÑтеми, Ñ– внаÑлідок Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¾Ð½Ð¸ можуть втратити результати Ñвоєї роботи. Перезавантажити зараз?" />
501 <String Id="Error1801" Overridable="yes" Value="ÐеприпуÑтимий шлÑÑ… &quot;[2]&quot;. Укажіть правильний шлÑÑ…." /> 501 <String Id="Error1801" Overridable="yes" Value="ÐеприпуÑтимий шлÑÑ… &quot;[2]&quot;. Вкажіть вірний шлÑÑ…." />
502 <String Id="Error1802" Overridable="yes" Value="Бракує пам’Ñті. Закрийте інші заÑтоÑунки та повторіть Ñпробу." /> 502 <String Id="Error1802" Overridable="yes" Value="Бракує пам’Ñті. Закрийте інші додатки та повторіть Ñпробу." />
503 <String Id="Error1803" Overridable="yes" Value="У приÑтрої [2] немає диÑка. Ð’Ñтавте диÑк Ñ– натиÑніть кнопку &quot;Повторити&quot; або натиÑніть кнопку &quot;СкаÑувати&quot;, щоб повернутиÑÑ Ð´Ð¾ вибраного раніше тому." /> 503 <String Id="Error1803" Overridable="yes" Value="У приÑтрої [2] немає диÑку. Ð’Ñтавте диÑк Ñ– натиÑніть кнопку &quot;Повторити&quot; або натиÑніть кнопку &quot;СкаÑувати&quot;, щоб повернутиÑÑ Ð´Ð¾ обраного раніше тому." />
504 <String Id="Error1804" Overridable="yes" Value="У приÑтрої [2] немає диÑка. Ð’Ñтавте диÑк Ñ– натиÑніть кнопку &quot;Повторити&quot; або натиÑніть кнопку &quot;СкаÑувати&quot;, щоб повернутиÑÑ Ð´Ð¾ вікна переглÑду папок Ñ– вибрати інший том." /> 504 <String Id="Error1804" Overridable="yes" Value="У приÑтрої [2] немає диÑку. Ð’Ñтавте диÑк Ñ– натиÑніть кнопку &quot;Повторити&quot; або натиÑніть кнопку &quot;СкаÑувати&quot;, щоб повернутиÑÑŒ до вікна переглÑду папок Ñ– обрати інший том." />
505 <String Id="Error1805" Overridable="yes" Value="Папка &quot;[2]&quot; не Ñ–Ñнує. Введіть шлÑÑ… до наÑвної папки." /> 505 <String Id="Error1805" Overridable="yes" Value="Папка &quot;[2]&quot; не Ñ–Ñнує. Введіть шлÑÑ… до наÑвної папки." />
506 <String Id="Error1806" Overridable="yes" Value="У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтатньо прав Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— папки." /> 506 <String Id="Error1806" Overridable="yes" Value="У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтатньо прав Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— папки." />
507 <String Id="Error1807" Overridable="yes" Value="Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ припуÑтиму папку Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ–Ð½ÑталÑції." /> 507 <String Id="Error1807" Overridable="yes" Value="Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ припуÑтиму папку Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ–Ð½ÑталÑції." />
508 <String Id="Error1901" Overridable="yes" Value="СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ñпроби Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· вихідної бази даних інÑталÑції: [2]." /> 508 <String Id="Error1901" Overridable="yes" Value="СталаÑÑŒ помилка під Ñ‡Ð°Ñ Ñпроби Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· вихідної бази даних інÑталÑції: [2]." />
509 <String Id="Error1902" Overridable="yes" Value="ÐŸÐ»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— перезавантаженнÑ: Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ [2] на [3]. Ð”Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— потрібне перезавантаженнÑ." /> 509 <String Id="Error1902" Overridable="yes" Value="ÐŸÐ»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— перезавантаженнÑ: Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ [2] на [3]. Ð”Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— потрібне перезавантаженнÑ." />
510 <String Id="Error1903" Overridable="yes" Value="ÐŸÐ»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— перезавантаженнÑ: Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ [2]. Ð”Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— потрібне перезавантаженнÑ." /> 510 <String Id="Error1903" Overridable="yes" Value="ÐŸÐ»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— перезавантаженнÑ: Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ [2]. Ð”Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— потрібне перезавантаженнÑ." />
511 <String Id="Error1904" Overridable="yes" Value="Ðе вдалоÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати модуль [2]. HRESULT [3]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 511 <String Id="Error1904" Overridable="yes" Value="Ðе вдалоÑÑŒ зареєÑтрувати модуль [2]. HRESULT [3]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
512 <String Id="Error1905" Overridable="yes" Value="Ðе вдалоÑÑ ÑкаÑувати реєÑтрацію Ð¼Ð¾Ð´ÑƒÐ»Ñ [2]. HRESULT [3]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 512 <String Id="Error1905" Overridable="yes" Value="Ðе вдалоÑÑŒ ÑкаÑувати реєÑтрацію Ð¼Ð¾Ð´ÑƒÐ»Ñ [2]. HRESULT [3]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
513 <String Id="Error1906" Overridable="yes" Value="Ðе вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ ÐºÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ð° [2]. Помилка: [3]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 513 <String Id="Error1906" Overridable="yes" Value="Ðе вдалоÑÑŒ виконати ÐºÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ñƒ [2]. Помилка: [3]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
514 <String Id="Error1907" Overridable="yes" Value="Ðе вдалоÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати шрифт &quot;[2]&quot;. ПереконайтеÑÑ, що ви маєте доÑтатні дозволи на інÑталÑцію шрифтів, а ÑиÑтема підтримує цей шрифт." /> 514 <String Id="Error1907" Overridable="yes" Value="Ðе вдалоÑÑŒ зареєÑтрувати шрифт &quot;[2]&quot;. ПереконайтеÑÑŒ, що ви маєте доÑтатні дозволи на інÑталÑцію шрифтів, а ÑиÑтема підтримує цей шрифт." />
515 <String Id="Error1908" Overridable="yes" Value="Ðе вдалоÑÑ ÑкаÑувати реєÑтрацію шрифту &quot;[2]&quot;. ПереконайтеÑÑ, що ви маєте доÑтатні дозволи на Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ñ–Ð²." /> 515 <String Id="Error1908" Overridable="yes" Value="Ðе вдалоÑÑŒ ÑкаÑувати реєÑтрацію шрифту &quot;[2]&quot;. ПереконайтеÑÑ, що ви маєте доÑтатні дозволи на Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ñ–Ð²." />
516 <String Id="Error1909" Overridable="yes" Value="Ðе вдалоÑÑ Ñтворити Ñрлик [2]. ПереконайтеÑÑ, що папка Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ñнує та доÑтупна." /> 516 <String Id="Error1909" Overridable="yes" Value="Ðе вдалоÑÑŒ Ñтворити Ñрлик [2]. ПереконайтеÑÑŒ, що папка Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ñнує та доÑтупна." />
517 <String Id="Error1910" Overridable="yes" Value="Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñрлик &quot;[2]&quot;. ПереконайтеÑÑ, що файл Ñрлика Ñ–Ñнує та доÑтупний." /> 517 <String Id="Error1910" Overridable="yes" Value="Ðе вдалоÑÑŒ видалити Ñрлик &quot;[2]&quot;. ПереконайтеÑÑ, що файл Ñрлика Ñ–Ñнує та доÑтупний." />
518 <String Id="Error1911" Overridable="yes" Value="Ðе вдалоÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати бібліотеку типів Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ [2]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 518 <String Id="Error1911" Overridable="yes" Value="Ðе вдалоÑÑŒ зареєÑтрувати бібліотеку типів Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ [2]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
519 <String Id="Error1912" Overridable="yes" Value="Ðе вдалоÑÑ ÑкаÑувати реєÑтрацію бібліотеки типів Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ [2]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 519 <String Id="Error1912" Overridable="yes" Value="Ðе вдалоÑÑŒ ÑкаÑувати реєÑтрацію бібліотеки типів Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ [2]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
520 <String Id="Error1913" Overridable="yes" Value="Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ файл INI [2][3]. ПереконайтеÑÑ, що цей файл Ñ–Ñнує та доÑтупний." /> 520 <String Id="Error1913" Overridable="yes" Value="Ðе вдалоÑÑŒ оновити файл INI [2][3]. ПереконайтеÑÑŒ, що цей файл Ñ–Ñнує та доÑтупний." />
521 <String Id="Error1914" Overridable="yes" Value="Ðе вдалоÑÑ Ð·Ð°Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð°Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ [3] файлом [2] під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ. ПереконайтеÑÑ, що у Ð²Ð°Ñ Ñ” дозвіл на запиÑÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ файлу [3]." /> 521 <String Id="Error1914" Overridable="yes" Value="Ðе вдалоÑÑŒ запланувати Ð·Ð°Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ [3] файлом [2] під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ. ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ñ” дозвіл на запиÑÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ файлу [3]." />
522 <String Id="Error1915" Overridable="yes" Value="Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ диÑпетчер драйверів ODBC; помилка ODBC [2]: [3]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 522 <String Id="Error1915" Overridable="yes" Value="Ðе вдалоÑÑŒ видалити диÑпетчер драйверів ODBC; помилка ODBC [2]: [3]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
523 <String Id="Error1916" Overridable="yes" Value="Ðе вдалоÑÑ Ñ–Ð½Ñталювати диÑпетчер драйверів ODBC; помилка ODBC [2]: [3]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 523 <String Id="Error1916" Overridable="yes" Value="Ðе вдалоÑÑŒ інÑталювати диÑпетчер драйверів ODBC; помилка ODBC [2]: [3]. ЗвернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
524 <String Id="Error1917" Overridable="yes" Value="Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ драйвер ODBC: [4]; помилка ODBC [2]: [3]. ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ñ–Ð² ODBC." /> 524 <String Id="Error1917" Overridable="yes" Value="Ðе вдалоÑÑŒ видалити драйвер ODBC: [4]; помилка ODBC [2]: [3]. ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ñ–Ð² ODBC." />
525 <String Id="Error1918" Overridable="yes" Value="Ðе вдалоÑÑ Ñ–Ð½Ñталювати драйвер ODBC: [4]; помилка ODBC [2]: [3]. ПереконайтеÑÑ, що файл [4] Ñ–Ñнує та доÑтупний." /> 525 <String Id="Error1918" Overridable="yes" Value="Ðе вдалоÑÑŒ інÑталювати драйвер ODBC: [4]; помилка ODBC [2]: [3]. ПереконайтеÑÑŒ, що файл [4] Ñ–Ñнує та доÑтупний." />
526 <String Id="Error1919" Overridable="yes" Value="Ðе вдалоÑÑ Ð½Ð°Ñтроїти джерело даних ODBC: [4]; помилка ODBC [2]: [3]. ПереконайтеÑÑ, що файл &quot;[4]&quot; Ñ–Ñнує та доÑтупний." /> 526 <String Id="Error1919" Overridable="yes" Value="Ðе вдалоÑÑŒ налаштувати джерело даних ODBC: [4]; помилка ODBC [2]: [3]. ПереконайтеÑÑŒ, що файл &quot;[4]&quot; Ñ–Ñнує та доÑтупний." />
527 <String Id="Error1920" Overridable="yes" Value="Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ñлужбу &quot;[2]&quot; ([3]). ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку ÑиÑтемних Ñлужб." /> 527 <String Id="Error1920" Overridable="yes" Value="Ðе вдалоÑÑŒ запуÑтити Ñлужбу &quot;[2]&quot; ([3]). ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку ÑиÑтемних Ñлужб." />
528 <String Id="Error1921" Overridable="yes" Value="Ðе вдалоÑÑ Ð·ÑƒÐ¿Ð¸Ð½Ð¸Ñ‚Ð¸ Ñлужбу &quot;[2]&quot; ([3]). ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð·ÑƒÐ¿Ð¸Ð½ÐµÐ½Ð½Ñ ÑиÑтемних Ñлужб." /> 528 <String Id="Error1921" Overridable="yes" Value="Ðе вдалоÑÑŒ зупинити Ñлужбу &quot;[2]&quot; ([3]). ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð·ÑƒÐ¿Ð¸Ð½ÐµÐ½Ð½Ñ ÑиÑтемних Ñлужб." />
529 <String Id="Error1922" Overridable="yes" Value="Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñлужбу &quot;[2]&quot; ([3]). ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑиÑтемних Ñлужб." /> 529 <String Id="Error1922" Overridable="yes" Value="Ðе вдалоÑÑŒ видалити Ñлужбу &quot;[2]&quot; ([3]). ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑиÑтемних Ñлужб." />
530 <String Id="Error1923" Overridable="yes" Value="Ðе вдалоÑÑ Ñ–Ð½Ñталювати Ñлужбу &quot;[2]&quot; ([3]). ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ñ–Ð½ÑталÑції ÑиÑтемних Ñлужб." /> 530 <String Id="Error1923" Overridable="yes" Value="Ðе вдалоÑÑŒ інÑталювати Ñлужбу &quot;[2]&quot; ([3]). ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ñ–Ð½ÑталÑції ÑиÑтемних Ñлужб." />
531 <String Id="Error1924" Overridable="yes" Value="Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ змінну Ð¾Ñ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ &quot;[2]&quot;. ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— змінних оточеннÑ." /> 531 <String Id="Error1924" Overridable="yes" Value="Ðе вдалоÑÑŒ оновити змінну Ð¾Ñ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ &quot;[2]&quot;. ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— змінних оточеннÑ." />
532 <String Id="Error1925" Overridable="yes" Value="У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтатньо прав, щоб завершити цю інÑталÑцію Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів комп’ютера. Ввійдіть до ÑиÑтеми Ñк адмініÑтратор Ñ– повторіть Ñпробу." /> 532 <String Id="Error1925" Overridable="yes" Value="У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтатньо прав, щоб завершити цю інÑталÑцію Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів комп’ютера. Увійдіть до ÑиÑтеми Ñк адмініÑтратор Ñ– повторіть Ñпробу." />
533 <String Id="Error1926" Overridable="yes" Value="Ðе вдалоÑÑ Ð²Ñтановити захиÑÑ‚ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ &quot;[3]&quot;. Помилка: [2]. ПереконайтеÑÑ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½ÐµÐ½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ–Ð² безпеки Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ файлу." /> 533 <String Id="Error1926" Overridable="yes" Value="Ðе вдалоÑÑŒ вÑтановити захиÑÑ‚ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ &quot;[3]&quot;. Помилка: [2]. ПереконайтеÑÑŒ, що у Ð²Ð°Ñ Ð´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½ÐµÐ½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ–Ð² безпеки Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ файлу." />
534 <String Id="Error1927" Overridable="yes" Value="Служби компонентів (COM+ 1.0) не інÑтальовано на цьому комп’ютері. Ð”Ð»Ñ ÑƒÑпішного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції потрібні Ñлужби компонентів. Служби компонентів доÑтупні в ÑиÑтемі Windows 2000." /> 534 <String Id="Error1927" Overridable="yes" Value="Служби компонентів (COM+ 1.0) не інÑтальовано на цьому комп’ютері. Ð”Ð»Ñ ÑƒÑпішного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції потрібні Ñлужби компонентів. Служби компонентів доÑтупні в ÑиÑтемі Windows 2000." />
535 <String Id="Error1928" Overridable="yes" Value="Помилка реєÑтрації заÑтоÑунку COM+. Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¸Ñ… відомоÑтей звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 535 <String Id="Error1928" Overridable="yes" Value="Помилка реєÑтрації заÑтоÑунку COM+. Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¸Ñ… відомоÑтей звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
536 <String Id="Error1929" Overridable="yes" Value="Помилка ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації заÑтоÑунку COM+. Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¸Ñ… відомоÑтей звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." /> 536 <String Id="Error1929" Overridable="yes" Value="Помилка ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації заÑтоÑунку COM+. Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¸Ñ… відомоÑтей звернітьÑÑ Ð´Ð¾ Ñлужби підтримки." />
537 <String Id="Error1930" Overridable="yes" Value="Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ Ð¾Ð¿Ð¸Ñ Ð´Ð»Ñ Ñлужби &quot;[2]&quot; ([3])." /> 537 <String Id="Error1930" Overridable="yes" Value="Ðе вдалоÑÑŒ змінити Ð¾Ð¿Ð¸Ñ Ð´Ð»Ñ Ñлужби &quot;[2]&quot; ([3])." />
538 <String Id="Error1931" Overridable="yes" Value="ІнÑталÑтору Windows не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ ÑиÑтемний файл [2], оÑкільки його захищає ÑиÑтема Windows. Можливо, Ð´Ð»Ñ Ð½Ð°Ð»ÐµÐ¶Ð½Ð¾Ñ— роботи програми Ñлід оновити операційну ÑиÑтему. {{ВерÑÑ–Ñ Ð¿Ð°ÐºÐµÑ‚Ð°: [3], захищена операційною ÑиÑтемою верÑÑ–Ñ: [4]}}" /> 538 <String Id="Error1931" Overridable="yes" Value="ІнÑталÑтору Windows не вдалоÑÑŒ оновити ÑиÑтемний файл [2], оÑкільки його захищає ÑиÑтема Windows. Можливо, Ð´Ð»Ñ Ð½Ð°Ð»ÐµÐ¶Ð½Ð¾Ñ— роботи програми Ñлід оновити операційну ÑиÑтему. {{ВерÑÑ–Ñ Ð¿Ð°ÐºÐµÑ‚Ð°: [3], захищена операційною ÑиÑтемою верÑÑ–Ñ: [4]}}" />
539 <String Id="Error1932" Overridable="yes" Value="ІнÑталÑтору Windows не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ файл [2], захищений ÑиÑтемою Windows. {{ВерÑÑ–Ñ Ð¿Ð°ÐºÐµÑ‚Ð°: [3], захищена операційною ÑиÑтемою верÑÑ–Ñ: [4], помилка SFP: [5]}}" /> 539 <String Id="Error1932" Overridable="yes" Value="ІнÑталÑтору Windows не вдалоÑÑŒ оновити файл [2], захищений ÑиÑтемою Windows. {{ВерÑÑ–Ñ Ð¿Ð°ÐºÐµÑ‚Ð°: [3], захищена операційною ÑиÑтемою верÑÑ–Ñ: [4], помилка SFP: [5]}}" />
540 <String Id="Error1933" Overridable="yes" Value="ІнÑталÑтору Windows не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ принаймні один файл, захищений ÑиÑтемою Windows. {{Помилка SFP: [2]. Перелік захищених файлів:\r\n[3]}}" /> 540 <String Id="Error1933" Overridable="yes" Value="ІнÑталÑтору Windows не вдалоÑÑŒ оновити принаймні один файл, захищений ÑиÑтемою Windows. {{Помилка SFP: [2]. Перелік захищених файлів:\r\n[3]}}" />
541 <String Id="Error1934" Overridable="yes" Value="ІнÑталÑції кориÑтувачів заборонено за політикою цього комп’ютера." /> 541 <String Id="Error1934" Overridable="yes" Value="ІнÑталÑції кориÑтувачів заборонено за політикою цього комп’ютера." />
542 <String Id="Error1935" Overridable="yes" Value="Під Ñ‡Ð°Ñ Ñ–Ð½ÑталÑції ÑÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ &quot;[6]&quot; ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¸Ñ… відомоÑтей звернітьÑÑ Ð´Ð¾ довідки та Ñлужби підтримки. HRESULT: [3]. {{Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑкладаннÑ: [4], функціÑ: [5], компонент: [2]}}" /> 542 <String Id="Error1935" Overridable="yes" Value="Під Ñ‡Ð°Ñ Ñ–Ð½ÑталÑції ÑÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ &quot;[6]&quot; ÑталаÑÑŒ помилка. Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¸Ñ… відомоÑтей звернітьÑÑ Ð´Ð¾ довідки та Ñлужби підтримки. HRESULT: [3]. {{Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑкладаннÑ: [4], функціÑ: [5], компонент: [2]}}" />
543 <String Id="Error1936" Overridable="yes" Value="Під Ñ‡Ð°Ñ Ñ–Ð½ÑталÑції ÑÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ &quot;[6]&quot; ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Ð¡ÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ Ð½Ðµ має належного імені або не підпиÑане ключем мінімальної довжини. HRESULT: [3]. {{Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑкладаннÑ: [4], функціÑ: [5], компонент: [2]}}" /> 543 <String Id="Error1936" Overridable="yes" Value="Під Ñ‡Ð°Ñ Ñ–Ð½ÑталÑції ÑÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ &quot;[6]&quot; ÑталаÑÑŒ помилка. Ð¡ÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ Ð½Ðµ має належного імені або не підпиÑане ключем мінімальної довжини. HRESULT: [3]. {{Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑкладаннÑ: [4], функціÑ: [5], компонент: [2]}}" />
544 <String Id="Error1937" Overridable="yes" Value="Під Ñ‡Ð°Ñ Ñ–Ð½ÑталÑції ÑÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ &quot;[6]&quot; ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. ÐŸÑ–Ð´Ð¿Ð¸Ñ Ð°Ð±Ð¾ каталог неприпуÑтимі, чи Ñ—Ñ… не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸. HRESULT: [3]. {{Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑкладаннÑ: [4], функціÑ: [5], компонент: [2]}}" /> 544 <String Id="Error1937" Overridable="yes" Value="Під Ñ‡Ð°Ñ Ñ–Ð½ÑталÑції ÑÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ &quot;[6]&quot; ÑталаÑÑŒ помилка. ÐŸÑ–Ð´Ð¿Ð¸Ñ Ð°Ð±Ð¾ каталог неприпуÑтимі, чи Ñ—Ñ… не вдалоÑÑŒ перевірити. HRESULT: [3]. {{Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑкладаннÑ: [4], функціÑ: [5], компонент: [2]}}" />
545 <String Id="Error1938" Overridable="yes" Value="Під Ñ‡Ð°Ñ Ñ–Ð½ÑталÑції ÑÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ &quot;[6]&quot; ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ принаймні один модуль ÑкладаннÑ. HRESULT: [3]. {{Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑкладаннÑ: [4], функціÑ: [5], компонент: [2]}}" /> 545 <String Id="Error1938" Overridable="yes" Value="Під Ñ‡Ð°Ñ Ñ–Ð½ÑталÑції ÑÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ &quot;[6]&quot; ÑталаÑÑŒ помилка. Ðе вдалоÑÑŒ знайти принаймні один модуль ÑкладаннÑ. HRESULT: [3]. {{Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑкладаннÑ: [4], функціÑ: [5], компонент: [2]}}" />
546 546
547 <String Id="UITextbytes" Overridable="yes" Value="байт" /> 547 <String Id="UITextbytes" Overridable="yes" Value="байт" />
548 <String Id="UITextGB" Overridable="yes" Value="ГБ" /> 548 <String Id="UITextGB" Overridable="yes" Value="ГБ" />
@@ -557,9 +557,9 @@
557 <String Id="UITextMenuLocal" Overridable="yes" Value="Буде інÑтальовано на локальний жорÑткий диÑк" /> 557 <String Id="UITextMenuLocal" Overridable="yes" Value="Буде інÑтальовано на локальний жорÑткий диÑк" />
558 <String Id="UITextMenuNetwork" Overridable="yes" Value="Буде інÑтальовано Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з мережі" /> 558 <String Id="UITextMenuNetwork" Overridable="yes" Value="Буде інÑтальовано Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з мережі" />
559 <String Id="UITextNewFolder" Overridable="yes" Value="Папка|Ðова папка" /> 559 <String Id="UITextNewFolder" Overridable="yes" Value="Папка|Ðова папка" />
560 <String Id="UITextScriptInProgress" Overridable="yes" Value="Триває Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¸Ñ… даних..." /> 560 <String Id="UITextScriptInProgress" Overridable="yes" Value="Триває збір потрібних даних..." />
561 <String Id="UITextSelAbsentAbsent" Overridable="yes" Value="Цей компонент не буде інÑтальовано" /> 561 <String Id="UITextSelAbsentAbsent" Overridable="yes" Value="Цей компонент не буде інÑтальовано" />
562 <String Id="UITextSelAbsentAdvertise" Overridable="yes" Value="Цей компонент буде наÑтроєно Ð´Ð»Ñ Ñ–Ð½ÑталÑції в разі потреби" /> 562 <String Id="UITextSelAbsentAdvertise" Overridable="yes" Value="Цей компонент буде налаштовано Ð´Ð»Ñ Ñ–Ð½ÑталÑції в разі потреби" />
563 <String Id="UITextSelAbsentCD" Overridable="yes" Value="Цей компонент буде інÑтальовано Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з компакт-диÑка" /> 563 <String Id="UITextSelAbsentCD" Overridable="yes" Value="Цей компонент буде інÑтальовано Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з компакт-диÑка" />
564 <String Id="UITextSelAbsentLocal" Overridable="yes" Value="Цей компонент буде інÑтальовано на локальний жорÑткий диÑк" /> 564 <String Id="UITextSelAbsentLocal" Overridable="yes" Value="Цей компонент буде інÑтальовано на локальний жорÑткий диÑк" />
565 <String Id="UITextSelAbsentNetwork" Overridable="yes" Value="Цей компонент буде інÑтальовано Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з мережі" /> 565 <String Id="UITextSelAbsentNetwork" Overridable="yes" Value="Цей компонент буде інÑтальовано Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з мережі" />
@@ -576,7 +576,7 @@
576 <String Id="UITextSelChildCostPos" Overridable="yes" Value="Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ компонента потрібно [1] на жорÑткому диÑку." /> 576 <String Id="UITextSelChildCostPos" Overridable="yes" Value="Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ компонента потрібно [1] на жорÑткому диÑку." />
577 <String Id="UITextSelCostPending" Overridable="yes" Value="Триває обчиÑÐ»ÐµÐ½Ð½Ñ Ð¼Ñ–ÑÑ†Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð°..." /> 577 <String Id="UITextSelCostPending" Overridable="yes" Value="Триває обчиÑÐ»ÐµÐ½Ð½Ñ Ð¼Ñ–ÑÑ†Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð°..." />
578 <String Id="UITextSelLocalAbsent" Overridable="yes" Value="Цей компонент буде повніÑтю видалено" /> 578 <String Id="UITextSelLocalAbsent" Overridable="yes" Value="Цей компонент буде повніÑтю видалено" />
579 <String Id="UITextSelLocalAdvertise" Overridable="yes" Value="Цей компонент буде видалено з локального жорÑткого диÑка, але наÑтроєно Ð´Ð»Ñ Ñ–Ð½ÑталÑції в разі потреби" /> 579 <String Id="UITextSelLocalAdvertise" Overridable="yes" Value="Цей компонент буде видалено з локального жорÑткого диÑка, але налаштовано Ð´Ð»Ñ Ñ–Ð½ÑталÑції в разі потреби" />
580 <String Id="UITextSelLocalCD" Overridable="yes" Value="Компонент буде видалено з локального жорÑткого диÑка, але він залишитьÑÑ Ð´Ð¾Ñтупним Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з компакт-диÑка" /> 580 <String Id="UITextSelLocalCD" Overridable="yes" Value="Компонент буде видалено з локального жорÑткого диÑка, але він залишитьÑÑ Ð´Ð¾Ñтупним Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з компакт-диÑка" />
581 <String Id="UITextSelLocalLocal" Overridable="yes" Value="Цей компонент залишитьÑÑ Ð½Ð° локальному жорÑткому диÑку" /> 581 <String Id="UITextSelLocalLocal" Overridable="yes" Value="Цей компонент залишитьÑÑ Ð½Ð° локальному жорÑткому диÑку" />
582 <String Id="UITextSelLocalNetwork" Overridable="yes" Value="Компонент буде видалено з локального жорÑткого диÑка, але він залишитьÑÑ Ð´Ð¾Ñтупним Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з мережі" /> 582 <String Id="UITextSelLocalNetwork" Overridable="yes" Value="Компонент буде видалено з локального жорÑткого диÑка, але він залишитьÑÑ Ð´Ð¾Ñтупним Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з мережі" />
@@ -585,7 +585,7 @@
585 <String Id="UITextSelNetworkLocal" Overridable="yes" Value="Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ компонента запуÑк із мережі буде замінено на інÑталÑцію на локальний жорÑткий диÑк" /> 585 <String Id="UITextSelNetworkLocal" Overridable="yes" Value="Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ компонента запуÑк із мережі буде замінено на інÑталÑцію на локальний жорÑткий диÑк" />
586 <String Id="UITextSelNetworkNetwork" Overridable="yes" Value="Цей компонент залишитьÑÑ Ð´Ð¾Ñтупний Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з мережі" /> 586 <String Id="UITextSelNetworkNetwork" Overridable="yes" Value="Цей компонент залишитьÑÑ Ð´Ð¾Ñтупний Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з мережі" />
587 <String Id="UITextSelParentCostNegNeg" Overridable="yes" Value="Цей компонент звільнÑÑ” [1] на жорÑткому диÑку. Вибрано [2] з [3] його чаÑтин. Ці чаÑтини звільнÑють [4] на жорÑткому диÑку." /> 587 <String Id="UITextSelParentCostNegNeg" Overridable="yes" Value="Цей компонент звільнÑÑ” [1] на жорÑткому диÑку. Вибрано [2] з [3] його чаÑтин. Ці чаÑтини звільнÑють [4] на жорÑткому диÑку." />
588 <String Id="UITextSelParentCostNegPos" Overridable="yes" Value="Компонент звільнÑÑ” [1] на жорÑткому диÑку. Вибрано [2] з [3] його чаÑтин. Разом вони потребують [4] на жорÑткому диÑку." /> 588 <String Id="UITextSelParentCostNegPos" Overridable="yes" Value="Компонент звільнÑÑ” [1] на жорÑткому диÑку. Обрано [2] з [3] його чаÑтин. Разом вони потребують [4] на жорÑткому диÑку." />
589 <String Id="UITextSelParentCostPosNeg" Overridable="yes" Value="Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ компонента потрібно [1] на жорÑткому диÑку. Вибрано [2] з [3] його чаÑтин. Разом вони звільнÑть [4] на жорÑткому диÑку." /> 589 <String Id="UITextSelParentCostPosNeg" Overridable="yes" Value="Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ компонента потрібно [1] на жорÑткому диÑку. Вибрано [2] з [3] його чаÑтин. Разом вони звільнÑть [4] на жорÑткому диÑку." />
590 <String Id="UITextSelParentCostPosPos" Overridable="yes" Value="Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ компонента потрібно [1] на жорÑткому диÑку. Вибрано [2] з [3] його чаÑтин. Разом вони потребують [4] на жорÑткому диÑку." /> 590 <String Id="UITextSelParentCostPosPos" Overridable="yes" Value="Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ компонента потрібно [1] на жорÑткому диÑку. Вибрано [2] з [3] його чаÑтин. Разом вони потребують [4] на жорÑткому диÑку." />
591 <String Id="UITextTimeRemaining" Overridable="yes" Value="ЗалишилоÑÑŒ чаÑу: {[1] хв. }{[2] Ñек.}" /> 591 <String Id="UITextTimeRemaining" Overridable="yes" Value="ЗалишилоÑÑŒ чаÑу: {[1] хв. }{[2] Ñек.}" />
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h b/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h
index 45e4fc51..14e20c0d 100644
--- a/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h
+++ b/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h
@@ -567,6 +567,19 @@ void DAPI ThemeInitializeWindowClass(
567 ); 567 );
568 568
569/******************************************************************** 569/********************************************************************
570 ThemeInitializeWindowClassEx - sets defaults for the window class
571 from the given theme.
572
573*******************************************************************/
574void DAPI ThemeInitializeWindowClassEx(
575 __in THEME* pTheme,
576 __in WNDCLASSEXW* pWndClass,
577 __in WNDPROC pfnWndProc,
578 __in HINSTANCE hInstance,
579 __in LPCWSTR wzClassName
580 );
581
582/********************************************************************
570 ThemeCreateParentWindow - creates a parent window for the theme. 583 ThemeCreateParentWindow - creates a parent window for the theme.
571 584
572*******************************************************************/ 585*******************************************************************/
diff --git a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp
index a7a7e45b..4482c96e 100644
--- a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp
+++ b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp
@@ -856,6 +856,28 @@ DAPI_(void) ThemeInitializeWindowClass(
856} 856}
857 857
858 858
859DAPI_(void) ThemeInitializeWindowClassEx(
860 __in THEME* pTheme,
861 __in WNDCLASSEXW* pWndClass,
862 __in WNDPROC pfnWndProc,
863 __in HINSTANCE hInstance,
864 __in LPCWSTR wzClassName
865 )
866{
867 pWndClass->cbSize = sizeof(WNDCLASSEXW);
868 pWndClass->style = CS_HREDRAW | CS_VREDRAW;
869 pWndClass->cbWndExtra = DLGWINDOWEXTRA;
870 pWndClass->hCursor = ::LoadCursorW(NULL, (LPCWSTR)IDC_ARROW);
871
872 pWndClass->lpfnWndProc = pfnWndProc;
873 pWndClass->hInstance = hInstance;
874 pWndClass->lpszClassName = wzClassName;
875
876 pWndClass->hIcon = reinterpret_cast<HICON>(pTheme->hIcon);
877 pWndClass->hbrBackground = pTheme->rgFonts[pTheme->dwFontId].hBackground;
878}
879
880
859DAPI_(HRESULT) ThemeCreateParentWindow( 881DAPI_(HRESULT) ThemeCreateParentWindow(
860 __in THEME* pTheme, 882 __in THEME* pTheme,
861 __in DWORD dwExStyle, 883 __in DWORD dwExStyle,
diff --git a/src/test/burn/TestData/FilesInUseTests/WixStdBaBundle/WixStdBaBundle.wixproj b/src/test/burn/TestData/FilesInUseTests/WixStdBaBundle/WixStdBaBundle.wixproj
index 1d3d6f17..01b2401d 100644
--- a/src/test/burn/TestData/FilesInUseTests/WixStdBaBundle/WixStdBaBundle.wixproj
+++ b/src/test/burn/TestData/FilesInUseTests/WixStdBaBundle/WixStdBaBundle.wixproj
@@ -7,6 +7,7 @@
7 </PropertyGroup> 7 </PropertyGroup>
8 <ItemGroup> 8 <ItemGroup>
9 <Compile Include="..\..\WixStdBaTests\BundleA\Bundle.wxs" Link="Bundle.wxs" /> 9 <Compile Include="..\..\WixStdBaTests\BundleA\Bundle.wxs" Link="Bundle.wxs" />
10 <BindPath Include="..\..\WixStdBaTests\BundleA" />
10 </ItemGroup> 11 </ItemGroup>
11 <ItemGroup> 12 <ItemGroup>
12 <ProjectReference Include="..\PackageA\PackageA.wixproj" /> 13 <ProjectReference Include="..\PackageA\PackageA.wixproj" />
diff --git a/src/test/burn/TestData/WixStdBaTests/BundleA/Bundle.wxs b/src/test/burn/TestData/WixStdBaTests/BundleA/Bundle.wxs
index 34071cad..78bda768 100644
--- a/src/test/burn/TestData/WixStdBaTests/BundleA/Bundle.wxs
+++ b/src/test/burn/TestData/WixStdBaTests/BundleA/Bundle.wxs
@@ -1,7 +1,8 @@
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. --> 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 2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"> 3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 <Bundle Name="~$(var.TestGroupName) - $(var.BundleName)" Version="$(var.TestVersion)" UpgradeCode="$(var.UpgradeCode)" Compressed="yes" bal:CommandLineVariables="caseSensitive"> 4 <Bundle Name="~$(var.TestGroupName) - $(var.BundleName)" Version="$(var.TestVersion)" UpgradeCode="$(var.UpgradeCode)"
5 IconSourceFile="test.ico" Compressed="yes" bal:CommandLineVariables="caseSensitive">
5 <Log Prefix="~$(var.TestGroupName)_$(var.BundleName)" /> 6 <Log Prefix="~$(var.TestGroupName)_$(var.BundleName)" />
6 7
7 <?ifndef UpdateFeed ?> 8 <?ifndef UpdateFeed ?>
diff --git a/src/test/burn/TestData/WixStdBaTests/BundleA/test.ico b/src/test/burn/TestData/WixStdBaTests/BundleA/test.ico
new file mode 100644
index 00000000..906ce324
--- /dev/null
+++ b/src/test/burn/TestData/WixStdBaTests/BundleA/test.ico
Binary files differ
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/InstallUninstallNET3WithoutPartitions.wixproj b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/InstallUninstallNET3WithoutPartitions.wixproj
index eb01e716..ce25922b 100644
--- a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/InstallUninstallNET3WithoutPartitions.wixproj
+++ b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/InstallUninstallNET3WithoutPartitions.wixproj
@@ -7,6 +7,7 @@
7 </PropertyGroup> 7 </PropertyGroup>
8 <ItemGroup> 8 <ItemGroup>
9 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 9 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
10 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
10 <ProjectReference Include="..\Components\TestComponentNET3\TestComponentNET3.csproj" /> 11 <ProjectReference Include="..\Components\TestComponentNET3\TestComponentNET3.csproj" />
11 </ItemGroup> 12 </ItemGroup>
12 <ItemGroup> 13 <ItemGroup>
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/InstallUninstallNET4WithoutPartitions.wixproj b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/InstallUninstallNET4WithoutPartitions.wixproj
index 629bda1f..164071c3 100644
--- a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/InstallUninstallNET4WithoutPartitions.wixproj
+++ b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/InstallUninstallNET4WithoutPartitions.wixproj
@@ -7,6 +7,7 @@
7 </PropertyGroup> 7 </PropertyGroup>
8 <ItemGroup> 8 <ItemGroup>
9 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 9 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
10 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
10 <ProjectReference Include="..\Components\TestComponentNET4\TestComponentNET4.csproj" /> 11 <ProjectReference Include="..\Components\TestComponentNET4\TestComponentNET4.csproj" />
11 </ItemGroup> 12 </ItemGroup>
12 <ItemGroup> 13 <ItemGroup>
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/InstallUninstallNativeWithoutPartitions.wixproj b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/InstallUninstallNativeWithoutPartitions.wixproj
index 35bfd38d..8b84e27e 100644
--- a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/InstallUninstallNativeWithoutPartitions.wixproj
+++ b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/InstallUninstallNativeWithoutPartitions.wixproj
@@ -7,6 +7,7 @@
7 </PropertyGroup> 7 </PropertyGroup>
8 <ItemGroup> 8 <ItemGroup>
9 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 9 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
10 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
10 <ProjectReference Include="..\Components\TestComponentNative\TestComponentNative.vcxproj" /> 11 <ProjectReference Include="..\Components\TestComponentNative\TestComponentNative.vcxproj" />
11 </ItemGroup> 12 </ItemGroup>
12 <ItemGroup> 13 <ItemGroup>
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/InstallUninstallWithPartitions.wixproj b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/InstallUninstallWithPartitions.wixproj
index 35bfd38d..8b84e27e 100644
--- a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/InstallUninstallWithPartitions.wixproj
+++ b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/InstallUninstallWithPartitions.wixproj
@@ -7,6 +7,7 @@
7 </PropertyGroup> 7 </PropertyGroup>
8 <ItemGroup> 8 <ItemGroup>
9 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 9 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
10 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
10 <ProjectReference Include="..\Components\TestComponentNative\TestComponentNative.vcxproj" /> 11 <ProjectReference Include="..\Components\TestComponentNative\TestComponentNative.vcxproj" />
11 </ItemGroup> 12 </ItemGroup>
12 <ItemGroup> 13 <ItemGroup>
diff --git a/src/test/msi/TestData/CustomActionFail/CustomActionFail.csproj b/src/test/msi/TestData/CustomActionFail/CustomActionFail.csproj
new file mode 100644
index 00000000..3db8bd21
--- /dev/null
+++ b/src/test/msi/TestData/CustomActionFail/CustomActionFail.csproj
@@ -0,0 +1,9 @@
1<Project Sdk="Microsoft.NET.Sdk">
2
3 <PropertyGroup>
4 <OutputType>Exe</OutputType>
5 <TargetFramework>net48</TargetFramework>
6 <LangVersion>9.0</LangVersion>
7 </PropertyGroup>
8
9</Project>
diff --git a/src/test/msi/TestData/CustomActionFail/Program.cs b/src/test/msi/TestData/CustomActionFail/Program.cs
new file mode 100644
index 00000000..f2f00a8a
--- /dev/null
+++ b/src/test/msi/TestData/CustomActionFail/Program.cs
@@ -0,0 +1 @@
return -1;
diff --git a/src/test/msi/TestData/FirewallExtensionTests/DynamicFirewallRules/DynamicFirewallRules.wixproj b/src/test/msi/TestData/FirewallExtensionTests/DynamicFirewallRules/DynamicFirewallRules.wixproj
index b39f7387..3b9205f6 100644
--- a/src/test/msi/TestData/FirewallExtensionTests/DynamicFirewallRules/DynamicFirewallRules.wixproj
+++ b/src/test/msi/TestData/FirewallExtensionTests/DynamicFirewallRules/DynamicFirewallRules.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Firewall.wixext" /> 12 <PackageReference Include="WixToolset.Firewall.wixext" />
diff --git a/src/test/msi/TestData/FirewallExtensionTests/FirewallRules/FirewallRules.wixproj b/src/test/msi/TestData/FirewallExtensionTests/FirewallRules/FirewallRules.wixproj
index b1770b0f..94fb85e4 100644
--- a/src/test/msi/TestData/FirewallExtensionTests/FirewallRules/FirewallRules.wixproj
+++ b/src/test/msi/TestData/FirewallExtensionTests/FirewallRules/FirewallRules.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Firewall.wixext" /> 12 <PackageReference Include="WixToolset.Firewall.wixext" />
diff --git a/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesInterfaces/FirewallRulesInterfaces.wixproj b/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesInterfaces/FirewallRulesInterfaces.wixproj
index 3c6ef5cf..2f492a72 100644
--- a/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesInterfaces/FirewallRulesInterfaces.wixproj
+++ b/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesInterfaces/FirewallRulesInterfaces.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Firewall.wixext" /> 12 <PackageReference Include="WixToolset.Firewall.wixext" />
diff --git a/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesProperties/FirewallRulesProperties.wixproj b/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesProperties/FirewallRulesProperties.wixproj
index 38d94265..046dc6ec 100644
--- a/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesProperties/FirewallRulesProperties.wixproj
+++ b/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesProperties/FirewallRulesProperties.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Firewall.wixext" /> 12 <PackageReference Include="WixToolset.Firewall.wixext" />
diff --git a/src/test/msi/TestData/FirewallExtensionTests/IgnoreFailedFirewallRules/IgnoreFailedFirewallRules.wixproj b/src/test/msi/TestData/FirewallExtensionTests/IgnoreFailedFirewallRules/IgnoreFailedFirewallRules.wixproj
index b1770b0f..94fb85e4 100644
--- a/src/test/msi/TestData/FirewallExtensionTests/IgnoreFailedFirewallRules/IgnoreFailedFirewallRules.wixproj
+++ b/src/test/msi/TestData/FirewallExtensionTests/IgnoreFailedFirewallRules/IgnoreFailedFirewallRules.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Firewall.wixext" /> 12 <PackageReference Include="WixToolset.Firewall.wixext" />
diff --git a/src/test/msi/TestData/FirewallExtensionTests/NestedService/NestedService.wixproj b/src/test/msi/TestData/FirewallExtensionTests/NestedService/NestedService.wixproj
index 4a9c9dbd..c6d041c6 100644
--- a/src/test/msi/TestData/FirewallExtensionTests/NestedService/NestedService.wixproj
+++ b/src/test/msi/TestData/FirewallExtensionTests/NestedService/NestedService.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Firewall.wixext" /> 12 <PackageReference Include="WixToolset.Firewall.wixext" />
diff --git a/src/test/msi/TestData/FirewallExtensionTests/ProtocolRules/ProtocolRules.wixproj b/src/test/msi/TestData/FirewallExtensionTests/ProtocolRules/ProtocolRules.wixproj
index b1770b0f..94fb85e4 100644
--- a/src/test/msi/TestData/FirewallExtensionTests/ProtocolRules/ProtocolRules.wixproj
+++ b/src/test/msi/TestData/FirewallExtensionTests/ProtocolRules/ProtocolRules.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Firewall.wixext" /> 12 <PackageReference Include="WixToolset.Firewall.wixext" />
diff --git a/src/test/msi/TestData/FirewallExtensionTests/ScopeRules/ScopeRules.wixproj b/src/test/msi/TestData/FirewallExtensionTests/ScopeRules/ScopeRules.wixproj
index b1770b0f..94fb85e4 100644
--- a/src/test/msi/TestData/FirewallExtensionTests/ScopeRules/ScopeRules.wixproj
+++ b/src/test/msi/TestData/FirewallExtensionTests/ScopeRules/ScopeRules.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Firewall.wixext" /> 12 <PackageReference Include="WixToolset.Firewall.wixext" />
diff --git a/src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/MsmqInstall.wixproj b/src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/MsmqInstall.wixproj
index 41e39944..b75046c9 100644
--- a/src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/MsmqInstall.wixproj
+++ b/src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/MsmqInstall.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Msmq.wixext" /> 12 <PackageReference Include="WixToolset.Msmq.wixext" />
diff --git a/src/test/msi/TestData/RemoveFolderExTests/RemoveFolderExTest/RemoveFolderExTest.wixproj b/src/test/msi/TestData/RemoveFolderExTests/RemoveFolderExTest/RemoveFolderExTest.wixproj
index 1c71388a..f02f82f4 100644
--- a/src/test/msi/TestData/RemoveFolderExTests/RemoveFolderExTest/RemoveFolderExTest.wixproj
+++ b/src/test/msi/TestData/RemoveFolderExTests/RemoveFolderExTest/RemoveFolderExTest.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/Templates/CustomActionFail.exe b/src/test/msi/TestData/Templates/CustomActionFail.exe
deleted file mode 100644
index cceffe91..00000000
--- a/src/test/msi/TestData/Templates/CustomActionFail.exe
+++ /dev/null
Binary files differ
diff --git a/src/test/msi/TestData/Templates/Product.wxs b/src/test/msi/TestData/Templates/Product.wxs
index 8fb90fed..a9edab87 100644
--- a/src/test/msi/TestData/Templates/Product.wxs
+++ b/src/test/msi/TestData/Templates/Product.wxs
@@ -39,7 +39,7 @@
39 39
40 <Fragment> 40 <Fragment>
41 <Component Id="FileComponent" Guid="12345678-9ABC-DEF0-1234-567890000000" Directory="INSTALLFOLDER"> 41 <Component Id="FileComponent" Guid="12345678-9ABC-DEF0-1234-567890000000" Directory="INSTALLFOLDER">
42 <File Id="CAFile" Name="CustomActionFail.exe" Source="$(sys.SOURCEFILEDIR)\CustomActionFail.exe" /> 42 <File Id="CAFile" Source="CustomActionFail.exe" />
43 </Component> 43 </Component>
44 44
45 <CustomAction Id="CaFail" FileRef="CAFile" Execute="immediate" Return="check" ExeCommand="" /> 45 <CustomAction Id="CaFail" FileRef="CAFile" Execute="immediate" Return="check" ExeCommand="" />
diff --git a/src/test/msi/TestData/UIExtensionTests/LocalizedWixUI/LocalizedWixUI.wixproj b/src/test/msi/TestData/UIExtensionTests/LocalizedWixUI/LocalizedWixUI.wixproj
index cb8f31bb..b8a95efe 100644
--- a/src/test/msi/TestData/UIExtensionTests/LocalizedWixUI/LocalizedWixUI.wixproj
+++ b/src/test/msi/TestData/UIExtensionTests/LocalizedWixUI/LocalizedWixUI.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.UI.wixext" /> 12 <PackageReference Include="WixToolset.UI.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionGroupTests/ProductA/ProductA.wixproj b/src/test/msi/TestData/UtilExtensionGroupTests/ProductA/ProductA.wixproj
index 3895b853..96c29c60 100644
--- a/src/test/msi/TestData/UtilExtensionGroupTests/ProductA/ProductA.wixproj
+++ b/src/test/msi/TestData/UtilExtensionGroupTests/ProductA/ProductA.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionGroupTests/ProductAddCommentToExistingGroup/ProductAddCommentToExistingGroup.wixproj b/src/test/msi/TestData/UtilExtensionGroupTests/ProductAddCommentToExistingGroup/ProductAddCommentToExistingGroup.wixproj
index 5938e525..21bfc1c6 100644
--- a/src/test/msi/TestData/UtilExtensionGroupTests/ProductAddCommentToExistingGroup/ProductAddCommentToExistingGroup.wixproj
+++ b/src/test/msi/TestData/UtilExtensionGroupTests/ProductAddCommentToExistingGroup/ProductAddCommentToExistingGroup.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionGroupTests/ProductCommentDelete/ProductCommentDelete.wixproj b/src/test/msi/TestData/UtilExtensionGroupTests/ProductCommentDelete/ProductCommentDelete.wixproj
index 63bb2370..cc06e0b2 100644
--- a/src/test/msi/TestData/UtilExtensionGroupTests/ProductCommentDelete/ProductCommentDelete.wixproj
+++ b/src/test/msi/TestData/UtilExtensionGroupTests/ProductCommentDelete/ProductCommentDelete.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionGroupTests/ProductCommentFail/ProductCommentFail.wixproj b/src/test/msi/TestData/UtilExtensionGroupTests/ProductCommentFail/ProductCommentFail.wixproj
index 66f308ae..b83b65e5 100644
--- a/src/test/msi/TestData/UtilExtensionGroupTests/ProductCommentFail/ProductCommentFail.wixproj
+++ b/src/test/msi/TestData/UtilExtensionGroupTests/ProductCommentFail/ProductCommentFail.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionGroupTests/ProductFail/ProductFail.wixproj b/src/test/msi/TestData/UtilExtensionGroupTests/ProductFail/ProductFail.wixproj
index e2fe3aa8..ae630e84 100644
--- a/src/test/msi/TestData/UtilExtensionGroupTests/ProductFail/ProductFail.wixproj
+++ b/src/test/msi/TestData/UtilExtensionGroupTests/ProductFail/ProductFail.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionGroupTests/ProductFailIfExists/ProductFailIfExists.wixproj b/src/test/msi/TestData/UtilExtensionGroupTests/ProductFailIfExists/ProductFailIfExists.wixproj
index 9e1a836f..779d8f67 100644
--- a/src/test/msi/TestData/UtilExtensionGroupTests/ProductFailIfExists/ProductFailIfExists.wixproj
+++ b/src/test/msi/TestData/UtilExtensionGroupTests/ProductFailIfExists/ProductFailIfExists.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionGroupTests/ProductNestedGroups/ProductNestedGroups.wixproj b/src/test/msi/TestData/UtilExtensionGroupTests/ProductNestedGroups/ProductNestedGroups.wixproj
index 3b2e3942..f49f3bfe 100644
--- a/src/test/msi/TestData/UtilExtensionGroupTests/ProductNestedGroups/ProductNestedGroups.wixproj
+++ b/src/test/msi/TestData/UtilExtensionGroupTests/ProductNestedGroups/ProductNestedGroups.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionGroupTests/ProductNewGroupWithComment/ProductNewGroupWithComment.wixproj b/src/test/msi/TestData/UtilExtensionGroupTests/ProductNewGroupWithComment/ProductNewGroupWithComment.wixproj
index aeac903a..2a050fd2 100644
--- a/src/test/msi/TestData/UtilExtensionGroupTests/ProductNewGroupWithComment/ProductNewGroupWithComment.wixproj
+++ b/src/test/msi/TestData/UtilExtensionGroupTests/ProductNewGroupWithComment/ProductNewGroupWithComment.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionGroupTests/ProductNonVitalGroup/ProductNonVitalUserGroup.wixproj b/src/test/msi/TestData/UtilExtensionGroupTests/ProductNonVitalGroup/ProductNonVitalUserGroup.wixproj
index 8734224d..92e46dd3 100644
--- a/src/test/msi/TestData/UtilExtensionGroupTests/ProductNonVitalGroup/ProductNonVitalUserGroup.wixproj
+++ b/src/test/msi/TestData/UtilExtensionGroupTests/ProductNonVitalGroup/ProductNonVitalUserGroup.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionGroupTests/ProductRestrictedDomain/ProductRestrictedDomain.wixproj b/src/test/msi/TestData/UtilExtensionGroupTests/ProductRestrictedDomain/ProductRestrictedDomain.wixproj
index e4a01a3a..c6b80835 100644
--- a/src/test/msi/TestData/UtilExtensionGroupTests/ProductRestrictedDomain/ProductRestrictedDomain.wixproj
+++ b/src/test/msi/TestData/UtilExtensionGroupTests/ProductRestrictedDomain/ProductRestrictedDomain.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionGroupTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj b/src/test/msi/TestData/UtilExtensionGroupTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj
index 93a56216..e8fe0593 100644
--- a/src/test/msi/TestData/UtilExtensionGroupTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj
+++ b/src/test/msi/TestData/UtilExtensionGroupTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductA/ProductA.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductA/ProductA.wixproj
index 3895b853..96c29c60 100644
--- a/src/test/msi/TestData/UtilExtensionUserTests/ProductA/ProductA.wixproj
+++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductA/ProductA.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/ProductAddCommentToExistingUser.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/ProductAddCommentToExistingUser.wixproj
index 5938e525..21bfc1c6 100644
--- a/src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/ProductAddCommentToExistingUser.wixproj
+++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/ProductAddCommentToExistingUser.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/ProductCommentDelete.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/ProductCommentDelete.wixproj
index 63bb2370..cc06e0b2 100644
--- a/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/ProductCommentDelete.wixproj
+++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/ProductCommentDelete.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/ProductCommentFail.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/ProductCommentFail.wixproj
index 66f308ae..b83b65e5 100644
--- a/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/ProductCommentFail.wixproj
+++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/ProductCommentFail.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductFail/ProductFail.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductFail/ProductFail.wixproj
index e2fe3aa8..ae630e84 100644
--- a/src/test/msi/TestData/UtilExtensionUserTests/ProductFail/ProductFail.wixproj
+++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductFail/ProductFail.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductFailIfExists/ProductFailIfExists.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductFailIfExists/ProductFailIfExists.wixproj
index 9e1a836f..779d8f67 100644
--- a/src/test/msi/TestData/UtilExtensionUserTests/ProductFailIfExists/ProductFailIfExists.wixproj
+++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductFailIfExists/ProductFailIfExists.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/ProductNewUserWithComment.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/ProductNewUserWithComment.wixproj
index aeac903a..4a681f82 100644
--- a/src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/ProductNewUserWithComment.wixproj
+++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/ProductNewUserWithComment.wixproj
@@ -6,7 +6,8 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 </ItemGroup> 9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
10</ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
12 </ItemGroup> 13 </ItemGroup>
diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductNonVitalUserGroup/ProductNonVitalUserGroup.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductNonVitalUserGroup/ProductNonVitalUserGroup.wixproj
index 8734224d..92e46dd3 100644
--- a/src/test/msi/TestData/UtilExtensionUserTests/ProductNonVitalUserGroup/ProductNonVitalUserGroup.wixproj
+++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductNonVitalUserGroup/ProductNonVitalUserGroup.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductRestrictedDomain/ProductRestrictedDomain.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductRestrictedDomain/ProductRestrictedDomain.wixproj
index e4a01a3a..c6b80835 100644
--- a/src/test/msi/TestData/UtilExtensionUserTests/ProductRestrictedDomain/ProductRestrictedDomain.wixproj
+++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductRestrictedDomain/ProductRestrictedDomain.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj
index 93a56216..e8fe0593 100644
--- a/src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj
+++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj
@@ -6,6 +6,7 @@
6 </PropertyGroup> 6 </PropertyGroup>
7 <ItemGroup> 7 <ItemGroup>
8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" /> 8 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 <ProjectReference Include="..\..\CustomActionFail\CustomActionFail.csproj" />
9 </ItemGroup> 10 </ItemGroup>
10 <ItemGroup> 11 <ItemGroup>
11 <PackageReference Include="WixToolset.Util.wixext" /> 12 <PackageReference Include="WixToolset.Util.wixext" />
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs
index f2d70f2b..1665ced3 100644
--- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs
+++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs
@@ -62,7 +62,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind
62 62
63 private void AddSectionToData() 63 private void AddSectionToData()
64 { 64 {
65 var cellsByTableAndRowId = new Dictionary<string, List<WixCustomTableCellSymbol>>(); 65 var directoryRowsById = new Dictionary<string, Row>(StringComparer.Ordinal);
66 var cellsByTableAndRowId = new Dictionary<string, List<WixCustomTableCellSymbol>>(StringComparer.Ordinal);
66 67
67 foreach (var symbol in this.Section.Symbols) 68 foreach (var symbol in this.Section.Symbols)
68 { 69 {
@@ -107,7 +108,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
107 break; 108 break;
108 109
109 case SymbolDefinitionType.Directory: 110 case SymbolDefinitionType.Directory:
110 this.AddDirectorySymbol((DirectorySymbol)symbol); 111 this.AddDirectorySymbol((DirectorySymbol)symbol, directoryRowsById);
111 break; 112 break;
112 113
113 case SymbolDefinitionType.DuplicateFile: 114 case SymbolDefinitionType.DuplicateFile:
@@ -497,9 +498,9 @@ namespace WixToolset.Core.WindowsInstaller.Bind
497 this.Data.EnsureTable(this.TableDefinitions["ListBox"]); 498 this.Data.EnsureTable(this.TableDefinitions["ListBox"]);
498 } 499 }
499 500
500 private void AddDirectorySymbol(DirectorySymbol symbol) 501 private void AddDirectorySymbol(DirectorySymbol symbol, Dictionary<string, Row> directoryRowsById)
501 { 502 {
502 (var name, var parentDir) = this.AddDirectorySubdirectories(symbol); 503 (var name, var parentDir) = this.AddDirectorySubdirectories(symbol, directoryRowsById);
503 504
504 var shortName = symbol.ShortName; 505 var shortName = symbol.ShortName;
505 var sourceShortname = symbol.SourceShortName; 506 var sourceShortname = symbol.SourceShortName;
@@ -524,10 +525,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
524 525
525 var defaultDir = String.IsNullOrEmpty(sourceName) || sourceName == targetName ? targetName : targetName + ":" + sourceName; 526 var defaultDir = String.IsNullOrEmpty(sourceName) || sourceName == targetName ? targetName : targetName + ":" + sourceName;
526 527
527 var row = this.CreateRow(symbol, "Directory"); 528 this.CreateOrAddDirectoryRow(directoryRowsById, symbol, symbol.Id.Id, parentDir, defaultDir);
528 row[0] = symbol.Id.Id;
529 row[1] = parentDir;
530 row[2] = defaultDir;
531 529
532 if (OutputType.Module == this.Data.Type) 530 if (OutputType.Module == this.Data.Type)
533 { 531 {
@@ -1146,7 +1144,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1146 } 1144 }
1147 else 1145 else
1148 { 1146 {
1149 var after = (null == symbol.Before); 1147 var after = null == symbol.Before;
1150 row[2] = after ? symbol.After : symbol.Before; 1148 row[2] = after ? symbol.After : symbol.Before;
1151 row[3] = after ? 1 : 0; 1149 row[3] = after ? 1 : 0;
1152 } 1150 }
@@ -1271,7 +1269,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1271 } 1269 }
1272 } 1270 }
1273 1271
1274 private void AddWixPackageSymbol(WixPackageSymbol symbol) 1272 private void AddWixPackageSymbol(WixPackageSymbol _)
1275 { 1273 {
1276 // TODO: Remove the following from the compiler and do it here instead. 1274 // TODO: Remove the following from the compiler and do it here instead.
1277 //this.AddProperty(sourceLineNumbers, new Identifier(AccessModifier.Global, "Manufacturer"), manufacturer, false, false, false, true); 1275 //this.AddProperty(sourceLineNumbers, new Identifier(AccessModifier.Global, "Manufacturer"), manufacturer, false, false, false, true);
@@ -1319,11 +1317,10 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1319 } 1317 }
1320 } 1318 }
1321 1319
1322 private (string, string) AddDirectorySubdirectories(DirectorySymbol symbol) 1320 private (string, string) AddDirectorySubdirectories(DirectorySymbol symbol, Dictionary<string, Row> directoryRowsById)
1323 { 1321 {
1324 var directory = symbol.Name.Trim(PathSeparatorChars); 1322 var directory = symbol.Name.Trim(PathSeparatorChars);
1325 var parentDir = symbol.ParentDirectoryRef ?? (symbol.Id.Id == "TARGETDIR" ? null : "TARGETDIR"); 1323 var parentDir = symbol.ParentDirectoryRef ?? (symbol.Id.Id == "TARGETDIR" ? null : "TARGETDIR");
1326 var directoryRows = this.Data.TryGetTable("Directory", out var table) ? table.Rows.ToDictionary(row => row.FieldAsString(0)) : new Dictionary<string, Row>();
1327 1324
1328 var start = 0; 1325 var start = 0;
1329 var end = directory.IndexOfAny(PathSeparatorChars); 1326 var end = directory.IndexOfAny(PathSeparatorChars);
@@ -1337,18 +1334,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1337 { 1334 {
1338 path = Path.Combine(path, subdirectoryName); 1335 path = Path.Combine(path, subdirectoryName);
1339 1336
1340 var id = this.BackendHelper.GenerateIdentifier("d", symbol.ParentDirectoryRef, path); 1337 var id = this.BackendHelper.GenerateIdentifier("d", symbol.ParentDirectoryRef, path, /*shortName:*/ null, /*sourceName:*/ null, /*shortSourceName:*/ null);
1341 var shortnameSubdirectory = this.BackendHelper.IsValidShortFilename(subdirectoryName, false) ? null : this.CreateShortName(subdirectoryName, false, "Directory", symbol.ParentDirectoryRef); 1338 var shortnameSubdirectory = this.BackendHelper.IsValidShortFilename(subdirectoryName, false) ? null : this.CreateShortName(subdirectoryName, false, "Directory", symbol.ParentDirectoryRef);
1339 var defaultDir = CreateMsiFilename(shortnameSubdirectory, subdirectoryName);
1342 1340
1343 if (!directoryRows.ContainsKey(id)) 1341 this.CreateOrAddDirectoryRow(directoryRowsById, symbol, id, parentDir, defaultDir);
1344 {
1345 var subdirectoryRow = this.CreateRow(symbol, "Directory");
1346 subdirectoryRow[0] = id;
1347 subdirectoryRow[1] = parentDir;
1348 subdirectoryRow[2] = CreateMsiFilename(shortnameSubdirectory, subdirectoryName);
1349
1350 directoryRows.Add(id, subdirectoryRow);
1351 }
1352 1342
1353 parentDir = id; 1343 parentDir = id;
1354 } 1344 }
@@ -1362,6 +1352,25 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1362 return (name, parentDir); 1352 return (name, parentDir);
1363 } 1353 }
1364 1354
1355 private Row CreateOrAddDirectoryRow(Dictionary<string, Row> directoryRowsById, DirectorySymbol symbol, string id, string parentDir, string defaultDir)
1356 {
1357 if (!directoryRowsById.TryGetValue(id, out var directoryRow))
1358 {
1359 directoryRow = this.CreateRow(symbol, "Directory");
1360 directoryRow[0] = id;
1361 directoryRow[1] = parentDir;
1362 directoryRow[2] = defaultDir;
1363
1364 directoryRowsById.Add(id, directoryRow);
1365 }
1366 else if (directoryRow.FieldAsString(1) != parentDir || directoryRow.FieldAsString(2) != defaultDir)
1367 {
1368 throw new WixException(WindowsInstallerBackendErrors.UnexpectedAnonymousDirectoryCollision(symbol.SourceLineNumbers, symbol.Id.Id, parentDir, defaultDir, directoryRow.SourceLineNumbers, directoryRow.FieldAsString(1), directoryRow.FieldAsString(2)));
1369 }
1370
1371 return directoryRow;
1372 }
1373
1365 private void EnsureRequiredTables() 1374 private void EnsureRequiredTables()
1366 { 1375 {
1367 // check for missing table and add them or display an error as appropriate 1376 // check for missing table and add them or display an error as appropriate
@@ -1412,7 +1421,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1412 "Upgrade" == table.Name || 1421 "Upgrade" == table.Name ||
1413 "WixMerge" == table.Name) 1422 "WixMerge" == table.Name)
1414 { 1423 {
1415 foreach (Row row in table.Rows) 1424 foreach (var row in table.Rows)
1416 { 1425 {
1417 this.Messaging.Write(ErrorMessages.UnexpectedTableInMergeModule(row.SourceLineNumbers, table.Name)); 1426 this.Messaging.Write(ErrorMessages.UnexpectedTableInMergeModule(row.SourceLineNumbers, table.Name));
1418 } 1427 }
@@ -1609,8 +1618,10 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1609 longName = longName.ToLowerInvariant(); 1618 longName = longName.ToLowerInvariant();
1610 1619
1611 // collect all the data 1620 // collect all the data
1612 var strings = new List<string>(1 + args.Length); 1621 var strings = new List<string>(1 + args.Length)
1613 strings.Add(longName); 1622 {
1623 longName
1624 };
1614 strings.AddRange(args); 1625 strings.AddRange(args);
1615 1626
1616 // prepare for hashing 1627 // prepare for hashing
@@ -1625,8 +1636,10 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1625 } 1636 }
1626 1637
1627 // generate the short file/directory name without an extension 1638 // generate the short file/directory name without an extension
1628 var shortName = new StringBuilder(Convert.ToBase64String(hash)); 1639 var shortName = new StringBuilder(Convert.ToBase64String(hash))
1629 shortName.Length = 8; 1640 {
1641 Length = 8
1642 };
1630 shortName.Replace('+', '-').Replace('/', '_'); 1643 shortName.Replace('+', '-').Replace('/', '_');
1631 1644
1632 if (keepExtension) 1645 if (keepExtension)
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/WindowsInstallerBackendErrors.cs b/src/wix/WixToolset.Core.WindowsInstaller/WindowsInstallerBackendErrors.cs
index 756bb5e4..0935d964 100644
--- a/src/wix/WixToolset.Core.WindowsInstaller/WindowsInstallerBackendErrors.cs
+++ b/src/wix/WixToolset.Core.WindowsInstaller/WindowsInstallerBackendErrors.cs
@@ -39,6 +39,11 @@ namespace WixToolset.Core.WindowsInstaller
39 return Message(null, Ids.InvalidWindowsInstallerWixpdbForValidation, "The validation .wixpdb file: {0} was not from a Windows Installer database build (.msi or .msm). Verify that the output type was actually an MSI Package or Merge Module.", wixpdbPath); 39 return Message(null, Ids.InvalidWindowsInstallerWixpdbForValidation, "The validation .wixpdb file: {0} was not from a Windows Installer database build (.msi or .msm). Verify that the output type was actually an MSI Package or Merge Module.", wixpdbPath);
40 } 40 }
41 41
42 public static Message UnexpectedAnonymousDirectoryCollision(SourceLineNumber sourceLineNumbers, string id, string parentDir, string defaultDir, SourceLineNumber existingSourceLineNumbers, string existingParentDir, string existingDefaultDir)
43 {
44 return Message(sourceLineNumbers, Ids.UnexpectedAnonymousDirectoryCollision, "This should not happen. The first directory id '{0}' uses parent directory '{1}' with DefaultDir '{2}'. The colliding directory uses parent directory '{3}' with DefaultDir '{4}' from line: {5}", id, parentDir, defaultDir, existingParentDir, existingDefaultDir, existingSourceLineNumbers.ToString());
45 }
46
42 public static Message UnknownDecompileType(string decompileType, string filePath) 47 public static Message UnknownDecompileType(string decompileType, string filePath)
43 { 48 {
44 return Message(null, Ids.UnknownDecompileType, "Unknown decompile type '{0}' from input: {1}", decompileType, filePath); 49 return Message(null, Ids.UnknownDecompileType, "Unknown decompile type '{0}' from input: {1}", decompileType, filePath);
@@ -65,6 +70,7 @@ namespace WixToolset.Core.WindowsInstaller
65 UnknownDecompileType = 7504, 70 UnknownDecompileType = 7504,
66 UnknownValidationTargetFileExtension = 7505, 71 UnknownValidationTargetFileExtension = 7505,
67 InvalidWindowsInstallerWixpdbForValidation = 7506, 72 InvalidWindowsInstallerWixpdbForValidation = 7506,
73 UnexpectedAnonymousDirectoryCollision = 7507,
68 } // last available is 7999. 8000 is BurnBackendErrors. 74 } // last available is 7999. 8000 is BurnBackendErrors.
69 } 75 }
70} 76}
diff --git a/src/wix/WixToolset.Core/Compiler.cs b/src/wix/WixToolset.Core/Compiler.cs
index 9bcdca4a..3a703fb7 100644
--- a/src/wix/WixToolset.Core/Compiler.cs
+++ b/src/wix/WixToolset.Core/Compiler.cs
@@ -185,12 +185,12 @@ namespace WixToolset.Core
185 { 185 {
186 switch (attrib.Name.LocalName) 186 switch (attrib.Name.LocalName)
187 { 187 {
188 case "RequiredVersion": 188 case "RequiredVersion":
189 requiredVersion = this.Core.GetAttributeVersionValue(sourceLineNumbers, attrib); 189 requiredVersion = this.Core.GetAttributeVersionValue(sourceLineNumbers, attrib);
190 break; 190 break;
191 default: 191 default:
192 this.Core.UnexpectedAttribute(node, attrib); 192 this.Core.UnexpectedAttribute(node, attrib);
193 break; 193 break;
194 } 194 }
195 } 195 }
196 else 196 else
@@ -210,27 +210,27 @@ namespace WixToolset.Core
210 { 210 {
211 switch (child.Name.LocalName) 211 switch (child.Name.LocalName)
212 { 212 {
213 case "Bundle": 213 case "Bundle":
214 this.ParseBundleElement(child); 214 this.ParseBundleElement(child);
215 break; 215 break;
216 case "Fragment": 216 case "Fragment":
217 this.ParseFragmentElement(child); 217 this.ParseFragmentElement(child);
218 break; 218 break;
219 case "Module": 219 case "Module":
220 this.ParseModuleElement(child); 220 this.ParseModuleElement(child);
221 break; 221 break;
222 case "PatchCreation": 222 case "PatchCreation":
223 this.Core.Write(CompilerWarnings.PatchCreationDeprecated(sourceLineNumbers)); 223 this.Core.Write(CompilerWarnings.PatchCreationDeprecated(sourceLineNumbers));
224 break; 224 break;
225 case "Package": 225 case "Package":
226 this.ParsePackageElement(child); 226 this.ParsePackageElement(child);
227 break; 227 break;
228 case "Patch": 228 case "Patch":
229 this.ParsePatchElement(child); 229 this.ParsePatchElement(child);
230 break; 230 break;
231 default: 231 default:
232 this.Core.UnexpectedElement(node, child); 232 this.Core.UnexpectedElement(node, child);
233 break; 233 break;
234 } 234 }
235 } 235 }
236 else 236 else
@@ -472,36 +472,36 @@ namespace WixToolset.Core
472 { 472 {
473 switch (attrib.Name.LocalName) 473 switch (attrib.Name.LocalName)
474 { 474 {
475 case "Id": 475 case "Id":
476 appId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 476 appId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
477 break; 477 break;
478 case "ActivateAtStorage": 478 case "ActivateAtStorage":
479 activateAtStorage = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 479 activateAtStorage = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
480 break; 480 break;
481 case "Advertise": 481 case "Advertise":
482 appIdAdvertise = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 482 appIdAdvertise = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
483 break; 483 break;
484 case "Description": 484 case "Description":
485 description = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 485 description = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
486 break; 486 break;
487 case "DllSurrogate": 487 case "DllSurrogate":
488 dllSurrogate = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); 488 dllSurrogate = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty);
489 break; 489 break;
490 case "LocalService": 490 case "LocalService":
491 localService = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 491 localService = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
492 break; 492 break;
493 case "RemoteServerName": 493 case "RemoteServerName":
494 remoteServerName = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 494 remoteServerName = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
495 break; 495 break;
496 case "RunAsInteractiveUser": 496 case "RunAsInteractiveUser":
497 runAsInteractiveUser = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 497 runAsInteractiveUser = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
498 break; 498 break;
499 case "ServiceParameters": 499 case "ServiceParameters":
500 serviceParameters = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 500 serviceParameters = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
501 break; 501 break;
502 default: 502 default:
503 this.Core.UnexpectedAttribute(node, attrib); 503 this.Core.UnexpectedAttribute(node, attrib);
504 break; 504 break;
505 } 505 }
506 } 506 }
507 else 507 else
@@ -536,12 +536,12 @@ namespace WixToolset.Core
536 { 536 {
537 switch (child.Name.LocalName) 537 switch (child.Name.LocalName)
538 { 538 {
539 case "Class": 539 case "Class":
540 this.ParseClassElement(child, componentId, advertise, fileServer, typeLibId, typeLibVersion, appId); 540 this.ParseClassElement(child, componentId, advertise, fileServer, typeLibId, typeLibVersion, appId);
541 break; 541 break;
542 default: 542 default:
543 this.Core.UnexpectedElement(node, child); 543 this.Core.UnexpectedElement(node, child);
544 break; 544 break;
545 } 545 }
546 } 546 }
547 else 547 else
@@ -631,15 +631,15 @@ namespace WixToolset.Core
631 { 631 {
632 switch (attrib.Name.LocalName) 632 switch (attrib.Name.LocalName)
633 { 633 {
634 case "Id": 634 case "Id":
635 id = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 635 id = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
636 break; 636 break;
637 case "Value": 637 case "Value":
638 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 638 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
639 break; 639 break;
640 default: 640 default:
641 this.Core.UnexpectedAttribute(node, attrib); 641 this.Core.UnexpectedAttribute(node, attrib);
642 break; 642 break;
643 } 643 }
644 } 644 }
645 else 645 else
@@ -684,18 +684,18 @@ namespace WixToolset.Core
684 { 684 {
685 switch (attrib.Name.LocalName) 685 switch (attrib.Name.LocalName)
686 { 686 {
687 case "Id": 687 case "Id":
688 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 688 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
689 break; 689 break;
690 case "SourceFile": 690 case "SourceFile":
691 sourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 691 sourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
692 break; 692 break;
693 case "SuppressModularization": 693 case "SuppressModularization":
694 suppressModularization = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 694 suppressModularization = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
695 break; 695 break;
696 default: 696 default:
697 this.Core.UnexpectedAttribute(node, attrib); 697 this.Core.UnexpectedAttribute(node, attrib);
698 break; 698 break;
699 } 699 }
700 } 700 }
701 else 701 else
@@ -767,15 +767,15 @@ namespace WixToolset.Core
767 { 767 {
768 switch (attrib.Name.LocalName) 768 switch (attrib.Name.LocalName)
769 { 769 {
770 case "Id": 770 case "Id":
771 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 771 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
772 break; 772 break;
773 case "SourceFile": 773 case "SourceFile":
774 sourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 774 sourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
775 break; 775 break;
776 default: 776 default:
777 this.Core.UnexpectedAttribute(node, attrib); 777 this.Core.UnexpectedAttribute(node, attrib);
778 break; 778 break;
779 } 779 }
780 } 780 }
781 else 781 else
@@ -837,13 +837,13 @@ namespace WixToolset.Core
837 { 837 {
838 switch (attrib.Name.LocalName) 838 switch (attrib.Name.LocalName)
839 { 839 {
840 case "Property": 840 case "Property":
841 property = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 841 property = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
842 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Property, property); 842 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Property, property);
843 break; 843 break;
844 default: 844 default:
845 this.Core.UnexpectedAttribute(node, attrib); 845 this.Core.UnexpectedAttribute(node, attrib);
846 break; 846 break;
847 } 847 }
848 } 848 }
849 else 849 else
@@ -864,12 +864,12 @@ namespace WixToolset.Core
864 { 864 {
865 switch (child.Name.LocalName) 865 switch (child.Name.LocalName)
866 { 866 {
867 case "Instance": 867 case "Instance":
868 this.ParseInstanceElement(child, property); 868 this.ParseInstanceElement(child, property);
869 break; 869 break;
870 default: 870 default:
871 this.Core.UnexpectedElement(node, child); 871 this.Core.UnexpectedElement(node, child);
872 break; 872 break;
873 } 873 }
874 } 874 }
875 else 875 else
@@ -898,21 +898,21 @@ namespace WixToolset.Core
898 { 898 {
899 switch (attrib.Name.LocalName) 899 switch (attrib.Name.LocalName)
900 { 900 {
901 case "Id": 901 case "Id":
902 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 902 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
903 break; 903 break;
904 case "ProductCode": 904 case "ProductCode":
905 productCode = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, true); 905 productCode = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, true);
906 break; 906 break;
907 case "ProductName": 907 case "ProductName":
908 productName = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 908 productName = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
909 break; 909 break;
910 case "UpgradeCode": 910 case "UpgradeCode":
911 upgradeCode = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 911 upgradeCode = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
912 break; 912 break;
913 default: 913 default:
914 this.Core.UnexpectedAttribute(node, attrib); 914 this.Core.UnexpectedAttribute(node, attrib);
915 break; 915 break;
916 } 916 }
917 } 917 }
918 else 918 else
@@ -964,22 +964,22 @@ namespace WixToolset.Core
964 { 964 {
965 switch (attrib.Name.LocalName) 965 switch (attrib.Name.LocalName)
966 { 966 {
967 case "Id": 967 case "Id":
968 id = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 968 id = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
969 break; 969 break;
970 case "AppData": 970 case "AppData":
971 appData = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 971 appData = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
972 break; 972 break;
973 case "Feature": 973 case "Feature":
974 feature = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 974 feature = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
975 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Feature, feature); 975 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Feature, feature);
976 break; 976 break;
977 case "Qualifier": 977 case "Qualifier":
978 qualifier = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 978 qualifier = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
979 break; 979 break;
980 default: 980 default:
981 this.Core.UnexpectedAttribute(node, attrib); 981 this.Core.UnexpectedAttribute(node, attrib);
982 break; 982 break;
983 } 983 }
984 } 984 }
985 else 985 else
@@ -1059,71 +1059,71 @@ namespace WixToolset.Core
1059 { 1059 {
1060 switch (attrib.Name.LocalName) 1060 switch (attrib.Name.LocalName)
1061 { 1061 {
1062 case "Id": 1062 case "Id":
1063 classId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 1063 classId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
1064 break; 1064 break;
1065 case "Advertise": 1065 case "Advertise":
1066 classAdvertise = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 1066 classAdvertise = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1067 break; 1067 break;
1068 case "AppId": 1068 case "AppId":
1069 appId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 1069 appId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
1070 break; 1070 break;
1071 case "Argument": 1071 case "Argument":
1072 argument = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1072 argument = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1073 break; 1073 break;
1074 case "Context": 1074 case "Context":
1075 contexts = this.Core.GetAttributeValue(sourceLineNumbers, attrib).Split("\r\n\t ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 1075 contexts = this.Core.GetAttributeValue(sourceLineNumbers, attrib).Split("\r\n\t ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
1076 break; 1076 break;
1077 case "Control": 1077 case "Control":
1078 control = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 1078 control = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1079 break; 1079 break;
1080 case "Description": 1080 case "Description":
1081 description = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1081 description = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1082 break; 1082 break;
1083 case "Handler": 1083 case "Handler":
1084 defaultInprocHandler = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1084 defaultInprocHandler = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1085 break; 1085 break;
1086 case "Icon": 1086 case "Icon":
1087 icon = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 1087 icon = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1088 break; 1088 break;
1089 case "IconIndex": 1089 case "IconIndex":
1090 iconIndex = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, Int16.MinValue + 1, Int16.MaxValue); 1090 iconIndex = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, Int16.MinValue + 1, Int16.MaxValue);
1091 break; 1091 break;
1092 case "RelativePath": 1092 case "RelativePath":
1093 relativePath = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 1093 relativePath = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1094 break; 1094 break;
1095 1095
1096 // The following attributes result in rows always added to the Registry table rather than the Class table 1096 // The following attributes result in rows always added to the Registry table rather than the Class table
1097 case "Insertable": 1097 case "Insertable":
1098 insertable = (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) ? "Insertable" : "NotInsertable"; 1098 insertable = (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) ? "Insertable" : "NotInsertable";
1099 break; 1099 break;
1100 case "Programmable": 1100 case "Programmable":
1101 programmable = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 1101 programmable = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1102 break; 1102 break;
1103 case "SafeForInitializing": 1103 case "SafeForInitializing":
1104 safeForInit = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 1104 safeForInit = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1105 break; 1105 break;
1106 case "SafeForScripting": 1106 case "SafeForScripting":
1107 safeForScripting = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 1107 safeForScripting = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1108 break; 1108 break;
1109 case "ForeignServer": 1109 case "ForeignServer":
1110 foreignServer = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1110 foreignServer = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1111 break; 1111 break;
1112 case "Server": 1112 case "Server":
1113 localFileServer = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1113 localFileServer = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1114 break; 1114 break;
1115 case "ShortPath": 1115 case "ShortPath":
1116 shortServerPath = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 1116 shortServerPath = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1117 break; 1117 break;
1118 case "ThreadingModel": 1118 case "ThreadingModel":
1119 threadingModel = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1119 threadingModel = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1120 break; 1120 break;
1121 case "Version": 1121 case "Version":
1122 version = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1122 version = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1123 break; 1123 break;
1124 default: 1124 default:
1125 this.Core.UnexpectedAttribute(node, attrib); 1125 this.Core.UnexpectedAttribute(node, attrib);
1126 break; 1126 break;
1127 } 1127 }
1128 } 1128 }
1129 else 1129 else
@@ -1199,35 +1199,35 @@ namespace WixToolset.Core
1199 { 1199 {
1200 switch (child.Name.LocalName) 1200 switch (child.Name.LocalName)
1201 { 1201 {
1202 case "FileTypeMask": 1202 case "FileTypeMask":
1203 if (YesNoType.Yes == advertise) 1203 if (YesNoType.Yes == advertise)
1204 { 1204 {
1205 fileTypeMask = String.Concat(fileTypeMask, null == fileTypeMask ? String.Empty : ";", this.ParseFileTypeMaskElement(child)); 1205 fileTypeMask = String.Concat(fileTypeMask, null == fileTypeMask ? String.Empty : ";", this.ParseFileTypeMaskElement(child));
1206 } 1206 }
1207 else if (YesNoType.No == advertise) 1207 else if (YesNoType.No == advertise)
1208 { 1208 {
1209 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); 1209 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child);
1210 this.Core.CreateRegistryStringSymbol(childSourceLineNumbers, RegistryRootType.ClassesRoot, String.Concat("FileType\\", classId, "\\", fileTypeMaskIndex.ToString()), String.Empty, this.ParseFileTypeMaskElement(child), componentId); 1210 this.Core.CreateRegistryStringSymbol(childSourceLineNumbers, RegistryRootType.ClassesRoot, String.Concat("FileType\\", classId, "\\", fileTypeMaskIndex.ToString()), String.Empty, this.ParseFileTypeMaskElement(child), componentId);
1211 fileTypeMaskIndex++; 1211 fileTypeMaskIndex++;
1212 } 1212 }
1213 break; 1213 break;
1214 case "Interface": 1214 case "Interface":
1215 this.ParseInterfaceElement(child, componentId, class16bit ? classId : null, class32bit ? classId : null, typeLibId, typeLibVersion); 1215 this.ParseInterfaceElement(child, componentId, class16bit ? classId : null, class32bit ? classId : null, typeLibId, typeLibVersion);
1216 break; 1216 break;
1217 case "ProgId": 1217 case "ProgId":
1218 {
1219 var foundExtension = false;
1220 var progId = this.ParseProgIdElement(child, componentId, advertise, classId, description, null, ref foundExtension, firstProgIdForClass);
1221 if (null == defaultProgId)
1222 { 1218 {
1223 defaultProgId = progId; 1219 var foundExtension = false;
1220 var progId = this.ParseProgIdElement(child, componentId, advertise, classId, description, null, ref foundExtension, firstProgIdForClass);
1221 if (null == defaultProgId)
1222 {
1223 defaultProgId = progId;
1224 }
1225 firstProgIdForClass = YesNoType.No;
1224 } 1226 }
1225 firstProgIdForClass = YesNoType.No;
1226 }
1227 break;
1228 default:
1229 this.Core.UnexpectedElement(node, child);
1230 break; 1227 break;
1228 default:
1229 this.Core.UnexpectedElement(node, child);
1230 break;
1231 } 1231 }
1232 } 1232 }
1233 else 1233 else
@@ -1394,19 +1394,19 @@ namespace WixToolset.Core
1394 { 1394 {
1395 switch (defaultInprocHandler) // ClassId Default Inproc Handler 1395 switch (defaultInprocHandler) // ClassId Default Inproc Handler
1396 { 1396 {
1397 case "1": 1397 case "1":
1398 this.Core.CreateRegistryStringSymbol(sourceLineNumbers, RegistryRootType.ClassesRoot, String.Concat("CLSID\\", classId, "\\InprocHandler"), String.Empty, "ole2.dll", componentId); 1398 this.Core.CreateRegistryStringSymbol(sourceLineNumbers, RegistryRootType.ClassesRoot, String.Concat("CLSID\\", classId, "\\InprocHandler"), String.Empty, "ole2.dll", componentId);
1399 break; 1399 break;
1400 case "2": 1400 case "2":
1401 this.Core.CreateRegistryStringSymbol(sourceLineNumbers, RegistryRootType.ClassesRoot, String.Concat("CLSID\\", classId, "\\InprocHandler32"), String.Empty, "ole32.dll", componentId); 1401 this.Core.CreateRegistryStringSymbol(sourceLineNumbers, RegistryRootType.ClassesRoot, String.Concat("CLSID\\", classId, "\\InprocHandler32"), String.Empty, "ole32.dll", componentId);
1402 break; 1402 break;
1403 case "3": 1403 case "3":
1404 this.Core.CreateRegistryStringSymbol(sourceLineNumbers, RegistryRootType.ClassesRoot, String.Concat("CLSID\\", classId, "\\InprocHandler"), String.Empty, "ole2.dll", componentId); 1404 this.Core.CreateRegistryStringSymbol(sourceLineNumbers, RegistryRootType.ClassesRoot, String.Concat("CLSID\\", classId, "\\InprocHandler"), String.Empty, "ole2.dll", componentId);
1405 this.Core.CreateRegistryStringSymbol(sourceLineNumbers, RegistryRootType.ClassesRoot, String.Concat("CLSID\\", classId, "\\InprocHandler32"), String.Empty, "ole32.dll", componentId); 1405 this.Core.CreateRegistryStringSymbol(sourceLineNumbers, RegistryRootType.ClassesRoot, String.Concat("CLSID\\", classId, "\\InprocHandler32"), String.Empty, "ole32.dll", componentId);
1406 break; 1406 break;
1407 default: 1407 default:
1408 this.Core.CreateRegistryStringSymbol(sourceLineNumbers, RegistryRootType.ClassesRoot, String.Concat("CLSID\\", classId, "\\InprocHandler32"), String.Empty, defaultInprocHandler, componentId); 1408 this.Core.CreateRegistryStringSymbol(sourceLineNumbers, RegistryRootType.ClassesRoot, String.Concat("CLSID\\", classId, "\\InprocHandler32"), String.Empty, defaultInprocHandler, componentId);
1409 break; 1409 break;
1410 } 1410 }
1411 } 1411 }
1412 1412
@@ -1490,30 +1490,30 @@ namespace WixToolset.Core
1490 { 1490 {
1491 switch (attrib.Name.LocalName) 1491 switch (attrib.Name.LocalName)
1492 { 1492 {
1493 case "Id": 1493 case "Id":
1494 interfaceId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 1494 interfaceId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
1495 break; 1495 break;
1496 case "BaseInterface": 1496 case "BaseInterface":
1497 baseInterface = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 1497 baseInterface = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
1498 break; 1498 break;
1499 case "Name": 1499 case "Name":
1500 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1500 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1501 break; 1501 break;
1502 case "NumMethods": 1502 case "NumMethods":
1503 numMethods = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue); 1503 numMethods = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue);
1504 break; 1504 break;
1505 case "ProxyStubClassId": 1505 case "ProxyStubClassId":
1506 proxyId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib); 1506 proxyId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib);
1507 break; 1507 break;
1508 case "ProxyStubClassId32": 1508 case "ProxyStubClassId32":
1509 proxyId32 = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 1509 proxyId32 = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
1510 break; 1510 break;
1511 case "Versioned": 1511 case "Versioned":
1512 versioned = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 1512 versioned = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1513 break; 1513 break;
1514 default: 1514 default:
1515 this.Core.UnexpectedAttribute(node, attrib); 1515 this.Core.UnexpectedAttribute(node, attrib);
1516 break; 1516 break;
1517 } 1517 }
1518 } 1518 }
1519 else 1519 else
@@ -1584,18 +1584,18 @@ namespace WixToolset.Core
1584 { 1584 {
1585 switch (attrib.Name.LocalName) 1585 switch (attrib.Name.LocalName)
1586 { 1586 {
1587 case "Mask": 1587 case "Mask":
1588 mask = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1588 mask = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1589 break; 1589 break;
1590 case "Offset": 1590 case "Offset":
1591 offset = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue); 1591 offset = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue);
1592 break; 1592 break;
1593 case "Value": 1593 case "Value":
1594 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1594 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1595 break; 1595 break;
1596 default: 1596 default:
1597 this.Core.UnexpectedAttribute(node, attrib); 1597 this.Core.UnexpectedAttribute(node, attrib);
1598 break; 1598 break;
1599 } 1599 }
1600 } 1600 }
1601 else 1601 else
@@ -1658,30 +1658,30 @@ namespace WixToolset.Core
1658 { 1658 {
1659 switch (attrib.Name.LocalName) 1659 switch (attrib.Name.LocalName)
1660 { 1660 {
1661 case "ExcludeLanguages": 1661 case "ExcludeLanguages":
1662 excludeLanguages = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 1662 excludeLanguages = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1663 break; 1663 break;
1664 case "IncludeMaximum": 1664 case "IncludeMaximum":
1665 maxInclusive = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 1665 maxInclusive = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1666 break; 1666 break;
1667 case "IncludeMinimum": 1667 case "IncludeMinimum":
1668 minInclusive = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 1668 minInclusive = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1669 break; 1669 break;
1670 case "Language": 1670 case "Language":
1671 language = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1671 language = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1672 break; 1672 break;
1673 case "Minimum": 1673 case "Minimum":
1674 minimum = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1674 minimum = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1675 break; 1675 break;
1676 case "Maximum": 1676 case "Maximum":
1677 maximum = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1677 maximum = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1678 break; 1678 break;
1679 case "UpgradeCode": 1679 case "UpgradeCode":
1680 upgradeCode = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 1680 upgradeCode = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
1681 break; 1681 break;
1682 default: 1682 default:
1683 this.Core.UnexpectedAttribute(node, attrib); 1683 this.Core.UnexpectedAttribute(node, attrib);
1684 break; 1684 break;
1685 } 1685 }
1686 } 1686 }
1687 else 1687 else
@@ -1735,59 +1735,59 @@ namespace WixToolset.Core
1735 { 1735 {
1736 switch (attrib.Name.LocalName) 1736 switch (attrib.Name.LocalName)
1737 { 1737 {
1738 case "Id": 1738 case "Id":
1739 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 1739 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
1740 break;
1741 case "Bitness":
1742 var bitnessValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1743 switch (bitnessValue)
1744 {
1745 case "always32":
1746 search64bit = false;
1747 break;
1748 case "always64":
1749 search64bit = true;
1750 break;
1751 case "default":
1752 case "":
1753 break; 1740 break;
1754 default: 1741 case "Bitness":
1755 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, bitnessValue, "default", "always32", "always64")); 1742 var bitnessValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1743 switch (bitnessValue)
1744 {
1745 case "always32":
1746 search64bit = false;
1747 break;
1748 case "always64":
1749 search64bit = true;
1750 break;
1751 case "default":
1752 case "":
1753 break;
1754 default:
1755 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, bitnessValue, "default", "always32", "always64"));
1756 break;
1757 }
1756 break; 1758 break;
1757 } 1759 case "Key":
1758 break; 1760 key = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1759 case "Key":
1760 key = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1761 break;
1762 case "Name":
1763 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1764 break;
1765 case "Root":
1766 root = this.Core.GetAttributeRegistryRootValue(sourceLineNumbers, attrib, false);
1767 break;
1768 case "Type":
1769 var typeValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1770 switch (typeValue)
1771 {
1772 case "directory":
1773 type = RegLocatorType.Directory;
1774 break; 1761 break;
1775 case "file": 1762 case "Name":
1776 type = RegLocatorType.FileName; 1763 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1777 break; 1764 break;
1778 case "raw": 1765 case "Root":
1779 type = RegLocatorType.Raw; 1766 root = this.Core.GetAttributeRegistryRootValue(sourceLineNumbers, attrib, false);
1780 break; 1767 break;
1781 case "": 1768 case "Type":
1769 var typeValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1770 switch (typeValue)
1771 {
1772 case "directory":
1773 type = RegLocatorType.Directory;
1774 break;
1775 case "file":
1776 type = RegLocatorType.FileName;
1777 break;
1778 case "raw":
1779 type = RegLocatorType.Raw;
1780 break;
1781 case "":
1782 break;
1783 default:
1784 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Type", typeValue, "directory", "file", "raw"));
1785 break;
1786 }
1782 break; 1787 break;
1783 default: 1788 default:
1784 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Type", typeValue, "directory", "file", "raw")); 1789 this.Core.UnexpectedAttribute(node, attrib);
1785 break; 1790 break;
1786 }
1787 break;
1788 default:
1789 this.Core.UnexpectedAttribute(node, attrib);
1790 break;
1791 } 1791 }
1792 } 1792 }
1793 else 1793 else
@@ -1824,46 +1824,46 @@ namespace WixToolset.Core
1824 { 1824 {
1825 switch (child.Name.LocalName) 1825 switch (child.Name.LocalName)
1826 { 1826 {
1827 case "DirectorySearch": 1827 case "DirectorySearch":
1828 if (oneChild) 1828 if (oneChild)
1829 { 1829 {
1830 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 1830 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
1831 } 1831 }
1832 oneChild = true; 1832 oneChild = true;
1833 1833
1834 // directorysearch parentage should work like directory element, not the rest of the signature type because of the DrLocator.Parent column 1834 // directorysearch parentage should work like directory element, not the rest of the signature type because of the DrLocator.Parent column
1835 signature = this.ParseDirectorySearchElement(child, id.Id); 1835 signature = this.ParseDirectorySearchElement(child, id.Id);
1836 break; 1836 break;
1837 case "DirectorySearchRef": 1837 case "DirectorySearchRef":
1838 if (oneChild) 1838 if (oneChild)
1839 { 1839 {
1840 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 1840 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
1841 } 1841 }
1842 oneChild = true; 1842 oneChild = true;
1843 signature = this.ParseDirectorySearchRefElement(child, id.Id); 1843 signature = this.ParseDirectorySearchRefElement(child, id.Id);
1844 break; 1844 break;
1845 case "FileSearch": 1845 case "FileSearch":
1846 if (oneChild) 1846 if (oneChild)
1847 { 1847 {
1848 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 1848 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
1849 } 1849 }
1850 oneChild = true; 1850 oneChild = true;
1851 signature = this.ParseFileSearchElement(child, id.Id, false, CompilerConstants.IntegerNotSet); 1851 signature = this.ParseFileSearchElement(child, id.Id, false, CompilerConstants.IntegerNotSet);
1852 id = new Identifier(AccessModifier.Section, signature); // FileSearch signatures override parent signatures 1852 id = new Identifier(AccessModifier.Section, signature); // FileSearch signatures override parent signatures
1853 break; 1853 break;
1854 case "FileSearchRef": 1854 case "FileSearchRef":
1855 if (oneChild) 1855 if (oneChild)
1856 { 1856 {
1857 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 1857 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
1858 } 1858 }
1859 oneChild = true; 1859 oneChild = true;
1860 var newId = this.ParseSimpleRefElement(child, SymbolDefinitions.Signature); // FileSearch signatures override parent signatures 1860 var newId = this.ParseSimpleRefElement(child, SymbolDefinitions.Signature); // FileSearch signatures override parent signatures
1861 id = new Identifier(AccessModifier.Section, newId); 1861 id = new Identifier(AccessModifier.Section, newId);
1862 signature = null; 1862 signature = null;
1863 break; 1863 break;
1864 default: 1864 default:
1865 this.Core.UnexpectedElement(node, child); 1865 this.Core.UnexpectedElement(node, child);
1866 break; 1866 break;
1867 } 1867 }
1868 } 1868 }
1869 else 1869 else
@@ -1903,13 +1903,13 @@ namespace WixToolset.Core
1903 { 1903 {
1904 switch (attrib.Name.LocalName) 1904 switch (attrib.Name.LocalName)
1905 { 1905 {
1906 case "Id": 1906 case "Id":
1907 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 1907 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1908 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.RegLocator, id); 1908 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.RegLocator, id);
1909 break; 1909 break;
1910 default: 1910 default:
1911 this.Core.UnexpectedAttribute(node, attrib); 1911 this.Core.UnexpectedAttribute(node, attrib);
1912 break; 1912 break;
1913 } 1913 }
1914 } 1914 }
1915 else 1915 else
@@ -1944,33 +1944,33 @@ namespace WixToolset.Core
1944 { 1944 {
1945 switch (child.Name.LocalName) 1945 switch (child.Name.LocalName)
1946 { 1946 {
1947 case "ComplianceDrive": 1947 case "ComplianceDrive":
1948 signature = this.ParseComplianceDriveElement(child); 1948 signature = this.ParseComplianceDriveElement(child);
1949 break; 1949 break;
1950 case "ComponentSearch": 1950 case "ComponentSearch":
1951 signature = this.ParseComponentSearchElement(child); 1951 signature = this.ParseComponentSearchElement(child);
1952 break; 1952 break;
1953 case "DirectorySearch": 1953 case "DirectorySearch":
1954 signature = this.ParseDirectorySearchElement(child, null); 1954 signature = this.ParseDirectorySearchElement(child, null);
1955 break; 1955 break;
1956 case "DirectorySearchRef": 1956 case "DirectorySearchRef":
1957 signature = this.ParseDirectorySearchRefElement(child, null); 1957 signature = this.ParseDirectorySearchRefElement(child, null);
1958 break; 1958 break;
1959 case "IniFileSearch": 1959 case "IniFileSearch":
1960 signature = this.ParseIniFileSearchElement(child); 1960 signature = this.ParseIniFileSearchElement(child);
1961 break; 1961 break;
1962 case "ProductSearch": 1962 case "ProductSearch":
1963 // handled in ParsePropertyElement 1963 // handled in ParsePropertyElement
1964 break; 1964 break;
1965 case "RegistrySearch": 1965 case "RegistrySearch":
1966 signature = this.ParseRegistrySearchElement(child); 1966 signature = this.ParseRegistrySearchElement(child);
1967 break; 1967 break;
1968 case "RegistrySearchRef": 1968 case "RegistrySearchRef":
1969 signature = this.ParseRegistrySearchRefElement(child); 1969 signature = this.ParseRegistrySearchRefElement(child);
1970 break; 1970 break;
1971 default: 1971 default:
1972 this.Core.UnexpectedElement(node, child); 1972 this.Core.UnexpectedElement(node, child);
1973 break; 1973 break;
1974 } 1974 }
1975 } 1975 }
1976 else 1976 else
@@ -2006,25 +2006,25 @@ namespace WixToolset.Core
2006 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); 2006 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
2007 switch (child.Name.LocalName) 2007 switch (child.Name.LocalName)
2008 { 2008 {
2009 case "DirectorySearch": 2009 case "DirectorySearch":
2010 if (oneChild) 2010 if (oneChild)
2011 { 2011 {
2012 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName)); 2012 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName));
2013 } 2013 }
2014 oneChild = true; 2014 oneChild = true;
2015 signature = this.ParseDirectorySearchElement(child, "CCP_DRIVE"); 2015 signature = this.ParseDirectorySearchElement(child, "CCP_DRIVE");
2016 break; 2016 break;
2017 case "DirectorySearchRef": 2017 case "DirectorySearchRef":
2018 if (oneChild) 2018 if (oneChild)
2019 { 2019 {
2020 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName)); 2020 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName));
2021 } 2021 }
2022 oneChild = true; 2022 oneChild = true;
2023 signature = this.ParseDirectorySearchRefElement(child, "CCP_DRIVE"); 2023 signature = this.ParseDirectorySearchRefElement(child, "CCP_DRIVE");
2024 break; 2024 break;
2025 default: 2025 default:
2026 this.Core.UnexpectedElement(node, child); 2026 this.Core.UnexpectedElement(node, child);
2027 break; 2027 break;
2028 } 2028 }
2029 } 2029 }
2030 else 2030 else
@@ -2055,9 +2055,9 @@ namespace WixToolset.Core
2055 { 2055 {
2056 switch (attrib.Name.LocalName) 2056 switch (attrib.Name.LocalName)
2057 { 2057 {
2058 default: 2058 default:
2059 this.Core.UnexpectedAttribute(node, attrib); 2059 this.Core.UnexpectedAttribute(node, attrib);
2060 break; 2060 break;
2061 } 2061 }
2062 } 2062 }
2063 else 2063 else
@@ -2143,103 +2143,103 @@ namespace WixToolset.Core
2143 { 2143 {
2144 switch (attrib.Name.LocalName) 2144 switch (attrib.Name.LocalName)
2145 { 2145 {
2146 case "Id": 2146 case "Id":
2147 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 2147 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
2148 break;
2149 case "Bitness":
2150 var bitnessValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2151 switch (bitnessValue)
2152 {
2153 case "always32":
2154 win64 = false;
2155 break; 2148 break;
2156 case "always64": 2149 case "Bitness":
2157 win64 = true; 2150 var bitnessValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2151 switch (bitnessValue)
2152 {
2153 case "always32":
2154 win64 = false;
2155 break;
2156 case "always64":
2157 win64 = true;
2158 break;
2159 case "default":
2160 case "":
2161 break;
2162 default:
2163 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, bitnessValue, "default", "always32", "always64"));
2164 break;
2165 }
2158 break; 2166 break;
2159 case "default": 2167 case "ComPlusFlags":
2160 case "": 2168 comPlusBits = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue);
2161 break; 2169 break;
2162 default: 2170 case "DisableRegistryReflection":
2163 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, bitnessValue, "default", "always32", "always64")); 2171 disableRegistryReflection = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2164 break; 2172 break;
2165 } 2173 case "Condition":
2166 break; 2174 condition = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2167 case "ComPlusFlags":
2168 comPlusBits = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue);
2169 break;
2170 case "DisableRegistryReflection":
2171 disableRegistryReflection = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2172 break;
2173 case "Condition":
2174 condition = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2175 break;
2176 case "Directory":
2177 directoryId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2178 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, directoryId);
2179 break;
2180 case "Subdirectory":
2181 subdirectory = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true);
2182 break;
2183 case "DiskId":
2184 diskId = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue);
2185 break;
2186 case "Feature":
2187 feature = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2188 break;
2189 case "Guid":
2190 guid = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, true, true);
2191 break;
2192 case "KeyPath":
2193 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
2194 {
2195 keyFound = true;
2196 keyPath = null;
2197 }
2198 break;
2199 case "Location":
2200 var locationValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2201 switch (locationValue)
2202 {
2203 case "either":
2204 location = ComponentLocation.Either;
2205 break; 2175 break;
2206 case "local": // this is the default 2176 case "Directory":
2207 location = ComponentLocation.LocalOnly; 2177 directoryId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2178 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, directoryId);
2208 break; 2179 break;
2209 case "source": 2180 case "Subdirectory":
2210 location = ComponentLocation.SourceOnly; 2181 subdirectory = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true);
2211 break; 2182 break;
2212 case "": 2183 case "DiskId":
2184 diskId = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue);
2185 break;
2186 case "Feature":
2187 feature = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2188 break;
2189 case "Guid":
2190 guid = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, true, true);
2191 break;
2192 case "KeyPath":
2193 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
2194 {
2195 keyFound = true;
2196 keyPath = null;
2197 }
2198 break;
2199 case "Location":
2200 var locationValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2201 switch (locationValue)
2202 {
2203 case "either":
2204 location = ComponentLocation.Either;
2205 break;
2206 case "local": // this is the default
2207 location = ComponentLocation.LocalOnly;
2208 break;
2209 case "source":
2210 location = ComponentLocation.SourceOnly;
2211 break;
2212 case "":
2213 break;
2214 default:
2215 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, locationValue, "either", "local", "source"));
2216 break;
2217 }
2218 break;
2219 case "MultiInstance":
2220 multiInstance = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2221 break;
2222 case "NeverOverwrite":
2223 neverOverwrite = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2224 break;
2225 case "Permanent":
2226 permanent = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2227 break;
2228 case "Shared":
2229 shared = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2230 break;
2231 case "SharedDllRefCount":
2232 sharedDllRefCount = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2233 break;
2234 case "Transitive":
2235 transitive = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2236 break;
2237 case "UninstallWhenSuperseded":
2238 uninstallWhenSuperseded = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2213 break; 2239 break;
2214 default: 2240 default:
2215 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, locationValue, "either", "local", "source")); 2241 this.Core.UnexpectedAttribute(node, attrib);
2216 break; 2242 break;
2217 }
2218 break;
2219 case "MultiInstance":
2220 multiInstance = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2221 break;
2222 case "NeverOverwrite":
2223 neverOverwrite = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2224 break;
2225 case "Permanent":
2226 permanent = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2227 break;
2228 case "Shared":
2229 shared = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2230 break;
2231 case "SharedDllRefCount":
2232 sharedDllRefCount = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2233 break;
2234 case "Transitive":
2235 transitive = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2236 break;
2237 case "UninstallWhenSuperseded":
2238 uninstallWhenSuperseded = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2239 break;
2240 default:
2241 this.Core.UnexpectedAttribute(node, attrib);
2242 break;
2243 } 2243 }
2244 } 2244 }
2245 else 2245 else
@@ -2305,113 +2305,113 @@ namespace WixToolset.Core
2305 { 2305 {
2306 switch (child.Name.LocalName) 2306 switch (child.Name.LocalName)
2307 { 2307 {
2308 case "AppId": 2308 case "AppId":
2309 this.ParseAppIdElement(child, id.Id, YesNoType.NotSet, null, null, null); 2309 this.ParseAppIdElement(child, id.Id, YesNoType.NotSet, null, null, null);
2310 break; 2310 break;
2311 case "Category": 2311 case "Category":
2312 this.ParseCategoryElement(child, id.Id); 2312 this.ParseCategoryElement(child, id.Id);
2313 break; 2313 break;
2314 case "Class": 2314 case "Class":
2315 this.ParseClassElement(child, id.Id, YesNoType.NotSet, null, null, null, null); 2315 this.ParseClassElement(child, id.Id, YesNoType.NotSet, null, null, null, null);
2316 break; 2316 break;
2317 case "CopyFile": 2317 case "CopyFile":
2318 this.ParseCopyFileElement(child, id.Id, null); 2318 this.ParseCopyFileElement(child, id.Id, null);
2319 break; 2319 break;
2320 case "CreateFolder": 2320 case "CreateFolder":
2321 var createdFolder = this.ParseCreateFolderElement(child, id.Id, directoryId, win64); 2321 var createdFolder = this.ParseCreateFolderElement(child, id.Id, directoryId, win64);
2322 break; 2322 break;
2323 case "Environment": 2323 case "Environment":
2324 this.ParseEnvironmentElement(child, id.Id); 2324 this.ParseEnvironmentElement(child, id.Id);
2325 break; 2325 break;
2326 case "Extension": 2326 case "Extension":
2327 this.ParseExtensionElement(child, id.Id, YesNoType.NotSet, null); 2327 this.ParseExtensionElement(child, id.Id, YesNoType.NotSet, null);
2328 break; 2328 break;
2329 case "File": 2329 case "File":
2330 keyPathSet = this.ParseFileElement(child, id.Id, directoryId, diskId, srcPath, out keyPossible, win64, guid); 2330 keyPathSet = this.ParseFileElement(child, id.Id, directoryId, diskId, srcPath, out keyPossible, win64, guid);
2331 keyBit = ComponentKeyPathType.File; 2331 keyBit = ComponentKeyPathType.File;
2332 files++; 2332 files++;
2333 break; 2333 break;
2334 case "IniFile": 2334 case "IniFile":
2335 this.ParseIniFileElement(child, id.Id); 2335 this.ParseIniFileElement(child, id.Id);
2336 break; 2336 break;
2337 case "Interface": 2337 case "Interface":
2338 this.ParseInterfaceElement(child, id.Id, null, null, null, null); 2338 this.ParseInterfaceElement(child, id.Id, null, null, null, null);
2339 break; 2339 break;
2340 case "IsolateComponent": 2340 case "IsolateComponent":
2341 this.ParseIsolateComponentElement(child, id.Id); 2341 this.ParseIsolateComponentElement(child, id.Id);
2342 break; 2342 break;
2343 case "ODBCDataSource": 2343 case "ODBCDataSource":
2344 keyPathSet = this.ParseODBCDataSource(child, id.Id, null, out keyPossible); 2344 keyPathSet = this.ParseODBCDataSource(child, id.Id, null, out keyPossible);
2345 keyBit = ComponentKeyPathType.OdbcDataSource; 2345 keyBit = ComponentKeyPathType.OdbcDataSource;
2346 encounteredODBCDataSource = true; 2346 encounteredODBCDataSource = true;
2347 break; 2347 break;
2348 case "ODBCDriver": 2348 case "ODBCDriver":
2349 this.ParseODBCDriverOrTranslator(child, id.Id, null, SymbolDefinitionType.ODBCDriver); 2349 this.ParseODBCDriverOrTranslator(child, id.Id, null, SymbolDefinitionType.ODBCDriver);
2350 break; 2350 break;
2351 case "ODBCTranslator": 2351 case "ODBCTranslator":
2352 this.ParseODBCDriverOrTranslator(child, id.Id, null, SymbolDefinitionType.ODBCTranslator); 2352 this.ParseODBCDriverOrTranslator(child, id.Id, null, SymbolDefinitionType.ODBCTranslator);
2353 break; 2353 break;
2354 case "ProgId": 2354 case "ProgId":
2355 var foundExtension = false; 2355 var foundExtension = false;
2356 this.ParseProgIdElement(child, id.Id, YesNoType.NotSet, null, null, null, ref foundExtension, YesNoType.NotSet); 2356 this.ParseProgIdElement(child, id.Id, YesNoType.NotSet, null, null, null, ref foundExtension, YesNoType.NotSet);
2357 break; 2357 break;
2358 case "Provides": 2358 case "Provides":
2359 if (win64) 2359 if (win64)
2360 { 2360 {
2361 this.Messaging.Write(CompilerWarnings.Win64Component(sourceLineNumbers, id.Id)); 2361 this.Messaging.Write(CompilerWarnings.Win64Component(sourceLineNumbers, id.Id));
2362 } 2362 }
2363 2363
2364 keyPathSet = this.ParseProvidesElement(child, null, id.Id, out keyPossible); 2364 keyPathSet = this.ParseProvidesElement(child, null, id.Id, out keyPossible);
2365 keyBit = ComponentKeyPathType.Registry; 2365 keyBit = ComponentKeyPathType.Registry;
2366 break; 2366 break;
2367 2367
2368 case "RegistryKey": 2368 case "RegistryKey":
2369 keyPathSet = this.ParseRegistryKeyElement(child, id.Id, null, null, win64, out keyPossible); 2369 keyPathSet = this.ParseRegistryKeyElement(child, id.Id, null, null, win64, out keyPossible);
2370 keyBit = ComponentKeyPathType.Registry; 2370 keyBit = ComponentKeyPathType.Registry;
2371 break; 2371 break;
2372 case "RegistryValue": 2372 case "RegistryValue":
2373 keyPathSet = this.ParseRegistryValueElement(child, id.Id, null, null, win64, out keyPossible); 2373 keyPathSet = this.ParseRegistryValueElement(child, id.Id, null, null, win64, out keyPossible);
2374 keyBit = ComponentKeyPathType.Registry; 2374 keyBit = ComponentKeyPathType.Registry;
2375 break; 2375 break;
2376 case "RemoveFile": 2376 case "RemoveFile":
2377 this.ParseRemoveFileElement(child, id.Id, directoryId); 2377 this.ParseRemoveFileElement(child, id.Id, directoryId);
2378 break; 2378 break;
2379 case "RemoveFolder": 2379 case "RemoveFolder":
2380 this.ParseRemoveFolderElement(child, id.Id, directoryId); 2380 this.ParseRemoveFolderElement(child, id.Id, directoryId);
2381 break; 2381 break;
2382 case "RemoveRegistryKey": 2382 case "RemoveRegistryKey":
2383 this.ParseRemoveRegistryKeyElement(child, id.Id); 2383 this.ParseRemoveRegistryKeyElement(child, id.Id);
2384 break; 2384 break;
2385 case "RemoveRegistryValue": 2385 case "RemoveRegistryValue":
2386 this.ParseRemoveRegistryValueElement(child, id.Id); 2386 this.ParseRemoveRegistryValueElement(child, id.Id);
2387 break; 2387 break;
2388 case "ReserveCost": 2388 case "ReserveCost":
2389 this.ParseReserveCostElement(child, id.Id, directoryId); 2389 this.ParseReserveCostElement(child, id.Id, directoryId);
2390 break; 2390 break;
2391 case "ServiceConfig": 2391 case "ServiceConfig":
2392 this.ParseServiceConfigElement(child, id.Id, null); 2392 this.ParseServiceConfigElement(child, id.Id, null);
2393 break; 2393 break;
2394 case "ServiceConfigFailureActions": 2394 case "ServiceConfigFailureActions":
2395 this.ParseServiceConfigFailureActionsElement(child, id.Id, null); 2395 this.ParseServiceConfigFailureActionsElement(child, id.Id, null);
2396 break; 2396 break;
2397 case "ServiceControl": 2397 case "ServiceControl":
2398 this.ParseServiceControlElement(child, id.Id); 2398 this.ParseServiceControlElement(child, id.Id);
2399 break; 2399 break;
2400 case "ServiceInstall": 2400 case "ServiceInstall":
2401 this.ParseServiceInstallElement(child, id.Id, win64); 2401 this.ParseServiceInstallElement(child, id.Id, win64);
2402 break; 2402 break;
2403 case "Shortcut": 2403 case "Shortcut":
2404 this.ParseShortcutElement(child, id.Id, node.Name.LocalName, directoryId, YesNoType.No); 2404 this.ParseShortcutElement(child, id.Id, node.Name.LocalName, directoryId, YesNoType.No);
2405 break; 2405 break;
2406 case "SymbolPath": 2406 case "SymbolPath":
2407 symbols.Add(this.ParseSymbolPathElement(child)); 2407 symbols.Add(this.ParseSymbolPathElement(child));
2408 break; 2408 break;
2409 case "TypeLib": 2409 case "TypeLib":
2410 this.ParseTypeLibElement(child, id.Id, null, win64); 2410 this.ParseTypeLibElement(child, id.Id, null, win64);
2411 break; 2411 break;
2412 default: 2412 default:
2413 this.Core.UnexpectedElement(node, child); 2413 this.Core.UnexpectedElement(node, child);
2414 break; 2414 break;
2415 } 2415 }
2416 } 2416 }
2417 else 2417 else
@@ -2605,22 +2605,22 @@ namespace WixToolset.Core
2605 { 2605 {
2606 switch (attrib.Name.LocalName) 2606 switch (attrib.Name.LocalName)
2607 { 2607 {
2608 case "Id": 2608 case "Id":
2609 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 2609 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
2610 break; 2610 break;
2611 case "Directory": 2611 case "Directory":
2612 directoryId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 2612 directoryId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2613 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, directoryId); 2613 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, directoryId);
2614 break; 2614 break;
2615 case "Subdirectory": 2615 case "Subdirectory":
2616 subdirectory = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true); 2616 subdirectory = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true);
2617 break; 2617 break;
2618 case "Source": 2618 case "Source":
2619 source = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 2619 source = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2620 break; 2620 break;
2621 default: 2621 default:
2622 this.Core.UnexpectedAttribute(node, attrib); 2622 this.Core.UnexpectedAttribute(node, attrib);
2623 break; 2623 break;
2624 } 2624 }
2625 } 2625 }
2626 else 2626 else
@@ -2648,24 +2648,24 @@ namespace WixToolset.Core
2648 { 2648 {
2649 switch (child.Name.LocalName) 2649 switch (child.Name.LocalName)
2650 { 2650 {
2651 case "ComponentGroupRef": 2651 case "ComponentGroupRef":
2652 this.ParseComponentGroupRefElement(child, ComplexReferenceParentType.ComponentGroup, id.Id, null); 2652 this.ParseComponentGroupRefElement(child, ComplexReferenceParentType.ComponentGroup, id.Id, null);
2653 break; 2653 break;
2654 case "ComponentRef": 2654 case "ComponentRef":
2655 this.ParseComponentRefElement(child, ComplexReferenceParentType.ComponentGroup, id.Id, null); 2655 this.ParseComponentRefElement(child, ComplexReferenceParentType.ComponentGroup, id.Id, null);
2656 break; 2656 break;
2657 case "Component": 2657 case "Component":
2658 this.ParseComponentElement(child, ComplexReferenceParentType.ComponentGroup, id.Id, null, CompilerConstants.IntegerNotSet, directoryId, source); 2658 this.ParseComponentElement(child, ComplexReferenceParentType.ComponentGroup, id.Id, null, CompilerConstants.IntegerNotSet, directoryId, source);
2659 break; 2659 break;
2660 case "File": 2660 case "File":
2661 this.ParseNakedFileElement(child, ComplexReferenceParentType.ComponentGroup, id.Id, directoryId, source); 2661 this.ParseNakedFileElement(child, ComplexReferenceParentType.ComponentGroup, id.Id, directoryId, source);
2662 break; 2662 break;
2663 case "Files": 2663 case "Files":
2664 this.ParseFilesElement(child, ComplexReferenceParentType.ComponentGroup, id.Id, directoryId, source); 2664 this.ParseFilesElement(child, ComplexReferenceParentType.ComponentGroup, id.Id, directoryId, source);
2665 break; 2665 break;
2666 default: 2666 default:
2667 this.Core.UnexpectedElement(node, child); 2667 this.Core.UnexpectedElement(node, child);
2668 break; 2668 break;
2669 } 2669 }
2670 } 2670 }
2671 else 2671 else
@@ -2707,16 +2707,16 @@ namespace WixToolset.Core
2707 { 2707 {
2708 switch (attrib.Name.LocalName) 2708 switch (attrib.Name.LocalName)
2709 { 2709 {
2710 case "Id": 2710 case "Id":
2711 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 2711 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2712 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.WixComponentGroup, id); 2712 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.WixComponentGroup, id);
2713 break; 2713 break;
2714 case "Primary": 2714 case "Primary":
2715 primary = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 2715 primary = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2716 break; 2716 break;
2717 default: 2717 default:
2718 this.Core.UnexpectedAttribute(node, attrib); 2718 this.Core.UnexpectedAttribute(node, attrib);
2719 break; 2719 break;
2720 } 2720 }
2721 } 2721 }
2722 else 2722 else
@@ -2756,16 +2756,16 @@ namespace WixToolset.Core
2756 { 2756 {
2757 switch (attrib.Name.LocalName) 2757 switch (attrib.Name.LocalName)
2758 { 2758 {
2759 case "Id": 2759 case "Id":
2760 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 2760 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2761 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Component, id); 2761 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Component, id);
2762 break; 2762 break;
2763 case "Primary": 2763 case "Primary":
2764 primary = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 2764 primary = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2765 break; 2765 break;
2766 default: 2766 default:
2767 this.Core.UnexpectedAttribute(node, attrib); 2767 this.Core.UnexpectedAttribute(node, attrib);
2768 break; 2768 break;
2769 } 2769 }
2770 } 2770 }
2771 else 2771 else
@@ -2802,32 +2802,32 @@ namespace WixToolset.Core
2802 { 2802 {
2803 switch (attrib.Name.LocalName) 2803 switch (attrib.Name.LocalName)
2804 { 2804 {
2805 case "Id": 2805 case "Id":
2806 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 2806 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
2807 break;
2808 case "Guid":
2809 componentId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
2810 break;
2811 case "Type":
2812 var typeValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2813 switch (typeValue)
2814 {
2815 case "directory":
2816 type = LocatorType.Directory;
2817 break; 2807 break;
2818 case "file": 2808 case "Guid":
2819 type = LocatorType.Filename; 2809 componentId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
2820 break; 2810 break;
2821 case "": 2811 case "Type":
2812 var typeValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2813 switch (typeValue)
2814 {
2815 case "directory":
2816 type = LocatorType.Directory;
2817 break;
2818 case "file":
2819 type = LocatorType.Filename;
2820 break;
2821 case "":
2822 break;
2823 default:
2824 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, typeValue, "directory", "file"));
2825 break;
2826 }
2822 break; 2827 break;
2823 default: 2828 default:
2824 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, typeValue, "directory", "file")); 2829 this.Core.UnexpectedAttribute(node, attrib);
2825 break; 2830 break;
2826 }
2827 break;
2828 default:
2829 this.Core.UnexpectedAttribute(node, attrib);
2830 break;
2831 } 2831 }
2832 } 2832 }
2833 else 2833 else
@@ -2849,46 +2849,46 @@ namespace WixToolset.Core
2849 { 2849 {
2850 switch (child.Name.LocalName) 2850 switch (child.Name.LocalName)
2851 { 2851 {
2852 case "DirectorySearch": 2852 case "DirectorySearch":
2853 if (oneChild) 2853 if (oneChild)
2854 { 2854 {
2855 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 2855 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
2856 } 2856 }
2857 oneChild = true; 2857 oneChild = true;
2858 2858
2859 // directorysearch parentage should work like directory element, not the rest of the signature type because of the DrLocator.Parent column 2859 // directorysearch parentage should work like directory element, not the rest of the signature type because of the DrLocator.Parent column
2860 signature = this.ParseDirectorySearchElement(child, id.Id); 2860 signature = this.ParseDirectorySearchElement(child, id.Id);
2861 break; 2861 break;
2862 case "DirectorySearchRef": 2862 case "DirectorySearchRef":
2863 if (oneChild) 2863 if (oneChild)
2864 { 2864 {
2865 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 2865 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
2866 } 2866 }
2867 oneChild = true; 2867 oneChild = true;
2868 signature = this.ParseDirectorySearchRefElement(child, id.Id); 2868 signature = this.ParseDirectorySearchRefElement(child, id.Id);
2869 break; 2869 break;
2870 case "FileSearch": 2870 case "FileSearch":
2871 if (oneChild) 2871 if (oneChild)
2872 { 2872 {
2873 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 2873 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
2874 } 2874 }
2875 oneChild = true; 2875 oneChild = true;
2876 signature = this.ParseFileSearchElement(child, id.Id, false, CompilerConstants.IntegerNotSet); 2876 signature = this.ParseFileSearchElement(child, id.Id, false, CompilerConstants.IntegerNotSet);
2877 id = new Identifier(AccessModifier.Section, signature); // FileSearch signatures override parent signatures 2877 id = new Identifier(AccessModifier.Section, signature); // FileSearch signatures override parent signatures
2878 break; 2878 break;
2879 case "FileSearchRef": 2879 case "FileSearchRef":
2880 if (oneChild) 2880 if (oneChild)
2881 { 2881 {
2882 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 2882 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
2883 } 2883 }
2884 oneChild = true; 2884 oneChild = true;
2885 var newId = this.ParseSimpleRefElement(child, SymbolDefinitions.Signature); // FileSearch signatures override parent signatures 2885 var newId = this.ParseSimpleRefElement(child, SymbolDefinitions.Signature); // FileSearch signatures override parent signatures
2886 id = new Identifier(AccessModifier.Section, newId); 2886 id = new Identifier(AccessModifier.Section, newId);
2887 signature = null; 2887 signature = null;
2888 break; 2888 break;
2889 default: 2889 default:
2890 this.Core.UnexpectedElement(node, child); 2890 this.Core.UnexpectedElement(node, child);
2891 break; 2891 break;
2892 } 2892 }
2893 } 2893 }
2894 else 2894 else
@@ -3016,52 +3016,52 @@ namespace WixToolset.Core
3016 { 3016 {
3017 switch (attrib.Name.LocalName) 3017 switch (attrib.Name.LocalName)
3018 { 3018 {
3019 case "Id": 3019 case "Id":
3020 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 3020 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
3021 break; 3021 break;
3022 case "Delete": 3022 case "Delete":
3023 delete = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 3023 delete = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3024 break; 3024 break;
3025 case "DestinationDirectory": 3025 case "DestinationDirectory":
3026 destinationDirectory = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 3026 destinationDirectory = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3027 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, destinationDirectory); 3027 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, destinationDirectory);
3028 break; 3028 break;
3029 case "DestinationSubdirectory": 3029 case "DestinationSubdirectory":
3030 destinationSubdirectory = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true); 3030 destinationSubdirectory = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true);
3031 break; 3031 break;
3032 case "DestinationName": 3032 case "DestinationName":
3033 destinationName = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib); 3033 destinationName = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib);
3034 break; 3034 break;
3035 case "DestinationProperty": 3035 case "DestinationProperty":
3036 destinationProperty = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 3036 destinationProperty = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3037 break; 3037 break;
3038 case "DestinationShortName": 3038 case "DestinationShortName":
3039 destinationShortName = this.Core.GetAttributeShortFilename(sourceLineNumbers, attrib); 3039 destinationShortName = this.Core.GetAttributeShortFilename(sourceLineNumbers, attrib);
3040 break; 3040 break;
3041 case "FileId": 3041 case "FileId":
3042 if (null != fileId) 3042 if (null != fileId)
3043 { 3043 {
3044 this.Core.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); 3044 this.Core.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
3045 } 3045 }
3046 fileId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 3046 fileId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3047 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.File, fileId); 3047 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.File, fileId);
3048 break; 3048 break;
3049 case "SourceDirectory": 3049 case "SourceDirectory":
3050 sourceDirectory = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 3050 sourceDirectory = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3051 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, sourceDirectory); 3051 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, sourceDirectory);
3052 break; 3052 break;
3053 case "SourceSubdirectory": 3053 case "SourceSubdirectory":
3054 sourceSubdirectory = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true); 3054 sourceSubdirectory = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true);
3055 break; 3055 break;
3056 case "SourceName": 3056 case "SourceName":
3057 sourceName = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 3057 sourceName = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3058 break; 3058 break;
3059 case "SourceProperty": 3059 case "SourceProperty":
3060 sourceProperty = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 3060 sourceProperty = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3061 break; 3061 break;
3062 default: 3062 default:
3063 this.Core.UnexpectedAttribute(node, attrib); 3063 this.Core.UnexpectedAttribute(node, attrib);
3064 break; 3064 break;
3065 } 3065 }
3066 } 3066 }
3067 else 3067 else
@@ -3203,233 +3203,233 @@ namespace WixToolset.Core
3203 { 3203 {
3204 switch (attrib.Name.LocalName) 3204 switch (attrib.Name.LocalName)
3205 { 3205 {
3206 case "Id": 3206 case "Id":
3207 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 3207 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
3208 break;
3209 case "BinaryRef":
3210 if (null != source)
3211 {
3212 this.Core.Write(ErrorMessages.CustomActionMultipleSources(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "BinaryRef", "Directory", "FileRef", "Property", "Script"));
3213 }
3214 source = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3215 sourceType = CustomActionSourceType.Binary;
3216 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Binary, source); // add a reference to the appropriate Binary
3217 break;
3218 case "Bitness":
3219 var bitnessValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3220 switch (bitnessValue)
3221 {
3222 case "always32":
3223 explicitWin64 = true;
3224 win64 = false;
3225 break;
3226 case "always64":
3227 explicitWin64 = true;
3228 win64 = true;
3229 break;
3230 case "default":
3231 case "":
3232 break;
3233 default:
3234 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, bitnessValue, "default", "always32", "always64"));
3235 break; 3208 break;
3236 } 3209 case "BinaryRef":
3237 break; 3210 if (null != source)
3238 case "Directory": 3211 {
3239 if (null != source) 3212 this.Core.Write(ErrorMessages.CustomActionMultipleSources(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "BinaryRef", "Directory", "FileRef", "Property", "Script"));
3240 { 3213 }
3241 this.Core.Write(ErrorMessages.CustomActionMultipleSources(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "BinaryKey", "Directory", "FileRef", "Property", "Script")); 3214 source = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3242 } 3215 sourceType = CustomActionSourceType.Binary;
3243 source = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 3216 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Binary, source); // add a reference to the appropriate Binary
3244 sourceType = CustomActionSourceType.Directory;
3245 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, source);
3246 break;
3247 case "DllEntry":
3248 if (null != target)
3249 {
3250 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3251 }
3252 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3253 targetType = CustomActionTargetType.Dll;
3254 break;
3255 case "Error":
3256 if (null != target)
3257 {
3258 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3259 }
3260 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3261 sourceType = CustomActionSourceType.File;
3262 targetType = CustomActionTargetType.TextData;
3263
3264 // The target can be either a formatted error string or a literal
3265 // error number. Try to convert to error number to determine whether
3266 // to add a reference. No need to look at the value.
3267 if (Int32.TryParse(target, out var ignored))
3268 {
3269 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Error, target);
3270 }
3271 break;
3272 case "ExeCommand":
3273 if (null != target)
3274 {
3275 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3276 }
3277 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); // one of the few cases where an empty string value is valid
3278 targetType = CustomActionTargetType.Exe;
3279 break;
3280 case "Execute":
3281 var execute = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3282 switch (execute)
3283 {
3284 case "commit":
3285 executionType = CustomActionExecutionType.Commit;
3286 break; 3217 break;
3287 case "deferred": 3218 case "Bitness":
3288 executionType = CustomActionExecutionType.Deferred; 3219 var bitnessValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3220 switch (bitnessValue)
3221 {
3222 case "always32":
3223 explicitWin64 = true;
3224 win64 = false;
3225 break;
3226 case "always64":
3227 explicitWin64 = true;
3228 win64 = true;
3229 break;
3230 case "default":
3231 case "":
3232 break;
3233 default:
3234 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, bitnessValue, "default", "always32", "always64"));
3235 break;
3236 }
3289 break; 3237 break;
3290 case "firstSequence": 3238 case "Directory":
3291 executionType = CustomActionExecutionType.FirstSequence; 3239 if (null != source)
3240 {
3241 this.Core.Write(ErrorMessages.CustomActionMultipleSources(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "BinaryKey", "Directory", "FileRef", "Property", "Script"));
3242 }
3243 source = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3244 sourceType = CustomActionSourceType.Directory;
3245 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, source);
3292 break; 3246 break;
3293 case "immediate": 3247 case "DllEntry":
3294 executionType = CustomActionExecutionType.Immediate; 3248 if (null != target)
3249 {
3250 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3251 }
3252 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3253 targetType = CustomActionTargetType.Dll;
3295 break; 3254 break;
3296 case "oncePerProcess": 3255 case "Error":
3297 executionType = CustomActionExecutionType.OncePerProcess; 3256 if (null != target)
3257 {
3258 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3259 }
3260 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3261 sourceType = CustomActionSourceType.File;
3262 targetType = CustomActionTargetType.TextData;
3263
3264 // The target can be either a formatted error string or a literal
3265 // error number. Try to convert to error number to determine whether
3266 // to add a reference. No need to look at the value.
3267 if (Int32.TryParse(target, out var ignored))
3268 {
3269 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Error, target);
3270 }
3298 break; 3271 break;
3299 case "rollback": 3272 case "ExeCommand":
3300 executionType = CustomActionExecutionType.Rollback; 3273 if (null != target)
3274 {
3275 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3276 }
3277 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); // one of the few cases where an empty string value is valid
3278 targetType = CustomActionTargetType.Exe;
3301 break; 3279 break;
3302 case "secondSequence": 3280 case "Execute":
3303 executionType = CustomActionExecutionType.ClientRepeat; 3281 var execute = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3282 switch (execute)
3283 {
3284 case "commit":
3285 executionType = CustomActionExecutionType.Commit;
3286 break;
3287 case "deferred":
3288 executionType = CustomActionExecutionType.Deferred;
3289 break;
3290 case "firstSequence":
3291 executionType = CustomActionExecutionType.FirstSequence;
3292 break;
3293 case "immediate":
3294 executionType = CustomActionExecutionType.Immediate;
3295 break;
3296 case "oncePerProcess":
3297 executionType = CustomActionExecutionType.OncePerProcess;
3298 break;
3299 case "rollback":
3300 executionType = CustomActionExecutionType.Rollback;
3301 break;
3302 case "secondSequence":
3303 executionType = CustomActionExecutionType.ClientRepeat;
3304 break;
3305 default:
3306 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, execute, "commit", "deferred", "firstSequence", "immediate", "oncePerProcess", "rollback", "secondSequence"));
3307 break;
3308 }
3304 break; 3309 break;
3305 default: 3310 case "FileRef":
3306 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, execute, "commit", "deferred", "firstSequence", "immediate", "oncePerProcess", "rollback", "secondSequence")); 3311 if (null != source)
3312 {
3313 this.Core.Write(ErrorMessages.CustomActionMultipleSources(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "BinaryRef", "Directory", "FileRef", "Property", "Script"));
3314 }
3315 source = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3316 sourceType = CustomActionSourceType.File;
3317 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.File, source); // add a reference to the appropriate File
3307 break; 3318 break;
3308 } 3319 case "HideTarget":
3309 break; 3320 hidden = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3310 case "FileRef":
3311 if (null != source)
3312 {
3313 this.Core.Write(ErrorMessages.CustomActionMultipleSources(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "BinaryRef", "Directory", "FileRef", "Property", "Script"));
3314 }
3315 source = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3316 sourceType = CustomActionSourceType.File;
3317 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.File, source); // add a reference to the appropriate File
3318 break;
3319 case "HideTarget":
3320 hidden = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3321 break;
3322 case "Impersonate":
3323 impersonate = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3324 break;
3325 case "JScriptCall":
3326 if (null != target)
3327 {
3328 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3329 }
3330 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); // one of the few cases where an empty string value is valid
3331 targetType = CustomActionTargetType.JScript;
3332 break;
3333 case "PatchUninstall":
3334 patchUninstall = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3335 break;
3336 case "Property":
3337 if (null != source)
3338 {
3339 this.Core.Write(ErrorMessages.CustomActionMultipleSources(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "BinaryRef", "Directory", "FileRef", "Property", "Script"));
3340 }
3341 source = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3342 sourceType = CustomActionSourceType.Property;
3343 break;
3344 case "Return":
3345 var returnValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3346 switch (returnValue)
3347 {
3348 case "asyncNoWait":
3349 async = true;
3350 ignoreResult = true;
3351 break; 3321 break;
3352 case "asyncWait": 3322 case "Impersonate":
3353 async = true; 3323 impersonate = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3354 break; 3324 break;
3355 case "check": 3325 case "JScriptCall":
3326 if (null != target)
3327 {
3328 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3329 }
3330 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); // one of the few cases where an empty string value is valid
3331 targetType = CustomActionTargetType.JScript;
3356 break; 3332 break;
3357 case "ignore": 3333 case "PatchUninstall":
3358 ignoreResult = true; 3334 patchUninstall = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3359 break; 3335 break;
3360 case "": 3336 case "Property":
3337 if (null != source)
3338 {
3339 this.Core.Write(ErrorMessages.CustomActionMultipleSources(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "BinaryRef", "Directory", "FileRef", "Property", "Script"));
3340 }
3341 source = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3342 sourceType = CustomActionSourceType.Property;
3361 break; 3343 break;
3362 default: 3344 case "Return":
3363 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, returnValue, "asyncNoWait", "asyncWait", "check", "ignore")); 3345 var returnValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3346 switch (returnValue)
3347 {
3348 case "asyncNoWait":
3349 async = true;
3350 ignoreResult = true;
3351 break;
3352 case "asyncWait":
3353 async = true;
3354 break;
3355 case "check":
3356 break;
3357 case "ignore":
3358 ignoreResult = true;
3359 break;
3360 case "":
3361 break;
3362 default:
3363 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, returnValue, "asyncNoWait", "asyncWait", "check", "ignore"));
3364 break;
3365 }
3364 break; 3366 break;
3365 } 3367 case "Script":
3366 break; 3368 if (null != source)
3367 case "Script": 3369 {
3368 if (null != source) 3370 this.Core.Write(ErrorMessages.CustomActionMultipleSources(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "BinaryRef", "Directory", "FileRef", "Property", "Script"));
3369 { 3371 }
3370 this.Core.Write(ErrorMessages.CustomActionMultipleSources(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "BinaryRef", "Directory", "FileRef", "Property", "Script"));
3371 }
3372 3372
3373 if (null != target) 3373 if (null != target)
3374 { 3374 {
3375 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall")); 3375 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3376 } 3376 }
3377 3377
3378 // set the source and target to empty string for error messages when the user sets multiple sources or targets 3378 // set the source and target to empty string for error messages when the user sets multiple sources or targets
3379 source = String.Empty; 3379 source = String.Empty;
3380 target = String.Empty; 3380 target = String.Empty;
3381 3381
3382 inlineScript = true; 3382 inlineScript = true;
3383 3383
3384 var script = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 3384 var script = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3385 switch (script) 3385 switch (script)
3386 { 3386 {
3387 case "jscript": 3387 case "jscript":
3388 sourceType = CustomActionSourceType.Directory; 3388 sourceType = CustomActionSourceType.Directory;
3389 targetType = CustomActionTargetType.JScript; 3389 targetType = CustomActionTargetType.JScript;
3390 break;
3391 case "vbscript":
3392 sourceType = CustomActionSourceType.Directory;
3393 targetType = CustomActionTargetType.VBScript;
3394 break;
3395 case "":
3396 break;
3397 default:
3398 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, script, "jscript", "vbscript"));
3399 break;
3400 }
3390 break; 3401 break;
3391 case "vbscript": 3402 case "ScriptSourceFile":
3392 sourceType = CustomActionSourceType.Directory; 3403 scriptFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3393 targetType = CustomActionTargetType.VBScript; 3404 break;
3405 case "Subdirectory":
3406 subdirectory = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true);
3394 break; 3407 break;
3395 case "": 3408 case "SuppressModularization":
3409 suppressModularization = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3410 break;
3411 case "TerminalServerAware":
3412 tsAware = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3413 break;
3414 case "Value":
3415 if (null != target)
3416 {
3417 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3418 }
3419 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); // one of the few cases where an empty string value is valid
3420 targetType = CustomActionTargetType.TextData;
3421 break;
3422 case "VBScriptCall":
3423 if (null != target)
3424 {
3425 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3426 }
3427 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); // one of the few cases where an empty string value is valid
3428 targetType = CustomActionTargetType.VBScript;
3396 break; 3429 break;
3397 default: 3430 default:
3398 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, script, "jscript", "vbscript")); 3431 this.Core.UnexpectedAttribute(node, attrib);
3399 break; 3432 break;
3400 }
3401 break;
3402 case "ScriptSourceFile":
3403 scriptFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3404 break;
3405 case "Subdirectory":
3406 subdirectory = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true);
3407 break;
3408 case "SuppressModularization":
3409 suppressModularization = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3410 break;
3411 case "TerminalServerAware":
3412 tsAware = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3413 break;
3414 case "Value":
3415 if (null != target)
3416 {
3417 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3418 }
3419 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); // one of the few cases where an empty string value is valid
3420 targetType = CustomActionTargetType.TextData;
3421 break;
3422 case "VBScriptCall":
3423 if (null != target)
3424 {
3425 this.Core.Write(ErrorMessages.CustomActionMultipleTargets(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, "DllEntry", "Error", "ExeCommand", "JScriptCall", "Script", "Value", "VBScriptCall"));
3426 }
3427 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); // one of the few cases where an empty string value is valid
3428 targetType = CustomActionTargetType.VBScript;
3429 break;
3430 default:
3431 this.Core.UnexpectedAttribute(node, attrib);
3432 break;
3433 } 3433 }
3434 } 3434 }
3435 else 3435 else
@@ -3600,13 +3600,13 @@ namespace WixToolset.Core
3600 { 3600 {
3601 switch (attrib.Name.LocalName) 3601 switch (attrib.Name.LocalName)
3602 { 3602 {
3603 case "Id": 3603 case "Id":
3604 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 3604 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3605 this.Core.CreateSimpleReference(sourceLineNumbers, symbolDefinition.Name, id); 3605 this.Core.CreateSimpleReference(sourceLineNumbers, symbolDefinition.Name, id);
3606 break; 3606 break;
3607 default: 3607 default:
3608 this.Core.UnexpectedAttribute(node, attrib); 3608 this.Core.UnexpectedAttribute(node, attrib);
3609 break; 3609 break;
3610 } 3610 }
3611 } 3611 }
3612 else 3612 else
@@ -3643,15 +3643,15 @@ namespace WixToolset.Core
3643 { 3643 {
3644 switch (attrib.Name.LocalName) 3644 switch (attrib.Name.LocalName)
3645 { 3645 {
3646 case "Id": 3646 case "Id":
3647 primaryKeys[0] = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 3647 primaryKeys[0] = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3648 break; 3648 break;
3649 case "ProductCode": 3649 case "ProductCode":
3650 primaryKeys[1] = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 3650 primaryKeys[1] = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3651 break; 3651 break;
3652 default: 3652 default:
3653 this.Core.UnexpectedAttribute(node, attrib); 3653 this.Core.UnexpectedAttribute(node, attrib);
3654 break; 3654 break;
3655 } 3655 }
3656 } 3656 }
3657 else 3657 else
@@ -3690,12 +3690,12 @@ namespace WixToolset.Core
3690 { 3690 {
3691 switch (attrib.Name.LocalName) 3691 switch (attrib.Name.LocalName)
3692 { 3692 {
3693 case "Id": 3693 case "Id":
3694 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 3694 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3695 break; 3695 break;
3696 default: 3696 default:
3697 this.Core.UnexpectedAttribute(node, attrib); 3697 this.Core.UnexpectedAttribute(node, attrib);
3698 break; 3698 break;
3699 } 3699 }
3700 } 3700 }
3701 else 3701 else
@@ -3744,49 +3744,49 @@ namespace WixToolset.Core
3744 { 3744 {
3745 switch (attrib.Name.LocalName) 3745 switch (attrib.Name.LocalName)
3746 { 3746 {
3747 case "Id": 3747 case "Id":
3748 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 3748 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
3749 break; 3749 break;
3750 case "ComponentGuidGenerationSeed": 3750 case "ComponentGuidGenerationSeed":
3751 componentGuidGenerationSeed = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 3751 componentGuidGenerationSeed = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
3752 break; 3752 break;
3753 case "DiskId": 3753 case "DiskId":
3754 diskId = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue); 3754 diskId = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue);
3755 break; 3755 break;
3756 case "FileSource": 3756 case "FileSource":
3757 fileSource = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 3757 fileSource = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3758 fileSourceAttribSet = true; 3758 fileSourceAttribSet = true;
3759 break; 3759 break;
3760 case "Name": 3760 case "Name":
3761 if ("." == attrib.Value) 3761 if ("." == attrib.Value)
3762 { 3762 {
3763 name = attrib.Value; 3763 name = attrib.Value;
3764 } 3764 }
3765 else 3765 else
3766 { 3766 {
3767 name = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true); 3767 name = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true);
3768 } 3768 }
3769 nameAttribute = attrib; 3769 nameAttribute = attrib;
3770 break; 3770 break;
3771 case "ShortName": 3771 case "ShortName":
3772 shortName = this.Core.GetAttributeShortFilename(sourceLineNumbers, attrib, false); 3772 shortName = this.Core.GetAttributeShortFilename(sourceLineNumbers, attrib, false);
3773 break; 3773 break;
3774 case "ShortSourceName": 3774 case "ShortSourceName":
3775 shortSourceName = this.Core.GetAttributeShortFilename(sourceLineNumbers, attrib, false); 3775 shortSourceName = this.Core.GetAttributeShortFilename(sourceLineNumbers, attrib, false);
3776 break; 3776 break;
3777 case "SourceName": 3777 case "SourceName":
3778 if ("." == attrib.Value) 3778 if ("." == attrib.Value)
3779 { 3779 {
3780 sourceName = attrib.Value; 3780 sourceName = attrib.Value;
3781 } 3781 }
3782 else 3782 else
3783 { 3783 {
3784 sourceName = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, false); 3784 sourceName = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, false);
3785 } 3785 }
3786 break; 3786 break;
3787 default: 3787 default:
3788 this.Core.UnexpectedAttribute(node, attrib); 3788 this.Core.UnexpectedAttribute(node, attrib);
3789 break; 3789 break;
3790 } 3790 }
3791 } 3791 }
3792 else 3792 else
@@ -3880,34 +3880,34 @@ namespace WixToolset.Core
3880 { 3880 {
3881 switch (child.Name.LocalName) 3881 switch (child.Name.LocalName)
3882 { 3882 {
3883 case "Component": 3883 case "Component":
3884 this.ParseComponentElement(child, ComplexReferenceParentType.Unknown, null, null, diskId, id.Id, fileSource); 3884 this.ParseComponentElement(child, ComplexReferenceParentType.Unknown, null, null, diskId, id.Id, fileSource);
3885 break; 3885 break;
3886 case "Directory": 3886 case "Directory":
3887 this.ParseDirectoryElement(child, id.Id, diskId, fileSource); 3887 this.ParseDirectoryElement(child, id.Id, diskId, fileSource);
3888 break; 3888 break;
3889 case "File": 3889 case "File":
3890 this.ParseNakedFileElement(child, ComplexReferenceParentType.Unknown, null, id.Id, fileSource); 3890 this.ParseNakedFileElement(child, ComplexReferenceParentType.Unknown, null, id.Id, fileSource);
3891 break; 3891 break;
3892 case "Files": 3892 case "Files":
3893 this.ParseFilesElement(child, ComplexReferenceParentType.Unknown, null, id.Id, fileSource); 3893 this.ParseFilesElement(child, ComplexReferenceParentType.Unknown, null, id.Id, fileSource);
3894 break; 3894 break;
3895 case "Merge": 3895 case "Merge":
3896 this.ParseMergeElement(child, id.Id, diskId); 3896 this.ParseMergeElement(child, id.Id, diskId);
3897 break; 3897 break;
3898 case "SymbolPath": 3898 case "SymbolPath":
3899 if (null != symbols) 3899 if (null != symbols)
3900 { 3900 {
3901 symbols += ";" + this.ParseSymbolPathElement(child); 3901 symbols += ";" + this.ParseSymbolPathElement(child);
3902 } 3902 }
3903 else 3903 else
3904 { 3904 {
3905 symbols = this.ParseSymbolPathElement(child); 3905 symbols = this.ParseSymbolPathElement(child);
3906 } 3906 }
3907 break; 3907 break;
3908 default: 3908 default:
3909 this.Core.UnexpectedElement(node, child); 3909 this.Core.UnexpectedElement(node, child);
3910 break; 3910 break;
3911 } 3911 }
3912 } 3912 }
3913 else 3913 else
@@ -3957,19 +3957,19 @@ namespace WixToolset.Core
3957 { 3957 {
3958 switch (attrib.Name.LocalName) 3958 switch (attrib.Name.LocalName)
3959 { 3959 {
3960 case "Id": 3960 case "Id":
3961 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 3961 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3962 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, id); 3962 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, id);
3963 break; 3963 break;
3964 case "DiskId": 3964 case "DiskId":
3965 diskId = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue); 3965 diskId = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue);
3966 break; 3966 break;
3967 case "FileSource": 3967 case "FileSource":
3968 fileSource = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 3968 fileSource = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3969 break; 3969 break;
3970 default: 3970 default:
3971 this.Core.UnexpectedAttribute(node, attrib); 3971 this.Core.UnexpectedAttribute(node, attrib);
3972 break; 3972 break;
3973 } 3973 }
3974 } 3974 }
3975 else 3975 else
@@ -4002,24 +4002,24 @@ namespace WixToolset.Core
4002 { 4002 {
4003 switch (child.Name.LocalName) 4003 switch (child.Name.LocalName)
4004 { 4004 {
4005 case "Component": 4005 case "Component":
4006 this.ParseComponentElement(child, ComplexReferenceParentType.Unknown, null, null, diskId, id, fileSource); 4006 this.ParseComponentElement(child, ComplexReferenceParentType.Unknown, null, null, diskId, id, fileSource);
4007 break; 4007 break;
4008 case "Directory": 4008 case "Directory":
4009 this.ParseDirectoryElement(child, id, diskId, fileSource); 4009 this.ParseDirectoryElement(child, id, diskId, fileSource);
4010 break; 4010 break;
4011 case "File": 4011 case "File":
4012 this.ParseNakedFileElement(child, ComplexReferenceParentType.Unknown, null, id, fileSource); 4012 this.ParseNakedFileElement(child, ComplexReferenceParentType.Unknown, null, id, fileSource);
4013 break; 4013 break;
4014 case "Files": 4014 case "Files":
4015 this.ParseFilesElement(child, ComplexReferenceParentType.Unknown, null, id, fileSource); 4015 this.ParseFilesElement(child, ComplexReferenceParentType.Unknown, null, id, fileSource);
4016 break; 4016 break;
4017 case "Merge": 4017 case "Merge":
4018 this.ParseMergeElement(child, id, diskId); 4018 this.ParseMergeElement(child, id, diskId);
4019 break; 4019 break;
4020 default: 4020 default:
4021 this.Core.UnexpectedElement(node, child); 4021 this.Core.UnexpectedElement(node, child);
4022 break; 4022 break;
4023 } 4023 }
4024 } 4024 }
4025 else 4025 else
@@ -4049,21 +4049,21 @@ namespace WixToolset.Core
4049 { 4049 {
4050 switch (attrib.Name.LocalName) 4050 switch (attrib.Name.LocalName)
4051 { 4051 {
4052 case "Id": 4052 case "Id":
4053 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 4053 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
4054 break; 4054 break;
4055 case "Depth": 4055 case "Depth":
4056 depth = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue); 4056 depth = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue);
4057 break; 4057 break;
4058 case "Path": 4058 case "Path":
4059 path = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 4059 path = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4060 break; 4060 break;
4061 case "AssignToProperty": 4061 case "AssignToProperty":
4062 assignToProperty = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 4062 assignToProperty = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
4063 break; 4063 break;
4064 default: 4064 default:
4065 this.Core.UnexpectedAttribute(node, attrib); 4065 this.Core.UnexpectedAttribute(node, attrib);
4066 break; 4066 break;
4067 } 4067 }
4068 } 4068 }
4069 else 4069 else
@@ -4088,42 +4088,42 @@ namespace WixToolset.Core
4088 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); 4088 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child);
4089 switch (child.Name.LocalName) 4089 switch (child.Name.LocalName)
4090 { 4090 {
4091 case "DirectorySearch": 4091 case "DirectorySearch":
4092 if (oneChild) 4092 if (oneChild)
4093 { 4093 {
4094 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName)); 4094 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName));
4095 } 4095 }
4096 oneChild = true; 4096 oneChild = true;
4097 signature = this.ParseDirectorySearchElement(child, id.Id); 4097 signature = this.ParseDirectorySearchElement(child, id.Id);
4098 break; 4098 break;
4099 case "DirectorySearchRef": 4099 case "DirectorySearchRef":
4100 if (oneChild) 4100 if (oneChild)
4101 { 4101 {
4102 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName)); 4102 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName));
4103 } 4103 }
4104 oneChild = true; 4104 oneChild = true;
4105 signature = this.ParseDirectorySearchRefElement(child, id.Id); 4105 signature = this.ParseDirectorySearchRefElement(child, id.Id);
4106 break; 4106 break;
4107 case "FileSearch": 4107 case "FileSearch":
4108 if (oneChild) 4108 if (oneChild)
4109 { 4109 {
4110 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 4110 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
4111 } 4111 }
4112 oneChild = true; 4112 oneChild = true;
4113 hasFileSearch = true; 4113 hasFileSearch = true;
4114 signature = this.ParseFileSearchElement(child, id.Id, assignToProperty, depth); 4114 signature = this.ParseFileSearchElement(child, id.Id, assignToProperty, depth);
4115 break; 4115 break;
4116 case "FileSearchRef": 4116 case "FileSearchRef":
4117 if (oneChild) 4117 if (oneChild)
4118 { 4118 {
4119 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 4119 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
4120 } 4120 }
4121 oneChild = true; 4121 oneChild = true;
4122 signature = this.ParseSimpleRefElement(child, SymbolDefinitions.Signature); 4122 signature = this.ParseSimpleRefElement(child, SymbolDefinitions.Signature);
4123 break; 4123 break;
4124 default: 4124 default:
4125 this.Core.UnexpectedElement(node, child); 4125 this.Core.UnexpectedElement(node, child);
4126 break; 4126 break;
4127 } 4127 }
4128 4128
4129 // If AssignToProperty is set, only a FileSearch 4129 // If AssignToProperty is set, only a FileSearch
@@ -4199,18 +4199,18 @@ namespace WixToolset.Core
4199 { 4199 {
4200 switch (attrib.Name.LocalName) 4200 switch (attrib.Name.LocalName)
4201 { 4201 {
4202 case "Id": 4202 case "Id":
4203 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 4203 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
4204 break; 4204 break;
4205 case "Parent": 4205 case "Parent":
4206 parent = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 4206 parent = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
4207 break; 4207 break;
4208 case "Path": 4208 case "Path":
4209 path = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 4209 path = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4210 break; 4210 break;
4211 default: 4211 default:
4212 this.Core.UnexpectedAttribute(node, attrib); 4212 this.Core.UnexpectedAttribute(node, attrib);
4213 break; 4213 break;
4214 } 4214 }
4215 } 4215 }
4216 else 4216 else
@@ -4246,41 +4246,41 @@ namespace WixToolset.Core
4246 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); 4246 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child);
4247 switch (child.Name.LocalName) 4247 switch (child.Name.LocalName)
4248 { 4248 {
4249 case "DirectorySearch": 4249 case "DirectorySearch":
4250 if (oneChild) 4250 if (oneChild)
4251 { 4251 {
4252 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName)); 4252 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName));
4253 } 4253 }
4254 oneChild = true; 4254 oneChild = true;
4255 signature = this.ParseDirectorySearchElement(child, id.Id); 4255 signature = this.ParseDirectorySearchElement(child, id.Id);
4256 break; 4256 break;
4257 case "DirectorySearchRef": 4257 case "DirectorySearchRef":
4258 if (oneChild) 4258 if (oneChild)
4259 { 4259 {
4260 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName)); 4260 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName));
4261 } 4261 }
4262 oneChild = true; 4262 oneChild = true;
4263 signature = this.ParseDirectorySearchRefElement(child, id.Id); 4263 signature = this.ParseDirectorySearchRefElement(child, id.Id);
4264 break; 4264 break;
4265 case "FileSearch": 4265 case "FileSearch":
4266 if (oneChild) 4266 if (oneChild)
4267 { 4267 {
4268 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName)); 4268 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName));
4269 } 4269 }
4270 oneChild = true; 4270 oneChild = true;
4271 signature = this.ParseFileSearchElement(child, id.Id, false, CompilerConstants.IntegerNotSet); 4271 signature = this.ParseFileSearchElement(child, id.Id, false, CompilerConstants.IntegerNotSet);
4272 break; 4272 break;
4273 case "FileSearchRef": 4273 case "FileSearchRef":
4274 if (oneChild) 4274 if (oneChild)
4275 { 4275 {
4276 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 4276 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
4277 } 4277 }
4278 oneChild = true; 4278 oneChild = true;
4279 signature = this.ParseSimpleRefElement(child, SymbolDefinitions.Signature); 4279 signature = this.ParseSimpleRefElement(child, SymbolDefinitions.Signature);
4280 break; 4280 break;
4281 default: 4281 default:
4282 this.Core.UnexpectedElement(node, child); 4282 this.Core.UnexpectedElement(node, child);
4283 break; 4283 break;
4284 } 4284 }
4285 } 4285 }
4286 else 4286 else
@@ -4324,80 +4324,80 @@ namespace WixToolset.Core
4324 { 4324 {
4325 switch (attrib.Name.LocalName) 4325 switch (attrib.Name.LocalName)
4326 { 4326 {
4327 case "Id": 4327 case "Id":
4328 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 4328 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
4329 break;
4330 case "AllowAbsent":
4331 disallowAbsent = (this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) == YesNoType.No);
4332 break;
4333 case "AllowAdvertise":
4334 disallowAdvertise = (this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) == YesNoType.No);
4335 break;
4336 case "ConfigurableDirectory":
4337 configurableDirectory = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
4338 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, configurableDirectory);
4339 break;
4340 case "Description":
4341 description = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4342 break;
4343 case "Display":
4344 displayValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4345 break;
4346 case "InstallDefault":
4347 var installDefaultValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4348 switch (installDefaultValue)
4349 {
4350 case "followParent":
4351 if (ComplexReferenceParentType.Product == parentType)
4352 {
4353 this.Core.Write(ErrorMessages.RootFeatureCannotFollowParent(sourceLineNumbers));
4354 }
4355 //bits = bits | MsiInterop.MsidbFeatureAttributesFollowParent;
4356 installDefault = FeatureInstallDefault.FollowParent;
4357 break; 4329 break;
4358 case "local": // this is the default 4330 case "AllowAbsent":
4359 installDefault = FeatureInstallDefault.Local; 4331 disallowAbsent = (this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) == YesNoType.No);
4360 break; 4332 break;
4361 case "source": 4333 case "AllowAdvertise":
4362 //bits = bits | MsiInterop.MsidbFeatureAttributesFavorSource; 4334 disallowAdvertise = (this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) == YesNoType.No);
4363 installDefault = FeatureInstallDefault.Source;
4364 break; 4335 break;
4365 case "": 4336 case "ConfigurableDirectory":
4337 configurableDirectory = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
4338 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, configurableDirectory);
4366 break; 4339 break;
4367 default: 4340 case "Description":
4368 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, installDefaultValue, "followParent", "local", "source")); 4341 description = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4369 break; 4342 break;
4370 } 4343 case "Display":
4371 break; 4344 displayValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4372 case "Level":
4373 level = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue);
4374 break;
4375 case "Title":
4376 title = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4377 if ("PUT-FEATURE-TITLE-HERE" == title)
4378 {
4379 this.Core.Write(WarningMessages.PlaceholderValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, title));
4380 }
4381 break;
4382 case "TypicalDefault":
4383 var typicalValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4384 switch (typicalValue)
4385 {
4386 case "advertise":
4387 //bits |= MsiInterop.MsidbFeatureAttributesFavorAdvertise;
4388 typicalDefault = FeatureTypicalDefault.Advertise;
4389 break; 4345 break;
4390 case "install": // this is the default 4346 case "InstallDefault":
4391 typicalDefault = FeatureTypicalDefault.Install; 4347 var installDefaultValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4348 switch (installDefaultValue)
4349 {
4350 case "followParent":
4351 if (ComplexReferenceParentType.Product == parentType)
4352 {
4353 this.Core.Write(ErrorMessages.RootFeatureCannotFollowParent(sourceLineNumbers));
4354 }
4355 //bits = bits | MsiInterop.MsidbFeatureAttributesFollowParent;
4356 installDefault = FeatureInstallDefault.FollowParent;
4357 break;
4358 case "local": // this is the default
4359 installDefault = FeatureInstallDefault.Local;
4360 break;
4361 case "source":
4362 //bits = bits | MsiInterop.MsidbFeatureAttributesFavorSource;
4363 installDefault = FeatureInstallDefault.Source;
4364 break;
4365 case "":
4366 break;
4367 default:
4368 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, installDefaultValue, "followParent", "local", "source"));
4369 break;
4370 }
4371 break;
4372 case "Level":
4373 level = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue);
4374 break;
4375 case "Title":
4376 title = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4377 if ("PUT-FEATURE-TITLE-HERE" == title)
4378 {
4379 this.Core.Write(WarningMessages.PlaceholderValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, title));
4380 }
4381 break;
4382 case "TypicalDefault":
4383 var typicalValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4384 switch (typicalValue)
4385 {
4386 case "advertise":
4387 //bits |= MsiInterop.MsidbFeatureAttributesFavorAdvertise;
4388 typicalDefault = FeatureTypicalDefault.Advertise;
4389 break;
4390 case "install": // this is the default
4391 typicalDefault = FeatureTypicalDefault.Install;
4392 break;
4393 default:
4394 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, typicalValue, "advertise", "install"));
4395 break;
4396 }
4392 break; 4397 break;
4393 default: 4398 default:
4394 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, typicalValue, "advertise", "install")); 4399 this.Core.UnexpectedAttribute(node, attrib);
4395 break; 4400 break;
4396 }
4397 break;
4398 default:
4399 this.Core.UnexpectedAttribute(node, attrib);
4400 break;
4401 } 4401 }
4402 } 4402 }
4403 else 4403 else
@@ -4433,39 +4433,39 @@ namespace WixToolset.Core
4433 { 4433 {
4434 switch (child.Name.LocalName) 4434 switch (child.Name.LocalName)
4435 { 4435 {
4436 case "ComponentGroupRef": 4436 case "ComponentGroupRef":
4437 this.ParseComponentGroupRefElement(child, ComplexReferenceParentType.Feature, id.Id, null); 4437 this.ParseComponentGroupRefElement(child, ComplexReferenceParentType.Feature, id.Id, null);
4438 break; 4438 break;
4439 case "ComponentRef": 4439 case "ComponentRef":
4440 this.ParseComponentRefElement(child, ComplexReferenceParentType.Feature, id.Id, null); 4440 this.ParseComponentRefElement(child, ComplexReferenceParentType.Feature, id.Id, null);
4441 break; 4441 break;
4442 case "Component": 4442 case "Component":
4443 this.ParseComponentElement(child, ComplexReferenceParentType.Feature, id.Id, null, CompilerConstants.IntegerNotSet, null, null); 4443 this.ParseComponentElement(child, ComplexReferenceParentType.Feature, id.Id, null, CompilerConstants.IntegerNotSet, null, null);
4444 break; 4444 break;
4445 case "Feature": 4445 case "Feature":
4446 this.ParseFeatureElement(child, ComplexReferenceParentType.Feature, id.Id, ref childDisplay); 4446 this.ParseFeatureElement(child, ComplexReferenceParentType.Feature, id.Id, ref childDisplay);
4447 break; 4447 break;
4448 case "FeatureGroupRef": 4448 case "FeatureGroupRef":
4449 this.ParseFeatureGroupRefElement(child, ComplexReferenceParentType.Feature, id.Id); 4449 this.ParseFeatureGroupRefElement(child, ComplexReferenceParentType.Feature, id.Id);
4450 break; 4450 break;
4451 case "FeatureRef": 4451 case "FeatureRef":
4452 this.ParseFeatureRefElement(child, ComplexReferenceParentType.Feature, id.Id); 4452 this.ParseFeatureRefElement(child, ComplexReferenceParentType.Feature, id.Id);
4453 break; 4453 break;
4454 case "File": 4454 case "File":
4455 this.ParseNakedFileElement(child, ComplexReferenceParentType.Feature, id.Id, null, null); 4455 this.ParseNakedFileElement(child, ComplexReferenceParentType.Feature, id.Id, null, null);
4456 break; 4456 break;
4457 case "Files": 4457 case "Files":
4458 this.ParseFilesElement(child, ComplexReferenceParentType.Feature, id.Id, null, null); 4458 this.ParseFilesElement(child, ComplexReferenceParentType.Feature, id.Id, null, null);
4459 break; 4459 break;
4460 case "Level": 4460 case "Level":
4461 this.ParseLevelElement(child, id.Id); 4461 this.ParseLevelElement(child, id.Id);
4462 break; 4462 break;
4463 case "MergeRef": 4463 case "MergeRef":
4464 this.ParseMergeRefElement(child, ComplexReferenceParentType.Feature, id.Id); 4464 this.ParseMergeRefElement(child, ComplexReferenceParentType.Feature, id.Id);
4465 break; 4465 break;
4466 default: 4466 default:
4467 this.Core.UnexpectedElement(node, child); 4467 this.Core.UnexpectedElement(node, child);
4468 break; 4468 break;
4469 } 4469 }
4470 } 4470 }
4471 else 4471 else
@@ -4477,31 +4477,31 @@ namespace WixToolset.Core
4477 int display; 4477 int display;
4478 switch (displayValue) 4478 switch (displayValue)
4479 { 4479 {
4480 case "collapse": 4480 case "collapse":
4481 lastDisplay = (lastDisplay | 1) + 1; 4481 lastDisplay = (lastDisplay | 1) + 1;
4482 display = lastDisplay; 4482 display = lastDisplay;
4483 break; 4483 break;
4484 case "expand": 4484 case "expand":
4485 lastDisplay = (lastDisplay + 1) | 1; 4485 lastDisplay = (lastDisplay + 1) | 1;
4486 display = lastDisplay; 4486 display = lastDisplay;
4487 break; 4487 break;
4488 case "hidden": 4488 case "hidden":
4489 display = 0; 4489 display = 0;
4490 break; 4490 break;
4491 default: 4491 default:
4492 if (!Int32.TryParse(displayValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out display)) 4492 if (!Int32.TryParse(displayValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out display))
4493 {
4494 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Display", displayValue, "collapse", "expand", "hidden"));
4495 }
4496 else
4497 {
4498 // Save the display value (if its not hidden) for subsequent rows
4499 if (0 != display)
4500 { 4493 {
4501 lastDisplay = display; 4494 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Display", displayValue, "collapse", "expand", "hidden"));
4502 } 4495 }
4503 } 4496 else
4504 break; 4497 {
4498 // Save the display value (if its not hidden) for subsequent rows
4499 if (0 != display)
4500 {
4501 lastDisplay = display;
4502 }
4503 }
4504 break;
4505 } 4505 }
4506 4506
4507 if (!this.Core.EncounteredError) 4507 if (!this.Core.EncounteredError)
@@ -4545,16 +4545,16 @@ namespace WixToolset.Core
4545 { 4545 {
4546 switch (attrib.Name.LocalName) 4546 switch (attrib.Name.LocalName)
4547 { 4547 {
4548 case "Id": 4548 case "Id":
4549 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 4549 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
4550 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Feature, id); 4550 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Feature, id);
4551 break; 4551 break;
4552 case "IgnoreParent": 4552 case "IgnoreParent":
4553 ignoreParent = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 4553 ignoreParent = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
4554 break; 4554 break;
4555 default: 4555 default:
4556 this.Core.UnexpectedAttribute(node, attrib); 4556 this.Core.UnexpectedAttribute(node, attrib);
4557 break; 4557 break;
4558 } 4558 }
4559 } 4559 }
4560 else 4560 else
@@ -4576,39 +4576,39 @@ namespace WixToolset.Core
4576 { 4576 {
4577 switch (child.Name.LocalName) 4577 switch (child.Name.LocalName)
4578 { 4578 {
4579 case "ComponentGroupRef": 4579 case "ComponentGroupRef":
4580 this.ParseComponentGroupRefElement(child, ComplexReferenceParentType.Feature, id, null); 4580 this.ParseComponentGroupRefElement(child, ComplexReferenceParentType.Feature, id, null);
4581 break; 4581 break;
4582 case "ComponentRef": 4582 case "ComponentRef":
4583 this.ParseComponentRefElement(child, ComplexReferenceParentType.Feature, id, null); 4583 this.ParseComponentRefElement(child, ComplexReferenceParentType.Feature, id, null);
4584 break; 4584 break;
4585 case "Component": 4585 case "Component":
4586 this.ParseComponentElement(child, ComplexReferenceParentType.Feature, id, null, CompilerConstants.IntegerNotSet, null, null); 4586 this.ParseComponentElement(child, ComplexReferenceParentType.Feature, id, null, CompilerConstants.IntegerNotSet, null, null);
4587 break; 4587 break;
4588 case "Feature": 4588 case "Feature":
4589 this.ParseFeatureElement(child, ComplexReferenceParentType.Feature, id, ref lastDisplay); 4589 this.ParseFeatureElement(child, ComplexReferenceParentType.Feature, id, ref lastDisplay);
4590 break; 4590 break;
4591 case "FeatureGroup": 4591 case "FeatureGroup":
4592 this.ParseFeatureGroupElement(child, ComplexReferenceParentType.Feature, id); 4592 this.ParseFeatureGroupElement(child, ComplexReferenceParentType.Feature, id);
4593 break; 4593 break;
4594 case "FeatureGroupRef": 4594 case "FeatureGroupRef":
4595 this.ParseFeatureGroupRefElement(child, ComplexReferenceParentType.Feature, id); 4595 this.ParseFeatureGroupRefElement(child, ComplexReferenceParentType.Feature, id);
4596 break; 4596 break;
4597 case "FeatureRef": 4597 case "FeatureRef":
4598 this.ParseFeatureRefElement(child, ComplexReferenceParentType.Feature, id); 4598 this.ParseFeatureRefElement(child, ComplexReferenceParentType.Feature, id);
4599 break; 4599 break;
4600 case "File": 4600 case "File":
4601 this.ParseNakedFileElement(child, ComplexReferenceParentType.Feature, id, null, null); 4601 this.ParseNakedFileElement(child, ComplexReferenceParentType.Feature, id, null, null);
4602 break; 4602 break;
4603 case "Files": 4603 case "Files":
4604 this.ParseFilesElement(child, ComplexReferenceParentType.Feature, id, null, null); 4604 this.ParseFilesElement(child, ComplexReferenceParentType.Feature, id, null, null);
4605 break; 4605 break;
4606 case "MergeRef": 4606 case "MergeRef":
4607 this.ParseMergeRefElement(child, ComplexReferenceParentType.Feature, id); 4607 this.ParseMergeRefElement(child, ComplexReferenceParentType.Feature, id);
4608 break; 4608 break;
4609 default: 4609 default:
4610 this.Core.UnexpectedElement(node, child); 4610 this.Core.UnexpectedElement(node, child);
4611 break; 4611 break;
4612 } 4612 }
4613 } 4613 }
4614 else 4614 else
@@ -4643,12 +4643,12 @@ namespace WixToolset.Core
4643 { 4643 {
4644 switch (attrib.Name.LocalName) 4644 switch (attrib.Name.LocalName)
4645 { 4645 {
4646 case "Id": 4646 case "Id":
4647 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 4647 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
4648 break; 4648 break;
4649 default: 4649 default:
4650 this.Core.UnexpectedAttribute(node, attrib); 4650 this.Core.UnexpectedAttribute(node, attrib);
4651 break; 4651 break;
4652 } 4652 }
4653 } 4653 }
4654 else 4654 else
@@ -4670,36 +4670,36 @@ namespace WixToolset.Core
4670 { 4670 {
4671 switch (child.Name.LocalName) 4671 switch (child.Name.LocalName)
4672 { 4672 {
4673 case "ComponentGroupRef": 4673 case "ComponentGroupRef":
4674 this.ParseComponentGroupRefElement(child, ComplexReferenceParentType.FeatureGroup, id.Id, null); 4674 this.ParseComponentGroupRefElement(child, ComplexReferenceParentType.FeatureGroup, id.Id, null);
4675 break; 4675 break;
4676 case "ComponentRef": 4676 case "ComponentRef":
4677 this.ParseComponentRefElement(child, ComplexReferenceParentType.FeatureGroup, id.Id, null); 4677 this.ParseComponentRefElement(child, ComplexReferenceParentType.FeatureGroup, id.Id, null);
4678 break; 4678 break;
4679 case "Component": 4679 case "Component":
4680 this.ParseComponentElement(child, ComplexReferenceParentType.FeatureGroup, id.Id, null, CompilerConstants.IntegerNotSet, null, null); 4680 this.ParseComponentElement(child, ComplexReferenceParentType.FeatureGroup, id.Id, null, CompilerConstants.IntegerNotSet, null, null);
4681 break; 4681 break;
4682 case "Feature": 4682 case "Feature":
4683 this.ParseFeatureElement(child, ComplexReferenceParentType.FeatureGroup, id.Id, ref lastDisplay); 4683 this.ParseFeatureElement(child, ComplexReferenceParentType.FeatureGroup, id.Id, ref lastDisplay);
4684 break; 4684 break;
4685 case "FeatureGroupRef": 4685 case "FeatureGroupRef":
4686 this.ParseFeatureGroupRefElement(child, ComplexReferenceParentType.FeatureGroup, id.Id); 4686 this.ParseFeatureGroupRefElement(child, ComplexReferenceParentType.FeatureGroup, id.Id);
4687 break; 4687 break;
4688 case "FeatureRef": 4688 case "FeatureRef":
4689 this.ParseFeatureRefElement(child, ComplexReferenceParentType.FeatureGroup, id.Id); 4689 this.ParseFeatureRefElement(child, ComplexReferenceParentType.FeatureGroup, id.Id);
4690 break; 4690 break;
4691 case "File": 4691 case "File":
4692 this.ParseNakedFileElement(child, ComplexReferenceParentType.FeatureGroup, id.Id, null, null); 4692 this.ParseNakedFileElement(child, ComplexReferenceParentType.FeatureGroup, id.Id, null, null);
4693 break; 4693 break;
4694 case "Files": 4694 case "Files":
4695 this.ParseFilesElement(child, ComplexReferenceParentType.Feature, id.Id, null, null); 4695 this.ParseFilesElement(child, ComplexReferenceParentType.Feature, id.Id, null, null);
4696 break; 4696 break;
4697 case "MergeRef": 4697 case "MergeRef":
4698 this.ParseMergeRefElement(child, ComplexReferenceParentType.FeatureGroup, id.Id); 4698 this.ParseMergeRefElement(child, ComplexReferenceParentType.FeatureGroup, id.Id);
4699 break; 4699 break;
4700 default: 4700 default:
4701 this.Core.UnexpectedElement(node, child); 4701 this.Core.UnexpectedElement(node, child);
4702 break; 4702 break;
4703 } 4703 }
4704 } 4704 }
4705 else 4705 else
@@ -4738,19 +4738,19 @@ namespace WixToolset.Core
4738 { 4738 {
4739 switch (attrib.Name.LocalName) 4739 switch (attrib.Name.LocalName)
4740 { 4740 {
4741 case "Id": 4741 case "Id":
4742 id = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 4742 id = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4743 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.WixFeatureGroup, id); 4743 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.WixFeatureGroup, id);
4744 break; 4744 break;
4745 case "IgnoreParent": 4745 case "IgnoreParent":
4746 ignoreParent = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 4746 ignoreParent = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
4747 break; 4747 break;
4748 case "Primary": 4748 case "Primary":
4749 primary = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 4749 primary = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
4750 break; 4750 break;
4751 default: 4751 default:
4752 this.Core.UnexpectedAttribute(node, attrib); 4752 this.Core.UnexpectedAttribute(node, attrib);
4753 break; 4753 break;
4754 } 4754 }
4755 } 4755 }
4756 else 4756 else
@@ -4798,65 +4798,65 @@ namespace WixToolset.Core
4798 { 4798 {
4799 switch (attrib.Name.LocalName) 4799 switch (attrib.Name.LocalName)
4800 { 4800 {
4801 case "Id": 4801 case "Id":
4802 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 4802 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
4803 break;
4804 case "Action":
4805 var actionValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4806 switch (actionValue)
4807 {
4808 case "create":
4809 action = EnvironmentActionType.Create;
4810 break; 4803 break;
4811 case "set": 4804 case "Action":
4812 action = EnvironmentActionType.Set; 4805 var actionValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4806 switch (actionValue)
4807 {
4808 case "create":
4809 action = EnvironmentActionType.Create;
4810 break;
4811 case "set":
4812 action = EnvironmentActionType.Set;
4813 break;
4814 case "remove":
4815 action = EnvironmentActionType.Remove;
4816 break;
4817 default:
4818 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, value, "create", "set", "remove"));
4819 break;
4820 }
4813 break; 4821 break;
4814 case "remove": 4822 case "Name":
4815 action = EnvironmentActionType.Remove; 4823 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4816 break; 4824 break;
4817 default: 4825 case "Part":
4818 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, value, "create", "set", "remove")); 4826 var partValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4827 switch (partValue)
4828 {
4829 case "all":
4830 part = EnvironmentPartType.All;
4831 break;
4832 case "first":
4833 part = EnvironmentPartType.First;
4834 break;
4835 case "last":
4836 part = EnvironmentPartType.Last;
4837 break;
4838 case "":
4839 break;
4840 default:
4841 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Part", partValue, "all", "first", "last"));
4842 break;
4843 }
4819 break; 4844 break;
4820 } 4845 case "Permanent":
4821 break; 4846 permanent = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
4822 case "Name":
4823 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4824 break;
4825 case "Part":
4826 var partValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4827 switch (partValue)
4828 {
4829 case "all":
4830 part = EnvironmentPartType.All;
4831 break; 4847 break;
4832 case "first": 4848 case "Separator":
4833 part = EnvironmentPartType.First; 4849 separator = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4834 break; 4850 break;
4835 case "last": 4851 case "System":
4836 part = EnvironmentPartType.Last; 4852 system = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
4837 break; 4853 break;
4838 case "": 4854 case "Value":
4855 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4839 break; 4856 break;
4840 default: 4857 default:
4841 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Part", partValue, "all", "first", "last")); 4858 this.Core.UnexpectedAttribute(node, attrib);
4842 break; 4859 break;
4843 }
4844 break;
4845 case "Permanent":
4846 permanent = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
4847 break;
4848 case "Separator":
4849 separator = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4850 break;
4851 case "System":
4852 system = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
4853 break;
4854 case "Value":
4855 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4856 break;
4857 default:
4858 this.Core.UnexpectedAttribute(node, attrib);
4859 break;
4860 } 4860 }
4861 } 4861 }
4862 else 4862 else
@@ -4939,15 +4939,15 @@ namespace WixToolset.Core
4939 { 4939 {
4940 switch (attrib.Name.LocalName) 4940 switch (attrib.Name.LocalName)
4941 { 4941 {
4942 case "Id": 4942 case "Id":
4943 id = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue); 4943 id = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue);
4944 break; 4944 break;
4945 case "Message": 4945 case "Message":
4946 message = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); 4946 message = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty);
4947 break; 4947 break;
4948 default: 4948 default:
4949 this.Core.UnexpectedAttribute(node, attrib); 4949 this.Core.UnexpectedAttribute(node, attrib);
4950 break; 4950 break;
4951 } 4951 }
4952 } 4952 }
4953 else 4953 else
@@ -4992,23 +4992,23 @@ namespace WixToolset.Core
4992 { 4992 {
4993 switch (attrib.Name.LocalName) 4993 switch (attrib.Name.LocalName)
4994 { 4994 {
4995 case "Id": 4995 case "Id":
4996 extension = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 4996 extension = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
4997 break; 4997 break;
4998 case "Advertise": 4998 case "Advertise":
4999 var extensionAdvertise = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 4999 var extensionAdvertise = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
5000 if ((YesNoType.No == advertise && YesNoType.Yes == extensionAdvertise) || (YesNoType.Yes == advertise && YesNoType.No == extensionAdvertise)) 5000 if ((YesNoType.No == advertise && YesNoType.Yes == extensionAdvertise) || (YesNoType.Yes == advertise && YesNoType.No == extensionAdvertise))
5001 { 5001 {
5002 this.Core.Write(ErrorMessages.AdvertiseStateMustMatch(sourceLineNumbers, extensionAdvertise.ToString(), advertise.ToString())); 5002 this.Core.Write(ErrorMessages.AdvertiseStateMustMatch(sourceLineNumbers, extensionAdvertise.ToString(), advertise.ToString()));
5003 } 5003 }
5004 advertise = extensionAdvertise; 5004 advertise = extensionAdvertise;
5005 break; 5005 break;
5006 case "ContentType": 5006 case "ContentType":
5007 mime = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 5007 mime = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5008 break; 5008 break;
5009 default: 5009 default:
5010 this.Core.UnexpectedAttribute(node, attrib); 5010 this.Core.UnexpectedAttribute(node, attrib);
5011 break; 5011 break;
5012 } 5012 }
5013 } 5013 }
5014 else 5014 else
@@ -5029,19 +5029,19 @@ namespace WixToolset.Core
5029 { 5029 {
5030 switch (child.Name.LocalName) 5030 switch (child.Name.LocalName)
5031 { 5031 {
5032 case "Verb": 5032 case "Verb":
5033 this.ParseVerbElement(child, extension, progId, componentId, advertise); 5033 this.ParseVerbElement(child, extension, progId, componentId, advertise);
5034 break; 5034 break;
5035 case "MIME": 5035 case "MIME":
5036 var newMime = this.ParseMIMEElement(child, extension, componentId, advertise); 5036 var newMime = this.ParseMIMEElement(child, extension, componentId, advertise);
5037 if (null != newMime && null == mime) 5037 if (null != newMime && null == mime)
5038 { 5038 {
5039 mime = newMime; 5039 mime = newMime;
5040 } 5040 }
5041 break; 5041 break;
5042 default: 5042 default:
5043 this.Core.UnexpectedElement(node, child); 5043 this.Core.UnexpectedElement(node, child);
5044 break; 5044 break;
5045 } 5045 }
5046 } 5046 }
5047 else 5047 else
@@ -5207,175 +5207,175 @@ namespace WixToolset.Core
5207 { 5207 {
5208 switch (attrib.Name.LocalName) 5208 switch (attrib.Name.LocalName)
5209 { 5209 {
5210 case "Id": 5210 case "Id":
5211 case "Name": 5211 case "Name":
5212 case "ShortName": 5212 case "ShortName":
5213 case "Source": 5213 case "Source":
5214 // Handled in ParseFileNamingAttributes 5214 // Handled in ParseFileNamingAttributes
5215 break; 5215 break;
5216 5216
5217 case "Bitness": 5217 case "Bitness":
5218 case "Condition": 5218 case "Condition":
5219 case "Directory": 5219 case "Directory":
5220 case "Subdirectory": 5220 case "Subdirectory":
5221 // Naked files handle their attributes in ParseNakedFileElement. 5221 // Naked files handle their attributes in ParseNakedFileElement.
5222 if (!isNakedFile) 5222 if (!isNakedFile)
5223 { 5223 {
5224 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, attrib.Name.LocalName)); 5224 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, attrib.Name.LocalName));
5225 } 5225 }
5226 break;
5227 case "Assembly":
5228 var assemblyValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5229 switch (assemblyValue)
5230 {
5231 case ".net":
5232 assemblyType = AssemblyType.DotNetAssembly;
5233 break; 5226 break;
5234 case "no": 5227 case "Assembly":
5235 assemblyType = AssemblyType.NotAnAssembly; 5228 var assemblyValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5229 switch (assemblyValue)
5230 {
5231 case ".net":
5232 assemblyType = AssemblyType.DotNetAssembly;
5233 break;
5234 case "no":
5235 assemblyType = AssemblyType.NotAnAssembly;
5236 break;
5237 case "win32":
5238 assemblyType = AssemblyType.Win32Assembly;
5239 break;
5240 default:
5241 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "File", "Assembly", assemblyValue, "no", "win32", ".net"));
5242 break;
5243 }
5236 break; 5244 break;
5237 case "win32": 5245 case "AssemblyApplication":
5238 assemblyType = AssemblyType.Win32Assembly; 5246 assemblyApplication = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
5247 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.File, assemblyApplication);
5239 break; 5248 break;
5240 default: 5249 case "AssemblyManifest":
5241 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "File", "Assembly", assemblyValue, "no", "win32", ".net")); 5250 assemblyManifest = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
5251 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.File, assemblyManifest);
5242 break; 5252 break;
5243 } 5253 case "BindPath":
5244 break; 5254 bindPath = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty);
5245 case "AssemblyApplication": 5255 break;
5246 assemblyApplication = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 5256 case "Checksum":
5247 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.File, assemblyApplication); 5257 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
5248 break; 5258 {
5249 case "AssemblyManifest": 5259 checksum = true;
5250 assemblyManifest = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 5260 //bits |= MsiInterop.MsidbFileAttributesChecksum;
5251 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.File, assemblyManifest); 5261 }
5252 break; 5262 break;
5253 case "BindPath": 5263 case "CompanionFile":
5254 bindPath = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); 5264 companionFile = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
5255 break; 5265 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.File, companionFile);
5256 case "Checksum": 5266 break;
5257 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) 5267 case "Compressed":
5258 { 5268 var compressedValue = this.Core.GetAttributeYesNoDefaultValue(sourceLineNumbers, attrib);
5259 checksum = true; 5269 if (YesNoDefaultType.Yes == compressedValue)
5260 //bits |= MsiInterop.MsidbFileAttributesChecksum; 5270 {
5261 } 5271 compressed = true;
5262 break; 5272 //bits |= MsiInterop.MsidbFileAttributesCompressed;
5263 case "CompanionFile": 5273 }
5264 companionFile = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 5274 else if (YesNoDefaultType.No == compressedValue)
5265 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.File, companionFile); 5275 {
5266 break; 5276 compressed = false;
5267 case "Compressed": 5277 //bits |= MsiInterop.MsidbFileAttributesNoncompressed;
5268 var compressedValue = this.Core.GetAttributeYesNoDefaultValue(sourceLineNumbers, attrib); 5278 }
5269 if (YesNoDefaultType.Yes == compressedValue) 5279 break;
5270 { 5280 case "DefaultLanguage":
5271 compressed = true; 5281 defaultLanguage = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5272 //bits |= MsiInterop.MsidbFileAttributesCompressed; 5282 break;
5273 } 5283 case "DefaultSize":
5274 else if (YesNoDefaultType.No == compressedValue) 5284 defaultSize = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue);
5275 { 5285 break;
5276 compressed = false; 5286 case "DefaultVersion":
5277 //bits |= MsiInterop.MsidbFileAttributesNoncompressed; 5287 defaultVersion = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5278 } 5288 break;
5279 break; 5289 case "DiskId":
5280 case "DefaultLanguage": 5290 diskId = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue);
5281 defaultLanguage = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 5291 break;
5282 break; 5292 case "FontTitle":
5283 case "DefaultSize": 5293 fontTitle = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5284 defaultSize = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue); 5294 break;
5285 break; 5295 case "Hidden":
5286 case "DefaultVersion": 5296 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
5287 defaultVersion = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 5297 {
5288 break; 5298 hidden = true;
5289 case "DiskId": 5299 //bits |= MsiInterop.MsidbFileAttributesHidden;
5290 diskId = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue); 5300 }
5291 break; 5301 break;
5292 case "FontTitle": 5302 case "KeyPath":
5293 fontTitle = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 5303 keyPath = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
5294 break;
5295 case "Hidden":
5296 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
5297 {
5298 hidden = true;
5299 //bits |= MsiInterop.MsidbFileAttributesHidden;
5300 }
5301 break;
5302 case "KeyPath":
5303 keyPath = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
5304 break;
5305 case "PatchGroup":
5306 patchGroup = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int32.MaxValue);
5307 break;
5308 case "PatchIgnore":
5309 patchIgnore = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
5310 break;
5311 case "PatchWholeFile":
5312 patchIncludeWholeFile = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
5313 break;
5314 case "PatchAllowIgnoreOnError":
5315 patchAllowIgnoreOnError = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
5316 break;
5317 case "ProcessorArchitecture":
5318 var procArchValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5319 switch (procArchValue)
5320 {
5321 case "msil":
5322 procArch = "MSIL";
5323 break; 5304 break;
5324 case "x86": 5305 case "PatchGroup":
5325 procArch = "x86"; 5306 patchGroup = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int32.MaxValue);
5326 break; 5307 break;
5327 case "x64": 5308 case "PatchIgnore":
5328 procArch = "amd64"; 5309 patchIgnore = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
5329 break; 5310 break;
5330 case "arm64": 5311 case "PatchWholeFile":
5331 procArch = "arm64"; 5312 patchIncludeWholeFile = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
5332 break; 5313 break;
5333 case "": 5314 case "PatchAllowIgnoreOnError":
5315 patchAllowIgnoreOnError = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
5316 break;
5317 case "ProcessorArchitecture":
5318 var procArchValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5319 switch (procArchValue)
5320 {
5321 case "msil":
5322 procArch = "MSIL";
5323 break;
5324 case "x86":
5325 procArch = "x86";
5326 break;
5327 case "x64":
5328 procArch = "amd64";
5329 break;
5330 case "arm64":
5331 procArch = "arm64";
5332 break;
5333 case "":
5334 break;
5335 default:
5336 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "File", "ProcessorArchitecture", procArchValue, "msil", "x86", "x64"));
5337 break;
5338 }
5339 break;
5340 case "ReadOnly":
5341 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
5342 {
5343 readOnly = true;
5344 //bits |= MsiInterop.MsidbFileAttributesReadOnly;
5345 }
5346 break;
5347 case "SelfRegCost":
5348 selfRegCost = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue);
5349 break;
5350 case "System":
5351 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
5352 {
5353 system = true;
5354 //bits |= MsiInterop.MsidbFileAttributesSystem;
5355 }
5356 break;
5357 case "TrueType":
5358 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
5359 {
5360 fontTitle = String.Empty;
5361 }
5362 break;
5363 case "Vital":
5364 var isVital = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
5365 if (YesNoType.Yes == isVital)
5366 {
5367 vital = true;
5368 //bits |= MsiInterop.MsidbFileAttributesVital;
5369 }
5370 else if (YesNoType.No == isVital)
5371 {
5372 vital = false;
5373 //bits &= ~MsiInterop.MsidbFileAttributesVital;
5374 }
5334 break; 5375 break;
5335 default: 5376 default:
5336 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "File", "ProcessorArchitecture", procArchValue, "msil", "x86", "x64")); 5377 this.Core.UnexpectedAttribute(node, attrib);
5337 break; 5378 break;
5338 }
5339 break;
5340 case "ReadOnly":
5341 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
5342 {
5343 readOnly = true;
5344 //bits |= MsiInterop.MsidbFileAttributesReadOnly;
5345 }
5346 break;
5347 case "SelfRegCost":
5348 selfRegCost = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue);
5349 break;
5350 case "System":
5351 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
5352 {
5353 system = true;
5354 //bits |= MsiInterop.MsidbFileAttributesSystem;
5355 }
5356 break;
5357 case "TrueType":
5358 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
5359 {
5360 fontTitle = String.Empty;
5361 }
5362 break;
5363 case "Vital":
5364 var isVital = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
5365 if (YesNoType.Yes == isVital)
5366 {
5367 vital = true;
5368 //bits |= MsiInterop.MsidbFileAttributesVital;
5369 }
5370 else if (YesNoType.No == isVital)
5371 {
5372 vital = false;
5373 //bits &= ~MsiInterop.MsidbFileAttributesVital;
5374 }
5375 break;
5376 default:
5377 this.Core.UnexpectedAttribute(node, attrib);
5378 break;
5379 } 5379 }
5380 } 5380 }
5381 else 5381 else
@@ -5528,55 +5528,55 @@ namespace WixToolset.Core
5528 { 5528 {
5529 switch (child.Name.LocalName) 5529 switch (child.Name.LocalName)
5530 { 5530 {
5531 case "AppId": 5531 case "AppId":
5532 this.ParseAppIdElement(child, componentId, YesNoType.NotSet, id.Id, null, null); 5532 this.ParseAppIdElement(child, componentId, YesNoType.NotSet, id.Id, null, null);
5533 break; 5533 break;
5534 case "AssemblyName": 5534 case "AssemblyName":
5535 this.ParseAssemblyName(child, componentId); 5535 this.ParseAssemblyName(child, componentId);
5536 break; 5536 break;
5537 case "Class": 5537 case "Class":
5538 this.ParseClassElement(child, componentId, YesNoType.NotSet, id.Id, null, null, null); 5538 this.ParseClassElement(child, componentId, YesNoType.NotSet, id.Id, null, null, null);
5539 break; 5539 break;
5540 case "CopyFile": 5540 case "CopyFile":
5541 this.ParseCopyFileElement(child, componentId, id.Id); 5541 this.ParseCopyFileElement(child, componentId, id.Id);
5542 break; 5542 break;
5543 case "IgnoreRange": 5543 case "IgnoreRange":
5544 this.ParseRangeElement(child, ref ignoreOffsets, ref ignoreLengths); 5544 this.ParseRangeElement(child, ref ignoreOffsets, ref ignoreLengths);
5545 break; 5545 break;
5546 case "ODBCDriver": 5546 case "ODBCDriver":
5547 this.ParseODBCDriverOrTranslator(child, componentId, id.Id, SymbolDefinitionType.ODBCDriver); 5547 this.ParseODBCDriverOrTranslator(child, componentId, id.Id, SymbolDefinitionType.ODBCDriver);
5548 break; 5548 break;
5549 case "ODBCTranslator": 5549 case "ODBCTranslator":
5550 this.ParseODBCDriverOrTranslator(child, componentId, id.Id, SymbolDefinitionType.ODBCTranslator); 5550 this.ParseODBCDriverOrTranslator(child, componentId, id.Id, SymbolDefinitionType.ODBCTranslator);
5551 break; 5551 break;
5552 case "Permission": 5552 case "Permission":
5553 this.ParsePermissionElement(child, id.Id, "File"); 5553 this.ParsePermissionElement(child, id.Id, "File");
5554 break; 5554 break;
5555 case "PermissionEx": 5555 case "PermissionEx":
5556 this.ParsePermissionExElement(child, id.Id, "File"); 5556 this.ParsePermissionExElement(child, id.Id, "File");
5557 break; 5557 break;
5558 case "ProtectRange": 5558 case "ProtectRange":
5559 this.ParseRangeElement(child, ref protectOffsets, ref protectLengths); 5559 this.ParseRangeElement(child, ref protectOffsets, ref protectLengths);
5560 break; 5560 break;
5561 case "Shortcut": 5561 case "Shortcut":
5562 this.ParseShortcutElement(child, componentId, node.Name.LocalName, id.Id, keyPath); 5562 this.ParseShortcutElement(child, componentId, node.Name.LocalName, id.Id, keyPath);
5563 break; 5563 break;
5564 case "SymbolPath": 5564 case "SymbolPath":
5565 if (null != symbols) 5565 if (null != symbols)
5566 { 5566 {
5567 symbols += ";" + this.ParseSymbolPathElement(child); 5567 symbols += ";" + this.ParseSymbolPathElement(child);
5568 } 5568 }
5569 else 5569 else
5570 { 5570 {
5571 symbols = this.ParseSymbolPathElement(child); 5571 symbols = this.ParseSymbolPathElement(child);
5572 } 5572 }
5573 break; 5573 break;
5574 case "TypeLib": 5574 case "TypeLib":
5575 this.ParseTypeLibElement(child, componentId, id.Id, win64Component); 5575 this.ParseTypeLibElement(child, componentId, id.Id, win64Component);
5576 break; 5576 break;
5577 default: 5577 default:
5578 this.Core.UnexpectedElement(node, child); 5578 this.Core.UnexpectedElement(node, child);
5579 break; 5579 break;
5580 } 5580 }
5581 } 5581 }
5582 else 5582 else
@@ -5652,34 +5652,34 @@ namespace WixToolset.Core
5652 { 5652 {
5653 switch (attrib.Name.LocalName) 5653 switch (attrib.Name.LocalName)
5654 { 5654 {
5655 case "Bitness": 5655 case "Bitness":
5656 var bitnessValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 5656 var bitnessValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5657 switch (bitnessValue) 5657 switch (bitnessValue)
5658 { 5658 {
5659 case "always32": 5659 case "always32":
5660 win64 = false; 5660 win64 = false;
5661 break; 5661 break;
5662 case "always64": 5662 case "always64":
5663 win64 = true; 5663 win64 = true;
5664 break; 5664 break;
5665 case "default": 5665 case "default":
5666 case "": 5666 case "":
5667 break; 5667 break;
5668 default: 5668 default:
5669 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, bitnessValue, "default", "always32", "always64")); 5669 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, bitnessValue, "default", "always32", "always64"));
5670 break; 5670 break;
5671 } 5671 }
5672 break; 5672 break;
5673 case "Condition": 5673 case "Condition":
5674 condition = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 5674 condition = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5675 break; 5675 break;
5676 case "Directory": 5676 case "Directory":
5677 directoryId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 5677 directoryId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
5678 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, directoryId); 5678 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Directory, directoryId);
5679 break; 5679 break;
5680 case "Subdirectory": 5680 case "Subdirectory":
5681 subdirectory = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true); 5681 subdirectory = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, allowRelative: true);
5682 break; 5682 break;
5683 } 5683 }
5684 } 5684 }
5685 } 5685 }
@@ -5700,42 +5700,45 @@ namespace WixToolset.Core
5700 5700
5701 this.ParseFileElementOtherAttributes(node, id.Id, directoryId, diskId: CompilerConstants.IntegerNotSet, id, name, shortName, source, out var _, componentGuid: "*", isNakedFile: true, fileSymbol: out var fileSymbol, assemblySymbol: out var assemblySymbol); 5701 this.ParseFileElementOtherAttributes(node, id.Id, directoryId, diskId: CompilerConstants.IntegerNotSet, id, name, shortName, source, out var _, componentGuid: "*", isNakedFile: true, fileSymbol: out var fileSymbol, assemblySymbol: out var assemblySymbol);
5702 5702
5703 this.Core.AddSymbol(fileSymbol); 5703 if (!this.Core.EncounteredError)
5704
5705 this.Core.AddSymbol(new ComponentSymbol(sourceLineNumbers, id)
5706 { 5704 {
5707 ComponentId = "*", 5705 this.Core.AddSymbol(fileSymbol);
5708 DirectoryRef = directoryId, 5706
5709 Location = ComponentLocation.LocalOnly, 5707 this.Core.AddSymbol(new ComponentSymbol(sourceLineNumbers, id)
5710 Condition = condition, 5708 {
5711 KeyPath = id.Id, 5709 ComponentId = "*",
5712 KeyPathType = ComponentKeyPathType.File, 5710 DirectoryRef = directoryId,
5713 DisableRegistryReflection = false, 5711 Location = ComponentLocation.LocalOnly,
5714 NeverOverwrite = false, 5712 Condition = condition,
5715 Permanent = false, 5713 KeyPath = id.Id,
5716 SharedDllRefCount = false, 5714 KeyPathType = ComponentKeyPathType.File,
5717 Shared = false, 5715 DisableRegistryReflection = false,
5718 Transitive = false, 5716 NeverOverwrite = false,
5719 UninstallWhenSuperseded = false, 5717 Permanent = false,
5720 Win64 = win64, 5718 SharedDllRefCount = false,
5721 }); 5719 Shared = false,
5720 Transitive = false,
5721 UninstallWhenSuperseded = false,
5722 Win64 = win64,
5723 });
5722 5724
5723 if (assemblySymbol != null) 5725 if (assemblySymbol != null)
5724 { 5726 {
5725 this.Core.AddSymbol(assemblySymbol); 5727 this.Core.AddSymbol(assemblySymbol);
5726 } 5728 }
5727 5729
5728 this.ParseFileElementChildren(node, fileSymbol, keyPath: YesNoType.Yes, win64); 5730 this.ParseFileElementChildren(node, fileSymbol, keyPath: YesNoType.Yes, win64);
5729 5731
5730 // if this is a module, automatically add this component to the references to ensure it gets in the ModuleComponents table 5732 // if this is a module, automatically add this component to the references to ensure it gets in the ModuleComponents table
5731 if (this.compilingModule) 5733 if (this.compilingModule)
5732 { 5734 {
5733 this.Core.CreateComplexReference(sourceLineNumbers, ComplexReferenceParentType.Module, this.activeName, this.activeLanguage, ComplexReferenceChildType.Component, fileSymbol.Id.Id, false); 5735 this.Core.CreateComplexReference(sourceLineNumbers, ComplexReferenceParentType.Module, this.activeName, this.activeLanguage, ComplexReferenceChildType.Component, fileSymbol.Id.Id, false);
5734 } 5736 }
5735 else if (ComplexReferenceParentType.Unknown != parentType && null != parentId) // if parent was provided, add a complex reference to that. 5737 else if (ComplexReferenceParentType.Unknown != parentType && null != parentId) // if parent was provided, add a complex reference to that.
5736 { 5738 {
5737 // If the naked file's component is defined directly under a feature, then mark the complex reference primary. 5739 // If the naked file's component is defined directly under a feature, then mark the complex reference primary.
5738 this.Core.CreateComplexReference(sourceLineNumbers, parentType, parentId, null, ComplexReferenceChildType.Component, id.Id, ComplexReferenceParentType.Feature == parentType); 5740 this.Core.CreateComplexReference(sourceLineNumbers, parentType, parentId, null, ComplexReferenceChildType.Component, id.Id, ComplexReferenceParentType.Feature == parentType);
5741 }
5739 } 5742 }
5740 } 5743 }
5741 } 5744 }
@@ -5892,39 +5895,39 @@ namespace WixToolset.Core
5892 { 5895 {
5893 switch (attrib.Name.LocalName) 5896 switch (attrib.Name.LocalName)
5894 { 5897 {
5895 case "Id": 5898 case "Id":
5896 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 5899 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
5897 break; 5900 break;
5898 case "Name": 5901 case "Name":
5899 name = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, false); 5902 name = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, false);
5900 break; 5903 break;
5901 case "MinVersion": 5904 case "MinVersion":
5902 minVersion = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 5905 minVersion = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5903 break; 5906 break;
5904 case "MaxVersion": 5907 case "MaxVersion":
5905 maxVersion = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 5908 maxVersion = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5906 break; 5909 break;
5907 case "MinSize": 5910 case "MinSize":
5908 minSize = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue); 5911 minSize = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue);
5909 break; 5912 break;
5910 case "MaxSize": 5913 case "MaxSize":
5911 maxSize = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue); 5914 maxSize = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue);
5912 break; 5915 break;
5913 case "MinDate": 5916 case "MinDate":
5914 minDate = this.Core.GetAttributeDateTimeValue(sourceLineNumbers, attrib); 5917 minDate = this.Core.GetAttributeDateTimeValue(sourceLineNumbers, attrib);
5915 break; 5918 break;
5916 case "MaxDate": 5919 case "MaxDate":
5917 maxDate = this.Core.GetAttributeDateTimeValue(sourceLineNumbers, attrib); 5920 maxDate = this.Core.GetAttributeDateTimeValue(sourceLineNumbers, attrib);
5918 break; 5921 break;
5919 case "Languages": 5922 case "Languages":
5920 languages = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 5923 languages = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
5921 break; 5924 break;
5922 case "ShortName": 5925 case "ShortName":
5923 shortName = this.Core.GetAttributeShortFilename(sourceLineNumbers, attrib, false); 5926 shortName = this.Core.GetAttributeShortFilename(sourceLineNumbers, attrib, false);
5924 break; 5927 break;
5925 default: 5928 default:
5926 this.Core.UnexpectedAttribute(node, attrib); 5929 this.Core.UnexpectedAttribute(node, attrib);
5927 break; 5930 break;
5928 } 5931 }
5929 } 5932 }
5930 else 5933 else
@@ -6067,12 +6070,12 @@ namespace WixToolset.Core
6067 { 6070 {
6068 switch (attrib.Name.LocalName) 6071 switch (attrib.Name.LocalName)
6069 { 6072 {
6070 case "Id": 6073 case "Id":
6071 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 6074 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
6072 break; 6075 break;
6073 default: 6076 default:
6074 this.Core.UnexpectedAttribute(node, attrib); 6077 this.Core.UnexpectedAttribute(node, attrib);
6075 break; 6078 break;
6076 } 6079 }
6077 } 6080 }
6078 else 6081 else
@@ -6092,181 +6095,181 @@ namespace WixToolset.Core
6092 { 6095 {
6093 switch (child.Name.LocalName) 6096 switch (child.Name.LocalName)
6094 { 6097 {
6095 case "_locDefinition": 6098 case "_locDefinition":
6096 break; 6099 break;
6097 case "AdminExecuteSequence": 6100 case "AdminExecuteSequence":
6098 this.ParseSequenceElement(child, SequenceTable.AdminExecuteSequence); 6101 this.ParseSequenceElement(child, SequenceTable.AdminExecuteSequence);
6099 break; 6102 break;
6100 case "AdminUISequence": 6103 case "AdminUISequence":
6101 this.ParseSequenceElement(child, SequenceTable.AdminUISequence); 6104 this.ParseSequenceElement(child, SequenceTable.AdminUISequence);
6102 break; 6105 break;
6103 case "AdvertiseExecuteSequence": 6106 case "AdvertiseExecuteSequence":
6104 this.ParseSequenceElement(child, SequenceTable.AdvertiseExecuteSequence); 6107 this.ParseSequenceElement(child, SequenceTable.AdvertiseExecuteSequence);
6105 break; 6108 break;
6106 case "InstallExecuteSequence": 6109 case "InstallExecuteSequence":
6107 this.ParseSequenceElement(child, SequenceTable.InstallExecuteSequence); 6110 this.ParseSequenceElement(child, SequenceTable.InstallExecuteSequence);
6108 break; 6111 break;
6109 case "InstallUISequence": 6112 case "InstallUISequence":
6110 this.ParseSequenceElement(child, SequenceTable.InstallUISequence); 6113 this.ParseSequenceElement(child, SequenceTable.InstallUISequence);
6111 break; 6114 break;
6112 case "AppId": 6115 case "AppId":
6113 this.ParseAppIdElement(child, null, YesNoType.Yes, null, null, null); 6116 this.ParseAppIdElement(child, null, YesNoType.Yes, null, null, null);
6114 break; 6117 break;
6115 case "Binary": 6118 case "Binary":
6116 this.ParseBinaryElement(child); 6119 this.ParseBinaryElement(child);
6117 break; 6120 break;
6118 case "BootstrapperApplication": 6121 case "BootstrapperApplication":
6119 this.ParseBootstrapperApplicationElement(child); 6122 this.ParseBootstrapperApplicationElement(child);
6120 break; 6123 break;
6121 case "BootstrapperApplicationRef": 6124 case "BootstrapperApplicationRef":
6122 this.ParseBootstrapperApplicationRefElement(child); 6125 this.ParseBootstrapperApplicationRefElement(child);
6123 break; 6126 break;
6124 case "BundleCustomData": 6127 case "BundleCustomData":
6125 this.ParseBundleCustomDataElement(child); 6128 this.ParseBundleCustomDataElement(child);
6126 break; 6129 break;
6127 case "BundleCustomDataRef": 6130 case "BundleCustomDataRef":
6128 this.ParseBundleCustomDataRefElement(child); 6131 this.ParseBundleCustomDataRefElement(child);
6129 break; 6132 break;
6130 case "BootstrapperExtension": 6133 case "BootstrapperExtension":
6131 this.ParseBootstrapperExtensionElement(child); 6134 this.ParseBootstrapperExtensionElement(child);
6132 break; 6135 break;
6133 case "BootstrapperExtensionRef": 6136 case "BootstrapperExtensionRef":
6134 this.ParseSimpleRefElement(child, SymbolDefinitions.WixBootstrapperExtension); 6137 this.ParseSimpleRefElement(child, SymbolDefinitions.WixBootstrapperExtension);
6135 break; 6138 break;
6136 case "ComplianceCheck": 6139 case "ComplianceCheck":
6137 this.ParseComplianceCheckElement(child); 6140 this.ParseComplianceCheckElement(child);
6138 break; 6141 break;
6139 case "Component": 6142 case "Component":
6140 this.ParseComponentElement(child, ComplexReferenceParentType.Unknown, null, null, CompilerConstants.IntegerNotSet, null, null); 6143 this.ParseComponentElement(child, ComplexReferenceParentType.Unknown, null, null, CompilerConstants.IntegerNotSet, null, null);
6141 break; 6144 break;
6142 case "ComponentGroup": 6145 case "ComponentGroup":
6143 this.ParseComponentGroupElement(child, ComplexReferenceParentType.Unknown, id?.Id); 6146 this.ParseComponentGroupElement(child, ComplexReferenceParentType.Unknown, id?.Id);
6144 break; 6147 break;
6145 case "Container": 6148 case "Container":
6146 this.ParseContainerElement(child); 6149 this.ParseContainerElement(child);
6147 break; 6150 break;
6148 case "CustomAction": 6151 case "CustomAction":
6149 this.ParseCustomActionElement(child); 6152 this.ParseCustomActionElement(child);
6150 break; 6153 break;
6151 case "CustomActionRef": 6154 case "CustomActionRef":
6152 this.ParseSimpleRefElement(child, SymbolDefinitions.CustomAction); 6155 this.ParseSimpleRefElement(child, SymbolDefinitions.CustomAction);
6153 break; 6156 break;
6154 case "CustomTable": 6157 case "CustomTable":
6155 this.ParseCustomTableElement(child); 6158 this.ParseCustomTableElement(child);
6156 break; 6159 break;
6157 case "CustomTableRef": 6160 case "CustomTableRef":
6158 this.ParseCustomTableRefElement(child); 6161 this.ParseCustomTableRefElement(child);
6159 break; 6162 break;
6160 case "Directory": 6163 case "Directory":
6161 this.ParseDirectoryElement(child, null, CompilerConstants.IntegerNotSet, String.Empty); 6164 this.ParseDirectoryElement(child, null, CompilerConstants.IntegerNotSet, String.Empty);
6162 break; 6165 break;
6163 case "DirectoryRef": 6166 case "DirectoryRef":
6164 this.ParseDirectoryRefElement(child); 6167 this.ParseDirectoryRefElement(child);
6165 break; 6168 break;
6166 case "EmbeddedChainer": 6169 case "EmbeddedChainer":
6167 this.ParseEmbeddedChainerElement(child); 6170 this.ParseEmbeddedChainerElement(child);
6168 break; 6171 break;
6169 case "EmbeddedChainerRef": 6172 case "EmbeddedChainerRef":
6170 this.ParseSimpleRefElement(child, SymbolDefinitions.MsiEmbeddedChainer); 6173 this.ParseSimpleRefElement(child, SymbolDefinitions.MsiEmbeddedChainer);
6171 break; 6174 break;
6172 case "EnsureTable": 6175 case "EnsureTable":
6173 this.ParseEnsureTableElement(child); 6176 this.ParseEnsureTableElement(child);
6174 break; 6177 break;
6175 case "Feature": 6178 case "Feature":
6176 this.ParseFeatureElement(child, ComplexReferenceParentType.Unknown, null, ref featureDisplay); 6179 this.ParseFeatureElement(child, ComplexReferenceParentType.Unknown, null, ref featureDisplay);
6177 break; 6180 break;
6178 case "FeatureGroup": 6181 case "FeatureGroup":
6179 this.ParseFeatureGroupElement(child, ComplexReferenceParentType.Unknown, id?.Id); 6182 this.ParseFeatureGroupElement(child, ComplexReferenceParentType.Unknown, id?.Id);
6180 break; 6183 break;
6181 case "FeatureRef": 6184 case "FeatureRef":
6182 this.ParseFeatureRefElement(child, ComplexReferenceParentType.Unknown, null); 6185 this.ParseFeatureRefElement(child, ComplexReferenceParentType.Unknown, null);
6183 break; 6186 break;
6184 case "File": 6187 case "File":
6185 this.ParseNakedFileElement(child, ComplexReferenceParentType.Unknown, null, null, null); 6188 this.ParseNakedFileElement(child, ComplexReferenceParentType.Unknown, null, null, null);
6186 break; 6189 break;
6187 case "Files": 6190 case "Files":
6188 this.ParseFilesElement(child, ComplexReferenceParentType.Unknown, null, null, null); 6191 this.ParseFilesElement(child, ComplexReferenceParentType.Unknown, null, null, null);
6189 break; 6192 break;
6190 case "Icon": 6193 case "Icon":
6191 this.ParseIconElement(child); 6194 this.ParseIconElement(child);
6192 break; 6195 break;
6193 case "Media": 6196 case "Media":
6194 this.ParseMediaElement(child, null); 6197 this.ParseMediaElement(child, null);
6195 break; 6198 break;
6196 case "MediaTemplate": 6199 case "MediaTemplate":
6197 this.ParseMediaTemplateElement(child, null); 6200 this.ParseMediaTemplateElement(child, null);
6198 break; 6201 break;
6199 case "Launch": 6202 case "Launch":
6200 this.ParseLaunchElement(child); 6203 this.ParseLaunchElement(child);
6201 break; 6204 break;
6202 case "PackageGroup": 6205 case "PackageGroup":
6203 this.ParsePackageGroupElement(child); 6206 this.ParsePackageGroupElement(child);
6204 break; 6207 break;
6205 case "PackageCertificates": 6208 case "PackageCertificates":
6206 case "PatchCertificates": 6209 case "PatchCertificates":
6207 this.ParseCertificatesElement(child); 6210 this.ParseCertificatesElement(child);
6208 break; 6211 break;
6209 case "PatchFamily": 6212 case "PatchFamily":
6210 this.ParsePatchFamilyElement(child, ComplexReferenceParentType.Unknown, id?.Id); 6213 this.ParsePatchFamilyElement(child, ComplexReferenceParentType.Unknown, id?.Id);
6211 break; 6214 break;
6212 case "PatchFamilyGroup": 6215 case "PatchFamilyGroup":
6213 this.ParsePatchFamilyGroupElement(child, ComplexReferenceParentType.Unknown, id?.Id); 6216 this.ParsePatchFamilyGroupElement(child, ComplexReferenceParentType.Unknown, id?.Id);
6214 break; 6217 break;
6215 case "PatchFamilyGroupRef": 6218 case "PatchFamilyGroupRef":
6216 this.ParsePatchFamilyGroupRefElement(child, ComplexReferenceParentType.Unknown, id?.Id); 6219 this.ParsePatchFamilyGroupRefElement(child, ComplexReferenceParentType.Unknown, id?.Id);
6217 break; 6220 break;
6218 case "PayloadGroup": 6221 case "PayloadGroup":
6219 this.ParsePayloadGroupElement(child, ComplexReferenceParentType.Unknown, null); 6222 this.ParsePayloadGroupElement(child, ComplexReferenceParentType.Unknown, null);
6220 break; 6223 break;
6221 case "Property": 6224 case "Property":
6222 this.ParsePropertyElement(child); 6225 this.ParsePropertyElement(child);
6223 break; 6226 break;
6224 case "PropertyRef": 6227 case "PropertyRef":
6225 this.ParseSimpleRefElement(child, SymbolDefinitions.Property); 6228 this.ParseSimpleRefElement(child, SymbolDefinitions.Property);
6226 break; 6229 break;
6227 case "RelatedBundle": 6230 case "RelatedBundle":
6228 this.ParseRelatedBundleElement(child); 6231 this.ParseRelatedBundleElement(child);
6229 break; 6232 break;
6230 case "Requires": 6233 case "Requires":
6231 this.ParseRequiresElement(child, null); 6234 this.ParseRequiresElement(child, null);
6232 break; 6235 break;
6233 case "SetDirectory": 6236 case "SetDirectory":
6234 this.ParseSetDirectoryElement(child); 6237 this.ParseSetDirectoryElement(child);
6235 break; 6238 break;
6236 case "SetProperty": 6239 case "SetProperty":
6237 this.ParseSetPropertyElement(child); 6240 this.ParseSetPropertyElement(child);
6238 break; 6241 break;
6239 case "SetVariable": 6242 case "SetVariable":
6240 this.ParseSetVariableElement(child); 6243 this.ParseSetVariableElement(child);
6241 break; 6244 break;
6242 case "SetVariableRef": 6245 case "SetVariableRef":
6243 this.ParseSimpleRefElement(child, SymbolDefinitions.WixSetVariable); 6246 this.ParseSimpleRefElement(child, SymbolDefinitions.WixSetVariable);
6244 break; 6247 break;
6245 case "SFPCatalog": 6248 case "SFPCatalog":
6246 string parentName = null; 6249 string parentName = null;
6247 this.ParseSFPCatalogElement(child, ref parentName); 6250 this.ParseSFPCatalogElement(child, ref parentName);
6248 break; 6251 break;
6249 case "StandardDirectory": 6252 case "StandardDirectory":
6250 this.ParseStandardDirectoryElement(child); 6253 this.ParseStandardDirectoryElement(child);
6251 break; 6254 break;
6252 case "UI": 6255 case "UI":
6253 this.ParseUIElement(child); 6256 this.ParseUIElement(child);
6254 break; 6257 break;
6255 case "UIRef": 6258 case "UIRef":
6256 this.ParseSimpleRefElement(child, SymbolDefinitions.WixUI); 6259 this.ParseSimpleRefElement(child, SymbolDefinitions.WixUI);
6257 break; 6260 break;
6258 case "Upgrade": 6261 case "Upgrade":
6259 this.ParseUpgradeElement(child); 6262 this.ParseUpgradeElement(child);
6260 break; 6263 break;
6261 case "Variable": 6264 case "Variable":
6262 this.ParseVariableElement(child); 6265 this.ParseVariableElement(child);
6263 break; 6266 break;
6264 case "WixVariable": 6267 case "WixVariable":
6265 this.ParseWixVariableElement(child); 6268 this.ParseWixVariableElement(child);
6266 break; 6269 break;
6267 default: 6270 default:
6268 this.Core.UnexpectedElement(node, child); 6271 this.Core.UnexpectedElement(node, child);
6269 break; 6272 break;
6270 } 6273 }
6271 } 6274 }
6272 else 6275 else
@@ -6359,56 +6362,56 @@ namespace WixToolset.Core
6359 { 6362 {
6360 switch (attrib.Name.LocalName) 6363 switch (attrib.Name.LocalName)
6361 { 6364 {
6362 case "Id": 6365 case "Id":
6363 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 6366 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
6364 break; 6367 break;
6365 case "Action": 6368 case "Action":
6366 var actionValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 6369 var actionValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6367 switch (actionValue) 6370 switch (actionValue)
6368 { 6371 {
6369 case "addLine": 6372 case "addLine":
6370 action = IniFileActionType.AddLine; 6373 action = IniFileActionType.AddLine;
6371 break; 6374 break;
6372 case "addTag": 6375 case "addTag":
6373 action = IniFileActionType.AddTag; 6376 action = IniFileActionType.AddTag;
6374 break; 6377 break;
6375 case "createLine": 6378 case "createLine":
6376 action = IniFileActionType.CreateLine; 6379 action = IniFileActionType.CreateLine;
6377 break; 6380 break;
6378 case "removeLine": 6381 case "removeLine":
6379 action = IniFileActionType.RemoveLine; 6382 action = IniFileActionType.RemoveLine;
6380 break; 6383 break;
6381 case "removeTag": 6384 case "removeTag":
6382 action = IniFileActionType.RemoveTag; 6385 action = IniFileActionType.RemoveTag;
6383 break; 6386 break;
6384 case "": // error case handled by GetAttributeValue() 6387 case "": // error case handled by GetAttributeValue()
6385 break; 6388 break;
6386 default: 6389 default:
6387 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Action", actionValue, "addLine", "addTag", "createLine", "removeLine", "removeTag")); 6390 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Action", actionValue, "addLine", "addTag", "createLine", "removeLine", "removeTag"));
6388 break; 6391 break;
6389 } 6392 }
6390 break; 6393 break;
6391 case "Directory": 6394 case "Directory":
6392 directory = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 6395 directory = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
6393 break; 6396 break;
6394 case "Key": 6397 case "Key":
6395 key = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 6398 key = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6396 break; 6399 break;
6397 case "Name": 6400 case "Name":
6398 name = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, false); 6401 name = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, false);
6399 break; 6402 break;
6400 case "Section": 6403 case "Section":
6401 section = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 6404 section = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6402 break; 6405 break;
6403 case "ShortName": 6406 case "ShortName":
6404 shortName = this.Core.GetAttributeShortFilename(sourceLineNumbers, attrib, false); 6407 shortName = this.Core.GetAttributeShortFilename(sourceLineNumbers, attrib, false);
6405 break; 6408 break;
6406 case "Value": 6409 case "Value":
6407 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 6410 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6408 break; 6411 break;
6409 default: 6412 default:
6410 this.Core.UnexpectedAttribute(node, attrib); 6413 this.Core.UnexpectedAttribute(node, attrib);
6411 break; 6414 break;
6412 } 6415 }
6413 } 6416 }
6414 else 6417 else
@@ -6489,47 +6492,47 @@ namespace WixToolset.Core
6489 { 6492 {
6490 switch (attrib.Name.LocalName) 6493 switch (attrib.Name.LocalName)
6491 { 6494 {
6492 case "Id": 6495 case "Id":
6493 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 6496 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
6494 break;
6495 case "Field":
6496 field = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue);
6497 break;
6498 case "Key":
6499 key = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6500 break;
6501 case "Name":
6502 name = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, false);
6503 break;
6504 case "Section":
6505 section = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6506 break;
6507 case "ShortName":
6508 shortName = this.Core.GetAttributeShortFilename(sourceLineNumbers, attrib, false);
6509 break;
6510 case "Type":
6511 var typeValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6512 switch (typeValue)
6513 {
6514 case "directory":
6515 type = 0;
6516 break; 6497 break;
6517 case "file": 6498 case "Field":
6518 type = 1; 6499 field = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue);
6519 break; 6500 break;
6520 case "raw": 6501 case "Key":
6521 type = 2; 6502 key = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6522 break; 6503 break;
6523 case "": 6504 case "Name":
6505 name = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib, false);
6506 break;
6507 case "Section":
6508 section = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6509 break;
6510 case "ShortName":
6511 shortName = this.Core.GetAttributeShortFilename(sourceLineNumbers, attrib, false);
6512 break;
6513 case "Type":
6514 var typeValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6515 switch (typeValue)
6516 {
6517 case "directory":
6518 type = 0;
6519 break;
6520 case "file":
6521 type = 1;
6522 break;
6523 case "raw":
6524 type = 2;
6525 break;
6526 case "":
6527 break;
6528 default:
6529 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Type", typeValue, "directory", "file", "registry"));
6530 break;
6531 }
6524 break; 6532 break;
6525 default: 6533 default:
6526 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Type", typeValue, "directory", "file", "registry")); 6534 this.Core.UnexpectedAttribute(node, attrib);
6527 break; 6535 break;
6528 }
6529 break;
6530 default:
6531 this.Core.UnexpectedAttribute(node, attrib);
6532 break;
6533 } 6536 }
6534 } 6537 }
6535 else 6538 else
@@ -6568,46 +6571,46 @@ namespace WixToolset.Core
6568 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); 6571 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child);
6569 switch (child.Name.LocalName) 6572 switch (child.Name.LocalName)
6570 { 6573 {
6571 case "DirectorySearch": 6574 case "DirectorySearch":
6572 if (oneChild) 6575 if (oneChild)
6573 { 6576 {
6574 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName)); 6577 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName));
6575 } 6578 }
6576 oneChild = true; 6579 oneChild = true;
6577 6580
6578 // directorysearch parentage should work like directory element, not the rest of the signature type because of the DrLocator.Parent column 6581 // directorysearch parentage should work like directory element, not the rest of the signature type because of the DrLocator.Parent column
6579 signature = this.ParseDirectorySearchElement(child, id.Id); 6582 signature = this.ParseDirectorySearchElement(child, id.Id);
6580 break; 6583 break;
6581 case "DirectorySearchRef": 6584 case "DirectorySearchRef":
6582 if (oneChild) 6585 if (oneChild)
6583 { 6586 {
6584 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName)); 6587 this.Core.Write(ErrorMessages.TooManySearchElements(childSourceLineNumbers, node.Name.LocalName));
6585 } 6588 }
6586 oneChild = true; 6589 oneChild = true;
6587 signature = this.ParseDirectorySearchRefElement(child, id.Id); 6590 signature = this.ParseDirectorySearchRefElement(child, id.Id);
6588 break; 6591 break;
6589 case "FileSearch": 6592 case "FileSearch":
6590 if (oneChild) 6593 if (oneChild)
6591 { 6594 {
6592 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 6595 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
6593 } 6596 }
6594 oneChild = true; 6597 oneChild = true;
6595 signature = this.ParseFileSearchElement(child, id.Id, false, CompilerConstants.IntegerNotSet); 6598 signature = this.ParseFileSearchElement(child, id.Id, false, CompilerConstants.IntegerNotSet);
6596 id = new Identifier(AccessModifier.Section, signature); // FileSearch signatures override parent signatures 6599 id = new Identifier(AccessModifier.Section, signature); // FileSearch signatures override parent signatures
6597 break; 6600 break;
6598 case "FileSearchRef": 6601 case "FileSearchRef":
6599 if (oneChild) 6602 if (oneChild)
6600 { 6603 {
6601 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName)); 6604 this.Core.Write(ErrorMessages.TooManySearchElements(sourceLineNumbers, node.Name.LocalName));
6602 } 6605 }
6603 oneChild = true; 6606 oneChild = true;
6604 var newId = this.ParseSimpleRefElement(child, SymbolDefinitions.Signature); // FileSearch signatures override parent signatures 6607 var newId = this.ParseSimpleRefElement(child, SymbolDefinitions.Signature); // FileSearch signatures override parent signatures
6605 id = new Identifier(AccessModifier.Section, newId); 6608 id = new Identifier(AccessModifier.Section, newId);
6606 signature = null; 6609 signature = null;
6607 break; 6610 break;
6608 default: 6611 default:
6609 this.Core.UnexpectedElement(node, child); 6612 this.Core.UnexpectedElement(node, child);
6610 break; 6613 break;
6611 } 6614 }
6612 } 6615 }
6613 else 6616 else
@@ -6652,13 +6655,13 @@ namespace WixToolset.Core
6652 { 6655 {
6653 switch (attrib.Name.LocalName) 6656 switch (attrib.Name.LocalName)
6654 { 6657 {
6655 case "Shared": 6658 case "Shared":
6656 shared = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 6659 shared = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
6657 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Component, shared); 6660 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Component, shared);
6658 break; 6661 break;
6659 default: 6662 default:
6660 this.Core.UnexpectedAttribute(node, attrib); 6663 this.Core.UnexpectedAttribute(node, attrib);
6661 break; 6664 break;
6662 } 6665 }
6663 } 6666 }
6664 else 6667 else
@@ -6711,32 +6714,32 @@ namespace WixToolset.Core
6711 { 6714 {
6712 switch (child.Name.LocalName) 6715 switch (child.Name.LocalName)
6713 { 6716 {
6714 case "DigitalCertificate": 6717 case "DigitalCertificate":
6715 var name = this.ParseDigitalCertificateElement(child); 6718 var name = this.ParseDigitalCertificateElement(child);
6716 6719
6717 if (!this.Core.EncounteredError) 6720 if (!this.Core.EncounteredError)
6718 {
6719 if ("PatchCertificates" == node.Name.LocalName)
6720 { 6721 {
6721 this.Core.AddSymbol(new MsiPatchCertificateSymbol(sourceLineNumbers) 6722 if ("PatchCertificates" == node.Name.LocalName)
6722 { 6723 {
6723 PatchCertificate = name, 6724 this.Core.AddSymbol(new MsiPatchCertificateSymbol(sourceLineNumbers)
6724 DigitalCertificateRef = name, 6725 {
6725 }); 6726 PatchCertificate = name,
6726 } 6727 DigitalCertificateRef = name,
6727 else 6728 });
6728 { 6729 }
6729 this.Core.AddSymbol(new MsiPackageCertificateSymbol(sourceLineNumbers) 6730 else
6730 { 6731 {
6731 PackageCertificate = name, 6732 this.Core.AddSymbol(new MsiPackageCertificateSymbol(sourceLineNumbers)
6732 DigitalCertificateRef = name, 6733 {
6733 }); 6734 PackageCertificate = name,
6735 DigitalCertificateRef = name,
6736 });
6737 }
6734 } 6738 }
6735 } 6739 break;
6736 break; 6740 default:
6737 default: 6741 this.Core.UnexpectedElement(node, child);
6738 this.Core.UnexpectedElement(node, child); 6742 break;
6739 break;
6740 } 6743 }
6741 } 6744 }
6742 else 6745 else
@@ -6763,15 +6766,15 @@ namespace WixToolset.Core
6763 { 6766 {
6764 switch (attrib.Name.LocalName) 6767 switch (attrib.Name.LocalName)
6765 { 6768 {
6766 case "Id": 6769 case "Id":
6767 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 6770 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
6768 break; 6771 break;
6769 case "SourceFile": 6772 case "SourceFile":
6770 sourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 6773 sourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6771 break; 6774 break;
6772 default: 6775 default:
6773 this.Core.UnexpectedAttribute(node, attrib); 6776 this.Core.UnexpectedAttribute(node, attrib);
6774 break; 6777 break;
6775 } 6778 }
6776 } 6779 }
6777 else 6780 else
@@ -6828,12 +6831,12 @@ namespace WixToolset.Core
6828 { 6831 {
6829 switch (attrib.Name.LocalName) 6832 switch (attrib.Name.LocalName)
6830 { 6833 {
6831 case "SourceFile": 6834 case "SourceFile":
6832 sourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 6835 sourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6833 break; 6836 break;
6834 default: 6837 default:
6835 this.Core.UnexpectedAttribute(node, attrib); 6838 this.Core.UnexpectedAttribute(node, attrib);
6836 break; 6839 break;
6837 } 6840 }
6838 } 6841 }
6839 else 6842 else
@@ -6854,12 +6857,12 @@ namespace WixToolset.Core
6854 { 6857 {
6855 switch (child.Name.LocalName) 6858 switch (child.Name.LocalName)
6856 { 6859 {
6857 case "DigitalCertificate": 6860 case "DigitalCertificate":
6858 certificateId = this.ParseDigitalCertificateElement(child); 6861 certificateId = this.ParseDigitalCertificateElement(child);
6859 break; 6862 break;
6860 default: 6863 default:
6861 this.Core.UnexpectedElement(node, child); 6864 this.Core.UnexpectedElement(node, child);
6862 break; 6865 break;
6863 } 6866 }
6864 } 6867 }
6865 else 6868 else
@@ -6923,42 +6926,42 @@ namespace WixToolset.Core
6923 { 6926 {
6924 switch (attrib.Name.LocalName) 6927 switch (attrib.Name.LocalName)
6925 { 6928 {
6926 case "AllowDowngrades": 6929 case "AllowDowngrades":
6927 allowDowngrades = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 6930 allowDowngrades = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
6928 break; 6931 break;
6929 case "AllowSameVersionUpgrades": 6932 case "AllowSameVersionUpgrades":
6930 allowSameVersionUpgrades = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 6933 allowSameVersionUpgrades = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
6931 break; 6934 break;
6932 case "Disallow": 6935 case "Disallow":
6933 blockUpgrades = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 6936 blockUpgrades = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
6934 break; 6937 break;
6935 case "DowngradeErrorMessage": 6938 case "DowngradeErrorMessage":
6936 downgradeErrorMessage = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 6939 downgradeErrorMessage = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6937 break; 6940 break;
6938 case "DisallowUpgradeErrorMessage": 6941 case "DisallowUpgradeErrorMessage":
6939 disallowUpgradeErrorMessage = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 6942 disallowUpgradeErrorMessage = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6940 break; 6943 break;
6941 case "MigrateFeatures": 6944 case "MigrateFeatures":
6942 migrateFeatures = (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)); 6945 migrateFeatures = (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib));
6943 break; 6946 break;
6944 case "IgnoreLanguage": 6947 case "IgnoreLanguage":
6945 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) 6948 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
6946 { 6949 {
6947 productLanguage = null; 6950 productLanguage = null;
6948 } 6951 }
6949 break; 6952 break;
6950 case "IgnoreRemoveFailure": 6953 case "IgnoreRemoveFailure":
6951 ignoreRemoveFailure = (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)); 6954 ignoreRemoveFailure = (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib));
6952 break; 6955 break;
6953 case "RemoveFeatures": 6956 case "RemoveFeatures":
6954 removeFeatures = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 6957 removeFeatures = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6955 break; 6958 break;
6956 case "Schedule": 6959 case "Schedule":
6957 schedule = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 6960 schedule = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
6958 break; 6961 break;
6959 default: 6962 default:
6960 this.Core.UnexpectedAttribute(node, attrib); 6963 this.Core.UnexpectedAttribute(node, attrib);
6961 break; 6964 break;
6962 } 6965 }
6963 } 6966 }
6964 else 6967 else
@@ -7101,34 +7104,34 @@ namespace WixToolset.Core
7101 { 7104 {
7102 switch (attrib.Name.LocalName) 7105 switch (attrib.Name.LocalName)
7103 { 7106 {
7104 case "Id": 7107 case "Id":
7105 id = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue); 7108 id = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue);
7106 break; 7109 break;
7107 case "Cabinet": 7110 case "Cabinet":
7108 cabinet = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7111 cabinet = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7109 break; 7112 break;
7110 case "CompressionLevel": 7113 case "CompressionLevel":
7111 compressionLevel = this.ParseCompressionLevel(sourceLineNumbers, attrib); 7114 compressionLevel = this.ParseCompressionLevel(sourceLineNumbers, attrib);
7112 break; 7115 break;
7113 case "DiskPrompt": 7116 case "DiskPrompt":
7114 diskPrompt = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7117 diskPrompt = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7115 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Property, "DiskPrompt"); // ensure the output has a DiskPrompt Property defined 7118 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Property, "DiskPrompt"); // ensure the output has a DiskPrompt Property defined
7116 break; 7119 break;
7117 case "EmbedCab": 7120 case "EmbedCab":
7118 embedCab = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 7121 embedCab = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
7119 break; 7122 break;
7120 case "Layout": 7123 case "Layout":
7121 layout = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7124 layout = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7122 break; 7125 break;
7123 case "VolumeLabel": 7126 case "VolumeLabel":
7124 volumeLabel = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7127 volumeLabel = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7125 break; 7128 break;
7126 case "Source": 7129 case "Source":
7127 source = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7130 source = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7128 break; 7131 break;
7129 default: 7132 default:
7130 this.Core.UnexpectedAttribute(node, attrib); 7133 this.Core.UnexpectedAttribute(node, attrib);
7131 break; 7134 break;
7132 } 7135 }
7133 } 7136 }
7134 else 7137 else
@@ -7192,43 +7195,43 @@ namespace WixToolset.Core
7192 { 7195 {
7193 switch (child.Name.LocalName) 7196 switch (child.Name.LocalName)
7194 { 7197 {
7195 case "DigitalSignature": 7198 case "DigitalSignature":
7196 if (YesNoType.Yes == embedCab) 7199 if (YesNoType.Yes == embedCab)
7197 { 7200 {
7198 this.Core.Write(ErrorMessages.SignedEmbeddedCabinet(childSourceLineNumbers)); 7201 this.Core.Write(ErrorMessages.SignedEmbeddedCabinet(childSourceLineNumbers));
7199 } 7202 }
7200 else if (null == cabinet) 7203 else if (null == cabinet)
7201 { 7204 {
7202 this.Core.Write(ErrorMessages.ExpectedSignedCabinetName(childSourceLineNumbers)); 7205 this.Core.Write(ErrorMessages.ExpectedSignedCabinetName(childSourceLineNumbers));
7203 } 7206 }
7204 else 7207 else
7205 { 7208 {
7206 this.ParseDigitalSignatureElement(child, id.ToString(CultureInfo.InvariantCulture.NumberFormat)); 7209 this.ParseDigitalSignatureElement(child, id.ToString(CultureInfo.InvariantCulture.NumberFormat));
7207 } 7210 }
7208 break; 7211 break;
7209 case "PatchBaseline": 7212 case "PatchBaseline":
7210 if (patch) 7213 if (patch)
7211 { 7214 {
7212 this.ParsePatchBaselineElement(child, id); 7215 this.ParsePatchBaselineElement(child, id);
7213 } 7216 }
7214 else 7217 else
7215 { 7218 {
7219 this.Core.UnexpectedElement(node, child);
7220 }
7221 break;
7222 case "SymbolPath":
7223 if (null != symbols)
7224 {
7225 symbols += "" + this.ParseSymbolPathElement(child);
7226 }
7227 else
7228 {
7229 symbols = this.ParseSymbolPathElement(child);
7230 }
7231 break;
7232 default:
7216 this.Core.UnexpectedElement(node, child); 7233 this.Core.UnexpectedElement(node, child);
7217 } 7234 break;
7218 break;
7219 case "SymbolPath":
7220 if (null != symbols)
7221 {
7222 symbols += "" + this.ParseSymbolPathElement(child);
7223 }
7224 else
7225 {
7226 symbols = this.ParseSymbolPathElement(child);
7227 }
7228 break;
7229 default:
7230 this.Core.UnexpectedElement(node, child);
7231 break;
7232 } 7235 }
7233 } 7236 }
7234 else 7237 else
@@ -7287,53 +7290,53 @@ namespace WixToolset.Core
7287 { 7290 {
7288 switch (attrib.Name.LocalName) 7291 switch (attrib.Name.LocalName)
7289 { 7292 {
7290 case "CabinetTemplate": 7293 case "CabinetTemplate":
7291 var authoredCabinetTemplateValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); 7294 var authoredCabinetTemplateValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty);
7292 if (!String.IsNullOrEmpty(authoredCabinetTemplateValue)) 7295 if (!String.IsNullOrEmpty(authoredCabinetTemplateValue))
7293 {
7294 cabinetTemplate = authoredCabinetTemplateValue;
7295 }
7296
7297 // Create an example cabinet name using the maximum number of cabinets supported, 999.
7298 var exampleCabinetName = String.Format(cabinetTemplate, "###");
7299 if (!this.Core.IsValidLocIdentifier(exampleCabinetName))
7300 {
7301 // The example name should not match the authored template since that would nullify the
7302 // reason for having multiple cabinets. External cabinet files must also be valid file names.
7303 if (exampleCabinetName.Equals(authoredCabinetTemplateValue, StringComparison.OrdinalIgnoreCase) || !this.Core.IsValidLongFilename(exampleCabinetName, false))
7304 { 7296 {
7305 this.Core.Write(ErrorMessages.InvalidCabinetTemplate(sourceLineNumbers, cabinetTemplate)); 7297 cabinetTemplate = authoredCabinetTemplateValue;
7306 } 7298 }
7307 else if (!this.Core.IsValidLongFilename(exampleCabinetName) && !Common.ContainsValidBinderVariable(exampleCabinetName)) // ignore short names with wix variables because it rarely works out. 7299
7300 // Create an example cabinet name using the maximum number of cabinets supported, 999.
7301 var exampleCabinetName = String.Format(cabinetTemplate, "###");
7302 if (!this.Core.IsValidLocIdentifier(exampleCabinetName))
7308 { 7303 {
7309 this.Core.Write(WarningMessages.MediaExternalCabinetFilenameIllegal(sourceLineNumbers, node.Name.LocalName, "CabinetTemplate", cabinetTemplate)); 7304 // The example name should not match the authored template since that would nullify the
7305 // reason for having multiple cabinets. External cabinet files must also be valid file names.
7306 if (exampleCabinetName.Equals(authoredCabinetTemplateValue, StringComparison.OrdinalIgnoreCase) || !this.Core.IsValidLongFilename(exampleCabinetName, false))
7307 {
7308 this.Core.Write(ErrorMessages.InvalidCabinetTemplate(sourceLineNumbers, cabinetTemplate));
7309 }
7310 else if (!this.Core.IsValidLongFilename(exampleCabinetName) && !Common.ContainsValidBinderVariable(exampleCabinetName)) // ignore short names with wix variables because it rarely works out.
7311 {
7312 this.Core.Write(WarningMessages.MediaExternalCabinetFilenameIllegal(sourceLineNumbers, node.Name.LocalName, "CabinetTemplate", cabinetTemplate));
7313 }
7310 } 7314 }
7311 } 7315 break;
7312 break; 7316 case "CompressionLevel":
7313 case "CompressionLevel": 7317 compressionLevel = this.ParseCompressionLevel(sourceLineNumbers, attrib);
7314 compressionLevel = this.ParseCompressionLevel(sourceLineNumbers, attrib); 7318 break;
7315 break; 7319 case "DiskPrompt":
7316 case "DiskPrompt": 7320 diskPrompt = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7317 diskPrompt = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7321 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Property, "DiskPrompt"); // ensure the output has a DiskPrompt Property defined
7318 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Property, "DiskPrompt"); // ensure the output has a DiskPrompt Property defined 7322 this.Core.Write(WarningMessages.ReservedAttribute(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
7319 this.Core.Write(WarningMessages.ReservedAttribute(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); 7323 break;
7320 break; 7324 case "EmbedCab":
7321 case "EmbedCab": 7325 embedCab = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
7322 embedCab = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 7326 break;
7323 break; 7327 case "VolumeLabel":
7324 case "VolumeLabel": 7328 volumeLabel = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7325 volumeLabel = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7329 this.Core.Write(WarningMessages.ReservedAttribute(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
7326 this.Core.Write(WarningMessages.ReservedAttribute(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); 7330 break;
7327 break; 7331 case "MaximumUncompressedMediaSize":
7328 case "MaximumUncompressedMediaSize": 7332 maximumUncompressedMediaSize = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int32.MaxValue);
7329 maximumUncompressedMediaSize = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int32.MaxValue); 7333 break;
7330 break; 7334 case "MaximumCabinetSizeForLargeFileSplitting":
7331 case "MaximumCabinetSizeForLargeFileSplitting": 7335 maximumCabinetSizeForLargeFileSplitting = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, Compiler.MinValueOfMaxCabSizeForLargeFileSplitting, Compiler.MaxValueOfMaxCabSizeForLargeFileSplitting);
7332 maximumCabinetSizeForLargeFileSplitting = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, Compiler.MinValueOfMaxCabSizeForLargeFileSplitting, Compiler.MaxValueOfMaxCabSizeForLargeFileSplitting); 7336 break;
7333 break; 7337 default:
7334 default: 7338 this.Core.UnexpectedAttribute(node, attrib);
7335 this.Core.UnexpectedAttribute(node, attrib); 7339 break;
7336 break;
7337 } 7340 }
7338 } 7341 }
7339 else 7342 else
@@ -7397,27 +7400,27 @@ namespace WixToolset.Core
7397 { 7400 {
7398 switch (attrib.Name.LocalName) 7401 switch (attrib.Name.LocalName)
7399 { 7402 {
7400 case "Id": 7403 case "Id":
7401 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 7404 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
7402 break; 7405 break;
7403 case "DiskId": 7406 case "DiskId":
7404 diskId = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue); 7407 diskId = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue);
7405 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Media, diskId.ToString(CultureInfo.InvariantCulture.NumberFormat)); 7408 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Media, diskId.ToString(CultureInfo.InvariantCulture.NumberFormat));
7406 break; 7409 break;
7407 case "FileCompression": 7410 case "FileCompression":
7408 var compress = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 7411 var compress = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
7409 attributes |= compress == YesNoType.Yes ? FileSymbolAttributes.Compressed : 0; 7412 attributes |= compress == YesNoType.Yes ? FileSymbolAttributes.Compressed : 0;
7410 attributes |= compress == YesNoType.No ? FileSymbolAttributes.Uncompressed : 0; 7413 attributes |= compress == YesNoType.No ? FileSymbolAttributes.Uncompressed : 0;
7411 break; 7414 break;
7412 case "Language": 7415 case "Language":
7413 language = this.Core.GetAttributeLocalizableIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue); 7416 language = this.Core.GetAttributeLocalizableIntegerValue(sourceLineNumbers, attrib, 0, Int16.MaxValue);
7414 break; 7417 break;
7415 case "SourceFile": 7418 case "SourceFile":
7416 sourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7419 sourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7417 break; 7420 break;
7418 default: 7421 default:
7419 this.Core.UnexpectedAttribute(node, attrib); 7422 this.Core.UnexpectedAttribute(node, attrib);
7420 break; 7423 break;
7421 } 7424 }
7422 } 7425 }
7423 else 7426 else
@@ -7447,19 +7450,19 @@ namespace WixToolset.Core
7447 { 7450 {
7448 switch (child.Name.LocalName) 7451 switch (child.Name.LocalName)
7449 { 7452 {
7450 case "ConfigurationData": 7453 case "ConfigurationData":
7451 if (0 == configData.Length) 7454 if (0 == configData.Length)
7452 { 7455 {
7453 configData = this.ParseConfigurationDataElement(child); 7456 configData = this.ParseConfigurationDataElement(child);
7454 } 7457 }
7455 else 7458 else
7456 { 7459 {
7457 configData = String.Concat(configData, ",", this.ParseConfigurationDataElement(child)); 7460 configData = String.Concat(configData, ",", this.ParseConfigurationDataElement(child));
7458 } 7461 }
7459 break; 7462 break;
7460 default: 7463 default:
7461 this.Core.UnexpectedElement(node, child); 7464 this.Core.UnexpectedElement(node, child);
7462 break; 7465 break;
7463 } 7466 }
7464 } 7467 }
7465 else 7468 else
@@ -7577,15 +7580,15 @@ namespace WixToolset.Core
7577 { 7580 {
7578 switch (attrib.Name.LocalName) 7581 switch (attrib.Name.LocalName)
7579 { 7582 {
7580 case "Name": 7583 case "Name":
7581 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7584 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7582 break; 7585 break;
7583 case "Value": 7586 case "Value":
7584 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7587 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7585 break; 7588 break;
7586 default: 7589 default:
7587 this.Core.UnexpectedAttribute(node, attrib); 7590 this.Core.UnexpectedAttribute(node, attrib);
7588 break; 7591 break;
7589 } 7592 }
7590 } 7593 }
7591 else 7594 else
@@ -7705,16 +7708,16 @@ namespace WixToolset.Core
7705 { 7708 {
7706 switch (attrib.Name.LocalName) 7709 switch (attrib.Name.LocalName)
7707 { 7710 {
7708 case "Id": 7711 case "Id":
7709 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 7712 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
7710 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.WixMerge, id); 7713 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.WixMerge, id);
7711 break; 7714 break;
7712 case "Primary": 7715 case "Primary":
7713 primary = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 7716 primary = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
7714 break; 7717 break;
7715 default: 7718 default:
7716 this.Core.UnexpectedAttribute(node, attrib); 7719 this.Core.UnexpectedAttribute(node, attrib);
7717 break; 7720 break;
7718 } 7721 }
7719 } 7722 }
7720 else 7723 else
@@ -7755,21 +7758,21 @@ namespace WixToolset.Core
7755 { 7758 {
7756 switch (attrib.Name.LocalName) 7759 switch (attrib.Name.LocalName)
7757 { 7760 {
7758 case "Advertise": 7761 case "Advertise":
7759 advertise = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 7762 advertise = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
7760 break; 7763 break;
7761 case "Class": 7764 case "Class":
7762 classId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 7765 classId = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
7763 break; 7766 break;
7764 case "ContentType": 7767 case "ContentType":
7765 contentType = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7768 contentType = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7766 break; 7769 break;
7767 case "Default": 7770 case "Default":
7768 returnContentType = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 7771 returnContentType = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
7769 break; 7772 break;
7770 default: 7773 default:
7771 this.Core.UnexpectedAttribute(node, attrib); 7774 this.Core.UnexpectedAttribute(node, attrib);
7772 break; 7775 break;
7773 } 7776 }
7774 } 7777 }
7775 else 7778 else
@@ -7843,19 +7846,19 @@ namespace WixToolset.Core
7843 { 7846 {
7844 switch (attrib.Name.LocalName) 7847 switch (attrib.Name.LocalName)
7845 { 7848 {
7846 case "Id": 7849 case "Id":
7847 case "Name": 7850 case "Name":
7848 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7851 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7849 break; 7852 break;
7850 case "Company": 7853 case "Company":
7851 company = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7854 company = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7852 break; 7855 break;
7853 case "Value": 7856 case "Value":
7854 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7857 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7855 break; 7858 break;
7856 default: 7859 default:
7857 this.Core.UnexpectedAttribute(node, attrib); 7860 this.Core.UnexpectedAttribute(node, attrib);
7858 break; 7861 break;
7859 } 7862 }
7860 } 7863 }
7861 else 7864 else
@@ -7929,16 +7932,16 @@ namespace WixToolset.Core
7929 { 7932 {
7930 switch (attrib.Name.LocalName) 7933 switch (attrib.Name.LocalName)
7931 { 7934 {
7932 case "Id": 7935 case "Id":
7933 id = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 7936 id = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
7934 if (id.Length > 0 && "*" != id) 7937 if (id.Length > 0 && "*" != id)
7935 { 7938 {
7936 id = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 7939 id = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
7937 } 7940 }
7938 break; 7941 break;
7939 default: 7942 default:
7940 this.Core.UnexpectedAttribute(node, attrib); 7943 this.Core.UnexpectedAttribute(node, attrib);
7941 break; 7944 break;
7942 } 7945 }
7943 } 7946 }
7944 else 7947 else
@@ -7973,12 +7976,12 @@ namespace WixToolset.Core
7973 { 7976 {
7974 switch (attrib.Name.LocalName) 7977 switch (attrib.Name.LocalName)
7975 { 7978 {
7976 case "Id": 7979 case "Id":
7977 id = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false); 7980 id = this.Core.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
7978 break; 7981 break;
7979 default: 7982 default:
7980 this.Core.UnexpectedAttribute(node, attrib); 7983 this.Core.UnexpectedAttribute(node, attrib);
7981 break; 7984 break;
7982 } 7985 }
7983 } 7986 }
7984 else 7987 else
@@ -8013,12 +8016,12 @@ namespace WixToolset.Core
8013 { 8016 {
8014 switch (attrib.Name.LocalName) 8017 switch (attrib.Name.LocalName)
8015 { 8018 {
8016 case "Path": 8019 case "Path":
8017 path = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 8020 path = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
8018 break; 8021 break;
8019 default: 8022 default:
8020 this.Core.UnexpectedAttribute(node, attrib); 8023 this.Core.UnexpectedAttribute(node, attrib);
8021 break; 8024 break;
8022 } 8025 }
8023 } 8026 }
8024 else 8027 else
@@ -8057,21 +8060,21 @@ namespace WixToolset.Core
8057 { 8060 {
8058 switch (attrib.Name.LocalName) 8061 switch (attrib.Name.LocalName)
8059 { 8062 {
8060 case "Id": 8063 case "Id":
8061 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib); 8064 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
8062 break; 8065 break;
8063 case "DiskId": 8066 case "DiskId":
8064 diskId = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue); 8067 diskId = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue);
8065 break; 8068 break;
8066 case "BaselineFile": 8069 case "BaselineFile":
8067 baselineFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 8070 baselineFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
8068 break; 8071 break;
8069 case "UpdateFile": 8072 case "UpdateFile":
8070 updateFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 8073 updateFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
8071 break; 8074 break;
8072 default: 8075 default:
8073 this.Core.UnexpectedAttribute(node, attrib); 8076 this.Core.UnexpectedAttribute(node, attrib);
8074 break; 8077 break;
8075 } 8078 }
8076 } 8079 }
8077 else 8080 else
@@ -8102,21 +8105,21 @@ namespace WixToolset.Core
8102 { 8105 {
8103 switch (child.Name.LocalName) 8106 switch (child.Name.LocalName)
8104 { 8107 {
8105 case "Validate": 8108 case "Validate":
8106 if (parsedValidate) 8109 if (parsedValidate)
8107 { 8110 {
8108 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); 8111 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child);
8109 this.Core.Write(ErrorMessages.TooManyChildren(childSourceLineNumbers, node.Name.LocalName, child.Name.LocalName)); 8112 this.Core.Write(ErrorMessages.TooManyChildren(childSourceLineNumbers, node.Name.LocalName, child.Name.LocalName));
8110 } 8113 }
8111 else 8114 else
8112 { 8115 {
8113 this.ParseValidateElement(child, ref validationFlags); 8116 this.ParseValidateElement(child, ref validationFlags);
8114 parsedValidate = true; 8117 parsedValidate = true;
8115 } 8118 }
8116 break; 8119 break;
8117 default: 8120 default:
8118 this.Core.UnexpectedElement(node, child); 8121 this.Core.UnexpectedElement(node, child);
8119 break; 8122 break;
8120 } 8123 }
8121 } 8124 }
8122 else 8125 else
@@ -8155,15 +8158,15 @@ namespace WixToolset.Core
8155 { 8158 {
8156 switch (attrib.Name.LocalName) 8159 switch (attrib.Name.LocalName)
8157 { 8160 {
8158 case "Length": 8161 case "Length":
8159 length = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 8162 length = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
8160 break; 8163 break;
8161 case "Offset": 8164 case "Offset":
8162 offset = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 8165 offset = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
8163 break; 8166 break;
8164 default: 8167 default:
8165 this.Core.UnexpectedAttribute(node, attrib); 8168 this.Core.UnexpectedAttribute(node, attrib);
8166 break; 8169 break;
8167 } 8170 }
8168 } 8171 }
8169 else 8172 else
@@ -8218,155 +8221,155 @@ namespace WixToolset.Core
8218 { 8221 {
8219 switch (attrib.Name.LocalName) 8222 switch (attrib.Name.LocalName)
8220 { 8223 {
8221 case "ProductId": 8224 case "ProductId":
8222 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) 8225 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8223 { 8226 {
8224 validationFlags |= TransformFlags.ValidateProduct; 8227 validationFlags |= TransformFlags.ValidateProduct;
8225 } 8228 }
8226 else 8229 else
8227 { 8230 {
8228 validationFlags &= ~TransformFlags.ValidateProduct; 8231 validationFlags &= ~TransformFlags.ValidateProduct;
8229 } 8232 }
8230 break;
8231 case "ProductLanguage":
8232 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8233 {
8234 validationFlags |= TransformFlags.ValidateLanguage;
8235 }
8236 else
8237 {
8238 validationFlags &= ~TransformFlags.ValidateLanguage;
8239 }
8240 break;
8241 case "ProductVersion":
8242 var check = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
8243 validationFlags &= ~TransformFlags.ProductVersionMask;
8244 switch (check)
8245 {
8246 case "Major":
8247 case "major":
8248 validationFlags |= TransformFlags.ValidateMajorVersion;
8249 break; 8233 break;
8250 case "Minor": 8234 case "ProductLanguage":
8251 case "minor": 8235 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8252 validationFlags |= TransformFlags.ValidateMinorVersion; 8236 {
8237 validationFlags |= TransformFlags.ValidateLanguage;
8238 }
8239 else
8240 {
8241 validationFlags &= ~TransformFlags.ValidateLanguage;
8242 }
8253 break; 8243 break;
8254 case "Update": 8244 case "ProductVersion":
8255 case "update": 8245 var check = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
8256 validationFlags |= TransformFlags.ValidateUpdateVersion; 8246 validationFlags &= ~TransformFlags.ProductVersionMask;
8247 switch (check)
8248 {
8249 case "Major":
8250 case "major":
8251 validationFlags |= TransformFlags.ValidateMajorVersion;
8252 break;
8253 case "Minor":
8254 case "minor":
8255 validationFlags |= TransformFlags.ValidateMinorVersion;
8256 break;
8257 case "Update":
8258 case "update":
8259 validationFlags |= TransformFlags.ValidateUpdateVersion;
8260 break;
8261 case "":
8262 break;
8263 default:
8264 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Version", check, "Major", "Minor", "Update"));
8265 break;
8266 }
8257 break; 8267 break;
8258 case "": 8268 case "ProductVersionOperator":
8269 var op = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
8270 validationFlags &= ~TransformFlags.ProductVersionOperatorMask;
8271 switch (op)
8272 {
8273 case "Lesser":
8274 case "lesser":
8275 validationFlags |= TransformFlags.ValidateNewLessBaseVersion;
8276 break;
8277 case "LesserOrEqual":
8278 case "lesserOrEqual":
8279 validationFlags |= TransformFlags.ValidateNewLessEqualBaseVersion;
8280 break;
8281 case "Equal":
8282 case "equal":
8283 validationFlags |= TransformFlags.ValidateNewEqualBaseVersion;
8284 break;
8285 case "GreaterOrEqual":
8286 case "greaterOrEqual":
8287 validationFlags |= TransformFlags.ValidateNewGreaterEqualBaseVersion;
8288 break;
8289 case "Greater":
8290 case "greater":
8291 validationFlags |= TransformFlags.ValidateNewGreaterBaseVersion;
8292 break;
8293 case "":
8294 break;
8295 default:
8296 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Operator", op, "Lesser", "LesserOrEqual", "Equal", "GreaterOrEqual", "Greater"));
8297 break;
8298 }
8259 break; 8299 break;
8260 default: 8300 case "UpgradeCode":
8261 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Version", check, "Major", "Minor", "Update")); 8301 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8302 {
8303 validationFlags |= TransformFlags.ValidateUpgradeCode;
8304 }
8305 else
8306 {
8307 validationFlags &= ~TransformFlags.ValidateUpgradeCode;
8308 }
8262 break; 8309 break;
8263 } 8310 case "IgnoreAddExistingRow":
8264 break; 8311 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8265 case "ProductVersionOperator": 8312 {
8266 var op = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 8313 validationFlags |= TransformFlags.ErrorAddExistingRow;
8267 validationFlags &= ~TransformFlags.ProductVersionOperatorMask; 8314 }
8268 switch (op) 8315 else
8269 { 8316 {
8270 case "Lesser": 8317 validationFlags &= ~TransformFlags.ErrorAddExistingRow;
8271 case "lesser": 8318 }
8272 validationFlags |= TransformFlags.ValidateNewLessBaseVersion;
8273 break; 8319 break;
8274 case "LesserOrEqual": 8320 case "IgnoreAddExistingTable":
8275 case "lesserOrEqual": 8321 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8276 validationFlags |= TransformFlags.ValidateNewLessEqualBaseVersion; 8322 {
8323 validationFlags |= TransformFlags.ErrorAddExistingTable;
8324 }
8325 else
8326 {
8327 validationFlags &= ~TransformFlags.ErrorAddExistingTable;
8328 }
8277 break; 8329 break;
8278 case "Equal": 8330 case "IgnoreDeleteMissingRow":
8279 case "equal": 8331 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8280 validationFlags |= TransformFlags.ValidateNewEqualBaseVersion; 8332 {
8333 validationFlags |= TransformFlags.ErrorDeleteMissingRow;
8334 }
8335 else
8336 {
8337 validationFlags &= ~TransformFlags.ErrorDeleteMissingRow;
8338 }
8281 break; 8339 break;
8282 case "GreaterOrEqual": 8340 case "IgnoreDeleteMissingTable":
8283 case "greaterOrEqual": 8341 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8284 validationFlags |= TransformFlags.ValidateNewGreaterEqualBaseVersion; 8342 {
8343 validationFlags |= TransformFlags.ErrorDeleteMissingTable;
8344 }
8345 else
8346 {
8347 validationFlags &= ~TransformFlags.ErrorDeleteMissingTable;
8348 }
8285 break; 8349 break;
8286 case "Greater": 8350 case "IgnoreUpdateMissingRow":
8287 case "greater": 8351 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8288 validationFlags |= TransformFlags.ValidateNewGreaterBaseVersion; 8352 {
8353 validationFlags |= TransformFlags.ErrorUpdateMissingRow;
8354 }
8355 else
8356 {
8357 validationFlags &= ~TransformFlags.ErrorUpdateMissingRow;
8358 }
8289 break; 8359 break;
8290 case "": 8360 case "IgnoreChangingCodePage":
8361 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8362 {
8363 validationFlags |= TransformFlags.ErrorChangeCodePage;
8364 }
8365 else
8366 {
8367 validationFlags &= ~TransformFlags.ErrorChangeCodePage;
8368 }
8291 break; 8369 break;
8292 default: 8370 default:
8293 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Operator", op, "Lesser", "LesserOrEqual", "Equal", "GreaterOrEqual", "Greater")); 8371 this.Core.UnexpectedAttribute(node, attrib);
8294 break; 8372 break;
8295 }
8296 break;
8297 case "UpgradeCode":
8298 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8299 {
8300 validationFlags |= TransformFlags.ValidateUpgradeCode;
8301 }
8302 else
8303 {
8304 validationFlags &= ~TransformFlags.ValidateUpgradeCode;
8305 }
8306 break;
8307 case "IgnoreAddExistingRow":
8308 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8309 {
8310 validationFlags |= TransformFlags.ErrorAddExistingRow;
8311 }
8312 else
8313 {
8314 validationFlags &= ~TransformFlags.ErrorAddExistingRow;
8315 }
8316 break;
8317 case "IgnoreAddExistingTable":
8318 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8319 {
8320 validationFlags |= TransformFlags.ErrorAddExistingTable;
8321 }
8322 else
8323 {
8324 validationFlags &= ~TransformFlags.ErrorAddExistingTable;
8325 }
8326 break;
8327 case "IgnoreDeleteMissingRow":
8328 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8329 {
8330 validationFlags |= TransformFlags.ErrorDeleteMissingRow;
8331 }
8332 else
8333 {
8334 validationFlags &= ~TransformFlags.ErrorDeleteMissingRow;
8335 }
8336 break;
8337 case "IgnoreDeleteMissingTable":
8338 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8339 {
8340 validationFlags |= TransformFlags.ErrorDeleteMissingTable;
8341 }
8342 else
8343 {
8344 validationFlags &= ~TransformFlags.ErrorDeleteMissingTable;
8345 }
8346 break;
8347 case "IgnoreUpdateMissingRow":
8348 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8349 {
8350 validationFlags |= TransformFlags.ErrorUpdateMissingRow;
8351 }
8352 else
8353 {
8354 validationFlags &= ~TransformFlags.ErrorUpdateMissingRow;
8355 }
8356 break;
8357 case "IgnoreChangingCodePage":
8358 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
8359 {
8360 validationFlags |= TransformFlags.ErrorChangeCodePage;
8361 }
8362 else
8363 {
8364 validationFlags &= ~TransformFlags.ErrorChangeCodePage;
8365 }
8366 break;
8367 default:
8368 this.Core.UnexpectedAttribute(node, attrib);
8369 break;
8370 } 8373 }
8371 } 8374 }
8372 else 8375 else
diff --git a/src/wix/WixToolset.Core/Compiler_Bundle.cs b/src/wix/WixToolset.Core/Compiler_Bundle.cs
index 49a729db..db49e728 100644
--- a/src/wix/WixToolset.Core/Compiler_Bundle.cs
+++ b/src/wix/WixToolset.Core/Compiler_Bundle.cs
@@ -466,6 +466,20 @@ namespace WixToolset.Core
466 Name = "bundle-attached.cab", 466 Name = "bundle-attached.cab",
467 Type = ContainerType.Attached, 467 Type = ContainerType.Attached,
468 }); 468 });
469
470 if (!String.IsNullOrEmpty(iconSourceFile))
471 {
472 var compilerPayload = new CompilerPayload(this.Core, sourceLineNumbers, node)
473 {
474 Id = new Identifier(AccessModifier.Section, "WixBundle.ico"),
475 Name = "WixBundle.ico",
476 SourceFile = iconSourceFile,
477 };
478
479 compilerPayload.FinishCompilingPayload(Compiler.BurnUXContainerId.Id);
480
481 compilerPayload.CreatePayloadSymbol(ComplexReferenceParentType.Container, Compiler.BurnUXContainerId.Id);
482 }
469 } 483 }
470 } 484 }
471 485
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs
index 174df55f..148ba739 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs
@@ -78,7 +78,7 @@ namespace WixToolsetTest.CoreIntegration
78 [Fact] 78 [Fact]
79 public void CanBuildSimpleBundle() 79 public void CanBuildSimpleBundle()
80 { 80 {
81 var folder = TestData.Get(@"TestData\SimpleBundle"); 81 var folder = TestData.Get(@"TestData", "SimpleBundle");
82 82
83 using (var fs = new DisposableFileSystem()) 83 using (var fs = new DisposableFileSystem())
84 { 84 {
@@ -96,6 +96,7 @@ namespace WixToolsetTest.CoreIntegration
96 "-loc", Path.Combine(folder, "Bundle.en-us.wxl"), 96 "-loc", Path.Combine(folder, "Bundle.en-us.wxl"),
97 "-bindpath", Path.Combine(folder, "data"), 97 "-bindpath", Path.Combine(folder, "data"),
98 "-intermediateFolder", intermediateFolder, 98 "-intermediateFolder", intermediateFolder,
99 "-bindpath", Path.Combine(folder, "data"),
99 "-o", exePath, 100 "-o", exePath,
100 }); 101 });
101 102
@@ -172,6 +173,12 @@ namespace WixToolsetTest.CoreIntegration
172 }, registrationElements); 173 }, registrationElements);
173 174
174 var ignoreAttributesByElementName = new Dictionary<string, List<string>>() { { "Payload", new List<string> { "FileSize", "Hash" } } }; 175 var ignoreAttributesByElementName = new Dictionary<string, List<string>>() { { "Payload", new List<string> { "FileSize", "Hash" } } };
176 var iconPayloads = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:UX/burn:Payload[@Id='WixBundle.ico']", ignoreAttributesByElementName);
177 WixAssert.CompareLineByLine(
178 [
179 "<Payload Id='WixBundle.ico' FilePath='WixBundle.ico' SourcePath='u1' />",
180 ], iconPayloads);
181
175 var msiPayloads = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Payload[@Id='test.msi']", ignoreAttributesByElementName); 182 var msiPayloads = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Payload[@Id='test.msi']", ignoreAttributesByElementName);
176 WixAssert.CompareLineByLine(new[] 183 WixAssert.CompareLineByLine(new[]
177 { 184 {
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs
index c132eb80..ca5f869d 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs
@@ -163,6 +163,45 @@ namespace WixToolsetTest.CoreIntegration
163 } 163 }
164 164
165 [Fact] 165 [Fact]
166 public void CanGetAnonymousDirectories()
167 {
168 var folder = TestData.Get("TestData");
169
170 using (var fs = new DisposableFileSystem())
171 {
172 var baseFolder = fs.GetFolder();
173 var intermediateFolder = Path.Combine(baseFolder, "obj");
174 var wixlibPath = Path.Combine(baseFolder, "bin", "test.msi");
175
176 var result = WixRunner.Execute(
177 [
178 "build",
179 "-arch", "x64",
180 Path.Combine(folder, "Directory", "AnonymousDirectories.wxs"),
181 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
182 "-intermediateFolder", intermediateFolder,
183 "-o", wixlibPath
184 ]);
185
186 result.AssertSuccess();
187
188 var pdb = WindowsInstallerData.Load(Path.Combine(baseFolder, "bin", "test.wixpdb"));
189 var directoryRows = pdb.Tables["Directory"].Rows;
190
191 var dirs = directoryRows.Select(d => d.ToString()).OrderBy(s => s).ToArray();
192 WixAssert.CompareLineByLine(
193 [
194 @"DesktopFolder/TARGETDIR/Desktop",
195 @"dHKac23vLoBC5fFrqxqAIybMFOj0/DesktopFolder/a",
196 @"dKom2ks4onBH9RsYLDhjge71s7s8/dlvpu0ovv8DWWVrdCVSYzDfsibzg/c",
197 @"dlvpu0ovv8DWWVrdCVSYzDfsibzg/dHKac23vLoBC5fFrqxqAIybMFOj0/b",
198 @"SomeFolder/TARGETDIR/fef2brvc|Some Folder",
199 @"TARGETDIR//SourceDir"
200 ], dirs);
201 }
202 }
203
204 [Fact]
166 public void CanGetDefaultName() 205 public void CanGetDefaultName()
167 { 206 {
168 var folder = TestData.Get(@"TestData"); 207 var folder = TestData.Get(@"TestData");
@@ -293,9 +332,9 @@ namespace WixToolsetTest.CoreIntegration
293 var directoryRows = data.Tables["Directory"].Rows; 332 var directoryRows = data.Tables["Directory"].Rows;
294 WixAssert.CompareLineByLine(new[] 333 WixAssert.CompareLineByLine(new[]
295 { 334 {
296 "d4EceYatXTyy8HXPt5B6DT9Rj.wE:ProgramFilesFolder:u7-b4gch|Example Corporation", 335 "dwGveZhe5wcMbbRyRAkRwm2sqnE4:ProgramFilesFolder:u7-b4gch|Example Corporation",
297 "dSJ1pgiASlW7kJTu0wqsGBklJsS0:d4EceYatXTyy8HXPt5B6DT9Rj.wE:vjj-gxay|Test Product", 336 "d8kPFuRMPxdOxfpYS0O8azlhLUpY:dwGveZhe5wcMbbRyRAkRwm2sqnE4:vjj-gxay|Test Product",
298 "BinFolder:dSJ1pgiASlW7kJTu0wqsGBklJsS0:bin", 337 "BinFolder:d8kPFuRMPxdOxfpYS0O8azlhLUpY:bin",
299 "ProgramFilesFolder:TARGETDIR:PFiles", 338 "ProgramFilesFolder:TARGETDIR:PFiles",
300 "TARGETDIR::SourceDir" 339 "TARGETDIR::SourceDir"
301 }, directoryRows.Select(r => r.FieldAsString(0) + ":" + r.FieldAsString(1) + ":" + r.FieldAsString(2)).ToArray()); 340 }, directoryRows.Select(r => r.FieldAsString(0) + ":" + r.FieldAsString(1) + ":" + r.FieldAsString(2)).ToArray());
@@ -386,9 +425,9 @@ namespace WixToolsetTest.CoreIntegration
386 var directoryRows = data.Tables["Directory"].Rows; 425 var directoryRows = data.Tables["Directory"].Rows;
387 WixAssert.CompareLineByLine(new[] 426 WixAssert.CompareLineByLine(new[]
388 { 427 {
389 @"d1nVb5_zcCwRCz7i2YXNAofGRmfc:ProgramFilesFolder:a", 428 @"dKO7wPCF.XLmq6KnqybHHgcBBqtU:dvFwapipzsdDBjHbM5DUi_2llN.k:c",
390 @"dijlG.bNicFgvj1_DujiGg9EBGrQ:d1nVb5_zcCwRCz7i2YXNAofGRmfc:b", 429 @"dvFwapipzsdDBjHbM5DUi_2llN.k:dyJuT.V6E4sWuHVv3CZiBNvrX2Lo:b",
391 @"dKO7wPCF.XLmq6KnqybHHgcBBqtU:dijlG.bNicFgvj1_DujiGg9EBGrQ:c", 430 @"dyJuT.V6E4sWuHVv3CZiBNvrX2Lo:ProgramFilesFolder:a",
392 "ProgramFilesFolder:TARGETDIR:PFiles", 431 "ProgramFilesFolder:TARGETDIR:PFiles",
393 "TARGETDIR::SourceDir" 432 "TARGETDIR::SourceDir"
394 }, directoryRows.Select(r => r.FieldAsString(0) + ":" + r.FieldAsString(1) + ":" + r.FieldAsString(2)).OrderBy(s => s).ToArray()); 433 }, directoryRows.Select(r => r.FieldAsString(0) + ":" + r.FieldAsString(1) + ":" + r.FieldAsString(2)).OrderBy(s => s).ToArray());
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/LanguageFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/LanguageFixture.cs
index 8dc135eb..3c7342ce 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/LanguageFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/LanguageFixture.cs
@@ -56,13 +56,13 @@ namespace WixToolsetTest.CoreIntegration
56 56
57 var data = WindowsInstallerData.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); 57 var data = WindowsInstallerData.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
58 var directoryRows = data.Tables["Directory"].Rows; 58 var directoryRows = data.Tables["Directory"].Rows;
59 WixAssert.CompareLineByLine(new[] 59 WixAssert.CompareLineByLine(
60 { 60 [
61 "d4EceYatXTyy8HXPt5B6DT9Rj.wE:u7-b4gch|Example Corporation", 61 "dwGveZhe5wcMbbRyRAkRwm2sqnE4:ProgramFilesFolder:u7-b4gch|Example Corporation",
62 "INSTALLFOLDER:oekcr5lq|MsiPackage", 62 "INSTALLFOLDER:dwGveZhe5wcMbbRyRAkRwm2sqnE4:oekcr5lq|MsiPackage",
63 "ProgramFilesFolder:PFiles", 63 "ProgramFilesFolder:TARGETDIR:PFiles",
64 "TARGETDIR:SourceDir" 64 "TARGETDIR::SourceDir"
65 }, directoryRows.Select(r => r.FieldAsString(0) + ":" + r.FieldAsString(2)).ToArray()); 65 ], [.. directoryRows.Select(r => r.FieldAsString(0) + ":" + r.FieldAsString(1) + ":" + r.FieldAsString(2))]);
66 } 66 }
67 } 67 }
68 68
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Directory/AnonymousDirectories.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Directory/AnonymousDirectories.wxs
new file mode 100644
index 00000000..4c25fed0
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Directory/AnonymousDirectories.wxs
@@ -0,0 +1,22 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Package Id="WixToolsetTest.TestPackage" Name="~RedundantSubdirectories" Version="1.0.0.0" Manufacturer="Example Corporation" Compressed="no">
4 <ComponentGroupRef Id="Files" />
5
6 <Directory Id="SomeFolder" Name="Some Folder" />
7 </Package>
8
9 <Fragment>
10 <ComponentGroup Id="Files">
11 <Component Directory="SomeFolder">
12 <File Source="test.txt" KeyPath="yes">
13 <Shortcut Id="Shortcut1" Name="Test Shortcut" Directory="DesktopFolder" Subdirectory="a\b\c" Advertise="yes" />
14 </File>
15
16 <RemoveFolder Id="RemoveAFolder" Directory="DesktopFolder" Subdirectory="a" On="uninstall" />
17 <RemoveFolder Id="RemoveBFolder" Directory="DesktopFolder" Subdirectory="a\b" On="uninstall" />
18 <RemoveFolder Id="RemoveCFolder" Directory="DesktopFolder" Subdirectory="a\b\c" On="uninstall" />
19 </Component>
20 </ComponentGroup>
21 </Fragment>
22</Wix>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.wxs
index cda76252..47b7e88e 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.wxs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.wxs
@@ -1,5 +1,6 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> 1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Bundle Name="!(loc.BundleName)" InProgressName="!(loc.BundleInProgressName)" Version="!(bind.packageVersion.test.msi)" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"> 2 <Bundle Name="!(loc.BundleName)" Manufacturer="Example Corporation" Version="!(bind.packageVersion.test.msi)" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"
3 InProgressName="!(loc.BundleInProgressName)" IconSourceFile="test.ico">
3 <BootstrapperApplication SourceFile="fakeba.dll" /> 4 <BootstrapperApplication SourceFile="fakeba.dll" />
4 5
5 <Chain> 6 <Chain>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/data/test.ico b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/data/test.ico
new file mode 100644
index 00000000..906ce324
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/data/test.ico
Binary files differ
diff --git a/src/xsd/bal.xsd b/src/xsd/bal.xsd
index ff4142ad..59c1f91e 100644
--- a/src/xsd/bal.xsd
+++ b/src/xsd/bal.xsd
@@ -623,6 +623,21 @@
623 </xs:simpleType> 623 </xs:simpleType>
624 </xs:attribute> 624 </xs:attribute>
625 625
626 <xs:attribute name="DisplayFilesInUseDialogCondition" type="xs:string">
627 <xs:annotation>
628 <xs:documentation>
629 Specifies whether the bundle allows the Files In Use dialog to be displayed for the MSI or MSP package. If not
630 specified (the default) or the condition evaluates to true, the Files In Use dialog prompts the user during full
631 bundle UI to close applications to release the file. Otherwise, the dialog is not displayed and the package might
632 require a restart when files are in use.
633 </xs:documentation>
634 <xs:appinfo>
635 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="MsiPackage" />
636 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="MspPackage" />
637 </xs:appinfo>
638 </xs:annotation>
639 </xs:attribute>
640
626 <xs:attribute name="DisplayInternalUICondition" type="xs:string"> 641 <xs:attribute name="DisplayInternalUICondition" type="xs:string">
627 <xs:annotation> 642 <xs:annotation>
628 <xs:documentation> 643 <xs:documentation>