aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/package.cpp
diff options
context:
space:
mode:
authorBob Arnson <bob@firegiant.com>2026-02-04 20:47:04 -0500
committerBob Arnson <bob@firegiant.com>2026-02-04 20:47:04 -0500
commitedccb203c421d2bd820062024088c6698424d9ee (patch)
tree6b47c3eb5ca53bd9f79f3d032dc1a596d411bf38 /src/burn/engine/package.cpp
parenta3d3963f806117ce123d95e8b77e73e1c1545b25 (diff)
downloadwix-edccb203c421d2bd820062024088c6698424d9ee.tar.gz
wix-edccb203c421d2bd820062024088c6698424d9ee.tar.bz2
wix-edccb203c421d2bd820062024088c6698424d9ee.zip
Support dual-purpose packages in Burn.bob/ConfigurableScopeBundles
Fixes https://github.com/wixtoolset/issues/issues/8958
Diffstat (limited to 'src/burn/engine/package.cpp')
-rw-r--r--src/burn/engine/package.cpp48
1 files changed, 45 insertions, 3 deletions
diff --git a/src/burn/engine/package.cpp b/src/burn/engine/package.cpp
index 3bf676ba..61b73dc6 100644
--- a/src/burn/engine/package.cpp
+++ b/src/burn/engine/package.cpp
@@ -154,9 +154,12 @@ extern "C" HRESULT PackagesParseFromXml(
154 hr = XmlGetAttributeUInt64(pixnNode, L"InstallSize", &pPackage->qwInstallSize); 154 hr = XmlGetAttributeUInt64(pixnNode, L"InstallSize", &pPackage->qwInstallSize);
155 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @InstallSize."); 155 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @InstallSize.");
156 156
157 // @PerMachine 157 // @Scope
158 hr = XmlGetYesNoAttribute(pixnNode, L"PerMachine", &pPackage->fPerMachine); 158 hr = PackageParseScopeFromXml(pixnNode, &pPackage->scope);
159 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @PerMachine."); 159 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Scope.");
160
161 // Shortcut for static per-machine or per-user packages.
162 pPackage->fPerMachine = BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE == pPackage->scope;
160 163
161 // @Permanent 164 // @Permanent
162 hr = XmlGetYesNoAttribute(pixnNode, L"Permanent", &pPackage->fPermanent); 165 hr = XmlGetYesNoAttribute(pixnNode, L"Permanent", &pPackage->fPermanent);
@@ -593,6 +596,45 @@ LExit:
593 return hr; 596 return hr;
594} 597}
595 598
599extern "C" HRESULT PackageParseScopeFromXml(
600 __in IXMLDOMNode* pixn,
601 __in BOOTSTRAPPER_PACKAGE_SCOPE* pScope
602)
603{
604 HRESULT hr = S_OK;
605 LPWSTR scz = NULL;
606
607 hr = XmlGetAttributeEx(pixn, L"Scope", &scz);
608 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Scope.");
609
610 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, scz, -1, L"perMachine", -1))
611 {
612 *pScope = BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE;
613 }
614 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, scz, -1, L"perUser", -1))
615 {
616 *pScope = BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER;
617 }
618 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, scz, -1, L"perUserOrMachine", -1))
619 {
620 *pScope = BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER_OR_PER_MACHINE;
621 }
622 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, scz, -1, L"perMachineOrUser", -1))
623 {
624 *pScope = BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE_OR_PER_USER;
625 }
626 else
627 {
628 hr = E_UNEXPECTED;
629 ExitOnRootFailure(hr, "Invalid scope: %ls", scz);
630 }
631
632LExit:
633 ReleaseStr(scz);
634
635 return hr;
636}
637
596 638
597// internal function declarations 639// internal function declarations
598 640