aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-04-16 13:53:26 -0500
committerSean Hall <r.sean.hall@gmail.com>2021-04-19 23:12:55 -0500
commit26151ceeb5c57e3fd0bf73e9c13d8d72b41cce74 (patch)
tree1ed317a4af2b48f9b152fc6cb05e9070b7457056
parentcc240536956e3ef6981599dfff05aa5628e910ac (diff)
downloadwix-26151ceeb5c57e3fd0bf73e9c13d8d72b41cce74.tar.gz
wix-26151ceeb5c57e3fd0bf73e9c13d8d72b41cce74.tar.bz2
wix-26151ceeb5c57e3fd0bf73e9c13d8d72b41cce74.zip
Make sure OnCache*Begin events always pair with their complete event.
-rw-r--r--src/engine/apply.cpp121
1 files changed, 85 insertions, 36 deletions
diff --git a/src/engine/apply.cpp b/src/engine/apply.cpp
index cf904405..304c88f4 100644
--- a/src/engine/apply.cpp
+++ b/src/engine/apply.cpp
@@ -802,26 +802,34 @@ static HRESULT ApplyCachePackage(
802 ) 802 )
803{ 803{
804 HRESULT hr = S_OK; 804 HRESULT hr = S_OK;
805 BOOL fCanceledBegin = FALSE;
805 BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION cachePackageCompleteAction = BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_NONE; 806 BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION cachePackageCompleteAction = BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_NONE;
806 807
807 for (;;) 808 for (;;)
808 { 809 {
809 hr = UserExperienceOnCachePackageBegin(pContext->pUX, pPackage->sczId, pPackage->payloads.cItems, pPackage->payloads.qwTotalSize); 810 fCanceledBegin = FALSE;
810 LogExitOnFailure(hr, MSG_USER_CANCELED, "Cancel during cache: %ls: %ls", L"begin cache package", pPackage->sczId);
811 811
812 for (DWORD i = 0; i < pPackage->payloads.cItems; ++i) 812 hr = UserExperienceOnCachePackageBegin(pContext->pUX, pPackage->sczId, pPackage->payloads.cItems, pPackage->payloads.qwTotalSize);
813 if (FAILED(hr))
813 { 814 {
814 BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem = pPackage->payloads.rgItems + i; 815 fCanceledBegin = TRUE;
815 816 }
816 hr = ApplyProcessPayload(pContext, pPackage, pPayloadGroupItem); 817 else
817 if (FAILED(hr)) 818 {
819 for (DWORD i = 0; i < pPackage->payloads.cItems; ++i)
818 { 820 {
819 break; 821 BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem = pPackage->payloads.rgItems + i;
822
823 hr = ApplyProcessPayload(pContext, pPackage, pPayloadGroupItem);
824 if (FAILED(hr))
825 {
826 break;
827 }
820 } 828 }
821 } 829 }
822 830
823 pPackage->hrCacheResult = hr; 831 pPackage->hrCacheResult = hr;
824 cachePackageCompleteAction = SUCCEEDED(hr) || pPackage->fVital ? BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_NONE : BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_IGNORE; 832 cachePackageCompleteAction = SUCCEEDED(hr) || pPackage->fVital || fCanceledBegin ? BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_NONE : BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_IGNORE;
825 UserExperienceOnCachePackageComplete(pContext->pUX, pPackage->sczId, hr, &cachePackageCompleteAction); 833 UserExperienceOnCachePackageComplete(pContext->pUX, pPackage->sczId, hr, &cachePackageCompleteAction);
826 834
827 if (SUCCEEDED(hr)) 835 if (SUCCEEDED(hr))
@@ -856,6 +864,10 @@ static HRESULT ApplyCachePackage(
856 LogId(REPORT_STANDARD, MSG_APPLY_CONTINUING_NONVITAL_PACKAGE, pPackage->sczId, hr); 864 LogId(REPORT_STANDARD, MSG_APPLY_CONTINUING_NONVITAL_PACKAGE, pPackage->sczId, hr);
857 hr = S_OK; 865 hr = S_OK;
858 } 866 }
867 else if (fCanceledBegin)
868 {
869 LogExitOnFailure(hr, MSG_USER_CANCELED, "Cancel during cache: %ls: %ls", L"begin cache package", pPackage->sczId);
870 }
859 871
860 break; 872 break;
861 } 873 }
@@ -1208,6 +1220,7 @@ static HRESULT LayoutBundle(
1208 BURN_CACHE_PROGRESS_CONTEXT progress = { }; 1220 BURN_CACHE_PROGRESS_CONTEXT progress = { };
1209 BOOL fRetry = FALSE; 1221 BOOL fRetry = FALSE;
1210 BOOL fRetryAcquire = FALSE; 1222 BOOL fRetryAcquire = FALSE;
1223 BOOL fCanceledBegin = FALSE;
1211 1224
1212 progress.pCacheContext = pContext; 1225 progress.pCacheContext = pContext;
1213 1226
@@ -1259,17 +1272,24 @@ static HRESULT LayoutBundle(
1259 { 1272 {
1260 fRetryAcquire = FALSE; 1273 fRetryAcquire = FALSE;
1261 progress.fCancel = FALSE; 1274 progress.fCancel = FALSE;
1275 fCanceledBegin = FALSE;
1262 1276
1263 hr = UserExperienceOnCacheAcquireBegin(pContext->pUX, NULL, NULL, &sczBundlePath, &sczBundleDownloadUrl, NULL, &cacheOperation); 1277 hr = UserExperienceOnCacheAcquireBegin(pContext->pUX, NULL, NULL, &sczBundlePath, &sczBundleDownloadUrl, NULL, &cacheOperation);
1264 ExitOnRootFailure(hr, "BA aborted cache acquire begin.");
1265 1278
1266 hr = CopyPayload(&progress, pContext->hSourceEngineFile, sczBundlePath, wzUnverifiedPath); 1279 if (FAILED(hr))
1267 // Error handling happens after sending complete message to BA.
1268
1269 // If succeeded, send 100% complete here to make sure progress was sent to the BA.
1270 if (SUCCEEDED(hr))
1271 { 1280 {
1272 hr = CompleteCacheProgress(&progress, qwBundleSize); 1281 fCanceledBegin = TRUE;
1282 }
1283 else
1284 {
1285 hr = CopyPayload(&progress, pContext->hSourceEngineFile, sczBundlePath, wzUnverifiedPath);
1286 // Error handling happens after sending complete message to BA.
1287
1288 // If succeeded, send 100% complete here to make sure progress was sent to the BA.
1289 if (SUCCEEDED(hr))
1290 {
1291 hr = CompleteCacheProgress(&progress, qwBundleSize);
1292 }
1273 } 1293 }
1274 1294
1275 UserExperienceOnCacheAcquireComplete(pContext->pUX, NULL, NULL, hr, &fRetryAcquire); 1295 UserExperienceOnCacheAcquireComplete(pContext->pUX, NULL, NULL, hr, &fRetryAcquire);
@@ -1277,6 +1297,10 @@ static HRESULT LayoutBundle(
1277 { 1297 {
1278 continue; 1298 continue;
1279 } 1299 }
1300 else if (fCanceledBegin)
1301 {
1302 ExitOnRootFailure(hr, "BA aborted cache acquire begin.");
1303 }
1280 1304
1281 ExitOnFailure(hr, "Failed to copy bundle from: '%ls' to: '%ls'", sczBundlePath, wzUnverifiedPath); 1305 ExitOnFailure(hr, "Failed to copy bundle from: '%ls' to: '%ls'", sczBundlePath, wzUnverifiedPath);
1282 break; 1306 break;
@@ -1286,14 +1310,22 @@ static HRESULT LayoutBundle(
1286 1310
1287 do 1311 do
1288 { 1312 {
1289 hr = UserExperienceOnCacheVerifyBegin(pContext->pUX, NULL, NULL); 1313 fCanceledBegin = FALSE;
1290 ExitOnRootFailure(hr, "BA aborted cache verify begin.");
1291 1314
1292 hr = CacheLayoutBundle(wzExecutableName, pContext->wzLayoutDirectory, wzUnverifiedPath); 1315 hr = UserExperienceOnCacheVerifyBegin(pContext->pUX, NULL, NULL);
1293 1316
1294 if (SUCCEEDED(hr)) 1317 if (FAILED(hr))
1295 { 1318 {
1296 hr = CompleteCacheProgress(&progress, qwBundleSize); 1319 fCanceledBegin = TRUE;
1320 }
1321 else
1322 {
1323 hr = CacheLayoutBundle(wzExecutableName, pContext->wzLayoutDirectory, wzUnverifiedPath);
1324
1325 if (SUCCEEDED(hr))
1326 {
1327 hr = CompleteCacheProgress(&progress, qwBundleSize);
1328 }
1297 } 1329 }
1298 1330
1299 BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION action = BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_NONE; 1331 BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION action = BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_NONE;
@@ -1306,6 +1338,10 @@ static HRESULT LayoutBundle(
1306 { 1338 {
1307 fRetry = TRUE; // go back and retry acquire. 1339 fRetry = TRUE; // go back and retry acquire.
1308 } 1340 }
1341 else if (fCanceledBegin)
1342 {
1343 ExitOnRootFailure(hr, "BA aborted cache verify begin.");
1344 }
1309 } while (S_FALSE == hr); 1345 } while (S_FALSE == hr);
1310 1346
1311 if (fRetry) 1347 if (fRetry)
@@ -1500,6 +1536,7 @@ static HRESULT LayoutOrCacheContainerOrPayload(
1500 BOOL fCanAffectRegistration = FALSE; 1536 BOOL fCanAffectRegistration = FALSE;
1501 BURN_CACHE_PROGRESS_CONTEXT progress = { }; 1537 BURN_CACHE_PROGRESS_CONTEXT progress = { };
1502 BOOL fMove = !pPayload || 1 == pPayload->cRemainingInstances; 1538 BOOL fMove = !pPayload || 1 == pPayload->cRemainingInstances;
1539 BOOL fCanceledBegin = FALSE;
1503 1540
1504 if (pContainer) 1541 if (pContainer)
1505 { 1542 {
@@ -1529,27 +1566,35 @@ static HRESULT LayoutOrCacheContainerOrPayload(
1529 1566
1530 do 1567 do
1531 { 1568 {
1569 fCanceledBegin = FALSE;
1570
1532 hr = UserExperienceOnCacheVerifyBegin(pContext->pUX, wzPackageOrContainerId, wzPayloadId); 1571 hr = UserExperienceOnCacheVerifyBegin(pContext->pUX, wzPackageOrContainerId, wzPayloadId);
1533 ExitOnRootFailure(hr, "BA aborted cache verify begin.");
1534 1572
1535 if (pContext->wzLayoutDirectory) // layout the container or payload. 1573 if (FAILED(hr))
1574 {
1575 fCanceledBegin = TRUE;
1576 }
1577 else
1536 { 1578 {
1537 if (pContainer) 1579 if (pContext->wzLayoutDirectory) // layout the container or payload.
1538 { 1580 {
1539 hr = CacheLayoutContainer(pContainer, pContext->wzLayoutDirectory, wzUnverifiedPath, fMove); 1581 if (pContainer)
1582 {
1583 hr = CacheLayoutContainer(pContainer, pContext->wzLayoutDirectory, wzUnverifiedPath, fMove);
1584 }
1585 else
1586 {
1587 hr = CacheLayoutPayload(pPayload, pContext->wzLayoutDirectory, wzUnverifiedPath, fMove);
1588 }
1540 } 1589 }
1541 else 1590 else if (INVALID_HANDLE_VALUE != pContext->hPipe) // pass the decision off to the elevated process.
1542 { 1591 {
1543 hr = CacheLayoutPayload(pPayload, pContext->wzLayoutDirectory, wzUnverifiedPath, fMove); 1592 hr = ElevationCacheCompletePayload(pContext->hPipe, pPackage, pPayload, wzUnverifiedPath, fMove);
1593 }
1594 else // complete the payload.
1595 {
1596 hr = CacheCompletePayload(pPackage->fPerMachine, pPayload, pPackage->sczCacheId, wzUnverifiedPath, fMove);
1544 } 1597 }
1545 }
1546 else if (INVALID_HANDLE_VALUE != pContext->hPipe) // pass the decision off to the elevated process.
1547 {
1548 hr = ElevationCacheCompletePayload(pContext->hPipe, pPackage, pPayload, wzUnverifiedPath, fMove);
1549 }
1550 else // complete the payload.
1551 {
1552 hr = CacheCompletePayload(pPackage->fPerMachine, pPayload, pPackage->sczCacheId, wzUnverifiedPath, fMove);
1553 } 1598 }
1554 1599
1555 if (SUCCEEDED(hr)) 1600 if (SUCCEEDED(hr))
@@ -1562,7 +1607,7 @@ static HRESULT LayoutOrCacheContainerOrPayload(
1562 pPackage->cacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_PRESENT; 1607 pPackage->cacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_PRESENT;
1563 } 1608 }
1564 1609
1565 BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION action = FAILED(hr) && cTryAgainAttempts < BURN_CACHE_MAX_RECOMMENDED_VERIFY_TRYAGAIN_ATTEMPTS ? BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_RETRYACQUISITION : BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_NONE; 1610 BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION action = FAILED(hr) && !fCanceledBegin && cTryAgainAttempts < BURN_CACHE_MAX_RECOMMENDED_VERIFY_TRYAGAIN_ATTEMPTS ? BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_RETRYACQUISITION : BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_NONE;
1566 UserExperienceOnCacheVerifyComplete(pContext->pUX, wzPackageOrContainerId, wzPayloadId, hr, &action); 1611 UserExperienceOnCacheVerifyComplete(pContext->pUX, wzPackageOrContainerId, wzPayloadId, hr, &action);
1567 if (BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_RETRYVERIFICATION == action) 1612 if (BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_RETRYVERIFICATION == action)
1568 { 1613 {
@@ -1572,6 +1617,10 @@ static HRESULT LayoutOrCacheContainerOrPayload(
1572 { 1617 {
1573 *pfRetry = TRUE; // go back and retry acquire. 1618 *pfRetry = TRUE; // go back and retry acquire.
1574 } 1619 }
1620 else if (fCanceledBegin)
1621 {
1622 ExitOnRootFailure(hr, "BA aborted cache verify begin.");
1623 }
1575 } while (S_FALSE == hr); 1624 } while (S_FALSE == hr);
1576 1625
1577 if (SUCCEEDED(hr) && pPayloadGroupItem) 1626 if (SUCCEEDED(hr) && pPayloadGroupItem)