From 0042e3d4554a0d92e1da6141854b0f1aafa07d5b Mon Sep 17 00:00:00 2001
From: Nir Bar <nir.bar@panel-sw.co.il>
Date: Wed, 11 Aug 2021 15:37:34 -0500
Subject: Allow BA to opt out of MSI transaction.

---
 .../WixToolset.Mba.Core/BootstrapperApplication.cs | 25 ++++++++++++++++
 src/api/burn/WixToolset.Mba.Core/EventArgs.cs      | 33 ++++++++++++++++++++++
 .../IBootstrapperApplication.cs                    | 12 ++++++++
 .../IDefaultBootstrapperApplication.cs             |  5 ++++
 4 files changed, 75 insertions(+)

(limited to 'src/api/burn/WixToolset.Mba.Core')

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
         /// <inheritdoc/>
         public event EventHandler<PlanRelatedBundleEventArgs> PlanRelatedBundle;
 
+        /// <inheritdoc/>
+        public event EventHandler<PlanRollbackBoundaryEventArgs> PlanRollbackBoundary;
+
         /// <inheritdoc/>
         public event EventHandler<PlanPackageBeginEventArgs> PlanPackageBegin;
 
@@ -496,6 +499,18 @@ namespace WixToolset.Mba.Core
             }
         }
 
+        /// <summary>
+        /// Called by the engine, raises the <see cref="PlanRollbackBoundary"/> event.
+        /// </summary>
+        protected virtual void OnPlanRollbackBoundary(PlanRollbackBoundaryEventArgs args)
+        {
+            EventHandler<PlanRollbackBoundaryEventArgs> handler = this.PlanRollbackBoundary;
+            if (null != handler)
+            {
+                handler(this, args);
+            }
+        }
+
         /// <summary>
         /// Called by the engine, raises the <see cref="PlanPackageBegin"/> event.
         /// </summary>
@@ -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; }
     }
 
+    /// <summary>
+    /// Event arguments for <see cref="IDefaultBootstrapperApplication.PlanRollbackBoundary"/>
+    /// </summary>
+    [Serializable]
+    public class PlanRollbackBoundaryEventArgs : CancellableHResultEventArgs
+    {
+        /// <summary />
+        public PlanRollbackBoundaryEventArgs(string rollbackBoundaryId, bool recommendedTransaction, bool transaction, bool cancelRecommendation)
+            : base(cancelRecommendation)
+        {
+            this.RollbackBoundaryId = rollbackBoundaryId;
+            this.RecommendedTransaction = recommendedTransaction;
+            this.Transaction = transaction;
+        }
+
+        /// <summary>
+        /// Gets the identity of the rollback boundary to plan for.
+        /// </summary>
+        public string RollbackBoundaryId { get; private set; }
+
+        /// <summary>
+        /// Whether or not the rollback boundary was authored to use an MSI transaction.
+        /// </summary>
+        public bool RecommendedTransaction { get; private set; }
+
+        /// <summary>
+        /// Whether or not an MSI transaction will be used in the rollback boundary.
+        /// If <see cref="RecommendedTransaction"/> is false, setting the value to true has no effect.
+        /// If <see cref="RecommendedTransaction"/> is true, setting the value to false will cause the packages inside this rollback boundary to be executed without a wrapping MSI transaction.
+        /// </summary>
+        public bool Transaction { get; set; }
+    }
+
     /// <summary>
     /// Event arguments for <see cref="IDefaultBootstrapperApplication.PlanPatchTarget"/>
     /// </summary>
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
             );
 
+        /// <summary>
+        /// See <see cref="IDefaultBootstrapperApplication.PlanRollbackBoundary"/>.
+        /// </summary>
+        [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
+            );
+
         /// <summary>
         /// See <see cref="IDefaultBootstrapperApplication.PlanPackageBegin"/>.
         /// </summary>
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
         /// </summary>
         event EventHandler<PlanRelatedBundleEventArgs> PlanRelatedBundle;
 
+        /// <summary>
+        /// Fired when the engine is planning a rollback boundary.
+        /// </summary>
+        event EventHandler<PlanRollbackBoundaryEventArgs> PlanRollbackBoundary;
+
         /// <summary>
         /// Fired when the engine has changed progress for the bundle installation.
         /// </summary>
-- 
cgit v1.2.3-55-g6feb