aboutsummaryrefslogtreecommitdiff
path: root/src/engine/msiengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/engine/msiengine.cpp56
1 files changed, 42 insertions, 14 deletions
diff --git a/src/engine/msiengine.cpp b/src/engine/msiengine.cpp
index 801bf9a8..ae105155 100644
--- a/src/engine/msiengine.cpp
+++ b/src/engine/msiengine.cpp
@@ -213,8 +213,8 @@ extern "C" HRESULT MsiEngineParsePackageFromXml(
213 213
214 if (cNodes) 214 if (cNodes)
215 { 215 {
216 pPackage->Msi.rgpSlipstreamMspPackages = reinterpret_cast<BURN_PACKAGE**>(MemAlloc(sizeof(BURN_PACKAGE*) * cNodes, TRUE)); 216 pPackage->Msi.rgSlipstreamMsps = reinterpret_cast<BURN_SLIPSTREAM_MSP*>(MemAlloc(sizeof(BURN_SLIPSTREAM_MSP) * cNodes, TRUE));
217 ExitOnNull(pPackage->Msi.rgpSlipstreamMspPackages, hr, E_OUTOFMEMORY, "Failed to allocate memory for slipstream MSP packages."); 217 ExitOnNull(pPackage->Msi.rgSlipstreamMsps, hr, E_OUTOFMEMORY, "Failed to allocate memory for slipstream MSP packages.");
218 218
219 pPackage->Msi.rgsczSlipstreamMspPackageIds = reinterpret_cast<LPWSTR*>(MemAlloc(sizeof(LPWSTR*) * cNodes, TRUE)); 219 pPackage->Msi.rgsczSlipstreamMspPackageIds = reinterpret_cast<LPWSTR*>(MemAlloc(sizeof(LPWSTR*) * cNodes, TRUE));
220 ExitOnNull(pPackage->Msi.rgsczSlipstreamMspPackageIds, hr, E_OUTOFMEMORY, "Failed to allocate memory for slipstream MSP ids."); 220 ExitOnNull(pPackage->Msi.rgsczSlipstreamMspPackageIds, hr, E_OUTOFMEMORY, "Failed to allocate memory for slipstream MSP ids.");
@@ -383,15 +383,52 @@ extern "C" void MsiEnginePackageUninitialize(
383 MemFree(pPackage->Msi.rgsczSlipstreamMspPackageIds); 383 MemFree(pPackage->Msi.rgsczSlipstreamMspPackageIds);
384 } 384 }
385 385
386 if (pPackage->Msi.rgpSlipstreamMspPackages) 386 if (pPackage->Msi.rgSlipstreamMsps)
387 { 387 {
388 MemFree(pPackage->Msi.rgpSlipstreamMspPackages); 388 MemFree(pPackage->Msi.rgSlipstreamMsps);
389 }
390
391 if (pPackage->Msi.rgChainedPatches)
392 {
393 MemFree(pPackage->Msi.rgChainedPatches);
389 } 394 }
390 395
391 // clear struct 396 // clear struct
392 memset(&pPackage->Msi, 0, sizeof(pPackage->Msi)); 397 memset(&pPackage->Msi, 0, sizeof(pPackage->Msi));
393} 398}
394 399
400extern "C" HRESULT MsiEngineDetectInitialize(
401 __in BURN_PACKAGES* pPackages
402 )
403{
404 AssertSz(pPackages->cPatchInfo, "MsiEngineDetectInitialize() should only be called if there are MSP packages.");
405
406 HRESULT hr = S_OK;
407
408 // Add target products for slipstream MSIs that weren't detected.
409 for (DWORD iPackage = 0; iPackage < pPackages->cPackages; ++iPackage)
410 {
411 BURN_PACKAGE* pMsiPackage = pPackages->rgPackages + iPackage;
412 if (BURN_PACKAGE_TYPE_MSI == pMsiPackage->type)
413 {
414 for (DWORD j = 0; j < pMsiPackage->Msi.cSlipstreamMspPackages; ++j)
415 {
416 BURN_SLIPSTREAM_MSP* pSlipstreamMsp = pMsiPackage->Msi.rgSlipstreamMsps + j;
417 Assert(pSlipstreamMsp->pMspPackage && BURN_PACKAGE_TYPE_MSP == pSlipstreamMsp->pMspPackage->type);
418
419 if (pSlipstreamMsp->pMspPackage && BURN_PACKAGE_INVALID_PATCH_INDEX == pSlipstreamMsp->dwMsiChainedPatchIndex)
420 {
421 hr = MspEngineAddMissingSlipstreamTarget(pMsiPackage, pSlipstreamMsp);
422 ExitOnFailure(hr, "Failed to add slipstreamed target product code to package: %ls", pSlipstreamMsp->pMspPackage->sczId);
423 }
424 }
425 }
426 }
427
428LExit:
429 return hr;
430}
431
395extern "C" HRESULT MsiEngineDetectPackage( 432extern "C" HRESULT MsiEngineDetectPackage(
396 __in BURN_PACKAGE* pPackage, 433 __in BURN_PACKAGE* pPackage,
397 __in BURN_USER_EXPERIENCE* pUserExperience 434 __in BURN_USER_EXPERIENCE* pUserExperience
@@ -971,15 +1008,6 @@ extern "C" HRESULT MsiEnginePlanAddPackage(
971 pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes; 1008 pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes;
972 } 1009 }
973 1010
974 // Update any slipstream patches' state.
975 for (DWORD i = 0; i < pPackage->Msi.cSlipstreamMspPackages; ++i)
976 {
977 BURN_PACKAGE* pMspPackage = pPackage->Msi.rgpSlipstreamMspPackages[i];
978 AssertSz(BURN_PACKAGE_TYPE_MSP == pMspPackage->type, "Only MSP packages can be slipstream patches.");
979
980 MspEngineSlipstreamUpdateState(pMspPackage, pPackage->execute, pPackage->rollback);
981 }
982
983LExit: 1011LExit:
984 ReleaseMem(rgFeatureActions); 1012 ReleaseMem(rgFeatureActions);
985 ReleaseMem(rgRollbackFeatureActions); 1013 ReleaseMem(rgRollbackFeatureActions);
@@ -1897,7 +1925,7 @@ static HRESULT ConcatPatchProperty(
1897 { 1925 {
1898 for (DWORD i = 0; i < pPackage->Msi.cSlipstreamMspPackages; ++i) 1926 for (DWORD i = 0; i < pPackage->Msi.cSlipstreamMspPackages; ++i)
1899 { 1927 {
1900 BURN_PACKAGE* pMspPackage = pPackage->Msi.rgpSlipstreamMspPackages[i]; 1928 BURN_PACKAGE* pMspPackage = pPackage->Msi.rgSlipstreamMsps[i].pMspPackage;
1901 AssertSz(BURN_PACKAGE_TYPE_MSP == pMspPackage->type, "Only MSP packages can be slipstream patches."); 1929 AssertSz(BURN_PACKAGE_TYPE_MSP == pMspPackage->type, "Only MSP packages can be slipstream patches.");
1902 1930
1903 BOOTSTRAPPER_ACTION_STATE patchExecuteAction = rgSlipstreamPatchActions[i]; 1931 BOOTSTRAPPER_ACTION_STATE patchExecuteAction = rgSlipstreamPatchActions[i];