summaryrefslogtreecommitdiff
path: root/src/burn/engine/apply.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/apply.cpp')
-rw-r--r--src/burn/engine/apply.cpp102
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 );
219static 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 );
219static HRESULT ExecuteExePackage( 228static 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
2707static 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
2772LExit:
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
2685static HRESULT ExecuteExePackage( 2787static 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,