diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2022-03-13 23:51:36 -0500 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-03-14 14:53:29 -0500 |
| commit | 9453eaa9a38f78e248526ddd996485140a5d4d9a (patch) | |
| tree | 8ef6bda85836fd3f1b9c2c6c16cb4a994519e863 /src/burn/engine | |
| parent | 78125b7c4bd59468275d65b63860bdb68b1bc6f1 (diff) | |
| download | wix-9453eaa9a38f78e248526ddd996485140a5d4d9a.tar.gz wix-9453eaa9a38f78e248526ddd996485140a5d4d9a.tar.bz2 wix-9453eaa9a38f78e248526ddd996485140a5d4d9a.zip | |
Make engine skip planning if there are any downgrade related bundles.
Fixes 6677, 6722
Reverts 6537
Diffstat (limited to 'src/burn/engine')
| -rw-r--r-- | src/burn/engine/core.cpp | 39 | ||||
| -rw-r--r-- | src/burn/engine/engine.mc | 14 | ||||
| -rw-r--r-- | src/burn/engine/plan.cpp | 19 | ||||
| -rw-r--r-- | src/burn/engine/plan.h | 1 | ||||
| -rw-r--r-- | src/burn/engine/userexperience.cpp | 24 | ||||
| -rw-r--r-- | src/burn/engine/userexperience.h | 4 |
6 files changed, 90 insertions, 11 deletions
diff --git a/src/burn/engine/core.cpp b/src/burn/engine/core.cpp index 9d4ea43e..37872e52 100644 --- a/src/burn/engine/core.cpp +++ b/src/burn/engine/core.cpp | |||
| @@ -527,8 +527,15 @@ extern "C" HRESULT CorePlan( | |||
| 527 | hr = PlanRelatedBundlesInitialize(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->plan); | 527 | hr = PlanRelatedBundlesInitialize(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->plan); |
| 528 | ExitOnFailure(hr, "Failed to initialize related bundles for plan."); | 528 | ExitOnFailure(hr, "Failed to initialize related bundles for plan."); |
| 529 | 529 | ||
| 530 | hr = PlanRegistration(&pEngineState->plan, &pEngineState->registration, &pEngineState->dependencies, pEngineState->command.resumeType, pEngineState->command.relationType, &fContinuePlanning); | 530 | if (pEngineState->plan.fDowngrade) |
| 531 | ExitOnFailure(hr, "Failed to plan registration."); | 531 | { |
| 532 | fContinuePlanning = FALSE; | ||
| 533 | } | ||
| 534 | else | ||
| 535 | { | ||
| 536 | hr = PlanRegistration(&pEngineState->plan, &pEngineState->registration, &pEngineState->dependencies, pEngineState->command.resumeType, pEngineState->command.relationType, &fContinuePlanning); | ||
| 537 | ExitOnFailure(hr, "Failed to plan registration."); | ||
| 538 | } | ||
| 532 | 539 | ||
| 533 | if (fContinuePlanning) | 540 | if (fContinuePlanning) |
| 534 | { | 541 | { |
| @@ -615,6 +622,7 @@ extern "C" HRESULT CoreApply( | |||
| 615 | { | 622 | { |
| 616 | HRESULT hr = S_OK; | 623 | HRESULT hr = S_OK; |
| 617 | HANDLE hLock = NULL; | 624 | HANDLE hLock = NULL; |
| 625 | BOOL fApplyBegan = FALSE; | ||
| 618 | BOOL fApplyInitialize = FALSE; | 626 | BOOL fApplyInitialize = FALSE; |
| 619 | BOOL fElevated = FALSE; | 627 | BOOL fElevated = FALSE; |
| 620 | BOOL fRegistered = FALSE; | 628 | BOOL fRegistered = FALSE; |
| @@ -627,8 +635,6 @@ extern "C" HRESULT CoreApply( | |||
| 627 | DWORD dwPhaseCount = 0; | 635 | DWORD dwPhaseCount = 0; |
| 628 | BOOTSTRAPPER_APPLYCOMPLETE_ACTION applyCompleteAction = BOOTSTRAPPER_APPLYCOMPLETE_ACTION_NONE; | 636 | BOOTSTRAPPER_APPLYCOMPLETE_ACTION applyCompleteAction = BOOTSTRAPPER_APPLYCOMPLETE_ACTION_NONE; |
| 629 | 637 | ||
| 630 | LogId(REPORT_STANDARD, MSG_APPLY_BEGIN); | ||
| 631 | |||
| 632 | if (!pEngineState->fPlanned) | 638 | if (!pEngineState->fPlanned) |
| 633 | { | 639 | { |
| 634 | ExitOnFailure(hr = E_INVALIDSTATE, "Apply cannot be done without a successful Plan."); | 640 | ExitOnFailure(hr = E_INVALIDSTATE, "Apply cannot be done without a successful Plan."); |
| @@ -638,6 +644,10 @@ extern "C" HRESULT CoreApply( | |||
| 638 | ExitOnFailure(hr = E_INVALIDSTATE, "Plans cannot be applied multiple times."); | 644 | ExitOnFailure(hr = E_INVALIDSTATE, "Plans cannot be applied multiple times."); |
| 639 | } | 645 | } |
| 640 | 646 | ||
| 647 | fApplyBegan = TRUE; | ||
| 648 | |||
| 649 | LogId(REPORT_STANDARD, MSG_APPLY_BEGIN); | ||
| 650 | |||
| 641 | // Ensure any previous attempts to execute are reset. | 651 | // Ensure any previous attempts to execute are reset. |
| 642 | ApplyReset(&pEngineState->userExperience, &pEngineState->packages); | 652 | ApplyReset(&pEngineState->userExperience, &pEngineState->packages); |
| 643 | 653 | ||
| @@ -653,6 +663,14 @@ extern "C" HRESULT CoreApply( | |||
| 653 | hr = UserExperienceOnApplyBegin(&pEngineState->userExperience, dwPhaseCount); | 663 | hr = UserExperienceOnApplyBegin(&pEngineState->userExperience, dwPhaseCount); |
| 654 | ExitOnRootFailure(hr, "BA aborted apply begin."); | 664 | ExitOnRootFailure(hr, "BA aborted apply begin."); |
| 655 | 665 | ||
| 666 | if (pEngineState->plan.fDowngrade) | ||
| 667 | { | ||
| 668 | hr = HRESULT_FROM_WIN32(ERROR_PRODUCT_VERSION); | ||
| 669 | UserExperienceOnApplyDowngrade(&pEngineState->userExperience, &hr); | ||
| 670 | |||
| 671 | ExitFunction(); | ||
| 672 | } | ||
| 673 | |||
| 656 | pEngineState->plan.fAffectedMachineState = pEngineState->plan.fCanAffectMachineState; | 674 | pEngineState->plan.fAffectedMachineState = pEngineState->plan.fCanAffectMachineState; |
| 657 | 675 | ||
| 658 | hr = ApplyLock(FALSE, &hLock); | 676 | hr = ApplyLock(FALSE, &hLock); |
| @@ -804,13 +822,16 @@ LExit: | |||
| 804 | DeleteCriticalSection(&applyContext.csApply); | 822 | DeleteCriticalSection(&applyContext.csApply); |
| 805 | } | 823 | } |
| 806 | 824 | ||
| 807 | UserExperienceOnApplyComplete(&pEngineState->userExperience, hr, restart, &applyCompleteAction); | 825 | if (fApplyBegan) |
| 808 | if (BOOTSTRAPPER_APPLYCOMPLETE_ACTION_RESTART == applyCompleteAction) | ||
| 809 | { | 826 | { |
| 810 | pEngineState->fRestart = TRUE; | 827 | UserExperienceOnApplyComplete(&pEngineState->userExperience, hr, restart, &applyCompleteAction); |
| 811 | } | 828 | if (BOOTSTRAPPER_APPLYCOMPLETE_ACTION_RESTART == applyCompleteAction) |
| 829 | { | ||
| 830 | pEngineState->fRestart = TRUE; | ||
| 831 | } | ||
| 812 | 832 | ||
| 813 | LogId(REPORT_STANDARD, MSG_APPLY_COMPLETE, hr, LoggingRestartToString(restart), LoggingBoolToString(pEngineState->fRestart)); | 833 | LogId(REPORT_STANDARD, MSG_APPLY_COMPLETE, hr, LoggingRestartToString(restart), LoggingBoolToString(pEngineState->fRestart)); |
| 834 | } | ||
| 814 | 835 | ||
| 815 | return hr; | 836 | return hr; |
| 816 | } | 837 | } |
diff --git a/src/burn/engine/engine.mc b/src/burn/engine/engine.mc index a5c4e2ba..53e6b256 100644 --- a/src/burn/engine/engine.mc +++ b/src/burn/engine/engine.mc | |||
| @@ -499,6 +499,20 @@ Language=English | |||
| 499 | Ignoring bundle dependents due to action UnsafeUninstall... | 499 | Ignoring bundle dependents due to action UnsafeUninstall... |
| 500 | . | 500 | . |
| 501 | 501 | ||
| 502 | MessageId=224 | ||
| 503 | Severity=Warning | ||
| 504 | SymbolicName=MSG_PLAN_SKIPPED_DUE_TO_DOWNGRADE | ||
| 505 | Language=English | ||
| 506 | Plan skipped due to related bundle of plan type Downgrade: | ||
| 507 | . | ||
| 508 | |||
| 509 | MessageId=225 | ||
| 510 | Severity=Warning | ||
| 511 | SymbolicName=MSG_UPGRADE_BUNDLE_DOWNGRADE | ||
| 512 | Language=English | ||
| 513 | id: %1!ls!, version: %2!ls! | ||
| 514 | . | ||
| 515 | |||
| 502 | MessageId=299 | 516 | MessageId=299 |
| 503 | Severity=Success | 517 | Severity=Success |
| 504 | SymbolicName=MSG_PLAN_COMPLETE | 518 | SymbolicName=MSG_PLAN_COMPLETE |
diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp index dcb919c7..46680636 100644 --- a/src/burn/engine/plan.cpp +++ b/src/burn/engine/plan.cpp | |||
| @@ -1328,11 +1328,12 @@ LExit: | |||
| 1328 | extern "C" HRESULT PlanRelatedBundlesInitialize( | 1328 | extern "C" HRESULT PlanRelatedBundlesInitialize( |
| 1329 | __in BURN_USER_EXPERIENCE* pUserExperience, | 1329 | __in BURN_USER_EXPERIENCE* pUserExperience, |
| 1330 | __in BURN_REGISTRATION* pRegistration, | 1330 | __in BURN_REGISTRATION* pRegistration, |
| 1331 | __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/, | 1331 | __in BOOTSTRAPPER_RELATION_TYPE relationType, |
| 1332 | __in BURN_PLAN* /*pPlan*/ | 1332 | __in BURN_PLAN* pPlan |
| 1333 | ) | 1333 | ) |
| 1334 | { | 1334 | { |
| 1335 | HRESULT hr = S_OK; | 1335 | HRESULT hr = S_OK; |
| 1336 | BOOL fUninstalling = BOOTSTRAPPER_ACTION_UNINSTALL == pPlan->action || BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL == pPlan->action; | ||
| 1336 | 1337 | ||
| 1337 | for (DWORD i = 0; i < pRegistration->relatedBundles.cRelatedBundles; ++i) | 1338 | for (DWORD i = 0; i < pRegistration->relatedBundles.cRelatedBundles; ++i) |
| 1338 | { | 1339 | { |
| @@ -1356,6 +1357,19 @@ extern "C" HRESULT PlanRelatedBundlesInitialize( | |||
| 1356 | 1357 | ||
| 1357 | hr = UserExperienceOnPlanRelatedBundleType(pUserExperience, pRelatedBundle->package.sczId, &pRelatedBundle->planRelationType); | 1358 | hr = UserExperienceOnPlanRelatedBundleType(pUserExperience, pRelatedBundle->package.sczId, &pRelatedBundle->planRelationType); |
| 1358 | ExitOnRootFailure(hr, "BA aborted plan related bundle type."); | 1359 | ExitOnRootFailure(hr, "BA aborted plan related bundle type."); |
| 1360 | |||
| 1361 | if (BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DOWNGRADE == pRelatedBundle->planRelationType && | ||
| 1362 | pRelatedBundle->fPlannable && !fUninstalling && BOOTSTRAPPER_RELATION_UPGRADE != relationType) | ||
| 1363 | { | ||
| 1364 | if (!pPlan->fDowngrade) | ||
| 1365 | { | ||
| 1366 | pPlan->fDowngrade = TRUE; | ||
| 1367 | |||
| 1368 | LogId(REPORT_STANDARD, MSG_PLAN_SKIPPED_DUE_TO_DOWNGRADE); | ||
| 1369 | } | ||
| 1370 | |||
| 1371 | LogId(REPORT_VERBOSE, MSG_UPGRADE_BUNDLE_DOWNGRADE, pRelatedBundle->package.sczId, pRelatedBundle->pVersion->sczVersion); | ||
| 1372 | } | ||
| 1359 | } | 1373 | } |
| 1360 | 1374 | ||
| 1361 | RelatedBundlesSortPlan(&pRegistration->relatedBundles); | 1375 | RelatedBundlesSortPlan(&pRegistration->relatedBundles); |
| @@ -3011,6 +3025,7 @@ extern "C" void PlanDump( | |||
| 3011 | LogStringLine(PlanDumpLevel, " can affect machine state: %hs", LoggingTrueFalseToString(pPlan->fCanAffectMachineState)); | 3025 | LogStringLine(PlanDumpLevel, " can affect machine state: %hs", LoggingTrueFalseToString(pPlan->fCanAffectMachineState)); |
| 3012 | LogStringLine(PlanDumpLevel, " disable-rollback: %hs", LoggingTrueFalseToString(pPlan->fDisableRollback)); | 3026 | LogStringLine(PlanDumpLevel, " disable-rollback: %hs", LoggingTrueFalseToString(pPlan->fDisableRollback)); |
| 3013 | LogStringLine(PlanDumpLevel, " disallow-removal: %hs", LoggingTrueFalseToString(pPlan->fDisallowRemoval)); | 3027 | LogStringLine(PlanDumpLevel, " disallow-removal: %hs", LoggingTrueFalseToString(pPlan->fDisallowRemoval)); |
| 3028 | LogStringLine(PlanDumpLevel, " downgrade: %hs", LoggingTrueFalseToString(pPlan->fDowngrade)); | ||
| 3014 | LogStringLine(PlanDumpLevel, " registration options: %hs", LoggingRegistrationOptionsToString(pPlan->dwRegistrationOperations)); | 3029 | LogStringLine(PlanDumpLevel, " registration options: %hs", LoggingRegistrationOptionsToString(pPlan->dwRegistrationOperations)); |
| 3015 | LogStringLine(PlanDumpLevel, " estimated size: %llu", pPlan->qwEstimatedSize); | 3030 | LogStringLine(PlanDumpLevel, " estimated size: %llu", pPlan->qwEstimatedSize); |
| 3016 | if (pPlan->sczLayoutDirectory) | 3031 | if (pPlan->sczLayoutDirectory) |
diff --git a/src/burn/engine/plan.h b/src/burn/engine/plan.h index 1f3fe07c..e73cbcfa 100644 --- a/src/burn/engine/plan.h +++ b/src/burn/engine/plan.h | |||
| @@ -250,6 +250,7 @@ typedef struct _BURN_PLAN | |||
| 250 | BOOL fAffectedMachineState; | 250 | BOOL fAffectedMachineState; |
| 251 | LPWSTR sczLayoutDirectory; | 251 | LPWSTR sczLayoutDirectory; |
| 252 | BOOL fPlanPackageCacheRollback; | 252 | BOOL fPlanPackageCacheRollback; |
| 253 | BOOL fDowngrade; | ||
| 253 | 254 | ||
| 254 | DWORD64 qwCacheSizeTotal; | 255 | DWORD64 qwCacheSizeTotal; |
| 255 | 256 | ||
diff --git a/src/burn/engine/userexperience.cpp b/src/burn/engine/userexperience.cpp index 8668cf6f..81ce8bb9 100644 --- a/src/burn/engine/userexperience.cpp +++ b/src/burn/engine/userexperience.cpp | |||
| @@ -335,6 +335,30 @@ LExit: | |||
| 335 | return hr; | 335 | return hr; |
| 336 | } | 336 | } |
| 337 | 337 | ||
| 338 | EXTERN_C BAAPI UserExperienceOnApplyDowngrade( | ||
| 339 | __in BURN_USER_EXPERIENCE* pUserExperience, | ||
| 340 | __inout HRESULT* phrStatus | ||
| 341 | ) | ||
| 342 | { | ||
| 343 | HRESULT hr = S_OK; | ||
| 344 | BA_ONAPPLYDOWNGRADE_ARGS args = { }; | ||
| 345 | BA_ONAPPLYDOWNGRADE_RESULTS results = { }; | ||
| 346 | |||
| 347 | args.cbSize = sizeof(args); | ||
| 348 | args.hrRecommended = *phrStatus; | ||
| 349 | |||
| 350 | results.cbSize = sizeof(results); | ||
| 351 | results.hrStatus = *phrStatus; | ||
| 352 | |||
| 353 | hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYDOWNGRADE, &args, &results); | ||
| 354 | ExitOnFailure(hr, "BA OnApplyDowngrade failed."); | ||
| 355 | |||
| 356 | *phrStatus = results.hrStatus; | ||
| 357 | |||
| 358 | LExit: | ||
| 359 | return hr; | ||
| 360 | } | ||
| 361 | |||
| 338 | EXTERN_C BAAPI UserExperienceOnBeginMsiTransactionBegin( | 362 | EXTERN_C BAAPI UserExperienceOnBeginMsiTransactionBegin( |
| 339 | __in BURN_USER_EXPERIENCE* pUserExperience, | 363 | __in BURN_USER_EXPERIENCE* pUserExperience, |
| 340 | __in LPCWSTR wzTransactionId | 364 | __in LPCWSTR wzTransactionId |
diff --git a/src/burn/engine/userexperience.h b/src/burn/engine/userexperience.h index 11344365..2f18acdd 100644 --- a/src/burn/engine/userexperience.h +++ b/src/burn/engine/userexperience.h | |||
| @@ -110,6 +110,10 @@ BAAPI UserExperienceOnApplyComplete( | |||
| 110 | __in BOOTSTRAPPER_APPLY_RESTART restart, | 110 | __in BOOTSTRAPPER_APPLY_RESTART restart, |
| 111 | __inout BOOTSTRAPPER_APPLYCOMPLETE_ACTION* pAction | 111 | __inout BOOTSTRAPPER_APPLYCOMPLETE_ACTION* pAction |
| 112 | ); | 112 | ); |
| 113 | BAAPI UserExperienceOnApplyDowngrade( | ||
| 114 | __in BURN_USER_EXPERIENCE* pUserExperience, | ||
| 115 | __inout HRESULT* phrStatus | ||
| 116 | ); | ||
| 113 | BAAPI UserExperienceOnBeginMsiTransactionBegin( | 117 | BAAPI UserExperienceOnBeginMsiTransactionBegin( |
| 114 | __in BURN_USER_EXPERIENCE* pUserExperience, | 118 | __in BURN_USER_EXPERIENCE* pUserExperience, |
| 115 | __in LPCWSTR wzTransactionId | 119 | __in LPCWSTR wzTransactionId |
