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,