diff options
Diffstat (limited to 'src/burn/engine/dependency.cpp')
-rw-r--r-- | src/burn/engine/dependency.cpp | 132 |
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 | ||
61 | static HRESULT RegisterPackageProvider( | 61 | static 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 | ||
65 | static void UnregisterPackageProvider( | 69 | static 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 | ||
69 | static HRESULT RegisterPackageDependency( | 75 | static 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 | ||
598 | LExit: | 618 | LExit: |
@@ -627,26 +647,39 @@ LExit: | |||
627 | } | 647 | } |
628 | 648 | ||
629 | extern "C" HRESULT DependencyExecutePackageProviderAction( | 649 | extern "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 | ||
649 | LExit: | ||
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 | ||
1293 | static HRESULT RegisterPackageProvider( | 1326 | static 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 | ||
1318 | LExit: | 1344 | LExit: |
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 | *********************************************************************/ |
1333 | static void UnregisterPackageProvider( | 1358 | static 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 | } |