aboutsummaryrefslogtreecommitdiff
path: root/src/engine/msiengine.cpp
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-02-18 10:44:49 -0600
committerSean Hall <r.sean.hall@gmail.com>2021-02-22 20:25:06 -0600
commitb29af5d005c2cc802aa60a123d435042038ba8ef (patch)
treecb86e61b6abb327f8e1ebc33162acfca28bb89e9 /src/engine/msiengine.cpp
parentdbd55be5e707f07eb044c8c7f13c3dfd246148c0 (diff)
downloadwix-b29af5d005c2cc802aa60a123d435042038ba8ef.tar.gz
wix-b29af5d005c2cc802aa60a123d435042038ba8ef.tar.bz2
wix-b29af5d005c2cc802aa60a123d435042038ba8ef.zip
Get all request states up front before building the plan.
Diffstat (limited to 'src/engine/msiengine.cpp')
-rw-r--r--src/engine/msiengine.cpp62
1 files changed, 37 insertions, 25 deletions
diff --git a/src/engine/msiengine.cpp b/src/engine/msiengine.cpp
index 4fdf2b7a..252a17b7 100644
--- a/src/engine/msiengine.cpp
+++ b/src/engine/msiengine.cpp
@@ -674,13 +674,46 @@ LExit:
674 return hr; 674 return hr;
675} 675}
676 676
677extern "C" HRESULT MsiEnginePlanInitializePackage(
678 __in BURN_PACKAGE* pPackage,
679 __in BURN_VARIABLES* pVariables,
680 __in BURN_USER_EXPERIENCE* pUserExperience
681 )
682{
683 HRESULT hr = S_OK;
684
685 if (pPackage->Msi.cFeatures)
686 {
687 // get feature request states
688 for (DWORD i = 0; i < pPackage->Msi.cFeatures; ++i)
689 {
690 BURN_MSIFEATURE* pFeature = &pPackage->Msi.rgFeatures[i];
691
692 // Evaluate feature conditions.
693 hr = EvaluateActionStateConditions(pVariables, pFeature->sczAddLocalCondition, pFeature->sczAddSourceCondition, pFeature->sczAdvertiseCondition, &pFeature->defaultRequested);
694 ExitOnFailure(hr, "Failed to evaluate requested state conditions.");
695
696 hr = EvaluateActionStateConditions(pVariables, pFeature->sczRollbackAddLocalCondition, pFeature->sczRollbackAddSourceCondition, pFeature->sczRollbackAdvertiseCondition, &pFeature->expectedState);
697 ExitOnFailure(hr, "Failed to evaluate expected state conditions.");
698
699 // Remember the default feature requested state so the engine doesn't get blamed for planning the wrong thing if the BA changes it.
700 pFeature->requested = pFeature->defaultRequested;
701
702 // Send plan MSI feature message to BA.
703 hr = UserExperienceOnPlanMsiFeature(pUserExperience, pPackage->sczId, pFeature->sczId, &pFeature->requested);
704 ExitOnRootFailure(hr, "BA aborted plan MSI feature.");
705 }
706 }
707
708LExit:
709 return hr;
710}
711
677// 712//
678// PlanCalculate - calculates the execute and rollback state for the requested package state. 713// PlanCalculate - calculates the execute and rollback state for the requested package state.
679// 714//
680extern "C" HRESULT MsiEnginePlanCalculatePackage( 715extern "C" HRESULT MsiEnginePlanCalculatePackage(
681 __in BURN_PACKAGE* pPackage, 716 __in BURN_PACKAGE* pPackage,
682 __in BURN_VARIABLES* pVariables,
683 __in BURN_USER_EXPERIENCE* pUserExperience,
684 __in BOOL fInsideMsiTransaction, 717 __in BOOL fInsideMsiTransaction,
685 __out_opt BOOL* pfBARequestedCache 718 __out_opt BOOL* pfBARequestedCache
686 ) 719 )
@@ -702,38 +735,17 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage(
702 // If the package is present and we're repairing it. 735 // If the package is present and we're repairing it.
703 BOOL fRepairingPackage = (BOOTSTRAPPER_PACKAGE_STATE_CACHED < pPackage->currentState && BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested); 736 BOOL fRepairingPackage = (BOOTSTRAPPER_PACKAGE_STATE_CACHED < pPackage->currentState && BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested);
704 737
705 LogId(REPORT_STANDARD, MSG_PLAN_MSI_FEATURES, pPackage->Msi.cFeatures, pPackage->sczId);
706
707 // plan features 738 // plan features
708 for (DWORD i = 0; i < pPackage->Msi.cFeatures; ++i) 739 for (DWORD i = 0; i < pPackage->Msi.cFeatures; ++i)
709 { 740 {
710 BURN_MSIFEATURE* pFeature = &pPackage->Msi.rgFeatures[i]; 741 BURN_MSIFEATURE* pFeature = &pPackage->Msi.rgFeatures[i];
711 BOOTSTRAPPER_FEATURE_STATE defaultFeatureRequestedState = BOOTSTRAPPER_FEATURE_STATE_UNKNOWN;
712 BOOTSTRAPPER_FEATURE_STATE featureRequestedState = BOOTSTRAPPER_FEATURE_STATE_UNKNOWN;
713 BOOTSTRAPPER_FEATURE_STATE featureExpectedState = BOOTSTRAPPER_FEATURE_STATE_UNKNOWN;
714
715 // Evaluate feature conditions.
716 hr = EvaluateActionStateConditions(pVariables, pFeature->sczAddLocalCondition, pFeature->sczAddSourceCondition, pFeature->sczAdvertiseCondition, &defaultFeatureRequestedState);
717 ExitOnFailure(hr, "Failed to evaluate requested state conditions.");
718
719 hr = EvaluateActionStateConditions(pVariables, pFeature->sczRollbackAddLocalCondition, pFeature->sczRollbackAddSourceCondition, pFeature->sczRollbackAdvertiseCondition, &featureExpectedState);
720 ExitOnFailure(hr, "Failed to evaluate expected state conditions.");
721
722 // Remember the default feature requested state so the engine doesn't get blamed for planning the wrong thing if the BA changes it.
723 featureRequestedState = defaultFeatureRequestedState;
724
725 // Send plan MSI feature message to BA.
726 hr = UserExperienceOnPlanMsiFeature(pUserExperience, pPackage->sczId, pFeature->sczId, &featureRequestedState);
727 ExitOnRootFailure(hr, "BA aborted plan MSI feature.");
728 742
729 // Calculate feature actions. 743 // Calculate feature actions.
730 hr = CalculateFeatureAction(pFeature->currentState, featureRequestedState, fRepairingPackage, &pFeature->execute, &fFeatureActionDelta); 744 hr = CalculateFeatureAction(pFeature->currentState, pFeature->requested, fRepairingPackage, &pFeature->execute, &fFeatureActionDelta);
731 ExitOnFailure(hr, "Failed to calculate execute feature state."); 745 ExitOnFailure(hr, "Failed to calculate execute feature state.");
732 746
733 hr = CalculateFeatureAction(featureRequestedState, BOOTSTRAPPER_FEATURE_ACTION_NONE == pFeature->execute ? featureExpectedState : pFeature->currentState, FALSE, &pFeature->rollback, &fRollbackFeatureActionDelta); 747 hr = CalculateFeatureAction(pFeature->requested, BOOTSTRAPPER_FEATURE_ACTION_NONE == pFeature->execute ? pFeature->expectedState : pFeature->currentState, FALSE, &pFeature->rollback, &fRollbackFeatureActionDelta);
734 ExitOnFailure(hr, "Failed to calculate rollback feature state."); 748 ExitOnFailure(hr, "Failed to calculate rollback feature state.");
735
736 LogId(REPORT_STANDARD, MSG_PLANNED_MSI_FEATURE, pFeature->sczId, LoggingMsiFeatureStateToString(pFeature->currentState), LoggingMsiFeatureStateToString(defaultFeatureRequestedState), LoggingMsiFeatureStateToString(featureRequestedState), LoggingMsiFeatureActionToString(pFeature->execute), LoggingMsiFeatureActionToString(pFeature->rollback));
737 } 749 }
738 } 750 }
739 751