@joebigelow / wix / commits / f43d176f

Make the BA responsible for parsing restart prompt behavior.

Fixes #4975

Sean Hall committed Jul 2, 2021 at 10:18 UTC f43d176f95601ff7524e06247166d4f3b6e61c05
19 files changed +180 -143
src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h
-10
@@ -11,15 +11,6 @@ enum BOOTSTRAPPER_DISPLAY
11 BOOTSTRAPPER_DISPLAY_FULL,
12 };
13
14 -enum BOOTSTRAPPER_RESTART
15 -{
16 - BOOTSTRAPPER_RESTART_UNKNOWN,
17 - BOOTSTRAPPER_RESTART_NEVER,
18 - BOOTSTRAPPER_RESTART_PROMPT,
19 - BOOTSTRAPPER_RESTART_AUTOMATIC,
20 - BOOTSTRAPPER_RESTART_ALWAYS,
21 -};
22 -
14 enum BOOTSTRAPPER_REGISTRATION_TYPE
15 {
16 BOOTSTRAPPER_REGISTRATION_TYPE_NONE, // The engine will ignore NONE if it recommended INPROGRESS or FULL.
@@ -286,7 +277,6 @@ struct BOOTSTRAPPER_COMMAND
277 DWORD cbSize;
278 BOOTSTRAPPER_ACTION action;
279 BOOTSTRAPPER_DISPLAY display;
289 - BOOTSTRAPPER_RESTART restart;
280
281 LPWSTR wzCommandLine;
282 int nCmdShow;
src/api/burn/WixToolset.Mba.Core/BootstrapperCommand.cs
+26 -7
@@ -17,7 +17,6 @@ namespace WixToolset.Mba.Core
17 /// </summary>
18 /// <param name="action"></param>
19 /// <param name="display"></param>
20 - /// <param name="restart"></param>
20 /// <param name="commandLine"></param>
21 /// <param name="cmdShow"></param>
22 /// <param name="resume"></param>
@@ -30,7 +29,6 @@ namespace WixToolset.Mba.Core
29 public BootstrapperCommand(
30 LaunchAction action,
31 Display display,
33 - Restart restart,
32 string commandLine,
33 int cmdShow,
34 ResumeType resume,
@@ -43,7 +41,6 @@ namespace WixToolset.Mba.Core
41 {
42 this.Action = action;
43 this.Display = display;
46 - this.Restart = restart;
44 this.CommandLine = commandLine;
45 this.CmdShow = cmdShow;
46 this.Resume = resume;
@@ -61,9 +58,6 @@ namespace WixToolset.Mba.Core
58 /// <inheritdoc/>
59 public Display Display { get; }
60
64 - /// <inheritdoc/>
65 - public Restart Restart { get; }
66 -
61 /// <inheritdoc/>
62 public string CommandLine { get; }
63
@@ -97,6 +91,7 @@ namespace WixToolset.Mba.Core
91 var args = ParseCommandLineToArgs(this.CommandLine);
92 var unknownArgs = new List<string>();
93 var variables = new List<KeyValuePair<string, string>>();
94 + var restart = Restart.Unknown;
95
96 foreach (var arg in args)
97 {
@@ -104,7 +99,25 @@ namespace WixToolset.Mba.Core
99
100 if (arg[0] == '-' || arg[0] == '/')
101 {
107 - unknownArg = true;
102 + var parameter = arg.Substring(1).ToLowerInvariant();
103 + switch (parameter)
104 + {
105 + case "norestart":
106 + if (restart == Restart.Unknown)
107 + {
108 + restart = Restart.Never;
109 + }
110 + break;
111 + case "forcerestart":
112 + if (restart == Restart.Unknown)
113 + {
114 + restart = Restart.Always;
115 + }
116 + break;
117 + default:
118 + unknownArg = true;
119 + break;
120 + }
121 }
122 else
123 {
@@ -127,8 +140,14 @@ namespace WixToolset.Mba.Core
140 }
141 }
142
143 + if (restart == Restart.Unknown)
144 + {
145 + restart = this.Display < Display.Full ? Restart.Automatic : Restart.Prompt;
146 + }
147 +
148 return new MbaCommand
149 {
150 + Restart = restart,
151 UnknownCommandLineArgs = unknownArgs.ToArray(),
152 Variables = variables.ToArray(),
153 };
src/api/burn/WixToolset.Mba.Core/IBootstrapperApplicationFactory.cs
-2
@@ -35,7 +35,6 @@ namespace WixToolset.Mba.Core
35 [MarshalAs(UnmanagedType.I4)] internal int cbSize;
36 [MarshalAs(UnmanagedType.U4)] private readonly LaunchAction action;
37 [MarshalAs(UnmanagedType.U4)] private readonly Display display;
38 - [MarshalAs(UnmanagedType.U4)] private readonly Restart restart;
38 private readonly IntPtr wzCommandLine;
39 [MarshalAs(UnmanagedType.I4)] private readonly int nCmdShow;
40 [MarshalAs(UnmanagedType.U4)] private readonly ResumeType resume;
@@ -51,7 +50,6 @@ namespace WixToolset.Mba.Core
50 return new BootstrapperCommand(
51 this.action,
52 this.display,
54 - this.restart,
53 Marshal.PtrToStringUni(this.wzCommandLine),
54 this.nCmdShow,
55 this.resume,
src/api/burn/WixToolset.Mba.Core/IBootstrapperCommand.cs
-5
@@ -19,11 +19,6 @@ namespace WixToolset.Mba.Core
19 /// </summary>
20 Display Display { get; }
21
22 - /// <summary>
23 - /// Gets the action to perform if a reboot is required.
24 - /// </summary>
25 - Restart Restart { get; }
26 -
22 /// <summary>
23 /// Gets the command line arguments.
24 /// </summary>
src/api/burn/WixToolset.Mba.Core/IMbaCommand.cs
+5
@@ -9,6 +9,11 @@ namespace WixToolset.Mba.Core
9 /// </summary>
10 public interface IMbaCommand
11 {
12 + /// <summary>
13 + /// Gets the action to perform if a reboot is required.
14 + /// </summary>
15 + Restart Restart { get; }
16 +
17 /// <summary>
18 /// The command line arguments not parsed into <see cref="IBootstrapperCommand"/> or <see cref="IMbaCommand"/>.
19 /// </summary>
src/api/burn/WixToolset.Mba.Core/MbaCommand.cs
+2
@@ -9,6 +9,8 @@ namespace WixToolset.Mba.Core
9 /// </summary>
10 internal sealed class MbaCommand : IMbaCommand
11 {
12 + public Restart Restart { get; internal set; }
13 +
14 public string[] UnknownCommandLineArgs { get; internal set; }
15
16 public KeyValuePair<string, string>[] Variables { get; internal set; }
src/api/burn/balutil/balinfo.cpp
+29 -7
@@ -19,7 +19,7 @@ static HRESULT ParseOverridableVariablesFromXml(
19
20 DAPI_(HRESULT) BalInfoParseCommandLine(
21 __in BAL_INFO_COMMAND* pCommand,
22 - __in LPCWSTR wzCommandLine
22 + __in const BOOTSTRAPPER_COMMAND* pBootstrapperCommand
23 )
24 {
25 HRESULT hr = S_OK;
@@ -29,13 +29,13 @@ DAPI_(HRESULT) BalInfoParseCommandLine(
29
30 BalInfoUninitializeCommandLine(pCommand);
31
32 - if (!wzCommandLine || !*wzCommandLine)
32 + if (!pBootstrapperCommand->wzCommandLine || !*pBootstrapperCommand->wzCommandLine)
33 {
34 ExitFunction();
35 }
36
37 - hr = AppParseCommandLine(wzCommandLine, &argc, &argv);
38 - ExitOnFailure(hr, "Failed to parse command line.");
37 + hr = AppParseCommandLine(pBootstrapperCommand->wzCommandLine, &argc, &argv);
38 + BalExitOnFailure(hr, "Failed to parse command line.");
39
40 for (int i = 0; i < argc; ++i)
41 {
@@ -43,7 +43,24 @@ DAPI_(HRESULT) BalInfoParseCommandLine(
43
44 if (argv[i][0] == L'-' || argv[i][0] == L'/')
45 {
46 - fUnknownArg = TRUE;
46 + if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"norestart", -1))
47 + {
48 + if (BAL_INFO_RESTART_UNKNOWN == pCommand->restart)
49 + {
50 + pCommand->restart = BAL_INFO_RESTART_NEVER;
51 + }
52 + }
53 + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"forcerestart", -1))
54 + {
55 + if (BAL_INFO_RESTART_UNKNOWN == pCommand->restart)
56 + {
57 + pCommand->restart = BAL_INFO_RESTART_ALWAYS;
58 + }
59 + }
60 + else
61 + {
62 + fUnknownArg = TRUE;
63 + }
64 }
65 else
66 {
@@ -55,10 +72,10 @@ DAPI_(HRESULT) BalInfoParseCommandLine(
72 else
73 {
74 hr = MemEnsureArraySizeForNewItems(reinterpret_cast<LPVOID*>(&pCommand->rgVariableNames), pCommand->cVariables, 1, sizeof(LPWSTR), 5);
58 - ExitOnFailure(hr, "Failed to ensure size for variable names.");
75 + BalExitOnFailure(hr, "Failed to ensure size for variable names.");
76
77 hr = MemEnsureArraySizeForNewItems(reinterpret_cast<LPVOID*>(&pCommand->rgVariableValues), pCommand->cVariables, 1, sizeof(LPWSTR), 5);
61 - ExitOnFailure(hr, "Failed to ensure size for variable values.");
78 + BalExitOnFailure(hr, "Failed to ensure size for variable values.");
79
80 LPWSTR* psczVariableName = pCommand->rgVariableNames + pCommand->cVariables;
81 LPWSTR* psczVariableValue = pCommand->rgVariableValues + pCommand->cVariables;
@@ -86,6 +103,11 @@ DAPI_(HRESULT) BalInfoParseCommandLine(
103 }
104
105 LExit:
106 + if (BAL_INFO_RESTART_UNKNOWN == pCommand->restart)
107 + {
108 + pCommand->restart = BOOTSTRAPPER_DISPLAY_FULL > pBootstrapperCommand->display ? BAL_INFO_RESTART_AUTOMATIC : BAL_INFO_RESTART_PROMPT;
109 + }
110 +
111 if (argv)
112 {
113 AppFreeCommandLineArgs(argv);
src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h
+23 -5
@@ -9,6 +9,7 @@
9 #include "IBootstrapperApplication.h"
10
11 #include "balutil.h"
12 +#include "balinfo.h"
13 #include "balretry.h"
14
15 class CBalBaseBootstrapperApplication : public IBootstrapperApplication
@@ -794,7 +795,7 @@ public: // IBootstrapperApplication
795 {
796 HRESULT hr = S_OK;
797 BOOL fRestartRequired = BOOTSTRAPPER_APPLY_RESTART_REQUIRED == restart;
797 - BOOL fShouldBlockRestart = BOOTSTRAPPER_DISPLAY_FULL <= m_display && BOOTSTRAPPER_RESTART_PROMPT >= m_restart;
798 + BOOL fShouldBlockRestart = BOOTSTRAPPER_DISPLAY_FULL <= m_display && BAL_INFO_RESTART_PROMPT >= m_BalInfoCommand.restart;
799
800 if (fRestartRequired && !fShouldBlockRestart)
801 {
@@ -976,6 +977,22 @@ public: // IBootstrapperApplication
977 return S_OK;
978 }
979
980 +public: //CBalBaseBootstrapperApplication
981 + virtual STDMETHODIMP Initialize(
982 + __in const BOOTSTRAPPER_CREATE_ARGS* pCreateArgs
983 + )
984 + {
985 + HRESULT hr = S_OK;
986 +
987 + m_display = pCreateArgs->pCommand->display;
988 +
989 + hr = BalInfoParseCommandLine(&m_BalInfoCommand, pCreateArgs->pCommand);
990 + BalExitOnFailure(hr, "Failed to parse command line with balutil.");
991 +
992 + LExit:
993 + return hr;
994 + }
995 +
996 protected:
997 //
998 // PromptCancel - prompts the user to close (if not forced).
@@ -1029,20 +1046,19 @@ protected:
1046
1047 CBalBaseBootstrapperApplication(
1048 __in IBootstrapperEngine* pEngine,
1032 - __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
1049 __in DWORD dwRetryCount = 0,
1050 __in DWORD dwRetryTimeout = 1000
1051 )
1052 {
1053 m_cReferences = 1;
1038 - m_display = pArgs->pCommand->display;
1039 - m_restart = pArgs->pCommand->restart;
1054 + m_display = BOOTSTRAPPER_DISPLAY_UNKNOWN;
1055
1056 pEngine->AddRef();
1057 m_pEngine = pEngine;
1058
1059 ::InitializeCriticalSection(&m_csCanceled);
1060 m_fCanceled = FALSE;
1061 + m_BalInfoCommand = { };
1062 m_fApplying = FALSE;
1063 m_fRollingBack = FALSE;
1064
@@ -1054,6 +1070,7 @@ protected:
1070
1071 virtual ~CBalBaseBootstrapperApplication()
1072 {
1073 + BalInfoUninitializeCommandLine(&m_BalInfoCommand);
1074 BalRetryUninitialize();
1075 ::DeleteCriticalSection(&m_csCanceled);
1076
@@ -1064,10 +1081,11 @@ protected:
1081 CRITICAL_SECTION m_csCanceled;
1082 BOOL m_fCanceled;
1083
1084 + BAL_INFO_COMMAND m_BalInfoCommand;
1085 +
1086 private:
1087 long m_cReferences;
1088 BOOTSTRAPPER_DISPLAY m_display;
1070 - BOOTSTRAPPER_RESTART m_restart;
1089 IBootstrapperEngine* m_pEngine;
1090
1091 BOOL m_fApplying;
src/api/burn/balutil/inc/balinfo.h
+11 -1
@@ -18,6 +18,15 @@ typedef enum BAL_INFO_PACKAGE_TYPE
18 BAL_INFO_PACKAGE_TYPE_BUNDLE_PATCH,
19 } BAL_INFO_PACKAGE_TYPE;
20
21 +typedef enum _BAL_INFO_RESTART
22 +{
23 + BAL_INFO_RESTART_UNKNOWN,
24 + BAL_INFO_RESTART_NEVER,
25 + BAL_INFO_RESTART_PROMPT,
26 + BAL_INFO_RESTART_AUTOMATIC,
27 + BAL_INFO_RESTART_ALWAYS,
28 +} BAL_INFO_RESTART;
29 +
30 typedef enum _BAL_INFO_VARIABLE_COMMAND_LINE_TYPE
31 {
32 BAL_INFO_VARIABLE_COMMAND_LINE_TYPE_UPPER_CASE,
@@ -85,6 +94,7 @@ typedef struct _BAL_INFO_COMMAND
94 DWORD cVariables;
95 LPWSTR* rgVariableNames;
96 LPWSTR* rgVariableValues;
97 + BAL_INFO_RESTART restart;
98 } BAL_INFO_COMMAND;
99
100
@@ -94,7 +104,7 @@ typedef struct _BAL_INFO_COMMAND
104 ********************************************************************/
105 HRESULT DAPI BalInfoParseCommandLine(
106 __in BAL_INFO_COMMAND* pCommand,
97 - __in LPCWSTR wzCommandLine
107 + __in const BOOTSTRAPPER_COMMAND* pBootstrapperCommand
108 );
109
110
src/api/burn/bextutil/inc/BextBaseBundleExtension.h
+1 -1
@@ -80,7 +80,7 @@ public: // IBundleExtension
80 public: //CBextBaseBundleExtension
81 virtual STDMETHODIMP Initialize(
82 __in const BUNDLE_EXTENSION_CREATE_ARGS* pCreateArgs
83 - )
83 + )
84 {
85 HRESULT hr = S_OK;
86
src/api/burn/test/BalUtilUnitTest/TestBootstrapperApplication.cpp
+6 -4
@@ -8,9 +8,8 @@ class CTestBootstrapperApplication : public CBalBaseBootstrapperApplication
8 {
9 public:
10 CTestBootstrapperApplication(
11 - __in IBootstrapperEngine* pEngine,
12 - __in const BOOTSTRAPPER_CREATE_ARGS* pArgs
13 - ) : CBalBaseBootstrapperApplication(pEngine, pArgs)
11 + __in IBootstrapperEngine* pEngine
12 + ) : CBalBaseBootstrapperApplication(pEngine)
13 {
14 }
15 };
@@ -25,9 +24,12 @@ HRESULT CreateBootstrapperApplication(
24 HRESULT hr = S_OK;
25 CTestBootstrapperApplication* pApplication = NULL;
26
28 - pApplication = new CTestBootstrapperApplication(pEngine, pArgs);
27 + pApplication = new CTestBootstrapperApplication(pEngine);
28 ExitOnNull(pApplication, hr, E_OUTOFMEMORY, "Failed to create new test bootstrapper application object.");
29
30 + hr = pApplication->Initialize(pArgs);
31 + ExitOnFailure(hr, "CTestBootstrapperApplication initialization failed.");
32 +
33 pResults->pfnBootstrapperApplicationProc = BalBaseBootstrapperApplicationProc;
34 pResults->pvBootstrapperApplicationProcContext = pApplication;
35 *ppApplication = pApplication;
src/api/burn/test/WixToolsetTest.Mba.Core/BaseBootstrapperApplicationFactoryFixture.cs
-1
@@ -101,7 +101,6 @@ namespace WixToolsetTest.Mba.Core
101 public int cbSize;
102 public LaunchAction action;
103 public Display display;
104 - public Restart restart;
104 [MarshalAs(UnmanagedType.LPWStr)] public string wzCommandLine;
105 public int nCmdShow;
106 public ResumeType resume;
src/burn/engine/core.cpp
-39
@@ -924,7 +924,6 @@ extern "C" HRESULT CoreRecreateCommandLine(
924 __deref_inout_z LPWSTR* psczCommandLine,
925 __in BOOTSTRAPPER_ACTION action,
926 __in BOOTSTRAPPER_DISPLAY display,
927 - __in BOOTSTRAPPER_RESTART restart,
927 __in BOOTSTRAPPER_RELATION_TYPE relationType,
928 __in BOOL fPassthrough,
929 __in_z_opt LPCWSTR wzActiveParent,
@@ -965,17 +964,6 @@ extern "C" HRESULT CoreRecreateCommandLine(
964 }
965 ExitOnFailure(hr, "Failed to append action state to command-line");
966
968 - switch (restart)
969 - {
970 - case BOOTSTRAPPER_RESTART_ALWAYS:
971 - hr = StrAllocConcat(psczCommandLine, L" /forcerestart", 0);
972 - break;
973 - case BOOTSTRAPPER_RESTART_NEVER:
974 - hr = StrAllocConcat(psczCommandLine, L" /norestart", 0);
975 - break;
976 - }
977 - ExitOnFailure(hr, "Failed to append restart state to command-line");
978 -
967 if (wzActiveParent)
968 {
969 if (*wzActiveParent)
@@ -1246,32 +1234,10 @@ extern "C" HRESULT CoreParseCommandLine(
1234 CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"silent", -1))
1235 {
1236 pCommand->display = BOOTSTRAPPER_DISPLAY_NONE;
1249 -
1250 - if (BOOTSTRAPPER_RESTART_UNKNOWN == pCommand->restart)
1251 - {
1252 - pCommand->restart = BOOTSTRAPPER_RESTART_AUTOMATIC;
1253 - }
1237 }
1238 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"passive", -1))
1239 {
1240 pCommand->display = BOOTSTRAPPER_DISPLAY_PASSIVE;
1258 -
1259 - if (BOOTSTRAPPER_RESTART_UNKNOWN == pCommand->restart)
1260 - {
1261 - pCommand->restart = BOOTSTRAPPER_RESTART_AUTOMATIC;
1262 - }
1263 - }
1264 - else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"norestart", -1))
1265 - {
1266 - pCommand->restart = BOOTSTRAPPER_RESTART_NEVER;
1267 - }
1268 - else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"forcerestart", -1))
1269 - {
1270 - pCommand->restart = BOOTSTRAPPER_RESTART_ALWAYS;
1271 - }
1272 - else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"promptrestart", -1))
1273 - {
1274 - pCommand->restart = BOOTSTRAPPER_RESTART_PROMPT;
1241 }
1242 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"layout", -1))
1243 {
@@ -1653,11 +1619,6 @@ extern "C" HRESULT CoreParseCommandLine(
1619 pCommand->display = BOOTSTRAPPER_DISPLAY_FULL;
1620 }
1621
1656 - if (BOOTSTRAPPER_RESTART_UNKNOWN == pCommand->restart)
1657 - {
1658 - pCommand->restart = BOOTSTRAPPER_RESTART_PROMPT;
1659 - }
1660 -
1622 LExit:
1623 if (fInvalidCommandLine)
1624 {
src/burn/engine/core.h
-1
@@ -210,7 +210,6 @@ HRESULT CoreRecreateCommandLine(
210 __deref_inout_z LPWSTR* psczCommandLine,
211 __in BOOTSTRAPPER_ACTION action,
212 __in BOOTSTRAPPER_DISPLAY display,
213 - __in BOOTSTRAPPER_RESTART restart,
213 __in BOOTSTRAPPER_RELATION_TYPE relationType,
214 __in BOOL fPassthrough,
215 __in_z_opt LPCWSTR wzActiveParent,
src/burn/engine/externalengine.cpp
+1 -1
@@ -295,7 +295,7 @@ HRESULT ExternalEngineSetUpdate(
295 {
296 UpdateUninitialize(&pEngineState->update);
297
298 - hr = CoreRecreateCommandLine(&sczCommandline, BOOTSTRAPPER_ACTION_INSTALL, pEngineState->command.display, pEngineState->command.restart, BOOTSTRAPPER_RELATION_NONE, FALSE, pEngineState->registration.sczActiveParent, pEngineState->registration.sczAncestors, NULL, pEngineState->command.wzCommandLine);
298 + hr = CoreRecreateCommandLine(&sczCommandline, BOOTSTRAPPER_ACTION_INSTALL, pEngineState->command.display, BOOTSTRAPPER_RELATION_NONE, FALSE, pEngineState->registration.sczActiveParent, pEngineState->registration.sczAncestors, NULL, pEngineState->command.wzCommandLine);
299 ExitOnFailure(hr, "Failed to recreate command-line for update bundle.");
300
301 // Bundles would fail to use the downloaded update bundle, as the running bundle would be one of the search paths.
src/burn/engine/plan.cpp
+1 -1
@@ -1783,7 +1783,7 @@ extern "C" HRESULT PlanSetResumeCommand(
1783 HRESULT hr = S_OK;
1784
1785 // build the resume command-line.
1786 - hr = CoreRecreateCommandLine(&pRegistration->sczResumeCommandLine, action, pCommand->display, pCommand->restart, pCommand->relationType, pCommand->fPassthrough, pRegistration->sczActiveParent, pRegistration->sczAncestors, pLog->sczPath, pCommand->wzCommandLine);
1786 + hr = CoreRecreateCommandLine(&pRegistration->sczResumeCommandLine, action, pCommand->display, pCommand->relationType, pCommand->fPassthrough, pRegistration->sczActiveParent, pRegistration->sczAncestors, pLog->sczPath, pCommand->wzCommandLine);
1787 ExitOnFailure(hr, "Failed to recreate resume command-line.");
1788
1789 LExit:
src/burn/engine/pseudobundle.cpp
+1 -1
@@ -205,7 +205,7 @@ extern "C" HRESULT PseudoBundleInitializePassthrough(
205
206 // No matter the operation, we're passing the same command-line. That's what makes
207 // this a passthrough bundle.
208 - hr = CoreRecreateCommandLine(&sczArguments, pCommand->action, pCommand->display, pCommand->restart, pCommand->relationType, TRUE, wzActiveParent, wzAncestors, wzAppendLogPath, pCommand->wzCommandLine);
208 + hr = CoreRecreateCommandLine(&sczArguments, pCommand->action, pCommand->display, pCommand->relationType, TRUE, wzActiveParent, wzAncestors, wzAppendLogPath, pCommand->wzCommandLine);
209 ExitOnFailure(hr, "Failed to recreate command-line arguments.");
210
211 hr = StrAllocString(&pPassthroughPackage->Exe.sczInstallArguments, sczArguments, 0);
src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp
+72 -55
@@ -206,7 +206,7 @@ public: // IBootstrapperApplication
206 m_hUiThread = ::CreateThread(NULL, 0, UiThreadProc, this, 0, &dwUIThreadId);
207 if (!m_hUiThread)
208 {
209 - ExitWithLastError(hr, "Failed to create UI thread.");
209 + BalExitWithLastError(hr, "Failed to create UI thread.");
210 }
211
212 LExit:
@@ -1100,10 +1100,10 @@ public: // IBootstrapperApplication
1100 m_fRestartRequired = BOOTSTRAPPER_APPLY_RESTART_NONE != restart;
1101 BalSetStringVariable(WIXSTDBA_VARIABLE_RESTART_REQUIRED, m_fRestartRequired ? L"1" : NULL, FALSE);
1102
1103 - m_fShouldRestart = m_fRestartRequired && BOOTSTRAPPER_RESTART_NEVER < m_command.restart;
1103 + m_fShouldRestart = m_fRestartRequired && BAL_INFO_RESTART_NEVER < m_BalInfoCommand.restart;
1104
1105 // Automatically restart if we're not displaying a UI or the command line said to always allow restarts.
1106 - m_fAllowRestart = m_fShouldRestart && (BOOTSTRAPPER_DISPLAY_FULL > m_command.display || BOOTSTRAPPER_RESTART_PROMPT < m_command.restart);
1106 + m_fAllowRestart = m_fShouldRestart && (BOOTSTRAPPER_DISPLAY_FULL > m_command.display || BAL_INFO_RESTART_PROMPT < m_BalInfoCommand.restart);
1107
1108 if (m_fPrereq)
1109 {
@@ -1986,6 +1986,62 @@ private: // privates
1986 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEPAYLOADEXTRACTPROGRESS, pArgs, pResults, m_pvBAFunctionsProcContext);
1987 }
1988
1989 +
1990 +public: //CBalBaseBootstrapperApplication
1991 + virtual STDMETHODIMP Initialize(
1992 + __in const BOOTSTRAPPER_CREATE_ARGS* pCreateArgs
1993 + )
1994 + {
1995 + HRESULT hr = S_OK;
1996 + LONGLONG llInstalled = 0;
1997 +
1998 + hr = __super::Initialize(pCreateArgs);
1999 + BalExitOnFailure(hr, "CBalBaseBootstrapperApplication initialization failed.");
2000 +
2001 + memcpy_s(&m_command, sizeof(m_command), pCreateArgs->pCommand, sizeof(BOOTSTRAPPER_COMMAND));
2002 + memcpy_s(&m_createArgs, sizeof(m_createArgs), pCreateArgs, sizeof(BOOTSTRAPPER_CREATE_ARGS));
2003 + m_createArgs.pCommand = &m_command;
2004 +
2005 + if (m_fPrereq)
2006 + {
2007 + // Pre-req BA should only show help or do an install (to launch the Managed BA which can then do the right action).
2008 + if (BOOTSTRAPPER_ACTION_HELP != m_command.action)
2009 + {
2010 + m_command.action = BOOTSTRAPPER_ACTION_INSTALL;
2011 + }
2012 + }
2013 + else // maybe modify the action state if the bundle is or is not already installed.
2014 + {
2015 + hr = BalGetNumericVariable(L"WixBundleInstalled", &llInstalled);
2016 + if (SUCCEEDED(hr) && BOOTSTRAPPER_RESUME_TYPE_REBOOT != m_command.resumeType && llInstalled && BOOTSTRAPPER_ACTION_INSTALL == m_command.action)
2017 + {
2018 + m_command.action = BOOTSTRAPPER_ACTION_MODIFY;
2019 + }
2020 + else if (!llInstalled && (BOOTSTRAPPER_ACTION_MODIFY == m_command.action || BOOTSTRAPPER_ACTION_REPAIR == m_command.action))
2021 + {
2022 + m_command.action = BOOTSTRAPPER_ACTION_INSTALL;
2023 + }
2024 + }
2025 +
2026 + // When resuming from restart doing some install-like operation, try to find the package that forced the
2027 + // restart. We'll use this information during planning.
2028 + if (BOOTSTRAPPER_RESUME_TYPE_REBOOT == m_command.resumeType && BOOTSTRAPPER_ACTION_UNINSTALL < m_command.action)
2029 + {
2030 + // Ensure the forced restart package variable is null when it is an empty string.
2031 + hr = BalGetStringVariable(L"WixBundleForcedRestartPackage", &m_sczAfterForcedRestartPackage);
2032 + if (FAILED(hr) || !m_sczAfterForcedRestartPackage || !*m_sczAfterForcedRestartPackage)
2033 + {
2034 + ReleaseNullStr(m_sczAfterForcedRestartPackage);
2035 + }
2036 + }
2037 +
2038 + hr = S_OK;
2039 +
2040 + LExit:
2041 + return hr;
2042 + }
2043 +
2044 +private:
2045 //
2046 // UiThreadProc - entrypoint for UI thread.
2047 //
@@ -2172,9 +2228,6 @@ private: // privates
2228 LPWSTR* argv = NULL;
2229 BOOL fUnknownArg = FALSE;
2230
2175 - hr = BalInfoParseCommandLine(&m_BalInfoCommand, m_command.wzCommandLine);
2176 - BalExitOnFailure(hr, "Failed to parse command line with balutil.");
2177 -
2231 argc = m_BalInfoCommand.cUnknownArgs;
2232 argv = m_BalInfoCommand.rgUnknownArgs;
2233
@@ -3139,7 +3192,7 @@ private: // privates
3192 BOOL fLaunchTargetExists = FALSE;
3193 if (m_fShouldRestart)
3194 {
3142 - if (BOOTSTRAPPER_RESTART_PROMPT == m_command.restart)
3195 + if (BAL_INFO_RESTART_PROMPT == m_BalInfoCommand.restart)
3196 {
3197 fEnableRestartButton = TRUE;
3198 }
@@ -3240,7 +3293,7 @@ private: // privates
3293
3294 if (m_fShouldRestart)
3295 {
3243 - if (BOOTSTRAPPER_RESTART_PROMPT == m_command.restart)
3296 + if (BAL_INFO_RESTART_PROMPT == m_BalInfoCommand.restart)
3297 {
3298 fEnableRestartButton = TRUE;
3299 }
@@ -3832,57 +3885,20 @@ public:
3885 __in HMODULE hModule,
3886 __in BOOL fPrereq,
3887 __in HRESULT hrHostInitialization,
3835 - __in IBootstrapperEngine* pEngine,
3836 - __in const BOOTSTRAPPER_CREATE_ARGS* pArgs
3837 - ) : CBalBaseBootstrapperApplication(pEngine, pArgs, 3, 3000)
3888 + __in IBootstrapperEngine* pEngine
3889 + ) : CBalBaseBootstrapperApplication(pEngine, 3, 3000)
3890 {
3891 m_hModule = hModule;
3840 - memcpy_s(&m_command, sizeof(m_command), pArgs->pCommand, sizeof(BOOTSTRAPPER_COMMAND));
3841 - memcpy_s(&m_createArgs, sizeof(m_createArgs), pArgs, sizeof(BOOTSTRAPPER_CREATE_ARGS));
3842 - m_createArgs.pCommand = &m_command;
3843 -
3844 - if (fPrereq)
3845 - {
3846 - // Pre-req BA should only show help or do an install (to launch the Managed BA which can then do the right action).
3847 - if (BOOTSTRAPPER_ACTION_HELP != m_command.action)
3848 - {
3849 - m_command.action = BOOTSTRAPPER_ACTION_INSTALL;
3850 - }
3851 - }
3852 - else // maybe modify the action state if the bundle is or is not already installed.
3853 - {
3854 - LONGLONG llInstalled = 0;
3855 - HRESULT hr = BalGetNumericVariable(L"WixBundleInstalled", &llInstalled);
3856 - if (SUCCEEDED(hr) && BOOTSTRAPPER_RESUME_TYPE_REBOOT != m_command.resumeType && 0 < llInstalled && BOOTSTRAPPER_ACTION_INSTALL == m_command.action)
3857 - {
3858 - m_command.action = BOOTSTRAPPER_ACTION_MODIFY;
3859 - }
3860 - else if (0 == llInstalled && (BOOTSTRAPPER_ACTION_MODIFY == m_command.action || BOOTSTRAPPER_ACTION_REPAIR == m_command.action))
3861 - {
3862 - m_command.action = BOOTSTRAPPER_ACTION_INSTALL;
3863 - }
3864 - }
3892 + m_command = { };
3893 + m_createArgs = { };
3894
3895 m_plannedAction = BOOTSTRAPPER_ACTION_UNKNOWN;
3896
3868 - // When resuming from restart doing some install-like operation, try to find the package that forced the
3869 - // restart. We'll use this information during planning.
3897 m_sczAfterForcedRestartPackage = NULL;
3898
3872 - if (BOOTSTRAPPER_RESUME_TYPE_REBOOT == m_command.resumeType && BOOTSTRAPPER_ACTION_UNINSTALL < m_command.action)
3873 - {
3874 - // Ensure the forced restart package variable is null when it is an empty string.
3875 - HRESULT hr = BalGetStringVariable(L"WixBundleForcedRestartPackage", &m_sczAfterForcedRestartPackage);
3876 - if (FAILED(hr) || !m_sczAfterForcedRestartPackage || !*m_sczAfterForcedRestartPackage)
3877 - {
3878 - ReleaseNullStr(m_sczAfterForcedRestartPackage);
3879 - }
3880 - }
3881 -
3899 m_pWixLoc = NULL;
3883 - memset(&m_Bundle, 0, sizeof(m_Bundle));
3884 - memset(&m_BalInfoCommand, 0, sizeof(m_BalInfoCommand));
3885 - memset(&m_Conditions, 0, sizeof(m_Conditions));
3900 + m_Bundle = { };
3901 + m_Conditions = { };
3902 m_sczConfirmCloseMessage = NULL;
3903 m_sczFailedMessage = NULL;
3904
@@ -3947,7 +3963,6 @@ public:
3963 ReleaseStr(m_sczConfirmCloseMessage);
3964 BalConditionsUninitialize(&m_Conditions);
3965 BalInfoUninitialize(&m_Bundle);
3950 - BalInfoUninitializeCommandLine(&m_BalInfoCommand);
3966 LocFree(m_pWixLoc);
3967
3968 ReleaseStr(m_sczLanguage);
@@ -3980,7 +3995,6 @@ private:
3995
3996 WIX_LOCALIZATION* m_pWixLoc;
3997 BAL_INFO_BUNDLE m_Bundle;
3983 - BAL_INFO_COMMAND m_BalInfoCommand;
3998 BAL_CONDITIONS m_Conditions;
3999 LPWSTR m_sczFailedMessage;
4000 LPWSTR m_sczConfirmCloseMessage;
@@ -4049,8 +4063,11 @@ HRESULT CreateBootstrapperApplication(
4063 BalExitOnFailure(hr = E_INVALIDARG, "Engine requested Unknown display type.");
4064 }
4065
4052 - pApplication = new CWixStandardBootstrapperApplication(hModule, fPrereq, hrHostInitialization, pEngine, pArgs);
4053 - ExitOnNull(pApplication, hr, E_OUTOFMEMORY, "Failed to create new standard bootstrapper application object.");
4066 + pApplication = new CWixStandardBootstrapperApplication(hModule, fPrereq, hrHostInitialization, pEngine);
4067 + BalExitOnNull(pApplication, hr, E_OUTOFMEMORY, "Failed to create new standard bootstrapper application object.");
4068 +
4069 + hr = pApplication->Initialize(pArgs);
4070 + ExitOnFailure(hr, "CWixStandardBootstrapperApplication initialization failed.");
4071
4072 pResults->pfnBootstrapperApplicationProc = BalBaseBootstrapperApplicationProc;
4073 pResults->pvBootstrapperApplicationProcContext = pApplication;
src/ext/Util/be/UtilBundleExtension.cpp
+2 -2
@@ -27,7 +27,7 @@ public: //CBextBaseBundleExtension
27 IXMLDOMDocument* pixdManifest = NULL;
28 IXMLDOMNode* pixnBundleExtension = NULL;
29
30 - hr = CBextBaseBundleExtension::Initialize(pCreateArgs);
30 + hr = __super::Initialize(pCreateArgs);
31 ExitOnFailure(hr, "CBextBaseBundleExtension initialization failed.");
32
33 hr = XmlLoadDocumentFromFile(m_sczBundleExtensionDataPath, &pixdManifest);
@@ -76,7 +76,7 @@ HRESULT UtilBundleExtensionCreate(
76 ExitOnNull(pExtension, hr, E_OUTOFMEMORY, "Failed to create new CWixUtilBundleExtension.");
77
78 hr = pExtension->Initialize(pArgs);
79 - ExitOnFailure(hr, "CWixUtilBundleExtension initialization failed");
79 + ExitOnFailure(hr, "CWixUtilBundleExtension initialization failed.");
80
81 *ppBundleExtension = pExtension;
82 pExtension = NULL;