diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-04-16 10:47:54 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-04-19 23:12:55 -0500 |
commit | d7b0329e16ba9cae4a33970e26591ae5f1d98f0d (patch) | |
tree | 4305d0af48d5b5a5c6c95a2d76efc7a37dc3124c | |
parent | e09a129ee276457d02d19a6444657cf3a2c73905 (diff) | |
download | wix-d7b0329e16ba9cae4a33970e26591ae5f1d98f0d.tar.gz wix-d7b0329e16ba9cae4a33970e26591ae5f1d98f0d.tar.bz2 wix-d7b0329e16ba9cae4a33970e26591ae5f1d98f0d.zip |
Add OnCacheContainerOrPayloadVerify* for a file already in the cache.
-rw-r--r-- | src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h | 45 | ||||
-rw-r--r-- | src/engine/apply.cpp | 85 | ||||
-rw-r--r-- | src/engine/userexperience.cpp | 87 | ||||
-rw-r--r-- | 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 | |||
150 | BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDPACKAGE, | 150 | BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDPACKAGE, |
151 | BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANFORWARDCOMPATIBLEBUNDLE, | 151 | BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANFORWARDCOMPATIBLEBUNDLE, |
152 | BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYPROGRESS, | 152 | BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYPROGRESS, |
153 | BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYBEGIN, | ||
154 | BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE, | ||
155 | BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS, | ||
153 | }; | 156 | }; |
154 | 157 | ||
155 | enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION | 158 | enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION |
@@ -399,6 +402,48 @@ struct BA_ONCACHECOMPLETE_RESULTS | |||
399 | DWORD cbSize; | 402 | DWORD cbSize; |
400 | }; | 403 | }; |
401 | 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 | |||
402 | struct BA_ONCACHEPACKAGEBEGIN_ARGS | 447 | struct BA_ONCACHEPACKAGEBEGIN_ARGS |
403 | { | 448 | { |
404 | DWORD cbSize; | 449 | 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 | |||
15 | { | 15 | { |
16 | BURN_CACHE_PROGRESS_TYPE_ACQUIRE, | 16 | BURN_CACHE_PROGRESS_TYPE_ACQUIRE, |
17 | BURN_CACHE_PROGRESS_TYPE_VERIFY, | 17 | BURN_CACHE_PROGRESS_TYPE_VERIFY, |
18 | BURN_CACHE_PROGRESS_TYPE_CONTAINER_OR_PAYLOAD_VERIFY, | ||
18 | }; | 19 | }; |
19 | 20 | ||
20 | // structs | 21 | // structs |
@@ -101,6 +102,12 @@ static HRESULT ApplyProcessPayload( | |||
101 | __in_opt BURN_PACKAGE* pPackage, | 102 | __in_opt BURN_PACKAGE* pPackage, |
102 | __in BURN_PAYLOAD* pPayload | 103 | __in BURN_PAYLOAD* pPayload |
103 | ); | 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 | ); | ||
104 | static HRESULT ExtractContainer( | 111 | static HRESULT ExtractContainer( |
105 | __in BURN_CACHE_CONTEXT* pContext, | 112 | __in BURN_CACHE_CONTEXT* pContext, |
106 | __in BURN_CONTAINER* pContainer | 113 | __in BURN_CONTAINER* pContainer |
@@ -910,11 +917,9 @@ static HRESULT ApplyLayoutContainer( | |||
910 | 917 | ||
911 | Assert(!pContainer->fAttached); | 918 | Assert(!pContainer->fAttached); |
912 | 919 | ||
913 | hr = CacheVerifyContainer(pContainer, pContext->wzLayoutDirectory); | 920 | hr = ApplyCacheVerifyContainerOrPayload(pContext, pContainer, NULL, NULL); |
914 | if (SUCCEEDED(hr)) | 921 | if (SUCCEEDED(hr)) |
915 | { | 922 | { |
916 | // TODO: send Acquire and Verify messages to BA? | ||
917 | pContext->qwSuccessfulCacheProgress += pContainer->qwFileSize * 2; | ||
918 | ExitFunction(); | 923 | ExitFunction(); |
919 | } | 924 | } |
920 | 925 | ||
@@ -969,11 +974,9 @@ static HRESULT ApplyProcessPayload( | |||
969 | ExitFunction(); | 974 | ExitFunction(); |
970 | } | 975 | } |
971 | 976 | ||
972 | hr = CacheVerifyPayload(pPayload, pContext->wzLayoutDirectory ? pContext->wzLayoutDirectory : pPackage->sczCacheFolder); | 977 | hr = ApplyCacheVerifyContainerOrPayload(pContext, NULL, pPackage, pPayload); |
973 | if (SUCCEEDED(hr)) | 978 | if (SUCCEEDED(hr)) |
974 | { | 979 | { |
975 | // TODO: send Acquire and Verify messages to BA? | ||
976 | pContext->qwSuccessfulCacheProgress += pPayload->qwFileSize * 2; | ||
977 | ExitFunction(); | 980 | ExitFunction(); |
978 | } | 981 | } |
979 | 982 | ||
@@ -1012,6 +1015,54 @@ LExit: | |||
1012 | return hr; | 1015 | return hr; |
1013 | } | 1016 | } |
1014 | 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 | |||
1015 | static HRESULT ExtractContainer( | 1066 | static HRESULT ExtractContainer( |
1016 | __in BURN_CACHE_CONTEXT* pContext, | 1067 | __in BURN_CACHE_CONTEXT* pContext, |
1017 | __in BURN_CONTAINER* pContainer | 1068 | __in BURN_CONTAINER* pContainer |
@@ -1112,9 +1163,21 @@ static HRESULT LayoutBundle( | |||
1112 | 1163 | ||
1113 | if (CSTR_EQUAL == nEquivalentPaths && FileExistsEx(sczDestinationPath, NULL)) | 1164 | if (CSTR_EQUAL == nEquivalentPaths && FileExistsEx(sczDestinationPath, NULL)) |
1114 | { | 1165 | { |
1115 | // TODO: send Acquire and Verify messages to BA? | 1166 | hr = UserExperienceOnCacheContainerOrPayloadVerifyBegin(pContext->pUX, NULL, NULL); |
1116 | pContext->qwSuccessfulCacheProgress += 2 * qwBundleSize; | 1167 | if (FAILED(hr)) |
1117 | ExitFunction1(hr = S_OK); | 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(); | ||
1118 | } | 1181 | } |
1119 | 1182 | ||
1120 | do | 1183 | do |
@@ -1702,6 +1765,10 @@ static DWORD CALLBACK CacheProgressRoutine( | |||
1702 | hr = UserExperienceOnCacheVerifyProgress(pProgress->pCacheContext->pUX, wzPackageOrContainerId, wzPayloadId, TotalBytesTransferred.QuadPart, TotalFileSize.QuadPart, dwOverallPercentage); | 1765 | hr = UserExperienceOnCacheVerifyProgress(pProgress->pCacheContext->pUX, wzPackageOrContainerId, wzPayloadId, TotalBytesTransferred.QuadPart, TotalFileSize.QuadPart, dwOverallPercentage); |
1703 | ExitOnRootFailure(hr, "BA aborted verify of %hs: %ls", pProgress->pContainer ? "container" : "payload", pProgress->pContainer ? wzPackageOrContainerId : wzPayloadId); | 1766 | ExitOnRootFailure(hr, "BA aborted verify of %hs: %ls", pProgress->pContainer ? "container" : "payload", pProgress->pContainer ? wzPackageOrContainerId : wzPayloadId); |
1704 | break; | 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; | ||
1705 | } | 1772 | } |
1706 | 1773 | ||
1707 | LExit: | 1774 | 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: | |||
610 | return hr; | 610 | return hr; |
611 | } | 611 | } |
612 | 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 | |||
613 | EXTERN_C BAAPI UserExperienceOnCachePackageBegin( | 700 | EXTERN_C BAAPI UserExperienceOnCachePackageBegin( |
614 | __in BURN_USER_EXPERIENCE* pUserExperience, | 701 | __in BURN_USER_EXPERIENCE* pUserExperience, |
615 | __in_z LPCWSTR wzPackageId, | 702 | __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( | |||
165 | __in BURN_USER_EXPERIENCE* pUserExperience, | 165 | __in BURN_USER_EXPERIENCE* pUserExperience, |
166 | __in HRESULT hrStatus | 166 | __in HRESULT hrStatus |
167 | ); | 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 | ); | ||
168 | BAAPI UserExperienceOnCachePackageBegin( | 187 | BAAPI UserExperienceOnCachePackageBegin( |
169 | __in BURN_USER_EXPERIENCE* pUserExperience, | 188 | __in BURN_USER_EXPERIENCE* pUserExperience, |
170 | __in_z LPCWSTR wzPackageId, | 189 | __in_z LPCWSTR wzPackageId, |