From 19d85eed389fbd964f64c2fbb85e40ec20439d26 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Tue, 7 Dec 2021 17:34:09 -0600 Subject: Add ability to customize file versioning rules for MsiPackage and MspPackage. Fixes #5911 --- .../inc/BootstrapperApplication.h | 9 +++++++ .../WixToolset.Mba.Core/BootstrapperApplication.cs | 5 ++-- src/api/burn/WixToolset.Mba.Core/EventArgs.cs | 14 +++++++++- .../IBootstrapperApplication.cs | 31 +++++++++++++++------- src/api/burn/balutil/inc/BalBaseBAFunctions.h | 4 ++- .../balutil/inc/BalBaseBootstrapperApplication.h | 4 ++- .../inc/BalBaseBootstrapperApplicationProc.h | 2 +- .../burn/balutil/inc/IBootstrapperApplication.h | 4 ++- 8 files changed, 57 insertions(+), 16 deletions(-) (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 b7dc17c2..ad920577 100644 --- a/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h +++ b/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h @@ -115,6 +115,13 @@ enum BOOTSTRAPPER_PACKAGE_CONDITION_RESULT BOOTSTRAPPER_PACKAGE_CONDITION_TRUE, }; +enum BOOTSTRAPPER_MSI_FILE_VERSIONING +{ + BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, //o + BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER_OR_EQUAL, //e + BOOTSTRAPPER_MSI_FILE_VERSIONING_ALL, //a +}; + enum BOOTSTRAPPER_APPLICATION_MESSAGE { BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTBEGIN, @@ -1058,6 +1065,7 @@ struct BA_ONPLANMSIPACKAGE_ARGS LPCWSTR wzPackageId; BOOL fExecute; // false means rollback. BOOTSTRAPPER_ACTION_STATE action; + BOOTSTRAPPER_MSI_FILE_VERSIONING recommendedFileVersioning; }; struct BA_ONPLANMSIPACKAGE_RESULTS @@ -1067,6 +1075,7 @@ struct BA_ONPLANMSIPACKAGE_RESULTS BURN_MSI_PROPERTY actionMsiProperty; INSTALLUILEVEL uiLevel; BOOL fDisableExternalUiHandler; + BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning; }; struct BA_ONPLANNEDPACKAGE_ARGS diff --git a/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs b/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs index b6fdca1e..0520463f 100644 --- a/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs +++ b/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs @@ -1433,15 +1433,16 @@ namespace WixToolset.Mba.Core return args.HResult; } - int IBootstrapperApplication.OnPlanMsiPackage(string wzPackageId, bool fExecute, ActionState action, ref bool fCancel, ref BURN_MSI_PROPERTY actionMsiProperty, ref INSTALLUILEVEL uiLevel, ref bool fDisableExternalUiHandler) + int IBootstrapperApplication.OnPlanMsiPackage(string wzPackageId, bool fExecute, ActionState action, BOOTSTRAPPER_MSI_FILE_VERSIONING recommendedFileVersioning, ref bool fCancel, ref BURN_MSI_PROPERTY actionMsiProperty, ref INSTALLUILEVEL uiLevel, ref bool fDisableExternalUiHandler, ref BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning) { - PlanMsiPackageEventArgs args = new PlanMsiPackageEventArgs(wzPackageId, fExecute, action, fCancel, actionMsiProperty, uiLevel, fDisableExternalUiHandler); + PlanMsiPackageEventArgs args = new PlanMsiPackageEventArgs(wzPackageId, fExecute, action, recommendedFileVersioning, fCancel, actionMsiProperty, uiLevel, fDisableExternalUiHandler, fileVersioning); this.OnPlanMsiPackage(args); fCancel = args.Cancel; actionMsiProperty = args.ActionMsiProperty; uiLevel = args.UiLevel; fDisableExternalUiHandler = args.DisableExternalUiHandler; + fileVersioning = args.FileVersioning; return args.HResult; } diff --git a/src/api/burn/WixToolset.Mba.Core/EventArgs.cs b/src/api/burn/WixToolset.Mba.Core/EventArgs.cs index 04e7b579..556db821 100644 --- a/src/api/burn/WixToolset.Mba.Core/EventArgs.cs +++ b/src/api/burn/WixToolset.Mba.Core/EventArgs.cs @@ -902,15 +902,17 @@ namespace WixToolset.Mba.Core public class PlanMsiPackageEventArgs : CancellableHResultEventArgs { /// - public PlanMsiPackageEventArgs(string packageId, bool shouldExecute, ActionState action, bool cancelRecommendation, BURN_MSI_PROPERTY actionMsiProperty, INSTALLUILEVEL uiLevel, bool disableExternalUiHandler) + public PlanMsiPackageEventArgs(string packageId, bool shouldExecute, ActionState action, BOOTSTRAPPER_MSI_FILE_VERSIONING recommendedFileVersioning, bool cancelRecommendation, BURN_MSI_PROPERTY actionMsiProperty, INSTALLUILEVEL uiLevel, bool disableExternalUiHandler, BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning) : base(cancelRecommendation) { this.PackageId = packageId; this.ShouldExecute = shouldExecute; this.Action = action; + this.RecommendedFileVersioning = recommendedFileVersioning; this.ActionMsiProperty = actionMsiProperty; this.UiLevel = uiLevel; this.DisableExternalUiHandler = disableExternalUiHandler; + this.FileVersioning = fileVersioning; } /// @@ -928,6 +930,11 @@ namespace WixToolset.Mba.Core /// public ActionState Action { get; private set; } + /// + /// Gets the recommended file versioning for the package. + /// + public BOOTSTRAPPER_MSI_FILE_VERSIONING RecommendedFileVersioning { get; private set; } + /// /// Gets or sets the requested MSI property to add. /// @@ -942,6 +949,11 @@ namespace WixToolset.Mba.Core /// Gets or sets whether Burn is requested to set up an external UI handler. /// public bool DisableExternalUiHandler { get; set; } + + /// + /// Gets or sets the requested file versioning. + /// + public BOOTSTRAPPER_MSI_FILE_VERSIONING FileVersioning { get; set; } } /// diff --git a/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs b/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs index 07c1a23b..259c407f 100644 --- a/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs +++ b/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs @@ -373,24 +373,18 @@ namespace WixToolset.Mba.Core /// /// See . /// - /// - /// - /// - /// - /// - /// - /// - /// [PreserveSig] [return: MarshalAs(UnmanagedType.I4)] int OnPlanMsiPackage( [MarshalAs(UnmanagedType.LPWStr)] string wzPackageId, [MarshalAs(UnmanagedType.Bool)] bool fExecute, [MarshalAs(UnmanagedType.U4)] ActionState action, + [MarshalAs(UnmanagedType.U4)] BOOTSTRAPPER_MSI_FILE_VERSIONING recommendedFileVersioning, [MarshalAs(UnmanagedType.Bool)] ref bool fCancel, [MarshalAs(UnmanagedType.U4)] ref BURN_MSI_PROPERTY actionMsiProperty, [MarshalAs(UnmanagedType.U4)] ref INSTALLUILEVEL uiLevel, - [MarshalAs(UnmanagedType.Bool)] ref bool fDisableExternalUiHandler + [MarshalAs(UnmanagedType.Bool)] ref bool fDisableExternalUiHandler, + [MarshalAs(UnmanagedType.U4)] ref BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning ); /// @@ -1851,6 +1845,25 @@ namespace WixToolset.Mba.Core SkipCleanup, } + /// + /// The file versioning options for REINSTALLMODE, see https://docs.microsoft.com/en-us/windows/win32/msi/reinstallmode. + /// + public enum BOOTSTRAPPER_MSI_FILE_VERSIONING + { + /// + /// o + /// + Older, + /// + /// e + /// + Equal, + /// + /// a + /// + All, + } + /// /// The property Burn will add so the MSI can know the planned action for the package. /// diff --git a/src/api/burn/balutil/inc/BalBaseBAFunctions.h b/src/api/burn/balutil/inc/BalBaseBAFunctions.h index 2866f6b0..e45db2dc 100644 --- a/src/api/burn/balutil/inc/BalBaseBAFunctions.h +++ b/src/api/burn/balutil/inc/BalBaseBAFunctions.h @@ -303,10 +303,12 @@ public: // IBootstrapperApplication __in_z LPCWSTR /*wzPackageId*/, __in BOOL /*fExecute*/, __in BOOTSTRAPPER_ACTION_STATE /*action*/, + __in BOOTSTRAPPER_MSI_FILE_VERSIONING /*recommendedFileVersioning*/, __inout BOOL* /*pfCancel*/, __inout BURN_MSI_PROPERTY* /*pActionMsiProperty*/, __inout INSTALLUILEVEL* /*pUiLevel*/, - __inout BOOL* /*pfDisableExternalUiHandler*/ + __inout BOOL* /*pfDisableExternalUiHandler*/, + __inout BOOTSTRAPPER_MSI_FILE_VERSIONING* /*pFileVersioning*/ ) { return S_OK; diff --git a/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h b/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h index 4c07ba89..c10b662c 100644 --- a/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h +++ b/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h @@ -319,10 +319,12 @@ public: // IBootstrapperApplication __in_z LPCWSTR /*wzPackageId*/, __in BOOL /*fExecute*/, __in BOOTSTRAPPER_ACTION_STATE /*action*/, + __in BOOTSTRAPPER_MSI_FILE_VERSIONING /*recommendedFileVersioning*/, __inout BOOL* pfCancel, __inout BURN_MSI_PROPERTY* /*pActionMsiProperty*/, __inout INSTALLUILEVEL* /*pUiLevel*/, - __inout BOOL* /*pfDisableExternalUiHandler*/ + __inout BOOL* /*pfDisableExternalUiHandler*/, + __inout BOOTSTRAPPER_MSI_FILE_VERSIONING* /*pFileVersioning*/ ) { *pfCancel |= CheckCanceled(); diff --git a/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h b/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h index d536729f..f17e1fcb 100644 --- a/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h +++ b/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h @@ -510,7 +510,7 @@ static HRESULT BalBaseBAProcOnPlanMsiPackage( __inout BA_ONPLANMSIPACKAGE_RESULTS* pResults ) { - return pBA->OnPlanMsiPackage(pArgs->wzPackageId, pArgs->fExecute, pArgs->action, &pResults->fCancel, &pResults->actionMsiProperty, &pResults->uiLevel, &pResults->fDisableExternalUiHandler); + return pBA->OnPlanMsiPackage(pArgs->wzPackageId, pArgs->fExecute, pArgs->action, pArgs->recommendedFileVersioning, &pResults->fCancel, &pResults->actionMsiProperty, &pResults->uiLevel, &pResults->fDisableExternalUiHandler, &pResults->fileVersioning); } static HRESULT BalBaseBAProcOnBeginMsiTransactionBegin( diff --git a/src/api/burn/balutil/inc/IBootstrapperApplication.h b/src/api/burn/balutil/inc/IBootstrapperApplication.h index 51f58ec7..1fc99988 100644 --- a/src/api/burn/balutil/inc/IBootstrapperApplication.h +++ b/src/api/burn/balutil/inc/IBootstrapperApplication.h @@ -208,10 +208,12 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A __in_z LPCWSTR wzPackageId, __in BOOL fExecute, // false means rollback. __in BOOTSTRAPPER_ACTION_STATE action, + __in BOOTSTRAPPER_MSI_FILE_VERSIONING recommendedFileVersioning, __inout BOOL* pfCancel, __inout BURN_MSI_PROPERTY* pActionMsiProperty, __inout INSTALLUILEVEL* pUiLevel, - __inout BOOL* pfDisableExternalUiHandler + __inout BOOL* pfDisableExternalUiHandler, + __inout BOOTSTRAPPER_MSI_FILE_VERSIONING* pFileVersioning ) = 0; // OnPlanPackageComplete - called after the engine has completed getting the BA's input -- cgit v1.2.3-55-g6feb