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