aboutsummaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/api')
-rw-r--r--src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h61
-rw-r--r--src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs99
-rw-r--r--src/api/burn/WixToolset.Mba.Core/EventArgs.cs135
-rw-r--r--src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs57
-rw-r--r--src/api/burn/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs22
-rw-r--r--src/api/burn/balutil/inc/BAFunctions.h4
-rw-r--r--src/api/burn/balutil/inc/BalBaseBAFunctions.h41
-rw-r--r--src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h4
-rw-r--r--src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h43
-rw-r--r--src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h48
-rw-r--r--src/api/burn/balutil/inc/IBootstrapperApplication.h34
11 files changed, 539 insertions, 9 deletions
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
205 BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANROLLBACKBOUNDARY, 205 BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANROLLBACKBOUNDARY,
206 BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATEBEGIN, 206 BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATEBEGIN,
207 BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATECOMPLETE, 207 BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATECOMPLETE,
208 BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE,
209 BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN,
210 BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE,
211 BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDCOMPATIBLEPACKAGE,
208}; 212};
209 213
210enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION 214enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION
@@ -648,6 +652,20 @@ struct BA_ONDETECTBEGIN_RESULTS
648 BOOL fCancel; 652 BOOL fCancel;
649}; 653};
650 654
655struct BA_ONDETECTCOMPATIBLEMSIPACKAGE_ARGS
656{
657 DWORD cbSize;
658 LPCWSTR wzPackageId;
659 LPCWSTR wzCompatiblePackageId;
660 LPCWSTR wzCompatiblePackageVersion;
661};
662
663struct BA_ONDETECTCOMPATIBLEMSIPACKAGE_RESULTS
664{
665 DWORD cbSize;
666 BOOL fCancel;
667};
668
651struct BA_ONDETECTCOMPLETE_ARGS 669struct BA_ONDETECTCOMPLETE_ARGS
652{ 670{
653 DWORD cbSize; 671 DWORD cbSize;
@@ -1023,6 +1041,36 @@ struct BA_ONPLANBEGIN_RESULTS
1023 BOOL fCancel; 1041 BOOL fCancel;
1024}; 1042};
1025 1043
1044struct BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_ARGS
1045{
1046 DWORD cbSize;
1047 LPCWSTR wzPackageId;
1048 LPCWSTR wzCompatiblePackageId;
1049 LPCWSTR wzCompatiblePackageVersion;
1050 BOOL fRecommendedRemove;
1051};
1052
1053struct BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_RESULTS
1054{
1055 DWORD cbSize;
1056 BOOL fCancel;
1057 BOOL fRequestRemove;
1058};
1059
1060struct BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_ARGS
1061{
1062 DWORD cbSize;
1063 LPCWSTR wzPackageId;
1064 LPCWSTR wzCompatiblePackageId;
1065 HRESULT hrStatus;
1066 BOOL fRequestedRemove;
1067};
1068
1069struct BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_RESULTS
1070{
1071 DWORD cbSize;
1072};
1073
1026struct BA_ONPLANCOMPLETE_ARGS 1074struct BA_ONPLANCOMPLETE_ARGS
1027{ 1075{
1028 DWORD cbSize; 1076 DWORD cbSize;
@@ -1086,6 +1134,19 @@ struct BA_ONPLANMSIPACKAGE_RESULTS
1086 BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning; 1134 BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning;
1087}; 1135};
1088 1136
1137struct BA_ONPLANNEDCOMPATIBLEPACKAGE_ARGS
1138{
1139 DWORD cbSize;
1140 LPCWSTR wzPackageId;
1141 LPCWSTR wzCompatiblePackageId;
1142 BOOL fRemove;
1143};
1144
1145struct BA_ONPLANNEDCOMPATIBLEPACKAGE_RESULTS
1146{
1147 DWORD cbSize;
1148};
1149
1089struct BA_ONPLANNEDPACKAGE_ARGS 1150struct BA_ONPLANNEDPACKAGE_ARGS
1090{ 1151{
1091 DWORD cbSize; 1152 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
63 63
64 /// <inheritdoc/> 64 /// <inheritdoc/>
65 public event EventHandler<DetectPackageBeginEventArgs> DetectPackageBegin; 65 public event EventHandler<DetectPackageBeginEventArgs> DetectPackageBegin;
66
67 /// <inheritdoc/>
68 public event EventHandler<DetectCompatibleMsiPackageEventArgs> DetectCompatibleMsiPackage;
66 69
67 /// <inheritdoc/> 70 /// <inheritdoc/>
68 public event EventHandler<DetectRelatedMsiPackageEventArgs> DetectRelatedMsiPackage; 71 public event EventHandler<DetectRelatedMsiPackageEventArgs> DetectRelatedMsiPackage;
@@ -92,6 +95,12 @@ namespace WixToolset.Mba.Core
92 public event EventHandler<PlanPackageBeginEventArgs> PlanPackageBegin; 95 public event EventHandler<PlanPackageBeginEventArgs> PlanPackageBegin;
93 96
94 /// <inheritdoc/> 97 /// <inheritdoc/>
98 public event EventHandler<PlanCompatibleMsiPackageBeginEventArgs> PlanCompatibleMsiPackageBegin;
99
100 /// <inheritdoc/>
101 public event EventHandler<PlanCompatibleMsiPackageCompleteEventArgs> PlanCompatibleMsiPackageComplete;
102
103 /// <inheritdoc/>
95 public event EventHandler<PlanPatchTargetEventArgs> PlanPatchTarget; 104 public event EventHandler<PlanPatchTargetEventArgs> PlanPatchTarget;
96 105
97 /// <inheritdoc/> 106 /// <inheritdoc/>
@@ -104,6 +113,9 @@ namespace WixToolset.Mba.Core
104 public event EventHandler<PlanPackageCompleteEventArgs> PlanPackageComplete; 113 public event EventHandler<PlanPackageCompleteEventArgs> PlanPackageComplete;
105 114
106 /// <inheritdoc/> 115 /// <inheritdoc/>
116 public event EventHandler<PlannedCompatiblePackageEventArgs> PlannedCompatiblePackage;
117
118 /// <inheritdoc/>
107 public event EventHandler<PlannedPackageEventArgs> PlannedPackage; 119 public event EventHandler<PlannedPackageEventArgs> PlannedPackage;
108 120
109 /// <inheritdoc/> 121 /// <inheritdoc/>
@@ -415,6 +427,19 @@ namespace WixToolset.Mba.Core
415 } 427 }
416 428
417 /// <summary> 429 /// <summary>
430 /// Called by the engine, raises the <see cref="DetectCompatibleMsiPackage"/> event.
431 /// </summary>
432 /// <param name="args">Additional arguments for this event.</param>
433 protected virtual void OnDetectCompatibleMsiPackage(DetectCompatibleMsiPackageEventArgs args)
434 {
435 EventHandler<DetectCompatibleMsiPackageEventArgs> handler = this.DetectCompatibleMsiPackage;
436 if (null != handler)
437 {
438 handler(this, args);
439 }
440 }
441
442 /// <summary>
418 /// Called by the engine, raises the <see cref="DetectRelatedMsiPackage"/> event. 443 /// Called by the engine, raises the <see cref="DetectRelatedMsiPackage"/> event.
419 /// </summary> 444 /// </summary>
420 /// <param name="args">Additional arguments for this event.</param> 445 /// <param name="args">Additional arguments for this event.</param>
@@ -531,6 +556,32 @@ namespace WixToolset.Mba.Core
531 } 556 }
532 557
533 /// <summary> 558 /// <summary>
559 /// Called by the engine, raises the <see cref="PlanCompatibleMsiPackageBegin"/> event.
560 /// </summary>
561 /// <param name="args">Additional arguments for this event.</param>
562 protected virtual void OnPlanCompatibleMsiPackageBegin(PlanCompatibleMsiPackageBeginEventArgs args)
563 {
564 EventHandler<PlanCompatibleMsiPackageBeginEventArgs> handler = this.PlanCompatibleMsiPackageBegin;
565 if (null != handler)
566 {
567 handler(this, args);
568 }
569 }
570
571 /// <summary>
572 /// Called by the engine, raises the <see cref="PlanCompatibleMsiPackageComplete"/> event.
573 /// </summary>
574 /// <param name="args">Additional arguments for this event.</param>
575 protected virtual void OnPlanCompatibleMsiPackageComplete(PlanCompatibleMsiPackageCompleteEventArgs args)
576 {
577 EventHandler<PlanCompatibleMsiPackageCompleteEventArgs> handler = this.PlanCompatibleMsiPackageComplete;
578 if (null != handler)
579 {
580 handler(this, args);
581 }
582 }
583
584 /// <summary>
534 /// Called by the engine, raises the <see cref="PlanPatchTarget"/> event. 585 /// Called by the engine, raises the <see cref="PlanPatchTarget"/> event.
535 /// </summary> 586 /// </summary>
536 /// <param name="args">Additional arguments for this event.</param> 587 /// <param name="args">Additional arguments for this event.</param>
@@ -583,6 +634,19 @@ namespace WixToolset.Mba.Core
583 } 634 }
584 635
585 /// <summary> 636 /// <summary>
637 /// Called by the engine, raises the <see cref="PlannedCompatiblePackage"/> event.
638 /// </summary>
639 /// <param name="args">Additional arguments for this event.</param>
640 protected virtual void OnPlannedCompatiblePackage(PlannedCompatiblePackageEventArgs args)
641 {
642 EventHandler<PlannedCompatiblePackageEventArgs> handler = this.PlannedCompatiblePackage;
643 if (null != handler)
644 {
645 handler(this, args);
646 }
647 }
648
649 /// <summary>
586 /// Called by the engine, raises the <see cref="PlannedPackage"/> event. 650 /// Called by the engine, raises the <see cref="PlannedPackage"/> event.
587 /// </summary> 651 /// </summary>
588 /// <param name="args">Additional arguments for this event.</param> 652 /// <param name="args">Additional arguments for this event.</param>
@@ -1363,6 +1427,15 @@ namespace WixToolset.Mba.Core
1363 return args.HResult; 1427 return args.HResult;
1364 } 1428 }
1365 1429
1430 int IBootstrapperApplication.OnDetectCompatibleMsiPackage(string wzPackageId, string wzCompatiblePackageId, string wzCompatiblePackageVersion, ref bool fCancel)
1431 {
1432 DetectCompatibleMsiPackageEventArgs args = new DetectCompatibleMsiPackageEventArgs(wzPackageId, wzCompatiblePackageId, wzCompatiblePackageVersion, fCancel);
1433 this.OnDetectCompatibleMsiPackage(args);
1434
1435 fCancel = args.Cancel;
1436 return args.HResult;
1437 }
1438
1366 int IBootstrapperApplication.OnDetectRelatedMsiPackage(string wzPackageId, string wzUpgradeCode, string wzProductCode, bool fPerMachine, string wzVersion, RelatedOperation operation, ref bool fCancel) 1439 int IBootstrapperApplication.OnDetectRelatedMsiPackage(string wzPackageId, string wzUpgradeCode, string wzProductCode, bool fPerMachine, string wzVersion, RelatedOperation operation, ref bool fCancel)
1367 { 1440 {
1368 DetectRelatedMsiPackageEventArgs args = new DetectRelatedMsiPackageEventArgs(wzPackageId, wzUpgradeCode, wzProductCode, fPerMachine, wzVersion, operation, fCancel); 1441 DetectRelatedMsiPackageEventArgs args = new DetectRelatedMsiPackageEventArgs(wzPackageId, wzUpgradeCode, wzProductCode, fPerMachine, wzVersion, operation, fCancel);
@@ -1445,6 +1518,24 @@ namespace WixToolset.Mba.Core
1445 return args.HResult; 1518 return args.HResult;
1446 } 1519 }
1447 1520
1521 int IBootstrapperApplication.OnPlanCompatibleMsiPackageBegin(string wzPackageId, string wzCompatiblePackageId, string wzCompatiblePackageVersion, bool recommendedRemove, ref bool pRequestedRemove, ref bool fCancel)
1522 {
1523 PlanCompatibleMsiPackageBeginEventArgs args = new PlanCompatibleMsiPackageBeginEventArgs(wzPackageId, wzCompatiblePackageId, wzCompatiblePackageVersion, recommendedRemove, pRequestedRemove, fCancel);
1524 this.OnPlanCompatibleMsiPackageBegin(args);
1525
1526 pRequestedRemove = args.RequestRemove;
1527 fCancel = args.Cancel;
1528 return args.HResult;
1529 }
1530
1531 int IBootstrapperApplication.OnPlanCompatibleMsiPackageComplete(string wzPackageId, string wzCompatiblePackageId, int hrStatus, bool requestedRemove)
1532 {
1533 PlanCompatibleMsiPackageCompleteEventArgs args = new PlanCompatibleMsiPackageCompleteEventArgs(wzPackageId, wzCompatiblePackageId, hrStatus, requestedRemove);
1534 this.OnPlanCompatibleMsiPackageComplete(args);
1535
1536 return args.HResult;
1537 }
1538
1448 int IBootstrapperApplication.OnPlanPatchTarget(string wzPackageId, string wzProductCode, RequestState recommendedState, ref RequestState pRequestedState, ref bool fCancel) 1539 int IBootstrapperApplication.OnPlanPatchTarget(string wzPackageId, string wzProductCode, RequestState recommendedState, ref RequestState pRequestedState, ref bool fCancel)
1449 { 1540 {
1450 PlanPatchTargetEventArgs args = new PlanPatchTargetEventArgs(wzPackageId, wzProductCode, recommendedState, pRequestedState, fCancel); 1541 PlanPatchTargetEventArgs args = new PlanPatchTargetEventArgs(wzPackageId, wzProductCode, recommendedState, pRequestedState, fCancel);
@@ -1486,6 +1577,14 @@ namespace WixToolset.Mba.Core
1486 return args.HResult; 1577 return args.HResult;
1487 } 1578 }
1488 1579
1580 int IBootstrapperApplication.OnPlannedCompatiblePackage(string wzPackageId, string wzCompatiblePackageId, bool remove)
1581 {
1582 var args = new PlannedCompatiblePackageEventArgs(wzPackageId, wzCompatiblePackageId, remove);
1583 this.OnPlannedCompatiblePackage(args);
1584
1585 return args.HResult;
1586 }
1587
1489 int IBootstrapperApplication.OnPlannedPackage(string wzPackageId, ActionState execute, ActionState rollback, bool fPlannedCache, bool fPlannedUncache) 1588 int IBootstrapperApplication.OnPlannedPackage(string wzPackageId, ActionState execute, ActionState rollback, bool fPlannedCache, bool fPlannedUncache)
1490 { 1589 {
1491 var args = new PlannedPackageEventArgs(wzPackageId, execute, rollback, fPlannedCache, fPlannedUncache); 1590 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
@@ -496,6 +496,37 @@ namespace WixToolset.Mba.Core
496 } 496 }
497 497
498 /// <summary> 498 /// <summary>
499 /// Event arguments for <see cref="IDefaultBootstrapperApplication.DetectCompatibleMsiPackage"/>
500 /// </summary>
501 [Serializable]
502 public class DetectCompatibleMsiPackageEventArgs : CancellableHResultEventArgs
503 {
504 /// <summary />
505 public DetectCompatibleMsiPackageEventArgs(string packageId, string compatiblePackageId, string compatiblePackageVersion, bool cancelRecommendation)
506 : base(cancelRecommendation)
507 {
508 this.PackageId = packageId;
509 this.CompatiblePackageId = compatiblePackageId;
510 this.CompatiblePackageVersion = compatiblePackageVersion;
511 }
512
513 /// <summary>
514 /// Gets the identity of the package that was not detected.
515 /// </summary>
516 public string PackageId { get; private set; }
517
518 /// <summary>
519 /// Gets the identity of the compatible package that was detected.
520 /// </summary>
521 public string CompatiblePackageId { get; private set; }
522
523 /// <summary>
524 /// Gets the version of the compatible package that was detected.
525 /// </summary>
526 public string CompatiblePackageVersion { get; private set; }
527 }
528
529 /// <summary>
499 /// Event arguments for <see cref="IDefaultBootstrapperApplication.DetectRelatedMsiPackage"/> 530 /// Event arguments for <see cref="IDefaultBootstrapperApplication.DetectRelatedMsiPackage"/>
500 /// </summary> 531 /// </summary>
501 [Serializable] 532 [Serializable]
@@ -776,6 +807,80 @@ namespace WixToolset.Mba.Core
776 } 807 }
777 808
778 /// <summary> 809 /// <summary>
810 /// Event arguments for <see cref="IDefaultBootstrapperApplication.PlanCompatibleMsiPackageBegin"/>
811 /// </summary>
812 [Serializable]
813 public class PlanCompatibleMsiPackageBeginEventArgs : CancellableHResultEventArgs
814 {
815 /// <summary />
816 public PlanCompatibleMsiPackageBeginEventArgs(string packageId, string compatiblePackageId, string compatiblePackageVersion, bool recommendedRemove, bool requestRemove, bool cancelRecommendation)
817 : base(cancelRecommendation)
818 {
819 this.PackageId = packageId;
820 this.CompatiblePackageId = compatiblePackageId;
821 this.CompatiblePackageVersion = compatiblePackageVersion;
822 this.RecommendedRemove = recommendedRemove;
823 this.RequestRemove = requestRemove;
824 }
825
826 /// <summary>
827 /// Gets the identity of the package that was not detected.
828 /// </summary>
829 public string PackageId { get; private set; }
830
831 /// <summary>
832 /// Gets the identity of the compatible package detected.
833 /// </summary>
834 public string CompatiblePackageId { get; private set; }
835
836 /// <summary>
837 /// Gets the version of the compatible package detected.
838 /// </summary>
839 public string CompatiblePackageVersion { get; private set; }
840
841 /// <summary>
842 /// Gets the recommended state to use for the compatible package for planning.
843 /// </summary>
844 public bool RecommendedRemove { get; private set; }
845
846 /// <summary>
847 /// Gets or sets whether to uninstall the compatible package.
848 /// </summary>
849 public bool RequestRemove { get; set; }
850 }
851
852 /// <summary>
853 /// Event arguments for <see cref="IDefaultBootstrapperApplication.PlanCompatibleMsiPackageComplete"/>
854 /// </summary>
855 [Serializable]
856 public class PlanCompatibleMsiPackageCompleteEventArgs : StatusEventArgs
857 {
858 /// <summary />
859 public PlanCompatibleMsiPackageCompleteEventArgs(string packageId, string compatiblePackageId, int hrStatus, bool requestedRemove)
860 : base(hrStatus)
861 {
862 this.PackageId = packageId;
863 this.CompatiblePackageId = compatiblePackageId;
864 this.RequestedRemove = requestedRemove;
865 }
866
867 /// <summary>
868 /// Gets the identity of the package planned for.
869 /// </summary>
870 public string PackageId { get; private set; }
871
872 /// <summary>
873 /// Gets the identity of the compatible package detected.
874 /// </summary>
875 public string CompatiblePackageId { get; private set; }
876
877 /// <summary>
878 /// Gets the requested state of the package.
879 /// </summary>
880 public bool RequestedRemove { get; private set; }
881 }
882
883 /// <summary>
779 /// Event arguments for <see cref="IDefaultBootstrapperApplication.PlanRollbackBoundary"/> 884 /// Event arguments for <see cref="IDefaultBootstrapperApplication.PlanRollbackBoundary"/>
780 /// </summary> 885 /// </summary>
781 [Serializable] 886 [Serializable]
@@ -981,6 +1086,36 @@ namespace WixToolset.Mba.Core
981 } 1086 }
982 1087
983 /// <summary> 1088 /// <summary>
1089 /// Event arguments for <see cref="IDefaultBootstrapperApplication.PlannedCompatiblePackage"/>
1090 /// </summary>
1091 [Serializable]
1092 public class PlannedCompatiblePackageEventArgs : HResultEventArgs
1093 {
1094 /// <summary />
1095 public PlannedCompatiblePackageEventArgs(string packageId, string compatiblePackageId, bool remove)
1096 {
1097 this.PackageId = packageId;
1098 this.CompatiblePackageId = compatiblePackageId;
1099 this.Remove = remove;
1100 }
1101
1102 /// <summary>
1103 /// Gets the identity of the package planned for.
1104 /// </summary>
1105 public string PackageId { get; private set; }
1106
1107 /// <summary>
1108 /// Gets the identity of the compatible package detected.
1109 /// </summary>
1110 public string CompatiblePackageId { get; private set; }
1111
1112 /// <summary>
1113 /// Gets the planned state of the package.
1114 /// </summary>
1115 public bool Remove { get; private set; }
1116 }
1117
1118 /// <summary>
984 /// Event arguments for <see cref="IDefaultBootstrapperApplication.PlannedPackage"/> 1119 /// Event arguments for <see cref="IDefaultBootstrapperApplication.PlannedPackage"/>
985 /// </summary> 1120 /// </summary>
986 [Serializable] 1121 [Serializable]
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
@@ -182,16 +182,20 @@ namespace WixToolset.Mba.Core
182 ); 182 );
183 183
184 /// <summary> 184 /// <summary>
185 /// See <see cref="IDefaultBootstrapperApplication.DetectCompatibleMsiPackage"/>.
186 /// </summary>
187 [PreserveSig]
188 [return: MarshalAs(UnmanagedType.I4)]
189 int OnDetectCompatibleMsiPackage(
190 [MarshalAs(UnmanagedType.LPWStr)] string wzPackageId,
191 [MarshalAs(UnmanagedType.LPWStr)] string wzCompatiblePackageId,
192 [MarshalAs(UnmanagedType.LPWStr)] string wzCompatiblePackageVersion,
193 [MarshalAs(UnmanagedType.Bool)] ref bool fCancel
194 );
195
196 /// <summary>
185 /// See <see cref="IDefaultBootstrapperApplication.DetectRelatedMsiPackage"/>. 197 /// See <see cref="IDefaultBootstrapperApplication.DetectRelatedMsiPackage"/>.
186 /// </summary> 198 /// </summary>
187 /// <param name="wzPackageId"></param>
188 /// <param name="wzUpgradeCode"></param>
189 /// <param name="wzProductCode"></param>
190 /// <param name="fPerMachine"></param>
191 /// <param name="wzVersion"></param>
192 /// <param name="operation"></param>
193 /// <param name="fCancel"></param>
194 /// <returns></returns>
195 [PreserveSig] 199 [PreserveSig]
196 [return: MarshalAs(UnmanagedType.I4)] 200 [return: MarshalAs(UnmanagedType.I4)]
197 int OnDetectRelatedMsiPackage( 201 int OnDetectRelatedMsiPackage(
@@ -318,6 +322,32 @@ namespace WixToolset.Mba.Core
318 ); 322 );
319 323
320 /// <summary> 324 /// <summary>
325 /// See <see cref="IDefaultBootstrapperApplication.PlanCompatibleMsiPackageBegin"/>.
326 /// </summary>
327 [PreserveSig]
328 [return: MarshalAs(UnmanagedType.I4)]
329 int OnPlanCompatibleMsiPackageBegin(
330 [MarshalAs(UnmanagedType.LPWStr)] string wzPackageId,
331 [MarshalAs(UnmanagedType.LPWStr)] string wzCompatiblePackageId,
332 [MarshalAs(UnmanagedType.LPWStr)] string wzCompatiblePackageVersion,
333 [MarshalAs(UnmanagedType.Bool)] bool fRecommendedRemove,
334 [MarshalAs(UnmanagedType.Bool)] ref bool fRequestRemove,
335 [MarshalAs(UnmanagedType.Bool)] ref bool fCancel
336 );
337
338 /// <summary>
339 /// See <see cref="IDefaultBootstrapperApplication.PlanCompatibleMsiPackageComplete"/>.
340 /// </summary>
341 [PreserveSig]
342 [return: MarshalAs(UnmanagedType.I4)]
343 int OnPlanCompatibleMsiPackageComplete(
344 [MarshalAs(UnmanagedType.LPWStr)] string wzPackageId,
345 [MarshalAs(UnmanagedType.LPWStr)] string wzCompatiblePackageId,
346 int hrStatus,
347 [MarshalAs(UnmanagedType.Bool)] bool fRequestedRemove
348 );
349
350 /// <summary>
321 /// See <see cref="IDefaultBootstrapperApplication.PlanPatchTarget"/>. 351 /// See <see cref="IDefaultBootstrapperApplication.PlanPatchTarget"/>.
322 /// </summary> 352 /// </summary>
323 /// <param name="wzPackageId"></param> 353 /// <param name="wzPackageId"></param>
@@ -388,6 +418,17 @@ namespace WixToolset.Mba.Core
388 ); 418 );
389 419
390 /// <summary> 420 /// <summary>
421 /// See <see cref="IDefaultBootstrapperApplication.PlannedCompatiblePackage"/>.
422 /// </summary>
423 [PreserveSig]
424 [return: MarshalAs(UnmanagedType.I4)]
425 int OnPlannedCompatiblePackage(
426 [MarshalAs(UnmanagedType.LPWStr)] string wzPackageId,
427 [MarshalAs(UnmanagedType.LPWStr)] string wzCompatiblePackageId,
428 [MarshalAs(UnmanagedType.Bool)] bool fRemove
429 );
430
431 /// <summary>
391 /// See <see cref="IDefaultBootstrapperApplication.PlannedPackage"/>. 432 /// See <see cref="IDefaultBootstrapperApplication.PlannedPackage"/>.
392 /// </summary> 433 /// </summary>
393 [PreserveSig] 434 [PreserveSig]
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
@@ -134,6 +134,11 @@ namespace WixToolset.Mba.Core
134 event EventHandler<DetectBeginEventArgs> DetectBegin; 134 event EventHandler<DetectBeginEventArgs> DetectBegin;
135 135
136 /// <summary> 136 /// <summary>
137 /// Fired when a package was not detected but a package using the same provider key was.
138 /// </summary>
139 event EventHandler<DetectCompatibleMsiPackageEventArgs> DetectCompatibleMsiPackage;
140
141 /// <summary>
137 /// Fired when the detection phase has completed. 142 /// Fired when the detection phase has completed.
138 /// </summary> 143 /// </summary>
139 event EventHandler<DetectCompleteEventArgs> DetectComplete; 144 event EventHandler<DetectCompleteEventArgs> DetectComplete;
@@ -269,6 +274,16 @@ namespace WixToolset.Mba.Core
269 event EventHandler<PlanBeginEventArgs> PlanBegin; 274 event EventHandler<PlanBeginEventArgs> PlanBegin;
270 275
271 /// <summary> 276 /// <summary>
277 /// Fired when the engine plans a new, compatible package using the same provider key.
278 /// </summary>
279 event EventHandler<PlanCompatibleMsiPackageBeginEventArgs> PlanCompatibleMsiPackageBegin;
280
281 /// <summary>
282 /// Fired when the engine has completed planning the installation of a specific package.
283 /// </summary>
284 event EventHandler<PlanCompatibleMsiPackageCompleteEventArgs> PlanCompatibleMsiPackageComplete;
285
286 /// <summary>
272 /// Fired when the engine has completed planning the installation. 287 /// Fired when the engine has completed planning the installation.
273 /// </summary> 288 /// </summary>
274 event EventHandler<PlanCompleteEventArgs> PlanComplete; 289 event EventHandler<PlanCompleteEventArgs> PlanComplete;
@@ -279,6 +294,11 @@ namespace WixToolset.Mba.Core
279 event EventHandler<PlanForwardCompatibleBundleEventArgs> PlanForwardCompatibleBundle; 294 event EventHandler<PlanForwardCompatibleBundleEventArgs> PlanForwardCompatibleBundle;
280 295
281 /// <summary> 296 /// <summary>
297 /// Fired when the engine has completed planning a compatible package.
298 /// </summary>
299 event EventHandler<PlannedCompatiblePackageEventArgs> PlannedCompatiblePackage;
300
301 /// <summary>
282 /// Fired when the engine has completed planning a package. 302 /// Fired when the engine has completed planning a package.
283 /// </summary> 303 /// </summary>
284 event EventHandler<PlannedPackageEventArgs> PlannedPackage; 304 event EventHandler<PlannedPackageEventArgs> PlannedPackage;
@@ -399,4 +419,4 @@ namespace WixToolset.Mba.Core
399 /// </summary> 419 /// </summary>
400 event EventHandler<UnregisterCompleteEventArgs> UnregisterComplete; 420 event EventHandler<UnregisterCompleteEventArgs> UnregisterComplete;
401 } 421 }
402} \ No newline at end of file 422}
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
84 BA_FUNCTIONS_MESSAGE_ONPLANROLLBACKBOUNDARY = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANROLLBACKBOUNDARY, 84 BA_FUNCTIONS_MESSAGE_ONPLANROLLBACKBOUNDARY = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANROLLBACKBOUNDARY,
85 BA_FUNCTIONS_MESSAGE_ONSETUPDATEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATEBEGIN, 85 BA_FUNCTIONS_MESSAGE_ONSETUPDATEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATEBEGIN,
86 BA_FUNCTIONS_MESSAGE_ONSETUPDATECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATECOMPLETE, 86 BA_FUNCTIONS_MESSAGE_ONSETUPDATECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATECOMPLETE,
87 BA_FUNCTIONS_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE,
88 BA_FUNCTIONS_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN,
89 BA_FUNCTIONS_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE,
90 BA_FUNCTIONS_MESSAGE_ONPLANNEDCOMPATIBLEPACKAGE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDCOMPATIBLEPACKAGE,
87 91
88 BA_FUNCTIONS_MESSAGE_ONTHEMELOADED = 1024, 92 BA_FUNCTIONS_MESSAGE_ONTHEMELOADED = 1024,
89 BA_FUNCTIONS_MESSAGE_WNDPROC, 93 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
182 return S_OK; 182 return S_OK;
183 } 183 }
184 184
185 virtual STDMETHODIMP OnDetectCompatibleMsiPackage(
186 __in_z LPCWSTR /*wzPackageId*/,
187 __in_z LPCWSTR /*wzCompatiblePackageId*/,
188 __in LPCWSTR /*wzCompatiblePackageVersion*/,
189 __inout BOOL* /*pfCancel*/
190 )
191 {
192 return S_OK;
193 }
194
185 virtual STDMETHODIMP OnDetectRelatedMsiPackage( 195 virtual STDMETHODIMP OnDetectRelatedMsiPackage(
186 __in_z LPCWSTR /*wzPackageId*/, 196 __in_z LPCWSTR /*wzPackageId*/,
187 __in_z LPCWSTR /*wzUpgradeCode*/, 197 __in_z LPCWSTR /*wzUpgradeCode*/,
@@ -276,6 +286,28 @@ public: // IBootstrapperApplication
276 return S_OK; 286 return S_OK;
277 } 287 }
278 288
289 virtual STDMETHODIMP OnPlanCompatibleMsiPackageBegin(
290 __in_z LPCWSTR /*wzPackageId*/,
291 __in_z LPCWSTR /*wzCompatiblePackageId*/,
292 __in LPCWSTR /*wzCompatiblePackageVersion*/,
293 __in BOOL /*fRecommendedRemove*/,
294 __inout BOOL* /*pfRequestRemove*/,
295 __inout BOOL* /*pfCancel*/
296 )
297 {
298 return S_OK;
299 }
300
301 virtual STDMETHODIMP OnPlanCompatibleMsiPackageComplete(
302 __in_z LPCWSTR /*wzPackageId*/,
303 __in_z LPCWSTR /*wzCompatiblePackageId*/,
304 __in HRESULT /*hrStatus*/,
305 __in BOOL /*fRequestedRemove*/
306 )
307 {
308 return S_OK;
309 }
310
279 virtual STDMETHODIMP OnPlanPatchTarget( 311 virtual STDMETHODIMP OnPlanPatchTarget(
280 __in_z LPCWSTR /*wzPackageId*/, 312 __in_z LPCWSTR /*wzPackageId*/,
281 __in_z LPCWSTR /*wzProductCode*/, 313 __in_z LPCWSTR /*wzProductCode*/,
@@ -322,6 +354,15 @@ public: // IBootstrapperApplication
322 return S_OK; 354 return S_OK;
323 } 355 }
324 356
357 virtual STDMETHODIMP OnPlannedCompatiblePackage(
358 __in_z LPCWSTR /*wzPackageId*/,
359 __in_z LPCWSTR /*wzCompatiblePackageId*/,
360 __in BOOL /*fRemove*/
361 )
362 {
363 return S_OK;
364 }
365
325 virtual STDMETHODIMP OnPlannedPackage( 366 virtual STDMETHODIMP OnPlannedPackage(
326 __in_z LPCWSTR /*wzPackageId*/, 367 __in_z LPCWSTR /*wzPackageId*/,
327 __in BOOTSTRAPPER_ACTION_STATE /*execute*/, 368 __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(
155 case BA_FUNCTIONS_MESSAGE_ONPLANROLLBACKBOUNDARY: 155 case BA_FUNCTIONS_MESSAGE_ONPLANROLLBACKBOUNDARY:
156 case BA_FUNCTIONS_MESSAGE_ONSETUPDATEBEGIN: 156 case BA_FUNCTIONS_MESSAGE_ONSETUPDATEBEGIN:
157 case BA_FUNCTIONS_MESSAGE_ONSETUPDATECOMPLETE: 157 case BA_FUNCTIONS_MESSAGE_ONSETUPDATECOMPLETE:
158 case BA_FUNCTIONS_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE:
159 case BA_FUNCTIONS_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN:
160 case BA_FUNCTIONS_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE:
161 case BA_FUNCTIONS_MESSAGE_ONPLANNEDCOMPATIBLEPACKAGE:
158 hr = BalBaseBootstrapperApplicationProc((BOOTSTRAPPER_APPLICATION_MESSAGE)message, pvArgs, pvResults, pvContext); 162 hr = BalBaseBootstrapperApplicationProc((BOOTSTRAPPER_APPLICATION_MESSAGE)message, pvArgs, pvResults, pvContext);
159 break; 163 break;
160 case BA_FUNCTIONS_MESSAGE_ONTHEMELOADED: 164 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
189 return S_OK; 189 return S_OK;
190 } 190 }
191 191
192 virtual STDMETHODIMP OnDetectCompatibleMsiPackage(
193 __in_z LPCWSTR /*wzPackageId*/,
194 __in_z LPCWSTR /*wzCompatiblePackageId*/,
195 __in LPCWSTR /*wzCompatiblePackageVersion*/,
196 __inout BOOL* pfCancel
197 )
198 {
199 *pfCancel |= CheckCanceled();
200 return S_OK;
201 }
202
192 virtual STDMETHODIMP OnDetectRelatedMsiPackage( 203 virtual STDMETHODIMP OnDetectRelatedMsiPackage(
193 __in_z LPCWSTR /*wzPackageId*/, 204 __in_z LPCWSTR /*wzPackageId*/,
194 __in_z LPCWSTR /*wzUpgradeCode*/, 205 __in_z LPCWSTR /*wzUpgradeCode*/,
@@ -290,6 +301,29 @@ public: // IBootstrapperApplication
290 return S_OK; 301 return S_OK;
291 } 302 }
292 303
304 virtual STDMETHODIMP OnPlanCompatibleMsiPackageBegin(
305 __in_z LPCWSTR /*wzPackageId*/,
306 __in_z LPCWSTR /*wzCompatiblePackageId*/,
307 __in LPCWSTR /*wzCompatiblePackageVersion*/,
308 __in BOOL /*fRecommendedRemove*/,
309 __inout BOOL* /*pfRequestRemove*/,
310 __inout BOOL* pfCancel
311 )
312 {
313 *pfCancel |= CheckCanceled();
314 return S_OK;
315 }
316
317 virtual STDMETHODIMP OnPlanCompatibleMsiPackageComplete(
318 __in_z LPCWSTR /*wzPackageId*/,
319 __in_z LPCWSTR /*wzCompatiblePackageId*/,
320 __in HRESULT /*hrStatus*/,
321 __in BOOL /*fRequestedRemove*/
322 )
323 {
324 return S_OK;
325 }
326
293 virtual STDMETHODIMP OnPlanPatchTarget( 327 virtual STDMETHODIMP OnPlanPatchTarget(
294 __in_z LPCWSTR /*wzPackageId*/, 328 __in_z LPCWSTR /*wzPackageId*/,
295 __in_z LPCWSTR /*wzProductCode*/, 329 __in_z LPCWSTR /*wzProductCode*/,
@@ -339,6 +373,15 @@ public: // IBootstrapperApplication
339 return S_OK; 373 return S_OK;
340 } 374 }
341 375
376 virtual STDMETHODIMP OnPlannedCompatiblePackage(
377 __in_z LPCWSTR /*wzPackageId*/,
378 __in_z LPCWSTR /*wzCompatiblePackageId*/,
379 __in BOOL /*fRemove*/
380 )
381 {
382 return S_OK;
383 }
384
342 virtual STDMETHODIMP OnPlannedPackage( 385 virtual STDMETHODIMP OnPlannedPackage(
343 __in_z LPCWSTR /*wzPackageId*/, 386 __in_z LPCWSTR /*wzPackageId*/,
344 __in BOOTSTRAPPER_ACTION_STATE /*execute*/, 387 __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(
126 return pBA->OnDetectPackageBegin(pArgs->wzPackageId, &pResults->fCancel); 126 return pBA->OnDetectPackageBegin(pArgs->wzPackageId, &pResults->fCancel);
127} 127}
128 128
129static HRESULT BalBaseBAProcOnDetectCompatiblePackage(
130 __in IBootstrapperApplication* pBA,
131 __in BA_ONDETECTCOMPATIBLEMSIPACKAGE_ARGS* pArgs,
132 __inout BA_ONDETECTCOMPATIBLEMSIPACKAGE_RESULTS* pResults
133 )
134{
135 return pBA->OnDetectCompatibleMsiPackage(pArgs->wzPackageId, pArgs->wzCompatiblePackageId, pArgs->wzCompatiblePackageVersion, &pResults->fCancel);
136}
137
129static HRESULT BalBaseBAProcOnDetectRelatedMsiPackage( 138static HRESULT BalBaseBAProcOnDetectRelatedMsiPackage(
130 __in IBootstrapperApplication* pBA, 139 __in IBootstrapperApplication* pBA,
131 __in BA_ONDETECTRELATEDMSIPACKAGE_ARGS* pArgs, 140 __in BA_ONDETECTRELATEDMSIPACKAGE_ARGS* pArgs,
@@ -189,6 +198,24 @@ static HRESULT BalBaseBAProcOnPlanPackageBegin(
189 return pBA->OnPlanPackageBegin(pArgs->wzPackageId, pArgs->state, pArgs->fCached, pArgs->installCondition, pArgs->recommendedState, pArgs->recommendedCacheType, &pResults->requestedState, &pResults->requestedCacheType, &pResults->fCancel); 198 return pBA->OnPlanPackageBegin(pArgs->wzPackageId, pArgs->state, pArgs->fCached, pArgs->installCondition, pArgs->recommendedState, pArgs->recommendedCacheType, &pResults->requestedState, &pResults->requestedCacheType, &pResults->fCancel);
190} 199}
191 200
201static HRESULT BalBaseBAProcOnPlanCompatibleMsiPackageBegin(
202 __in IBootstrapperApplication* pBA,
203 __in BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_ARGS* pArgs,
204 __inout BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_RESULTS* pResults
205 )
206{
207 return pBA->OnPlanCompatibleMsiPackageBegin(pArgs->wzPackageId, pArgs->wzCompatiblePackageId, pArgs->wzCompatiblePackageVersion, pArgs->fRecommendedRemove, &pResults->fRequestRemove, &pResults->fCancel);
208}
209
210static HRESULT BalBaseBAProcOnPlanCompatibleMsiPackageComplete(
211 __in IBootstrapperApplication* pBA,
212 __in BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_ARGS* pArgs,
213 __inout BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_RESULTS* /*pResults*/
214 )
215{
216 return pBA->OnPlanCompatibleMsiPackageComplete(pArgs->wzPackageId, pArgs->wzCompatiblePackageId, pArgs->hrStatus, pArgs->fRequestedRemove);
217}
218
192static HRESULT BalBaseBAProcOnPlanPatchTarget( 219static HRESULT BalBaseBAProcOnPlanPatchTarget(
193 __in IBootstrapperApplication* pBA, 220 __in IBootstrapperApplication* pBA,
194 __in BA_ONPLANPATCHTARGET_ARGS* pArgs, 221 __in BA_ONPLANPATCHTARGET_ARGS* pArgs,
@@ -216,6 +243,15 @@ static HRESULT BalBaseBAProcOnPlanPackageComplete(
216 return pBA->OnPlanPackageComplete(pArgs->wzPackageId, pArgs->hrStatus, pArgs->requested); 243 return pBA->OnPlanPackageComplete(pArgs->wzPackageId, pArgs->hrStatus, pArgs->requested);
217} 244}
218 245
246static HRESULT BalBaseBAProcOnPlannedCompatiblePackage(
247 __in IBootstrapperApplication* pBA,
248 __in BA_ONPLANNEDCOMPATIBLEPACKAGE_ARGS* pArgs,
249 __inout BA_ONPLANNEDCOMPATIBLEPACKAGE_RESULTS* /*pResults*/
250 )
251{
252 return pBA->OnPlannedCompatiblePackage(pArgs->wzPackageId, pArgs->wzCompatiblePackageId, pArgs->fRemove);
253}
254
219static HRESULT BalBaseBAProcOnPlannedPackage( 255static HRESULT BalBaseBAProcOnPlannedPackage(
220 __in IBootstrapperApplication* pBA, 256 __in IBootstrapperApplication* pBA,
221 __in BA_ONPLANNEDPACKAGE_ARGS* pArgs, 257 __in BA_ONPLANNEDPACKAGE_ARGS* pArgs,
@@ -928,6 +964,18 @@ static HRESULT WINAPI BalBaseBootstrapperApplicationProc(
928 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATECOMPLETE: 964 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSETUPDATECOMPLETE:
929 hr = BalBaseBAProcOnSetUpdateComplete(pBA, reinterpret_cast<BA_ONSETUPDATECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONSETUPDATECOMPLETE_RESULTS*>(pvResults)); 965 hr = BalBaseBAProcOnSetUpdateComplete(pBA, reinterpret_cast<BA_ONSETUPDATECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONSETUPDATECOMPLETE_RESULTS*>(pvResults));
930 break; 966 break;
967 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE:
968 hr = BalBaseBAProcOnDetectCompatiblePackage(pBA, reinterpret_cast<BA_ONDETECTCOMPATIBLEMSIPACKAGE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTCOMPATIBLEMSIPACKAGE_RESULTS*>(pvResults));
969 break;
970 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN:
971 hr = BalBaseBAProcOnPlanCompatibleMsiPackageBegin(pBA, reinterpret_cast<BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_RESULTS*>(pvResults));
972 break;
973 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE:
974 hr = BalBaseBAProcOnPlanCompatibleMsiPackageComplete(pBA, reinterpret_cast<BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_RESULTS*>(pvResults));
975 break;
976 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDCOMPATIBLEPACKAGE:
977 hr = BalBaseBAProcOnPlannedCompatiblePackage(pBA, reinterpret_cast<BA_ONPLANNEDCOMPATIBLEPACKAGE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANNEDCOMPATIBLEPACKAGE_RESULTS*>(pvResults));
978 break;
931 } 979 }
932 } 980 }
933 981
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
101 __inout BOOL* pfCancel 101 __inout BOOL* pfCancel
102 ) = 0; 102 ) = 0;
103 103
104 // OnDetectCompatibleMsiPackage - called when the engine detects that a package is not installed but a newer package using the same provider key is.
105 STDMETHOD(OnDetectCompatibleMsiPackage)(
106 __in_z LPCWSTR wzPackageId,
107 __in_z LPCWSTR wzCompatiblePackageId,
108 __in_z LPCWSTR wzCompatiblePackageVersion,
109 __inout BOOL* pfCancel
110 ) = 0;
111
104 // OnDetectRelatedMsiPackage - called when the engine begins detects a related package. 112 // OnDetectRelatedMsiPackage - called when the engine begins detects a related package.
105 STDMETHOD(OnDetectRelatedMsiPackage)( 113 STDMETHOD(OnDetectRelatedMsiPackage)(
106 __in_z LPCWSTR wzPackageId, 114 __in_z LPCWSTR wzPackageId,
@@ -181,6 +189,25 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A
181 __inout BOOL* pfCancel 189 __inout BOOL* pfCancel
182 ) = 0; 190 ) = 0;
183 191
192 // OnPlanCompatibleMsiPackageBegin - called when the engine plans a newer, compatible package using the same provider key.
193 STDMETHOD(OnPlanCompatibleMsiPackageBegin)(
194 __in_z LPCWSTR wzPackageId,
195 __in_z LPCWSTR wzCompatiblePackageId,
196 __in_z LPCWSTR wzCompatiblePackageVersion,
197 __in BOOL fRecommendedRemove,
198 __inout BOOL* pfRequestRemove,
199 __inout BOOL* pfCancel
200 ) = 0;
201
202 // OnPlanCompatibleMsiPackageComplete - called after the engine plans the package.
203 //
204 STDMETHOD(OnPlanCompatibleMsiPackageComplete)(
205 __in_z LPCWSTR wzPackageId,
206 __in_z LPCWSTR wzCompatiblePackageId,
207 __in HRESULT hrStatus,
208 __in BOOL fRequestedRemove
209 ) = 0;
210
184 // OnPlanPatchTarget - called when the engine is about to plan a target 211 // OnPlanPatchTarget - called when the engine is about to plan a target
185 // of an MSP package. 212 // of an MSP package.
186 STDMETHOD(OnPlanPatchTarget)( 213 STDMETHOD(OnPlanPatchTarget)(
@@ -223,6 +250,13 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A
223 __in BOOTSTRAPPER_REQUEST_STATE requested 250 __in BOOTSTRAPPER_REQUEST_STATE requested
224 ) = 0; 251 ) = 0;
225 252
253 // OnPlannedCompatiblePackage - called after the engine has completed planning a compatible package.
254 STDMETHOD(OnPlannedCompatiblePackage)(
255 __in_z LPCWSTR wzPackageId,
256 __in_z LPCWSTR wzCompatiblePackageId,
257 __in BOOL fRemove
258 ) = 0;
259
226 // OnPlannedPackage - called after the engine has completed planning a package. 260 // OnPlannedPackage - called after the engine has completed planning a package.
227 STDMETHOD(OnPlannedPackage)( 261 STDMETHOD(OnPlannedPackage)(
228 __in_z LPCWSTR wzPackageId, 262 __in_z LPCWSTR wzPackageId,