aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-04-16 10:47:54 -0500
committerSean Hall <r.sean.hall@gmail.com>2021-04-19 23:12:55 -0500
commitd7b0329e16ba9cae4a33970e26591ae5f1d98f0d (patch)
tree4305d0af48d5b5a5c6c95a2d76efc7a37dc3124c
parente09a129ee276457d02d19a6444657cf3a2c73905 (diff)
downloadwix-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.h45
-rw-r--r--src/engine/apply.cpp85
-rw-r--r--src/engine/userexperience.cpp87
-rw-r--r--src/engine/userexperience.h19
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
155enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION 158enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION
@@ -399,6 +402,48 @@ struct BA_ONCACHECOMPLETE_RESULTS
399 DWORD cbSize; 402 DWORD cbSize;
400}; 403};
401 404
405struct BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_ARGS
406{
407 DWORD cbSize;
408 LPCWSTR wzPackageOrContainerId;
409 LPCWSTR wzPayloadId;
410};
411
412struct BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_RESULTS
413{
414 DWORD cbSize;
415 BOOL fCancel;
416};
417
418struct BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_ARGS
419{
420 DWORD cbSize;
421 LPCWSTR wzPackageOrContainerId;
422 LPCWSTR wzPayloadId;
423 HRESULT hrStatus;
424};
425
426struct BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_RESULTS
427{
428 DWORD cbSize;
429};
430
431struct BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_ARGS
432{
433 DWORD cbSize;
434 LPCWSTR wzPackageOrContainerId;
435 LPCWSTR wzPayloadId;
436 DWORD64 dw64Progress;
437 DWORD64 dw64Total;
438 DWORD dwOverallPercentage;
439};
440
441struct BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_RESULTS
442{
443 DWORD cbSize;
444 BOOL fCancel;
445};
446
402struct BA_ONCACHEPACKAGEBEGIN_ARGS 447struct 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 );
105static 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 );
104static HRESULT ExtractContainer( 111static 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
1018static 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
1060LExit:
1061 UserExperienceOnCacheContainerOrPayloadVerifyComplete(pContext->pUX, wzPackageOrContainerId, wzPayloadId, hr);
1062
1063 return hr;
1064}
1065
1015static HRESULT ExtractContainer( 1066static 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
1707LExit: 1774LExit:
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
613EXTERN_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
637LExit:
638 return hr;
639}
640
641EXTERN_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
662LExit:
663 return hr;
664}
665
666EXTERN_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
696LExit:
697 return hr;
698}
699
613EXTERN_C BAAPI UserExperienceOnCachePackageBegin( 700EXTERN_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 );
168BAAPI UserExperienceOnCacheContainerOrPayloadVerifyBegin(
169 __in BURN_USER_EXPERIENCE* pUserExperience,
170 __in_z_opt LPCWSTR wzPackageOrContainerId,
171 __in_z_opt LPCWSTR wzPayloadId
172 );
173BAAPI UserExperienceOnCacheContainerOrPayloadVerifyComplete(
174 __in BURN_USER_EXPERIENCE* pUserExperience,
175 __in_z_opt LPCWSTR wzPackageOrContainerId,
176 __in_z_opt LPCWSTR wzPayloadId,
177 __in HRESULT hrStatus
178 );
179BAAPI 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 );
168BAAPI UserExperienceOnCachePackageBegin( 187BAAPI UserExperienceOnCachePackageBegin(
169 __in BURN_USER_EXPERIENCE* pUserExperience, 188 __in BURN_USER_EXPERIENCE* pUserExperience,
170 __in_z LPCWSTR wzPackageId, 189 __in_z LPCWSTR wzPackageId,