aboutsummaryrefslogtreecommitdiff
path: root/src/engine/apply.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/apply.cpp')
-rw-r--r--src/engine/apply.cpp82
1 files changed, 53 insertions, 29 deletions
diff --git a/src/engine/apply.cpp b/src/engine/apply.cpp
index 1bc01d44..9cba0483 100644
--- a/src/engine/apply.cpp
+++ b/src/engine/apply.cpp
@@ -1390,6 +1390,7 @@ static HRESULT AcquireContainerOrPayload(
1390 LPCWSTR wzRelativePath = pContainer ? pContainer->sczFilePath : pPayload->sczFilePath; 1390 LPCWSTR wzRelativePath = pContainer ? pContainer->sczFilePath : pPayload->sczFilePath;
1391 DWORD dwChosenSearchPath = 0; 1391 DWORD dwChosenSearchPath = 0;
1392 BOOTSTRAPPER_CACHE_OPERATION cacheOperation = BOOTSTRAPPER_CACHE_OPERATION_NONE; 1392 BOOTSTRAPPER_CACHE_OPERATION cacheOperation = BOOTSTRAPPER_CACHE_OPERATION_NONE;
1393 BOOTSTRAPPER_CACHE_RESOLVE_OPERATION resolveOperation = BOOTSTRAPPER_CACHE_RESOLVE_NONE;
1393 LPWSTR* pwzDownloadUrl = pContainer ? &pContainer->downloadSource.sczUrl : &pPayload->downloadSource.sczUrl; 1394 LPWSTR* pwzDownloadUrl = pContainer ? &pContainer->downloadSource.sczUrl : &pPayload->downloadSource.sczUrl;
1394 LPWSTR* pwzSourcePath = pContainer ? &pContainer->sczSourcePath : &pPayload->sczSourcePath; 1395 LPWSTR* pwzSourcePath = pContainer ? &pContainer->sczSourcePath : &pPayload->sczSourcePath;
1395 BOOL fFoundLocal = FALSE; 1396 BOOL fFoundLocal = FALSE;
@@ -1405,47 +1406,70 @@ static HRESULT AcquireContainerOrPayload(
1405 if (BOOTSTRAPPER_CACHE_OPERATION_DOWNLOAD != cacheOperation && 1406 if (BOOTSTRAPPER_CACHE_OPERATION_DOWNLOAD != cacheOperation &&
1406 BOOTSTRAPPER_CACHE_OPERATION_EXTRACT != cacheOperation) 1407 BOOTSTRAPPER_CACHE_OPERATION_EXTRACT != cacheOperation)
1407 { 1408 {
1408 hr = CacheGetLocalSourcePaths(wzRelativePath, *pwzSourcePath, wzDestinationPath, pContext->wzLayoutDirectory, pContext->pVariables, &pContext->rgSearchPaths, &pContext->cSearchPaths); 1409 do
1409 ExitOnFailure(hr, "Failed to search local source.");
1410
1411 for (DWORD i = 0; i < pContext->cSearchPaths; ++i)
1412 { 1410 {
1413 // If the file exists locally, choose it. 1411 fFoundLocal = FALSE;
1414 if (FileExistsEx(pContext->rgSearchPaths[i], NULL)) 1412 resolveOperation = BOOTSTRAPPER_CACHE_RESOLVE_NONE;
1415 { 1413 dwChosenSearchPath = 0;
1416 dwChosenSearchPath = i;
1417 1414
1418 fFoundLocal = TRUE; 1415 hr = CacheGetLocalSourcePaths(wzRelativePath, *pwzSourcePath, wzDestinationPath, pContext->wzLayoutDirectory, pContext->pVariables, &pContext->rgSearchPaths, &pContext->cSearchPaths, &dwChosenSearchPath);
1419 break; 1416 ExitOnFailure(hr, "Failed to search local source.");
1420 }
1421 }
1422 1417
1423 if (BOOTSTRAPPER_CACHE_OPERATION_COPY == cacheOperation) 1418 for (DWORD i = 0; i < pContext->cSearchPaths; ++i)
1424 {
1425 if (!fFoundLocal)
1426 { 1419 {
1427 cacheOperation = BOOTSTRAPPER_CACHE_OPERATION_NONE; 1420 // If the file exists locally, choose it.
1421 if (FileExistsEx(pContext->rgSearchPaths[i], NULL))
1422 {
1423 dwChosenSearchPath = i;
1424
1425 fFoundLocal = TRUE;
1426 break;
1427 }
1428 } 1428 }
1429 } 1429
1430 else 1430 if (BOOTSTRAPPER_CACHE_OPERATION_COPY == cacheOperation)
1431 {
1432 if (fFoundLocal) // the file exists locally, so copy it.
1433 { 1431 {
1434 cacheOperation = BOOTSTRAPPER_CACHE_OPERATION_COPY; 1432 if (fFoundLocal)
1433 {
1434 resolveOperation = BOOTSTRAPPER_CACHE_RESOLVE_LOCAL;
1435 }
1435 } 1436 }
1436 else if (wzPayloadContainerId) 1437 else
1437 { 1438 {
1438 cacheOperation = BOOTSTRAPPER_CACHE_OPERATION_EXTRACT; 1439 if (fFoundLocal) // the file exists locally, so copy it.
1440 {
1441 resolveOperation = BOOTSTRAPPER_CACHE_RESOLVE_LOCAL;
1442 }
1443 else if (wzPayloadContainerId)
1444 {
1445 resolveOperation = BOOTSTRAPPER_CACHE_RESOLVE_CONTAINER;
1446 }
1447 else if (*pwzDownloadUrl && **pwzDownloadUrl)
1448 {
1449 resolveOperation = BOOTSTRAPPER_CACHE_RESOLVE_DOWNLOAD;
1450 }
1439 } 1451 }
1440 else if (*pwzDownloadUrl && **pwzDownloadUrl) 1452
1453 // Let the BA have a chance to override the source.
1454 hr = UserExperienceOnCacheAcquireResolving(pContext->pUX, wzPackageOrContainerId, wzPayloadId, pContext->rgSearchPaths, pContext->cSearchPaths, fFoundLocal, &dwChosenSearchPath, pwzDownloadUrl, wzPayloadContainerId, &resolveOperation);
1455 ExitOnRootFailure(hr, "BA aborted cache acquire resolving.");
1456
1457 switch (resolveOperation)
1441 { 1458 {
1459 case BOOTSTRAPPER_CACHE_RESOLVE_LOCAL:
1460 cacheOperation = BOOTSTRAPPER_CACHE_OPERATION_COPY;
1461 break;
1462 case BOOTSTRAPPER_CACHE_RESOLVE_DOWNLOAD:
1442 cacheOperation = BOOTSTRAPPER_CACHE_OPERATION_DOWNLOAD; 1463 cacheOperation = BOOTSTRAPPER_CACHE_OPERATION_DOWNLOAD;
1464 break;
1465 case BOOTSTRAPPER_CACHE_RESOLVE_CONTAINER:
1466 cacheOperation = BOOTSTRAPPER_CACHE_OPERATION_EXTRACT;
1467 break;
1468 case BOOTSTRAPPER_CACHE_RESOLVE_RETRY:
1469 pContext->cSearchPathsMax = max(pContext->cSearchPaths, pContext->cSearchPathsMax);
1470 break;
1443 } 1471 }
1444 } 1472 } while (BOOTSTRAPPER_CACHE_RESOLVE_RETRY == resolveOperation);
1445
1446 // Let the BA have a chance to override the action, but their chance to change the source is during begin or complete.
1447 hr = UserExperienceOnCacheAcquireResolving(pContext->pUX, wzPackageOrContainerId, wzPayloadId, pContext->rgSearchPaths, pContext->cSearchPaths, fFoundLocal, &dwChosenSearchPath, *pwzDownloadUrl, wzPayloadContainerId, &cacheOperation);
1448 ExitOnRootFailure(hr, "BA aborted cache acquire resolving.");
1449 } 1473 }
1450 1474
1451 switch (cacheOperation) 1475 switch (cacheOperation)