aboutsummaryrefslogtreecommitdiff
path: root/src/engine/plan.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/plan.cpp')
-rw-r--r--src/engine/plan.cpp39
1 files changed, 20 insertions, 19 deletions
diff --git a/src/engine/plan.cpp b/src/engine/plan.cpp
index 29adfb42..d99fdde2 100644
--- a/src/engine/plan.cpp
+++ b/src/engine/plan.cpp
@@ -166,11 +166,11 @@ static HRESULT PlanDependencyActions(
166 ); 166 );
167static HRESULT CalculateExecuteActions( 167static HRESULT CalculateExecuteActions(
168 __in BURN_PACKAGE* pPackage, 168 __in BURN_PACKAGE* pPackage,
169 __in_opt BURN_ROLLBACK_BOUNDARY* pActiveRollbackBoundary, 169 __in_opt BURN_ROLLBACK_BOUNDARY* pActiveRollbackBoundary
170 __out_opt BOOL* pfBARequestedCache
171 ); 170 );
172static BOOL NeedsCache( 171static BOOL NeedsCache(
173 __in BURN_PACKAGE* pPackage 172 __in BURN_PACKAGE* pPackage,
173 __in BOOL fExecute
174 ); 174 );
175static HRESULT CreateContainerProgress( 175static HRESULT CreateContainerProgress(
176 __in BURN_PLAN* pPlan, 176 __in BURN_PLAN* pPlan,
@@ -1081,24 +1081,24 @@ extern "C" HRESULT PlanExecutePackage(
1081 ) 1081 )
1082{ 1082{
1083 HRESULT hr = S_OK; 1083 HRESULT hr = S_OK;
1084 BOOL fBARequestedCache = FALSE; 1084 BOOL fRequestedCache = BOOTSTRAPPER_REQUEST_STATE_CACHE == pPackage->requested ||
1085 BOOTSTRAPPER_REQUEST_STATE_ABSENT < pPackage->requested && BURN_CACHE_TYPE_ALWAYS == pPackage->cacheType;
1085 1086
1086 hr = CalculateExecuteActions(pPackage, pPlan->pActiveRollbackBoundary, &fBARequestedCache); 1087 hr = CalculateExecuteActions(pPackage, pPlan->pActiveRollbackBoundary);
1087 ExitOnFailure(hr, "Failed to calculate plan actions for package: %ls", pPackage->sczId); 1088 ExitOnFailure(hr, "Failed to calculate plan actions for package: %ls", pPackage->sczId);
1088 1089
1089 // Calculate package states based on reference count and plan certain dependency actions prior to planning the package execute action. 1090 // Calculate package states based on reference count and plan certain dependency actions prior to planning the package execute action.
1090 hr = DependencyPlanPackageBegin(fPerMachine, pPackage, pPlan); 1091 hr = DependencyPlanPackageBegin(fPerMachine, pPackage, pPlan);
1091 ExitOnFailure(hr, "Failed to begin plan dependency actions for package: %ls", pPackage->sczId); 1092 ExitOnFailure(hr, "Failed to begin plan dependency actions for package: %ls", pPackage->sczId);
1092 1093
1093 if (fBARequestedCache || NeedsCache(pPackage)) 1094 if (fRequestedCache || NeedsCache(pPackage, TRUE))
1094 { 1095 {
1095 hr = AddCachePackage(pPlan, pPackage, phSyncpointEvent); 1096 hr = AddCachePackage(pPlan, pPackage, phSyncpointEvent);
1096 ExitOnFailure(hr, "Failed to plan cache package."); 1097 ExitOnFailure(hr, "Failed to plan cache package.");
1097 } 1098 }
1098 else if (BURN_CACHE_STATE_COMPLETE != pPackage->cache && // if the package is not in the cache, disable any rollback that would require the package from the cache. 1099 else if (BURN_CACHE_STATE_COMPLETE != pPackage->cache && NeedsCache(pPackage, FALSE))
1099 (BOOTSTRAPPER_ACTION_STATE_UNINSTALL < pPackage->rollback || (BURN_PACKAGE_TYPE_EXE == pPackage->type && BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->rollback))
1100 )
1101 { 1100 {
1101 // If the package is not in the cache, disable any rollback that would require the package from the cache.
1102 LogId(REPORT_STANDARD, MSG_PLAN_DISABLING_ROLLBACK_NO_CACHE, pPackage->sczId, LoggingCacheStateToString(pPackage->cache), LoggingActionStateToString(pPackage->rollback)); 1102 LogId(REPORT_STANDARD, MSG_PLAN_DISABLING_ROLLBACK_NO_CACHE, pPackage->sczId, LoggingCacheStateToString(pPackage->cache), LoggingActionStateToString(pPackage->rollback));
1103 pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE; 1103 pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE;
1104 } 1104 }
@@ -1431,7 +1431,7 @@ extern "C" HRESULT PlanRelatedBundlesComplete(
1431 1431
1432 if (BOOTSTRAPPER_REQUEST_STATE_NONE != pRelatedBundle->package.requested) 1432 if (BOOTSTRAPPER_REQUEST_STATE_NONE != pRelatedBundle->package.requested)
1433 { 1433 {
1434 hr = ExeEnginePlanCalculatePackage(&pRelatedBundle->package, NULL); 1434 hr = ExeEnginePlanCalculatePackage(&pRelatedBundle->package);
1435 ExitOnFailure(hr, "Failed to calcuate plan for related bundle: %ls", pRelatedBundle->package.sczId); 1435 ExitOnFailure(hr, "Failed to calcuate plan for related bundle: %ls", pRelatedBundle->package.sczId);
1436 1436
1437 // Calculate package states based on reference count for addon and patch related bundles. 1437 // Calculate package states based on reference count for addon and patch related bundles.
@@ -2819,8 +2819,7 @@ LExit:
2819 2819
2820static HRESULT CalculateExecuteActions( 2820static HRESULT CalculateExecuteActions(
2821 __in BURN_PACKAGE* pPackage, 2821 __in BURN_PACKAGE* pPackage,
2822 __in_opt BURN_ROLLBACK_BOUNDARY* pActiveRollbackBoundary, 2822 __in_opt BURN_ROLLBACK_BOUNDARY* pActiveRollbackBoundary
2823 __out_opt BOOL* pfBARequestedCache
2824 ) 2823 )
2825{ 2824{
2826 HRESULT hr = S_OK; 2825 HRESULT hr = S_OK;
@@ -2830,19 +2829,19 @@ static HRESULT CalculateExecuteActions(
2830 switch (pPackage->type) 2829 switch (pPackage->type)
2831 { 2830 {
2832 case BURN_PACKAGE_TYPE_EXE: 2831 case BURN_PACKAGE_TYPE_EXE:
2833 hr = ExeEnginePlanCalculatePackage(pPackage, pfBARequestedCache); 2832 hr = ExeEnginePlanCalculatePackage(pPackage);
2834 break; 2833 break;
2835 2834
2836 case BURN_PACKAGE_TYPE_MSI: 2835 case BURN_PACKAGE_TYPE_MSI:
2837 hr = MsiEnginePlanCalculatePackage(pPackage, fInsideMsiTransaction, pfBARequestedCache); 2836 hr = MsiEnginePlanCalculatePackage(pPackage, fInsideMsiTransaction);
2838 break; 2837 break;
2839 2838
2840 case BURN_PACKAGE_TYPE_MSP: 2839 case BURN_PACKAGE_TYPE_MSP:
2841 hr = MspEnginePlanCalculatePackage(pPackage, fInsideMsiTransaction, pfBARequestedCache); 2840 hr = MspEnginePlanCalculatePackage(pPackage, fInsideMsiTransaction);
2842 break; 2841 break;
2843 2842
2844 case BURN_PACKAGE_TYPE_MSU: 2843 case BURN_PACKAGE_TYPE_MSU:
2845 hr = MsuEnginePlanCalculatePackage(pPackage, pfBARequestedCache); 2844 hr = MsuEnginePlanCalculatePackage(pPackage);
2846 break; 2845 break;
2847 2846
2848 default: 2847 default:
@@ -2855,16 +2854,18 @@ LExit:
2855} 2854}
2856 2855
2857static BOOL NeedsCache( 2856static BOOL NeedsCache(
2858 __in BURN_PACKAGE* pPackage 2857 __in BURN_PACKAGE* pPackage,
2858 __in BOOL fExecute
2859 ) 2859 )
2860{ 2860{
2861 BOOTSTRAPPER_ACTION_STATE action = fExecute ? pPackage->execute : pPackage->rollback;
2861 if (BURN_PACKAGE_TYPE_EXE == pPackage->type) // Exe packages require the package for all operations (even uninstall). 2862 if (BURN_PACKAGE_TYPE_EXE == pPackage->type) // Exe packages require the package for all operations (even uninstall).
2862 { 2863 {
2863 return BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->execute; 2864 return BOOTSTRAPPER_ACTION_STATE_NONE != action;
2864 } 2865 }
2865 else // The other package types can uninstall without the original package. 2866 else // The other package types can uninstall without the original package.
2866 { 2867 {
2867 return BOOTSTRAPPER_ACTION_STATE_UNINSTALL < pPackage->execute; 2868 return BOOTSTRAPPER_ACTION_STATE_UNINSTALL < action;
2868 } 2869 }
2869} 2870}
2870 2871