diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2022-03-16 15:20:15 -0500 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-03-16 20:14:37 -0500 |
| commit | 8c9ca787bee29f969cd7ca9aeaa46626d557d196 (patch) | |
| tree | 8a7278a4035b584e1f1585e3215766af3ca0a62b /src/ext | |
| parent | c1694843f7c54c7f9feb3f7074a31ff8499c9644 (diff) | |
| download | wix-8c9ca787bee29f969cd7ca9aeaa46626d557d196.tar.gz wix-8c9ca787bee29f969cd7ca9aeaa46626d557d196.tar.bz2 wix-8c9ca787bee29f969cd7ca9aeaa46626d557d196.zip | |
Add WixBundleCommandLineAction, don't set dynamic variables at startup.
Fixes 6736
Diffstat (limited to 'src/ext')
| -rw-r--r-- | src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | 103 |
1 files changed, 58 insertions, 45 deletions
diff --git a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp index 2a5d839a..84e32867 100644 --- a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp +++ b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | |||
| @@ -242,6 +242,60 @@ public: // IBootstrapperApplication | |||
| 242 | return hr; | 242 | return hr; |
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | virtual STDMETHODIMP OnDetectBegin( | ||
| 246 | __in BOOL fCached, | ||
| 247 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType, | ||
| 248 | __in DWORD cPackages, | ||
| 249 | __inout BOOL* pfCancel | ||
| 250 | ) | ||
| 251 | { | ||
| 252 | HRESULT hr = S_OK; | ||
| 253 | BOOL fInstalled = BOOTSTRAPPER_REGISTRATION_TYPE_FULL == registrationType; | ||
| 254 | |||
| 255 | if (m_fPrereq) | ||
| 256 | { | ||
| 257 | // Pre-req BA should only show help or do an install (to launch the Managed BA which can then do the right action). | ||
| 258 | if (BOOTSTRAPPER_ACTION_HELP != m_command.action) | ||
| 259 | { | ||
| 260 | m_command.action = BOOTSTRAPPER_ACTION_INSTALL; | ||
| 261 | } | ||
| 262 | } | ||
| 263 | else // maybe modify the action state if the bundle is or is not already installed. | ||
| 264 | { | ||
| 265 | if (fInstalled && BOOTSTRAPPER_RESUME_TYPE_REBOOT != m_command.resumeType && BOOTSTRAPPER_ACTION_INSTALL == m_command.action) | ||
| 266 | { | ||
| 267 | m_command.action = BOOTSTRAPPER_ACTION_MODIFY; | ||
| 268 | } | ||
| 269 | else if (!fInstalled && (BOOTSTRAPPER_ACTION_MODIFY == m_command.action || BOOTSTRAPPER_ACTION_REPAIR == m_command.action)) | ||
| 270 | { | ||
| 271 | m_command.action = BOOTSTRAPPER_ACTION_INSTALL; | ||
| 272 | } | ||
| 273 | } | ||
| 274 | |||
| 275 | // When resuming from restart doing some install-like operation, try to find the package that forced the | ||
| 276 | // restart. We'll use this information during planning. | ||
| 277 | if (BOOTSTRAPPER_RESUME_TYPE_REBOOT == m_command.resumeType && BOOTSTRAPPER_ACTION_UNINSTALL < m_command.action) | ||
| 278 | { | ||
| 279 | // Ensure the forced restart package variable is null when it is an empty string. | ||
| 280 | hr = BalGetStringVariable(L"WixBundleForcedRestartPackage", &m_sczAfterForcedRestartPackage); | ||
| 281 | if (FAILED(hr) || !m_sczAfterForcedRestartPackage || !*m_sczAfterForcedRestartPackage) | ||
| 282 | { | ||
| 283 | ReleaseNullStr(m_sczAfterForcedRestartPackage); | ||
| 284 | } | ||
| 285 | |||
| 286 | hr = S_OK; | ||
| 287 | } | ||
| 288 | |||
| 289 | // If the UI should be visible, display it now and hide the splash screen | ||
| 290 | if (BOOTSTRAPPER_DISPLAY_NONE < m_command.display) | ||
| 291 | { | ||
| 292 | ::ShowWindow(m_pTheme->hwndParent, SW_SHOW); | ||
| 293 | } | ||
| 294 | |||
| 295 | m_pEngine->CloseSplashScreen(); | ||
| 296 | |||
| 297 | return __super::OnDetectBegin(fCached, registrationType, cPackages, pfCancel); | ||
| 298 | } | ||
| 245 | 299 | ||
| 246 | virtual STDMETHODIMP OnDetectRelatedBundle( | 300 | virtual STDMETHODIMP OnDetectRelatedBundle( |
| 247 | __in LPCWSTR wzBundleId, | 301 | __in LPCWSTR wzBundleId, |
| @@ -2123,7 +2177,6 @@ public: //CBalBaseBootstrapperApplication | |||
| 2123 | ) | 2177 | ) |
| 2124 | { | 2178 | { |
| 2125 | HRESULT hr = S_OK; | 2179 | HRESULT hr = S_OK; |
| 2126 | LONGLONG llInstalled = 0; | ||
| 2127 | 2180 | ||
| 2128 | hr = __super::Initialize(pCreateArgs); | 2181 | hr = __super::Initialize(pCreateArgs); |
| 2129 | BalExitOnFailure(hr, "CBalBaseBootstrapperApplication initialization failed."); | 2182 | BalExitOnFailure(hr, "CBalBaseBootstrapperApplication initialization failed."); |
| @@ -2132,39 +2185,6 @@ public: //CBalBaseBootstrapperApplication | |||
| 2132 | memcpy_s(&m_createArgs, sizeof(m_createArgs), pCreateArgs, sizeof(BOOTSTRAPPER_CREATE_ARGS)); | 2185 | memcpy_s(&m_createArgs, sizeof(m_createArgs), pCreateArgs, sizeof(BOOTSTRAPPER_CREATE_ARGS)); |
| 2133 | m_createArgs.pCommand = &m_command; | 2186 | m_createArgs.pCommand = &m_command; |
| 2134 | 2187 | ||
| 2135 | if (m_fPrereq) | ||
| 2136 | { | ||
| 2137 | // Pre-req BA should only show help or do an install (to launch the Managed BA which can then do the right action). | ||
| 2138 | if (BOOTSTRAPPER_ACTION_HELP != m_command.action) | ||
| 2139 | { | ||
| 2140 | m_command.action = BOOTSTRAPPER_ACTION_INSTALL; | ||
| 2141 | } | ||
| 2142 | } | ||
| 2143 | else // maybe modify the action state if the bundle is or is not already installed. | ||
| 2144 | { | ||
| 2145 | hr = BalGetNumericVariable(L"WixBundleInstalled", &llInstalled); | ||
| 2146 | if (SUCCEEDED(hr) && BOOTSTRAPPER_RESUME_TYPE_REBOOT != m_command.resumeType && llInstalled && BOOTSTRAPPER_ACTION_INSTALL == m_command.action) | ||
| 2147 | { | ||
| 2148 | m_command.action = BOOTSTRAPPER_ACTION_MODIFY; | ||
| 2149 | } | ||
| 2150 | else if (!llInstalled && (BOOTSTRAPPER_ACTION_MODIFY == m_command.action || BOOTSTRAPPER_ACTION_REPAIR == m_command.action)) | ||
| 2151 | { | ||
| 2152 | m_command.action = BOOTSTRAPPER_ACTION_INSTALL; | ||
| 2153 | } | ||
| 2154 | } | ||
| 2155 | |||
| 2156 | // When resuming from restart doing some install-like operation, try to find the package that forced the | ||
| 2157 | // restart. We'll use this information during planning. | ||
| 2158 | if (BOOTSTRAPPER_RESUME_TYPE_REBOOT == m_command.resumeType && BOOTSTRAPPER_ACTION_UNINSTALL < m_command.action) | ||
| 2159 | { | ||
| 2160 | // Ensure the forced restart package variable is null when it is an empty string. | ||
| 2161 | hr = BalGetStringVariable(L"WixBundleForcedRestartPackage", &m_sczAfterForcedRestartPackage); | ||
| 2162 | if (FAILED(hr) || !m_sczAfterForcedRestartPackage || !*m_sczAfterForcedRestartPackage) | ||
| 2163 | { | ||
| 2164 | ReleaseNullStr(m_sczAfterForcedRestartPackage); | ||
| 2165 | } | ||
| 2166 | } | ||
| 2167 | |||
| 2168 | hr = BalGetStringVariable(L"WixBundleVersion", &m_sczBundleVersion); | 2188 | hr = BalGetStringVariable(L"WixBundleVersion", &m_sczBundleVersion); |
| 2169 | BalExitOnFailure(hr, "CWixStandardBootstrapperApplication initialization failed."); | 2189 | BalExitOnFailure(hr, "CWixStandardBootstrapperApplication initialization failed."); |
| 2170 | 2190 | ||
| @@ -2320,7 +2340,7 @@ private: | |||
| 2320 | BalExitOnFailure(hr, "Failed to read bootstrapper application data."); | 2340 | BalExitOnFailure(hr, "Failed to read bootstrapper application data."); |
| 2321 | } | 2341 | } |
| 2322 | 2342 | ||
| 2323 | if (BOOTSTRAPPER_ACTION_CACHE == m_plannedAction) | 2343 | if (m_fRequestedCacheOnly) |
| 2324 | { | 2344 | { |
| 2325 | if (m_fSupportCacheOnly) | 2345 | if (m_fSupportCacheOnly) |
| 2326 | { | 2346 | { |
| @@ -2335,7 +2355,6 @@ private: | |||
| 2335 | else | 2355 | else |
| 2336 | { | 2356 | { |
| 2337 | BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Ignoring attempt to only cache a bundle that does not explicitly support it."); | 2357 | BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Ignoring attempt to only cache a bundle that does not explicitly support it."); |
| 2338 | m_plannedAction = BOOTSTRAPPER_ACTION_UNKNOWN; | ||
| 2339 | } | 2358 | } |
| 2340 | } | 2359 | } |
| 2341 | 2360 | ||
| @@ -2385,7 +2404,7 @@ private: | |||
| 2385 | } | 2404 | } |
| 2386 | else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"cache", -1)) | 2405 | else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"cache", -1)) |
| 2387 | { | 2406 | { |
| 2388 | m_plannedAction = BOOTSTRAPPER_ACTION_CACHE; | 2407 | m_fRequestedCacheOnly = TRUE; |
| 2389 | } | 2408 | } |
| 2390 | else | 2409 | else |
| 2391 | { | 2410 | { |
| @@ -3227,14 +3246,6 @@ private: | |||
| 3227 | 3246 | ||
| 3228 | SetState(WIXSTDBA_STATE_DETECTING, hr); | 3247 | SetState(WIXSTDBA_STATE_DETECTING, hr); |
| 3229 | 3248 | ||
| 3230 | // If the UI should be visible, display it now and hide the splash screen | ||
| 3231 | if (BOOTSTRAPPER_DISPLAY_NONE < m_command.display) | ||
| 3232 | { | ||
| 3233 | ::ShowWindow(m_pTheme->hwndParent, SW_SHOW); | ||
| 3234 | } | ||
| 3235 | |||
| 3236 | m_pEngine->CloseSplashScreen(); | ||
| 3237 | |||
| 3238 | // Tell the core we're ready for the packages to be processed now. | 3249 | // Tell the core we're ready for the packages to be processed now. |
| 3239 | hr = m_pEngine->Detect(); | 3250 | hr = m_pEngine->Detect(); |
| 3240 | BalExitOnFailure(hr, "Failed to start detecting chain."); | 3251 | BalExitOnFailure(hr, "Failed to start detecting chain."); |
| @@ -4232,6 +4243,7 @@ public: | |||
| 4232 | m_fSuppressDowngradeFailure = FALSE; | 4243 | m_fSuppressDowngradeFailure = FALSE; |
| 4233 | m_fSuppressRepair = FALSE; | 4244 | m_fSuppressRepair = FALSE; |
| 4234 | m_fSupportCacheOnly = FALSE; | 4245 | m_fSupportCacheOnly = FALSE; |
| 4246 | m_fRequestedCacheOnly = FALSE; | ||
| 4235 | 4247 | ||
| 4236 | m_pTaskbarList = NULL; | 4248 | m_pTaskbarList = NULL; |
| 4237 | m_uTaskbarButtonCreatedMessage = UINT_MAX; | 4249 | m_uTaskbarButtonCreatedMessage = UINT_MAX; |
| @@ -4536,6 +4548,7 @@ private: | |||
| 4536 | BOOL m_fSuppressDowngradeFailure; | 4548 | BOOL m_fSuppressDowngradeFailure; |
| 4537 | BOOL m_fSuppressRepair; | 4549 | BOOL m_fSuppressRepair; |
| 4538 | BOOL m_fSupportCacheOnly; | 4550 | BOOL m_fSupportCacheOnly; |
| 4551 | BOOL m_fRequestedCacheOnly; | ||
| 4539 | 4552 | ||
| 4540 | BOOL m_fPrereq; | 4553 | BOOL m_fPrereq; |
| 4541 | BOOL m_fPrereqInstalled; | 4554 | BOOL m_fPrereqInstalled; |
