@joebigelow / wix-1 / commits / d7b0329e

Add OnCacheContainerOrPayloadVerify* for a file already in the cache.

Sean Hall committed Apr 16, 2021 at 10:47 UTC d7b0329e16ba9cae4a33970e26591ae5f1d98f0d
4 files changed +227 -9
src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h
+45
@@ -150,6 +150,9 @@ enum BOOTSTRAPPER_APPLICATION_MESSAGE
150 BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDPACKAGE,
151 BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANFORWARDCOMPATIBLEBUNDLE,
152 BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYPROGRESS,
153 + BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYBEGIN,
154 + BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE,
155 + BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS,
156 };
157
158 enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION
@@ -399,6 +402,48 @@ struct BA_ONCACHECOMPLETE_RESULTS
402 DWORD cbSize;
403 };
404
405 +struct BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_ARGS
406 +{
407 + DWORD cbSize;
408 + LPCWSTR wzPackageOrContainerId;
409 + LPCWSTR wzPayloadId;
410 +};
411 +
412 +struct BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_RESULTS
413 +{
414 + DWORD cbSize;
415 + BOOL fCancel;
416 +};
417 +
418 +struct BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_ARGS
419 +{
420 + DWORD cbSize;
421 + LPCWSTR wzPackageOrContainerId;
422 + LPCWSTR wzPayloadId;
423 + HRESULT hrStatus;
424 +};
425 +
426 +struct BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_RESULTS
427 +{
428 + DWORD cbSize;
429 +};
430 +
431 +struct BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_ARGS
432 +{
433 + DWORD cbSize;
434 + LPCWSTR wzPackageOrContainerId;
435 + LPCWSTR wzPayloadId;
436 + DWORD64 dw64Progress;
437 + DWORD64 dw64Total;
438 + DWORD dwOverallPercentage;
439 +};
440 +
441 +struct BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_RESULTS
442 +{
443 + DWORD cbSize;
444 + BOOL fCancel;
445 +};
446 +
447 struct BA_ONCACHEPACKAGEBEGIN_ARGS
448 {
449 DWORD cbSize;
src/engine/apply.cpp
+76 -9
@@ -15,6 +15,7 @@ enum BURN_CACHE_PROGRESS_TYPE
15 {
16 BURN_CACHE_PROGRESS_TYPE_ACQUIRE,
17 BURN_CACHE_PROGRESS_TYPE_VERIFY,
18 + BURN_CACHE_PROGRESS_TYPE_CONTAINER_OR_PAYLOAD_VERIFY,
19 };
20
21 // structs
@@ -101,6 +102,12 @@ static HRESULT ApplyProcessPayload(
102 __in_opt BURN_PACKAGE* pPackage,
103 __in BURN_PAYLOAD* pPayload
104 );
105 +static HRESULT ApplyCacheVerifyContainerOrPayload(
106 + __in BURN_CACHE_CONTEXT* pContext,
107 + __in_opt BURN_CONTAINER* pContainer,
108 + __in_opt BURN_PACKAGE* pPackage,
109 + __in_opt BURN_PAYLOAD* pPayload
110 + );
111 static HRESULT ExtractContainer(
112 __in BURN_CACHE_CONTEXT* pContext,
113 __in BURN_CONTAINER* pContainer
@@ -910,11 +917,9 @@ static HRESULT ApplyLayoutContainer(
917
918 Assert(!pContainer->fAttached);
919
913 - hr = CacheVerifyContainer(pContainer, pContext->wzLayoutDirectory);
920 + hr = ApplyCacheVerifyContainerOrPayload(pContext, pContainer, NULL, NULL);
921 if (SUCCEEDED(hr))
922 {
916 - // TODO: send Acquire and Verify messages to BA?
917 - pContext->qwSuccessfulCacheProgress += pContainer->qwFileSize * 2;
923 ExitFunction();
924 }
925
@@ -969,11 +974,9 @@ static HRESULT ApplyProcessPayload(
974 ExitFunction();
975 }
976
972 - hr = CacheVerifyPayload(pPayload, pContext->wzLayoutDirectory ? pContext->wzLayoutDirectory : pPackage->sczCacheFolder);
977 + hr = ApplyCacheVerifyContainerOrPayload(pContext, NULL, pPackage, pPayload);
978 if (SUCCEEDED(hr))
979 {
975 - // TODO: send Acquire and Verify messages to BA?
976 - pContext->qwSuccessfulCacheProgress += pPayload->qwFileSize * 2;
980 ExitFunction();
981 }
982
@@ -1012,6 +1015,54 @@ LExit:
1015 return hr;
1016 }
1017
1018 +static HRESULT ApplyCacheVerifyContainerOrPayload(
1019 + __in BURN_CACHE_CONTEXT* pContext,
1020 + __in_opt BURN_CONTAINER* pContainer,
1021 + __in_opt BURN_PACKAGE* pPackage,
1022 + __in_opt BURN_PAYLOAD* pPayload
1023 + )
1024 +{
1025 + AssertSz(pContainer || pPayload, "Must provide a container or a payload.");
1026 +
1027 + HRESULT hr = S_OK;
1028 + BURN_CACHE_PROGRESS_CONTEXT progress = { };
1029 + LPCWSTR wzPackageOrContainerId = pContainer ? pContainer->sczId : pPackage ? pPackage->sczId : NULL;
1030 + LPCWSTR wzPayloadId = pPayload ? pPayload->sczKey : NULL;
1031 +
1032 + progress.pCacheContext = pContext;
1033 + progress.pContainer = pContainer;
1034 + progress.pPackage = pPackage;
1035 + progress.pPayload = pPayload;
1036 + progress.type = BURN_CACHE_PROGRESS_TYPE_CONTAINER_OR_PAYLOAD_VERIFY;
1037 +
1038 + hr = UserExperienceOnCacheContainerOrPayloadVerifyBegin(pContext->pUX, wzPackageOrContainerId, wzPayloadId);
1039 + ExitOnRootFailure(hr, "BA aborted cache container or payload verify begin.");
1040 +
1041 + if (pContainer)
1042 + {
1043 + hr = CacheVerifyContainer(pContainer, pContext->wzLayoutDirectory);
1044 + }
1045 + else
1046 + {
1047 + hr = CacheVerifyPayload(pPayload, pContext->wzLayoutDirectory ? pContext->wzLayoutDirectory : pPackage->sczCacheFolder);
1048 + }
1049 +
1050 + // This was best effort to avoid acquiring the container or payload.
1051 + if (FAILED(hr))
1052 + {
1053 + ExitFunction();
1054 + }
1055 +
1056 + pContext->qwSuccessfulCacheProgress += pContainer ? pContainer->qwFileSize : pPayload->qwFileSize;
1057 +
1058 + hr = CompleteCacheProgress(&progress, pContainer ? pContainer->qwFileSize : pPayload->qwFileSize);
1059 +
1060 +LExit:
1061 + UserExperienceOnCacheContainerOrPayloadVerifyComplete(pContext->pUX, wzPackageOrContainerId, wzPayloadId, hr);
1062 +
1063 + return hr;
1064 +}
1065 +
1066 static HRESULT ExtractContainer(
1067 __in BURN_CACHE_CONTEXT* pContext,
1068 __in BURN_CONTAINER* pContainer
@@ -1112,9 +1163,21 @@ static HRESULT LayoutBundle(
1163
1164 if (CSTR_EQUAL == nEquivalentPaths && FileExistsEx(sczDestinationPath, NULL))
1165 {
1115 - // TODO: send Acquire and Verify messages to BA?
1116 - pContext->qwSuccessfulCacheProgress += 2 * qwBundleSize;
1117 - ExitFunction1(hr = S_OK);
1166 + hr = UserExperienceOnCacheContainerOrPayloadVerifyBegin(pContext->pUX, NULL, NULL);
1167 + if (FAILED(hr))
1168 + {
1169 + UserExperienceOnCacheContainerOrPayloadVerifyComplete(pContext->pUX, NULL, NULL, hr);
1170 + ExitOnRootFailure(hr, "BA aborted cache payload verify begin.");
1171 + }
1172 +
1173 + pContext->qwSuccessfulCacheProgress += qwBundleSize;
1174 +
1175 + progress.type = BURN_CACHE_PROGRESS_TYPE_CONTAINER_OR_PAYLOAD_VERIFY;
1176 + hr = CompleteCacheProgress(&progress, qwBundleSize);
1177 +
1178 + UserExperienceOnCacheContainerOrPayloadVerifyComplete(pContext->pUX, NULL, NULL, hr);
1179 +
1180 + ExitFunction();
1181 }
1182
1183 do
@@ -1702,6 +1765,10 @@ static DWORD CALLBACK CacheProgressRoutine(
1765 hr = UserExperienceOnCacheVerifyProgress(pProgress->pCacheContext->pUX, wzPackageOrContainerId, wzPayloadId, TotalBytesTransferred.QuadPart, TotalFileSize.QuadPart, dwOverallPercentage);
1766 ExitOnRootFailure(hr, "BA aborted verify of %hs: %ls", pProgress->pContainer ? "container" : "payload", pProgress->pContainer ? wzPackageOrContainerId : wzPayloadId);
1767 break;
1768 + case BURN_CACHE_PROGRESS_TYPE_CONTAINER_OR_PAYLOAD_VERIFY:
1769 + hr = UserExperienceOnCacheContainerOrPayloadVerifyProgress(pProgress->pCacheContext->pUX, wzPackageOrContainerId, wzPayloadId, TotalBytesTransferred.QuadPart, TotalFileSize.QuadPart, dwOverallPercentage);
1770 + ExitOnRootFailure(hr, "BA aborted container or payload verify: %ls", wzPayloadId);
1771 + break;
1772 }
1773
1774 LExit:
src/engine/userexperience.cpp
+87
@@ -610,6 +610,93 @@ LExit:
610 return hr;
611 }
612
613 +EXTERN_C BAAPI UserExperienceOnCacheContainerOrPayloadVerifyBegin(
614 + __in BURN_USER_EXPERIENCE* pUserExperience,
615 + __in_z_opt LPCWSTR wzPackageOrContainerId,
616 + __in_z_opt LPCWSTR wzPayloadId
617 + )
618 +{
619 + HRESULT hr = S_OK;
620 + BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_ARGS args = { };
621 + BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_RESULTS results = { };
622 +
623 + args.cbSize = sizeof(args);
624 + args.wzPackageOrContainerId = wzPackageOrContainerId;
625 + args.wzPayloadId = wzPayloadId;
626 +
627 + results.cbSize = sizeof(results);
628 +
629 + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYBEGIN, &args, &results);
630 + ExitOnFailure(hr, "BA OnCacheContainerOrPayloadVerifyBegin failed.");
631 +
632 + if (results.fCancel)
633 + {
634 + hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT);
635 + }
636 +
637 +LExit:
638 + return hr;
639 +}
640 +
641 +EXTERN_C BAAPI UserExperienceOnCacheContainerOrPayloadVerifyComplete(
642 + __in BURN_USER_EXPERIENCE* pUserExperience,
643 + __in_z_opt LPCWSTR wzPackageOrContainerId,
644 + __in_z_opt LPCWSTR wzPayloadId,
645 + __in HRESULT hrStatus
646 + )
647 +{
648 + HRESULT hr = S_OK;
649 + BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_ARGS args = { };
650 + BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_RESULTS results = { };
651 +
652 + args.cbSize = sizeof(args);
653 + args.wzPackageOrContainerId = wzPackageOrContainerId;
654 + args.wzPayloadId = wzPayloadId;
655 + args.hrStatus = hrStatus;
656 +
657 + results.cbSize = sizeof(results);
658 +
659 + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE, &args, &results);
660 + ExitOnFailure(hr, "BA OnCacheContainerOrPayloadVerifyComplete failed.");
661 +
662 +LExit:
663 + return hr;
664 +}
665 +
666 +EXTERN_C BAAPI UserExperienceOnCacheContainerOrPayloadVerifyProgress(
667 + __in BURN_USER_EXPERIENCE* pUserExperience,
668 + __in_z_opt LPCWSTR wzPackageOrContainerId,
669 + __in_z_opt LPCWSTR wzPayloadId,
670 + __in DWORD64 dw64Progress,
671 + __in DWORD64 dw64Total,
672 + __in DWORD dwOverallPercentage
673 + )
674 +{
675 + HRESULT hr = S_OK;
676 + BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_ARGS args = { };
677 + BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_RESULTS results = { };
678 +
679 + args.cbSize = sizeof(args);
680 + args.wzPackageOrContainerId = wzPackageOrContainerId;
681 + args.wzPayloadId = wzPayloadId;
682 + args.dw64Progress = dw64Progress;
683 + args.dw64Total = dw64Total;
684 + args.dwOverallPercentage = dwOverallPercentage;
685 +
686 + results.cbSize = sizeof(results);
687 +
688 + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS, &args, &results);
689 + ExitOnFailure(hr, "BA OnCacheContainerOrPayloadVerifyProgress failed.");
690 +
691 + if (results.fCancel)
692 + {
693 + hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT);
694 + }
695 +
696 +LExit:
697 + return hr;
698 +}
699 +
700 EXTERN_C BAAPI UserExperienceOnCachePackageBegin(
701 __in BURN_USER_EXPERIENCE* pUserExperience,
702 __in_z LPCWSTR wzPackageId,
src/engine/userexperience.h
+19
@@ -165,6 +165,25 @@ BAAPI UserExperienceOnCacheComplete(
165 __in BURN_USER_EXPERIENCE* pUserExperience,
166 __in HRESULT hrStatus
167 );
168 +BAAPI UserExperienceOnCacheContainerOrPayloadVerifyBegin(
169 + __in BURN_USER_EXPERIENCE* pUserExperience,
170 + __in_z_opt LPCWSTR wzPackageOrContainerId,
171 + __in_z_opt LPCWSTR wzPayloadId
172 + );
173 +BAAPI UserExperienceOnCacheContainerOrPayloadVerifyComplete(
174 + __in BURN_USER_EXPERIENCE* pUserExperience,
175 + __in_z_opt LPCWSTR wzPackageOrContainerId,
176 + __in_z_opt LPCWSTR wzPayloadId,
177 + __in HRESULT hrStatus
178 + );
179 +BAAPI UserExperienceOnCacheContainerOrPayloadVerifyProgress(
180 + __in BURN_USER_EXPERIENCE* pUserExperience,
181 + __in_z_opt LPCWSTR wzPackageOrContainerId,
182 + __in_z_opt LPCWSTR wzPayloadId,
183 + __in DWORD64 dw64Progress,
184 + __in DWORD64 dw64Total,
185 + __in DWORD dwOverallPercentage
186 + );
187 BAAPI UserExperienceOnCachePackageBegin(
188 __in BURN_USER_EXPERIENCE* pUserExperience,
189 __in_z LPCWSTR wzPackageId,