// // PlanAdd - adds the calculated execute and rollback actions for the package. // extern "C" HRESULT MspEnginePlanAddPackage( __in BOOTSTRAPPER_DISPLAY display, __in BURN_PACKAGE* pPackage, __in BURN_PLAN* pPlan, __in BURN_LOGGING* pLog, __in BURN_VARIABLES* pVariables, __in_opt HANDLE hCacheEvent, __in BOOL fPlanPackageCacheRollback ) { HRESULT hr = S_OK; // TODO: need to handle the case where this patch adds itself to an earlier patch's list of target products. That would // essentially bump this patch earlier in the plan and we need to make sure this patch is downloaded. // add wait for cache if (hCacheEvent) { hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage, hCacheEvent, fPlanPackageCacheRollback); ExitOnFailure(hr, "Failed to plan package cache syncpoint"); } hr = DependencyPlanPackage(NULL, pPackage, pPlan); ExitOnFailure(hr, "Failed to plan package dependency actions."); // Plan the actions for each target product code. for (DWORD i = 0; i < pPackage->Msp.cTargetProductCodes; ++i) { BURN_MSPTARGETPRODUCT* pTargetProduct = pPackage->Msp.rgTargetProducts + i; // If the dependency manager changed the action state for the patch, change the target product actions. if (pPackage->fDependencyManagerWasHere) { pTargetProduct->execute = pPackage->execute; pTargetProduct->rollback = pPackage->rollback; } if (BOOTSTRAPPER_ACTION_STATE_NONE != pTargetProduct->execute) { hr = PlanTargetProduct(display, FALSE, pPlan, pLog, pVariables, pTargetProduct->execute, pPackage, pTargetProduct, hCacheEvent); ExitOnFailure(hr, "Failed to plan target product."); } if (BOOTSTRAPPER_ACTION_STATE_NONE != pTargetProduct->rollback) { hr = PlanTargetProduct(display, TRUE, pPlan, pLog, pVariables, pTargetProduct->rollback, pPackage, pTargetProduct, hCacheEvent); ExitOnFailure(hr, "Failed to plan rollack target product."); } } LExit: return hr; }
// // PlanAdd - adds the calculated execute and rollback actions for the package. // extern "C" HRESULT MsuEnginePlanAddPackage( __in BURN_PACKAGE* pPackage, __in BURN_PLAN* pPlan, __in BURN_LOGGING* pLog, __in BURN_VARIABLES* pVariables, __in HANDLE hCacheEvent, __in BOOL fPlanPackageCacheRollback ) { HRESULT hr = S_OK; BURN_EXECUTE_ACTION* pAction = NULL; // add wait for cache if (hCacheEvent) { hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage, hCacheEvent, fPlanPackageCacheRollback); ExitOnFailure(hr, "Failed to plan package cache syncpoint"); } hr = DependencyPlanPackage(NULL, pPackage, pPlan); ExitOnFailure(hr, "Failed to plan package dependency actions."); // add execute action if (BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->execute) { hr = PlanAppendExecuteAction(pPlan, &pAction); ExitOnFailure(hr, "Failed to append execute action."); pAction->type = BURN_EXECUTE_ACTION_TYPE_MSU_PACKAGE; pAction->msuPackage.pPackage = pPackage; pAction->msuPackage.action = pPackage->execute; LoggingSetPackageVariable(pPackage, NULL, FALSE, pLog, pVariables, &pAction->msuPackage.sczLogPath); // ignore errors. } // add rollback action if (BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->rollback) { hr = PlanAppendRollbackAction(pPlan, &pAction); ExitOnFailure(hr, "Failed to append rollback action."); pAction->type = BURN_EXECUTE_ACTION_TYPE_MSU_PACKAGE; pAction->msuPackage.pPackage = pPackage; pAction->msuPackage.action = pPackage->rollback; LoggingSetPackageVariable(pPackage, NULL, TRUE, pLog, pVariables, &pAction->msuPackage.sczLogPath); // ignore errors. } LExit: return hr; }
// // PlanAdd - adds the calculated execute and rollback actions for the package. // extern "C" HRESULT ExeEnginePlanAddPackage( __in_opt DWORD *pdwInsertSequence, __in BURN_PACKAGE* pPackage, __in BURN_PLAN* pPlan, __in BURN_LOGGING* pLog, __in BURN_VARIABLES* pVariables, __in_opt HANDLE hCacheEvent, __in BOOL fPlanPackageCacheRollback ) { HRESULT hr = S_OK; BURN_EXECUTE_ACTION* pAction = NULL; // add wait for cache if (hCacheEvent) { hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage, hCacheEvent, fPlanPackageCacheRollback); ExitOnFailure(hr, "Failed to plan package cache syncpoint"); } hr = DependencyPlanPackage(pdwInsertSequence, pPackage, pPlan); ExitOnFailure(hr, "Failed to plan package dependency actions."); // add execute action if (BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->execute) { if (NULL != pdwInsertSequence) { hr = PlanInsertExecuteAction(*pdwInsertSequence, pPlan, &pAction); ExitOnFailure(hr, "Failed to insert execute action."); } else { hr = PlanAppendExecuteAction(pPlan, &pAction); ExitOnFailure(hr, "Failed to append execute action."); } pAction->type = BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE; pAction->exePackage.pPackage = pPackage; pAction->exePackage.fFireAndForget = (BOOTSTRAPPER_ACTION_UPDATE_REPLACE == pPlan->action); pAction->exePackage.action = pPackage->execute; if (pPackage->Exe.sczIgnoreDependencies) { hr = StrAllocString(&pAction->exePackage.sczIgnoreDependencies, pPackage->Exe.sczIgnoreDependencies, 0); ExitOnFailure(hr, "Failed to allocate the list of dependencies to ignore."); } if (pPackage->Exe.sczAncestors) { hr = StrAllocString(&pAction->exePackage.sczAncestors, pPackage->Exe.sczAncestors, 0); ExitOnFailure(hr, "Failed to allocate the list of ancestors."); } LoggingSetPackageVariable(pPackage, NULL, FALSE, pLog, pVariables, NULL); // ignore errors. } // add rollback action if (BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->rollback) { hr = PlanAppendRollbackAction(pPlan, &pAction); ExitOnFailure(hr, "Failed to append rollback action."); pAction->type = BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE; pAction->exePackage.pPackage = pPackage; pAction->exePackage.action = pPackage->rollback; if (pPackage->Exe.sczIgnoreDependencies) { hr = StrAllocString(&pAction->exePackage.sczIgnoreDependencies, pPackage->Exe.sczIgnoreDependencies, 0); ExitOnFailure(hr, "Failed to allocate the list of dependencies to ignore."); } if (pPackage->Exe.sczAncestors) { hr = StrAllocString(&pAction->exePackage.sczAncestors, pPackage->Exe.sczAncestors, 0); ExitOnFailure(hr, "Failed to allocate the list of ancestors."); } LoggingSetPackageVariable(pPackage, NULL, TRUE, pLog, pVariables, NULL); // ignore errors. } LExit: return hr; }