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 | ||