diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/burn/engine/core.cpp | 27 | ||||
-rw-r--r-- | src/burn/engine/dependency.cpp | 73 | ||||
-rw-r--r-- | src/burn/engine/dependency.h | 13 | ||||
-rw-r--r-- | src/burn/engine/exeengine.cpp | 4 | ||||
-rw-r--r-- | src/burn/engine/exeengine.h | 1 | ||||
-rw-r--r-- | src/burn/engine/msiengine.cpp | 4 | ||||
-rw-r--r-- | src/burn/engine/msiengine.h | 1 | ||||
-rw-r--r-- | src/burn/engine/mspengine.cpp | 4 | ||||
-rw-r--r-- | src/burn/engine/mspengine.h | 1 | ||||
-rw-r--r-- | src/burn/engine/msuengine.cpp | 4 | ||||
-rw-r--r-- | src/burn/engine/msuengine.h | 1 | ||||
-rw-r--r-- | src/burn/engine/relatedbundle.cpp | 3 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/deputil.cpp | 19 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/deputil.h | 2 |
14 files changed, 97 insertions, 60 deletions
diff --git a/src/burn/engine/core.cpp b/src/burn/engine/core.cpp index 8a181e7c..d70810f2 100644 --- a/src/burn/engine/core.cpp +++ b/src/burn/engine/core.cpp | |||
@@ -342,21 +342,15 @@ extern "C" HRESULT CoreDetect( | |||
342 | hr = SearchesExecute(&pEngineState->searches, &pEngineState->variables); | 342 | hr = SearchesExecute(&pEngineState->searches, &pEngineState->variables); |
343 | ExitOnFailure(hr, "Failed to execute searches."); | 343 | ExitOnFailure(hr, "Failed to execute searches."); |
344 | 344 | ||
345 | hr = DependencyDetectBundle(&pEngineState->dependencies, &pEngineState->registration); | ||
346 | ExitOnFailure(hr, "Failed to detect the dependencies."); | ||
347 | |||
345 | // Load all of the related bundles. | 348 | // Load all of the related bundles. |
346 | hr = RegistrationDetectRelatedBundles(&pEngineState->registration); | 349 | hr = RegistrationDetectRelatedBundles(&pEngineState->registration); |
347 | ExitOnFailure(hr, "Failed to detect related bundles."); | 350 | ExitOnFailure(hr, "Failed to detect related bundles."); |
348 | 351 | ||
349 | hr = DependencyDetectProviderKeyBundleId(&pEngineState->registration); | 352 | hr = DetectForwardCompatibleBundles(&pEngineState->userExperience, &pEngineState->registration); |
350 | if (SUCCEEDED(hr)) | 353 | ExitOnFailure(hr, "Failed to detect forward compatible bundle."); |
351 | { | ||
352 | hr = DetectForwardCompatibleBundles(&pEngineState->userExperience, &pEngineState->registration); | ||
353 | ExitOnFailure(hr, "Failed to detect forward compatible bundle."); | ||
354 | } | ||
355 | else if (E_NOTFOUND == hr) | ||
356 | { | ||
357 | hr = S_OK; | ||
358 | } | ||
359 | ExitOnFailure(hr, "Failed to detect provider key bundle id."); | ||
360 | 354 | ||
361 | // Report the related bundles. | 355 | // Report the related bundles. |
362 | hr = DetectReportRelatedBundles(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->registration.fEligibleForCleanup); | 356 | hr = DetectReportRelatedBundles(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->registration.fEligibleForCleanup); |
@@ -398,9 +392,6 @@ extern "C" HRESULT CoreDetect( | |||
398 | } | 392 | } |
399 | } | 393 | } |
400 | 394 | ||
401 | hr = DependencyDetect(&pEngineState->dependencies, &pEngineState->packages, &pEngineState->registration); | ||
402 | ExitOnFailure(hr, "Failed to detect the dependencies."); | ||
403 | |||
404 | // Log the detected states. | 395 | // Log the detected states. |
405 | for (DWORD iPackage = 0; iPackage < pEngineState->packages.cPackages; ++iPackage) | 396 | for (DWORD iPackage = 0; iPackage < pEngineState->packages.cPackages; ++iPackage) |
406 | { | 397 | { |
@@ -2073,19 +2064,19 @@ static HRESULT DetectPackage( | |||
2073 | switch (pPackage->type) | 2064 | switch (pPackage->type) |
2074 | { | 2065 | { |
2075 | case BURN_PACKAGE_TYPE_EXE: | 2066 | case BURN_PACKAGE_TYPE_EXE: |
2076 | hr = ExeEngineDetectPackage(pPackage, &pEngineState->variables); | 2067 | hr = ExeEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->variables); |
2077 | break; | 2068 | break; |
2078 | 2069 | ||
2079 | case BURN_PACKAGE_TYPE_MSI: | 2070 | case BURN_PACKAGE_TYPE_MSI: |
2080 | hr = MsiEngineDetectPackage(pPackage, &pEngineState->userExperience); | 2071 | hr = MsiEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->userExperience); |
2081 | break; | 2072 | break; |
2082 | 2073 | ||
2083 | case BURN_PACKAGE_TYPE_MSP: | 2074 | case BURN_PACKAGE_TYPE_MSP: |
2084 | hr = MspEngineDetectPackage(pPackage, &pEngineState->userExperience); | 2075 | hr = MspEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->userExperience); |
2085 | break; | 2076 | break; |
2086 | 2077 | ||
2087 | case BURN_PACKAGE_TYPE_MSU: | 2078 | case BURN_PACKAGE_TYPE_MSU: |
2088 | hr = MsuEngineDetectPackage(pPackage, &pEngineState->variables); | 2079 | hr = MsuEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->variables); |
2089 | break; | 2080 | break; |
2090 | 2081 | ||
2091 | default: | 2082 | default: |
diff --git a/src/burn/engine/dependency.cpp b/src/burn/engine/dependency.cpp index bd86fe11..5d7e1a94 100644 --- a/src/burn/engine/dependency.cpp +++ b/src/burn/engine/dependency.cpp | |||
@@ -12,7 +12,6 @@ const LPCWSTR vcszIgnoreDependenciesDelim = L";"; | |||
12 | 12 | ||
13 | static HRESULT DetectPackageDependents( | 13 | static HRESULT DetectPackageDependents( |
14 | __in BURN_PACKAGE* pPackage, | 14 | __in BURN_PACKAGE* pPackage, |
15 | __in STRINGDICT_HANDLE sdIgnoredDependents, | ||
16 | __in const BURN_REGISTRATION* pRegistration | 15 | __in const BURN_REGISTRATION* pRegistration |
17 | ); | 16 | ); |
18 | 17 | ||
@@ -232,7 +231,8 @@ extern "C" HRESULT DependencyDetectProviderKeyBundleId( | |||
232 | hr = DepGetProviderInformation(pRegistration->hkRoot, pRegistration->sczProviderKey, &pRegistration->sczDetectedProviderKeyBundleId, NULL, NULL); | 231 | hr = DepGetProviderInformation(pRegistration->hkRoot, pRegistration->sczProviderKey, &pRegistration->sczDetectedProviderKeyBundleId, NULL, NULL); |
233 | if (E_NOTFOUND == hr) | 232 | if (E_NOTFOUND == hr) |
234 | { | 233 | { |
235 | ExitFunction(); | 234 | ReleaseNullStr(pRegistration->sczDetectedProviderKeyBundleId); |
235 | ExitFunction1(hr = S_OK); | ||
236 | } | 236 | } |
237 | ExitOnFailure(hr, "Failed to get provider key bundle id."); | 237 | ExitOnFailure(hr, "Failed to get provider key bundle id."); |
238 | 238 | ||
@@ -247,50 +247,26 @@ LExit: | |||
247 | return hr; | 247 | return hr; |
248 | } | 248 | } |
249 | 249 | ||
250 | extern "C" HRESULT DependencyDetect( | 250 | extern "C" HRESULT DependencyDetectBundle( |
251 | __in BURN_DEPENDENCIES* pDependencies, | 251 | __in BURN_DEPENDENCIES* pDependencies, |
252 | __in BURN_PACKAGES* pPackages, | ||
253 | __in BURN_REGISTRATION* pRegistration | 252 | __in BURN_REGISTRATION* pRegistration |
254 | ) | 253 | ) |
255 | { | 254 | { |
256 | HRESULT hr = S_OK; | 255 | HRESULT hr = S_OK; |
257 | STRINGDICT_HANDLE sdIgnoredDependents = NULL; | ||
258 | BURN_PACKAGE* pPackage = NULL; | ||
259 | 256 | ||
260 | // Always leave this empty so that all dependents get detected. Plan will ignore dependents based on its own logic. | 257 | hr = DependencyDetectProviderKeyBundleId(pRegistration); |
261 | hr = DictCreateStringList(&sdIgnoredDependents, INITIAL_STRINGDICT_SIZE, DICT_FLAG_CASEINSENSITIVE); | 258 | ExitOnFailure(hr, "Failed to detect provider key bundle id."); |
262 | ExitOnFailure(hr, "Failed to create the string dictionary."); | ||
263 | 259 | ||
264 | hr = DepCheckDependents(pRegistration->hkRoot, pRegistration->sczProviderKey, 0, sdIgnoredDependents, &pRegistration->rgDependents, &pRegistration->cDependents); | 260 | hr = DepCheckDependents(pRegistration->hkRoot, pRegistration->sczProviderKey, 0, NULL, &pRegistration->rgDependents, &pRegistration->cDependents); |
265 | if (E_FILENOTFOUND != hr) | 261 | if (E_FILENOTFOUND != hr) |
266 | { | 262 | { |
267 | ExitOnFailure(hr, "Failed dependents check on bundle"); | 263 | ExitOnFailure(hr, "Failed dependents check on bundle."); |
268 | } | 264 | } |
269 | else | 265 | else |
270 | { | 266 | { |
271 | hr = S_OK; | 267 | hr = S_OK; |
272 | } | 268 | } |
273 | 269 | ||
274 | for (DWORD iPackage = 0; iPackage < pPackages->cPackages; ++iPackage) | ||
275 | { | ||
276 | pPackage = pPackages->rgPackages + iPackage; | ||
277 | hr = DetectPackageDependents(pPackage, sdIgnoredDependents, pRegistration); | ||
278 | ExitOnFailure(hr, "Failed to detect dependents for package '%ls'", pPackage->sczId); | ||
279 | } | ||
280 | |||
281 | for (DWORD iRelatedBundle = 0; iRelatedBundle < pRegistration->relatedBundles.cRelatedBundles; ++iRelatedBundle) | ||
282 | { | ||
283 | BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgRelatedBundles + iRelatedBundle; | ||
284 | if (!pRelatedBundle->fPlannable) | ||
285 | { | ||
286 | continue; | ||
287 | } | ||
288 | |||
289 | pPackage = &pRelatedBundle->package; | ||
290 | hr = DetectPackageDependents(pPackage, sdIgnoredDependents, pRegistration); | ||
291 | ExitOnFailure(hr, "Failed to detect dependents for related bundle '%ls'", pPackage->sczId); | ||
292 | } | ||
293 | |||
294 | if (pDependencies->fSelfDependent || pDependencies->fActiveParent) | 270 | if (pDependencies->fSelfDependent || pDependencies->fActiveParent) |
295 | { | 271 | { |
296 | for (DWORD i = 0; i < pRegistration->cDependents; ++i) | 272 | for (DWORD i = 0; i < pRegistration->cDependents; ++i) |
@@ -310,8 +286,38 @@ extern "C" HRESULT DependencyDetect( | |||
310 | } | 286 | } |
311 | 287 | ||
312 | LExit: | 288 | LExit: |
313 | ReleaseDict(sdIgnoredDependents); | 289 | return hr; |
290 | } | ||
291 | |||
292 | extern "C" HRESULT DependencyDetectChainPackage( | ||
293 | __in BURN_PACKAGE* pPackage, | ||
294 | __in BURN_REGISTRATION* pRegistration | ||
295 | ) | ||
296 | { | ||
297 | HRESULT hr = S_OK; | ||
298 | |||
299 | hr = DetectPackageDependents(pPackage, pRegistration); | ||
300 | ExitOnFailure(hr, "Failed to detect dependents for package '%ls'", pPackage->sczId); | ||
314 | 301 | ||
302 | LExit: | ||
303 | return hr; | ||
304 | } | ||
305 | |||
306 | extern "C" HRESULT DependencyDetectRelatedBundle( | ||
307 | __in BURN_RELATED_BUNDLE* pRelatedBundle, | ||
308 | __in BURN_REGISTRATION* pRegistration | ||
309 | ) | ||
310 | { | ||
311 | HRESULT hr = S_OK; | ||
312 | BURN_PACKAGE* pPackage = &pRelatedBundle->package; | ||
313 | |||
314 | if (pRelatedBundle->fPlannable) | ||
315 | { | ||
316 | hr = DetectPackageDependents(pPackage, pRegistration); | ||
317 | ExitOnFailure(hr, "Failed to detect dependents for related bundle '%ls'", pPackage->sczId); | ||
318 | } | ||
319 | |||
320 | LExit: | ||
315 | return hr; | 321 | return hr; |
316 | } | 322 | } |
317 | 323 | ||
@@ -738,7 +744,6 @@ extern "C" void DependencyUnregisterBundle( | |||
738 | 744 | ||
739 | static HRESULT DetectPackageDependents( | 745 | static HRESULT DetectPackageDependents( |
740 | __in BURN_PACKAGE* pPackage, | 746 | __in BURN_PACKAGE* pPackage, |
741 | __in STRINGDICT_HANDLE sdIgnoredDependents, | ||
742 | __in const BURN_REGISTRATION* pRegistration | 747 | __in const BURN_REGISTRATION* pRegistration |
743 | ) | 748 | ) |
744 | { | 749 | { |
@@ -759,7 +764,7 @@ static HRESULT DetectPackageDependents( | |||
759 | { | 764 | { |
760 | BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; | 765 | BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; |
761 | 766 | ||
762 | hr = DepCheckDependents(hkHive, pProvider->sczKey, 0, sdIgnoredDependents, &pProvider->rgDependents, &pProvider->cDependents); | 767 | hr = DepCheckDependents(hkHive, pProvider->sczKey, 0, NULL, &pProvider->rgDependents, &pProvider->cDependents); |
763 | if (E_FILENOTFOUND != hr) | 768 | if (E_FILENOTFOUND != hr) |
764 | { | 769 | { |
765 | ExitOnFailure(hr, "Failed dependents check on package provider: %ls", pProvider->sczKey); | 770 | ExitOnFailure(hr, "Failed dependents check on package provider: %ls", pProvider->sczKey); |
diff --git a/src/burn/engine/dependency.h b/src/burn/engine/dependency.h index 3dacaf99..8d7344eb 100644 --- a/src/burn/engine/dependency.h +++ b/src/burn/engine/dependency.h | |||
@@ -68,9 +68,18 @@ HRESULT DependencyDetectProviderKeyBundleId( | |||
68 | DependencyDetect - Detects dependency information. | 68 | DependencyDetect - Detects dependency information. |
69 | 69 | ||
70 | *********************************************************************/ | 70 | *********************************************************************/ |
71 | HRESULT DependencyDetect( | 71 | HRESULT DependencyDetectBundle( |
72 | __in BURN_DEPENDENCIES* pDependencies, | 72 | __in BURN_DEPENDENCIES* pDependencies, |
73 | __in BURN_PACKAGES* pPackages, | 73 | __in BURN_REGISTRATION* pRegistration |
74 | ); | ||
75 | |||
76 | HRESULT DependencyDetectChainPackage( | ||
77 | __in BURN_PACKAGE* pPackage, | ||
78 | __in BURN_REGISTRATION* pRegistration | ||
79 | ); | ||
80 | |||
81 | HRESULT DependencyDetectRelatedBundle( | ||
82 | __in BURN_RELATED_BUNDLE* pRelatedBundle, | ||
74 | __in BURN_REGISTRATION* pRegistration | 83 | __in BURN_REGISTRATION* pRegistration |
75 | ); | 84 | ); |
76 | 85 | ||
diff --git a/src/burn/engine/exeengine.cpp b/src/burn/engine/exeengine.cpp index 45349ed0..27844c69 100644 --- a/src/burn/engine/exeengine.cpp +++ b/src/burn/engine/exeengine.cpp | |||
@@ -115,6 +115,7 @@ extern "C" void ExeEngineCommandLineArgumentUninitialize( | |||
115 | 115 | ||
116 | extern "C" HRESULT ExeEngineDetectPackage( | 116 | extern "C" HRESULT ExeEngineDetectPackage( |
117 | __in BURN_PACKAGE* pPackage, | 117 | __in BURN_PACKAGE* pPackage, |
118 | __in BURN_REGISTRATION* pRegistration, | ||
118 | __in BURN_VARIABLES* pVariables | 119 | __in BURN_VARIABLES* pVariables |
119 | ) | 120 | ) |
120 | { | 121 | { |
@@ -136,6 +137,9 @@ extern "C" HRESULT ExeEngineDetectPackage( | |||
136 | pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT; | 137 | pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT; |
137 | } | 138 | } |
138 | 139 | ||
140 | hr = DependencyDetectChainPackage(pPackage, pRegistration); | ||
141 | ExitOnFailure(hr, "Failed to detect dependencies for EXE package."); | ||
142 | |||
139 | LExit: | 143 | LExit: |
140 | return hr; | 144 | return hr; |
141 | } | 145 | } |
diff --git a/src/burn/engine/exeengine.h b/src/burn/engine/exeengine.h index bd5d7ea9..743621b7 100644 --- a/src/burn/engine/exeengine.h +++ b/src/burn/engine/exeengine.h | |||
@@ -21,6 +21,7 @@ void ExeEngineCommandLineArgumentUninitialize( | |||
21 | ); | 21 | ); |
22 | HRESULT ExeEngineDetectPackage( | 22 | HRESULT ExeEngineDetectPackage( |
23 | __in BURN_PACKAGE* pPackage, | 23 | __in BURN_PACKAGE* pPackage, |
24 | __in BURN_REGISTRATION* pRegistration, | ||
24 | __in BURN_VARIABLES* pVariables | 25 | __in BURN_VARIABLES* pVariables |
25 | ); | 26 | ); |
26 | HRESULT ExeEnginePlanCalculatePackage( | 27 | HRESULT ExeEnginePlanCalculatePackage( |
diff --git a/src/burn/engine/msiengine.cpp b/src/burn/engine/msiengine.cpp index adc266f1..87ae77e9 100644 --- a/src/burn/engine/msiengine.cpp +++ b/src/burn/engine/msiengine.cpp | |||
@@ -432,6 +432,7 @@ LExit: | |||
432 | 432 | ||
433 | extern "C" HRESULT MsiEngineDetectPackage( | 433 | extern "C" HRESULT MsiEngineDetectPackage( |
434 | __in BURN_PACKAGE* pPackage, | 434 | __in BURN_PACKAGE* pPackage, |
435 | __in BURN_REGISTRATION* pRegistration, | ||
435 | __in BURN_USER_EXPERIENCE* pUserExperience | 436 | __in BURN_USER_EXPERIENCE* pUserExperience |
436 | ) | 437 | ) |
437 | { | 438 | { |
@@ -704,6 +705,9 @@ extern "C" HRESULT MsiEngineDetectPackage( | |||
704 | pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT; | 705 | pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT; |
705 | } | 706 | } |
706 | 707 | ||
708 | hr = DependencyDetectChainPackage(pPackage, pRegistration); | ||
709 | ExitOnFailure(hr, "Failed to detect dependencies for MSI package."); | ||
710 | |||
707 | LExit: | 711 | LExit: |
708 | ReleaseStr(sczInstalledLanguage); | 712 | ReleaseStr(sczInstalledLanguage); |
709 | ReleaseStr(sczInstalledVersion); | 713 | ReleaseStr(sczInstalledVersion); |
diff --git a/src/burn/engine/msiengine.h b/src/burn/engine/msiengine.h index 113bf438..fbb251e0 100644 --- a/src/burn/engine/msiengine.h +++ b/src/burn/engine/msiengine.h | |||
@@ -32,6 +32,7 @@ HRESULT MsiEngineDetectInitialize( | |||
32 | ); | 32 | ); |
33 | HRESULT MsiEngineDetectPackage( | 33 | HRESULT MsiEngineDetectPackage( |
34 | __in BURN_PACKAGE* pPackage, | 34 | __in BURN_PACKAGE* pPackage, |
35 | __in BURN_REGISTRATION* pRegistration, | ||
35 | __in BURN_USER_EXPERIENCE* pUserExperience | 36 | __in BURN_USER_EXPERIENCE* pUserExperience |
36 | ); | 37 | ); |
37 | HRESULT MsiEnginePlanInitializePackage( | 38 | HRESULT MsiEnginePlanInitializePackage( |
diff --git a/src/burn/engine/mspengine.cpp b/src/burn/engine/mspengine.cpp index a88d0cb2..85eb1536 100644 --- a/src/burn/engine/mspengine.cpp +++ b/src/burn/engine/mspengine.cpp | |||
@@ -250,6 +250,7 @@ LExit: | |||
250 | 250 | ||
251 | extern "C" HRESULT MspEngineDetectPackage( | 251 | extern "C" HRESULT MspEngineDetectPackage( |
252 | __in BURN_PACKAGE* pPackage, | 252 | __in BURN_PACKAGE* pPackage, |
253 | __in BURN_REGISTRATION* pRegistration, | ||
253 | __in BURN_USER_EXPERIENCE* pUserExperience | 254 | __in BURN_USER_EXPERIENCE* pUserExperience |
254 | ) | 255 | ) |
255 | { | 256 | { |
@@ -328,6 +329,9 @@ extern "C" HRESULT MspEngineDetectPackage( | |||
328 | } | 329 | } |
329 | } | 330 | } |
330 | 331 | ||
332 | hr = DependencyDetectChainPackage(pPackage, pRegistration); | ||
333 | ExitOnFailure(hr, "Failed to detect dependencies for MSP package."); | ||
334 | |||
331 | LExit: | 335 | LExit: |
332 | ReleaseStr(sczState); | 336 | ReleaseStr(sczState); |
333 | 337 | ||
diff --git a/src/burn/engine/mspengine.h b/src/burn/engine/mspengine.h index d17d731d..065902f4 100644 --- a/src/burn/engine/mspengine.h +++ b/src/burn/engine/mspengine.h | |||
@@ -41,6 +41,7 @@ HRESULT MspEngineAddMissingSlipstreamTarget( | |||
41 | ); | 41 | ); |
42 | HRESULT MspEngineDetectPackage( | 42 | HRESULT MspEngineDetectPackage( |
43 | __in BURN_PACKAGE* pPackage, | 43 | __in BURN_PACKAGE* pPackage, |
44 | __in BURN_REGISTRATION* pRegistration, | ||
44 | __in BURN_USER_EXPERIENCE* pUserExperience | 45 | __in BURN_USER_EXPERIENCE* pUserExperience |
45 | ); | 46 | ); |
46 | HRESULT MspEnginePlanInitializePackage( | 47 | HRESULT MspEnginePlanInitializePackage( |
diff --git a/src/burn/engine/msuengine.cpp b/src/burn/engine/msuengine.cpp index 693bb64b..4f5f2cd4 100644 --- a/src/burn/engine/msuengine.cpp +++ b/src/burn/engine/msuengine.cpp | |||
@@ -53,6 +53,7 @@ extern "C" void MsuEnginePackageUninitialize( | |||
53 | 53 | ||
54 | extern "C" HRESULT MsuEngineDetectPackage( | 54 | extern "C" HRESULT MsuEngineDetectPackage( |
55 | __in BURN_PACKAGE* pPackage, | 55 | __in BURN_PACKAGE* pPackage, |
56 | __in BURN_REGISTRATION* pRegistration, | ||
56 | __in BURN_VARIABLES* pVariables | 57 | __in BURN_VARIABLES* pVariables |
57 | ) | 58 | ) |
58 | { | 59 | { |
@@ -74,6 +75,9 @@ extern "C" HRESULT MsuEngineDetectPackage( | |||
74 | pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT; | 75 | pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT; |
75 | } | 76 | } |
76 | 77 | ||
78 | hr = DependencyDetectChainPackage(pPackage, pRegistration); | ||
79 | ExitOnFailure(hr, "Failed to detect dependencies for MSU package."); | ||
80 | |||
77 | LExit: | 81 | LExit: |
78 | return hr; | 82 | return hr; |
79 | } | 83 | } |
diff --git a/src/burn/engine/msuengine.h b/src/burn/engine/msuengine.h index 0d2563e2..964f6744 100644 --- a/src/burn/engine/msuengine.h +++ b/src/burn/engine/msuengine.h | |||
@@ -18,6 +18,7 @@ void MsuEnginePackageUninitialize( | |||
18 | ); | 18 | ); |
19 | HRESULT MsuEngineDetectPackage( | 19 | HRESULT MsuEngineDetectPackage( |
20 | __in BURN_PACKAGE* pPackage, | 20 | __in BURN_PACKAGE* pPackage, |
21 | __in BURN_REGISTRATION* pRegistration, | ||
21 | __in BURN_VARIABLES* pVariables | 22 | __in BURN_VARIABLES* pVariables |
22 | ); | 23 | ); |
23 | HRESULT MsuEnginePlanCalculatePackage( | 24 | HRESULT MsuEnginePlanCalculatePackage( |
diff --git a/src/burn/engine/relatedbundle.cpp b/src/burn/engine/relatedbundle.cpp index 619fa8dd..3e0bc799 100644 --- a/src/burn/engine/relatedbundle.cpp +++ b/src/burn/engine/relatedbundle.cpp | |||
@@ -244,6 +244,9 @@ static HRESULT LoadIfRelatedBundle( | |||
244 | hr = LoadRelatedBundleFromKey(sczRelatedBundleId, hkBundleId, fPerMachine, relationType, pRelatedBundle); | 244 | hr = LoadRelatedBundleFromKey(sczRelatedBundleId, hkBundleId, fPerMachine, relationType, pRelatedBundle); |
245 | ExitOnFailure(hr, "Failed to initialize package from related bundle id: %ls", sczRelatedBundleId); | 245 | ExitOnFailure(hr, "Failed to initialize package from related bundle id: %ls", sczRelatedBundleId); |
246 | 246 | ||
247 | hr = DependencyDetectRelatedBundle(pRelatedBundle, pRegistration); | ||
248 | ExitOnFailure(hr, "Failed to detect dependencies for related bundle."); | ||
249 | |||
247 | ++pRelatedBundles->cRelatedBundles; | 250 | ++pRelatedBundles->cRelatedBundles; |
248 | } | 251 | } |
249 | 252 | ||
diff --git a/src/libs/dutil/WixToolset.DUtil/deputil.cpp b/src/libs/dutil/WixToolset.DUtil/deputil.cpp index 754365e9..1a480263 100644 --- a/src/libs/dutil/WixToolset.DUtil/deputil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/deputil.cpp | |||
@@ -246,7 +246,7 @@ DAPI_(HRESULT) DepCheckDependents( | |||
246 | __in HKEY hkHive, | 246 | __in HKEY hkHive, |
247 | __in_z LPCWSTR wzProviderKey, | 247 | __in_z LPCWSTR wzProviderKey, |
248 | __reserved int /*iAttributes*/, | 248 | __reserved int /*iAttributes*/, |
249 | __in C_STRINGDICT_HANDLE sdIgnoredDependents, | 249 | __in_opt C_STRINGDICT_HANDLE sdIgnoredDependents, |
250 | __deref_inout_ecount_opt(*pcDependents) DEPENDENCY** prgDependents, | 250 | __deref_inout_ecount_opt(*pcDependents) DEPENDENCY** prgDependents, |
251 | __inout LPUINT pcDependents | 251 | __inout LPUINT pcDependents |
252 | ) | 252 | ) |
@@ -257,6 +257,7 @@ DAPI_(HRESULT) DepCheckDependents( | |||
257 | HKEY hkDependentsKey = NULL; | 257 | HKEY hkDependentsKey = NULL; |
258 | LPWSTR sczDependentKey = NULL; | 258 | LPWSTR sczDependentKey = NULL; |
259 | LPWSTR sczDependentName = NULL; | 259 | LPWSTR sczDependentName = NULL; |
260 | BOOL fIgnore = FALSE; | ||
260 | 261 | ||
261 | // Format the provider dependency registry key. | 262 | // Format the provider dependency registry key. |
262 | hr = AllocDependencyKeyName(wzProviderKey, &sczKey); | 263 | hr = AllocDependencyKeyName(wzProviderKey, &sczKey); |
@@ -280,6 +281,8 @@ DAPI_(HRESULT) DepCheckDependents( | |||
280 | // Now enumerate the dependent keys. If they are not defined in the ignored list, add them to the array. | 281 | // Now enumerate the dependent keys. If they are not defined in the ignored list, add them to the array. |
281 | for (DWORD dwIndex = 0; ; ++dwIndex) | 282 | for (DWORD dwIndex = 0; ; ++dwIndex) |
282 | { | 283 | { |
284 | fIgnore = FALSE; | ||
285 | |||
283 | hr = RegKeyEnum(hkDependentsKey, dwIndex, &sczDependentKey); | 286 | hr = RegKeyEnum(hkDependentsKey, dwIndex, &sczDependentKey); |
284 | if (E_NOMOREITEMS != hr) | 287 | if (E_NOMOREITEMS != hr) |
285 | { | 288 | { |
@@ -292,12 +295,18 @@ DAPI_(HRESULT) DepCheckDependents( | |||
292 | } | 295 | } |
293 | 296 | ||
294 | // If the key isn't ignored, add it to the dependent array. | 297 | // If the key isn't ignored, add it to the dependent array. |
295 | hr = DictKeyExists(sdIgnoredDependents, sczDependentKey); | 298 | if (sdIgnoredDependents) |
296 | if (E_NOTFOUND != hr) | ||
297 | { | 299 | { |
298 | DepExitOnFailure(hr, "Failed to check the dictionary of ignored dependents."); | 300 | hr = DictKeyExists(sdIgnoredDependents, sczDependentKey); |
301 | if (E_NOTFOUND != hr) | ||
302 | { | ||
303 | DepExitOnFailure(hr, "Failed to check the dictionary of ignored dependents."); | ||
304 | |||
305 | fIgnore = TRUE; | ||
306 | } | ||
299 | } | 307 | } |
300 | else | 308 | |
309 | if (!fIgnore) | ||
301 | { | 310 | { |
302 | // Get the name of the dependent from the key. | 311 | // Get the name of the dependent from the key. |
303 | hr = GetDependencyNameFromKey(hkHive, sczDependentKey, &sczDependentName); | 312 | hr = GetDependencyNameFromKey(hkHive, sczDependentKey, &sczDependentName); |
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/deputil.h b/src/libs/dutil/WixToolset.DUtil/inc/deputil.h index bfe235f3..96f353f6 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/deputil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/deputil.h | |||
@@ -56,7 +56,7 @@ DAPI_(HRESULT) DepCheckDependents( | |||
56 | __in HKEY hkHive, | 56 | __in HKEY hkHive, |
57 | __in_z LPCWSTR wzProviderKey, | 57 | __in_z LPCWSTR wzProviderKey, |
58 | __reserved int iAttributes, | 58 | __reserved int iAttributes, |
59 | __in C_STRINGDICT_HANDLE sdIgnoredDependents, | 59 | __in_opt C_STRINGDICT_HANDLE sdIgnoredDependents, |
60 | __deref_inout_ecount_opt(*pcDependents) DEPENDENCY** prgDependents, | 60 | __deref_inout_ecount_opt(*pcDependents) DEPENDENCY** prgDependents, |
61 | __inout LPUINT pcDependents | 61 | __inout LPUINT pcDependents |
62 | ); | 62 | ); |