summaryrefslogtreecommitdiff
path: root/src/burn/engine/dependency.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/dependency.cpp')
-rw-r--r--src/burn/engine/dependency.cpp132
1 files changed, 75 insertions, 57 deletions
diff --git a/src/burn/engine/dependency.cpp b/src/burn/engine/dependency.cpp
index e94b0e93..8f568f28 100644
--- a/src/burn/engine/dependency.cpp
+++ b/src/burn/engine/dependency.cpp
@@ -59,11 +59,17 @@ static LPCWSTR GetPackageProviderId(
59 ); 59 );
60 60
61static HRESULT RegisterPackageProvider( 61static HRESULT RegisterPackageProvider(
62 __in const BURN_PACKAGE* pPackage 62 __in const BURN_DEPENDENCY_PROVIDER* pProvider,
63 __in LPCWSTR wzPackageId,
64 __in LPCWSTR wzPackageProviderId,
65 __in HKEY hkRoot,
66 __in BOOL fVital
63 ); 67 );
64 68
65static void UnregisterPackageProvider( 69static void UnregisterPackageProvider(
66 __in const BURN_PACKAGE* pPackage 70 __in const BURN_DEPENDENCY_PROVIDER* pProvider,
71 __in LPCWSTR wzPackageId,
72 __in HKEY hkRoot
67 ); 73 );
68 74
69static HRESULT RegisterPackageDependency( 75static HRESULT RegisterPackageDependency(
@@ -489,6 +495,8 @@ extern "C" HRESULT DependencyPlanPackageBegin(
489 { 495 {
490 pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE; 496 pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE;
491 pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE; 497 pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE;
498
499 // Assume the compatible package has the same exact providers.
492 pPackage->compatiblePackage.fRemove = FALSE; 500 pPackage->compatiblePackage.fRemove = FALSE;
493 } 501 }
494 else 502 else
@@ -511,8 +519,22 @@ extern "C" HRESULT DependencyPlanPackageBegin(
511 519
512 if (!fAllImportedProviders) 520 if (!fAllImportedProviders)
513 { 521 {
514 pPackage->providerExecute = dependencyExecuteAction; 522 for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i)
515 pPackage->providerRollback = dependencyRollbackAction; 523 {
524 BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i];
525 pProvider->providerExecute = dependencyExecuteAction;
526 pProvider->providerRollback = dependencyRollbackAction;
527 }
528
529 if (BURN_DEPENDENCY_ACTION_NONE != dependencyExecuteAction)
530 {
531 pPackage->fProviderExecute = TRUE;
532 }
533
534 if (BURN_DEPENDENCY_ACTION_NONE != dependencyRollbackAction)
535 {
536 pPackage->fProviderRollback = TRUE;
537 }
516 } 538 }
517 } 539 }
518 540
@@ -556,14 +578,13 @@ extern "C" HRESULT DependencyPlanPackage(
556 } 578 }
557 579
558 // Add the provider rollback plan. 580 // Add the provider rollback plan.
559 if (BURN_DEPENDENCY_ACTION_NONE != pPackage->providerRollback) 581 if (pPackage->fProviderRollback)
560 { 582 {
561 hr = PlanAppendRollbackAction(pPlan, &pAction); 583 hr = PlanAppendRollbackAction(pPlan, &pAction);
562 ExitOnFailure(hr, "Failed to append provider rollback action."); 584 ExitOnFailure(hr, "Failed to append provider rollback action.");
563 585
564 pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; 586 pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER;
565 pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage); 587 pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage);
566 pAction->packageProvider.action = pPackage->providerRollback;
567 588
568 // Put a checkpoint before the execute action so that rollback happens 589 // Put a checkpoint before the execute action so that rollback happens
569 // if execute fails. 590 // if execute fails.
@@ -573,7 +594,7 @@ extern "C" HRESULT DependencyPlanPackage(
573 594
574 // Add the provider execute plan. This comes after rollback so if something goes wrong 595 // Add the provider execute plan. This comes after rollback so if something goes wrong
575 // rollback will try to clean up after us. 596 // rollback will try to clean up after us.
576 if (BURN_DEPENDENCY_ACTION_NONE != pPackage->providerExecute) 597 if (pPackage->fProviderExecute)
577 { 598 {
578 if (NULL != pdwInsertSequence) 599 if (NULL != pdwInsertSequence)
579 { 600 {
@@ -592,7 +613,6 @@ extern "C" HRESULT DependencyPlanPackage(
592 613
593 pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; 614 pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER;
594 pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage); 615 pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage);
595 pAction->packageProvider.action = pPackage->providerExecute;
596 } 616 }
597 617
598LExit: 618LExit:
@@ -627,26 +647,39 @@ LExit:
627} 647}
628 648
629extern "C" HRESULT DependencyExecutePackageProviderAction( 649extern "C" HRESULT DependencyExecutePackageProviderAction(
630 __in const BURN_EXECUTE_ACTION* pAction 650 __in const BURN_EXECUTE_ACTION* pAction,
651 __in BOOL fRollback
631 ) 652 )
632{ 653{
633 AssertSz(BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER == pAction->type, "Execute action type not supported by this function."); 654 AssertSz(BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER == pAction->type, "Execute action type not supported by this function.");
634 655
635 HRESULT hr = S_OK; 656 HRESULT hr = S_OK;
636 const BURN_PACKAGE* pPackage = pAction->packageProvider.pPackage; 657 const BURN_PACKAGE* pPackage = pAction->packageProvider.pPackage;
658 HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
659 LPCWSTR wzId = GetPackageProviderId(pPackage);
637 660
638 // Register or unregister the package provider(s). 661 for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i)
639 if (BURN_DEPENDENCY_ACTION_REGISTER == pAction->packageProvider.action)
640 {
641 hr = RegisterPackageProvider(pPackage);
642 ExitOnFailure(hr, "Failed to register the package providers.");
643 }
644 else if (BURN_DEPENDENCY_ACTION_UNREGISTER == pAction->packageProvider.action)
645 { 662 {
646 UnregisterPackageProvider(pPackage); 663 const BURN_DEPENDENCY_PROVIDER* pProvider = pPackage->rgDependencyProviders + i;
664 BURN_DEPENDENCY_ACTION action = fRollback ? pProvider->providerRollback : pProvider->providerExecute;
665 HRESULT hrProvider = S_OK;
666
667 // Register or unregister the package provider.
668 switch (action)
669 {
670 case BURN_DEPENDENCY_ACTION_REGISTER:
671 hrProvider = RegisterPackageProvider(pProvider, pPackage->sczId, wzId, hkRoot, pPackage->fVital);
672 if (SUCCEEDED(hr) && FAILED(hrProvider))
673 {
674 hr = hrProvider;
675 }
676 break;
677 case BURN_DEPENDENCY_ACTION_UNREGISTER:
678 UnregisterPackageProvider(pProvider, pPackage->sczId, hkRoot);
679 break;
680 }
647 } 681 }
648 682
649LExit:
650 if (!pPackage->fVital) 683 if (!pPackage->fVital)
651 { 684 {
652 hr = S_OK; 685 hr = S_OK;
@@ -1175,7 +1208,7 @@ static void CalculateDependencyActionStates(
1175 case BOOTSTRAPPER_ACTION_STATE_INSTALL: __fallthrough; 1208 case BOOTSTRAPPER_ACTION_STATE_INSTALL: __fallthrough;
1176 case BOOTSTRAPPER_ACTION_STATE_MODIFY: __fallthrough; 1209 case BOOTSTRAPPER_ACTION_STATE_MODIFY: __fallthrough;
1177 case BOOTSTRAPPER_ACTION_STATE_REPAIR: __fallthrough; 1210 case BOOTSTRAPPER_ACTION_STATE_REPAIR: __fallthrough;
1178 case BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE: __fallthrough; 1211 case BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE:
1179 *pDependencyExecuteAction = BURN_DEPENDENCY_ACTION_REGISTER; 1212 *pDependencyExecuteAction = BURN_DEPENDENCY_ACTION_REGISTER;
1180 break; 1213 break;
1181 } 1214 }
@@ -1188,7 +1221,7 @@ static void CalculateDependencyActionStates(
1188 switch (pPackage->currentState) 1221 switch (pPackage->currentState)
1189 { 1222 {
1190 case BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE: __fallthrough; 1223 case BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE: __fallthrough;
1191 case BOOTSTRAPPER_PACKAGE_STATE_ABSENT: __fallthrough; 1224 case BOOTSTRAPPER_PACKAGE_STATE_ABSENT:
1192 *pDependencyRollbackAction = BURN_DEPENDENCY_ACTION_UNREGISTER; 1225 *pDependencyRollbackAction = BURN_DEPENDENCY_ACTION_UNREGISTER;
1193 break; 1226 break;
1194 } 1227 }
@@ -1291,32 +1324,25 @@ static LPCWSTR GetPackageProviderId(
1291} 1324}
1292 1325
1293static HRESULT RegisterPackageProvider( 1326static HRESULT RegisterPackageProvider(
1294 __in const BURN_PACKAGE* pPackage 1327 __in const BURN_DEPENDENCY_PROVIDER* pProvider,
1328 __in LPCWSTR wzPackageId,
1329 __in LPCWSTR wzPackageProviderId,
1330 __in HKEY hkRoot,
1331 __in BOOL fVital
1295 ) 1332 )
1296{ 1333{
1297 HRESULT hr = S_OK; 1334 HRESULT hr = S_OK;
1298 1335
1299 if (pPackage->rgDependencyProviders) 1336 if (!pProvider->fImported)
1300 { 1337 {
1301 HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 1338 LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_REGISTER, pProvider->sczKey, pProvider->sczVersion, wzPackageId);
1302 LPCWSTR wzId = GetPackageProviderId(pPackage);
1303
1304 for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i)
1305 {
1306 const BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i];
1307
1308 if (!pProvider->fImported)
1309 {
1310 LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_REGISTER, pProvider->sczKey, pProvider->sczVersion, pPackage->sczId);
1311 1339
1312 hr = DepRegisterDependency(hkRoot, pProvider->sczKey, pProvider->sczVersion, pProvider->sczDisplayName, wzId, 0); 1340 hr = DepRegisterDependency(hkRoot, pProvider->sczKey, pProvider->sczVersion, pProvider->sczDisplayName, wzPackageProviderId, 0);
1313 ExitOnFailure(hr, "Failed to register the package dependency provider: %ls", pProvider->sczKey); 1341 ExitOnFailure(hr, "Failed to register the package dependency provider: %ls", pProvider->sczKey);
1314 }
1315 }
1316 } 1342 }
1317 1343
1318LExit: 1344LExit:
1319 if (!pPackage->fVital) 1345 if (!fVital)
1320 { 1346 {
1321 hr = S_OK; 1347 hr = S_OK;
1322 } 1348 }
@@ -1325,36 +1351,28 @@ LExit:
1325} 1351}
1326 1352
1327/******************************************************************** 1353/********************************************************************
1328 UnregisterPackageProvider - Removes each dependency provider 1354 UnregisterPackageProvider - Removes the dependency provider.
1329 for the package (if not imported from the package itself).
1330 1355
1331 Note: Does not check for existing dependents before removing the key. 1356 Note: Does not check for existing dependents before removing the key.
1332*********************************************************************/ 1357*********************************************************************/
1333static void UnregisterPackageProvider( 1358static void UnregisterPackageProvider(
1334 __in const BURN_PACKAGE* pPackage 1359 __in const BURN_DEPENDENCY_PROVIDER* pProvider,
1360 __in LPCWSTR wzPackageId,
1361 __in HKEY hkRoot
1335 ) 1362 )
1336{ 1363{
1337 HRESULT hr = S_OK; 1364 HRESULT hr = S_OK;
1338 HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
1339 1365
1340 if (pPackage->rgDependencyProviders) 1366 if (!pProvider->fImported)
1341 { 1367 {
1342 for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i) 1368 hr = DepUnregisterDependency(hkRoot, pProvider->sczKey);
1369 if (SUCCEEDED(hr))
1343 { 1370 {
1344 const BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; 1371 LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED, pProvider->sczKey, wzPackageId);
1345 1372 }
1346 if (!pProvider->fImported) 1373 else if (FAILED(hr) && E_FILENOTFOUND != hr)
1347 { 1374 {
1348 hr = DepUnregisterDependency(hkRoot, pProvider->sczKey); 1375 LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED_FAILED, pProvider->sczKey, wzPackageId, hr);
1349 if (SUCCEEDED(hr))
1350 {
1351 LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED, pProvider->sczKey, pPackage->sczId);
1352 }
1353 else if (FAILED(hr) && E_FILENOTFOUND != hr)
1354 {
1355 LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED_FAILED, pProvider->sczKey, pPackage->sczId, hr);
1356 }
1357 }
1358 } 1376 }
1359 } 1377 }
1360} 1378}