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.cpp150
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
75static HRESULT RegisterPackageDependency( 75static 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
89static void UnregisterPackageProviderDependent(
90 __in const BURN_DEPENDENCY_PROVIDER* pProvider,
91 __in HKEY hkRoot,
92 __in LPCWSTR wzPackageId,
93 __in_z LPCWSTR wzDependentProviderKey
94 );
86static void UnregisterOrphanPackageProviders( 95static 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
557LExit: 582LExit:
558 ReleaseDict(sdIgnoredDependents); 583 ReleaseDict(sdIgnoredDependents);
@@ -690,23 +715,43 @@ extern "C" HRESULT DependencyExecutePackageProviderAction(
690 715
691extern "C" HRESULT DependencyExecutePackageDependencyAction( 716extern "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
712LExit: 757LExit:
@@ -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*********************************************************************/
1385static HRESULT RegisterPackageDependency( 1428static 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
1422LExit: 1450LExit:
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
1491static 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
1467static void UnregisterOrphanPackageProviders( 1511static void UnregisterOrphanPackageProviders(
1468 __in const BURN_PACKAGE* pPackage 1512 __in const BURN_PACKAGE* pPackage
1469 ) 1513 )