diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-05-13 20:46:08 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-05-19 12:15:13 -0500 |
commit | 2c085b3aa89150fff9a0ea6df2cde0ce56e3066d (patch) | |
tree | d5c1cfb9e6fa1cc1270c813d28a6ca3ee4f84b0b | |
parent | f88ffc7f5c1710b5e106d7e6aea7f1e32fb15dfe (diff) | |
download | wix-2c085b3aa89150fff9a0ea6df2cde0ce56e3066d.tar.gz wix-2c085b3aa89150fff9a0ea6df2cde0ce56e3066d.tar.bz2 wix-2c085b3aa89150fff9a0ea6df2cde0ce56e3066d.zip |
Add InProgressDisplayName for bundles.
#6296
28 files changed, 391 insertions, 170 deletions
diff --git a/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h b/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h index 2a6d5c8a..56f6b361 100644 --- a/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h +++ b/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h | |||
@@ -20,6 +20,13 @@ enum BOOTSTRAPPER_RESTART | |||
20 | BOOTSTRAPPER_RESTART_ALWAYS, | 20 | BOOTSTRAPPER_RESTART_ALWAYS, |
21 | }; | 21 | }; |
22 | 22 | ||
23 | enum BOOTSTRAPPER_REGISTRATION_TYPE | ||
24 | { | ||
25 | BOOTSTRAPPER_REGISTRATION_TYPE_NONE, // The engine will ignore NONE if it recommended INPROGRESS or FULL. | ||
26 | BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS, | ||
27 | BOOTSTRAPPER_REGISTRATION_TYPE_FULL, | ||
28 | }; | ||
29 | |||
23 | enum BOOTSTRAPPER_RESUME_TYPE | 30 | enum BOOTSTRAPPER_RESUME_TYPE |
24 | { | 31 | { |
25 | BOOTSTRAPPER_RESUME_TYPE_NONE, | 32 | BOOTSTRAPPER_RESUME_TYPE_NONE, |
@@ -1163,12 +1170,14 @@ struct BA_ONPROGRESS_RESULTS | |||
1163 | struct BA_ONREGISTERBEGIN_ARGS | 1170 | struct BA_ONREGISTERBEGIN_ARGS |
1164 | { | 1171 | { |
1165 | DWORD cbSize; | 1172 | DWORD cbSize; |
1173 | BOOTSTRAPPER_REGISTRATION_TYPE recommendedRegistrationType; | ||
1166 | }; | 1174 | }; |
1167 | 1175 | ||
1168 | struct BA_ONREGISTERBEGIN_RESULTS | 1176 | struct BA_ONREGISTERBEGIN_RESULTS |
1169 | { | 1177 | { |
1170 | DWORD cbSize; | 1178 | DWORD cbSize; |
1171 | BOOL fCancel; | 1179 | BOOL fCancel; |
1180 | BOOTSTRAPPER_REGISTRATION_TYPE registrationType; | ||
1172 | }; | 1181 | }; |
1173 | 1182 | ||
1174 | struct BA_ONREGISTERCOMPLETE_ARGS | 1183 | struct BA_ONREGISTERCOMPLETE_ARGS |
@@ -1262,13 +1271,13 @@ struct BA_ONSYSTEMSHUTDOWN_RESULTS | |||
1262 | struct BA_ONUNREGISTERBEGIN_ARGS | 1271 | struct BA_ONUNREGISTERBEGIN_ARGS |
1263 | { | 1272 | { |
1264 | DWORD cbSize; | 1273 | DWORD cbSize; |
1265 | BOOL fKeepRegistration; | 1274 | BOOTSTRAPPER_REGISTRATION_TYPE recommendedRegistrationType; |
1266 | }; | 1275 | }; |
1267 | 1276 | ||
1268 | struct BA_ONUNREGISTERBEGIN_RESULTS | 1277 | struct BA_ONUNREGISTERBEGIN_RESULTS |
1269 | { | 1278 | { |
1270 | DWORD cbSize; | 1279 | DWORD cbSize; |
1271 | BOOL fForceKeepRegistration; | 1280 | BOOTSTRAPPER_REGISTRATION_TYPE registrationType; |
1272 | }; | 1281 | }; |
1273 | 1282 | ||
1274 | struct BA_ONUNREGISTERCOMPLETE_ARGS | 1283 | struct BA_ONUNREGISTERCOMPLETE_ARGS |
diff --git a/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs b/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs index 072d3ef0..d7dbf04c 100644 --- a/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs +++ b/src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs | |||
@@ -1490,12 +1490,13 @@ namespace WixToolset.Mba.Core | |||
1490 | return args.HResult; | 1490 | return args.HResult; |
1491 | } | 1491 | } |
1492 | 1492 | ||
1493 | int IBootstrapperApplication.OnRegisterBegin(ref bool fCancel) | 1493 | int IBootstrapperApplication.OnRegisterBegin(RegistrationType recommendedRegistrationType, ref bool fCancel, ref RegistrationType registrationType) |
1494 | { | 1494 | { |
1495 | RegisterBeginEventArgs args = new RegisterBeginEventArgs(fCancel); | 1495 | RegisterBeginEventArgs args = new RegisterBeginEventArgs(recommendedRegistrationType, fCancel, registrationType); |
1496 | this.OnRegisterBegin(args); | 1496 | this.OnRegisterBegin(args); |
1497 | 1497 | ||
1498 | fCancel = args.Cancel; | 1498 | fCancel = args.Cancel; |
1499 | registrationType = args.RegistrationType; | ||
1499 | return args.HResult; | 1500 | return args.HResult; |
1500 | } | 1501 | } |
1501 | 1502 | ||
@@ -1679,12 +1680,12 @@ namespace WixToolset.Mba.Core | |||
1679 | return args.HResult; | 1680 | return args.HResult; |
1680 | } | 1681 | } |
1681 | 1682 | ||
1682 | int IBootstrapperApplication.OnUnregisterBegin(bool fKeepRegistration, ref bool fForceKeepRegistration) | 1683 | int IBootstrapperApplication.OnUnregisterBegin(RegistrationType recommendedRegistrationType, ref RegistrationType registrationType) |
1683 | { | 1684 | { |
1684 | UnregisterBeginEventArgs args = new UnregisterBeginEventArgs(fKeepRegistration, fForceKeepRegistration); | 1685 | UnregisterBeginEventArgs args = new UnregisterBeginEventArgs(recommendedRegistrationType, registrationType); |
1685 | this.OnUnregisterBegin(args); | 1686 | this.OnUnregisterBegin(args); |
1686 | 1687 | ||
1687 | fForceKeepRegistration = args.ForceKeepRegistration; | 1688 | registrationType = args.RegistrationType; |
1688 | return args.HResult; | 1689 | return args.HResult; |
1689 | } | 1690 | } |
1690 | 1691 | ||
diff --git a/src/api/burn/WixToolset.Mba.Core/EventArgs.cs b/src/api/burn/WixToolset.Mba.Core/EventArgs.cs index 8ef8af14..00d90c83 100644 --- a/src/api/burn/WixToolset.Mba.Core/EventArgs.cs +++ b/src/api/burn/WixToolset.Mba.Core/EventArgs.cs | |||
@@ -1184,22 +1184,31 @@ namespace WixToolset.Mba.Core | |||
1184 | public class RegisterBeginEventArgs : CancellableHResultEventArgs | 1184 | public class RegisterBeginEventArgs : CancellableHResultEventArgs |
1185 | { | 1185 | { |
1186 | /// <summary /> | 1186 | /// <summary /> |
1187 | public RegisterBeginEventArgs(bool cancelRecommendation) | 1187 | public RegisterBeginEventArgs(RegistrationType recommendedRegistrationType, bool cancelRecommendation, RegistrationType registrationType) |
1188 | : base(cancelRecommendation) | 1188 | : base(cancelRecommendation) |
1189 | { | 1189 | { |
1190 | this.RecommendedRegistrationType = recommendedRegistrationType; | ||
1191 | this.RegistrationType = registrationType; | ||
1190 | } | 1192 | } |
1193 | |||
1194 | /// <summary> | ||
1195 | /// Gets the recommended registration type. | ||
1196 | /// </summary> | ||
1197 | public RegistrationType RecommendedRegistrationType { get; private set; } | ||
1198 | |||
1199 | /// <summary> | ||
1200 | /// Gets or sets the registration type. | ||
1201 | /// </summary> | ||
1202 | public RegistrationType RegistrationType { get; set; } | ||
1191 | } | 1203 | } |
1192 | 1204 | ||
1193 | /// <summary> | 1205 | /// <summary> |
1194 | /// Additional arguments used when the engine has completed registering the location and visilibity of the bundle. | 1206 | /// Event arguments for <see cref="IDefaultBootstrapperApplication.RegisterComplete"/>. |
1195 | /// </summary> | 1207 | /// </summary> |
1196 | [Serializable] | 1208 | [Serializable] |
1197 | public class RegisterCompleteEventArgs : StatusEventArgs | 1209 | public class RegisterCompleteEventArgs : StatusEventArgs |
1198 | { | 1210 | { |
1199 | /// <summary> | 1211 | /// <summary /> |
1200 | /// Creates a new instance of the <see cref="RegisterCompleteEventArgs"/> class. | ||
1201 | /// </summary> | ||
1202 | /// <param name="hrStatus">The return code of the operation.</param> | ||
1203 | public RegisterCompleteEventArgs(int hrStatus) | 1212 | public RegisterCompleteEventArgs(int hrStatus) |
1204 | : base(hrStatus) | 1213 | : base(hrStatus) |
1205 | { | 1214 | { |
@@ -1212,26 +1221,22 @@ namespace WixToolset.Mba.Core | |||
1212 | [Serializable] | 1221 | [Serializable] |
1213 | public class UnregisterBeginEventArgs : HResultEventArgs | 1222 | public class UnregisterBeginEventArgs : HResultEventArgs |
1214 | { | 1223 | { |
1215 | /// <summary> | 1224 | /// <summary /> |
1216 | /// | 1225 | public UnregisterBeginEventArgs(RegistrationType recommendedRegistrationType, RegistrationType registrationType) |
1217 | /// </summary> | ||
1218 | /// <param name="keepRegistration"></param> | ||
1219 | /// <param name="forceKeepRegistration"></param> | ||
1220 | public UnregisterBeginEventArgs(bool keepRegistration, bool forceKeepRegistration) | ||
1221 | { | 1226 | { |
1222 | this.KeepRegistration = keepRegistration; | 1227 | this.RecommendedRegistrationType = recommendedRegistrationType; |
1223 | this.ForceKeepRegistration = forceKeepRegistration; | 1228 | this.RegistrationType = registrationType; |
1224 | } | 1229 | } |
1225 | 1230 | ||
1226 | /// <summary> | 1231 | /// <summary> |
1227 | /// Indicates whether the engine will uninstall the bundle. | 1232 | /// Gets the recommended registration type. |
1228 | /// </summary> | 1233 | /// </summary> |
1229 | public bool ForceKeepRegistration { get; set; } | 1234 | public RegistrationType RecommendedRegistrationType { get; private set; } |
1230 | 1235 | ||
1231 | /// <summary> | 1236 | /// <summary> |
1232 | /// If <see cref="KeepRegistration"/> is FALSE, then this can be set to TRUE to make the engine keep the bundle installed. | 1237 | /// Gets or sets the registration type. |
1233 | /// </summary> | 1238 | /// </summary> |
1234 | public bool KeepRegistration { get; private set; } | 1239 | public RegistrationType RegistrationType { get; set; } |
1235 | } | 1240 | } |
1236 | 1241 | ||
1237 | /// <summary> | 1242 | /// <summary> |
@@ -1240,10 +1245,7 @@ namespace WixToolset.Mba.Core | |||
1240 | [Serializable] | 1245 | [Serializable] |
1241 | public class UnregisterCompleteEventArgs : StatusEventArgs | 1246 | public class UnregisterCompleteEventArgs : StatusEventArgs |
1242 | { | 1247 | { |
1243 | /// <summary> | 1248 | /// <summary /> |
1244 | /// | ||
1245 | /// </summary> | ||
1246 | /// <param name="hrStatus"></param> | ||
1247 | public UnregisterCompleteEventArgs(int hrStatus) | 1249 | public UnregisterCompleteEventArgs(int hrStatus) |
1248 | : base(hrStatus) | 1250 | : base(hrStatus) |
1249 | { | 1251 | { |
diff --git a/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs b/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs index 530fb1a9..e6e03906 100644 --- a/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs +++ b/src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs | |||
@@ -500,12 +500,12 @@ namespace WixToolset.Mba.Core | |||
500 | /// <summary> | 500 | /// <summary> |
501 | /// See <see cref="IDefaultBootstrapperApplication.RegisterBegin"/>. | 501 | /// See <see cref="IDefaultBootstrapperApplication.RegisterBegin"/>. |
502 | /// </summary> | 502 | /// </summary> |
503 | /// <param name="fCancel"></param> | ||
504 | /// <returns></returns> | ||
505 | [PreserveSig] | 503 | [PreserveSig] |
506 | [return: MarshalAs(UnmanagedType.I4)] | 504 | [return: MarshalAs(UnmanagedType.I4)] |
507 | int OnRegisterBegin( | 505 | int OnRegisterBegin( |
508 | [MarshalAs(UnmanagedType.Bool)] ref bool fCancel | 506 | [MarshalAs(UnmanagedType.I4)] RegistrationType recommendedRegistrationType, |
507 | [MarshalAs(UnmanagedType.Bool)] ref bool fCancel, | ||
508 | [MarshalAs(UnmanagedType.I4)] ref RegistrationType pRegistrationType | ||
509 | ); | 509 | ); |
510 | 510 | ||
511 | /// <summary> | 511 | /// <summary> |
@@ -820,14 +820,11 @@ namespace WixToolset.Mba.Core | |||
820 | /// <summary> | 820 | /// <summary> |
821 | /// See <see cref="IDefaultBootstrapperApplication.UnregisterBegin"/>. | 821 | /// See <see cref="IDefaultBootstrapperApplication.UnregisterBegin"/>. |
822 | /// </summary> | 822 | /// </summary> |
823 | /// <param name="fKeepRegistration"></param> | ||
824 | /// <param name="fForceKeepRegistration"></param> | ||
825 | /// <returns></returns> | ||
826 | [PreserveSig] | 823 | [PreserveSig] |
827 | [return: MarshalAs(UnmanagedType.I4)] | 824 | [return: MarshalAs(UnmanagedType.I4)] |
828 | int OnUnregisterBegin( | 825 | int OnUnregisterBegin( |
829 | [MarshalAs(UnmanagedType.Bool)] bool fKeepRegistration, | 826 | [MarshalAs(UnmanagedType.I4)] RegistrationType recommendedRegistrationType, |
830 | [MarshalAs(UnmanagedType.Bool)] ref bool fForceKeepRegistration | 827 | [MarshalAs(UnmanagedType.I4)] ref RegistrationType pRegistrationType |
831 | ); | 828 | ); |
832 | 829 | ||
833 | /// <summary> | 830 | /// <summary> |
@@ -1260,6 +1257,28 @@ namespace WixToolset.Mba.Core | |||
1260 | } | 1257 | } |
1261 | 1258 | ||
1262 | /// <summary> | 1259 | /// <summary> |
1260 | /// The display name to use when registering in Add/Remove Programs. | ||
1261 | /// </summary> | ||
1262 | public enum RegistrationType | ||
1263 | { | ||
1264 | /// <summary> | ||
1265 | /// No registration. | ||
1266 | /// The engine will ignore None if it recommended InProgress or Full. | ||
1267 | /// </summary> | ||
1268 | None, | ||
1269 | |||
1270 | /// <summary> | ||
1271 | /// The in-progress display name. | ||
1272 | /// </summary> | ||
1273 | InProgress, | ||
1274 | |||
1275 | /// <summary> | ||
1276 | /// The default display name. | ||
1277 | /// </summary> | ||
1278 | Full, | ||
1279 | } | ||
1280 | |||
1281 | /// <summary> | ||
1263 | /// Result codes (based on Dialog Box Command IDs from WinUser.h). | 1282 | /// Result codes (based on Dialog Box Command IDs from WinUser.h). |
1264 | /// </summary> | 1283 | /// </summary> |
1265 | public enum Result | 1284 | public enum Result |
diff --git a/src/api/burn/balutil/inc/BalBaseBAFunctions.h b/src/api/burn/balutil/inc/BalBaseBAFunctions.h index ee2e452f..c5771efc 100644 --- a/src/api/burn/balutil/inc/BalBaseBAFunctions.h +++ b/src/api/burn/balutil/inc/BalBaseBAFunctions.h | |||
@@ -379,7 +379,9 @@ public: // IBootstrapperApplication | |||
379 | } | 379 | } |
380 | 380 | ||
381 | virtual STDMETHODIMP OnRegisterBegin( | 381 | virtual STDMETHODIMP OnRegisterBegin( |
382 | __inout BOOL* /*pfCancel*/ | 382 | __in BOOTSTRAPPER_REGISTRATION_TYPE /*recommendedRegistrationType*/, |
383 | __inout BOOL* /*pfCancel*/, | ||
384 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* /*pRegistrationType*/ | ||
383 | ) | 385 | ) |
384 | { | 386 | { |
385 | return S_OK; | 387 | return S_OK; |
@@ -597,8 +599,8 @@ public: // IBootstrapperApplication | |||
597 | } | 599 | } |
598 | 600 | ||
599 | virtual STDMETHODIMP OnUnregisterBegin( | 601 | virtual STDMETHODIMP OnUnregisterBegin( |
600 | __in BOOL /*fKeepRegistration*/, | 602 | __in BOOTSTRAPPER_REGISTRATION_TYPE /*recommendedRegistrationType*/, |
601 | __inout BOOL* /*pfForceKeepRegistration*/ | 603 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* /*pRegistrationType*/ |
602 | ) | 604 | ) |
603 | { | 605 | { |
604 | return S_OK; | 606 | return S_OK; |
diff --git a/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h b/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h index bf21c4a5..393987ba 100644 --- a/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h +++ b/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h | |||
@@ -435,7 +435,9 @@ public: // IBootstrapperApplication | |||
435 | } | 435 | } |
436 | 436 | ||
437 | virtual STDMETHODIMP OnRegisterBegin( | 437 | virtual STDMETHODIMP OnRegisterBegin( |
438 | __inout BOOL* pfCancel | 438 | __in BOOTSTRAPPER_REGISTRATION_TYPE /*recommendedRegistrationType*/, |
439 | __inout BOOL* pfCancel, | ||
440 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* /*pRegistrationType*/ | ||
439 | ) | 441 | ) |
440 | { | 442 | { |
441 | *pfCancel |= CheckCanceled(); | 443 | *pfCancel |= CheckCanceled(); |
@@ -769,8 +771,8 @@ public: // IBootstrapperApplication | |||
769 | } | 771 | } |
770 | 772 | ||
771 | virtual STDMETHODIMP OnUnregisterBegin( | 773 | virtual STDMETHODIMP OnUnregisterBegin( |
772 | __in BOOL /*fKeepRegistration*/, | 774 | __in BOOTSTRAPPER_REGISTRATION_TYPE /*recommendedRegistrationType*/, |
773 | __inout BOOL* /*pfForceKeepRegistration*/ | 775 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* /*pRegistrationType*/ |
774 | ) | 776 | ) |
775 | { | 777 | { |
776 | return S_OK; | 778 | return S_OK; |
diff --git a/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h b/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h index 7fe3ffd8..69031d62 100644 --- a/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h +++ b/src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h | |||
@@ -263,11 +263,11 @@ static HRESULT BalBaseBAProcOnError( | |||
263 | 263 | ||
264 | static HRESULT BalBaseBAProcOnRegisterBegin( | 264 | static HRESULT BalBaseBAProcOnRegisterBegin( |
265 | __in IBootstrapperApplication* pBA, | 265 | __in IBootstrapperApplication* pBA, |
266 | __in BA_ONREGISTERBEGIN_ARGS* /*pArgs*/, | 266 | __in BA_ONREGISTERBEGIN_ARGS* pArgs, |
267 | __inout BA_ONREGISTERBEGIN_RESULTS* pResults | 267 | __inout BA_ONREGISTERBEGIN_RESULTS* pResults |
268 | ) | 268 | ) |
269 | { | 269 | { |
270 | return pBA->OnRegisterBegin(&pResults->fCancel); | 270 | return pBA->OnRegisterBegin(pArgs->recommendedRegistrationType, &pResults->fCancel, &pResults->registrationType); |
271 | } | 271 | } |
272 | 272 | ||
273 | static HRESULT BalBaseBAProcOnRegisterComplete( | 273 | static HRESULT BalBaseBAProcOnRegisterComplete( |
@@ -456,7 +456,7 @@ static HRESULT BalBaseBAProcOnUnregisterBegin( | |||
456 | __inout BA_ONUNREGISTERBEGIN_RESULTS* pResults | 456 | __inout BA_ONUNREGISTERBEGIN_RESULTS* pResults |
457 | ) | 457 | ) |
458 | { | 458 | { |
459 | return pBA->OnUnregisterBegin(pArgs->fKeepRegistration, &pResults->fForceKeepRegistration); | 459 | return pBA->OnUnregisterBegin(pArgs->recommendedRegistrationType, &pResults->registrationType); |
460 | } | 460 | } |
461 | 461 | ||
462 | static HRESULT BalBaseBAProcOnUnregisterComplete( | 462 | static HRESULT BalBaseBAProcOnUnregisterComplete( |
diff --git a/src/api/burn/balutil/inc/IBootstrapperApplication.h b/src/api/burn/balutil/inc/IBootstrapperApplication.h index c284cb49..98b88f44 100644 --- a/src/api/burn/balutil/inc/IBootstrapperApplication.h +++ b/src/api/burn/balutil/inc/IBootstrapperApplication.h | |||
@@ -280,7 +280,9 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A | |||
280 | // OnRegisterBegin - called when the engine registers the bundle. | 280 | // OnRegisterBegin - called when the engine registers the bundle. |
281 | // | 281 | // |
282 | STDMETHOD(OnRegisterBegin)( | 282 | STDMETHOD(OnRegisterBegin)( |
283 | __inout BOOL* pfCancel | 283 | __in BOOTSTRAPPER_REGISTRATION_TYPE recommendedRegistrationType, |
284 | __inout BOOL* pfCancel, | ||
285 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType | ||
284 | ) = 0; | 286 | ) = 0; |
285 | 287 | ||
286 | // OnRegisterComplete - called when the engine registration is | 288 | // OnRegisterComplete - called when the engine registration is |
@@ -519,8 +521,8 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A | |||
519 | // OnUnregisterBegin - called when the engine unregisters the bundle. | 521 | // OnUnregisterBegin - called when the engine unregisters the bundle. |
520 | // | 522 | // |
521 | STDMETHOD(OnUnregisterBegin)( | 523 | STDMETHOD(OnUnregisterBegin)( |
522 | __in BOOL fKeepRegistration, | 524 | __in BOOTSTRAPPER_REGISTRATION_TYPE recommendedRegistrationType, |
523 | __inout BOOL* pfForceKeepRegistration | 525 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType |
524 | ) = 0; | 526 | ) = 0; |
525 | 527 | ||
526 | // OnUnregisterComplete - called when the engine unregistration is complete. | 528 | // OnUnregisterComplete - called when the engine unregistration is complete. |
diff --git a/src/api/wix/WixToolset.Data/Burn/BurnConstants.cs b/src/api/wix/WixToolset.Data/Burn/BurnConstants.cs index 484b144d..1ecccbd2 100644 --- a/src/api/wix/WixToolset.Data/Burn/BurnConstants.cs +++ b/src/api/wix/WixToolset.Data/Burn/BurnConstants.cs | |||
@@ -18,6 +18,7 @@ namespace WixToolset.Data.Burn | |||
18 | public const string BundleExtensionSearchSymbolDefinitionTag = "WixBundleExtensionSearch"; | 18 | public const string BundleExtensionSearchSymbolDefinitionTag = "WixBundleExtensionSearch"; |
19 | 19 | ||
20 | // The following constants must stay in sync with src\burn\engine\core.h | 20 | // The following constants must stay in sync with src\burn\engine\core.h |
21 | public const string BURN_BUNDLE_INPROGRESS_NAME = "WixBundleInProgressName"; | ||
21 | public const string BURN_BUNDLE_NAME = "WixBundleName"; | 22 | public const string BURN_BUNDLE_NAME = "WixBundleName"; |
22 | public const string BURN_BUNDLE_ORIGINAL_SOURCE = "WixBundleOriginalSource"; | 23 | public const string BURN_BUNDLE_ORIGINAL_SOURCE = "WixBundleOriginalSource"; |
23 | public const string BURN_BUNDLE_ORIGINAL_SOURCE_FOLDER = "WixBundleOriginalSourceFolder"; | 24 | public const string BURN_BUNDLE_ORIGINAL_SOURCE_FOLDER = "WixBundleOriginalSourceFolder"; |
diff --git a/src/api/wix/WixToolset.Data/Symbols/WixBundleSymbol.cs b/src/api/wix/WixToolset.Data/Symbols/WixBundleSymbol.cs index 8cad5c36..9724cbd7 100644 --- a/src/api/wix/WixToolset.Data/Symbols/WixBundleSymbol.cs +++ b/src/api/wix/WixToolset.Data/Symbols/WixBundleSymbol.cs | |||
@@ -32,6 +32,7 @@ namespace WixToolset.Data | |||
32 | new IntermediateFieldDefinition(nameof(WixBundleSymbolFields.ParentName), IntermediateFieldType.String), | 32 | new IntermediateFieldDefinition(nameof(WixBundleSymbolFields.ParentName), IntermediateFieldType.String), |
33 | new IntermediateFieldDefinition(nameof(WixBundleSymbolFields.BundleId), IntermediateFieldType.String), | 33 | new IntermediateFieldDefinition(nameof(WixBundleSymbolFields.BundleId), IntermediateFieldType.String), |
34 | new IntermediateFieldDefinition(nameof(WixBundleSymbolFields.ProviderKey), IntermediateFieldType.String), | 34 | new IntermediateFieldDefinition(nameof(WixBundleSymbolFields.ProviderKey), IntermediateFieldType.String), |
35 | new IntermediateFieldDefinition(nameof(WixBundleSymbolFields.InProgressName), IntermediateFieldType.String), | ||
35 | }, | 36 | }, |
36 | typeof(WixBundleSymbol)); | 37 | typeof(WixBundleSymbol)); |
37 | } | 38 | } |
@@ -65,6 +66,7 @@ namespace WixToolset.Data.Symbols | |||
65 | ParentName, | 66 | ParentName, |
66 | BundleId, | 67 | BundleId, |
67 | ProviderKey, | 68 | ProviderKey, |
69 | InProgressName, | ||
68 | } | 70 | } |
69 | 71 | ||
70 | [Flags] | 72 | [Flags] |
@@ -221,6 +223,12 @@ namespace WixToolset.Data.Symbols | |||
221 | set => this.Set((int)WixBundleSymbolFields.ProviderKey, value); | 223 | set => this.Set((int)WixBundleSymbolFields.ProviderKey, value); |
222 | } | 224 | } |
223 | 225 | ||
226 | public string InProgressName | ||
227 | { | ||
228 | get => (string)this.Fields[(int)WixBundleSymbolFields.InProgressName]; | ||
229 | set => this.Set((int)WixBundleSymbolFields.InProgressName, value); | ||
230 | } | ||
231 | |||
224 | public PackagingType DefaultPackagingType => (this.Compressed.HasValue && !this.Compressed.Value) ? PackagingType.External : PackagingType.Embedded; | 232 | public PackagingType DefaultPackagingType => (this.Compressed.HasValue && !this.Compressed.Value) ? PackagingType.External : PackagingType.Embedded; |
225 | 233 | ||
226 | public bool DisableModify => (this.Attributes & WixBundleAttributes.DisableModify) == WixBundleAttributes.DisableModify; | 234 | public bool DisableModify => (this.Attributes & WixBundleAttributes.DisableModify) == WixBundleAttributes.DisableModify; |
diff --git a/src/api/wix/api_wix.sln b/src/api/wix/api_wix.sln index 6b799e66..6096c12a 100644 --- a/src/api/wix/api_wix.sln +++ b/src/api/wix/api_wix.sln | |||
@@ -1,7 +1,7 @@ | |||
1 |  | 1 |  |
2 | Microsoft Visual Studio Solution File, Format Version 12.00 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 |
3 | # Visual Studio 15 | 3 | # Visual Studio Version 16 |
4 | VisualStudioVersion = 15.0.27004.2009 | 4 | VisualStudioVersion = 16.0.31205.134 |
5 | MinimumVisualStudioVersion = 10.0.40219.1 | 5 | MinimumVisualStudioVersion = 10.0.40219.1 |
6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Data", "WixToolset.Data\WixToolset.Data.csproj", "{73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}" | 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Data", "WixToolset.Data\WixToolset.Data.csproj", "{73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}" |
7 | EndProject | 7 | EndProject |
@@ -12,43 +12,33 @@ EndProject | |||
12 | Global | 12 | Global |
13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution | 13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution |
14 | Debug|Any CPU = Debug|Any CPU | 14 | Debug|Any CPU = Debug|Any CPU |
15 | Debug|arm = Debug|arm | ||
16 | Debug|x64 = Debug|x64 | 15 | Debug|x64 = Debug|x64 |
17 | Debug|x86 = Debug|x86 | 16 | Debug|x86 = Debug|x86 |
18 | Release|Any CPU = Release|Any CPU | 17 | Release|Any CPU = Release|Any CPU |
19 | Release|arm = Release|arm | ||
20 | Release|x64 = Release|x64 | 18 | Release|x64 = Release|x64 |
21 | Release|x86 = Release|x86 | 19 | Release|x86 = Release|x86 |
22 | EndGlobalSection | 20 | EndGlobalSection |
23 | GlobalSection(ProjectConfigurationPlatforms) = postSolution | 21 | GlobalSection(ProjectConfigurationPlatforms) = postSolution |
24 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 22 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
25 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|Any CPU.Build.0 = Debug|Any CPU | 23 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|Any CPU.Build.0 = Debug|Any CPU |
26 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|arm.ActiveCfg = Debug|Any CPU | ||
27 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|arm.Build.0 = Debug|Any CPU | ||
28 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|x64.ActiveCfg = Debug|Any CPU | 24 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|x64.ActiveCfg = Debug|Any CPU |
29 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|x64.Build.0 = Debug|Any CPU | 25 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|x64.Build.0 = Debug|Any CPU |
30 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|x86.ActiveCfg = Debug|Any CPU | 26 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|x86.ActiveCfg = Debug|Any CPU |
31 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|x86.Build.0 = Debug|Any CPU | 27 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Debug|x86.Build.0 = Debug|Any CPU |
32 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|Any CPU.ActiveCfg = Release|Any CPU | 28 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|Any CPU.ActiveCfg = Release|Any CPU |
33 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|Any CPU.Build.0 = Release|Any CPU | 29 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|Any CPU.Build.0 = Release|Any CPU |
34 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|arm.ActiveCfg = Release|Any CPU | ||
35 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|arm.Build.0 = Release|Any CPU | ||
36 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|x64.ActiveCfg = Release|Any CPU | 30 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|x64.ActiveCfg = Release|Any CPU |
37 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|x64.Build.0 = Release|Any CPU | 31 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|x64.Build.0 = Release|Any CPU |
38 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|x86.ActiveCfg = Release|Any CPU | 32 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|x86.ActiveCfg = Release|Any CPU |
39 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|x86.Build.0 = Release|Any CPU | 33 | {73ADBD3A-8FB2-47DB-BC79-9BC61C40F2E0}.Release|x86.Build.0 = Release|Any CPU |
40 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 34 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
41 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|Any CPU.Build.0 = Debug|Any CPU | 35 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|Any CPU.Build.0 = Debug|Any CPU |
42 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|arm.ActiveCfg = Debug|Any CPU | ||
43 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|arm.Build.0 = Debug|Any CPU | ||
44 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|x64.ActiveCfg = Debug|Any CPU | 36 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|x64.ActiveCfg = Debug|Any CPU |
45 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|x64.Build.0 = Debug|Any CPU | 37 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|x64.Build.0 = Debug|Any CPU |
46 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|x86.ActiveCfg = Debug|Any CPU | 38 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|x86.ActiveCfg = Debug|Any CPU |
47 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|x86.Build.0 = Debug|Any CPU | 39 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Debug|x86.Build.0 = Debug|Any CPU |
48 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Release|Any CPU.ActiveCfg = Release|Any CPU | 40 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Release|Any CPU.ActiveCfg = Release|Any CPU |
49 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Release|Any CPU.Build.0 = Release|Any CPU | 41 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Release|Any CPU.Build.0 = Release|Any CPU |
50 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Release|arm.ActiveCfg = Release|Any CPU | ||
51 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Release|arm.Build.0 = Release|Any CPU | ||
52 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Release|x64.ActiveCfg = Release|Any CPU | 42 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Release|x64.ActiveCfg = Release|Any CPU |
53 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Release|x64.Build.0 = Release|Any CPU | 43 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Release|x64.Build.0 = Release|Any CPU |
54 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Release|x86.ActiveCfg = Release|Any CPU | 44 | {6C1FA8B7-BF3C-4735-95F8-26DEEFEF00C8}.Release|x86.ActiveCfg = Release|Any CPU |
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp index aad9e6eb..c32f4c84 100644 --- a/src/burn/engine/apply.cpp +++ b/src/burn/engine/apply.cpp | |||
@@ -75,7 +75,8 @@ static HRESULT WINAPI AuthenticationRequired( | |||
75 | 75 | ||
76 | static void CalculateKeepRegistration( | 76 | static void CalculateKeepRegistration( |
77 | __in BURN_ENGINE_STATE* pEngineState, | 77 | __in BURN_ENGINE_STATE* pEngineState, |
78 | __inout BOOL* pfKeepRegistration | 78 | __in BOOL fLog, |
79 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType | ||
79 | ); | 80 | ); |
80 | static HRESULT ExecuteDependentRegistrationActions( | 81 | static HRESULT ExecuteDependentRegistrationActions( |
81 | __in HANDLE hPipe, | 82 | __in HANDLE hPipe, |
@@ -376,8 +377,11 @@ extern "C" HRESULT ApplyRegister( | |||
376 | { | 377 | { |
377 | HRESULT hr = S_OK; | 378 | HRESULT hr = S_OK; |
378 | LPWSTR sczEngineWorkingPath = NULL; | 379 | LPWSTR sczEngineWorkingPath = NULL; |
380 | BOOTSTRAPPER_REGISTRATION_TYPE registrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; | ||
379 | 381 | ||
380 | hr = UserExperienceOnRegisterBegin(&pEngineState->userExperience); | 382 | CalculateKeepRegistration(pEngineState, FALSE, ®istrationType); |
383 | |||
384 | hr = UserExperienceOnRegisterBegin(&pEngineState->userExperience, ®istrationType); | ||
381 | ExitOnRootFailure(hr, "BA aborted register begin."); | 385 | ExitOnRootFailure(hr, "BA aborted register begin."); |
382 | 386 | ||
383 | // If we have a resume mode that suggests the bundle is on the machine. | 387 | // If we have a resume mode that suggests the bundle is on the machine. |
@@ -386,12 +390,12 @@ extern "C" HRESULT ApplyRegister( | |||
386 | // resume previous session | 390 | // resume previous session |
387 | if (pEngineState->registration.fPerMachine) | 391 | if (pEngineState->registration.fPerMachine) |
388 | { | 392 | { |
389 | hr = ElevationSessionResume(pEngineState->companionConnection.hPipe, pEngineState->registration.sczResumeCommandLine, pEngineState->registration.fDisableResume, &pEngineState->variables); | 393 | hr = ElevationSessionResume(pEngineState->companionConnection.hPipe, pEngineState->registration.sczResumeCommandLine, pEngineState->registration.fDisableResume, &pEngineState->variables, registrationType); |
390 | ExitOnFailure(hr, "Failed to resume registration session in per-machine process."); | 394 | ExitOnFailure(hr, "Failed to resume registration session in per-machine process."); |
391 | } | 395 | } |
392 | else | 396 | else |
393 | { | 397 | { |
394 | hr = RegistrationSessionResume(&pEngineState->registration, &pEngineState->variables); | 398 | hr = RegistrationSessionResume(&pEngineState->registration, &pEngineState->variables, registrationType); |
395 | ExitOnFailure(hr, "Failed to resume registration session."); | 399 | ExitOnFailure(hr, "Failed to resume registration session."); |
396 | } | 400 | } |
397 | } | 401 | } |
@@ -403,12 +407,12 @@ extern "C" HRESULT ApplyRegister( | |||
403 | // begin new session | 407 | // begin new session |
404 | if (pEngineState->registration.fPerMachine) | 408 | if (pEngineState->registration.fPerMachine) |
405 | { | 409 | { |
406 | hr = ElevationSessionBegin(pEngineState->companionConnection.hPipe, sczEngineWorkingPath, pEngineState->registration.sczResumeCommandLine, pEngineState->registration.fDisableResume, &pEngineState->variables, pEngineState->plan.dwRegistrationOperations, pEngineState->plan.dependencyRegistrationAction, pEngineState->plan.qwEstimatedSize); | 410 | hr = ElevationSessionBegin(pEngineState->companionConnection.hPipe, sczEngineWorkingPath, pEngineState->registration.sczResumeCommandLine, pEngineState->registration.fDisableResume, &pEngineState->variables, pEngineState->plan.dwRegistrationOperations, pEngineState->plan.dependencyRegistrationAction, pEngineState->plan.qwEstimatedSize, registrationType); |
407 | ExitOnFailure(hr, "Failed to begin registration session in per-machine process."); | 411 | ExitOnFailure(hr, "Failed to begin registration session in per-machine process."); |
408 | } | 412 | } |
409 | else | 413 | else |
410 | { | 414 | { |
411 | hr = RegistrationSessionBegin(sczEngineWorkingPath, &pEngineState->registration, &pEngineState->variables, pEngineState->plan.dwRegistrationOperations, pEngineState->plan.dependencyRegistrationAction, pEngineState->plan.qwEstimatedSize); | 415 | hr = RegistrationSessionBegin(sczEngineWorkingPath, &pEngineState->registration, &pEngineState->variables, pEngineState->plan.dwRegistrationOperations, pEngineState->plan.dependencyRegistrationAction, pEngineState->plan.qwEstimatedSize, registrationType); |
412 | ExitOnFailure(hr, "Failed to begin registration session."); | 416 | ExitOnFailure(hr, "Failed to begin registration session."); |
413 | } | 417 | } |
414 | } | 418 | } |
@@ -441,17 +445,11 @@ extern "C" HRESULT ApplyUnregister( | |||
441 | { | 445 | { |
442 | HRESULT hr = S_OK; | 446 | HRESULT hr = S_OK; |
443 | BURN_RESUME_MODE resumeMode = BURN_RESUME_MODE_NONE; | 447 | BURN_RESUME_MODE resumeMode = BURN_RESUME_MODE_NONE; |
444 | BOOL fKeepRegistration = pEngineState->plan.fDisallowRemoval; | 448 | BOOTSTRAPPER_REGISTRATION_TYPE defaultRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE; |
445 | 449 | BOOTSTRAPPER_REGISTRATION_TYPE registrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE; | |
446 | CalculateKeepRegistration(pEngineState, &fKeepRegistration); | ||
447 | |||
448 | hr = UserExperienceOnUnregisterBegin(&pEngineState->userExperience, &fKeepRegistration); | ||
449 | ExitOnRootFailure(hr, "BA aborted unregister begin."); | ||
450 | 450 | ||
451 | // Calculate the correct resume mode. If a restart has been initiated, that trumps all other | 451 | // Calculate special cases for the resume mode. If a restart has been initiated, that trumps all other |
452 | // modes. If the user chose to suspend the install then we'll use that as the resume mode. | 452 | // modes. If the user chose to suspend the install then we'll use that as the resume mode. |
453 | // Barring those special cases, if it was determined that we should keep the registration then | ||
454 | // do that, otherwise the resume mode was initialized to none and registration will be removed. | ||
455 | if (BOOTSTRAPPER_APPLY_RESTART_INITIATED == restart) | 453 | if (BOOTSTRAPPER_APPLY_RESTART_INITIATED == restart) |
456 | { | 454 | { |
457 | resumeMode = BURN_RESUME_MODE_REBOOT_PENDING; | 455 | resumeMode = BURN_RESUME_MODE_REBOOT_PENDING; |
@@ -460,28 +458,50 @@ extern "C" HRESULT ApplyUnregister( | |||
460 | { | 458 | { |
461 | resumeMode = BURN_RESUME_MODE_SUSPEND; | 459 | resumeMode = BURN_RESUME_MODE_SUSPEND; |
462 | } | 460 | } |
463 | else if (fKeepRegistration) | 461 | else if (pEngineState->plan.fDisallowRemoval) |
462 | { | ||
463 | resumeMode = BURN_RESUME_MODE_ARP; | ||
464 | } | ||
465 | |||
466 | // If there was a special case, make sure the registration is kept. | ||
467 | if (BURN_RESUME_MODE_NONE < resumeMode) | ||
468 | { | ||
469 | defaultRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; | ||
470 | } | ||
471 | |||
472 | CalculateKeepRegistration(pEngineState, TRUE, &defaultRegistrationType); | ||
473 | |||
474 | registrationType = defaultRegistrationType; | ||
475 | |||
476 | hr = UserExperienceOnUnregisterBegin(&pEngineState->userExperience, ®istrationType); | ||
477 | ExitOnRootFailure(hr, "BA aborted unregister begin."); | ||
478 | |||
479 | // Barring the special cases, if it was determined that we should keep the registration then | ||
480 | // do that, otherwise the resume mode is NONE and registration will be removed. | ||
481 | if (BURN_RESUME_MODE_NONE == resumeMode && BOOTSTRAPPER_REGISTRATION_TYPE_NONE < registrationType) | ||
464 | { | 482 | { |
465 | resumeMode = BURN_RESUME_MODE_ARP; | 483 | resumeMode = BURN_RESUME_MODE_ARP; |
466 | } | 484 | } |
467 | 485 | ||
468 | // If apply failed in any way and we're going to be keeping the bundle registered then | 486 | // If apply failed in any way and we're going to be keeping the bundle registered then |
469 | // execute any rollback dependency registration actions. | 487 | // execute any rollback dependency registration actions. |
470 | if (fFailed && fKeepRegistration) | 488 | if (fFailed && BURN_RESUME_MODE_NONE < resumeMode) |
471 | { | 489 | { |
472 | // Execute any rollback registration actions. | 490 | // Execute any rollback registration actions. |
473 | HRESULT hrRegistrationRollback = ExecuteDependentRegistrationActions(pEngineState->companionConnection.hPipe, &pEngineState->registration, pEngineState->plan.rgRollbackRegistrationActions, pEngineState->plan.cRollbackRegistrationActions); | 491 | HRESULT hrRegistrationRollback = ExecuteDependentRegistrationActions(pEngineState->companionConnection.hPipe, &pEngineState->registration, pEngineState->plan.rgRollbackRegistrationActions, pEngineState->plan.cRollbackRegistrationActions); |
474 | UNREFERENCED_PARAMETER(hrRegistrationRollback); | 492 | IgnoreRollbackError(hrRegistrationRollback, "Dependent registration actions failed"); |
475 | } | 493 | } |
476 | 494 | ||
495 | LogId(REPORT_STANDARD, MSG_SESSION_END, pEngineState->registration.sczRegistrationKey, LoggingResumeModeToString(resumeMode), LoggingRestartToString(restart), LoggingBoolToString(pEngineState->registration.fDisableResume), LoggingRegistrationTypeToString(defaultRegistrationType), LoggingRegistrationTypeToString(registrationType)); | ||
496 | |||
477 | if (pEngineState->registration.fPerMachine) | 497 | if (pEngineState->registration.fPerMachine) |
478 | { | 498 | { |
479 | hr = ElevationSessionEnd(pEngineState->companionConnection.hPipe, resumeMode, restart, pEngineState->plan.dependencyRegistrationAction); | 499 | hr = ElevationSessionEnd(pEngineState->companionConnection.hPipe, resumeMode, restart, pEngineState->plan.dependencyRegistrationAction, registrationType); |
480 | ExitOnFailure(hr, "Failed to end session in per-machine process."); | 500 | ExitOnFailure(hr, "Failed to end session in per-machine process."); |
481 | } | 501 | } |
482 | else | 502 | else |
483 | { | 503 | { |
484 | hr = RegistrationSessionEnd(&pEngineState->registration, &pEngineState->variables, &pEngineState->packages, resumeMode, restart, pEngineState->plan.dependencyRegistrationAction); | 504 | hr = RegistrationSessionEnd(&pEngineState->registration, &pEngineState->variables, &pEngineState->packages, resumeMode, restart, pEngineState->plan.dependencyRegistrationAction, registrationType); |
485 | ExitOnFailure(hr, "Failed to end session in per-user process."); | 505 | ExitOnFailure(hr, "Failed to end session in per-user process."); |
486 | } | 506 | } |
487 | 507 | ||
@@ -751,10 +771,14 @@ extern "C" void ApplyClean( | |||
751 | 771 | ||
752 | static void CalculateKeepRegistration( | 772 | static void CalculateKeepRegistration( |
753 | __in BURN_ENGINE_STATE* pEngineState, | 773 | __in BURN_ENGINE_STATE* pEngineState, |
754 | __inout BOOL* pfKeepRegistration | 774 | __in BOOL fLog, |
775 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType | ||
755 | ) | 776 | ) |
756 | { | 777 | { |
757 | LogId(REPORT_STANDARD, MSG_POST_APPLY_CALCULATE_REGISTRATION); | 778 | if (fLog) |
779 | { | ||
780 | LogId(REPORT_STANDARD, MSG_POST_APPLY_CALCULATE_REGISTRATION); | ||
781 | } | ||
758 | 782 | ||
759 | for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i) | 783 | for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i) |
760 | { | 784 | { |
@@ -765,17 +789,28 @@ static void CalculateKeepRegistration( | |||
765 | MspEngineFinalizeInstallRegistrationState(pPackage); | 789 | MspEngineFinalizeInstallRegistrationState(pPackage); |
766 | } | 790 | } |
767 | 791 | ||
768 | LogId(REPORT_STANDARD, MSG_POST_APPLY_PACKAGE, pPackage->sczId, LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->installRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->cacheRegistrationState)); | 792 | if (fLog) |
793 | { | ||
794 | LogId(REPORT_STANDARD, MSG_POST_APPLY_PACKAGE, pPackage->sczId, LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->installRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->cacheRegistrationState)); | ||
795 | } | ||
769 | 796 | ||
770 | if (!pPackage->fCanAffectRegistration) | 797 | if (!pPackage->fCanAffectRegistration) |
771 | { | 798 | { |
772 | continue; | 799 | continue; |
773 | } | 800 | } |
774 | 801 | ||
775 | if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->installRegistrationState || | 802 | if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->installRegistrationState) |
776 | BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->cacheRegistrationState) | 803 | { |
804 | *pRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL; | ||
805 | |||
806 | if (!fLog) | ||
807 | { | ||
808 | break; | ||
809 | } | ||
810 | } | ||
811 | else if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->cacheRegistrationState && BOOTSTRAPPER_REGISTRATION_TYPE_NONE == *pRegistrationType) | ||
777 | { | 812 | { |
778 | *pfKeepRegistration = TRUE; | 813 | *pRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; |
779 | } | 814 | } |
780 | } | 815 | } |
781 | } | 816 | } |
diff --git a/src/burn/engine/core.h b/src/burn/engine/core.h index 27cb2e25..3a28188b 100644 --- a/src/burn/engine/core.h +++ b/src/burn/engine/core.h | |||
@@ -48,8 +48,9 @@ const LPCWSTR BURN_BUNDLE_UILEVEL = L"WixBundleUILevel"; | |||
48 | const LPCWSTR BURN_BUNDLE_VERSION = L"WixBundleVersion"; | 48 | const LPCWSTR BURN_BUNDLE_VERSION = L"WixBundleVersion"; |
49 | const LPCWSTR BURN_REBOOT_PENDING = L"RebootPending"; | 49 | const LPCWSTR BURN_REBOOT_PENDING = L"RebootPending"; |
50 | 50 | ||
51 | // The following constants must stay in sync with src\wix\Binder.cs | 51 | // The following constants must stay in sync with src\api\wix\WixToolset.Data\Burn\BurnConstants.cs |
52 | const LPCWSTR BURN_BUNDLE_NAME = L"WixBundleName"; | 52 | const LPCWSTR BURN_BUNDLE_NAME = L"WixBundleName"; |
53 | const LPCWSTR BURN_BUNDLE_INPROGRESS_NAME = L"WixBundleInProgressName"; | ||
53 | const LPCWSTR BURN_BUNDLE_ORIGINAL_SOURCE = L"WixBundleOriginalSource"; | 54 | const LPCWSTR BURN_BUNDLE_ORIGINAL_SOURCE = L"WixBundleOriginalSource"; |
54 | const LPCWSTR BURN_BUNDLE_ORIGINAL_SOURCE_FOLDER = L"WixBundleOriginalSourceFolder"; | 55 | const LPCWSTR BURN_BUNDLE_ORIGINAL_SOURCE_FOLDER = L"WixBundleOriginalSourceFolder"; |
55 | const LPCWSTR BURN_BUNDLE_LAST_USED_SOURCE = L"WixBundleLastUsedSource"; | 56 | const LPCWSTR BURN_BUNDLE_LAST_USED_SOURCE = L"WixBundleLastUsedSource"; |
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp index 85e4b692..db2a82a6 100644 --- a/src/burn/engine/elevation.cpp +++ b/src/burn/engine/elevation.cpp | |||
@@ -477,7 +477,8 @@ extern "C" HRESULT ElevationSessionBegin( | |||
477 | __in BURN_VARIABLES* pVariables, | 477 | __in BURN_VARIABLES* pVariables, |
478 | __in DWORD dwRegistrationOperations, | 478 | __in DWORD dwRegistrationOperations, |
479 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, | 479 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, |
480 | __in DWORD64 qwEstimatedSize | 480 | __in DWORD64 qwEstimatedSize, |
481 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
481 | ) | 482 | ) |
482 | { | 483 | { |
483 | HRESULT hr = S_OK; | 484 | HRESULT hr = S_OK; |
@@ -504,6 +505,9 @@ extern "C" HRESULT ElevationSessionBegin( | |||
504 | hr = BuffWriteNumber64(&pbData, &cbData, qwEstimatedSize); | 505 | hr = BuffWriteNumber64(&pbData, &cbData, qwEstimatedSize); |
505 | ExitOnFailure(hr, "Failed to write estimated size to message buffer."); | 506 | ExitOnFailure(hr, "Failed to write estimated size to message buffer."); |
506 | 507 | ||
508 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)registrationType); | ||
509 | ExitOnFailure(hr, "Failed to write registration type to message buffer."); | ||
510 | |||
507 | hr = VariableSerialize(pVariables, FALSE, &pbData, &cbData); | 511 | hr = VariableSerialize(pVariables, FALSE, &pbData, &cbData); |
508 | ExitOnFailure(hr, "Failed to write variables."); | 512 | ExitOnFailure(hr, "Failed to write variables."); |
509 | 513 | ||
@@ -527,7 +531,8 @@ extern "C" HRESULT ElevationSessionResume( | |||
527 | __in HANDLE hPipe, | 531 | __in HANDLE hPipe, |
528 | __in_z LPCWSTR wzResumeCommandLine, | 532 | __in_z LPCWSTR wzResumeCommandLine, |
529 | __in BOOL fDisableResume, | 533 | __in BOOL fDisableResume, |
530 | __in BURN_VARIABLES* pVariables | 534 | __in BURN_VARIABLES* pVariables, |
535 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
531 | ) | 536 | ) |
532 | { | 537 | { |
533 | HRESULT hr = S_OK; | 538 | HRESULT hr = S_OK; |
@@ -542,6 +547,9 @@ extern "C" HRESULT ElevationSessionResume( | |||
542 | hr = BuffWriteNumber(&pbData, &cbData, fDisableResume); | 547 | hr = BuffWriteNumber(&pbData, &cbData, fDisableResume); |
543 | ExitOnFailure(hr, "Failed to write resume flag."); | 548 | ExitOnFailure(hr, "Failed to write resume flag."); |
544 | 549 | ||
550 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)registrationType); | ||
551 | ExitOnFailure(hr, "Failed to write registration type to message buffer."); | ||
552 | |||
545 | hr = VariableSerialize(pVariables, FALSE, &pbData, &cbData); | 553 | hr = VariableSerialize(pVariables, FALSE, &pbData, &cbData); |
546 | ExitOnFailure(hr, "Failed to write variables."); | 554 | ExitOnFailure(hr, "Failed to write variables."); |
547 | 555 | ||
@@ -565,7 +573,8 @@ extern "C" HRESULT ElevationSessionEnd( | |||
565 | __in HANDLE hPipe, | 573 | __in HANDLE hPipe, |
566 | __in BURN_RESUME_MODE resumeMode, | 574 | __in BURN_RESUME_MODE resumeMode, |
567 | __in BOOTSTRAPPER_APPLY_RESTART restart, | 575 | __in BOOTSTRAPPER_APPLY_RESTART restart, |
568 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction | 576 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, |
577 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
569 | ) | 578 | ) |
570 | { | 579 | { |
571 | HRESULT hr = S_OK; | 580 | HRESULT hr = S_OK; |
@@ -583,6 +592,9 @@ extern "C" HRESULT ElevationSessionEnd( | |||
583 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)dependencyRegistrationAction); | 592 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)dependencyRegistrationAction); |
584 | ExitOnFailure(hr, "Failed to write dependency registration action to message buffer."); | 593 | ExitOnFailure(hr, "Failed to write dependency registration action to message buffer."); |
585 | 594 | ||
595 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)registrationType); | ||
596 | ExitOnFailure(hr, "Failed to write registration type to message buffer."); | ||
597 | |||
586 | // send message | 598 | // send message |
587 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_SESSION_END, pbData, cbData, NULL, NULL, &dwResult); | 599 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_SESSION_END, pbData, cbData, NULL, NULL, &dwResult); |
588 | ExitOnFailure(hr, "Failed to send message to per-machine process."); | 600 | ExitOnFailure(hr, "Failed to send message to per-machine process."); |
@@ -2080,6 +2092,7 @@ static HRESULT OnSessionBegin( | |||
2080 | DWORD dwRegistrationOperations = 0; | 2092 | DWORD dwRegistrationOperations = 0; |
2081 | DWORD dwDependencyRegistrationAction = 0; | 2093 | DWORD dwDependencyRegistrationAction = 0; |
2082 | DWORD64 qwEstimatedSize = 0; | 2094 | DWORD64 qwEstimatedSize = 0; |
2095 | DWORD dwRegistrationType = 0; | ||
2083 | 2096 | ||
2084 | // Deserialize message data. | 2097 | // Deserialize message data. |
2085 | hr = BuffReadString(pbData, cbData, &iData, &sczEngineWorkingPath); | 2098 | hr = BuffReadString(pbData, cbData, &iData, &sczEngineWorkingPath); |
@@ -2100,11 +2113,14 @@ static HRESULT OnSessionBegin( | |||
2100 | hr = BuffReadNumber64(pbData, cbData, &iData, &qwEstimatedSize); | 2113 | hr = BuffReadNumber64(pbData, cbData, &iData, &qwEstimatedSize); |
2101 | ExitOnFailure(hr, "Failed to read estimated size."); | 2114 | ExitOnFailure(hr, "Failed to read estimated size."); |
2102 | 2115 | ||
2116 | hr = BuffReadNumber(pbData, cbData, &iData, &dwRegistrationType); | ||
2117 | ExitOnFailure(hr, "Failed to read dependency registration action."); | ||
2118 | |||
2103 | hr = VariableDeserialize(pVariables, FALSE, pbData, cbData, &iData); | 2119 | hr = VariableDeserialize(pVariables, FALSE, pbData, cbData, &iData); |
2104 | ExitOnFailure(hr, "Failed to read variables."); | 2120 | ExitOnFailure(hr, "Failed to read variables."); |
2105 | 2121 | ||
2106 | // Begin session in per-machine process. | 2122 | // Begin session in per-machine process. |
2107 | hr = RegistrationSessionBegin(sczEngineWorkingPath, pRegistration, pVariables, dwRegistrationOperations, (BURN_DEPENDENCY_REGISTRATION_ACTION)dwDependencyRegistrationAction, qwEstimatedSize); | 2123 | hr = RegistrationSessionBegin(sczEngineWorkingPath, pRegistration, pVariables, dwRegistrationOperations, (BURN_DEPENDENCY_REGISTRATION_ACTION)dwDependencyRegistrationAction, qwEstimatedSize, (BOOTSTRAPPER_REGISTRATION_TYPE)dwRegistrationType); |
2108 | ExitOnFailure(hr, "Failed to begin registration session."); | 2124 | ExitOnFailure(hr, "Failed to begin registration session."); |
2109 | 2125 | ||
2110 | LExit: | 2126 | LExit: |
@@ -2122,6 +2138,7 @@ static HRESULT OnSessionResume( | |||
2122 | { | 2138 | { |
2123 | HRESULT hr = S_OK; | 2139 | HRESULT hr = S_OK; |
2124 | SIZE_T iData = 0; | 2140 | SIZE_T iData = 0; |
2141 | DWORD dwRegistrationType = 0; | ||
2125 | 2142 | ||
2126 | // Deserialize message data. | 2143 | // Deserialize message data. |
2127 | hr = BuffReadString(pbData, cbData, &iData, &pRegistration->sczResumeCommandLine); | 2144 | hr = BuffReadString(pbData, cbData, &iData, &pRegistration->sczResumeCommandLine); |
@@ -2130,11 +2147,14 @@ static HRESULT OnSessionResume( | |||
2130 | hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&pRegistration->fDisableResume); | 2147 | hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&pRegistration->fDisableResume); |
2131 | ExitOnFailure(hr, "Failed to read resume flag."); | 2148 | ExitOnFailure(hr, "Failed to read resume flag."); |
2132 | 2149 | ||
2150 | hr = BuffReadNumber(pbData, cbData, &iData, &dwRegistrationType); | ||
2151 | ExitOnFailure(hr, "Failed to read dependency registration action."); | ||
2152 | |||
2133 | hr = VariableDeserialize(pVariables, FALSE, pbData, cbData, &iData); | 2153 | hr = VariableDeserialize(pVariables, FALSE, pbData, cbData, &iData); |
2134 | ExitOnFailure(hr, "Failed to read variables."); | 2154 | ExitOnFailure(hr, "Failed to read variables."); |
2135 | 2155 | ||
2136 | // resume session in per-machine process | 2156 | // resume session in per-machine process |
2137 | hr = RegistrationSessionResume(pRegistration, pVariables); | 2157 | hr = RegistrationSessionResume(pRegistration, pVariables, (BOOTSTRAPPER_REGISTRATION_TYPE)dwRegistrationType); |
2138 | ExitOnFailure(hr, "Failed to resume registration session."); | 2158 | ExitOnFailure(hr, "Failed to resume registration session."); |
2139 | 2159 | ||
2140 | LExit: | 2160 | LExit: |
@@ -2154,6 +2174,7 @@ static HRESULT OnSessionEnd( | |||
2154 | DWORD dwResumeMode = 0; | 2174 | DWORD dwResumeMode = 0; |
2155 | DWORD dwRestart = 0; | 2175 | DWORD dwRestart = 0; |
2156 | DWORD dwDependencyRegistrationAction = 0; | 2176 | DWORD dwDependencyRegistrationAction = 0; |
2177 | DWORD dwRegistrationType = 0; | ||
2157 | 2178 | ||
2158 | // Deserialize message data. | 2179 | // Deserialize message data. |
2159 | hr = BuffReadNumber(pbData, cbData, &iData, &dwResumeMode); | 2180 | hr = BuffReadNumber(pbData, cbData, &iData, &dwResumeMode); |
@@ -2165,8 +2186,11 @@ static HRESULT OnSessionEnd( | |||
2165 | hr = BuffReadNumber(pbData, cbData, &iData, &dwDependencyRegistrationAction); | 2186 | hr = BuffReadNumber(pbData, cbData, &iData, &dwDependencyRegistrationAction); |
2166 | ExitOnFailure(hr, "Failed to read dependency registration action."); | 2187 | ExitOnFailure(hr, "Failed to read dependency registration action."); |
2167 | 2188 | ||
2189 | hr = BuffReadNumber(pbData, cbData, &iData, &dwRegistrationType); | ||
2190 | ExitOnFailure(hr, "Failed to read dependency registration action."); | ||
2191 | |||
2168 | // suspend session in per-machine process | 2192 | // suspend session in per-machine process |
2169 | hr = RegistrationSessionEnd(pRegistration, pVariables, pPackages, (BURN_RESUME_MODE)dwResumeMode, (BOOTSTRAPPER_APPLY_RESTART)dwRestart, (BURN_DEPENDENCY_REGISTRATION_ACTION)dwDependencyRegistrationAction); | 2193 | hr = RegistrationSessionEnd(pRegistration, pVariables, pPackages, (BURN_RESUME_MODE)dwResumeMode, (BOOTSTRAPPER_APPLY_RESTART)dwRestart, (BURN_DEPENDENCY_REGISTRATION_ACTION)dwDependencyRegistrationAction, (BOOTSTRAPPER_REGISTRATION_TYPE)dwRegistrationType); |
2170 | ExitOnFailure(hr, "Failed to suspend registration session."); | 2194 | ExitOnFailure(hr, "Failed to suspend registration session."); |
2171 | 2195 | ||
2172 | LExit: | 2196 | LExit: |
diff --git a/src/burn/engine/elevation.h b/src/burn/engine/elevation.h index af2dec8b..00dca8dc 100644 --- a/src/burn/engine/elevation.h +++ b/src/burn/engine/elevation.h | |||
@@ -31,19 +31,22 @@ HRESULT ElevationSessionBegin( | |||
31 | __in BURN_VARIABLES* pVariables, | 31 | __in BURN_VARIABLES* pVariables, |
32 | __in DWORD dwRegistrationOperations, | 32 | __in DWORD dwRegistrationOperations, |
33 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, | 33 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, |
34 | __in DWORD64 qwEstimatedSize | 34 | __in DWORD64 qwEstimatedSize, |
35 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
35 | ); | 36 | ); |
36 | HRESULT ElevationSessionResume( | 37 | HRESULT ElevationSessionResume( |
37 | __in HANDLE hPipe, | 38 | __in HANDLE hPipe, |
38 | __in_z LPCWSTR wzResumeCommandLine, | 39 | __in_z LPCWSTR wzResumeCommandLine, |
39 | __in BOOL fDisableResume, | 40 | __in BOOL fDisableResume, |
40 | __in BURN_VARIABLES* pVariables | 41 | __in BURN_VARIABLES* pVariables, |
42 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
41 | ); | 43 | ); |
42 | HRESULT ElevationSessionEnd( | 44 | HRESULT ElevationSessionEnd( |
43 | __in HANDLE hPipe, | 45 | __in HANDLE hPipe, |
44 | __in BURN_RESUME_MODE resumeMode, | 46 | __in BURN_RESUME_MODE resumeMode, |
45 | __in BOOTSTRAPPER_APPLY_RESTART restart, | 47 | __in BOOTSTRAPPER_APPLY_RESTART restart, |
46 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction | 48 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, |
49 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
47 | ); | 50 | ); |
48 | HRESULT ElevationSaveState( | 51 | HRESULT ElevationSaveState( |
49 | __in HANDLE hPipe, | 52 | __in HANDLE hPipe, |
diff --git a/src/burn/engine/engine.mc b/src/burn/engine/engine.mc index 929bf67a..ad9d676f 100644 --- a/src/burn/engine/engine.mc +++ b/src/burn/engine/engine.mc | |||
@@ -889,7 +889,7 @@ MessageId=372 | |||
889 | Severity=Success | 889 | Severity=Success |
890 | SymbolicName=MSG_SESSION_END | 890 | SymbolicName=MSG_SESSION_END |
891 | Language=English | 891 | Language=English |
892 | Session end, registration key: %1!ls!, resume: %2!hs!, restart: %3!hs!, disable resume: %4!hs! | 892 | Session end, registration key: %1!ls!, resume: %2!hs!, restart: %3!hs!, disable resume: %4!hs!, default registration: %5!hs!, ba requested registration: %6!hs! |
893 | . | 893 | . |
894 | 894 | ||
895 | MessageId=373 | 895 | MessageId=373 |
diff --git a/src/burn/engine/logging.cpp b/src/burn/engine/logging.cpp index 7ee1ec85..2db7defd 100644 --- a/src/burn/engine/logging.cpp +++ b/src/burn/engine/logging.cpp | |||
@@ -561,6 +561,23 @@ extern "C" LPCSTR LoggingPerMachineToString( | |||
561 | return "PerUser"; | 561 | return "PerUser"; |
562 | } | 562 | } |
563 | 563 | ||
564 | extern "C" LPCSTR LoggingRegistrationTypeToString( | ||
565 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
566 | ) | ||
567 | { | ||
568 | switch (registrationType) | ||
569 | { | ||
570 | case BOOTSTRAPPER_REGISTRATION_TYPE_NONE: | ||
571 | return "None"; | ||
572 | case BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS: | ||
573 | return "InProgress"; | ||
574 | case BOOTSTRAPPER_REGISTRATION_TYPE_FULL: | ||
575 | return "Full"; | ||
576 | default: | ||
577 | return "Invalid"; | ||
578 | } | ||
579 | } | ||
580 | |||
564 | extern "C" LPCSTR LoggingRestartToString( | 581 | extern "C" LPCSTR LoggingRestartToString( |
565 | __in BOOTSTRAPPER_APPLY_RESTART restart | 582 | __in BOOTSTRAPPER_APPLY_RESTART restart |
566 | ) | 583 | ) |
diff --git a/src/burn/engine/logging.h b/src/burn/engine/logging.h index 909ce591..21ea6297 100644 --- a/src/burn/engine/logging.h +++ b/src/burn/engine/logging.h | |||
@@ -123,6 +123,10 @@ LPCSTR LoggingPerMachineToString( | |||
123 | __in BOOL fPerMachine | 123 | __in BOOL fPerMachine |
124 | ); | 124 | ); |
125 | 125 | ||
126 | LPCSTR LoggingRegistrationTypeToString( | ||
127 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
128 | ); | ||
129 | |||
126 | LPCSTR LoggingRestartToString( | 130 | LPCSTR LoggingRestartToString( |
127 | __in BOOTSTRAPPER_APPLY_RESTART restart | 131 | __in BOOTSTRAPPER_APPLY_RESTART restart |
128 | ); | 132 | ); |
diff --git a/src/burn/engine/registration.cpp b/src/burn/engine/registration.cpp index 5b246112..eed1fee2 100644 --- a/src/burn/engine/registration.cpp +++ b/src/burn/engine/registration.cpp | |||
@@ -46,12 +46,23 @@ static HRESULT SetPaths( | |||
46 | static HRESULT GetBundleManufacturer( | 46 | static HRESULT GetBundleManufacturer( |
47 | __in BURN_REGISTRATION* pRegistration, | 47 | __in BURN_REGISTRATION* pRegistration, |
48 | __in BURN_VARIABLES* pVariables, | 48 | __in BURN_VARIABLES* pVariables, |
49 | __out LPWSTR* psczBundleManufacturer | 49 | __out_z LPWSTR* psczBundleManufacturer |
50 | ); | ||
51 | static HRESULT GetBundleInProgressName( | ||
52 | __in BURN_REGISTRATION* pRegistration, | ||
53 | __in BURN_VARIABLES* pVariables, | ||
54 | __out_z LPWSTR* psczBundleName | ||
50 | ); | 55 | ); |
51 | static HRESULT GetBundleName( | 56 | static HRESULT GetBundleName( |
52 | __in BURN_REGISTRATION* pRegistration, | 57 | __in BURN_REGISTRATION* pRegistration, |
53 | __in BURN_VARIABLES* pVariables, | 58 | __in BURN_VARIABLES* pVariables, |
54 | __out LPWSTR* psczBundleName | 59 | __out_z LPWSTR* psczBundleName |
60 | ); | ||
61 | static HRESULT EnsureRegistrationVariable( | ||
62 | __in BURN_VARIABLES* pVariables, | ||
63 | __in_z LPCWSTR wzVariable, | ||
64 | __in_z LPCWSTR wzDefaultValue, | ||
65 | __out_z LPWSTR* psczValue | ||
55 | ); | 66 | ); |
56 | static HRESULT UpdateResumeMode( | 67 | static HRESULT UpdateResumeMode( |
57 | __in BURN_REGISTRATION* pRegistration, | 68 | __in BURN_REGISTRATION* pRegistration, |
@@ -91,7 +102,8 @@ static HRESULT RegWriteStringVariable( | |||
91 | static HRESULT UpdateBundleNameRegistration( | 102 | static HRESULT UpdateBundleNameRegistration( |
92 | __in BURN_REGISTRATION* pRegistration, | 103 | __in BURN_REGISTRATION* pRegistration, |
93 | __in BURN_VARIABLES* pVariables, | 104 | __in BURN_VARIABLES* pVariables, |
94 | __in HKEY hkRegistration | 105 | __in HKEY hkRegistration, |
106 | __in BOOL fInProgressRegistration | ||
95 | ); | 107 | ); |
96 | static BOOL IsWuRebootPending(); | 108 | static BOOL IsWuRebootPending(); |
97 | static BOOL IsBundleRebootPending( | 109 | static BOOL IsBundleRebootPending( |
@@ -176,6 +188,13 @@ extern "C" HRESULT RegistrationParseFromXml( | |||
176 | ExitOnFailure(hr, "Failed to get @DisplayName."); | 188 | ExitOnFailure(hr, "Failed to get @DisplayName."); |
177 | } | 189 | } |
178 | 190 | ||
191 | // @InProgressDisplayName | ||
192 | hr = XmlGetAttributeEx(pixnArpNode, L"InProgressDisplayName", &pRegistration->sczInProgressDisplayName); | ||
193 | if (E_NOTFOUND != hr) | ||
194 | { | ||
195 | ExitOnFailure(hr, "Failed to get @InProgressDisplayName."); | ||
196 | } | ||
197 | |||
179 | // @DisplayVersion | 198 | // @DisplayVersion |
180 | hr = XmlGetAttributeEx(pixnArpNode, L"DisplayVersion", &pRegistration->sczDisplayVersion); | 199 | hr = XmlGetAttributeEx(pixnArpNode, L"DisplayVersion", &pRegistration->sczDisplayVersion); |
181 | if (E_NOTFOUND != hr) | 200 | if (E_NOTFOUND != hr) |
@@ -372,6 +391,7 @@ extern "C" void RegistrationUninitialize( | |||
372 | ReleaseStr(pRegistration->sczStateFile); | 391 | ReleaseStr(pRegistration->sczStateFile); |
373 | 392 | ||
374 | ReleaseStr(pRegistration->sczDisplayName); | 393 | ReleaseStr(pRegistration->sczDisplayName); |
394 | ReleaseStr(pRegistration->sczInProgressDisplayName); | ||
375 | ReleaseStr(pRegistration->sczDisplayVersion); | 395 | ReleaseStr(pRegistration->sczDisplayVersion); |
376 | ReleaseStr(pRegistration->sczPublisher); | 396 | ReleaseStr(pRegistration->sczPublisher); |
377 | ReleaseStr(pRegistration->sczHelpLink); | 397 | ReleaseStr(pRegistration->sczHelpLink); |
@@ -421,8 +441,7 @@ extern "C" HRESULT RegistrationSetVariables( | |||
421 | ) | 441 | ) |
422 | { | 442 | { |
423 | HRESULT hr = S_OK; | 443 | HRESULT hr = S_OK; |
424 | LPWSTR sczBundleManufacturer = NULL; | 444 | LPWSTR scz = NULL; |
425 | LPWSTR sczBundleName = NULL; | ||
426 | 445 | ||
427 | if (pRegistration->fInstalled) | 446 | if (pRegistration->fInstalled) |
428 | { | 447 | { |
@@ -431,10 +450,13 @@ extern "C" HRESULT RegistrationSetVariables( | |||
431 | } | 450 | } |
432 | 451 | ||
433 | // Ensure the registration bundle name is updated. | 452 | // Ensure the registration bundle name is updated. |
434 | hr = GetBundleName(pRegistration, pVariables, &sczBundleName); | 453 | hr = GetBundleInProgressName(pRegistration, pVariables, &scz); |
435 | ExitOnFailure(hr, "Failed to initialize bundle name."); | 454 | ExitOnFailure(hr, "Failed to initialize bundle name."); |
436 | 455 | ||
437 | hr = GetBundleManufacturer(pRegistration, pVariables, &sczBundleName); | 456 | hr = GetBundleName(pRegistration, pVariables, &scz); |
457 | ExitOnFailure(hr, "Failed to initialize bundle name."); | ||
458 | |||
459 | hr = GetBundleManufacturer(pRegistration, pVariables, &scz); | ||
438 | ExitOnFailure(hr, "Failed to initialize bundle manufacturer."); | 460 | ExitOnFailure(hr, "Failed to initialize bundle manufacturer."); |
439 | 461 | ||
440 | if (pRegistration->sczActiveParent && *pRegistration->sczActiveParent) | 462 | if (pRegistration->sczActiveParent && *pRegistration->sczActiveParent) |
@@ -456,8 +478,7 @@ extern "C" HRESULT RegistrationSetVariables( | |||
456 | ExitOnFailure(hr, "Failed to overwrite the bundle reboot-pending built-in variable."); | 478 | ExitOnFailure(hr, "Failed to overwrite the bundle reboot-pending built-in variable."); |
457 | 479 | ||
458 | LExit: | 480 | LExit: |
459 | ReleaseStr(sczBundleManufacturer); | 481 | ReleaseStr(scz); |
460 | ReleaseStr(sczBundleName); | ||
461 | 482 | ||
462 | return hr; | 483 | return hr; |
463 | } | 484 | } |
@@ -595,7 +616,8 @@ extern "C" HRESULT RegistrationSessionBegin( | |||
595 | __in BURN_VARIABLES* pVariables, | 616 | __in BURN_VARIABLES* pVariables, |
596 | __in DWORD dwRegistrationOptions, | 617 | __in DWORD dwRegistrationOptions, |
597 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, | 618 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, |
598 | __in DWORD64 qwEstimatedSize | 619 | __in DWORD64 qwEstimatedSize, |
620 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
599 | ) | 621 | ) |
600 | { | 622 | { |
601 | HRESULT hr = S_OK; | 623 | HRESULT hr = S_OK; |
@@ -603,6 +625,8 @@ extern "C" HRESULT RegistrationSessionBegin( | |||
603 | HKEY hkRegistration = NULL; | 625 | HKEY hkRegistration = NULL; |
604 | LPWSTR sczPublisher = NULL; | 626 | LPWSTR sczPublisher = NULL; |
605 | 627 | ||
628 | AssertSz(BOOTSTRAPPER_REGISTRATION_TYPE_NONE != registrationType, "Registration type can't be NONE"); | ||
629 | |||
606 | LogId(REPORT_VERBOSE, MSG_SESSION_BEGIN, pRegistration->sczRegistrationKey, dwRegistrationOptions, LoggingBoolToString(pRegistration->fDisableResume)); | 630 | LogId(REPORT_VERBOSE, MSG_SESSION_BEGIN, pRegistration->sczRegistrationKey, dwRegistrationOptions, LoggingBoolToString(pRegistration->fDisableResume)); |
607 | 631 | ||
608 | // Cache bundle executable. | 632 | // Cache bundle executable. |
@@ -668,7 +692,7 @@ extern "C" HRESULT RegistrationSessionBegin( | |||
668 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_DISPLAY_ICON); | 692 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_DISPLAY_ICON); |
669 | 693 | ||
670 | // update display name | 694 | // update display name |
671 | hr = UpdateBundleNameRegistration(pRegistration, pVariables, hkRegistration); | 695 | hr = UpdateBundleNameRegistration(pRegistration, pVariables, hkRegistration, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS == registrationType); |
672 | ExitOnFailure(hr, "Failed to update name and publisher."); | 696 | ExitOnFailure(hr, "Failed to update name and publisher."); |
673 | 697 | ||
674 | // DisplayVersion: provided by UI | 698 | // DisplayVersion: provided by UI |
@@ -841,12 +865,15 @@ LExit: | |||
841 | *******************************************************************/ | 865 | *******************************************************************/ |
842 | extern "C" HRESULT RegistrationSessionResume( | 866 | extern "C" HRESULT RegistrationSessionResume( |
843 | __in BURN_REGISTRATION* pRegistration, | 867 | __in BURN_REGISTRATION* pRegistration, |
844 | __in BURN_VARIABLES* pVariables | 868 | __in BURN_VARIABLES* pVariables, |
869 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
845 | ) | 870 | ) |
846 | { | 871 | { |
847 | HRESULT hr = S_OK; | 872 | HRESULT hr = S_OK; |
848 | HKEY hkRegistration = NULL; | 873 | HKEY hkRegistration = NULL; |
849 | 874 | ||
875 | AssertSz(BOOTSTRAPPER_REGISTRATION_TYPE_NONE != registrationType, "Registration type can't be NONE"); | ||
876 | |||
850 | // open registration key | 877 | // open registration key |
851 | hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_WRITE, &hkRegistration); | 878 | hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_WRITE, &hkRegistration); |
852 | ExitOnFailure(hr, "Failed to open registration key."); | 879 | ExitOnFailure(hr, "Failed to open registration key."); |
@@ -856,7 +883,7 @@ extern "C" HRESULT RegistrationSessionResume( | |||
856 | ExitOnFailure(hr, "Failed to update resume mode."); | 883 | ExitOnFailure(hr, "Failed to update resume mode."); |
857 | 884 | ||
858 | // update display name | 885 | // update display name |
859 | hr = UpdateBundleNameRegistration(pRegistration, pVariables, hkRegistration); | 886 | hr = UpdateBundleNameRegistration(pRegistration, pVariables, hkRegistration, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS == registrationType); |
860 | ExitOnFailure(hr, "Failed to update name and publisher."); | 887 | ExitOnFailure(hr, "Failed to update name and publisher."); |
861 | 888 | ||
862 | LExit: | 889 | LExit: |
@@ -876,7 +903,8 @@ extern "C" HRESULT RegistrationSessionEnd( | |||
876 | __in BURN_PACKAGES* pPackages, | 903 | __in BURN_PACKAGES* pPackages, |
877 | __in BURN_RESUME_MODE resumeMode, | 904 | __in BURN_RESUME_MODE resumeMode, |
878 | __in BOOTSTRAPPER_APPLY_RESTART restart, | 905 | __in BOOTSTRAPPER_APPLY_RESTART restart, |
879 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction | 906 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, |
907 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
880 | ) | 908 | ) |
881 | { | 909 | { |
882 | HRESULT hr = S_OK; | 910 | HRESULT hr = S_OK; |
@@ -884,8 +912,6 @@ extern "C" HRESULT RegistrationSessionEnd( | |||
884 | HKEY hkRebootRequired = NULL; | 912 | HKEY hkRebootRequired = NULL; |
885 | HKEY hkRegistration = NULL; | 913 | HKEY hkRegistration = NULL; |
886 | 914 | ||
887 | LogId(REPORT_STANDARD, MSG_SESSION_END, pRegistration->sczRegistrationKey, LoggingResumeModeToString(resumeMode), LoggingRestartToString(restart), LoggingBoolToString(pRegistration->fDisableResume)); | ||
888 | |||
889 | // If a restart is required for any reason, write a volatile registry key to track of | 915 | // If a restart is required for any reason, write a volatile registry key to track of |
890 | // of that fact until the reboot has taken place. | 916 | // of that fact until the reboot has taken place. |
891 | if (BOOTSTRAPPER_APPLY_RESTART_NONE != restart) | 917 | if (BOOTSTRAPPER_APPLY_RESTART_NONE != restart) |
@@ -910,6 +936,8 @@ extern "C" HRESULT RegistrationSessionEnd( | |||
910 | // If no resume mode, then remove the bundle registration. | 936 | // If no resume mode, then remove the bundle registration. |
911 | if (BURN_RESUME_MODE_NONE == resumeMode) | 937 | if (BURN_RESUME_MODE_NONE == resumeMode) |
912 | { | 938 | { |
939 | AssertSz(BOOTSTRAPPER_REGISTRATION_TYPE_NONE == registrationType, "Registration type must be NONE if resume mode is NONE"); | ||
940 | |||
913 | // If we just registered the bundle dependency but something went wrong and caused us to not | 941 | // If we just registered the bundle dependency but something went wrong and caused us to not |
914 | // keep the bundle registration (like rollback) or we are supposed to unregister the bundle | 942 | // keep the bundle registration (like rollback) or we are supposed to unregister the bundle |
915 | // dependency when unregistering the bundle, do so. | 943 | // dependency when unregistering the bundle, do so. |
@@ -939,9 +967,15 @@ extern "C" HRESULT RegistrationSessionEnd( | |||
939 | } | 967 | } |
940 | else // the mode needs to be updated so open the registration key. | 968 | else // the mode needs to be updated so open the registration key. |
941 | { | 969 | { |
970 | AssertSz(BOOTSTRAPPER_REGISTRATION_TYPE_NONE != registrationType, "Registration type must not be NONE if resume mode is not NONE"); | ||
971 | |||
942 | // Open registration key. | 972 | // Open registration key. |
943 | hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_WRITE, &hkRegistration); | 973 | hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_WRITE, &hkRegistration); |
944 | ExitOnFailure(hr, "Failed to open registration key."); | 974 | ExitOnFailure(hr, "Failed to open registration key."); |
975 | |||
976 | // update display name | ||
977 | hr = UpdateBundleNameRegistration(pRegistration, pVariables, hkRegistration, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS == registrationType); | ||
978 | ExitOnFailure(hr, "Failed to update name and publisher."); | ||
945 | } | 979 | } |
946 | 980 | ||
947 | // Update resume mode. | 981 | // Update resume mode. |
@@ -1133,44 +1167,69 @@ LExit: | |||
1133 | static HRESULT GetBundleManufacturer( | 1167 | static HRESULT GetBundleManufacturer( |
1134 | __in BURN_REGISTRATION* pRegistration, | 1168 | __in BURN_REGISTRATION* pRegistration, |
1135 | __in BURN_VARIABLES* pVariables, | 1169 | __in BURN_VARIABLES* pVariables, |
1136 | __out LPWSTR* psczBundleManufacturer | 1170 | __out_z LPWSTR* psczBundleManufacturer |
1137 | ) | 1171 | ) |
1138 | { | 1172 | { |
1139 | HRESULT hr = S_OK; | 1173 | HRESULT hr = S_OK; |
1140 | LPCWSTR wzPublisher = pRegistration->sczPublisher ? pRegistration->sczPublisher : L""; | 1174 | LPCWSTR wzPublisher = pRegistration->sczPublisher ? pRegistration->sczPublisher : L""; |
1141 | 1175 | ||
1142 | hr = VariableGetString(pVariables, BURN_BUNDLE_MANUFACTURER, psczBundleManufacturer); | 1176 | hr = EnsureRegistrationVariable(pVariables, BURN_BUNDLE_MANUFACTURER, wzPublisher, psczBundleManufacturer); |
1143 | if (E_NOTFOUND == hr) | ||
1144 | { | ||
1145 | hr = VariableSetString(pVariables, BURN_BUNDLE_MANUFACTURER, wzPublisher, FALSE, FALSE); | ||
1146 | ExitOnFailure(hr, "Failed to set bundle manufacturer."); | ||
1147 | |||
1148 | hr = StrAllocString(psczBundleManufacturer, wzPublisher, 0); | ||
1149 | } | ||
1150 | ExitOnFailure(hr, "Failed to get bundle manufacturer."); | 1177 | ExitOnFailure(hr, "Failed to get bundle manufacturer."); |
1151 | 1178 | ||
1152 | LExit: | 1179 | LExit: |
1153 | return hr; | 1180 | return hr; |
1154 | } | 1181 | } |
1155 | 1182 | ||
1183 | static HRESULT GetBundleInProgressName( | ||
1184 | __in BURN_REGISTRATION* pRegistration, | ||
1185 | __in BURN_VARIABLES* pVariables, | ||
1186 | __out_z LPWSTR* psczInProgressBundleName | ||
1187 | ) | ||
1188 | { | ||
1189 | HRESULT hr = S_OK; | ||
1190 | LPCWSTR wzInProgressDisplayName = pRegistration->sczInProgressDisplayName ? pRegistration->sczInProgressDisplayName : L""; | ||
1191 | |||
1192 | hr = EnsureRegistrationVariable(pVariables, BURN_BUNDLE_INPROGRESS_NAME, wzInProgressDisplayName, psczInProgressBundleName); | ||
1193 | ExitOnFailure(hr, "Failed to ensure in-progress bundle name."); | ||
1194 | |||
1195 | LExit: | ||
1196 | return hr; | ||
1197 | } | ||
1198 | |||
1156 | static HRESULT GetBundleName( | 1199 | static HRESULT GetBundleName( |
1157 | __in BURN_REGISTRATION* pRegistration, | 1200 | __in BURN_REGISTRATION* pRegistration, |
1158 | __in BURN_VARIABLES* pVariables, | 1201 | __in BURN_VARIABLES* pVariables, |
1159 | __out LPWSTR* psczBundleName | 1202 | __out_z LPWSTR* psczBundleName |
1160 | ) | 1203 | ) |
1161 | { | 1204 | { |
1162 | HRESULT hr = S_OK; | 1205 | HRESULT hr = S_OK; |
1163 | LPCWSTR wzDisplayName = pRegistration->sczDisplayName ? pRegistration->sczDisplayName : L""; | 1206 | LPCWSTR wzDisplayName = pRegistration->sczDisplayName ? pRegistration->sczDisplayName : L""; |
1164 | 1207 | ||
1165 | hr = VariableGetString(pVariables, BURN_BUNDLE_NAME, psczBundleName); | 1208 | hr = EnsureRegistrationVariable(pVariables, BURN_BUNDLE_NAME, wzDisplayName, psczBundleName); |
1209 | ExitOnFailure(hr, "Failed to ensure bundle name."); | ||
1210 | |||
1211 | LExit: | ||
1212 | return hr; | ||
1213 | } | ||
1214 | |||
1215 | static HRESULT EnsureRegistrationVariable( | ||
1216 | __in BURN_VARIABLES* pVariables, | ||
1217 | __in_z LPCWSTR wzVariable, | ||
1218 | __in_z LPCWSTR wzDefaultValue, | ||
1219 | __out_z LPWSTR* psczValue | ||
1220 | ) | ||
1221 | { | ||
1222 | HRESULT hr = S_OK; | ||
1223 | |||
1224 | hr = VariableGetString(pVariables, wzVariable, psczValue); | ||
1166 | if (E_NOTFOUND == hr) | 1225 | if (E_NOTFOUND == hr) |
1167 | { | 1226 | { |
1168 | hr = VariableSetString(pVariables, BURN_BUNDLE_NAME, wzDisplayName, FALSE, FALSE); | 1227 | hr = VariableSetString(pVariables, wzVariable, wzDefaultValue, FALSE, FALSE); |
1169 | ExitOnFailure(hr, "Failed to set bundle name."); | 1228 | ExitOnFailure(hr, "Failed to set registration variable."); |
1170 | 1229 | ||
1171 | hr = StrAllocString(psczBundleName, wzDisplayName, 0); | 1230 | hr = StrAllocString(psczValue, wzDefaultValue, 0); |
1172 | } | 1231 | } |
1173 | ExitOnFailure(hr, "Failed to get bundle name."); | 1232 | ExitOnFailure(hr, "Failed to get registration variable."); |
1174 | 1233 | ||
1175 | LExit: | 1234 | LExit: |
1176 | return hr; | 1235 | return hr; |
@@ -1584,15 +1643,26 @@ LExit: | |||
1584 | static HRESULT UpdateBundleNameRegistration( | 1643 | static HRESULT UpdateBundleNameRegistration( |
1585 | __in BURN_REGISTRATION* pRegistration, | 1644 | __in BURN_REGISTRATION* pRegistration, |
1586 | __in BURN_VARIABLES* pVariables, | 1645 | __in BURN_VARIABLES* pVariables, |
1587 | __in HKEY hkRegistration | 1646 | __in HKEY hkRegistration, |
1647 | __in BOOL fInProgressRegistration | ||
1588 | ) | 1648 | ) |
1589 | { | 1649 | { |
1590 | HRESULT hr = S_OK; | 1650 | HRESULT hr = S_OK; |
1591 | LPWSTR sczDisplayName = NULL; | 1651 | LPWSTR sczDisplayName = NULL; |
1592 | 1652 | ||
1593 | // DisplayName: provided by UI | 1653 | if (fInProgressRegistration) |
1594 | hr = GetBundleName(pRegistration, pVariables, &sczDisplayName); | 1654 | { |
1595 | hr = RegWriteString(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_DISPLAY_NAME, SUCCEEDED(hr) ? sczDisplayName : pRegistration->sczDisplayName); | 1655 | hr = GetBundleInProgressName(pRegistration, pVariables, &sczDisplayName); |
1656 | ExitOnFailure(hr, "Failed to get bundle in-progress name."); | ||
1657 | } | ||
1658 | |||
1659 | if (!sczDisplayName || !*sczDisplayName) | ||
1660 | { | ||
1661 | hr = GetBundleName(pRegistration, pVariables, &sczDisplayName); | ||
1662 | ExitOnFailure(hr, "Failed to get bundle name."); | ||
1663 | } | ||
1664 | |||
1665 | hr = RegWriteString(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_DISPLAY_NAME, sczDisplayName); | ||
1596 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_DISPLAY_NAME); | 1666 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_DISPLAY_NAME); |
1597 | 1667 | ||
1598 | LExit: | 1668 | LExit: |
diff --git a/src/burn/engine/registration.h b/src/burn/engine/registration.h index 6d8a6d2a..936e5966 100644 --- a/src/burn/engine/registration.h +++ b/src/burn/engine/registration.h | |||
@@ -123,6 +123,7 @@ typedef struct _BURN_REGISTRATION | |||
123 | 123 | ||
124 | // ARP registration | 124 | // ARP registration |
125 | LPWSTR sczDisplayName; | 125 | LPWSTR sczDisplayName; |
126 | LPWSTR sczInProgressDisplayName; | ||
126 | LPWSTR sczDisplayVersion; | 127 | LPWSTR sczDisplayVersion; |
127 | LPWSTR sczPublisher; | 128 | LPWSTR sczPublisher; |
128 | LPWSTR sczHelpLink; | 129 | LPWSTR sczHelpLink; |
@@ -190,11 +191,13 @@ HRESULT RegistrationSessionBegin( | |||
190 | __in BURN_VARIABLES* pVariables, | 191 | __in BURN_VARIABLES* pVariables, |
191 | __in DWORD dwRegistrationOptions, | 192 | __in DWORD dwRegistrationOptions, |
192 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, | 193 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, |
193 | __in DWORD64 qwEstimatedSize | 194 | __in DWORD64 qwEstimatedSize, |
195 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
194 | ); | 196 | ); |
195 | HRESULT RegistrationSessionResume( | 197 | HRESULT RegistrationSessionResume( |
196 | __in BURN_REGISTRATION* pRegistration, | 198 | __in BURN_REGISTRATION* pRegistration, |
197 | __in BURN_VARIABLES* pVariables | 199 | __in BURN_VARIABLES* pVariables, |
200 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
198 | ); | 201 | ); |
199 | HRESULT RegistrationSessionEnd( | 202 | HRESULT RegistrationSessionEnd( |
200 | __in BURN_REGISTRATION* pRegistration, | 203 | __in BURN_REGISTRATION* pRegistration, |
@@ -202,7 +205,8 @@ HRESULT RegistrationSessionEnd( | |||
202 | __in BURN_PACKAGES* pPackages, | 205 | __in BURN_PACKAGES* pPackages, |
203 | __in BURN_RESUME_MODE resumeMode, | 206 | __in BURN_RESUME_MODE resumeMode, |
204 | __in BOOTSTRAPPER_APPLY_RESTART restart, | 207 | __in BOOTSTRAPPER_APPLY_RESTART restart, |
205 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction | 208 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, |
209 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | ||
206 | ); | 210 | ); |
207 | HRESULT RegistrationSaveState( | 211 | HRESULT RegistrationSaveState( |
208 | __in BURN_REGISTRATION* pRegistration, | 212 | __in BURN_REGISTRATION* pRegistration, |
diff --git a/src/burn/engine/userexperience.cpp b/src/burn/engine/userexperience.cpp index 5a54f26e..07f4b831 100644 --- a/src/burn/engine/userexperience.cpp +++ b/src/burn/engine/userexperience.cpp | |||
@@ -2119,7 +2119,8 @@ EXTERN_C BAAPI UserExperienceOnProgress( | |||
2119 | } | 2119 | } |
2120 | 2120 | ||
2121 | EXTERN_C BAAPI UserExperienceOnRegisterBegin( | 2121 | EXTERN_C BAAPI UserExperienceOnRegisterBegin( |
2122 | __in BURN_USER_EXPERIENCE* pUserExperience | 2122 | __in BURN_USER_EXPERIENCE* pUserExperience, |
2123 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType | ||
2123 | ) | 2124 | ) |
2124 | { | 2125 | { |
2125 | HRESULT hr = S_OK; | 2126 | HRESULT hr = S_OK; |
@@ -2127,8 +2128,10 @@ EXTERN_C BAAPI UserExperienceOnRegisterBegin( | |||
2127 | BA_ONREGISTERBEGIN_RESULTS results = { }; | 2128 | BA_ONREGISTERBEGIN_RESULTS results = { }; |
2128 | 2129 | ||
2129 | args.cbSize = sizeof(args); | 2130 | args.cbSize = sizeof(args); |
2131 | args.recommendedRegistrationType = *pRegistrationType; | ||
2130 | 2132 | ||
2131 | results.cbSize = sizeof(results); | 2133 | results.cbSize = sizeof(results); |
2134 | results.registrationType = *pRegistrationType; | ||
2132 | 2135 | ||
2133 | hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERBEGIN, &args, &results); | 2136 | hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERBEGIN, &args, &results); |
2134 | ExitOnFailure(hr, "BA OnRegisterBegin failed."); | 2137 | ExitOnFailure(hr, "BA OnRegisterBegin failed."); |
@@ -2137,6 +2140,10 @@ EXTERN_C BAAPI UserExperienceOnRegisterBegin( | |||
2137 | { | 2140 | { |
2138 | hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT); | 2141 | hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT); |
2139 | } | 2142 | } |
2143 | else if (BOOTSTRAPPER_REGISTRATION_TYPE_NONE < results.registrationType && BOOTSTRAPPER_REGISTRATION_TYPE_FULL >= results.registrationType) | ||
2144 | { | ||
2145 | *pRegistrationType = results.registrationType; | ||
2146 | } | ||
2140 | 2147 | ||
2141 | LExit: | 2148 | LExit: |
2142 | return hr; | 2149 | return hr; |
@@ -2316,7 +2323,7 @@ LExit: | |||
2316 | 2323 | ||
2317 | EXTERN_C BAAPI UserExperienceOnUnregisterBegin( | 2324 | EXTERN_C BAAPI UserExperienceOnUnregisterBegin( |
2318 | __in BURN_USER_EXPERIENCE* pUserExperience, | 2325 | __in BURN_USER_EXPERIENCE* pUserExperience, |
2319 | __inout BOOL* pfKeepRegistration | 2326 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType |
2320 | ) | 2327 | ) |
2321 | { | 2328 | { |
2322 | HRESULT hr = S_OK; | 2329 | HRESULT hr = S_OK; |
@@ -2324,16 +2331,17 @@ EXTERN_C BAAPI UserExperienceOnUnregisterBegin( | |||
2324 | BA_ONUNREGISTERBEGIN_RESULTS results = { }; | 2331 | BA_ONUNREGISTERBEGIN_RESULTS results = { }; |
2325 | 2332 | ||
2326 | args.cbSize = sizeof(args); | 2333 | args.cbSize = sizeof(args); |
2327 | args.fKeepRegistration = *pfKeepRegistration; | 2334 | args.recommendedRegistrationType = *pRegistrationType; |
2328 | 2335 | ||
2329 | results.cbSize = sizeof(results); | 2336 | results.cbSize = sizeof(results); |
2337 | results.registrationType = *pRegistrationType; | ||
2330 | 2338 | ||
2331 | hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERBEGIN, &args, &results); | 2339 | hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERBEGIN, &args, &results); |
2332 | ExitOnFailure(hr, "BA OnUnregisterBegin failed."); | 2340 | ExitOnFailure(hr, "BA OnUnregisterBegin failed."); |
2333 | 2341 | ||
2334 | if (!args.fKeepRegistration && results.fForceKeepRegistration) | 2342 | if (BOOTSTRAPPER_REGISTRATION_TYPE_NONE < results.registrationType && BOOTSTRAPPER_REGISTRATION_TYPE_FULL >= results.registrationType) |
2335 | { | 2343 | { |
2336 | *pfKeepRegistration = TRUE; | 2344 | *pRegistrationType = results.registrationType; |
2337 | } | 2345 | } |
2338 | 2346 | ||
2339 | LExit: | 2347 | LExit: |
diff --git a/src/burn/engine/userexperience.h b/src/burn/engine/userexperience.h index f2453dca..56bc3239 100644 --- a/src/burn/engine/userexperience.h +++ b/src/burn/engine/userexperience.h | |||
@@ -486,7 +486,8 @@ BAAPI UserExperienceOnProgress( | |||
486 | __in DWORD dwOverallPercentage | 486 | __in DWORD dwOverallPercentage |
487 | ); | 487 | ); |
488 | BAAPI UserExperienceOnRegisterBegin( | 488 | BAAPI UserExperienceOnRegisterBegin( |
489 | __in BURN_USER_EXPERIENCE* pUserExperience | 489 | __in BURN_USER_EXPERIENCE* pUserExperience, |
490 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType | ||
490 | ); | 491 | ); |
491 | BAAPI UserExperienceOnRegisterComplete( | 492 | BAAPI UserExperienceOnRegisterComplete( |
492 | __in BURN_USER_EXPERIENCE* pUserExperience, | 493 | __in BURN_USER_EXPERIENCE* pUserExperience, |
@@ -522,7 +523,7 @@ BAAPI UserExperienceOnSystemShutdown( | |||
522 | ); | 523 | ); |
523 | BAAPI UserExperienceOnUnregisterBegin( | 524 | BAAPI UserExperienceOnUnregisterBegin( |
524 | __in BURN_USER_EXPERIENCE* pUserExperience, | 525 | __in BURN_USER_EXPERIENCE* pUserExperience, |
525 | __inout BOOL* pfKeepRegistration | 526 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType |
526 | ); | 527 | ); |
527 | BAAPI UserExperienceOnUnregisterComplete( | 528 | BAAPI UserExperienceOnUnregisterComplete( |
528 | __in BURN_USER_EXPERIENCE* pUserExperience, | 529 | __in BURN_USER_EXPERIENCE* pUserExperience, |
diff --git a/src/burn/test/BurnUnitTest/RegistrationTest.cpp b/src/burn/test/BurnUnitTest/RegistrationTest.cpp index 7b126f61..96bdb2bf 100644 --- a/src/burn/test/BurnUnitTest/RegistrationTest.cpp +++ b/src/burn/test/BurnUnitTest/RegistrationTest.cpp | |||
@@ -112,7 +112,7 @@ namespace Bootstrapper | |||
112 | TestThrowOnFailure(hr, L"Failed to get current process path."); | 112 | TestThrowOnFailure(hr, L"Failed to get current process path."); |
113 | 113 | ||
114 | // write registration | 114 | // write registration |
115 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE | BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, 0); | 115 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE | BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
116 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 116 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
117 | 117 | ||
118 | // verify that registration was created | 118 | // verify that registration was created |
@@ -123,7 +123,7 @@ namespace Bootstrapper | |||
123 | Assert::Equal<String^>(String::Concat(L"\"", Path::Combine(cacheDirectory, gcnew String(L"setup.exe")), L"\" /burn.runonce"), (String^)(Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr))); | 123 | Assert::Equal<String^>(String::Concat(L"\"", Path::Combine(cacheDirectory, gcnew String(L"setup.exe")), L"\" /burn.runonce"), (String^)(Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr))); |
124 | 124 | ||
125 | // end session | 125 | // end session |
126 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER); | 126 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); |
127 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 127 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
128 | 128 | ||
129 | // verify that registration was removed | 129 | // verify that registration was removed |
@@ -178,7 +178,7 @@ namespace Bootstrapper | |||
178 | L" <Payload Id='ux.dll' FilePath='ux.dll' Packaging='embedded' SourcePath='ux.dll' Hash='000000000000' />" | 178 | L" <Payload Id='ux.dll' FilePath='ux.dll' Packaging='embedded' SourcePath='ux.dll' Hash='000000000000' />" |
179 | L" </UX>" | 179 | L" </UX>" |
180 | L" <Registration Id='{D54F896D-1952-43e6-9C67-B5652240618C}' UpgradeCode='{D54F896D-1952-43e6-9C67-B5652240618C}' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe' PerMachine='no'>" | 180 | L" <Registration Id='{D54F896D-1952-43e6-9C67-B5652240618C}' UpgradeCode='{D54F896D-1952-43e6-9C67-B5652240618C}' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe' PerMachine='no'>" |
181 | L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='Product1' DisplayVersion='1.0.0.0' />" | 181 | L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='Product1' InProgressDisplayName='Product1 Installation' DisplayVersion='1.0.0.0' />" |
182 | L" </Registration>" | 182 | L" </Registration>" |
183 | L"</Bundle>"; | 183 | L"</Bundle>"; |
184 | 184 | ||
@@ -205,15 +205,16 @@ namespace Bootstrapper | |||
205 | // | 205 | // |
206 | 206 | ||
207 | // write registration | 207 | // write registration |
208 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, 0); | 208 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
209 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 209 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
210 | 210 | ||
211 | // verify that registration was created | 211 | // verify that registration was created |
212 | Assert::Equal<String^>(gcnew String(L"Product1 Installation"), (String^)Registry::GetValue(gcnew String(TEST_UNINSTALL_KEY), gcnew String(L"DisplayName"), nullptr)); | ||
212 | Assert::Equal(Int32(BURN_RESUME_MODE_ACTIVE), (Int32)Registry::GetValue(gcnew String(TEST_UNINSTALL_KEY), gcnew String(L"Resume"), nullptr)); | 213 | Assert::Equal(Int32(BURN_RESUME_MODE_ACTIVE), (Int32)Registry::GetValue(gcnew String(TEST_UNINSTALL_KEY), gcnew String(L"Resume"), nullptr)); |
213 | Assert::Equal<String^>(String::Concat(L"\"", Path::Combine(cacheDirectory, gcnew String(L"setup.exe")), L"\" /burn.runonce"), (String^)Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr)); | 214 | Assert::Equal<String^>(String::Concat(L"\"", Path::Combine(cacheDirectory, gcnew String(L"setup.exe")), L"\" /burn.runonce"), (String^)Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr)); |
214 | 215 | ||
215 | // complete registration | 216 | // complete registration |
216 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_ARP, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER); | 217 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_ARP, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
217 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 218 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
218 | 219 | ||
219 | // verify that registration was updated | 220 | // verify that registration was updated |
@@ -226,7 +227,7 @@ namespace Bootstrapper | |||
226 | // | 227 | // |
227 | 228 | ||
228 | // write registration | 229 | // write registration |
229 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER, 0); | 230 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
230 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 231 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
231 | 232 | ||
232 | // verify that registration was updated | 233 | // verify that registration was updated |
@@ -235,7 +236,7 @@ namespace Bootstrapper | |||
235 | Assert::Equal<String^>(String::Concat(L"\"", Path::Combine(cacheDirectory, gcnew String(L"setup.exe")), L"\" /burn.runonce"), (String^)Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr)); | 236 | Assert::Equal<String^>(String::Concat(L"\"", Path::Combine(cacheDirectory, gcnew String(L"setup.exe")), L"\" /burn.runonce"), (String^)Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr)); |
236 | 237 | ||
237 | // delete registration | 238 | // delete registration |
238 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER); | 239 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); |
239 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 240 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
240 | 241 | ||
241 | // verify that registration was removed | 242 | // verify that registration was removed |
@@ -316,7 +317,7 @@ namespace Bootstrapper | |||
316 | // | 317 | // |
317 | 318 | ||
318 | // write registration | 319 | // write registration |
319 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, 0); | 320 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
320 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 321 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
321 | 322 | ||
322 | // verify that registration was created | 323 | // verify that registration was created |
@@ -324,10 +325,11 @@ namespace Bootstrapper | |||
324 | Assert::Equal<String^>(String::Concat(L"\"", Path::Combine(cacheDirectory, gcnew String(L"setup.exe")), L"\" /burn.runonce"), (String^)Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr)); | 325 | Assert::Equal<String^>(String::Concat(L"\"", Path::Combine(cacheDirectory, gcnew String(L"setup.exe")), L"\" /burn.runonce"), (String^)Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr)); |
325 | 326 | ||
326 | // complete registration | 327 | // complete registration |
327 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_ARP, BOOTSTRAPPER_APPLY_RESTART_REQUIRED, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER); | 328 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_ARP, BOOTSTRAPPER_APPLY_RESTART_REQUIRED, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, BOOTSTRAPPER_REGISTRATION_TYPE_FULL); |
328 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 329 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
329 | 330 | ||
330 | // verify that registration variables were updated | 331 | // verify that registration variables were updated |
332 | Assert::Equal<String^>(gcnew String(L"Product1"), (String^)Registry::GetValue(gcnew String(TEST_UNINSTALL_KEY), gcnew String(L"DisplayName"), nullptr)); | ||
331 | registration.fInstalled = TRUE; | 333 | registration.fInstalled = TRUE; |
332 | 334 | ||
333 | hr = RegistrationSetVariables(®istration, &variables); | 335 | hr = RegistrationSetVariables(®istration, &variables); |
@@ -344,7 +346,7 @@ namespace Bootstrapper | |||
344 | // | 346 | // |
345 | 347 | ||
346 | // delete registration | 348 | // delete registration |
347 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER); | 349 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); |
348 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 350 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
349 | 351 | ||
350 | // verify that registration was removed | 352 | // verify that registration was removed |
@@ -427,7 +429,7 @@ namespace Bootstrapper | |||
427 | // | 429 | // |
428 | 430 | ||
429 | // write registration | 431 | // write registration |
430 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, 0); | 432 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
431 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 433 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
432 | 434 | ||
433 | // verify that registration was created | 435 | // verify that registration was created |
@@ -435,7 +437,7 @@ namespace Bootstrapper | |||
435 | Assert::Equal<String^>(String::Concat(L"\"", Path::Combine(cacheDirectory, gcnew String(L"setup.exe")), L"\" /burn.runonce"), (String^)Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr)); | 437 | Assert::Equal<String^>(String::Concat(L"\"", Path::Combine(cacheDirectory, gcnew String(L"setup.exe")), L"\" /burn.runonce"), (String^)Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr)); |
436 | 438 | ||
437 | // finish registration | 439 | // finish registration |
438 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_ARP, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER); | 440 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_ARP, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, BOOTSTRAPPER_REGISTRATION_TYPE_FULL); |
439 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 441 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
440 | 442 | ||
441 | // verify that registration was updated | 443 | // verify that registration was updated |
@@ -460,7 +462,7 @@ namespace Bootstrapper | |||
460 | // | 462 | // |
461 | 463 | ||
462 | // write registration | 464 | // write registration |
463 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER, 0); | 465 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
464 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 466 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
465 | 467 | ||
466 | // verify that registration was updated | 468 | // verify that registration was updated |
@@ -468,7 +470,7 @@ namespace Bootstrapper | |||
468 | Assert::Equal<String^>(String::Concat(L"\"", Path::Combine(cacheDirectory, gcnew String(L"setup.exe")), L"\" /burn.runonce"), (String^)Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr)); | 470 | Assert::Equal<String^>(String::Concat(L"\"", Path::Combine(cacheDirectory, gcnew String(L"setup.exe")), L"\" /burn.runonce"), (String^)Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr)); |
469 | 471 | ||
470 | // delete registration | 472 | // delete registration |
471 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER); | 473 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); |
472 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 474 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
473 | 475 | ||
474 | // verify that registration was removed | 476 | // verify that registration was removed |
@@ -560,7 +562,7 @@ namespace Bootstrapper | |||
560 | Assert::Equal((int)BOOTSTRAPPER_RESUME_TYPE_NONE, (int)resumeType); | 562 | Assert::Equal((int)BOOTSTRAPPER_RESUME_TYPE_NONE, (int)resumeType); |
561 | 563 | ||
562 | // begin session | 564 | // begin session |
563 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, 0); | 565 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &variables, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
564 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 566 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
565 | 567 | ||
566 | hr = RegistrationSaveState(®istration, rgbData, sizeof(rgbData)); | 568 | hr = RegistrationSaveState(®istration, rgbData, sizeof(rgbData)); |
@@ -573,7 +575,7 @@ namespace Bootstrapper | |||
573 | Assert::Equal((int)BOOTSTRAPPER_RESUME_TYPE_INTERRUPTED, (int)resumeType); | 575 | Assert::Equal((int)BOOTSTRAPPER_RESUME_TYPE_INTERRUPTED, (int)resumeType); |
574 | 576 | ||
575 | // suspend session | 577 | // suspend session |
576 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_SUSPEND, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER); | 578 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_SUSPEND, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
577 | TestThrowOnFailure(hr, L"Failed to suspend session."); | 579 | TestThrowOnFailure(hr, L"Failed to suspend session."); |
578 | 580 | ||
579 | // verify that run key was removed | 581 | // verify that run key was removed |
@@ -593,14 +595,14 @@ namespace Bootstrapper | |||
593 | Assert::True(0 == memcmp(pbBuffer, rgbData, sizeof(rgbData))); | 595 | Assert::True(0 == memcmp(pbBuffer, rgbData, sizeof(rgbData))); |
594 | 596 | ||
595 | // write active resume mode | 597 | // write active resume mode |
596 | hr = RegistrationSessionResume(®istration, &variables); | 598 | hr = RegistrationSessionResume(®istration, &variables, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
597 | TestThrowOnFailure(hr, L"Failed to write active resume mode."); | 599 | TestThrowOnFailure(hr, L"Failed to write active resume mode."); |
598 | 600 | ||
599 | // verify that run key was put back | 601 | // verify that run key was put back |
600 | Assert::NotEqual((Object^)nullptr, Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr)); | 602 | Assert::NotEqual((Object^)nullptr, Registry::GetValue(gcnew String(TEST_RUN_KEY), gcnew String(L"{D54F896D-1952-43e6-9C67-B5652240618C}"), nullptr)); |
601 | 603 | ||
602 | // end session | 604 | // end session |
603 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER); | 605 | hr = RegistrationSessionEnd(®istration, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); |
604 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 606 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
605 | 607 | ||
606 | // read resume type after session | 608 | // read resume type after session |
diff --git a/src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs b/src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs index e95fee54..77f20e5c 100644 --- a/src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs +++ b/src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs | |||
@@ -210,6 +210,11 @@ namespace WixToolset.Core.Burn.Bundles | |||
210 | writer.WriteAttributeString("DisplayName", this.BundleSymbol.Name); | 210 | writer.WriteAttributeString("DisplayName", this.BundleSymbol.Name); |
211 | writer.WriteAttributeString("DisplayVersion", this.BundleSymbol.Version); | 211 | writer.WriteAttributeString("DisplayVersion", this.BundleSymbol.Version); |
212 | 212 | ||
213 | if (!String.IsNullOrEmpty(this.BundleSymbol.InProgressName)) | ||
214 | { | ||
215 | writer.WriteAttributeString("InProgressDisplayName", this.BundleSymbol.InProgressName); | ||
216 | } | ||
217 | |||
213 | if (!String.IsNullOrEmpty(this.BundleSymbol.Manufacturer)) | 218 | if (!String.IsNullOrEmpty(this.BundleSymbol.Manufacturer)) |
214 | { | 219 | { |
215 | writer.WriteAttributeString("Publisher", this.BundleSymbol.Manufacturer); | 220 | writer.WriteAttributeString("Publisher", this.BundleSymbol.Manufacturer); |
diff --git a/src/wix/WixToolset.Core/Compiler_Bundle.cs b/src/wix/WixToolset.Core/Compiler_Bundle.cs index 1ca3fb00..3e238b82 100644 --- a/src/wix/WixToolset.Core/Compiler_Bundle.cs +++ b/src/wix/WixToolset.Core/Compiler_Bundle.cs | |||
@@ -122,6 +122,7 @@ namespace WixToolset.Core | |||
122 | WixBundleAttributes attributes = 0; | 122 | WixBundleAttributes attributes = 0; |
123 | string helpTelephone = null; | 123 | string helpTelephone = null; |
124 | string helpUrl = null; | 124 | string helpUrl = null; |
125 | string inProgressName = null; | ||
125 | string manufacturer = null; | 126 | string manufacturer = null; |
126 | string name = null; | 127 | string name = null; |
127 | string tag = null; | 128 | string tag = null; |
@@ -190,6 +191,9 @@ namespace WixToolset.Core | |||
190 | case "IconSourceFile": | 191 | case "IconSourceFile": |
191 | iconSourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib); | 192 | iconSourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib); |
192 | break; | 193 | break; |
194 | case "InProgressName": | ||
195 | inProgressName = this.Core.GetAttributeValue(sourceLineNumbers, attrib); | ||
196 | break; | ||
193 | case "Name": | 197 | case "Name": |
194 | name = this.Core.GetAttributeValue(sourceLineNumbers, attrib); | 198 | name = this.Core.GetAttributeValue(sourceLineNumbers, attrib); |
195 | break; | 199 | break; |
@@ -247,6 +251,12 @@ namespace WixToolset.Core | |||
247 | } | 251 | } |
248 | } | 252 | } |
249 | 253 | ||
254 | if (String.IsNullOrEmpty(name) && !String.IsNullOrEmpty(inProgressName)) | ||
255 | { | ||
256 | name = inProgressName; | ||
257 | inProgressName = null; | ||
258 | } | ||
259 | |||
250 | if (String.IsNullOrEmpty(name)) | 260 | if (String.IsNullOrEmpty(name)) |
251 | { | 261 | { |
252 | logVariablePrefixAndExtension = String.Concat("WixBundleLog:Setup:log"); | 262 | logVariablePrefixAndExtension = String.Concat("WixBundleLog:Setup:log"); |
@@ -280,7 +290,6 @@ namespace WixToolset.Core | |||
280 | } | 290 | } |
281 | } | 291 | } |
282 | 292 | ||
283 | var baSeen = false; | ||
284 | var chainSeen = false; | 293 | var chainSeen = false; |
285 | var logSeen = false; | 294 | var logSeen = false; |
286 | 295 | ||
@@ -294,13 +303,7 @@ namespace WixToolset.Core | |||
294 | this.ParseApprovedExeForElevation(child); | 303 | this.ParseApprovedExeForElevation(child); |
295 | break; | 304 | break; |
296 | case "BootstrapperApplication": | 305 | case "BootstrapperApplication": |
297 | if (baSeen) | ||
298 | { | ||
299 | var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); | ||
300 | this.Core.Write(ErrorMessages.TooManyChildren(childSourceLineNumbers, node.Name.LocalName, "BootstrapperApplication")); | ||
301 | } | ||
302 | this.ParseBootstrapperApplicationElement(child); | 306 | this.ParseBootstrapperApplicationElement(child); |
303 | baSeen = true; | ||
304 | break; | 307 | break; |
305 | case "BootstrapperApplicationRef": | 308 | case "BootstrapperApplicationRef": |
306 | this.ParseBootstrapperApplicationRefElement(child); | 309 | this.ParseBootstrapperApplicationRefElement(child); |
@@ -397,6 +400,7 @@ namespace WixToolset.Core | |||
397 | UpgradeCode = upgradeCode, | 400 | UpgradeCode = upgradeCode, |
398 | Version = version, | 401 | Version = version, |
399 | Copyright = copyright, | 402 | Copyright = copyright, |
403 | InProgressName = inProgressName, | ||
400 | Name = name, | 404 | Name = name, |
401 | Manufacturer = manufacturer, | 405 | Manufacturer = manufacturer, |
402 | Attributes = attributes, | 406 | Attributes = attributes, |
@@ -437,6 +441,12 @@ namespace WixToolset.Core | |||
437 | }); | 441 | }); |
438 | 442 | ||
439 | // Ensure that the bundle stores the well-known persisted values. | 443 | // Ensure that the bundle stores the well-known persisted values. |
444 | this.Core.AddSymbol(new WixBundleVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Section, BurnConstants.BURN_BUNDLE_INPROGRESS_NAME)) | ||
445 | { | ||
446 | Hidden = false, | ||
447 | Persisted = true, | ||
448 | }); | ||
449 | |||
440 | this.Core.AddSymbol(new WixBundleVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Section, BurnConstants.BURN_BUNDLE_NAME)) | 450 | this.Core.AddSymbol(new WixBundleVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Section, BurnConstants.BURN_BUNDLE_NAME)) |
441 | { | 451 | { |
442 | Hidden = false, | 452 | Hidden = false, |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs index ab644080..40167eda 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs | |||
@@ -116,7 +116,7 @@ namespace WixToolsetTest.CoreIntegration | |||
116 | var registrationElements = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Registration"); | 116 | var registrationElements = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Registration"); |
117 | var registrationElement = (XmlNode)Assert.Single(registrationElements); | 117 | var registrationElement = (XmlNode)Assert.Single(registrationElements); |
118 | Assert.Equal($"<Registration Id='{bundleSymbol.BundleId}' ExecutableName='test.exe' PerMachine='yes' Tag='' Version='1.0.0.0' ProviderKey='{bundleSymbol.BundleId}'>" + | 118 | Assert.Equal($"<Registration Id='{bundleSymbol.BundleId}' ExecutableName='test.exe' PerMachine='yes' Tag='' Version='1.0.0.0' ProviderKey='{bundleSymbol.BundleId}'>" + |
119 | "<Arp Register='yes' DisplayName='~TestBundle' DisplayVersion='1.0.0.0' Publisher='Example Corporation' />" + | 119 | "<Arp Register='yes' DisplayName='~TestBundle' DisplayVersion='1.0.0.0' InProgressDisplayName='~InProgressTestBundle' Publisher='Example Corporation' />" + |
120 | "</Registration>", registrationElement.GetTestXml()); | 120 | "</Registration>", registrationElement.GetTestXml()); |
121 | 121 | ||
122 | var msiPayloads = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Payload[@Id='test.msi']"); | 122 | var msiPayloads = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Payload[@Id='test.msi']"); |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.en-us.wxl b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.en-us.wxl index bc1dee83..2a7af0b3 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.en-us.wxl +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.en-us.wxl | |||
@@ -6,5 +6,6 @@ This file contains the declaration of all the localizable strings. | |||
6 | <WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US"> | 6 | <WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US"> |
7 | 7 | ||
8 | <String Id="BundleName">~TestBundle</String> | 8 | <String Id="BundleName">~TestBundle</String> |
9 | <String Id="BundleInProgressName">~InProgressTestBundle</String> | ||
9 | 10 | ||
10 | </WixLocalization> | 11 | </WixLocalization> |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.wxs index 21749c07..01b9e716 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.wxs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/SimpleBundle/Bundle.wxs | |||
@@ -1,5 +1,5 @@ | |||
1 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | 1 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> |
2 | <Bundle Name="!(loc.BundleName)" Version="!(bind.packageVersion.test.msi)" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"> | 2 | <Bundle Name="!(loc.BundleName)" InProgressName="!(loc.BundleInProgressName)" Version="!(bind.packageVersion.test.msi)" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"> |
3 | <BootstrapperApplication> | 3 | <BootstrapperApplication> |
4 | <BootstrapperApplicationDll SourceFile="fakeba.dll" /> | 4 | <BootstrapperApplicationDll SourceFile="fakeba.dll" /> |
5 | </BootstrapperApplication> | 5 | </BootstrapperApplication> |