diff options
Diffstat (limited to 'src')
22 files changed, 86 insertions, 72 deletions
diff --git a/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h b/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h index 5c6258d0..9a5fb8f8 100644 --- a/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h +++ b/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h | |||
| @@ -642,7 +642,7 @@ struct BA_ONCOMMITMSITRANSACTIONCOMPLETE_RESULTS | |||
| 642 | struct BA_ONDETECTBEGIN_ARGS | 642 | struct BA_ONDETECTBEGIN_ARGS |
| 643 | { | 643 | { |
| 644 | DWORD cbSize; | 644 | DWORD cbSize; |
| 645 | BOOL fInstalled; | 645 | BOOTSTRAPPER_REGISTRATION_TYPE registrationType; |
| 646 | DWORD cPackages; | 646 | DWORD cPackages; |
| 647 | BOOL fCached; | 647 | BOOL fCached; |
| 648 | }; | 648 | }; |
diff --git a/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs b/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs index b08e66c0..1df992be 100644 --- a/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs +++ b/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs | |||
| @@ -1378,9 +1378,9 @@ namespace WixToolset.Mba.Core | |||
| 1378 | return args.HResult; | 1378 | return args.HResult; |
| 1379 | } | 1379 | } |
| 1380 | 1380 | ||
| 1381 | int IBootstrapperApplication.OnDetectBegin(bool fCached, bool fInstalled, int cPackages, ref bool fCancel) | 1381 | int IBootstrapperApplication.OnDetectBegin(bool fCached, RegistrationType registrationType, int cPackages, ref bool fCancel) |
| 1382 | { | 1382 | { |
| 1383 | DetectBeginEventArgs args = new DetectBeginEventArgs(fCached, fInstalled, cPackages, fCancel); | 1383 | DetectBeginEventArgs args = new DetectBeginEventArgs(fCached, registrationType, cPackages, fCancel); |
| 1384 | this.OnDetectBegin(args); | 1384 | this.OnDetectBegin(args); |
| 1385 | 1385 | ||
| 1386 | fCancel = args.Cancel; | 1386 | fCancel = args.Cancel; |
diff --git a/src/api/burn/WixToolset.Mba.Core/EventArgs.cs b/src/api/burn/WixToolset.Mba.Core/EventArgs.cs index 2e1e1be3..816757cc 100644 --- a/src/api/burn/WixToolset.Mba.Core/EventArgs.cs +++ b/src/api/burn/WixToolset.Mba.Core/EventArgs.cs | |||
| @@ -249,11 +249,11 @@ namespace WixToolset.Mba.Core | |||
| 249 | public class DetectBeginEventArgs : CancellableHResultEventArgs | 249 | public class DetectBeginEventArgs : CancellableHResultEventArgs |
| 250 | { | 250 | { |
| 251 | /// <summary /> | 251 | /// <summary /> |
| 252 | public DetectBeginEventArgs(bool cached, bool installed, int packageCount, bool cancelRecommendation) | 252 | public DetectBeginEventArgs(bool cached, RegistrationType registrationType, int packageCount, bool cancelRecommendation) |
| 253 | : base(cancelRecommendation) | 253 | : base(cancelRecommendation) |
| 254 | { | 254 | { |
| 255 | this.Cached = cached; | 255 | this.Cached = cached; |
| 256 | this.Installed = installed; | 256 | this.RegistrationType = registrationType; |
| 257 | this.PackageCount = packageCount; | 257 | this.PackageCount = packageCount; |
| 258 | } | 258 | } |
| 259 | 259 | ||
| @@ -263,9 +263,9 @@ namespace WixToolset.Mba.Core | |||
| 263 | public bool Cached { get; private set; } | 263 | public bool Cached { get; private set; } |
| 264 | 264 | ||
| 265 | /// <summary> | 265 | /// <summary> |
| 266 | /// Gets whether the bundle is installed. | 266 | /// Gets the bundle's registration state. |
| 267 | /// </summary> | 267 | /// </summary> |
| 268 | public bool Installed { get; private set; } | 268 | public RegistrationType RegistrationType { get; private set; } |
| 269 | 269 | ||
| 270 | /// <summary> | 270 | /// <summary> |
| 271 | /// Gets the number of packages to detect. | 271 | /// Gets the number of packages to detect. |
diff --git a/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs b/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs index 4fbe5e18..489e3b6d 100644 --- a/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs +++ b/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs | |||
| @@ -70,7 +70,7 @@ namespace WixToolset.Mba.Core | |||
| 70 | [return: MarshalAs(UnmanagedType.I4)] | 70 | [return: MarshalAs(UnmanagedType.I4)] |
| 71 | int OnDetectBegin( | 71 | int OnDetectBegin( |
| 72 | [MarshalAs(UnmanagedType.Bool)] bool fCached, | 72 | [MarshalAs(UnmanagedType.Bool)] bool fCached, |
| 73 | [MarshalAs(UnmanagedType.Bool)] bool fInstalled, | 73 | [MarshalAs(UnmanagedType.U4)] RegistrationType registrationType, |
| 74 | [MarshalAs(UnmanagedType.U4)] int cPackages, | 74 | [MarshalAs(UnmanagedType.U4)] int cPackages, |
| 75 | [MarshalAs(UnmanagedType.Bool)] ref bool fCancel | 75 | [MarshalAs(UnmanagedType.Bool)] ref bool fCancel |
| 76 | ); | 76 | ); |
diff --git a/src/api/burn/balutil/inc/BalBaseBAFunctions.h b/src/api/burn/balutil/inc/BalBaseBAFunctions.h index e98ebc9f..60a70e3e 100644 --- a/src/api/burn/balutil/inc/BalBaseBAFunctions.h +++ b/src/api/burn/balutil/inc/BalBaseBAFunctions.h | |||
| @@ -108,7 +108,7 @@ public: // IBootstrapperApplication | |||
| 108 | 108 | ||
| 109 | virtual STDMETHODIMP OnDetectBegin( | 109 | virtual STDMETHODIMP OnDetectBegin( |
| 110 | __in BOOL /*fCached*/, | 110 | __in BOOL /*fCached*/, |
| 111 | __in BOOL /*fInstalled*/, | 111 | __in BOOTSTRAPPER_REGISTRATION_TYPE /*registrationType*/, |
| 112 | __in DWORD /*cPackages*/, | 112 | __in DWORD /*cPackages*/, |
| 113 | __inout BOOL* /*pfCancel*/ | 113 | __inout BOOL* /*pfCancel*/ |
| 114 | ) | 114 | ) |
diff --git a/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h b/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h index 6a24f24b..7b3cf827 100644 --- a/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h +++ b/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h | |||
| @@ -109,7 +109,7 @@ public: // IBootstrapperApplication | |||
| 109 | 109 | ||
| 110 | virtual STDMETHODIMP OnDetectBegin( | 110 | virtual STDMETHODIMP OnDetectBegin( |
| 111 | __in BOOL /*fCached*/, | 111 | __in BOOL /*fCached*/, |
| 112 | __in BOOL /*fInstalled*/, | 112 | __in BOOTSTRAPPER_REGISTRATION_TYPE /*registrationType*/, |
| 113 | __in DWORD /*cPackages*/, | 113 | __in DWORD /*cPackages*/, |
| 114 | __inout BOOL* pfCancel | 114 | __inout BOOL* pfCancel |
| 115 | ) | 115 | ) |
diff --git a/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h b/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h index d40390e5..8c3b8b72 100644 --- a/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h +++ b/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h | |||
| @@ -15,7 +15,7 @@ static HRESULT BalBaseBAProcOnDetectBegin( | |||
| 15 | __inout BA_ONDETECTBEGIN_RESULTS* pResults | 15 | __inout BA_ONDETECTBEGIN_RESULTS* pResults |
| 16 | ) | 16 | ) |
| 17 | { | 17 | { |
| 18 | return pBA->OnDetectBegin(pArgs->fCached, pArgs->fInstalled, pArgs->cPackages, &pResults->fCancel); | 18 | return pBA->OnDetectBegin(pArgs->fCached, pArgs->registrationType, pArgs->cPackages, &pResults->fCancel); |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | static HRESULT BalBaseBAProcOnDetectComplete( | 21 | static HRESULT BalBaseBAProcOnDetectComplete( |
diff --git a/src/api/burn/balutil/inc/IBootstrapperApplication.h b/src/api/burn/balutil/inc/IBootstrapperApplication.h index 5932c06e..e916d41e 100644 --- a/src/api/burn/balutil/inc/IBootstrapperApplication.h +++ b/src/api/burn/balutil/inc/IBootstrapperApplication.h | |||
| @@ -42,7 +42,7 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A | |||
| 42 | // OnDetectBegin - called when the engine begins detection. | 42 | // OnDetectBegin - called when the engine begins detection. |
| 43 | STDMETHOD(OnDetectBegin)( | 43 | STDMETHOD(OnDetectBegin)( |
| 44 | __in BOOL fCached, | 44 | __in BOOL fCached, |
| 45 | __in BOOL fInstalled, | 45 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType, |
| 46 | __in DWORD cPackages, | 46 | __in DWORD cPackages, |
| 47 | __inout BOOL* pfCancel | 47 | __inout BOOL* pfCancel |
| 48 | ) = 0; | 48 | ) = 0; |
diff --git a/src/burn/engine/core.cpp b/src/burn/engine/core.cpp index 9d5364a4..ca4d607b 100644 --- a/src/burn/engine/core.cpp +++ b/src/burn/engine/core.cpp | |||
| @@ -315,26 +315,19 @@ extern "C" HRESULT CoreDetect( | |||
| 315 | DetectReset(&pEngineState->registration, &pEngineState->packages); | 315 | DetectReset(&pEngineState->registration, &pEngineState->packages); |
| 316 | PlanReset(&pEngineState->plan, &pEngineState->containers, &pEngineState->packages, &pEngineState->layoutPayloads); | 316 | PlanReset(&pEngineState->plan, &pEngineState->containers, &pEngineState->packages, &pEngineState->layoutPayloads); |
| 317 | 317 | ||
| 318 | // Detect if bundle installed state has changed since start up. This | 318 | // Detect if bundle installed state has changed since start up. |
| 319 | // only happens if Apply() changed the state of bundle (installed or | 319 | // This only happens if Apply() changed the state of bundle (installed, in progress, or uninstalled). |
| 320 | // uninstalled). In that case, Detect() can be used here to reset | 320 | // In that case, Detect() can be used here to reset the installed state. |
| 321 | // the installed state. | 321 | // Of course, there's also cases outside of this bundle's control, |
| 322 | // like other processes messing with its registration. | ||
| 322 | hr = RegistrationDetectInstalled(&pEngineState->registration); | 323 | hr = RegistrationDetectInstalled(&pEngineState->registration); |
| 323 | ExitOnFailure(hr, "Failed to detect bundle install state."); | 324 | ExitOnFailure(hr, "Failed to detect bundle install state."); |
| 324 | 325 | ||
| 325 | if (pEngineState->registration.fInstalled) | 326 | hr = RegistrationSetDynamicVariables(&pEngineState->registration, &pEngineState->variables); |
| 326 | { | 327 | ExitOnFailure(hr, "Failed to reset the dynamic registration variables during detect."); |
| 327 | hr = VariableSetNumeric(&pEngineState->variables, BURN_BUNDLE_INSTALLED, 1, TRUE); | ||
| 328 | ExitOnFailure(hr, "Failed to set the bundle installed built-in variable."); | ||
| 329 | } | ||
| 330 | else | ||
| 331 | { | ||
| 332 | hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_INSTALLED, NULL, TRUE, FALSE); | ||
| 333 | ExitOnFailure(hr, "Failed to unset the bundle installed built-in variable."); | ||
| 334 | } | ||
| 335 | 328 | ||
| 336 | fDetectBegan = TRUE; | 329 | fDetectBegan = TRUE; |
| 337 | hr = UserExperienceOnDetectBegin(&pEngineState->userExperience, pEngineState->registration.fCached, pEngineState->registration.fInstalled, pEngineState->packages.cPackages); | 330 | hr = UserExperienceOnDetectBegin(&pEngineState->userExperience, pEngineState->registration.fCached, pEngineState->registration.detectedRegistrationType, pEngineState->packages.cPackages); |
| 338 | ExitOnRootFailure(hr, "UX aborted detect begin."); | 331 | ExitOnRootFailure(hr, "UX aborted detect begin."); |
| 339 | 332 | ||
| 340 | pEngineState->userExperience.hwndDetect = hwndParent; | 333 | pEngineState->userExperience.hwndDetect = hwndParent; |
| @@ -444,7 +437,7 @@ LExit: | |||
| 444 | 437 | ||
| 445 | pEngineState->userExperience.hwndDetect = NULL; | 438 | pEngineState->userExperience.hwndDetect = NULL; |
| 446 | 439 | ||
| 447 | LogId(REPORT_STANDARD, MSG_DETECT_COMPLETE, hr, !fDetectBegan ? "(failed)" : LoggingBoolToString(pEngineState->registration.fInstalled), !fDetectBegan ? "(failed)" : LoggingBoolToString(pEngineState->registration.fCached), FAILED(hr) ? "(failed)" : LoggingBoolToString(pEngineState->registration.fEligibleForCleanup)); | 440 | LogId(REPORT_STANDARD, MSG_DETECT_COMPLETE, hr, !fDetectBegan ? "(failed)" : LoggingRegistrationTypeToString(pEngineState->registration.detectedRegistrationType), !fDetectBegan ? "(failed)" : LoggingBoolToString(pEngineState->registration.fCached), FAILED(hr) ? "(failed)" : LoggingBoolToString(pEngineState->registration.fEligibleForCleanup)); |
| 448 | 441 | ||
| 449 | return hr; | 442 | return hr; |
| 450 | } | 443 | } |
| @@ -489,7 +482,7 @@ extern "C" HRESULT CorePlan( | |||
| 489 | pEngineState->plan.wzBundleId = pEngineState->registration.sczId; | 482 | pEngineState->plan.wzBundleId = pEngineState->registration.sczId; |
| 490 | pEngineState->plan.wzBundleProviderKey = pEngineState->registration.sczId; | 483 | pEngineState->plan.wzBundleProviderKey = pEngineState->registration.sczId; |
| 491 | pEngineState->plan.fDisableRollback = pEngineState->fDisableRollback || BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL == pEngineState->plan.action; | 484 | pEngineState->plan.fDisableRollback = pEngineState->fDisableRollback || BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL == pEngineState->plan.action; |
| 492 | pEngineState->plan.fBundleAlreadyRegistered = pEngineState->registration.fInstalled; | 485 | pEngineState->plan.fPlanPackageCacheRollback = BOOTSTRAPPER_REGISTRATION_TYPE_NONE == pEngineState->registration.detectedRegistrationType; |
| 493 | 486 | ||
| 494 | hr = PlanSetVariables(action, &pEngineState->variables); | 487 | hr = PlanSetVariables(action, &pEngineState->variables); |
| 495 | ExitOnFailure(hr, "Failed to update action."); | 488 | ExitOnFailure(hr, "Failed to update action."); |
diff --git a/src/burn/engine/detect.cpp b/src/burn/engine/detect.cpp index 3bd39784..f7a030ff 100644 --- a/src/burn/engine/detect.cpp +++ b/src/burn/engine/detect.cpp | |||
| @@ -165,7 +165,7 @@ extern "C" HRESULT DetectReportRelatedBundles( | |||
| 165 | { | 165 | { |
| 166 | HRESULT hr = S_OK; | 166 | HRESULT hr = S_OK; |
| 167 | BOOTSTRAPPER_REQUEST_STATE uninstallRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE; | 167 | BOOTSTRAPPER_REQUEST_STATE uninstallRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE; |
| 168 | *pfEligibleForCleanup = pRegistration->fInstalled || pRegistration->fCached; | 168 | *pfEligibleForCleanup = BOOTSTRAPPER_REGISTRATION_TYPE_NONE != pRegistration->detectedRegistrationType || pRegistration->fCached; |
| 169 | 169 | ||
| 170 | for (DWORD iRelatedBundle = 0; iRelatedBundle < pRegistration->relatedBundles.cRelatedBundles; ++iRelatedBundle) | 170 | for (DWORD iRelatedBundle = 0; iRelatedBundle < pRegistration->relatedBundles.cRelatedBundles; ++iRelatedBundle) |
| 171 | { | 171 | { |
diff --git a/src/burn/engine/engine.mc b/src/burn/engine/engine.mc index 4425af12..6a826365 100644 --- a/src/burn/engine/engine.mc +++ b/src/burn/engine/engine.mc | |||
| @@ -335,7 +335,7 @@ MessageId=199 | |||
| 335 | Severity=Success | 335 | Severity=Success |
| 336 | SymbolicName=MSG_DETECT_COMPLETE | 336 | SymbolicName=MSG_DETECT_COMPLETE |
| 337 | Language=English | 337 | Language=English |
| 338 | Detect complete, result: 0x%1!x!, installed: %2!hs!, cached: %3!hs!, eligible for cleanup: %4!hs! | 338 | Detect complete, result: 0x%1!x!, registration state: %2!hs!, cached: %3!hs!, eligible for cleanup: %4!hs! |
| 339 | . | 339 | . |
| 340 | 340 | ||
| 341 | MessageId=200 | 341 | MessageId=200 |
diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp index 49dd83f4..c9337df5 100644 --- a/src/burn/engine/plan.cpp +++ b/src/burn/engine/plan.cpp | |||
| @@ -1692,7 +1692,7 @@ extern "C" HRESULT PlanExecuteCacheSyncAndRollback( | |||
| 1692 | HRESULT hr = S_OK; | 1692 | HRESULT hr = S_OK; |
| 1693 | BURN_EXECUTE_ACTION* pAction = NULL; | 1693 | BURN_EXECUTE_ACTION* pAction = NULL; |
| 1694 | 1694 | ||
| 1695 | if (!pPlan->fBundleAlreadyRegistered) | 1695 | if (pPlan->fPlanPackageCacheRollback) |
| 1696 | { | 1696 | { |
| 1697 | hr = PlanAppendRollbackAction(pPlan, &pAction); | 1697 | hr = PlanAppendRollbackAction(pPlan, &pAction); |
| 1698 | ExitOnFailure(hr, "Failed to append rollback action."); | 1698 | ExitOnFailure(hr, "Failed to append rollback action."); |
| @@ -2241,7 +2241,7 @@ static HRESULT AddCachePackageHelper( | |||
| 2241 | pCacheAction->type = BURN_CACHE_ACTION_TYPE_CHECKPOINT; | 2241 | pCacheAction->type = BURN_CACHE_ACTION_TYPE_CHECKPOINT; |
| 2242 | pCacheAction->checkpoint.dwId = dwCheckpoint; | 2242 | pCacheAction->checkpoint.dwId = dwCheckpoint; |
| 2243 | 2243 | ||
| 2244 | if (!pPlan->fBundleAlreadyRegistered) | 2244 | if (pPlan->fPlanPackageCacheRollback) |
| 2245 | { | 2245 | { |
| 2246 | // Create a package cache rollback action *before* the checkpoint. | 2246 | // Create a package cache rollback action *before* the checkpoint. |
| 2247 | hr = AppendRollbackCacheAction(pPlan, &pCacheAction); | 2247 | hr = AppendRollbackCacheAction(pPlan, &pCacheAction); |
diff --git a/src/burn/engine/plan.h b/src/burn/engine/plan.h index c0936970..63bcd3ce 100644 --- a/src/burn/engine/plan.h +++ b/src/burn/engine/plan.h | |||
| @@ -249,7 +249,7 @@ typedef struct _BURN_PLAN | |||
| 249 | BOOL fDisableRollback; | 249 | BOOL fDisableRollback; |
| 250 | BOOL fAffectedMachineState; | 250 | BOOL fAffectedMachineState; |
| 251 | LPWSTR sczLayoutDirectory; | 251 | LPWSTR sczLayoutDirectory; |
| 252 | BOOL fBundleAlreadyRegistered; | 252 | BOOL fPlanPackageCacheRollback; |
| 253 | 253 | ||
| 254 | DWORD64 qwCacheSizeTotal; | 254 | DWORD64 qwCacheSizeTotal; |
| 255 | 255 | ||
diff --git a/src/burn/engine/registration.cpp b/src/burn/engine/registration.cpp index a1b1b607..fcefe5e0 100644 --- a/src/burn/engine/registration.cpp +++ b/src/burn/engine/registration.cpp | |||
| @@ -69,6 +69,7 @@ static HRESULT UpdateResumeMode( | |||
| 69 | __in BURN_REGISTRATION* pRegistration, | 69 | __in BURN_REGISTRATION* pRegistration, |
| 70 | __in HKEY hkRegistration, | 70 | __in HKEY hkRegistration, |
| 71 | __in BURN_RESUME_MODE resumeMode, | 71 | __in BURN_RESUME_MODE resumeMode, |
| 72 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType, | ||
| 72 | __in BOOL fRestartInitiated | 73 | __in BOOL fRestartInitiated |
| 73 | ); | 74 | ); |
| 74 | static HRESULT ParseRelatedCodes( | 75 | static HRESULT ParseRelatedCodes( |
| @@ -444,11 +445,8 @@ extern "C" HRESULT RegistrationSetVariables( | |||
| 444 | HRESULT hr = S_OK; | 445 | HRESULT hr = S_OK; |
| 445 | LPWSTR scz = NULL; | 446 | LPWSTR scz = NULL; |
| 446 | 447 | ||
| 447 | if (pRegistration->fInstalled) | 448 | hr = RegistrationSetDynamicVariables(pRegistration, pVariables); |
| 448 | { | 449 | ExitOnFailure(hr, "Failed to set the dynamic registration variables."); |
| 449 | hr = VariableSetNumeric(pVariables, BURN_BUNDLE_INSTALLED, 1, TRUE); | ||
| 450 | ExitOnFailure(hr, "Failed to set the bundle installed built-in variable."); | ||
| 451 | } | ||
| 452 | 450 | ||
| 453 | // Ensure the registration bundle name is updated. | 451 | // Ensure the registration bundle name is updated. |
| 454 | hr = GetBundleInProgressName(pRegistration, pVariables, &scz); | 452 | hr = GetBundleInProgressName(pRegistration, pVariables, &scz); |
| @@ -469,12 +467,32 @@ extern "C" HRESULT RegistrationSetVariables( | |||
| 469 | hr = VariableSetVersion(pVariables, BURN_BUNDLE_VERSION, pRegistration->pVersion, TRUE); | 467 | hr = VariableSetVersion(pVariables, BURN_BUNDLE_VERSION, pRegistration->pVersion, TRUE); |
| 470 | ExitOnFailure(hr, "Failed to overwrite the bundle version built-in variable."); | 468 | ExitOnFailure(hr, "Failed to overwrite the bundle version built-in variable."); |
| 471 | 469 | ||
| 470 | LExit: | ||
| 471 | ReleaseStr(scz); | ||
| 472 | |||
| 473 | return hr; | ||
| 474 | } | ||
| 475 | |||
| 476 | /******************************************************************* | ||
| 477 | RegistrationSetDynamicVariables - Initializes bundle variables that | ||
| 478 | map to registration entities that can change during execution. | ||
| 479 | |||
| 480 | *******************************************************************/ | ||
| 481 | extern "C" HRESULT RegistrationSetDynamicVariables( | ||
| 482 | __in BURN_REGISTRATION* pRegistration, | ||
| 483 | __in BURN_VARIABLES* pVariables | ||
| 484 | ) | ||
| 485 | { | ||
| 486 | HRESULT hr = S_OK; | ||
| 487 | LONGLONG llInstalled = BOOTSTRAPPER_REGISTRATION_TYPE_FULL == pRegistration->detectedRegistrationType ? 1 : 0; | ||
| 488 | |||
| 489 | hr = VariableSetNumeric(pVariables, BURN_BUNDLE_INSTALLED, llInstalled, TRUE); | ||
| 490 | ExitOnFailure(hr, "Failed to set the bundle installed built-in variable."); | ||
| 491 | |||
| 472 | hr = VariableSetNumeric(pVariables, BURN_REBOOT_PENDING, IsWuRebootPending() || IsRegistryRebootPending(), TRUE); | 492 | hr = VariableSetNumeric(pVariables, BURN_REBOOT_PENDING, IsWuRebootPending() || IsRegistryRebootPending(), TRUE); |
| 473 | ExitOnFailure(hr, "Failed to overwrite the bundle reboot-pending built-in variable."); | 493 | ExitOnFailure(hr, "Failed to overwrite the bundle reboot-pending built-in variable."); |
| 474 | 494 | ||
| 475 | LExit: | 495 | LExit: |
| 476 | ReleaseStr(scz); | ||
| 477 | |||
| 478 | return hr; | 496 | return hr; |
| 479 | } | 497 | } |
| 480 | 498 | ||
| @@ -487,12 +505,15 @@ extern "C" HRESULT RegistrationDetectInstalled( | |||
| 487 | DWORD dwInstalled = 0; | 505 | DWORD dwInstalled = 0; |
| 488 | 506 | ||
| 489 | pRegistration->fCached = FileExistsEx(pRegistration->sczCacheExecutablePath, NULL); | 507 | pRegistration->fCached = FileExistsEx(pRegistration->sczCacheExecutablePath, NULL); |
| 508 | pRegistration->detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE; | ||
| 490 | 509 | ||
| 491 | // open registration key | 510 | // open registration key |
| 492 | hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_QUERY_VALUE, &hkRegistration); | 511 | hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_QUERY_VALUE, &hkRegistration); |
| 493 | if (SUCCEEDED(hr)) | 512 | if (SUCCEEDED(hr)) |
| 494 | { | 513 | { |
| 495 | hr = RegReadNumber(hkRegistration, REGISTRY_BUNDLE_INSTALLED, &dwInstalled); | 514 | hr = RegReadNumber(hkRegistration, REGISTRY_BUNDLE_INSTALLED, &dwInstalled); |
| 515 | |||
| 516 | pRegistration->detectedRegistrationType = (1 == dwInstalled) ? BOOTSTRAPPER_REGISTRATION_TYPE_FULL : BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; | ||
| 496 | } | 517 | } |
| 497 | 518 | ||
| 498 | // Not finding the key or value is okay. | 519 | // Not finding the key or value is okay. |
| @@ -501,8 +522,6 @@ extern "C" HRESULT RegistrationDetectInstalled( | |||
| 501 | hr = S_OK; | 522 | hr = S_OK; |
| 502 | } | 523 | } |
| 503 | 524 | ||
| 504 | pRegistration->fInstalled = (1 == dwInstalled); | ||
| 505 | |||
| 506 | ReleaseRegKey(hkRegistration); | 525 | ReleaseRegKey(hkRegistration); |
| 507 | return hr; | 526 | return hr; |
| 508 | } | 527 | } |
| @@ -833,7 +852,7 @@ extern "C" HRESULT RegistrationSessionBegin( | |||
| 833 | } | 852 | } |
| 834 | 853 | ||
| 835 | // update resume mode | 854 | // update resume mode |
| 836 | hr = UpdateResumeMode(pRegistration, hkRegistration, BURN_RESUME_MODE_ACTIVE, FALSE); | 855 | hr = UpdateResumeMode(pRegistration, hkRegistration, BURN_RESUME_MODE_ACTIVE, registrationType, FALSE); |
| 837 | ExitOnFailure(hr, "Failed to update resume mode."); | 856 | ExitOnFailure(hr, "Failed to update resume mode."); |
| 838 | 857 | ||
| 839 | LExit: | 858 | LExit: |
| @@ -864,7 +883,7 @@ extern "C" HRESULT RegistrationSessionResume( | |||
| 864 | ExitOnFailure(hr, "Failed to open registration key."); | 883 | ExitOnFailure(hr, "Failed to open registration key."); |
| 865 | 884 | ||
| 866 | // update resume mode | 885 | // update resume mode |
| 867 | hr = UpdateResumeMode(pRegistration, hkRegistration, BURN_RESUME_MODE_ACTIVE, FALSE); | 886 | hr = UpdateResumeMode(pRegistration, hkRegistration, BURN_RESUME_MODE_ACTIVE, registrationType, FALSE); |
| 868 | ExitOnFailure(hr, "Failed to update resume mode."); | 887 | ExitOnFailure(hr, "Failed to update resume mode."); |
| 869 | 888 | ||
| 870 | // update display name | 889 | // update display name |
| @@ -934,7 +953,7 @@ extern "C" HRESULT RegistrationSessionEnd( | |||
| 934 | } | 953 | } |
| 935 | 954 | ||
| 936 | // Update resume mode. | 955 | // Update resume mode. |
| 937 | hr = UpdateResumeMode(pRegistration, hkRegistration, resumeMode, BOOTSTRAPPER_APPLY_RESTART_INITIATED == restart); | 956 | hr = UpdateResumeMode(pRegistration, hkRegistration, resumeMode, registrationType, BOOTSTRAPPER_APPLY_RESTART_INITIATED == restart); |
| 938 | ExitOnFailure(hr, "Failed to update resume mode."); | 957 | ExitOnFailure(hr, "Failed to update resume mode."); |
| 939 | 958 | ||
| 940 | LExit: | 959 | LExit: |
| @@ -1271,6 +1290,7 @@ static HRESULT UpdateResumeMode( | |||
| 1271 | __in BURN_REGISTRATION* pRegistration, | 1290 | __in BURN_REGISTRATION* pRegistration, |
| 1272 | __in HKEY hkRegistration, | 1291 | __in HKEY hkRegistration, |
| 1273 | __in BURN_RESUME_MODE resumeMode, | 1292 | __in BURN_RESUME_MODE resumeMode, |
| 1293 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType, | ||
| 1274 | __in BOOL fRestartInitiated | 1294 | __in BOOL fRestartInitiated |
| 1275 | ) | 1295 | ) |
| 1276 | { | 1296 | { |
| @@ -1289,16 +1309,9 @@ static HRESULT UpdateResumeMode( | |||
| 1289 | hr = RegWriteNumber(hkRegistration, L"Resume", (DWORD)resumeMode); | 1309 | hr = RegWriteNumber(hkRegistration, L"Resume", (DWORD)resumeMode); |
| 1290 | ExitOnFailure(hr, "Failed to write Resume value."); | 1310 | ExitOnFailure(hr, "Failed to write Resume value."); |
| 1291 | 1311 | ||
| 1292 | // Write the Installed value *only* when the mode is ARP. This will tell us | 1312 | // Write Installed value. |
| 1293 | // that the bundle considers itself "installed" on the machine. Note that we | 1313 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_INSTALLED, BOOTSTRAPPER_REGISTRATION_TYPE_FULL == registrationType ? 1 : 0); |
| 1294 | // never change the value to "0" after that. The bundle will be considered | 1314 | ExitOnFailure(hr, "Failed to write Installed value."); |
| 1295 | // "uninstalled" when all of the registration is removed. | ||
| 1296 | if (BURN_RESUME_MODE_ARP == resumeMode) | ||
| 1297 | { | ||
| 1298 | // Write Installed value. | ||
| 1299 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_INSTALLED, 1); | ||
| 1300 | ExitOnFailure(hr, "Failed to write Installed value."); | ||
| 1301 | } | ||
| 1302 | } | 1315 | } |
| 1303 | 1316 | ||
| 1304 | // If the engine is active write the run key so we resume if there is an unexpected | 1317 | // If the engine is active write the run key so we resume if there is an unexpected |
diff --git a/src/burn/engine/registration.h b/src/burn/engine/registration.h index 64191828..bfaab1f1 100644 --- a/src/burn/engine/registration.h +++ b/src/burn/engine/registration.h | |||
| @@ -93,7 +93,7 @@ typedef struct _BURN_REGISTRATION | |||
| 93 | BOOL fRegisterArp; | 93 | BOOL fRegisterArp; |
| 94 | BOOL fDisableResume; | 94 | BOOL fDisableResume; |
| 95 | BOOL fCached; | 95 | BOOL fCached; |
| 96 | BOOL fInstalled; | 96 | BOOTSTRAPPER_REGISTRATION_TYPE detectedRegistrationType; |
| 97 | LPWSTR sczId; | 97 | LPWSTR sczId; |
| 98 | LPWSTR sczTag; | 98 | LPWSTR sczTag; |
| 99 | 99 | ||
| @@ -171,6 +171,10 @@ HRESULT RegistrationSetVariables( | |||
| 171 | __in BURN_REGISTRATION* pRegistration, | 171 | __in BURN_REGISTRATION* pRegistration, |
| 172 | __in BURN_VARIABLES* pVariables | 172 | __in BURN_VARIABLES* pVariables |
| 173 | ); | 173 | ); |
| 174 | HRESULT RegistrationSetDynamicVariables( | ||
| 175 | __in BURN_REGISTRATION* pRegistration, | ||
| 176 | __in BURN_VARIABLES* pVariables | ||
| 177 | ); | ||
| 174 | HRESULT RegistrationDetectInstalled( | 178 | HRESULT RegistrationDetectInstalled( |
| 175 | __in BURN_REGISTRATION* pRegistration | 179 | __in BURN_REGISTRATION* pRegistration |
| 176 | ); | 180 | ); |
diff --git a/src/burn/engine/userexperience.cpp b/src/burn/engine/userexperience.cpp index a2f33f80..f299772b 100644 --- a/src/burn/engine/userexperience.cpp +++ b/src/burn/engine/userexperience.cpp | |||
| @@ -104,7 +104,7 @@ extern "C" HRESULT UserExperienceLoad( | |||
| 104 | args.pCommand = pCommand; | 104 | args.pCommand = pCommand; |
| 105 | args.pfnBootstrapperEngineProc = EngineForApplicationProc; | 105 | args.pfnBootstrapperEngineProc = EngineForApplicationProc; |
| 106 | args.pvBootstrapperEngineProcContext = pEngineContext; | 106 | args.pvBootstrapperEngineProcContext = pEngineContext; |
| 107 | args.qwEngineAPIVersion = MAKEQWORDVERSION(2022, 2, 22, 0); | 107 | args.qwEngineAPIVersion = MAKEQWORDVERSION(2022, 3, 4, 0); |
| 108 | 108 | ||
| 109 | results.cbSize = sizeof(BOOTSTRAPPER_CREATE_RESULTS); | 109 | results.cbSize = sizeof(BOOTSTRAPPER_CREATE_RESULTS); |
| 110 | 110 | ||
| @@ -988,7 +988,7 @@ LExit: | |||
| 988 | EXTERN_C BAAPI UserExperienceOnDetectBegin( | 988 | EXTERN_C BAAPI UserExperienceOnDetectBegin( |
| 989 | __in BURN_USER_EXPERIENCE* pUserExperience, | 989 | __in BURN_USER_EXPERIENCE* pUserExperience, |
| 990 | __in BOOL fCached, | 990 | __in BOOL fCached, |
| 991 | __in BOOL fInstalled, | 991 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType, |
| 992 | __in DWORD cPackages | 992 | __in DWORD cPackages |
| 993 | ) | 993 | ) |
| 994 | { | 994 | { |
| @@ -998,7 +998,7 @@ EXTERN_C BAAPI UserExperienceOnDetectBegin( | |||
| 998 | 998 | ||
| 999 | args.cbSize = sizeof(args); | 999 | args.cbSize = sizeof(args); |
| 1000 | args.cPackages = cPackages; | 1000 | args.cPackages = cPackages; |
| 1001 | args.fInstalled = fInstalled; | 1001 | args.registrationType = registrationType; |
| 1002 | args.fCached = fCached; | 1002 | args.fCached = fCached; |
| 1003 | 1003 | ||
| 1004 | results.cbSize = sizeof(results); | 1004 | results.cbSize = sizeof(results); |
diff --git a/src/burn/engine/userexperience.h b/src/burn/engine/userexperience.h index 8106d7f7..37fa5174 100644 --- a/src/burn/engine/userexperience.h +++ b/src/burn/engine/userexperience.h | |||
| @@ -245,7 +245,7 @@ BAAPI UserExperienceOnCommitMsiTransactionComplete( | |||
| 245 | BAAPI UserExperienceOnDetectBegin( | 245 | BAAPI UserExperienceOnDetectBegin( |
| 246 | __in BURN_USER_EXPERIENCE* pUserExperience, | 246 | __in BURN_USER_EXPERIENCE* pUserExperience, |
| 247 | __in BOOL fCached, | 247 | __in BOOL fCached, |
| 248 | __in BOOL fInstalled, | 248 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType, |
| 249 | __in DWORD cPackages | 249 | __in DWORD cPackages |
| 250 | ); | 250 | ); |
| 251 | BAAPI UserExperienceOnDetectCompatibleMsiPackage( | 251 | BAAPI UserExperienceOnDetectCompatibleMsiPackage( |
diff --git a/src/burn/engine/variable.cpp b/src/burn/engine/variable.cpp index b3dcdb7d..5d92590c 100644 --- a/src/burn/engine/variable.cpp +++ b/src/burn/engine/variable.cpp | |||
| @@ -248,6 +248,7 @@ extern "C" HRESULT VariableInitialize( | |||
| 248 | #endif | 248 | #endif |
| 249 | {L"ProgramFiles6432Folder", InitializeVariable6432Folder, CSIDL_PROGRAM_FILES}, | 249 | {L"ProgramFiles6432Folder", InitializeVariable6432Folder, CSIDL_PROGRAM_FILES}, |
| 250 | {L"ProgramMenuFolder", InitializeVariableCsidlFolder, CSIDL_PROGRAMS}, | 250 | {L"ProgramMenuFolder", InitializeVariableCsidlFolder, CSIDL_PROGRAMS}, |
| 251 | {L"RebootPending", InitializeVariableNumeric, 0}, | ||
| 251 | {L"SendToFolder", InitializeVariableCsidlFolder, CSIDL_SENDTO}, | 252 | {L"SendToFolder", InitializeVariableCsidlFolder, CSIDL_SENDTO}, |
| 252 | {L"ServicePackLevel", InitializeVariableVersionNT, OS_INFO_VARIABLE_ServicePackLevel}, | 253 | {L"ServicePackLevel", InitializeVariableVersionNT, OS_INFO_VARIABLE_ServicePackLevel}, |
| 253 | {L"StartMenuFolder", InitializeVariableCsidlFolder, CSIDL_STARTMENU}, | 254 | {L"StartMenuFolder", InitializeVariableCsidlFolder, CSIDL_STARTMENU}, |
| @@ -1571,6 +1572,9 @@ static HRESULT SetVariableValue( | |||
| 1571 | // Insert element if not found. | 1572 | // Insert element if not found. |
| 1572 | if (S_FALSE == hr) | 1573 | if (S_FALSE == hr) |
| 1573 | { | 1574 | { |
| 1575 | // Not possible from external callers so just assert. | ||
| 1576 | AssertSz(SET_VARIABLE_OVERRIDE_BUILTIN != setBuiltin, "Intent to set missing built-in variable."); | ||
| 1577 | |||
| 1574 | hr = InsertVariable(pVariables, wzVariable, iVariable); | 1578 | hr = InsertVariable(pVariables, wzVariable, iVariable); |
| 1575 | ExitOnFailure(hr, "Failed to insert variable '%ls'.", wzVariable); | 1579 | ExitOnFailure(hr, "Failed to insert variable '%ls'.", wzVariable); |
| 1576 | } | 1580 | } |
diff --git a/src/burn/test/BurnUnitTest/PlanTest.cpp b/src/burn/test/BurnUnitTest/PlanTest.cpp index ba28713f..685d2ca9 100644 --- a/src/burn/test/BurnUnitTest/PlanTest.cpp +++ b/src/burn/test/BurnUnitTest/PlanTest.cpp | |||
| @@ -792,7 +792,7 @@ namespace Bootstrapper | |||
| 792 | InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState); | 792 | InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState); |
| 793 | DetectPackagesAsAbsent(pEngineState); | 793 | DetectPackagesAsAbsent(pEngineState); |
| 794 | 794 | ||
| 795 | pEngineState->registration.fInstalled = TRUE; | 795 | pEngineState->registration.detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL; |
| 796 | 796 | ||
| 797 | hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_MODIFY); | 797 | hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_MODIFY); |
| 798 | NativeAssert::Succeeded(hr, "CorePlan failed"); | 798 | NativeAssert::Succeeded(hr, "CorePlan failed"); |
| @@ -1457,7 +1457,7 @@ namespace Bootstrapper | |||
| 1457 | { | 1457 | { |
| 1458 | PlanTestDetect(pEngineState); | 1458 | PlanTestDetect(pEngineState); |
| 1459 | 1459 | ||
| 1460 | pEngineState->registration.fInstalled = TRUE; | 1460 | pEngineState->registration.detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL; |
| 1461 | 1461 | ||
| 1462 | for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i) | 1462 | for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i) |
| 1463 | { | 1463 | { |
| @@ -1486,7 +1486,7 @@ namespace Bootstrapper | |||
| 1486 | { | 1486 | { |
| 1487 | PlanTestDetect(pEngineState); | 1487 | PlanTestDetect(pEngineState); |
| 1488 | 1488 | ||
| 1489 | pEngineState->registration.fInstalled = TRUE; | 1489 | pEngineState->registration.detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL; |
| 1490 | 1490 | ||
| 1491 | for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i) | 1491 | for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i) |
| 1492 | { | 1492 | { |
diff --git a/src/burn/test/BurnUnitTest/RegistrationTest.cpp b/src/burn/test/BurnUnitTest/RegistrationTest.cpp index 6a10961d..86ea86b0 100644 --- a/src/burn/test/BurnUnitTest/RegistrationTest.cpp +++ b/src/burn/test/BurnUnitTest/RegistrationTest.cpp | |||
| @@ -218,7 +218,7 @@ namespace Bootstrapper | |||
| 218 | 218 | ||
| 219 | // verify that registration was updated | 219 | // verify that registration was updated |
| 220 | this->ValidateUninstallKeyResume(Int32(BURN_RESUME_MODE_ARP)); | 220 | this->ValidateUninstallKeyResume(Int32(BURN_RESUME_MODE_ARP)); |
| 221 | this->ValidateUninstallKeyInstalled(1); | 221 | this->ValidateUninstallKeyInstalled(0); |
| 222 | this->ValidateRunOnceKeyString(TEST_BUNDLE_ID, nullptr); | 222 | this->ValidateRunOnceKeyString(TEST_BUNDLE_ID, nullptr); |
| 223 | 223 | ||
| 224 | // | 224 | // |
| @@ -231,7 +231,7 @@ namespace Bootstrapper | |||
| 231 | 231 | ||
| 232 | // verify that registration was updated | 232 | // verify that registration was updated |
| 233 | this->ValidateUninstallKeyResume(Int32(BURN_RESUME_MODE_ACTIVE)); | 233 | this->ValidateUninstallKeyResume(Int32(BURN_RESUME_MODE_ACTIVE)); |
| 234 | this->ValidateUninstallKeyInstalled(1); | 234 | this->ValidateUninstallKeyInstalled(0); |
| 235 | this->ValidateRunOnceKeyEntry(cacheExePath); | 235 | this->ValidateRunOnceKeyEntry(cacheExePath); |
| 236 | 236 | ||
| 237 | // delete registration | 237 | // delete registration |
| @@ -337,7 +337,7 @@ namespace Bootstrapper | |||
| 337 | 337 | ||
| 338 | // verify that registration variables were updated | 338 | // verify that registration variables were updated |
| 339 | this->ValidateUninstallKeyDisplayName(L"Product1"); | 339 | this->ValidateUninstallKeyDisplayName(L"Product1"); |
| 340 | registration.fInstalled = TRUE; | 340 | registration.detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL; |
| 341 | 341 | ||
| 342 | hr = RegistrationSetVariables(®istration, &variables); | 342 | hr = RegistrationSetVariables(®istration, &variables); |
| 343 | TestThrowOnFailure(hr, L"Failed to set registration variables."); | 343 | TestThrowOnFailure(hr, L"Failed to set registration variables."); |
diff --git a/src/ext/Bal/Samples/bafunctions/WixSampleBAFunctions.cpp b/src/ext/Bal/Samples/bafunctions/WixSampleBAFunctions.cpp index 870b219b..5383efbf 100644 --- a/src/ext/Bal/Samples/bafunctions/WixSampleBAFunctions.cpp +++ b/src/ext/Bal/Samples/bafunctions/WixSampleBAFunctions.cpp | |||
| @@ -9,14 +9,14 @@ class CWixSampleBAFunctions : public CBalBaseBAFunctions | |||
| 9 | public: // IBootstrapperApplication | 9 | public: // IBootstrapperApplication |
| 10 | virtual STDMETHODIMP OnDetectBegin( | 10 | virtual STDMETHODIMP OnDetectBegin( |
| 11 | __in BOOL fCached, | 11 | __in BOOL fCached, |
| 12 | __in BOOL fInstalled, | 12 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType, |
| 13 | __in DWORD cPackages, | 13 | __in DWORD cPackages, |
| 14 | __inout BOOL* pfCancel | 14 | __inout BOOL* pfCancel |
| 15 | ) | 15 | ) |
| 16 | { | 16 | { |
| 17 | HRESULT hr = S_OK; | 17 | HRESULT hr = S_OK; |
| 18 | 18 | ||
| 19 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Running detect begin BA function. fCached=%d, fInstalled=%d, cPackages=%u, fCancel=%d", fCached, fInstalled, cPackages, *pfCancel); | 19 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Running detect begin BA function. fCached=%d, registrationType=%d, cPackages=%u, fCancel=%d", fCached, registrationType, cPackages, *pfCancel); |
| 20 | 20 | ||
| 21 | //------------------------------------------------------------------------------------------------- | 21 | //------------------------------------------------------------------------------------------------- |
| 22 | // YOUR CODE GOES HERE | 22 | // YOUR CODE GOES HERE |
diff --git a/src/test/burn/WixToolset.WixBA/InstallationViewModel.cs b/src/test/burn/WixToolset.WixBA/InstallationViewModel.cs index e056b943..3a71779a 100644 --- a/src/test/burn/WixToolset.WixBA/InstallationViewModel.cs +++ b/src/test/burn/WixToolset.WixBA/InstallationViewModel.cs | |||
| @@ -53,9 +53,9 @@ namespace WixToolset.WixBA | |||
| 53 | /// </summary> | 53 | /// </summary> |
| 54 | public class InstallationViewModel : PropertyNotifyBase | 54 | public class InstallationViewModel : PropertyNotifyBase |
| 55 | { | 55 | { |
| 56 | private RootViewModel root; | 56 | private readonly RootViewModel root; |
| 57 | 57 | ||
| 58 | private Dictionary<string, int> downloadRetries; | 58 | private readonly Dictionary<string, int> downloadRetries; |
| 59 | private bool downgrade; | 59 | private bool downgrade; |
| 60 | private string downgradeMessage; | 60 | private string downgradeMessage; |
| 61 | 61 | ||
| @@ -407,7 +407,7 @@ namespace WixToolset.WixBA | |||
| 407 | 407 | ||
| 408 | private void DetectBegin(object sender, DetectBeginEventArgs e) | 408 | private void DetectBegin(object sender, DetectBeginEventArgs e) |
| 409 | { | 409 | { |
| 410 | this.root.DetectState = e.Installed ? DetectionState.Present : DetectionState.Absent; | 410 | this.root.DetectState = RegistrationType.Full == e.RegistrationType ? DetectionState.Present : DetectionState.Absent; |
| 411 | WixBA.Model.PlannedAction = LaunchAction.Unknown; | 411 | WixBA.Model.PlannedAction = LaunchAction.Unknown; |
| 412 | } | 412 | } |
| 413 | 413 | ||
