diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-04-16 13:53:26 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-04-19 23:12:55 -0500 |
commit | 26151ceeb5c57e3fd0bf73e9c13d8d72b41cce74 (patch) | |
tree | 1ed317a4af2b48f9b152fc6cb05e9070b7457056 | |
parent | cc240536956e3ef6981599dfff05aa5628e910ac (diff) | |
download | wix-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.cpp | 121 |
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) |