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