diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2022-01-31 16:19:32 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-02-01 23:36:23 -0600 |
| commit | eae94502fe8e7ca601161360a7d31e93edc88763 (patch) | |
| tree | 51fc862014a74c6fb2f303f90b4ca5999f3647d0 /src/burn/engine/dependency.cpp | |
| parent | b152761dfddc0a131dcd13f70ae0e9b9e41b37fe (diff) | |
| download | wix-eae94502fe8e7ca601161360a7d31e93edc88763.tar.gz wix-eae94502fe8e7ca601161360a7d31e93edc88763.tar.bz2 wix-eae94502fe8e7ca601161360a7d31e93edc88763.zip | |
Plan each dependency provider individually.
Refactoring for #6510
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 | } |
