aboutsummaryrefslogtreecommitdiff
path: root/src/engine/mspengine.cpp
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-02-22 19:58:44 -0600
committerSean Hall <r.sean.hall@gmail.com>2021-02-22 20:25:06 -0600
commita98115d996d65834e7c8d593c10d2cfa66096ccd (patch)
tree11857990bfadee576b4a8d6d8ccc2db04dfafe7b /src/engine/mspengine.cpp
parent4f4c85ed66f1b2dfb1bec76d54d7b50c637d5bfa (diff)
downloadwix-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.cpp38
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