From 0042e3d4554a0d92e1da6141854b0f1aafa07d5b Mon Sep 17 00:00:00 2001 From: Nir Bar Date: Wed, 11 Aug 2021 15:37:34 -0500 Subject: Allow BA to opt out of MSI transaction. --- .../inc/BootstrapperApplication.h | 15 ++++++++++ .../WixToolset.Mba.Core/BootstrapperApplication.cs | 25 ++++++++++++++++ src/api/burn/WixToolset.Mba.Core/EventArgs.cs | 33 ++++++++++++++++++++++ .../IBootstrapperApplication.cs | 12 ++++++++ .../IDefaultBootstrapperApplication.cs | 5 ++++ src/api/burn/balutil/inc/BAFunctions.h | 1 + src/api/burn/balutil/inc/BalBaseBAFunctions.h | 10 +++++++ src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h | 8 ++++++ .../balutil/inc/BalBaseBootstrapperApplication.h | 11 ++++++++ .../inc/BalBaseBootstrapperApplicationProc.h | 12 ++++++++ .../burn/balutil/inc/IBootstrapperApplication.h | 8 ++++++ 11 files changed, 140 insertions(+) (limited to 'src/api') diff --git a/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h b/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h index 8301d45f..b7dc17c2 100644 --- a/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h +++ b/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h @@ -189,6 +189,7 @@ enum BOOTSTRAPPER_APPLICATION_MESSAGE BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTBEGIN, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTCOMPLETE, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTPROGRESS, + BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANROLLBACKBOUNDARY, }; enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION @@ -1129,6 +1130,20 @@ struct BA_ONPLANRELATEDBUNDLE_RESULTS BOOTSTRAPPER_REQUEST_STATE requestedState; }; +struct BA_ONPLANROLLBACKBOUNDARY_ARGS +{ + DWORD cbSize; + LPCWSTR wzRollbackBoundaryId; + BOOL fRecommendedTransaction; +}; + +struct BA_ONPLANROLLBACKBOUNDARY_RESULTS +{ + DWORD cbSize; + BOOL fTransaction; + BOOL fCancel; +}; + struct BA_ONPLANPATCHTARGET_ARGS { DWORD cbSize; diff --git a/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs b/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs index d7dbf04c..b6fdca1e 100644 --- a/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs +++ b/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs @@ -85,6 +85,9 @@ namespace WixToolset.Mba.Core /// public event EventHandler PlanRelatedBundle; + /// + public event EventHandler PlanRollbackBoundary; + /// public event EventHandler PlanPackageBegin; @@ -496,6 +499,18 @@ namespace WixToolset.Mba.Core } } + /// + /// Called by the engine, raises the event. + /// + protected virtual void OnPlanRollbackBoundary(PlanRollbackBoundaryEventArgs args) + { + EventHandler handler = this.PlanRollbackBoundary; + if (null != handler) + { + handler(this, args); + } + } + /// /// Called by the engine, raises the event. /// @@ -1378,6 +1393,16 @@ namespace WixToolset.Mba.Core return args.HResult; } + int IBootstrapperApplication.OnPlanRollbackBoundary(string wzRollbackBoundaryId, bool fRecommendedTransaction, ref bool fTransaction, ref bool fCancel) + { + PlanRollbackBoundaryEventArgs args = new PlanRollbackBoundaryEventArgs(wzRollbackBoundaryId, fRecommendedTransaction, fTransaction, fCancel); + this.OnPlanRollbackBoundary(args); + + fTransaction = args.Transaction; + fCancel = args.Cancel; + return args.HResult; + } + int IBootstrapperApplication.OnPlanPackageBegin(string wzPackageId, PackageState state, bool fCached, BOOTSTRAPPER_PACKAGE_CONDITION_RESULT installCondition, RequestState recommendedState, BOOTSTRAPPER_CACHE_TYPE recommendedCacheType, ref RequestState pRequestedState, ref BOOTSTRAPPER_CACHE_TYPE pRequestedCacheType, ref bool fCancel) { PlanPackageBeginEventArgs args = new PlanPackageBeginEventArgs(wzPackageId, state, fCached, installCondition, recommendedState, recommendedCacheType, pRequestedState, pRequestedCacheType, fCancel); diff --git a/src/api/burn/WixToolset.Mba.Core/EventArgs.cs b/src/api/burn/WixToolset.Mba.Core/EventArgs.cs index 00d90c83..04e7b579 100644 --- a/src/api/burn/WixToolset.Mba.Core/EventArgs.cs +++ b/src/api/burn/WixToolset.Mba.Core/EventArgs.cs @@ -781,6 +781,39 @@ namespace WixToolset.Mba.Core public BOOTSTRAPPER_CACHE_TYPE CacheType { get; set; } } + /// + /// Event arguments for + /// + [Serializable] + public class PlanRollbackBoundaryEventArgs : CancellableHResultEventArgs + { + /// + public PlanRollbackBoundaryEventArgs(string rollbackBoundaryId, bool recommendedTransaction, bool transaction, bool cancelRecommendation) + : base(cancelRecommendation) + { + this.RollbackBoundaryId = rollbackBoundaryId; + this.RecommendedTransaction = recommendedTransaction; + this.Transaction = transaction; + } + + /// + /// Gets the identity of the rollback boundary to plan for. + /// + public string RollbackBoundaryId { get; private set; } + + /// + /// Whether or not the rollback boundary was authored to use an MSI transaction. + /// + public bool RecommendedTransaction { get; private set; } + + /// + /// Whether or not an MSI transaction will be used in the rollback boundary. + /// If is false, setting the value to true has no effect. + /// If is true, setting the value to false will cause the packages inside this rollback boundary to be executed without a wrapping MSI transaction. + /// + public bool Transaction { get; set; } + } + /// /// Event arguments for /// diff --git a/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs b/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs index e6e03906..07c1a23b 100644 --- a/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs +++ b/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs @@ -303,6 +303,18 @@ namespace WixToolset.Mba.Core [MarshalAs(UnmanagedType.Bool)] ref bool fCancel ); + /// + /// See . + /// + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnPlanRollbackBoundary( + [MarshalAs(UnmanagedType.LPWStr)] string wzRollbackBoundaryId, + [MarshalAs(UnmanagedType.Bool)] bool fRecommendedTransaction, + [MarshalAs(UnmanagedType.Bool)] ref bool fTransaction, + [MarshalAs(UnmanagedType.Bool)] ref bool fCancel + ); + /// /// See . /// diff --git a/src/api/burn/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs b/src/api/burn/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs index a295f6c0..20ce9f88 100644 --- a/src/api/burn/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs +++ b/src/api/burn/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs @@ -313,6 +313,11 @@ namespace WixToolset.Mba.Core /// event EventHandler PlanRelatedBundle; + /// + /// Fired when the engine is planning a rollback boundary. + /// + event EventHandler PlanRollbackBoundary; + /// /// Fired when the engine has changed progress for the bundle installation. /// diff --git a/src/api/burn/balutil/inc/BAFunctions.h b/src/api/burn/balutil/inc/BAFunctions.h index 2970478f..43786701 100644 --- a/src/api/burn/balutil/inc/BAFunctions.h +++ b/src/api/burn/balutil/inc/BAFunctions.h @@ -81,6 +81,7 @@ enum BA_FUNCTIONS_MESSAGE BA_FUNCTIONS_MESSAGE_ONCACHEPAYLOADEXTRACTBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTBEGIN, BA_FUNCTIONS_MESSAGE_ONCACHEPAYLOADEXTRACTCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTCOMPLETE, BA_FUNCTIONS_MESSAGE_ONCACHEPAYLOADEXTRACTPROGRESS = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTPROGRESS, + BA_FUNCTIONS_MESSAGE_ONPLANROLLBACKBOUNDARY = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANROLLBACKBOUNDARY, BA_FUNCTIONS_MESSAGE_ONTHEMELOADED = 1024, BA_FUNCTIONS_MESSAGE_WNDPROC, diff --git a/src/api/burn/balutil/inc/BalBaseBAFunctions.h b/src/api/burn/balutil/inc/BalBaseBAFunctions.h index c5771efc..a3054709 100644 --- a/src/api/burn/balutil/inc/BalBaseBAFunctions.h +++ b/src/api/burn/balutil/inc/BalBaseBAFunctions.h @@ -255,6 +255,16 @@ public: // IBootstrapperApplication return S_OK; } + virtual STDMETHODIMP OnPlanRollbackBoundary( + __in_z LPCWSTR /*wzRollbackBoundaryId*/, + __in BOOL /*fRecommendedTransaction*/, + __inout BOOL* /*pfTransaction*/, + __inout BOOL* /*pfCancel*/ + ) + { + return S_OK; + } + virtual STDMETHODIMP OnPlanPackageBegin( __in_z LPCWSTR /*wzPackageId*/, __in BOOTSTRAPPER_PACKAGE_STATE /*state*/, diff --git a/src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h b/src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h index 7e89fe83..8d1227fc 100644 --- a/src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h +++ b/src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h @@ -109,6 +109,14 @@ static HRESULT WINAPI BalBaseBAFunctionsProc( case BA_FUNCTIONS_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE: case BA_FUNCTIONS_MESSAGE_ONPLANNEDPACKAGE: case BA_FUNCTIONS_MESSAGE_ONPLANFORWARDCOMPATIBLEBUNDLE: + case BA_FUNCTIONS_MESSAGE_ONCACHEVERIFYPROGRESS: + case BA_FUNCTIONS_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYBEGIN: + case BA_FUNCTIONS_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE: + case BA_FUNCTIONS_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS: + case BA_FUNCTIONS_MESSAGE_ONCACHEPAYLOADEXTRACTBEGIN: + case BA_FUNCTIONS_MESSAGE_ONCACHEPAYLOADEXTRACTCOMPLETE: + case BA_FUNCTIONS_MESSAGE_ONCACHEPAYLOADEXTRACTPROGRESS: + case BA_FUNCTIONS_MESSAGE_ONPLANROLLBACKBOUNDARY: hr = BalBaseBootstrapperApplicationProc((BOOTSTRAPPER_APPLICATION_MESSAGE)message, pvArgs, pvResults, pvContext); break; case BA_FUNCTIONS_MESSAGE_ONTHEMELOADED: diff --git a/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h b/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h index 53fa369b..4c07ba89 100644 --- a/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h +++ b/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h @@ -264,6 +264,17 @@ public: // IBootstrapperApplication return S_OK; } + virtual STDMETHODIMP OnPlanRollbackBoundary( + __in_z LPCWSTR /*wzRollbackBoundaryId*/, + __in BOOL /*fRecommendedTransaction*/, + __inout BOOL* /*pfTransaction*/, + __inout BOOL* pfCancel + ) + { + *pfCancel |= CheckCanceled(); + return S_OK; + } + virtual STDMETHODIMP OnPlanPackageBegin( __in_z LPCWSTR /*wzPackageId*/, __in BOOTSTRAPPER_PACKAGE_STATE /*state*/, diff --git a/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h b/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h index 69031d62..d536729f 100644 --- a/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h +++ b/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h @@ -171,6 +171,15 @@ static HRESULT BalBaseBAProcOnPlanRelatedBundle( return pBA->OnPlanRelatedBundle(pArgs->wzBundleId, pArgs->recommendedState, &pResults->requestedState, &pResults->fCancel); } +static HRESULT BalBaseBAProcOnPlanRollbackBoundary( + __in IBootstrapperApplication* pBA, + __in BA_ONPLANROLLBACKBOUNDARY_ARGS* pArgs, + __inout BA_ONPLANROLLBACKBOUNDARY_RESULTS* pResults + ) +{ + return pBA->OnPlanRollbackBoundary(pArgs->wzRollbackBoundaryId, pArgs->fRecommendedTransaction, &pResults->fTransaction, &pResults->fCancel); +} + static HRESULT BalBaseBAProcOnPlanPackageBegin( __in IBootstrapperApplication* pBA, __in BA_ONPLANPACKAGEBEGIN_ARGS* pArgs, @@ -892,6 +901,9 @@ static HRESULT WINAPI BalBaseBootstrapperApplicationProc( case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTCOMPLETE: hr = BalBaseBAProcOnCachePayloadExtractComplete(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANROLLBACKBOUNDARY: + hr = BalBaseBAProcOnPlanRollbackBoundary(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; } } diff --git a/src/api/burn/balutil/inc/IBootstrapperApplication.h b/src/api/burn/balutil/inc/IBootstrapperApplication.h index 98b88f44..51f58ec7 100644 --- a/src/api/burn/balutil/inc/IBootstrapperApplication.h +++ b/src/api/burn/balutil/inc/IBootstrapperApplication.h @@ -160,6 +160,14 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A __inout BOOL* pfCancel ) = 0; + // OnPlanRollbackBoundary - called when the engine is planning a rollback boundary. + STDMETHOD(OnPlanRollbackBoundary)( + __in_z LPCWSTR wzRollbackBoundaryId, + __in BOOL fRecommendedTransaction, + __inout BOOL* pfTransaction, + __inout BOOL* pfCancel + ) = 0; + // OnPlanPackageBegin - called when the engine has begun getting the BA's input // for planning a package. STDMETHOD(OnPlanPackageBegin)( -- cgit v1.2.3-55-g6feb