aboutsummaryrefslogtreecommitdiff
path: root/src/engine/userexperience.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/engine/userexperience.cpp83
1 files changed, 44 insertions, 39 deletions
diff --git a/src/engine/userexperience.cpp b/src/engine/userexperience.cpp
index ea8b8a19..3a36cab6 100644
--- a/src/engine/userexperience.cpp
+++ b/src/engine/userexperience.cpp
@@ -24,6 +24,13 @@ static HRESULT SendBAMessage(
24 __inout LPVOID pvResults 24 __inout LPVOID pvResults
25 ); 25 );
26 26
27static HRESULT SendBAMessageFromInactiveEngine(
28 __in BURN_USER_EXPERIENCE* pUserExperience,
29 __in BOOTSTRAPPER_APPLICATION_MESSAGE message,
30 __in const LPVOID pvArgs,
31 __inout LPVOID pvResults
32 );
33
27 34
28// function definitions 35// function definitions
29 36
@@ -230,51 +237,31 @@ extern "C" int UserExperienceSendError(
230 return nResult; 237 return nResult;
231} 238}
232 239
233extern "C" HRESULT UserExperienceActivateEngine( 240extern "C" void UserExperienceActivateEngine(
234 __in BURN_USER_EXPERIENCE* pUserExperience, 241 __in BURN_USER_EXPERIENCE* pUserExperience
235 __out_opt BOOL* pfActivated
236 ) 242 )
237{ 243{
238 HRESULT hr = S_OK;
239 BOOL fActivated;
240
241 ::EnterCriticalSection(&pUserExperience->csEngineActive); 244 ::EnterCriticalSection(&pUserExperience->csEngineActive);
242 if (InterlockedCompareExchange(reinterpret_cast<LONG*>(&pUserExperience->fEngineActive), TRUE, FALSE)) 245 AssertSz(!pUserExperience->fEngineActive, "Engine should have been deactivated before activating it.");
243 { 246 pUserExperience->fEngineActive = TRUE;
244 AssertSz(FALSE, "Engine should have been deactivated before activating it.");
245
246 fActivated = FALSE;
247 hr = HRESULT_FROM_WIN32(ERROR_INVALID_STATE);
248 }
249 else
250 {
251 fActivated = TRUE;
252 }
253 ::LeaveCriticalSection(&pUserExperience->csEngineActive); 247 ::LeaveCriticalSection(&pUserExperience->csEngineActive);
254
255 if (pfActivated)
256 {
257 *pfActivated = fActivated;
258 }
259 ExitOnRootFailure(hr, "Engine active cannot be changed because it was already in that state.");
260
261LExit:
262 return hr;
263} 248}
264 249
265extern "C" void UserExperienceDeactivateEngine( 250extern "C" void UserExperienceDeactivateEngine(
266 __in BURN_USER_EXPERIENCE* pUserExperience 251 __in BURN_USER_EXPERIENCE* pUserExperience
267 ) 252 )
268{ 253{
269 BOOL fActive = InterlockedExchange(reinterpret_cast<LONG*>(&pUserExperience->fEngineActive), FALSE); 254 ::EnterCriticalSection(&pUserExperience->csEngineActive);
270 fActive = fActive; // prevents warning in "ship" build. 255 AssertSz(pUserExperience->fEngineActive, "Engine should have been active before deactivating it.");
271 AssertSz(fActive, "Engine should have be active before deactivating it."); 256 pUserExperience->fEngineActive = FALSE;
257 ::LeaveCriticalSection(&pUserExperience->csEngineActive);
272} 258}
273 259
274extern "C" HRESULT UserExperienceEnsureEngineInactive( 260extern "C" HRESULT UserExperienceEnsureEngineInactive(
275 __in BURN_USER_EXPERIENCE* pUserExperience 261 __in BURN_USER_EXPERIENCE* pUserExperience
276 ) 262 )
277{ 263{
264 // Make a slight optimization here by ignoring the critical section, because all callers should have needed to enter it for their operation anyway.
278 HRESULT hr = pUserExperience->fEngineActive ? HRESULT_FROM_WIN32(ERROR_BUSY) : S_OK; 265 HRESULT hr = pUserExperience->fEngineActive ? HRESULT_FROM_WIN32(ERROR_BUSY) : S_OK;
279 ExitOnRootFailure(hr, "Engine is active, cannot proceed."); 266 ExitOnRootFailure(hr, "Engine is active, cannot proceed.");
280 267
@@ -346,7 +333,7 @@ EXTERN_C BAAPI UserExperienceOnApplyComplete(
346 results.cbSize = sizeof(results); 333 results.cbSize = sizeof(results);
347 results.action = *pAction; 334 results.action = *pAction;
348 335
349 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYCOMPLETE, &args, &results); 336 hr = SendBAMessageFromInactiveEngine(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYCOMPLETE, &args, &results);
350 ExitOnFailure(hr, "BA OnApplyComplete failed."); 337 ExitOnFailure(hr, "BA OnApplyComplete failed.");
351 338
352 *pAction = results.action; 339 *pAction = results.action;
@@ -761,7 +748,7 @@ EXTERN_C BAAPI UserExperienceOnDetectComplete(
761 748
762 results.cbSize = sizeof(results); 749 results.cbSize = sizeof(results);
763 750
764 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPLETE, &args, &results); 751 hr = SendBAMessageFromInactiveEngine(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPLETE, &args, &results);
765 ExitOnFailure(hr, "BA OnDetectComplete failed."); 752 ExitOnFailure(hr, "BA OnDetectComplete failed.");
766 753
767LExit: 754LExit:
@@ -990,7 +977,7 @@ LExit:
990 977
991EXTERN_C BAAPI UserExperienceOnDetectUpdate( 978EXTERN_C BAAPI UserExperienceOnDetectUpdate(
992 __in BURN_USER_EXPERIENCE* pUserExperience, 979 __in BURN_USER_EXPERIENCE* pUserExperience,
993 __in_z LPCWSTR wzUpdateLocation, 980 __in_z_opt LPCWSTR wzUpdateLocation,
994 __in DWORD64 dw64Size, 981 __in DWORD64 dw64Size,
995 __in VERUTIL_VERSION* pVersion, 982 __in VERUTIL_VERSION* pVersion,
996 __in_z_opt LPCWSTR wzTitle, 983 __in_z_opt LPCWSTR wzTitle,
@@ -1016,7 +1003,7 @@ EXTERN_C BAAPI UserExperienceOnDetectUpdate(
1016 results.cbSize = sizeof(results); 1003 results.cbSize = sizeof(results);
1017 results.fStopProcessingUpdates = *pfStopProcessingUpdates; 1004 results.fStopProcessingUpdates = *pfStopProcessingUpdates;
1018 1005
1019 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATE, &args, &results); 1006 hr = SendBAMessageFromInactiveEngine(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATE, &args, &results);
1020 ExitOnFailure(hr, "BA OnDetectUpdate failed."); 1007 ExitOnFailure(hr, "BA OnDetectUpdate failed.");
1021 1008
1022 if (results.fCancel) 1009 if (results.fCancel)
@@ -1045,7 +1032,7 @@ EXTERN_C BAAPI UserExperienceOnDetectUpdateBegin(
1045 results.cbSize = sizeof(results); 1032 results.cbSize = sizeof(results);
1046 results.fSkip = *pfSkip; 1033 results.fSkip = *pfSkip;
1047 1034
1048 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATEBEGIN, &args, &results); 1035 hr = SendBAMessageFromInactiveEngine(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATEBEGIN, &args, &results);
1049 ExitOnFailure(hr, "BA OnDetectUpdateBegin failed."); 1036 ExitOnFailure(hr, "BA OnDetectUpdateBegin failed.");
1050 1037
1051 if (results.fCancel) 1038 if (results.fCancel)
@@ -1074,7 +1061,7 @@ EXTERN_C BAAPI UserExperienceOnDetectUpdateComplete(
1074 results.cbSize = sizeof(results); 1061 results.cbSize = sizeof(results);
1075 results.fIgnoreError = *pfIgnoreError; 1062 results.fIgnoreError = *pfIgnoreError;
1076 1063
1077 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATECOMPLETE, &args, &results); 1064 hr = SendBAMessageFromInactiveEngine(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATECOMPLETE, &args, &results);
1078 ExitOnFailure(hr, "BA OnDetectUpdateComplete failed."); 1065 ExitOnFailure(hr, "BA OnDetectUpdateComplete failed.");
1079 1066
1080 if (FAILED(hrStatus)) 1067 if (FAILED(hrStatus))
@@ -1124,7 +1111,7 @@ EXTERN_C BAAPI UserExperienceOnElevateComplete(
1124 1111
1125 results.cbSize = sizeof(results); 1112 results.cbSize = sizeof(results);
1126 1113
1127 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATECOMPLETE, &args, &results); 1114 hr = SendBAMessageFromInactiveEngine(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATECOMPLETE, &args, &results);
1128 ExitOnFailure(hr, "BA OnElevateComplete failed."); 1115 ExitOnFailure(hr, "BA OnElevateComplete failed.");
1129 1116
1130LExit: 1117LExit:
@@ -1452,7 +1439,7 @@ EXTERN_C BAAPI UserExperienceOnLaunchApprovedExeComplete(
1452 1439
1453 results.cbSize = sizeof(results); 1440 results.cbSize = sizeof(results);
1454 1441
1455 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE, &args, &results); 1442 hr = SendBAMessageFromInactiveEngine(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE, &args, &results);
1456 ExitOnFailure(hr, "BA OnLaunchApprovedExeComplete failed."); 1443 ExitOnFailure(hr, "BA OnLaunchApprovedExeComplete failed.");
1457 1444
1458LExit: 1445LExit:
@@ -1571,7 +1558,7 @@ EXTERN_C BAAPI UserExperienceOnPlanComplete(
1571 1558
1572 results.cbSize = sizeof(results); 1559 results.cbSize = sizeof(results);
1573 1560
1574 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPLETE, &args, &results); 1561 hr = SendBAMessageFromInactiveEngine(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPLETE, &args, &results);
1575 ExitOnFailure(hr, "BA OnPlanComplete failed."); 1562 ExitOnFailure(hr, "BA OnPlanComplete failed.");
1576 1563
1577LExit: 1564LExit:
@@ -1831,7 +1818,7 @@ EXTERN_C BAAPI UserExperienceOnResolveSource(
1831 results.cbSize = sizeof(results); 1818 results.cbSize = sizeof(results);
1832 results.action = *pAction; 1819 results.action = *pAction;
1833 1820
1834 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONRESOLVESOURCE, &args, &results); 1821 hr = SendBAMessageFromInactiveEngine(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONRESOLVESOURCE, &args, &results);
1835 ExitOnFailure(hr, "BA OnResolveSource failed."); 1822 ExitOnFailure(hr, "BA OnResolveSource failed.");
1836 1823
1837 if (results.fCancel) 1824 if (results.fCancel)
@@ -2317,3 +2304,21 @@ static HRESULT SendBAMessage(
2317 2304
2318 return hr; 2305 return hr;
2319} 2306}
2307
2308static HRESULT SendBAMessageFromInactiveEngine(
2309 __in BURN_USER_EXPERIENCE* pUserExperience,
2310 __in BOOTSTRAPPER_APPLICATION_MESSAGE message,
2311 __in const LPVOID pvArgs,
2312 __inout LPVOID pvResults
2313 )
2314{
2315 HRESULT hr = S_OK;
2316
2317 UserExperienceDeactivateEngine(pUserExperience);
2318
2319 hr = SendBAMessage(pUserExperience, message, pvArgs, pvResults);
2320
2321 UserExperienceActivateEngine(pUserExperience);
2322
2323 return hr;
2324}