diff options
| author | Bob Arnson <bob@firegiant.com> | 2026-02-04 20:47:04 -0500 |
|---|---|---|
| committer | Bob Arnson <bob@firegiant.com> | 2026-02-04 20:47:04 -0500 |
| commit | edccb203c421d2bd820062024088c6698424d9ee (patch) | |
| tree | 6b47c3eb5ca53bd9f79f3d032dc1a596d411bf38 /src/burn/engine/package.cpp | |
| parent | a3d3963f806117ce123d95e8b77e73e1c1545b25 (diff) | |
| download | wix-bob/ConfigurableScopeBundles.tar.gz wix-bob/ConfigurableScopeBundles.tar.bz2 wix-bob/ConfigurableScopeBundles.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.cpp | 48 |
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 | ||
| 599 | extern "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 | |||
| 632 | LExit: | ||
| 633 | ReleaseStr(scz); | ||
| 634 | |||
| 635 | return hr; | ||
| 636 | } | ||
| 637 | |||
| 596 | 638 | ||
| 597 | // internal function declarations | 639 | // internal function declarations |
| 598 | 640 | ||
