extern "C" HRESULT DependencyPlanPackage( __in_opt DWORD *pdwInsertSequence, __in const BURN_PACKAGE* pPackage, __in BURN_PLAN* pPlan ) { HRESULT hr = S_OK; BURN_EXECUTE_ACTION* pAction = NULL; // If the dependency execution action is to unregister, add the dependency actions to the plan // *before* the provider key is potentially removed. if (BURN_DEPENDENCY_ACTION_UNREGISTER == pPackage->dependencyExecute) { hr = AddPackageDependencyActions(pdwInsertSequence, pPackage, pPlan, pPackage->dependencyExecute, pPackage->dependencyRollback); ExitOnFailure1(hr, "Failed to plan the dependency actions for package: %ls", pPackage->sczId); } // Add the provider rollback plan. if (BURN_DEPENDENCY_ACTION_NONE != pPackage->providerRollback) { hr = PlanAppendRollbackAction(pPlan, &pAction); ExitOnFailure(hr, "Failed to append provider rollback action."); pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage); pAction->packageProvider.action = pPackage->providerRollback; // Put a checkpoint before the execute action so that rollback happens // if execute fails. hr = PlanExecuteCheckpoint(pPlan); ExitOnFailure(hr, "Failed to plan provider checkpoint action."); } // Add the provider execute plan. This comes after rollback so if something goes wrong // rollback will try to clean up after us. if (BURN_DEPENDENCY_ACTION_NONE != pPackage->providerExecute) { if (NULL != pdwInsertSequence) { hr = PlanInsertExecuteAction(*pdwInsertSequence, pPlan, &pAction); ExitOnFailure(hr, "Failed to insert provider execute action."); // Always move the sequence after this dependency action so the provider registration // stays in front of the inserted actions. ++(*pdwInsertSequence); } else { hr = PlanAppendExecuteAction(pPlan, &pAction); ExitOnFailure(hr, "Failed to append provider execute action."); } pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage); pAction->packageProvider.action = pPackage->providerExecute; } LExit: return hr; }
// // PlanAdd - adds the calculated execute and rollback actions for the package. // extern "C" HRESULT MsuEnginePlanAddPackage( __in_opt DWORD *pdwInsertSequence, __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"); } // 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_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; }