From da1d1376953ef1c9afb32d5eee02b785e52e372e Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 14 Jan 2022 21:37:24 -0600 Subject: Remove orphan compatible MSI packages. Reimplements #3190 --- .../inc/BootstrapperApplication.h | 61 ++++++++++ .../WixToolset.Mba.Core/BootstrapperApplication.cs | 99 +++++++++++++++ src/api/burn/WixToolset.Mba.Core/EventArgs.cs | 135 +++++++++++++++++++++ .../IBootstrapperApplication.cs | 57 +++++++-- .../IDefaultBootstrapperApplication.cs | 22 +++- src/api/burn/balutil/inc/BAFunctions.h | 4 + src/api/burn/balutil/inc/BalBaseBAFunctions.h | 41 +++++++ src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h | 4 + .../balutil/inc/BalBaseBootstrapperApplication.h | 43 +++++++ .../inc/BalBaseBootstrapperApplicationProc.h | 48 ++++++++ .../burn/balutil/inc/IBootstrapperApplication.h | 34 ++++++ 11 files changed, 539 insertions(+), 9 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 4fbfc890..659901be 100644 --- a/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h +++ b/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h @@ -205,6 +205,10 @@ enum BOOTSTRAPPER_APPLICATION_MESSAGE BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANROLLBACKBOUNDARY, BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATEBEGIN, BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATECOMPLETE, + BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE, + BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN, + BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE, + BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDCOMPATIBLEPACKAGE, }; enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION @@ -648,6 +652,20 @@ struct BA_ONDETECTBEGIN_RESULTS BOOL fCancel; }; +struct BA_ONDETECTCOMPATIBLEMSIPACKAGE_ARGS +{ + DWORD cbSize; + LPCWSTR wzPackageId; + LPCWSTR wzCompatiblePackageId; + LPCWSTR wzCompatiblePackageVersion; +}; + +struct BA_ONDETECTCOMPATIBLEMSIPACKAGE_RESULTS +{ + DWORD cbSize; + BOOL fCancel; +}; + struct BA_ONDETECTCOMPLETE_ARGS { DWORD cbSize; @@ -1023,6 +1041,36 @@ struct BA_ONPLANBEGIN_RESULTS BOOL fCancel; }; +struct BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_ARGS +{ + DWORD cbSize; + LPCWSTR wzPackageId; + LPCWSTR wzCompatiblePackageId; + LPCWSTR wzCompatiblePackageVersion; + BOOL fRecommendedRemove; +}; + +struct BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_RESULTS +{ + DWORD cbSize; + BOOL fCancel; + BOOL fRequestRemove; +}; + +struct BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_ARGS +{ + DWORD cbSize; + LPCWSTR wzPackageId; + LPCWSTR wzCompatiblePackageId; + HRESULT hrStatus; + BOOL fRequestedRemove; +}; + +struct BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_RESULTS +{ + DWORD cbSize; +}; + struct BA_ONPLANCOMPLETE_ARGS { DWORD cbSize; @@ -1086,6 +1134,19 @@ struct BA_ONPLANMSIPACKAGE_RESULTS BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning; }; +struct BA_ONPLANNEDCOMPATIBLEPACKAGE_ARGS +{ + DWORD cbSize; + LPCWSTR wzPackageId; + LPCWSTR wzCompatiblePackageId; + BOOL fRemove; +}; + +struct BA_ONPLANNEDCOMPATIBLEPACKAGE_RESULTS +{ + DWORD cbSize; +}; + struct BA_ONPLANNEDPACKAGE_ARGS { DWORD cbSize; diff --git a/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs b/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs index 34b63a50..f277425e 100644 --- a/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs +++ b/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs @@ -63,6 +63,9 @@ namespace WixToolset.Mba.Core /// public event EventHandler DetectPackageBegin; + + /// + public event EventHandler DetectCompatibleMsiPackage; /// public event EventHandler DetectRelatedMsiPackage; @@ -91,6 +94,12 @@ namespace WixToolset.Mba.Core /// public event EventHandler PlanPackageBegin; + /// + public event EventHandler PlanCompatibleMsiPackageBegin; + + /// + public event EventHandler PlanCompatibleMsiPackageComplete; + /// public event EventHandler PlanPatchTarget; @@ -103,6 +112,9 @@ namespace WixToolset.Mba.Core /// public event EventHandler PlanPackageComplete; + /// + public event EventHandler PlannedCompatiblePackage; + /// public event EventHandler PlannedPackage; @@ -414,6 +426,19 @@ namespace WixToolset.Mba.Core } } + /// + /// Called by the engine, raises the event. + /// + /// Additional arguments for this event. + protected virtual void OnDetectCompatibleMsiPackage(DetectCompatibleMsiPackageEventArgs args) + { + EventHandler handler = this.DetectCompatibleMsiPackage; + if (null != handler) + { + handler(this, args); + } + } + /// /// Called by the engine, raises the event. /// @@ -530,6 +555,32 @@ namespace WixToolset.Mba.Core } } + /// + /// Called by the engine, raises the event. + /// + /// Additional arguments for this event. + protected virtual void OnPlanCompatibleMsiPackageBegin(PlanCompatibleMsiPackageBeginEventArgs args) + { + EventHandler handler = this.PlanCompatibleMsiPackageBegin; + if (null != handler) + { + handler(this, args); + } + } + + /// + /// Called by the engine, raises the event. + /// + /// Additional arguments for this event. + protected virtual void OnPlanCompatibleMsiPackageComplete(PlanCompatibleMsiPackageCompleteEventArgs args) + { + EventHandler handler = this.PlanCompatibleMsiPackageComplete; + if (null != handler) + { + handler(this, args); + } + } + /// /// Called by the engine, raises the event. /// @@ -582,6 +633,19 @@ namespace WixToolset.Mba.Core } } + /// + /// Called by the engine, raises the event. + /// + /// Additional arguments for this event. + protected virtual void OnPlannedCompatiblePackage(PlannedCompatiblePackageEventArgs args) + { + EventHandler handler = this.PlannedCompatiblePackage; + if (null != handler) + { + handler(this, args); + } + } + /// /// Called by the engine, raises the event. /// @@ -1363,6 +1427,15 @@ namespace WixToolset.Mba.Core return args.HResult; } + int IBootstrapperApplication.OnDetectCompatibleMsiPackage(string wzPackageId, string wzCompatiblePackageId, string wzCompatiblePackageVersion, ref bool fCancel) + { + DetectCompatibleMsiPackageEventArgs args = new DetectCompatibleMsiPackageEventArgs(wzPackageId, wzCompatiblePackageId, wzCompatiblePackageVersion, fCancel); + this.OnDetectCompatibleMsiPackage(args); + + fCancel = args.Cancel; + return args.HResult; + } + int IBootstrapperApplication.OnDetectRelatedMsiPackage(string wzPackageId, string wzUpgradeCode, string wzProductCode, bool fPerMachine, string wzVersion, RelatedOperation operation, ref bool fCancel) { DetectRelatedMsiPackageEventArgs args = new DetectRelatedMsiPackageEventArgs(wzPackageId, wzUpgradeCode, wzProductCode, fPerMachine, wzVersion, operation, fCancel); @@ -1445,6 +1518,24 @@ namespace WixToolset.Mba.Core return args.HResult; } + int IBootstrapperApplication.OnPlanCompatibleMsiPackageBegin(string wzPackageId, string wzCompatiblePackageId, string wzCompatiblePackageVersion, bool recommendedRemove, ref bool pRequestedRemove, ref bool fCancel) + { + PlanCompatibleMsiPackageBeginEventArgs args = new PlanCompatibleMsiPackageBeginEventArgs(wzPackageId, wzCompatiblePackageId, wzCompatiblePackageVersion, recommendedRemove, pRequestedRemove, fCancel); + this.OnPlanCompatibleMsiPackageBegin(args); + + pRequestedRemove = args.RequestRemove; + fCancel = args.Cancel; + return args.HResult; + } + + int IBootstrapperApplication.OnPlanCompatibleMsiPackageComplete(string wzPackageId, string wzCompatiblePackageId, int hrStatus, bool requestedRemove) + { + PlanCompatibleMsiPackageCompleteEventArgs args = new PlanCompatibleMsiPackageCompleteEventArgs(wzPackageId, wzCompatiblePackageId, hrStatus, requestedRemove); + this.OnPlanCompatibleMsiPackageComplete(args); + + return args.HResult; + } + int IBootstrapperApplication.OnPlanPatchTarget(string wzPackageId, string wzProductCode, RequestState recommendedState, ref RequestState pRequestedState, ref bool fCancel) { PlanPatchTargetEventArgs args = new PlanPatchTargetEventArgs(wzPackageId, wzProductCode, recommendedState, pRequestedState, fCancel); @@ -1486,6 +1577,14 @@ namespace WixToolset.Mba.Core return args.HResult; } + int IBootstrapperApplication.OnPlannedCompatiblePackage(string wzPackageId, string wzCompatiblePackageId, bool remove) + { + var args = new PlannedCompatiblePackageEventArgs(wzPackageId, wzCompatiblePackageId, remove); + this.OnPlannedCompatiblePackage(args); + + return args.HResult; + } + int IBootstrapperApplication.OnPlannedPackage(string wzPackageId, ActionState execute, ActionState rollback, bool fPlannedCache, bool fPlannedUncache) { var args = new PlannedPackageEventArgs(wzPackageId, execute, rollback, fPlannedCache, fPlannedUncache); diff --git a/src/api/burn/WixToolset.Mba.Core/EventArgs.cs b/src/api/burn/WixToolset.Mba.Core/EventArgs.cs index 93831be6..d4d70651 100644 --- a/src/api/burn/WixToolset.Mba.Core/EventArgs.cs +++ b/src/api/burn/WixToolset.Mba.Core/EventArgs.cs @@ -495,6 +495,37 @@ namespace WixToolset.Mba.Core public string PackageId { get; private set; } } + /// + /// Event arguments for + /// + [Serializable] + public class DetectCompatibleMsiPackageEventArgs : CancellableHResultEventArgs + { + /// + public DetectCompatibleMsiPackageEventArgs(string packageId, string compatiblePackageId, string compatiblePackageVersion, bool cancelRecommendation) + : base(cancelRecommendation) + { + this.PackageId = packageId; + this.CompatiblePackageId = compatiblePackageId; + this.CompatiblePackageVersion = compatiblePackageVersion; + } + + /// + /// Gets the identity of the package that was not detected. + /// + public string PackageId { get; private set; } + + /// + /// Gets the identity of the compatible package that was detected. + /// + public string CompatiblePackageId { get; private set; } + + /// + /// Gets the version of the compatible package that was detected. + /// + public string CompatiblePackageVersion { get; private set; } + } + /// /// Event arguments for /// @@ -775,6 +806,80 @@ namespace WixToolset.Mba.Core public BOOTSTRAPPER_CACHE_TYPE CacheType { get; set; } } + /// + /// Event arguments for + /// + [Serializable] + public class PlanCompatibleMsiPackageBeginEventArgs : CancellableHResultEventArgs + { + /// + public PlanCompatibleMsiPackageBeginEventArgs(string packageId, string compatiblePackageId, string compatiblePackageVersion, bool recommendedRemove, bool requestRemove, bool cancelRecommendation) + : base(cancelRecommendation) + { + this.PackageId = packageId; + this.CompatiblePackageId = compatiblePackageId; + this.CompatiblePackageVersion = compatiblePackageVersion; + this.RecommendedRemove = recommendedRemove; + this.RequestRemove = requestRemove; + } + + /// + /// Gets the identity of the package that was not detected. + /// + public string PackageId { get; private set; } + + /// + /// Gets the identity of the compatible package detected. + /// + public string CompatiblePackageId { get; private set; } + + /// + /// Gets the version of the compatible package detected. + /// + public string CompatiblePackageVersion { get; private set; } + + /// + /// Gets the recommended state to use for the compatible package for planning. + /// + public bool RecommendedRemove { get; private set; } + + /// + /// Gets or sets whether to uninstall the compatible package. + /// + public bool RequestRemove { get; set; } + } + + /// + /// Event arguments for + /// + [Serializable] + public class PlanCompatibleMsiPackageCompleteEventArgs : StatusEventArgs + { + /// + public PlanCompatibleMsiPackageCompleteEventArgs(string packageId, string compatiblePackageId, int hrStatus, bool requestedRemove) + : base(hrStatus) + { + this.PackageId = packageId; + this.CompatiblePackageId = compatiblePackageId; + this.RequestedRemove = requestedRemove; + } + + /// + /// Gets the identity of the package planned for. + /// + public string PackageId { get; private set; } + + /// + /// Gets the identity of the compatible package detected. + /// + public string CompatiblePackageId { get; private set; } + + /// + /// Gets the requested state of the package. + /// + public bool RequestedRemove { get; private set; } + } + /// /// Event arguments for /// @@ -980,6 +1085,36 @@ namespace WixToolset.Mba.Core public RequestState Requested { get; private set; } } + /// + /// Event arguments for + /// + [Serializable] + public class PlannedCompatiblePackageEventArgs : HResultEventArgs + { + /// + public PlannedCompatiblePackageEventArgs(string packageId, string compatiblePackageId, bool remove) + { + this.PackageId = packageId; + this.CompatiblePackageId = compatiblePackageId; + this.Remove = remove; + } + + /// + /// Gets the identity of the package planned for. + /// + public string PackageId { get; private set; } + + /// + /// Gets the identity of the compatible package detected. + /// + public string CompatiblePackageId { get; private set; } + + /// + /// Gets the planned state of the package. + /// + public bool Remove { get; private 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 babd523a..05f96106 100644 --- a/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs +++ b/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs @@ -181,17 +181,21 @@ namespace WixToolset.Mba.Core [MarshalAs(UnmanagedType.Bool)] ref bool fCancel ); + /// + /// See . + /// + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnDetectCompatibleMsiPackage( + [MarshalAs(UnmanagedType.LPWStr)] string wzPackageId, + [MarshalAs(UnmanagedType.LPWStr)] string wzCompatiblePackageId, + [MarshalAs(UnmanagedType.LPWStr)] string wzCompatiblePackageVersion, + [MarshalAs(UnmanagedType.Bool)] ref bool fCancel + ); + /// /// See . /// - /// - /// - /// - /// - /// - /// - /// - /// [PreserveSig] [return: MarshalAs(UnmanagedType.I4)] int OnDetectRelatedMsiPackage( @@ -317,6 +321,32 @@ namespace WixToolset.Mba.Core [MarshalAs(UnmanagedType.Bool)] ref bool fCancel ); + /// + /// See . + /// + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnPlanCompatibleMsiPackageBegin( + [MarshalAs(UnmanagedType.LPWStr)] string wzPackageId, + [MarshalAs(UnmanagedType.LPWStr)] string wzCompatiblePackageId, + [MarshalAs(UnmanagedType.LPWStr)] string wzCompatiblePackageVersion, + [MarshalAs(UnmanagedType.Bool)] bool fRecommendedRemove, + [MarshalAs(UnmanagedType.Bool)] ref bool fRequestRemove, + [MarshalAs(UnmanagedType.Bool)] ref bool fCancel + ); + + /// + /// See . + /// + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnPlanCompatibleMsiPackageComplete( + [MarshalAs(UnmanagedType.LPWStr)] string wzPackageId, + [MarshalAs(UnmanagedType.LPWStr)] string wzCompatiblePackageId, + int hrStatus, + [MarshalAs(UnmanagedType.Bool)] bool fRequestedRemove + ); + /// /// See . /// @@ -387,6 +417,17 @@ namespace WixToolset.Mba.Core [MarshalAs(UnmanagedType.U4)] RequestState requested ); + /// + /// See . + /// + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnPlannedCompatiblePackage( + [MarshalAs(UnmanagedType.LPWStr)] string wzPackageId, + [MarshalAs(UnmanagedType.LPWStr)] string wzCompatiblePackageId, + [MarshalAs(UnmanagedType.Bool)] bool fRemove + ); + /// /// See . /// diff --git a/src/api/burn/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs b/src/api/burn/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs index e809a965..ce06408e 100644 --- a/src/api/burn/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs +++ b/src/api/burn/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs @@ -133,6 +133,11 @@ namespace WixToolset.Mba.Core /// event EventHandler DetectBegin; + /// + /// Fired when a package was not detected but a package using the same provider key was. + /// + event EventHandler DetectCompatibleMsiPackage; + /// /// Fired when the detection phase has completed. /// @@ -268,6 +273,16 @@ namespace WixToolset.Mba.Core /// event EventHandler PlanBegin; + /// + /// Fired when the engine plans a new, compatible package using the same provider key. + /// + event EventHandler PlanCompatibleMsiPackageBegin; + + /// + /// Fired when the engine has completed planning the installation of a specific package. + /// + event EventHandler PlanCompatibleMsiPackageComplete; + /// /// Fired when the engine has completed planning the installation. /// @@ -278,6 +293,11 @@ namespace WixToolset.Mba.Core /// event EventHandler PlanForwardCompatibleBundle; + /// + /// Fired when the engine has completed planning a compatible package. + /// + event EventHandler PlannedCompatiblePackage; + /// /// Fired when the engine has completed planning a package. /// @@ -399,4 +419,4 @@ namespace WixToolset.Mba.Core /// event EventHandler UnregisterComplete; } -} \ No newline at end of file +} diff --git a/src/api/burn/balutil/inc/BAFunctions.h b/src/api/burn/balutil/inc/BAFunctions.h index 2698a6e3..84359d65 100644 --- a/src/api/burn/balutil/inc/BAFunctions.h +++ b/src/api/burn/balutil/inc/BAFunctions.h @@ -84,6 +84,10 @@ enum BA_FUNCTIONS_MESSAGE BA_FUNCTIONS_MESSAGE_ONPLANROLLBACKBOUNDARY = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANROLLBACKBOUNDARY, BA_FUNCTIONS_MESSAGE_ONSETUPDATEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATEBEGIN, BA_FUNCTIONS_MESSAGE_ONSETUPDATECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATECOMPLETE, + BA_FUNCTIONS_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE, + BA_FUNCTIONS_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN, + BA_FUNCTIONS_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE, + BA_FUNCTIONS_MESSAGE_ONPLANNEDCOMPATIBLEPACKAGE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDCOMPATIBLEPACKAGE, 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 22e16f1b..c6d0924f 100644 --- a/src/api/burn/balutil/inc/BalBaseBAFunctions.h +++ b/src/api/burn/balutil/inc/BalBaseBAFunctions.h @@ -182,6 +182,16 @@ public: // IBootstrapperApplication return S_OK; } + virtual STDMETHODIMP OnDetectCompatibleMsiPackage( + __in_z LPCWSTR /*wzPackageId*/, + __in_z LPCWSTR /*wzCompatiblePackageId*/, + __in LPCWSTR /*wzCompatiblePackageVersion*/, + __inout BOOL* /*pfCancel*/ + ) + { + return S_OK; + } + virtual STDMETHODIMP OnDetectRelatedMsiPackage( __in_z LPCWSTR /*wzPackageId*/, __in_z LPCWSTR /*wzUpgradeCode*/, @@ -276,6 +286,28 @@ public: // IBootstrapperApplication return S_OK; } + virtual STDMETHODIMP OnPlanCompatibleMsiPackageBegin( + __in_z LPCWSTR /*wzPackageId*/, + __in_z LPCWSTR /*wzCompatiblePackageId*/, + __in LPCWSTR /*wzCompatiblePackageVersion*/, + __in BOOL /*fRecommendedRemove*/, + __inout BOOL* /*pfRequestRemove*/, + __inout BOOL* /*pfCancel*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnPlanCompatibleMsiPackageComplete( + __in_z LPCWSTR /*wzPackageId*/, + __in_z LPCWSTR /*wzCompatiblePackageId*/, + __in HRESULT /*hrStatus*/, + __in BOOL /*fRequestedRemove*/ + ) + { + return S_OK; + } + virtual STDMETHODIMP OnPlanPatchTarget( __in_z LPCWSTR /*wzPackageId*/, __in_z LPCWSTR /*wzProductCode*/, @@ -322,6 +354,15 @@ public: // IBootstrapperApplication return S_OK; } + virtual STDMETHODIMP OnPlannedCompatiblePackage( + __in_z LPCWSTR /*wzPackageId*/, + __in_z LPCWSTR /*wzCompatiblePackageId*/, + __in BOOL /*fRemove*/ + ) + { + return S_OK; + } + virtual STDMETHODIMP OnPlannedPackage( __in_z LPCWSTR /*wzPackageId*/, __in BOOTSTRAPPER_ACTION_STATE /*execute*/, diff --git a/src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h b/src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h index 1ab0df59..5d5ff098 100644 --- a/src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h +++ b/src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h @@ -155,6 +155,10 @@ static HRESULT WINAPI BalBaseBAFunctionsProc( case BA_FUNCTIONS_MESSAGE_ONPLANROLLBACKBOUNDARY: case BA_FUNCTIONS_MESSAGE_ONSETUPDATEBEGIN: case BA_FUNCTIONS_MESSAGE_ONSETUPDATECOMPLETE: + case BA_FUNCTIONS_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE: + case BA_FUNCTIONS_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN: + case BA_FUNCTIONS_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE: + case BA_FUNCTIONS_MESSAGE_ONPLANNEDCOMPATIBLEPACKAGE: 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 631d3c62..e1a36fdf 100644 --- a/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h +++ b/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h @@ -189,6 +189,17 @@ public: // IBootstrapperApplication return S_OK; } + virtual STDMETHODIMP OnDetectCompatibleMsiPackage( + __in_z LPCWSTR /*wzPackageId*/, + __in_z LPCWSTR /*wzCompatiblePackageId*/, + __in LPCWSTR /*wzCompatiblePackageVersion*/, + __inout BOOL* pfCancel + ) + { + *pfCancel |= CheckCanceled(); + return S_OK; + } + virtual STDMETHODIMP OnDetectRelatedMsiPackage( __in_z LPCWSTR /*wzPackageId*/, __in_z LPCWSTR /*wzUpgradeCode*/, @@ -290,6 +301,29 @@ public: // IBootstrapperApplication return S_OK; } + virtual STDMETHODIMP OnPlanCompatibleMsiPackageBegin( + __in_z LPCWSTR /*wzPackageId*/, + __in_z LPCWSTR /*wzCompatiblePackageId*/, + __in LPCWSTR /*wzCompatiblePackageVersion*/, + __in BOOL /*fRecommendedRemove*/, + __inout BOOL* /*pfRequestRemove*/, + __inout BOOL* pfCancel + ) + { + *pfCancel |= CheckCanceled(); + return S_OK; + } + + virtual STDMETHODIMP OnPlanCompatibleMsiPackageComplete( + __in_z LPCWSTR /*wzPackageId*/, + __in_z LPCWSTR /*wzCompatiblePackageId*/, + __in HRESULT /*hrStatus*/, + __in BOOL /*fRequestedRemove*/ + ) + { + return S_OK; + } + virtual STDMETHODIMP OnPlanPatchTarget( __in_z LPCWSTR /*wzPackageId*/, __in_z LPCWSTR /*wzProductCode*/, @@ -339,6 +373,15 @@ public: // IBootstrapperApplication return S_OK; } + virtual STDMETHODIMP OnPlannedCompatiblePackage( + __in_z LPCWSTR /*wzPackageId*/, + __in_z LPCWSTR /*wzCompatiblePackageId*/, + __in BOOL /*fRemove*/ + ) + { + return S_OK; + } + virtual STDMETHODIMP OnPlannedPackage( __in_z LPCWSTR /*wzPackageId*/, __in BOOTSTRAPPER_ACTION_STATE /*execute*/, diff --git a/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h b/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h index b9866e4b..1ee5258e 100644 --- a/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h +++ b/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h @@ -126,6 +126,15 @@ static HRESULT BalBaseBAProcOnDetectPackageBegin( return pBA->OnDetectPackageBegin(pArgs->wzPackageId, &pResults->fCancel); } +static HRESULT BalBaseBAProcOnDetectCompatiblePackage( + __in IBootstrapperApplication* pBA, + __in BA_ONDETECTCOMPATIBLEMSIPACKAGE_ARGS* pArgs, + __inout BA_ONDETECTCOMPATIBLEMSIPACKAGE_RESULTS* pResults + ) +{ + return pBA->OnDetectCompatibleMsiPackage(pArgs->wzPackageId, pArgs->wzCompatiblePackageId, pArgs->wzCompatiblePackageVersion, &pResults->fCancel); +} + static HRESULT BalBaseBAProcOnDetectRelatedMsiPackage( __in IBootstrapperApplication* pBA, __in BA_ONDETECTRELATEDMSIPACKAGE_ARGS* pArgs, @@ -189,6 +198,24 @@ static HRESULT BalBaseBAProcOnPlanPackageBegin( return pBA->OnPlanPackageBegin(pArgs->wzPackageId, pArgs->state, pArgs->fCached, pArgs->installCondition, pArgs->recommendedState, pArgs->recommendedCacheType, &pResults->requestedState, &pResults->requestedCacheType, &pResults->fCancel); } +static HRESULT BalBaseBAProcOnPlanCompatibleMsiPackageBegin( + __in IBootstrapperApplication* pBA, + __in BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_ARGS* pArgs, + __inout BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_RESULTS* pResults + ) +{ + return pBA->OnPlanCompatibleMsiPackageBegin(pArgs->wzPackageId, pArgs->wzCompatiblePackageId, pArgs->wzCompatiblePackageVersion, pArgs->fRecommendedRemove, &pResults->fRequestRemove, &pResults->fCancel); +} + +static HRESULT BalBaseBAProcOnPlanCompatibleMsiPackageComplete( + __in IBootstrapperApplication* pBA, + __in BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_ARGS* pArgs, + __inout BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_RESULTS* /*pResults*/ + ) +{ + return pBA->OnPlanCompatibleMsiPackageComplete(pArgs->wzPackageId, pArgs->wzCompatiblePackageId, pArgs->hrStatus, pArgs->fRequestedRemove); +} + static HRESULT BalBaseBAProcOnPlanPatchTarget( __in IBootstrapperApplication* pBA, __in BA_ONPLANPATCHTARGET_ARGS* pArgs, @@ -216,6 +243,15 @@ static HRESULT BalBaseBAProcOnPlanPackageComplete( return pBA->OnPlanPackageComplete(pArgs->wzPackageId, pArgs->hrStatus, pArgs->requested); } +static HRESULT BalBaseBAProcOnPlannedCompatiblePackage( + __in IBootstrapperApplication* pBA, + __in BA_ONPLANNEDCOMPATIBLEPACKAGE_ARGS* pArgs, + __inout BA_ONPLANNEDCOMPATIBLEPACKAGE_RESULTS* /*pResults*/ + ) +{ + return pBA->OnPlannedCompatiblePackage(pArgs->wzPackageId, pArgs->wzCompatiblePackageId, pArgs->fRemove); +} + static HRESULT BalBaseBAProcOnPlannedPackage( __in IBootstrapperApplication* pBA, __in BA_ONPLANNEDPACKAGE_ARGS* pArgs, @@ -928,6 +964,18 @@ static HRESULT WINAPI BalBaseBootstrapperApplicationProc( case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATECOMPLETE: hr = BalBaseBAProcOnSetUpdateComplete(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE: + hr = BalBaseBAProcOnDetectCompatiblePackage(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN: + hr = BalBaseBAProcOnPlanCompatibleMsiPackageBegin(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE: + hr = BalBaseBAProcOnPlanCompatibleMsiPackageComplete(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDCOMPATIBLEPACKAGE: + hr = BalBaseBAProcOnPlannedCompatiblePackage(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 577a705b..640f609d 100644 --- a/src/api/burn/balutil/inc/IBootstrapperApplication.h +++ b/src/api/burn/balutil/inc/IBootstrapperApplication.h @@ -101,6 +101,14 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A __inout BOOL* pfCancel ) = 0; + // OnDetectCompatibleMsiPackage - called when the engine detects that a package is not installed but a newer package using the same provider key is. + STDMETHOD(OnDetectCompatibleMsiPackage)( + __in_z LPCWSTR wzPackageId, + __in_z LPCWSTR wzCompatiblePackageId, + __in_z LPCWSTR wzCompatiblePackageVersion, + __inout BOOL* pfCancel + ) = 0; + // OnDetectRelatedMsiPackage - called when the engine begins detects a related package. STDMETHOD(OnDetectRelatedMsiPackage)( __in_z LPCWSTR wzPackageId, @@ -181,6 +189,25 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A __inout BOOL* pfCancel ) = 0; + // OnPlanCompatibleMsiPackageBegin - called when the engine plans a newer, compatible package using the same provider key. + STDMETHOD(OnPlanCompatibleMsiPackageBegin)( + __in_z LPCWSTR wzPackageId, + __in_z LPCWSTR wzCompatiblePackageId, + __in_z LPCWSTR wzCompatiblePackageVersion, + __in BOOL fRecommendedRemove, + __inout BOOL* pfRequestRemove, + __inout BOOL* pfCancel + ) = 0; + + // OnPlanCompatibleMsiPackageComplete - called after the engine plans the package. + // + STDMETHOD(OnPlanCompatibleMsiPackageComplete)( + __in_z LPCWSTR wzPackageId, + __in_z LPCWSTR wzCompatiblePackageId, + __in HRESULT hrStatus, + __in BOOL fRequestedRemove + ) = 0; + // OnPlanPatchTarget - called when the engine is about to plan a target // of an MSP package. STDMETHOD(OnPlanPatchTarget)( @@ -223,6 +250,13 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A __in BOOTSTRAPPER_REQUEST_STATE requested ) = 0; + // OnPlannedCompatiblePackage - called after the engine has completed planning a compatible package. + STDMETHOD(OnPlannedCompatiblePackage)( + __in_z LPCWSTR wzPackageId, + __in_z LPCWSTR wzCompatiblePackageId, + __in BOOL fRemove + ) = 0; + // OnPlannedPackage - called after the engine has completed planning a package. STDMETHOD(OnPlannedPackage)( __in_z LPCWSTR wzPackageId, -- cgit v1.2.3-55-g6feb