diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2022-01-31 16:23:31 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-02-01 23:36:23 -0600 |
| commit | c95c41151d595f4630c4c2f4aeb4c7f9a97af5c7 (patch) | |
| tree | 3b2675c7bd9ffa249085397a3953381df8a89281 /src/burn/engine/dependency.cpp | |
| parent | eae94502fe8e7ca601161360a7d31e93edc88763 (diff) | |
| download | wix-c95c41151d595f4630c4c2f4aeb4c7f9a97af5c7.tar.gz wix-c95c41151d595f4630c4c2f4aeb4c7f9a97af5c7.tar.bz2 wix-c95c41151d595f4630c4c2f4aeb4c7f9a97af5c7.zip | |
Plan each dependency provider dependent individually.
Refactoring for #6510
Diffstat (limited to 'src/burn/engine/dependency.cpp')
| -rw-r--r-- | src/burn/engine/dependency.cpp | 150 |
1 files changed, 97 insertions, 53 deletions
diff --git a/src/burn/engine/dependency.cpp b/src/burn/engine/dependency.cpp index 8f568f28..01f27d72 100644 --- a/src/burn/engine/dependency.cpp +++ b/src/burn/engine/dependency.cpp | |||
| @@ -72,9 +72,11 @@ static void UnregisterPackageProvider( | |||
| 72 | __in HKEY hkRoot | 72 | __in HKEY hkRoot |
| 73 | ); | 73 | ); |
| 74 | 74 | ||
| 75 | static HRESULT RegisterPackageDependency( | 75 | static HRESULT RegisterPackageProviderDependent( |
| 76 | __in BOOL fPerMachine, | 76 | __in const BURN_DEPENDENCY_PROVIDER* pProvider, |
| 77 | __in const BURN_PACKAGE* pPackage, | 77 | __in BOOL fVital, |
| 78 | __in HKEY hkRoot, | ||
| 79 | __in LPCWSTR wzPackageId, | ||
| 78 | __in_z LPCWSTR wzDependentProviderKey | 80 | __in_z LPCWSTR wzDependentProviderKey |
| 79 | ); | 81 | ); |
| 80 | 82 | ||
| @@ -83,6 +85,13 @@ static void UnregisterPackageDependency( | |||
| 83 | __in const BURN_PACKAGE* pPackage, | 85 | __in const BURN_PACKAGE* pPackage, |
| 84 | __in_z LPCWSTR wzDependentProviderKey | 86 | __in_z LPCWSTR wzDependentProviderKey |
| 85 | ); | 87 | ); |
| 88 | |||
| 89 | static void UnregisterPackageProviderDependent( | ||
| 90 | __in const BURN_DEPENDENCY_PROVIDER* pProvider, | ||
| 91 | __in HKEY hkRoot, | ||
| 92 | __in LPCWSTR wzPackageId, | ||
| 93 | __in_z LPCWSTR wzDependentProviderKey | ||
| 94 | ); | ||
| 86 | static void UnregisterOrphanPackageProviders( | 95 | static void UnregisterOrphanPackageProviders( |
| 87 | __in const BURN_PACKAGE* pPackage | 96 | __in const BURN_PACKAGE* pPackage |
| 88 | ); | 97 | ); |
| @@ -551,8 +560,24 @@ extern "C" HRESULT DependencyPlanPackageBegin( | |||
| 551 | } | 560 | } |
| 552 | } | 561 | } |
| 553 | 562 | ||
| 554 | pPackage->dependencyExecute = dependencyExecuteAction; | 563 | for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i) |
| 555 | pPackage->dependencyRollback = dependencyRollbackAction; | 564 | { |
| 565 | BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; | ||
| 566 | |||
| 567 | pProvider->dependentExecute = dependencyExecuteAction; | ||
| 568 | pProvider->dependentRollback = dependencyRollbackAction; | ||
| 569 | |||
| 570 | // The highest aggregate action state found will be returned. | ||
| 571 | if (pPackage->dependencyExecute < pProvider->dependentExecute) | ||
| 572 | { | ||
| 573 | pPackage->dependencyExecute = pProvider->dependentExecute; | ||
| 574 | } | ||
| 575 | |||
| 576 | if (pPackage->dependencyRollback < pProvider->dependentRollback) | ||
| 577 | { | ||
| 578 | pPackage->dependencyRollback = pProvider->dependentRollback; | ||
| 579 | } | ||
| 580 | } | ||
| 556 | 581 | ||
| 557 | LExit: | 582 | LExit: |
| 558 | ReleaseDict(sdIgnoredDependents); | 583 | ReleaseDict(sdIgnoredDependents); |
| @@ -690,23 +715,43 @@ extern "C" HRESULT DependencyExecutePackageProviderAction( | |||
| 690 | 715 | ||
| 691 | extern "C" HRESULT DependencyExecutePackageDependencyAction( | 716 | extern "C" HRESULT DependencyExecutePackageDependencyAction( |
| 692 | __in BOOL fPerMachine, | 717 | __in BOOL fPerMachine, |
| 693 | __in const BURN_EXECUTE_ACTION* pAction | 718 | __in const BURN_EXECUTE_ACTION* pAction, |
| 719 | __in BOOL fRollback | ||
| 694 | ) | 720 | ) |
| 695 | { | 721 | { |
| 696 | AssertSz(BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY == pAction->type, "Execute action type not supported by this function."); | 722 | AssertSz(BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY == pAction->type, "Execute action type not supported by this function."); |
| 697 | 723 | ||
| 698 | HRESULT hr = S_OK; | 724 | HRESULT hr = S_OK; |
| 699 | const BURN_PACKAGE* pPackage = pAction->packageDependency.pPackage; | 725 | const BURN_PACKAGE* pPackage = pAction->packageDependency.pPackage; |
| 726 | HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | ||
| 700 | 727 | ||
| 701 | // Register or unregister the bundle as a dependent of each package dependency provider. | 728 | // Do not register a dependency on a package in a different install context. |
| 702 | if (BURN_DEPENDENCY_ACTION_REGISTER == pAction->packageDependency.action) | 729 | if (fPerMachine != pPackage->fPerMachine) |
| 703 | { | 730 | { |
| 704 | hr = RegisterPackageDependency(fPerMachine, pPackage, pAction->packageDependency.sczBundleProviderKey); | 731 | LogId(REPORT_STANDARD, MSG_DEPENDENCY_PACKAGE_SKIP_WRONGSCOPE, pPackage->sczId, LoggingPerMachineToString(fPerMachine), LoggingPerMachineToString(pPackage->fPerMachine)); |
| 705 | ExitOnFailure(hr, "Failed to register the dependency on the package provider."); | 732 | ExitFunction1(hr = S_OK); |
| 706 | } | 733 | } |
| 707 | else if (BURN_DEPENDENCY_ACTION_UNREGISTER == pAction->packageDependency.action) | 734 | |
| 735 | for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i) | ||
| 708 | { | 736 | { |
| 709 | UnregisterPackageDependency(fPerMachine, pPackage, pAction->packageDependency.sczBundleProviderKey); | 737 | const BURN_DEPENDENCY_PROVIDER* pProvider = pPackage->rgDependencyProviders + i; |
| 738 | BURN_DEPENDENCY_ACTION action = fRollback ? pProvider->dependentRollback : pProvider->dependentExecute; | ||
| 739 | HRESULT hrProvider = S_OK; | ||
| 740 | |||
| 741 | // Register or unregister the bundle as a dependent of the package dependency provider. | ||
| 742 | switch (action) | ||
| 743 | { | ||
| 744 | case BURN_DEPENDENCY_ACTION_REGISTER: | ||
| 745 | hrProvider = RegisterPackageProviderDependent(pProvider, pPackage->fVital, hkRoot, pPackage->sczId, pAction->packageDependency.sczBundleProviderKey); | ||
| 746 | if (SUCCEEDED(hr) && FAILED(hrProvider)) | ||
| 747 | { | ||
| 748 | hr = hrProvider; | ||
| 749 | } | ||
| 750 | break; | ||
| 751 | case BURN_DEPENDENCY_ACTION_UNREGISTER: | ||
| 752 | UnregisterPackageProviderDependent(pProvider, hkRoot, pPackage->sczId, pAction->packageDependency.sczBundleProviderKey); | ||
| 753 | break; | ||
| 754 | } | ||
| 710 | } | 755 | } |
| 711 | 756 | ||
| 712 | LExit: | 757 | LExit: |
| @@ -1262,7 +1307,6 @@ static HRESULT AddPackageDependencyActions( | |||
| 1262 | 1307 | ||
| 1263 | pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY; | 1308 | pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY; |
| 1264 | pAction->packageDependency.pPackage = const_cast<BURN_PACKAGE*>(pPackage); | 1309 | pAction->packageDependency.pPackage = const_cast<BURN_PACKAGE*>(pPackage); |
| 1265 | pAction->packageDependency.action = dependencyRollbackAction; | ||
| 1266 | 1310 | ||
| 1267 | hr = StrAllocString(&pAction->packageDependency.sczBundleProviderKey, pPlan->wzBundleProviderKey, 0); | 1311 | hr = StrAllocString(&pAction->packageDependency.sczBundleProviderKey, pPlan->wzBundleProviderKey, 0); |
| 1268 | ExitOnFailure(hr, "Failed to copy the bundle dependency provider."); | 1312 | ExitOnFailure(hr, "Failed to copy the bundle dependency provider."); |
| @@ -1294,7 +1338,6 @@ static HRESULT AddPackageDependencyActions( | |||
| 1294 | 1338 | ||
| 1295 | pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY; | 1339 | pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY; |
| 1296 | pAction->packageDependency.pPackage = const_cast<BURN_PACKAGE*>(pPackage); | 1340 | pAction->packageDependency.pPackage = const_cast<BURN_PACKAGE*>(pPackage); |
| 1297 | pAction->packageDependency.action = dependencyExecuteAction; | ||
| 1298 | 1341 | ||
| 1299 | hr = StrAllocString(&pAction->packageDependency.sczBundleProviderKey, pPlan->wzBundleProviderKey, 0); | 1342 | hr = StrAllocString(&pAction->packageDependency.sczBundleProviderKey, pPlan->wzBundleProviderKey, 0); |
| 1300 | ExitOnFailure(hr, "Failed to copy the bundle dependency provider."); | 1343 | ExitOnFailure(hr, "Failed to copy the bundle dependency provider."); |
| @@ -1378,48 +1421,38 @@ static void UnregisterPackageProvider( | |||
| 1378 | } | 1421 | } |
| 1379 | 1422 | ||
| 1380 | /******************************************************************** | 1423 | /******************************************************************** |
| 1381 | RegisterPackageDependency - Registers the provider key | 1424 | RegisterPackageProviderDependent - Registers the provider key |
| 1382 | as a dependent of a package. | 1425 | as a dependent of a package provider. |
| 1383 | 1426 | ||
| 1384 | *********************************************************************/ | 1427 | *********************************************************************/ |
| 1385 | static HRESULT RegisterPackageDependency( | 1428 | static HRESULT RegisterPackageProviderDependent( |
| 1386 | __in BOOL fPerMachine, | 1429 | __in const BURN_DEPENDENCY_PROVIDER* pProvider, |
| 1387 | __in const BURN_PACKAGE* pPackage, | 1430 | __in BOOL fVital, |
| 1431 | __in HKEY hkRoot, | ||
| 1432 | __in LPCWSTR wzPackageId, | ||
| 1388 | __in_z LPCWSTR wzDependentProviderKey | 1433 | __in_z LPCWSTR wzDependentProviderKey |
| 1389 | ) | 1434 | ) |
| 1390 | { | 1435 | { |
| 1391 | HRESULT hr = S_OK; | 1436 | HRESULT hr = S_OK; |
| 1392 | HKEY hkRoot = fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | ||
| 1393 | 1437 | ||
| 1394 | // Do not register a dependency on a package in a different install context. | 1438 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_REGISTER_DEPENDENCY, wzDependentProviderKey, pProvider->sczKey, wzPackageId); |
| 1395 | if (fPerMachine != pPackage->fPerMachine) | 1439 | |
| 1440 | hr = DepRegisterDependent(hkRoot, pProvider->sczKey, wzDependentProviderKey, NULL, NULL, 0); | ||
| 1441 | if (E_FILENOTFOUND != hr) | ||
| 1396 | { | 1442 | { |
| 1397 | LogId(REPORT_STANDARD, MSG_DEPENDENCY_PACKAGE_SKIP_WRONGSCOPE, pPackage->sczId, LoggingPerMachineToString(fPerMachine), LoggingPerMachineToString(pPackage->fPerMachine)); | 1443 | ExitOnFailure(hr, "Failed to register the dependency on package dependency provider: %ls", pProvider->sczKey); |
| 1398 | ExitFunction1(hr = S_OK); | ||
| 1399 | } | 1444 | } |
| 1400 | 1445 | else | |
| 1401 | if (pPackage->rgDependencyProviders) | ||
| 1402 | { | 1446 | { |
| 1403 | for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i) | 1447 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_SKIP_MISSING, pProvider->sczKey, wzPackageId); |
| 1404 | { | ||
| 1405 | const BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; | ||
| 1406 | |||
| 1407 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_REGISTER_DEPENDENCY, wzDependentProviderKey, pProvider->sczKey, pPackage->sczId); | ||
| 1408 | |||
| 1409 | hr = DepRegisterDependent(hkRoot, pProvider->sczKey, wzDependentProviderKey, NULL, NULL, 0); | ||
| 1410 | if (E_FILENOTFOUND != hr || pPackage->fVital) | ||
| 1411 | { | ||
| 1412 | ExitOnFailure(hr, "Failed to register the dependency on package dependency provider: %ls", pProvider->sczKey); | ||
| 1413 | } | ||
| 1414 | else | ||
| 1415 | { | ||
| 1416 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_SKIP_MISSING, pProvider->sczKey, pPackage->sczId); | ||
| 1417 | hr = S_OK; | ||
| 1418 | } | ||
| 1419 | } | ||
| 1420 | } | 1448 | } |
| 1421 | 1449 | ||
| 1422 | LExit: | 1450 | LExit: |
| 1451 | if (!fVital) | ||
| 1452 | { | ||
| 1453 | hr = S_OK; | ||
| 1454 | } | ||
| 1455 | |||
| 1423 | return hr; | 1456 | return hr; |
| 1424 | } | 1457 | } |
| 1425 | 1458 | ||
| @@ -1434,7 +1467,6 @@ static void UnregisterPackageDependency( | |||
| 1434 | __in_z LPCWSTR wzDependentProviderKey | 1467 | __in_z LPCWSTR wzDependentProviderKey |
| 1435 | ) | 1468 | ) |
| 1436 | { | 1469 | { |
| 1437 | HRESULT hr = S_OK; | ||
| 1438 | HKEY hkRoot = fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | 1470 | HKEY hkRoot = fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
| 1439 | 1471 | ||
| 1440 | // Should be no registration to remove since we don't write keys across contexts. | 1472 | // Should be no registration to remove since we don't write keys across contexts. |
| @@ -1451,19 +1483,31 @@ static void UnregisterPackageDependency( | |||
| 1451 | { | 1483 | { |
| 1452 | const BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; | 1484 | const BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; |
| 1453 | 1485 | ||
| 1454 | hr = DepUnregisterDependent(hkRoot, pProvider->sczKey, wzDependentProviderKey); | 1486 | UnregisterPackageProviderDependent(pProvider, hkRoot, pPackage->sczId, wzDependentProviderKey); |
| 1455 | if (SUCCEEDED(hr)) | ||
| 1456 | { | ||
| 1457 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED_DEPENDENCY, wzDependentProviderKey, pProvider->sczKey, pPackage->sczId); | ||
| 1458 | } | ||
| 1459 | else if (FAILED(hr) && E_FILENOTFOUND != hr) | ||
| 1460 | { | ||
| 1461 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED_DEPENDENCY_FAILED, wzDependentProviderKey, pProvider->sczKey, pPackage->sczId, hr); | ||
| 1462 | } | ||
| 1463 | } | 1487 | } |
| 1464 | } | 1488 | } |
| 1465 | } | 1489 | } |
| 1466 | 1490 | ||
| 1491 | static void UnregisterPackageProviderDependent( | ||
| 1492 | __in const BURN_DEPENDENCY_PROVIDER* pProvider, | ||
| 1493 | __in HKEY hkRoot, | ||
| 1494 | __in LPCWSTR wzPackageId, | ||
| 1495 | __in_z LPCWSTR wzDependentProviderKey | ||
| 1496 | ) | ||
| 1497 | { | ||
| 1498 | HRESULT hr = S_OK; | ||
| 1499 | |||
| 1500 | hr = DepUnregisterDependent(hkRoot, pProvider->sczKey, wzDependentProviderKey); | ||
| 1501 | if (SUCCEEDED(hr)) | ||
| 1502 | { | ||
| 1503 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED_DEPENDENCY, wzDependentProviderKey, pProvider->sczKey, wzPackageId); | ||
| 1504 | } | ||
| 1505 | else if (FAILED(hr) && E_FILENOTFOUND != hr) | ||
| 1506 | { | ||
| 1507 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED_DEPENDENCY_FAILED, wzDependentProviderKey, pProvider->sczKey, wzPackageId, hr); | ||
| 1508 | } | ||
| 1509 | } | ||
| 1510 | |||
| 1467 | static void UnregisterOrphanPackageProviders( | 1511 | static void UnregisterOrphanPackageProviders( |
| 1468 | __in const BURN_PACKAGE* pPackage | 1512 | __in const BURN_PACKAGE* pPackage |
| 1469 | ) | 1513 | ) |
