diff options
Diffstat (limited to 'src/burn/engine/apply.cpp')
| -rw-r--r-- | src/burn/engine/apply.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp index 6af5c040..9ee7b58c 100644 --- a/src/burn/engine/apply.cpp +++ b/src/burn/engine/apply.cpp | |||
| @@ -216,6 +216,15 @@ static HRESULT DoRestoreRelatedBundleActions( | |||
| 216 | __in BURN_EXECUTE_CONTEXT* pContext, | 216 | __in BURN_EXECUTE_CONTEXT* pContext, |
| 217 | __out BOOTSTRAPPER_APPLY_RESTART* pRestart | 217 | __out BOOTSTRAPPER_APPLY_RESTART* pRestart |
| 218 | ); | 218 | ); |
| 219 | static HRESULT ExecuteBundlePackage( | ||
| 220 | __in BURN_ENGINE_STATE* pEngineState, | ||
| 221 | __in BURN_EXECUTE_ACTION* pExecuteAction, | ||
| 222 | __in BURN_EXECUTE_CONTEXT* pContext, | ||
| 223 | __in BOOL fRollback, | ||
| 224 | __out BOOL* pfRetry, | ||
| 225 | __out BOOL* pfSuspend, | ||
| 226 | __out BOOTSTRAPPER_APPLY_RESTART* pRestart | ||
| 227 | ); | ||
| 219 | static HRESULT ExecuteExePackage( | 228 | static HRESULT ExecuteExePackage( |
| 220 | __in BURN_ENGINE_STATE* pEngineState, | 229 | __in BURN_ENGINE_STATE* pEngineState, |
| 221 | __in BURN_EXECUTE_ACTION* pExecuteAction, | 230 | __in BURN_EXECUTE_ACTION* pExecuteAction, |
| @@ -732,6 +741,9 @@ extern "C" HRESULT ApplyExecute( | |||
| 732 | case BURN_EXECUTE_ACTION_TYPE_RELATED_BUNDLE: | 741 | case BURN_EXECUTE_ACTION_TYPE_RELATED_BUNDLE: |
| 733 | wzId = pExecuteAction->relatedBundle.pRelatedBundle->package.sczId; | 742 | wzId = pExecuteAction->relatedBundle.pRelatedBundle->package.sczId; |
| 734 | break; | 743 | break; |
| 744 | case BURN_EXECUTE_ACTION_TYPE_BUNDLE_PACKAGE: | ||
| 745 | wzId = pExecuteAction->bundlePackage.pPackage->sczId; | ||
| 746 | break; | ||
| 735 | case BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE: | 747 | case BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE: |
| 736 | wzId = pExecuteAction->exePackage.pPackage->sczId; | 748 | wzId = pExecuteAction->exePackage.pPackage->sczId; |
| 737 | break; | 749 | break; |
| @@ -2352,6 +2364,11 @@ static HRESULT DoExecuteAction( | |||
| 2352 | ExitOnFailure(hr, "Failed to execute related bundle."); | 2364 | ExitOnFailure(hr, "Failed to execute related bundle."); |
| 2353 | break; | 2365 | break; |
| 2354 | 2366 | ||
| 2367 | case BURN_EXECUTE_ACTION_TYPE_BUNDLE_PACKAGE: | ||
| 2368 | hr = ExecuteBundlePackage(pEngineState, pExecuteAction, pContext, FALSE, &fRetry, pfSuspend, &restart); | ||
| 2369 | ExitOnFailure(hr, "Failed to execute BUNDLE package."); | ||
| 2370 | break; | ||
| 2371 | |||
| 2355 | case BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE: | 2372 | case BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE: |
| 2356 | hr = ExecuteExePackage(pEngineState, pExecuteAction, pContext, FALSE, &fRetry, pfSuspend, &restart); | 2373 | hr = ExecuteExePackage(pEngineState, pExecuteAction, pContext, FALSE, &fRetry, pfSuspend, &restart); |
| 2357 | ExitOnFailure(hr, "Failed to execute EXE package."); | 2374 | ExitOnFailure(hr, "Failed to execute EXE package."); |
| @@ -2479,6 +2496,11 @@ static HRESULT DoRollbackActions( | |||
| 2479 | ExitOnFailure(hr, "Failed to execute related bundle."); | 2496 | ExitOnFailure(hr, "Failed to execute related bundle."); |
| 2480 | break; | 2497 | break; |
| 2481 | 2498 | ||
| 2499 | case BURN_EXECUTE_ACTION_TYPE_BUNDLE_PACKAGE: | ||
| 2500 | hr = ExecuteBundlePackage(pEngineState, pRollbackAction, pContext, TRUE, &fRetryIgnored, &fSuspendIgnored, &restart); | ||
| 2501 | IgnoreRollbackError(hr, "Failed to rollback BUNDLE package."); | ||
| 2502 | break; | ||
| 2503 | |||
| 2482 | case BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE: | 2504 | case BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE: |
| 2483 | hr = ExecuteExePackage(pEngineState, pRollbackAction, pContext, TRUE, &fRetryIgnored, &fSuspendIgnored, &restart); | 2505 | hr = ExecuteExePackage(pEngineState, pRollbackAction, pContext, TRUE, &fRetryIgnored, &fSuspendIgnored, &restart); |
| 2484 | IgnoreRollbackError(hr, "Failed to rollback EXE package."); | 2506 | IgnoreRollbackError(hr, "Failed to rollback EXE package."); |
| @@ -2682,6 +2704,86 @@ LExit: | |||
| 2682 | return hr; | 2704 | return hr; |
| 2683 | } | 2705 | } |
| 2684 | 2706 | ||
| 2707 | static HRESULT ExecuteBundlePackage( | ||
| 2708 | __in BURN_ENGINE_STATE* pEngineState, | ||
| 2709 | __in BURN_EXECUTE_ACTION* pExecuteAction, | ||
| 2710 | __in BURN_EXECUTE_CONTEXT* pContext, | ||
| 2711 | __in BOOL fRollback, | ||
| 2712 | __out BOOL* pfRetry, | ||
| 2713 | __out BOOL* pfSuspend, | ||
| 2714 | __out BOOTSTRAPPER_APPLY_RESTART* pRestart | ||
| 2715 | ) | ||
| 2716 | { | ||
| 2717 | HRESULT hr = S_OK; | ||
| 2718 | HRESULT hrExecute = S_OK; | ||
| 2719 | GENERIC_EXECUTE_MESSAGE message = { }; | ||
| 2720 | int nResult = 0; | ||
| 2721 | BOOL fBeginCalled = FALSE; | ||
| 2722 | BOOL fExecuted = FALSE; | ||
| 2723 | BURN_PACKAGE* pPackage = pExecuteAction->bundlePackage.pPackage; | ||
| 2724 | |||
| 2725 | Assert(pContext->fRollback == fRollback); | ||
| 2726 | |||
| 2727 | if (ShouldSkipPackage(pPackage, fRollback)) | ||
| 2728 | { | ||
| 2729 | ExitFunction1(hr = S_OK); | ||
| 2730 | } | ||
| 2731 | |||
| 2732 | pContext->wzExecutingPackageId = pPackage->sczId; | ||
| 2733 | fBeginCalled = TRUE; | ||
| 2734 | |||
| 2735 | // Send package execute begin to BA. | ||
| 2736 | hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pPackage->sczId, !fRollback, pExecuteAction->bundlePackage.action, INSTALLUILEVEL_NOCHANGE, FALSE); | ||
| 2737 | ExitOnRootFailure(hr, "BA aborted execute BUNDLE package begin."); | ||
| 2738 | |||
| 2739 | message.type = GENERIC_EXECUTE_MESSAGE_PROGRESS; | ||
| 2740 | message.dwUIHint = MB_OKCANCEL; | ||
| 2741 | message.progress.dwPercentage = fRollback ? 100 : 0; | ||
| 2742 | nResult = GenericExecuteMessageHandler(&message, pContext); | ||
| 2743 | hr = UserExperienceInterpretExecuteResult(&pEngineState->userExperience, fRollback, message.dwUIHint, nResult); | ||
| 2744 | ExitOnRootFailure(hr, "BA aborted BUNDLE progress."); | ||
| 2745 | |||
| 2746 | fExecuted = TRUE; | ||
| 2747 | |||
| 2748 | // Execute package. | ||
| 2749 | if (pPackage->fPerMachine) | ||
| 2750 | { | ||
| 2751 | hrExecute = ElevationExecuteBundlePackage(pEngineState->companionConnection.hPipe, pExecuteAction, &pEngineState->variables, fRollback, GenericExecuteMessageHandler, pContext, pRestart); | ||
| 2752 | ExitOnFailure(hrExecute, "Failed to configure per-machine BUNDLE package."); | ||
| 2753 | } | ||
| 2754 | else | ||
| 2755 | { | ||
| 2756 | hrExecute = BundlePackageEngineExecutePackage(pExecuteAction, pContext->pCache, &pEngineState->variables, fRollback, GenericExecuteMessageHandler, pContext, pRestart); | ||
| 2757 | ExitOnFailure(hrExecute, "Failed to configure per-user BUNDLE package."); | ||
| 2758 | } | ||
| 2759 | |||
| 2760 | message.type = GENERIC_EXECUTE_MESSAGE_PROGRESS; | ||
| 2761 | message.dwUIHint = MB_OKCANCEL; | ||
| 2762 | message.progress.dwPercentage = fRollback ? 0 : 100; | ||
| 2763 | nResult = GenericExecuteMessageHandler(&message, pContext); | ||
| 2764 | hr = UserExperienceInterpretExecuteResult(&pEngineState->userExperience, fRollback, message.dwUIHint, nResult); | ||
| 2765 | ExitOnRootFailure(hr, "BA aborted BUNDLE progress."); | ||
| 2766 | |||
| 2767 | pContext->cExecutedPackages += fRollback ? -1 : 1; | ||
| 2768 | |||
| 2769 | hr = ReportOverallProgressTicks(&pEngineState->userExperience, fRollback, pEngineState->plan.cOverallProgressTicksTotal, pContext->pApplyContext); | ||
| 2770 | ExitOnRootFailure(hr, "BA aborted BUNDLE package execute progress."); | ||
| 2771 | |||
| 2772 | LExit: | ||
| 2773 | if (fExecuted) | ||
| 2774 | { | ||
| 2775 | BundlePackageEngineUpdateInstallRegistrationState(pExecuteAction, hrExecute); | ||
| 2776 | } | ||
| 2777 | |||
| 2778 | if (fBeginCalled) | ||
| 2779 | { | ||
| 2780 | pPackage->fAbandonedProcess = pContext->fAbandonedProcess; | ||
| 2781 | hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pPackage->sczId, pPackage->fVital, pPackage->fAbandonedProcess, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend); | ||
| 2782 | } | ||
| 2783 | |||
| 2784 | return hr; | ||
| 2785 | } | ||
| 2786 | |||
| 2685 | static HRESULT ExecuteExePackage( | 2787 | static HRESULT ExecuteExePackage( |
| 2686 | __in BURN_ENGINE_STATE* pEngineState, | 2788 | __in BURN_ENGINE_STATE* pEngineState, |
| 2687 | __in BURN_EXECUTE_ACTION* pExecuteAction, | 2789 | __in BURN_EXECUTE_ACTION* pExecuteAction, |
