diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2021-03-10 15:47:59 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2021-03-11 20:24:18 -0600 |
| commit | 10ef9d5bfbf81f454113a1c2716009831a916222 (patch) | |
| tree | 9e2fd8c917787ceba5e4c7f873d715eafbda6920 /src/engine/plan.cpp | |
| parent | 778b65643f19df94947d390a5a17023043d840b4 (diff) | |
| download | wix-10ef9d5bfbf81f454113a1c2716009831a916222.tar.gz wix-10ef9d5bfbf81f454113a1c2716009831a916222.tar.bz2 wix-10ef9d5bfbf81f454113a1c2716009831a916222.zip | |
Determine whether to ignore forward compatible bundles during Plan.
Diffstat (limited to 'src/engine/plan.cpp')
| -rw-r--r-- | src/engine/plan.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/engine/plan.cpp b/src/engine/plan.cpp index 4f29209f..87607382 100644 --- a/src/engine/plan.cpp +++ b/src/engine/plan.cpp | |||
| @@ -194,6 +194,8 @@ extern "C" void PlanReset( | |||
| 194 | __in BURN_PACKAGES* pPackages | 194 | __in BURN_PACKAGES* pPackages |
| 195 | ) | 195 | ) |
| 196 | { | 196 | { |
| 197 | PackageUninitialize(&pPlan->forwardCompatibleBundle); | ||
| 198 | |||
| 197 | if (pPlan->rgRegistrationActions) | 199 | if (pPlan->rgRegistrationActions) |
| 198 | { | 200 | { |
| 199 | for (DWORD i = 0; i < pPlan->cRegistrationActions; ++i) | 201 | for (DWORD i = 0; i < pPlan->cRegistrationActions; ++i) |
| @@ -488,6 +490,72 @@ LExit: | |||
| 488 | return hr; | 490 | return hr; |
| 489 | } | 491 | } |
| 490 | 492 | ||
| 493 | extern "C" HRESULT PlanForwardCompatibleBundles( | ||
| 494 | __in BURN_USER_EXPERIENCE* pUX, | ||
| 495 | __in BOOTSTRAPPER_COMMAND* pCommand, | ||
| 496 | __in BURN_PLAN* pPlan, | ||
| 497 | __in BURN_REGISTRATION* pRegistration, | ||
| 498 | __in BOOTSTRAPPER_ACTION action | ||
| 499 | ) | ||
| 500 | { | ||
| 501 | HRESULT hr = S_OK; | ||
| 502 | BOOL fRecommendIgnore = TRUE; | ||
| 503 | BOOL fIgnoreBundle = FALSE; | ||
| 504 | |||
| 505 | if (!pRegistration->fForwardCompatibleBundleExists) | ||
| 506 | { | ||
| 507 | ExitFunction(); | ||
| 508 | } | ||
| 509 | |||
| 510 | // Only change the recommendation if an active parent was provided. | ||
| 511 | if (pRegistration->sczActiveParent && *pRegistration->sczActiveParent) | ||
| 512 | { | ||
| 513 | // On install, recommend running the forward compatible bundle because there is an active parent. This | ||
| 514 | // will essentially register the parent with the forward compatible bundle. | ||
| 515 | if (BOOTSTRAPPER_ACTION_INSTALL == action) | ||
| 516 | { | ||
| 517 | fRecommendIgnore = FALSE; | ||
| 518 | } | ||
| 519 | else if (BOOTSTRAPPER_ACTION_UNINSTALL == action || | ||
| 520 | BOOTSTRAPPER_ACTION_MODIFY == action || | ||
| 521 | BOOTSTRAPPER_ACTION_REPAIR == action) | ||
| 522 | { | ||
| 523 | // When modifying the bundle, only recommend running the forward compatible bundle if the parent | ||
| 524 | // is already registered as a dependent of the provider key. | ||
| 525 | if (pRegistration->fParentRegisteredAsDependent) | ||
| 526 | { | ||
| 527 | fRecommendIgnore = FALSE; | ||
| 528 | } | ||
| 529 | } | ||
| 530 | } | ||
| 531 | |||
| 532 | for (DWORD iRelatedBundle = 0; iRelatedBundle < pRegistration->relatedBundles.cRelatedBundles; ++iRelatedBundle) | ||
| 533 | { | ||
| 534 | BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgRelatedBundles + iRelatedBundle; | ||
| 535 | if (!pRelatedBundle->fForwardCompatible) | ||
| 536 | { | ||
| 537 | continue; | ||
| 538 | } | ||
| 539 | |||
| 540 | fIgnoreBundle = fRecommendIgnore; | ||
| 541 | |||
| 542 | hr = UserExperienceOnPlanForwardCompatibleBundle(pUX, pRelatedBundle->package.sczId, pRelatedBundle->relationType, pRelatedBundle->sczTag, pRelatedBundle->package.fPerMachine, pRelatedBundle->pVersion, &fIgnoreBundle); | ||
| 543 | ExitOnRootFailure(hr, "BA aborted plan forward compatible bundle."); | ||
| 544 | |||
| 545 | if (!fIgnoreBundle) | ||
| 546 | { | ||
| 547 | hr = PseudoBundleInitializePassthrough(&pPlan->forwardCompatibleBundle, pCommand, NULL, pRegistration->sczActiveParent, pRegistration->sczAncestors, &pRelatedBundle->package); | ||
| 548 | ExitOnFailure(hr, "Failed to initialize pass through bundle."); | ||
| 549 | |||
| 550 | pPlan->fEnabledForwardCompatibleBundle = TRUE; | ||
| 551 | break; | ||
| 552 | } | ||
| 553 | } | ||
| 554 | |||
| 555 | LExit: | ||
| 556 | return hr; | ||
| 557 | } | ||
| 558 | |||
| 491 | extern "C" HRESULT PlanPackages( | 559 | extern "C" HRESULT PlanPackages( |
| 492 | __in BURN_USER_EXPERIENCE* pUX, | 560 | __in BURN_USER_EXPERIENCE* pUX, |
| 493 | __in BURN_PACKAGES* pPackages, | 561 | __in BURN_PACKAGES* pPackages, |
