diff options
Diffstat (limited to 'src/engine/plan.cpp')
-rw-r--r-- | src/engine/plan.cpp | 39 |
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 | ); |
167 | static HRESULT CalculateExecuteActions( | 167 | static 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 | ); |
172 | static BOOL NeedsCache( | 171 | static BOOL NeedsCache( |
173 | __in BURN_PACKAGE* pPackage | 172 | __in BURN_PACKAGE* pPackage, |
173 | __in BOOL fExecute | ||
174 | ); | 174 | ); |
175 | static HRESULT CreateContainerProgress( | 175 | static 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 | ||
2820 | static HRESULT CalculateExecuteActions( | 2820 | static 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 | ||
2857 | static BOOL NeedsCache( | 2856 | static 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 | ||