diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2021-02-22 19:58:44 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2021-02-22 20:25:06 -0600 |
| commit | a98115d996d65834e7c8d593c10d2cfa66096ccd (patch) | |
| tree | 11857990bfadee576b4a8d6d8ccc2db04dfafe7b /src/engine/mspengine.cpp | |
| parent | 4f4c85ed66f1b2dfb1bec76d54d7b50c637d5bfa (diff) | |
| download | wix-a98115d996d65834e7c8d593c10d2cfa66096ccd.tar.gz wix-a98115d996d65834e7c8d593c10d2cfa66096ccd.tar.bz2 wix-a98115d996d65834e7c8d593c10d2cfa66096ccd.zip | |
Fix patch registration states during plan and apply.
Add logging for slipstreamed patches.
#6297
Diffstat (limited to 'src/engine/mspengine.cpp')
| -rw-r--r-- | src/engine/mspengine.cpp | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/src/engine/mspengine.cpp b/src/engine/mspengine.cpp index 4b7f9a0a..ed105d24 100644 --- a/src/engine/mspengine.cpp +++ b/src/engine/mspengine.cpp | |||
| @@ -372,6 +372,7 @@ extern "C" HRESULT MspEnginePlanCalculatePackage( | |||
| 372 | ) | 372 | ) |
| 373 | { | 373 | { |
| 374 | HRESULT hr = S_OK; | 374 | HRESULT hr = S_OK; |
| 375 | BOOL fWillUninstallAll = TRUE; | ||
| 375 | 376 | ||
| 376 | for (DWORD i = 0; i < pPackage->Msp.cTargetProductCodes; ++i) | 377 | for (DWORD i = 0; i < pPackage->Msp.cTargetProductCodes; ++i) |
| 377 | { | 378 | { |
| @@ -388,6 +389,7 @@ extern "C" HRESULT MspEnginePlanCalculatePackage( | |||
| 388 | { | 389 | { |
| 389 | case BOOTSTRAPPER_REQUEST_STATE_REPAIR: | 390 | case BOOTSTRAPPER_REQUEST_STATE_REPAIR: |
| 390 | execute = BOOTSTRAPPER_ACTION_STATE_REPAIR; | 391 | execute = BOOTSTRAPPER_ACTION_STATE_REPAIR; |
| 392 | fWillUninstallAll = FALSE; | ||
| 391 | break; | 393 | break; |
| 392 | 394 | ||
| 393 | case BOOTSTRAPPER_REQUEST_STATE_ABSENT: __fallthrough; | 395 | case BOOTSTRAPPER_REQUEST_STATE_ABSENT: __fallthrough; |
| @@ -401,6 +403,7 @@ extern "C" HRESULT MspEnginePlanCalculatePackage( | |||
| 401 | 403 | ||
| 402 | default: | 404 | default: |
| 403 | execute = BOOTSTRAPPER_ACTION_STATE_NONE; | 405 | execute = BOOTSTRAPPER_ACTION_STATE_NONE; |
| 406 | fWillUninstallAll = FALSE; | ||
| 404 | break; | 407 | break; |
| 405 | } | 408 | } |
| 406 | break; | 409 | break; |
| @@ -411,6 +414,7 @@ extern "C" HRESULT MspEnginePlanCalculatePackage( | |||
| 411 | case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough; | 414 | case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough; |
| 412 | case BOOTSTRAPPER_REQUEST_STATE_REPAIR: | 415 | case BOOTSTRAPPER_REQUEST_STATE_REPAIR: |
| 413 | execute = BOOTSTRAPPER_ACTION_STATE_INSTALL; | 416 | execute = BOOTSTRAPPER_ACTION_STATE_INSTALL; |
| 417 | fWillUninstallAll = FALSE; | ||
| 414 | break; | 418 | break; |
| 415 | 419 | ||
| 416 | default: | 420 | default: |
| @@ -418,6 +422,13 @@ extern "C" HRESULT MspEnginePlanCalculatePackage( | |||
| 418 | break; | 422 | break; |
| 419 | } | 423 | } |
| 420 | break; | 424 | break; |
| 425 | |||
| 426 | default: | ||
| 427 | if (pTargetProduct->fInstalled) | ||
| 428 | { | ||
| 429 | fWillUninstallAll = FALSE; | ||
| 430 | } | ||
| 431 | break; | ||
| 421 | } | 432 | } |
| 422 | 433 | ||
| 423 | // Calculate the rollback action if there is an execute action. | 434 | // Calculate the rollback action if there is an execute action. |
| @@ -475,6 +486,13 @@ extern "C" HRESULT MspEnginePlanCalculatePackage( | |||
| 475 | } | 486 | } |
| 476 | } | 487 | } |
| 477 | 488 | ||
| 489 | // The dependency manager will do the wrong thing if the package level action is UNINSTALL | ||
| 490 | // when the patch will still be applied to at least one product. | ||
| 491 | if (!fWillUninstallAll && BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pPackage->execute) | ||
| 492 | { | ||
| 493 | pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE; | ||
| 494 | } | ||
| 495 | |||
| 478 | return hr; | 496 | return hr; |
| 479 | } | 497 | } |
| 480 | 498 | ||
| @@ -776,16 +794,22 @@ extern "C" void MspEngineFinalizeInstallRegistrationState( | |||
| 776 | ExitFunction(); | 794 | ExitFunction(); |
| 777 | } | 795 | } |
| 778 | 796 | ||
| 779 | pPackage->installRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_ABSENT; | 797 | if (!pPackage->Msp.cTargetProductCodes) |
| 780 | |||
| 781 | for (DWORD i = 0; i < pPackage->Msp.cTargetProductCodes; ++i) | ||
| 782 | { | 798 | { |
| 783 | BURN_MSPTARGETPRODUCT* pTargetProduct = pPackage->Msp.rgTargetProducts + i; | 799 | pPackage->installRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_ABSENT; |
| 800 | } | ||
| 801 | else | ||
| 802 | { | ||
| 803 | pPackage->installRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN; | ||
| 784 | 804 | ||
| 785 | if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pTargetProduct->registrationState) | 805 | for (DWORD i = 0; i < pPackage->Msp.cTargetProductCodes; ++i) |
| 786 | { | 806 | { |
| 787 | pPackage->installRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_PRESENT; | 807 | BURN_MSPTARGETPRODUCT* pTargetProduct = pPackage->Msp.rgTargetProducts + i; |
| 788 | break; | 808 | |
| 809 | if (pPackage->installRegistrationState < pTargetProduct->registrationState) | ||
| 810 | { | ||
| 811 | pPackage->installRegistrationState = pTargetProduct->registrationState; | ||
| 812 | } | ||
| 789 | } | 813 | } |
| 790 | } | 814 | } |
| 791 | 815 | ||
