From d7b0329e16ba9cae4a33970e26591ae5f1d98f0d Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 16 Apr 2021 10:47:54 -0500 Subject: Add OnCacheContainerOrPayloadVerify* for a file already in the cache. --- .../inc/BootstrapperApplication.h | 45 +++++++++++ src/engine/apply.cpp | 85 ++++++++++++++++++--- src/engine/userexperience.cpp | 87 ++++++++++++++++++++++ src/engine/userexperience.h | 19 +++++ 4 files changed, 227 insertions(+), 9 deletions(-) diff --git a/src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h b/src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h index 9fb6ffff..edb981a9 100644 --- a/src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h +++ b/src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h @@ -150,6 +150,9 @@ enum BOOTSTRAPPER_APPLICATION_MESSAGE BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDPACKAGE, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANFORWARDCOMPATIBLEBUNDLE, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYPROGRESS, + BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYBEGIN, + BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE, + BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS, }; enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION @@ -399,6 +402,48 @@ struct BA_ONCACHECOMPLETE_RESULTS DWORD cbSize; }; +struct BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_ARGS +{ + DWORD cbSize; + LPCWSTR wzPackageOrContainerId; + LPCWSTR wzPayloadId; +}; + +struct BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_RESULTS +{ + DWORD cbSize; + BOOL fCancel; +}; + +struct BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_ARGS +{ + DWORD cbSize; + LPCWSTR wzPackageOrContainerId; + LPCWSTR wzPayloadId; + HRESULT hrStatus; +}; + +struct BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_RESULTS +{ + DWORD cbSize; +}; + +struct BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_ARGS +{ + DWORD cbSize; + LPCWSTR wzPackageOrContainerId; + LPCWSTR wzPayloadId; + DWORD64 dw64Progress; + DWORD64 dw64Total; + DWORD dwOverallPercentage; +}; + +struct BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_RESULTS +{ + DWORD cbSize; + BOOL fCancel; +}; + struct BA_ONCACHEPACKAGEBEGIN_ARGS { DWORD cbSize; diff --git a/src/engine/apply.cpp b/src/engine/apply.cpp index 5826f513..f40b3841 100644 --- a/src/engine/apply.cpp +++ b/src/engine/apply.cpp @@ -15,6 +15,7 @@ enum BURN_CACHE_PROGRESS_TYPE { BURN_CACHE_PROGRESS_TYPE_ACQUIRE, BURN_CACHE_PROGRESS_TYPE_VERIFY, + BURN_CACHE_PROGRESS_TYPE_CONTAINER_OR_PAYLOAD_VERIFY, }; // structs @@ -101,6 +102,12 @@ static HRESULT ApplyProcessPayload( __in_opt BURN_PACKAGE* pPackage, __in BURN_PAYLOAD* pPayload ); +static HRESULT ApplyCacheVerifyContainerOrPayload( + __in BURN_CACHE_CONTEXT* pContext, + __in_opt BURN_CONTAINER* pContainer, + __in_opt BURN_PACKAGE* pPackage, + __in_opt BURN_PAYLOAD* pPayload + ); static HRESULT ExtractContainer( __in BURN_CACHE_CONTEXT* pContext, __in BURN_CONTAINER* pContainer @@ -910,11 +917,9 @@ static HRESULT ApplyLayoutContainer( Assert(!pContainer->fAttached); - hr = CacheVerifyContainer(pContainer, pContext->wzLayoutDirectory); + hr = ApplyCacheVerifyContainerOrPayload(pContext, pContainer, NULL, NULL); if (SUCCEEDED(hr)) { - // TODO: send Acquire and Verify messages to BA? - pContext->qwSuccessfulCacheProgress += pContainer->qwFileSize * 2; ExitFunction(); } @@ -969,11 +974,9 @@ static HRESULT ApplyProcessPayload( ExitFunction(); } - hr = CacheVerifyPayload(pPayload, pContext->wzLayoutDirectory ? pContext->wzLayoutDirectory : pPackage->sczCacheFolder); + hr = ApplyCacheVerifyContainerOrPayload(pContext, NULL, pPackage, pPayload); if (SUCCEEDED(hr)) { - // TODO: send Acquire and Verify messages to BA? - pContext->qwSuccessfulCacheProgress += pPayload->qwFileSize * 2; ExitFunction(); } @@ -1012,6 +1015,54 @@ LExit: return hr; } +static HRESULT ApplyCacheVerifyContainerOrPayload( + __in BURN_CACHE_CONTEXT* pContext, + __in_opt BURN_CONTAINER* pContainer, + __in_opt BURN_PACKAGE* pPackage, + __in_opt BURN_PAYLOAD* pPayload + ) +{ + AssertSz(pContainer || pPayload, "Must provide a container or a payload."); + + HRESULT hr = S_OK; + BURN_CACHE_PROGRESS_CONTEXT progress = { }; + LPCWSTR wzPackageOrContainerId = pContainer ? pContainer->sczId : pPackage ? pPackage->sczId : NULL; + LPCWSTR wzPayloadId = pPayload ? pPayload->sczKey : NULL; + + progress.pCacheContext = pContext; + progress.pContainer = pContainer; + progress.pPackage = pPackage; + progress.pPayload = pPayload; + progress.type = BURN_CACHE_PROGRESS_TYPE_CONTAINER_OR_PAYLOAD_VERIFY; + + hr = UserExperienceOnCacheContainerOrPayloadVerifyBegin(pContext->pUX, wzPackageOrContainerId, wzPayloadId); + ExitOnRootFailure(hr, "BA aborted cache container or payload verify begin."); + + if (pContainer) + { + hr = CacheVerifyContainer(pContainer, pContext->wzLayoutDirectory); + } + else + { + hr = CacheVerifyPayload(pPayload, pContext->wzLayoutDirectory ? pContext->wzLayoutDirectory : pPackage->sczCacheFolder); + } + + // This was best effort to avoid acquiring the container or payload. + if (FAILED(hr)) + { + ExitFunction(); + } + + pContext->qwSuccessfulCacheProgress += pContainer ? pContainer->qwFileSize : pPayload->qwFileSize; + + hr = CompleteCacheProgress(&progress, pContainer ? pContainer->qwFileSize : pPayload->qwFileSize); + +LExit: + UserExperienceOnCacheContainerOrPayloadVerifyComplete(pContext->pUX, wzPackageOrContainerId, wzPayloadId, hr); + + return hr; +} + static HRESULT ExtractContainer( __in BURN_CACHE_CONTEXT* pContext, __in BURN_CONTAINER* pContainer @@ -1112,9 +1163,21 @@ static HRESULT LayoutBundle( if (CSTR_EQUAL == nEquivalentPaths && FileExistsEx(sczDestinationPath, NULL)) { - // TODO: send Acquire and Verify messages to BA? - pContext->qwSuccessfulCacheProgress += 2 * qwBundleSize; - ExitFunction1(hr = S_OK); + hr = UserExperienceOnCacheContainerOrPayloadVerifyBegin(pContext->pUX, NULL, NULL); + if (FAILED(hr)) + { + UserExperienceOnCacheContainerOrPayloadVerifyComplete(pContext->pUX, NULL, NULL, hr); + ExitOnRootFailure(hr, "BA aborted cache payload verify begin."); + } + + pContext->qwSuccessfulCacheProgress += qwBundleSize; + + progress.type = BURN_CACHE_PROGRESS_TYPE_CONTAINER_OR_PAYLOAD_VERIFY; + hr = CompleteCacheProgress(&progress, qwBundleSize); + + UserExperienceOnCacheContainerOrPayloadVerifyComplete(pContext->pUX, NULL, NULL, hr); + + ExitFunction(); } do @@ -1702,6 +1765,10 @@ static DWORD CALLBACK CacheProgressRoutine( hr = UserExperienceOnCacheVerifyProgress(pProgress->pCacheContext->pUX, wzPackageOrContainerId, wzPayloadId, TotalBytesTransferred.QuadPart, TotalFileSize.QuadPart, dwOverallPercentage); ExitOnRootFailure(hr, "BA aborted verify of %hs: %ls", pProgress->pContainer ? "container" : "payload", pProgress->pContainer ? wzPackageOrContainerId : wzPayloadId); break; + case BURN_CACHE_PROGRESS_TYPE_CONTAINER_OR_PAYLOAD_VERIFY: + hr = UserExperienceOnCacheContainerOrPayloadVerifyProgress(pProgress->pCacheContext->pUX, wzPackageOrContainerId, wzPayloadId, TotalBytesTransferred.QuadPart, TotalFileSize.QuadPart, dwOverallPercentage); + ExitOnRootFailure(hr, "BA aborted container or payload verify: %ls", wzPayloadId); + break; } LExit: diff --git a/src/engine/userexperience.cpp b/src/engine/userexperience.cpp index b42eb5a7..02c67fc5 100644 --- a/src/engine/userexperience.cpp +++ b/src/engine/userexperience.cpp @@ -610,6 +610,93 @@ LExit: return hr; } +EXTERN_C BAAPI UserExperienceOnCacheContainerOrPayloadVerifyBegin( + __in BURN_USER_EXPERIENCE* pUserExperience, + __in_z_opt LPCWSTR wzPackageOrContainerId, + __in_z_opt LPCWSTR wzPayloadId + ) +{ + HRESULT hr = S_OK; + BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_ARGS args = { }; + BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_RESULTS results = { }; + + args.cbSize = sizeof(args); + args.wzPackageOrContainerId = wzPackageOrContainerId; + args.wzPayloadId = wzPayloadId; + + results.cbSize = sizeof(results); + + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYBEGIN, &args, &results); + ExitOnFailure(hr, "BA OnCacheContainerOrPayloadVerifyBegin failed."); + + if (results.fCancel) + { + hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT); + } + +LExit: + return hr; +} + +EXTERN_C BAAPI UserExperienceOnCacheContainerOrPayloadVerifyComplete( + __in BURN_USER_EXPERIENCE* pUserExperience, + __in_z_opt LPCWSTR wzPackageOrContainerId, + __in_z_opt LPCWSTR wzPayloadId, + __in HRESULT hrStatus + ) +{ + HRESULT hr = S_OK; + BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_ARGS args = { }; + BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_RESULTS results = { }; + + args.cbSize = sizeof(args); + args.wzPackageOrContainerId = wzPackageOrContainerId; + args.wzPayloadId = wzPayloadId; + args.hrStatus = hrStatus; + + results.cbSize = sizeof(results); + + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE, &args, &results); + ExitOnFailure(hr, "BA OnCacheContainerOrPayloadVerifyComplete failed."); + +LExit: + return hr; +} + +EXTERN_C BAAPI UserExperienceOnCacheContainerOrPayloadVerifyProgress( + __in BURN_USER_EXPERIENCE* pUserExperience, + __in_z_opt LPCWSTR wzPackageOrContainerId, + __in_z_opt LPCWSTR wzPayloadId, + __in DWORD64 dw64Progress, + __in DWORD64 dw64Total, + __in DWORD dwOverallPercentage + ) +{ + HRESULT hr = S_OK; + BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_ARGS args = { }; + BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_RESULTS results = { }; + + args.cbSize = sizeof(args); + args.wzPackageOrContainerId = wzPackageOrContainerId; + args.wzPayloadId = wzPayloadId; + args.dw64Progress = dw64Progress; + args.dw64Total = dw64Total; + args.dwOverallPercentage = dwOverallPercentage; + + results.cbSize = sizeof(results); + + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS, &args, &results); + ExitOnFailure(hr, "BA OnCacheContainerOrPayloadVerifyProgress failed."); + + if (results.fCancel) + { + hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT); + } + +LExit: + return hr; +} + EXTERN_C BAAPI UserExperienceOnCachePackageBegin( __in BURN_USER_EXPERIENCE* pUserExperience, __in_z LPCWSTR wzPackageId, diff --git a/src/engine/userexperience.h b/src/engine/userexperience.h index e09c9ec1..d3dfb810 100644 --- a/src/engine/userexperience.h +++ b/src/engine/userexperience.h @@ -165,6 +165,25 @@ BAAPI UserExperienceOnCacheComplete( __in BURN_USER_EXPERIENCE* pUserExperience, __in HRESULT hrStatus ); +BAAPI UserExperienceOnCacheContainerOrPayloadVerifyBegin( + __in BURN_USER_EXPERIENCE* pUserExperience, + __in_z_opt LPCWSTR wzPackageOrContainerId, + __in_z_opt LPCWSTR wzPayloadId + ); +BAAPI UserExperienceOnCacheContainerOrPayloadVerifyComplete( + __in BURN_USER_EXPERIENCE* pUserExperience, + __in_z_opt LPCWSTR wzPackageOrContainerId, + __in_z_opt LPCWSTR wzPayloadId, + __in HRESULT hrStatus + ); +BAAPI UserExperienceOnCacheContainerOrPayloadVerifyProgress( + __in BURN_USER_EXPERIENCE* pUserExperience, + __in_z_opt LPCWSTR wzPackageOrContainerId, + __in_z_opt LPCWSTR wzPayloadId, + __in DWORD64 dw64Progress, + __in DWORD64 dw64Total, + __in DWORD dwOverallPercentage + ); BAAPI UserExperienceOnCachePackageBegin( __in BURN_USER_EXPERIENCE* pUserExperience, __in_z LPCWSTR wzPackageId, -- cgit v1.2.3-55-g6feb