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;