diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2021-04-16 10:20:41 -0500 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2021-04-19 23:12:55 -0500 |
| commit | 5d6046bee5021052da4a666c1e2ceeb0f16af349 (patch) | |
| tree | 589ddcbe270e2e4df8cffdbd26792bcee4c29e1c /src/engine/userexperience.cpp | |
| parent | b941c2754748251520dc5032d11396c9844fad8e (diff) | |
| download | wix-5d6046bee5021052da4a666c1e2ceeb0f16af349.tar.gz wix-5d6046bee5021052da4a666c1e2ceeb0f16af349.tar.bz2 wix-5d6046bee5021052da4a666c1e2ceeb0f16af349.zip | |
Replace OnResolveSource with OnCacheAcquireResolving
Inactivate the engine during OnCacheAcquireBegin and Complete to allow setting the source from there.
Fixes #3640
Contributes to #5253
Diffstat (limited to 'src/engine/userexperience.cpp')
| -rw-r--r-- | src/engine/userexperience.cpp | 126 |
1 files changed, 81 insertions, 45 deletions
diff --git a/src/engine/userexperience.cpp b/src/engine/userexperience.cpp index b6bd65dc..f6ae1491 100644 --- a/src/engine/userexperience.cpp +++ b/src/engine/userexperience.cpp | |||
| @@ -395,29 +395,46 @@ EXTERN_C BAAPI UserExperienceOnCacheAcquireBegin( | |||
| 395 | __in BURN_USER_EXPERIENCE* pUserExperience, | 395 | __in BURN_USER_EXPERIENCE* pUserExperience, |
| 396 | __in_z_opt LPCWSTR wzPackageOrContainerId, | 396 | __in_z_opt LPCWSTR wzPackageOrContainerId, |
| 397 | __in_z_opt LPCWSTR wzPayloadId, | 397 | __in_z_opt LPCWSTR wzPayloadId, |
| 398 | __in BOOTSTRAPPER_CACHE_OPERATION operation, | 398 | __in_z LPWSTR* pwzSource, |
| 399 | __in_z LPCWSTR wzSource | 399 | __in_z LPWSTR* pwzDownloadUrl, |
| 400 | __in_z_opt LPCWSTR wzPayloadContainerId, | ||
| 401 | __out BOOTSTRAPPER_CACHE_OPERATION* pCacheOperation | ||
| 400 | ) | 402 | ) |
| 401 | { | 403 | { |
| 402 | HRESULT hr = S_OK; | 404 | HRESULT hr = S_OK; |
| 403 | BA_ONCACHEACQUIREBEGIN_ARGS args = { }; | 405 | BA_ONCACHEACQUIREBEGIN_ARGS args = { }; |
| 404 | BA_ONCACHEACQUIREBEGIN_RESULTS results = { }; | 406 | BA_ONCACHEACQUIREBEGIN_RESULTS results = { }; |
| 407 | *pCacheOperation = BOOTSTRAPPER_CACHE_OPERATION_NONE; | ||
| 405 | 408 | ||
| 406 | args.cbSize = sizeof(args); | 409 | args.cbSize = sizeof(args); |
| 407 | args.wzPackageOrContainerId = wzPackageOrContainerId; | 410 | args.wzPackageOrContainerId = wzPackageOrContainerId; |
| 408 | args.wzPayloadId = wzPayloadId; | 411 | args.wzPayloadId = wzPayloadId; |
| 409 | args.operation = operation; | 412 | args.wzSource = *pwzSource; |
| 410 | args.wzSource = wzSource; | 413 | args.wzDownloadUrl = *pwzDownloadUrl; |
| 414 | args.wzPayloadContainerId = wzPayloadContainerId; | ||
| 415 | args.recommendation = *pCacheOperation; | ||
| 411 | 416 | ||
| 412 | results.cbSize = sizeof(results); | 417 | results.cbSize = sizeof(results); |
| 418 | results.action = *pCacheOperation; | ||
| 413 | 419 | ||
| 414 | hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREBEGIN, &args, &results); | 420 | hr = SendBAMessageFromInactiveEngine(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREBEGIN, &args, &results); |
| 415 | ExitOnFailure(hr, "BA OnCacheAcquireBegin failed."); | 421 | ExitOnFailure(hr, "BA OnCacheAcquireBegin failed."); |
| 416 | 422 | ||
| 417 | if (results.fCancel) | 423 | if (results.fCancel) |
| 418 | { | 424 | { |
| 419 | hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT); | 425 | hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT); |
| 420 | } | 426 | } |
| 427 | else | ||
| 428 | { | ||
| 429 | // Verify the BA requested an action that is possible. | ||
| 430 | if (BOOTSTRAPPER_CACHE_OPERATION_DOWNLOAD == results.action && *pwzDownloadUrl && **pwzDownloadUrl || | ||
| 431 | BOOTSTRAPPER_CACHE_OPERATION_EXTRACT == results.action && wzPayloadContainerId || | ||
| 432 | BOOTSTRAPPER_CACHE_OPERATION_COPY == results.action || | ||
| 433 | BOOTSTRAPPER_CACHE_OPERATION_NONE == results.action) | ||
| 434 | { | ||
| 435 | *pCacheOperation = results.action; | ||
| 436 | } | ||
| 437 | } | ||
| 421 | 438 | ||
| 422 | LExit: | 439 | LExit: |
| 423 | return hr; | 440 | return hr; |
| @@ -444,7 +461,7 @@ EXTERN_C BAAPI UserExperienceOnCacheAcquireComplete( | |||
| 444 | results.cbSize = sizeof(results); | 461 | results.cbSize = sizeof(results); |
| 445 | results.action = args.recommendation; | 462 | results.action = args.recommendation; |
| 446 | 463 | ||
| 447 | hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIRECOMPLETE, &args, &results); | 464 | hr = SendBAMessageFromInactiveEngine(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIRECOMPLETE, &args, &results); |
| 448 | ExitOnFailure(hr, "BA OnCacheAcquireComplete failed."); | 465 | ExitOnFailure(hr, "BA OnCacheAcquireComplete failed."); |
| 449 | 466 | ||
| 450 | if (FAILED(hrStatus)) | 467 | if (FAILED(hrStatus)) |
| @@ -490,6 +507,64 @@ LExit: | |||
| 490 | return hr; | 507 | return hr; |
| 491 | } | 508 | } |
| 492 | 509 | ||
| 510 | EXTERN_C BAAPI UserExperienceOnCacheAcquireResolving( | ||
| 511 | __in BURN_USER_EXPERIENCE* pUserExperience, | ||
| 512 | __in_z_opt LPCWSTR wzPackageOrContainerId, | ||
| 513 | __in_z_opt LPCWSTR wzPayloadId, | ||
| 514 | __in_z LPWSTR* rgSearchPaths, | ||
| 515 | __in DWORD cSearchPaths, | ||
| 516 | __in BOOL fFoundLocal, | ||
| 517 | __in DWORD* pdwChosenSearchPath, | ||
| 518 | __in_z_opt LPCWSTR wzDownloadUrl, | ||
| 519 | __in_z_opt LPCWSTR wzPayloadContainerId, | ||
| 520 | __inout BOOTSTRAPPER_CACHE_OPERATION* pCacheOperation | ||
| 521 | ) | ||
| 522 | { | ||
| 523 | HRESULT hr = S_OK; | ||
| 524 | BA_ONCACHEACQUIRERESOLVING_ARGS args = { }; | ||
| 525 | BA_ONCACHEACQUIRERESOLVING_RESULTS results = { }; | ||
| 526 | |||
| 527 | args.cbSize = sizeof(args); | ||
| 528 | args.wzPackageOrContainerId = wzPackageOrContainerId; | ||
| 529 | args.wzPayloadId = wzPayloadId; | ||
| 530 | args.rgSearchPaths = const_cast<LPCWSTR*>(rgSearchPaths); | ||
| 531 | args.cSearchPaths = cSearchPaths; | ||
| 532 | args.fFoundLocal = fFoundLocal; | ||
| 533 | args.dwRecommendedSearchPath = *pdwChosenSearchPath; | ||
| 534 | args.wzDownloadUrl = wzDownloadUrl; | ||
| 535 | args.recommendation = *pCacheOperation; | ||
| 536 | |||
| 537 | results.cbSize = sizeof(results); | ||
| 538 | results.dwChosenSearchPath = *pdwChosenSearchPath; | ||
| 539 | results.action = *pCacheOperation; | ||
| 540 | |||
| 541 | hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIRERESOLVING, &args, &results); | ||
| 542 | ExitOnFailure(hr, "BA OnCacheAcquireResolving failed."); | ||
| 543 | |||
| 544 | if (results.fCancel) | ||
| 545 | { | ||
| 546 | hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT); | ||
| 547 | } | ||
| 548 | else | ||
| 549 | { | ||
| 550 | // Verify the BA requested an action that is possible. | ||
| 551 | if (BOOTSTRAPPER_CACHE_OPERATION_DOWNLOAD == results.action && wzDownloadUrl && *wzDownloadUrl || | ||
| 552 | BOOTSTRAPPER_CACHE_OPERATION_EXTRACT == results.action && wzPayloadContainerId || | ||
| 553 | BOOTSTRAPPER_CACHE_OPERATION_NONE == results.action) | ||
| 554 | { | ||
| 555 | *pCacheOperation = results.action; | ||
| 556 | } | ||
| 557 | else if (BOOTSTRAPPER_CACHE_OPERATION_COPY == results.action && results.dwChosenSearchPath < cSearchPaths) | ||
| 558 | { | ||
| 559 | *pdwChosenSearchPath = results.dwChosenSearchPath; | ||
| 560 | *pCacheOperation = results.action; | ||
| 561 | } | ||
| 562 | } | ||
| 563 | |||
| 564 | LExit: | ||
| 565 | return hr; | ||
| 566 | } | ||
| 567 | |||
| 493 | EXTERN_C BAAPI UserExperienceOnCacheBegin( | 568 | EXTERN_C BAAPI UserExperienceOnCacheBegin( |
| 494 | __in BURN_USER_EXPERIENCE* pUserExperience | 569 | __in BURN_USER_EXPERIENCE* pUserExperience |
| 495 | ) | 570 | ) |
| @@ -1861,45 +1936,6 @@ LExit: | |||
| 1861 | return hr; | 1936 | return hr; |
| 1862 | } | 1937 | } |
| 1863 | 1938 | ||
| 1864 | EXTERN_C BAAPI UserExperienceOnResolveSource( | ||
| 1865 | __in BURN_USER_EXPERIENCE* pUserExperience, | ||
| 1866 | __in_z LPCWSTR wzPackageOrContainerId, | ||
| 1867 | __in_z_opt LPCWSTR wzPayloadId, | ||
| 1868 | __in_z LPCWSTR wzLocalSource, | ||
| 1869 | __in_z_opt LPCWSTR wzDownloadSource, | ||
| 1870 | __inout BOOTSTRAPPER_RESOLVESOURCE_ACTION* pAction | ||
| 1871 | ) | ||
| 1872 | { | ||
| 1873 | HRESULT hr = S_OK; | ||
| 1874 | BA_ONRESOLVESOURCE_ARGS args = { }; | ||
| 1875 | BA_ONRESOLVESOURCE_RESULTS results = { }; | ||
| 1876 | |||
| 1877 | args.cbSize = sizeof(args); | ||
| 1878 | args.wzPackageOrContainerId = wzPackageOrContainerId; | ||
| 1879 | args.wzPayloadId = wzPayloadId; | ||
| 1880 | args.wzLocalSource = wzLocalSource; | ||
| 1881 | args.wzDownloadSource = wzDownloadSource; | ||
| 1882 | args.recommendation = *pAction; | ||
| 1883 | |||
| 1884 | results.cbSize = sizeof(results); | ||
| 1885 | results.action = *pAction; | ||
| 1886 | |||
| 1887 | hr = SendBAMessageFromInactiveEngine(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONRESOLVESOURCE, &args, &results); | ||
| 1888 | ExitOnFailure(hr, "BA OnResolveSource failed."); | ||
| 1889 | |||
| 1890 | if (results.fCancel) | ||
| 1891 | { | ||
| 1892 | hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT); | ||
| 1893 | } | ||
| 1894 | else | ||
| 1895 | { | ||
| 1896 | *pAction = results.action; | ||
| 1897 | } | ||
| 1898 | |||
| 1899 | LExit: | ||
| 1900 | return hr; | ||
| 1901 | } | ||
| 1902 | |||
| 1903 | EXTERN_C BAAPI UserExperienceOnRollbackMsiTransactionBegin( | 1939 | EXTERN_C BAAPI UserExperienceOnRollbackMsiTransactionBegin( |
| 1904 | __in BURN_USER_EXPERIENCE* pUserExperience, | 1940 | __in BURN_USER_EXPERIENCE* pUserExperience, |
| 1905 | __in LPCWSTR wzTransactionId | 1941 | __in LPCWSTR wzTransactionId |
