diff options
| author | Bob Arnson <bob@firegiant.com> | 2022-09-09 21:23:26 -0400 |
|---|---|---|
| committer | Bob Arnson <github@bobs.org> | 2022-09-12 13:33:03 -0400 |
| commit | 5059f83d7dccd7221458fca414a0756bb83466a5 (patch) | |
| tree | 485ccc37c018fb806fa76ea0401cfb7bfb24d315 /src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | |
| parent | 6a45cb7687de57056532fe897a708435deec2ea3 (diff) | |
| download | wix-5059f83d7dccd7221458fca414a0756bb83466a5.tar.gz wix-5059f83d7dccd7221458fca414a0756bb83466a5.tar.bz2 wix-5059f83d7dccd7221458fca414a0756bb83466a5.zip | |
Support bundle updates in WixStdBA.
Fixes https://github.com/wixtoolset/issues/issues/6894.
Diffstat (limited to 'src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp')
| -rw-r--r-- | src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | 121 |
1 files changed, 119 insertions, 2 deletions
diff --git a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp index 50de2c7f..3539450e 100644 --- a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp +++ b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | |||
| @@ -23,6 +23,7 @@ static const LPCWSTR WIXSTDBA_VARIABLE_LANGUAGE_ID = L"WixStdBALanguageId"; | |||
| 23 | static const LPCWSTR WIXSTDBA_VARIABLE_RESTART_REQUIRED = L"WixStdBARestartRequired"; | 23 | static const LPCWSTR WIXSTDBA_VARIABLE_RESTART_REQUIRED = L"WixStdBARestartRequired"; |
| 24 | static const LPCWSTR WIXSTDBA_VARIABLE_SHOW_VERSION = L"WixStdBAShowVersion"; | 24 | static const LPCWSTR WIXSTDBA_VARIABLE_SHOW_VERSION = L"WixStdBAShowVersion"; |
| 25 | static const LPCWSTR WIXSTDBA_VARIABLE_SUPPRESS_OPTIONS_UI = L"WixStdBASuppressOptionsUI"; | 25 | static const LPCWSTR WIXSTDBA_VARIABLE_SUPPRESS_OPTIONS_UI = L"WixStdBASuppressOptionsUI"; |
| 26 | static const LPCWSTR WIXSTDBA_VARIABLE_UPDATE_AVAILABLE = L"WixStdBAUpdateAvailable"; | ||
| 26 | 27 | ||
| 27 | enum WIXSTDBA_STATE | 28 | enum WIXSTDBA_STATE |
| 28 | { | 29 | { |
| @@ -98,6 +99,11 @@ enum WIXSTDBA_CONTROL | |||
| 98 | WIXSTDBA_CONTROL_REPAIR_BUTTON, | 99 | WIXSTDBA_CONTROL_REPAIR_BUTTON, |
| 99 | WIXSTDBA_CONTROL_UNINSTALL_BUTTON, | 100 | WIXSTDBA_CONTROL_UNINSTALL_BUTTON, |
| 100 | 101 | ||
| 102 | // Updates | ||
| 103 | WIXSTDBA_CONTROL_CHECKING_FOR_UPDATES_LABEL, | ||
| 104 | WIXSTDBA_CONTROL_INSTALL_UPDATE_BUTTON, | ||
| 105 | WIXSTDBA_CONTROL_MODIFY_UPDATE_BUTTON, | ||
| 106 | |||
| 101 | // Progress page | 107 | // Progress page |
| 102 | WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT, | 108 | WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT, |
| 103 | WIXSTDBA_CONTROL_CACHE_PROGRESS_BAR, | 109 | WIXSTDBA_CONTROL_CACHE_PROGRESS_BAR, |
| @@ -342,6 +348,70 @@ public: // IBootstrapperApplication | |||
| 342 | } | 348 | } |
| 343 | 349 | ||
| 344 | 350 | ||
| 351 | virtual STDMETHODIMP OnDetectUpdateBegin( | ||
| 352 | __in_z LPCWSTR wzUpdateLocation, | ||
| 353 | __inout BOOL* pfCancel, | ||
| 354 | __inout BOOL* pfSkip | ||
| 355 | ) | ||
| 356 | { | ||
| 357 | #ifdef DEBUG | ||
| 358 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnDetectUpdateBegin() - update location: %ls", wzUpdateLocation); | ||
| 359 | #endif | ||
| 360 | |||
| 361 | // Try update detection only if we have a potential update source and are in full UI mode. | ||
| 362 | *pfSkip = !wzUpdateLocation | ||
| 363 | || !*wzUpdateLocation | ||
| 364 | || BOOTSTRAPPER_DISPLAY_FULL != m_command.display; | ||
| 365 | |||
| 366 | ThemeShowControl(m_pControlCheckingForUpdatesLabel, *pfSkip ? SW_HIDE : SW_SHOW); | ||
| 367 | |||
| 368 | return __super::OnDetectUpdateBegin(wzUpdateLocation, pfCancel, pfSkip); | ||
| 369 | } | ||
| 370 | |||
| 371 | |||
| 372 | virtual STDMETHODIMP OnDetectUpdate( | ||
| 373 | __in_z LPCWSTR wzUpdateLocation, | ||
| 374 | __in DWORD64 dw64Size, | ||
| 375 | __in_z_opt LPCWSTR wzHash, | ||
| 376 | __in BOOTSTRAPPER_UPDATE_HASH_TYPE hashAlgorithm, | ||
| 377 | __in LPCWSTR wzUpdateVersion, | ||
| 378 | __in_z LPCWSTR wzTitle, | ||
| 379 | __in_z LPCWSTR wzSummary, | ||
| 380 | __in_z LPCWSTR wzContentType, | ||
| 381 | __in_z LPCWSTR wzContent, | ||
| 382 | __inout BOOL* pfCancel, | ||
| 383 | __inout BOOL* pfStopProcessingUpdates | ||
| 384 | ) | ||
| 385 | { | ||
| 386 | HRESULT hr = S_OK; | ||
| 387 | int nResult = 0; | ||
| 388 | |||
| 389 | hr = VerCompareStringVersions(m_sczBundleVersion, wzUpdateVersion, TRUE/*fStrict*/, &nResult); | ||
| 390 | BalExitOnFailure(hr, "Failed to compare bundle version: %ls to update version: %ls.", m_sczBundleVersion, wzUpdateVersion); | ||
| 391 | |||
| 392 | // Burn sends the feed in descending version order so we need only the first one. | ||
| 393 | *pfStopProcessingUpdates = TRUE; | ||
| 394 | |||
| 395 | if (0 <= nResult) | ||
| 396 | { | ||
| 397 | BalLog(BOOTSTRAPPER_LOG_LEVEL_VERBOSE, "WIXSTDBA: Update version: %ls is a match or downgrade for bundle version: %ls.", wzUpdateVersion, m_sczBundleVersion); | ||
| 398 | } | ||
| 399 | else | ||
| 400 | { | ||
| 401 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: Update v%ls for bundle v%ls available from: %ls.", wzUpdateVersion, m_sczBundleVersion, wzUpdateLocation); | ||
| 402 | |||
| 403 | hr = BalSetVersionVariable(WIXSTDBA_VARIABLE_UPDATE_AVAILABLE, wzUpdateVersion); | ||
| 404 | BalExitOnFailure(hr, "Failed to set WixStdBAUpdateAvailable value: %ls.", wzUpdateVersion); | ||
| 405 | |||
| 406 | hr = m_pEngine->SetUpdate(NULL, wzUpdateLocation, dw64Size, hashAlgorithm, wzHash); | ||
| 407 | BalExitOnFailure(hr, "Failed to set update location: %ls.", wzUpdateLocation); | ||
| 408 | } | ||
| 409 | |||
| 410 | LExit: | ||
| 411 | return __super::OnDetectUpdate(wzUpdateLocation, dw64Size, wzHash, hashAlgorithm, wzUpdateVersion, wzTitle, wzSummary, wzContentType, wzContent, pfCancel, pfStopProcessingUpdates); | ||
| 412 | } | ||
| 413 | |||
| 414 | |||
| 345 | virtual STDMETHODIMP OnDetectComplete( | 415 | virtual STDMETHODIMP OnDetectComplete( |
| 346 | __in HRESULT hrStatus, | 416 | __in HRESULT hrStatus, |
| 347 | __in BOOL /*fEligibleForCleanup*/ | 417 | __in BOOL /*fEligibleForCleanup*/ |
| @@ -3741,10 +3811,10 @@ private: | |||
| 3741 | 3811 | ||
| 3742 | m_state = state; | 3812 | m_state = state; |
| 3743 | 3813 | ||
| 3744 | // If our install is at the end (success or failure) and we're not showing full UI or | 3814 | // If our install is at the end (success or failure) and we're not showing full UI or not updating or |
| 3745 | // we successfully installed the prerequisite(s) and either no restart is required or can automatically restart | 3815 | // we successfully installed the prerequisite(s) and either no restart is required or can automatically restart |
| 3746 | // then exit. | 3816 | // then exit. |
| 3747 | if ((WIXSTDBA_STATE_APPLIED <= m_state && BOOTSTRAPPER_DISPLAY_FULL > m_command.display) || | 3817 | if ((WIXSTDBA_STATE_APPLIED <= m_state && (BOOTSTRAPPER_DISPLAY_FULL > m_command.display || BOOTSTRAPPER_ACTION_UPDATE_REPLACE == m_plannedAction)) || |
| 3748 | (WIXSTDBA_STATE_APPLIED == m_state && m_fPrereq && (!m_fRestartRequired || m_fShouldRestart && m_fAllowRestart))) | 3818 | (WIXSTDBA_STATE_APPLIED == m_state && m_fPrereq && (!m_fRestartRequired || m_fShouldRestart && m_fAllowRestart))) |
| 3749 | { | 3819 | { |
| 3750 | // Quietly exit. | 3820 | // Quietly exit. |
| @@ -4038,6 +4108,15 @@ private: | |||
| 4038 | 4108 | ||
| 4039 | 4109 | ||
| 4040 | // | 4110 | // |
| 4111 | // OnClickUpdateButton - start the update process. | ||
| 4112 | // | ||
| 4113 | void OnClickUpdateButton() | ||
| 4114 | { | ||
| 4115 | this->OnPlan(BOOTSTRAPPER_ACTION_UPDATE_REPLACE); | ||
| 4116 | } | ||
| 4117 | |||
| 4118 | |||
| 4119 | // | ||
| 4041 | // OnClickCloseButton - close the application. | 4120 | // OnClickCloseButton - close the application. |
| 4042 | // | 4121 | // |
| 4043 | void OnClickCloseButton() | 4122 | void OnClickCloseButton() |
| @@ -4263,6 +4342,13 @@ private: | |||
| 4263 | pResults->lResult = 0; | 4342 | pResults->lResult = 0; |
| 4264 | ExitFunction(); | 4343 | ExitFunction(); |
| 4265 | 4344 | ||
| 4345 | case WIXSTDBA_CONTROL_INSTALL_UPDATE_BUTTON: | ||
| 4346 | case WIXSTDBA_CONTROL_MODIFY_UPDATE_BUTTON: | ||
| 4347 | OnClickUpdateButton(); | ||
| 4348 | fProcessed = TRUE; | ||
| 4349 | pResults->lResult = 0; | ||
| 4350 | ExitFunction(); | ||
| 4351 | |||
| 4266 | case WIXSTDBA_CONTROL_LAUNCH_BUTTON: | 4352 | case WIXSTDBA_CONTROL_LAUNCH_BUTTON: |
| 4267 | OnClickLaunchButton(); | 4353 | OnClickLaunchButton(); |
| 4268 | fProcessed = TRUE; | 4354 | fProcessed = TRUE; |
| @@ -4381,6 +4467,10 @@ LExit: | |||
| 4381 | __in HRESULT hrStatus | 4467 | __in HRESULT hrStatus |
| 4382 | ) | 4468 | ) |
| 4383 | { | 4469 | { |
| 4470 | #ifdef DEBUG | ||
| 4471 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: SetState() - setting state to %u with status 0x%08x.", state, hrStatus); | ||
| 4472 | #endif | ||
| 4473 | |||
| 4384 | if (FAILED(hrStatus)) | 4474 | if (FAILED(hrStatus)) |
| 4385 | { | 4475 | { |
| 4386 | m_hrFinal = hrStatus; | 4476 | m_hrFinal = hrStatus; |
| @@ -4786,6 +4876,27 @@ public: | |||
| 4786 | m_pControlUninstallButton = NULL; | 4876 | m_pControlUninstallButton = NULL; |
| 4787 | ++pAssignControl; | 4877 | ++pAssignControl; |
| 4788 | 4878 | ||
| 4879 | pAssignControl->wId = WIXSTDBA_CONTROL_CHECKING_FOR_UPDATES_LABEL; | ||
| 4880 | pAssignControl->wzName = L"CheckingForUpdatesLabel"; | ||
| 4881 | pAssignControl->ppControl = &m_pControlCheckingForUpdatesLabel; | ||
| 4882 | pAssignControl->dwAutomaticBehaviorType = dwAutomaticBehaviorType; | ||
| 4883 | m_pControlCheckingForUpdatesLabel = NULL; | ||
| 4884 | ++pAssignControl; | ||
| 4885 | |||
| 4886 | pAssignControl->wId = WIXSTDBA_CONTROL_INSTALL_UPDATE_BUTTON; | ||
| 4887 | pAssignControl->wzName = L"InstallUpdateButton"; | ||
| 4888 | pAssignControl->ppControl = &m_pControlInstallUpdateButton; | ||
| 4889 | pAssignControl->dwAutomaticBehaviorType = THEME_CONTROL_AUTOMATIC_BEHAVIOR_ALL; | ||
| 4890 | m_pControlInstallUpdateButton = NULL; | ||
| 4891 | ++pAssignControl; | ||
| 4892 | |||
| 4893 | pAssignControl->wId = WIXSTDBA_CONTROL_MODIFY_UPDATE_BUTTON; | ||
| 4894 | pAssignControl->wzName = L"ModifyUpdateButton"; | ||
| 4895 | pAssignControl->ppControl = &m_pControlModifyUpdateButton; | ||
| 4896 | pAssignControl->dwAutomaticBehaviorType = THEME_CONTROL_AUTOMATIC_BEHAVIOR_ALL; | ||
| 4897 | m_pControlModifyUpdateButton = NULL; | ||
| 4898 | ++pAssignControl; | ||
| 4899 | |||
| 4789 | pAssignControl->wId = WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT; | 4900 | pAssignControl->wId = WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT; |
| 4790 | pAssignControl->wzName = L"CacheProgressPackageText"; | 4901 | pAssignControl->wzName = L"CacheProgressPackageText"; |
| 4791 | pAssignControl->ppControl = &m_pControlCacheProgressPackageText; | 4902 | pAssignControl->ppControl = &m_pControlCacheProgressPackageText; |
| @@ -4929,6 +5040,7 @@ public: | |||
| 4929 | ReleaseStr(m_sczLicenseUrl); | 5040 | ReleaseStr(m_sczLicenseUrl); |
| 4930 | ReleaseStr(m_sczBundleVersion); | 5041 | ReleaseStr(m_sczBundleVersion); |
| 4931 | ReleaseStr(m_sczAfterForcedRestartPackage); | 5042 | ReleaseStr(m_sczAfterForcedRestartPackage); |
| 5043 | |||
| 4932 | ReleaseNullObject(m_pEngine); | 5044 | ReleaseNullObject(m_pEngine); |
| 4933 | } | 5045 | } |
| 4934 | 5046 | ||
| @@ -4966,6 +5078,11 @@ private: | |||
| 4966 | const THEME_CONTROL* m_pControlRepairButton; | 5078 | const THEME_CONTROL* m_pControlRepairButton; |
| 4967 | const THEME_CONTROL* m_pControlUninstallButton; | 5079 | const THEME_CONTROL* m_pControlUninstallButton; |
| 4968 | 5080 | ||
| 5081 | // Update/loading pages | ||
| 5082 | const THEME_CONTROL* m_pControlCheckingForUpdatesLabel; | ||
| 5083 | const THEME_CONTROL* m_pControlInstallUpdateButton; | ||
| 5084 | const THEME_CONTROL* m_pControlModifyUpdateButton; | ||
| 5085 | |||
| 4969 | // Progress page | 5086 | // Progress page |
| 4970 | const THEME_CONTROL* m_pControlCacheProgressPackageText; | 5087 | const THEME_CONTROL* m_pControlCacheProgressPackageText; |
| 4971 | const THEME_CONTROL* m_pControlCacheProgressbar; | 5088 | const THEME_CONTROL* m_pControlCacheProgressbar; |
