in Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp [262:436]
void OnCommand(CONTROL_ID id) {
LPWSTR defaultDir = nullptr;
LPWSTR targetDir = nullptr;
LONGLONG elevated, crtInstalled, installAllUsers;
BOOL checked, launcherChecked;
WCHAR wzPath[MAX_PATH] = { };
BROWSEINFOW browseInfo = { };
PIDLIST_ABSOLUTE pidl = nullptr;
DWORD pageId;
HRESULT hr = S_OK;
switch(id) {
case ID_CLOSE_BUTTON:
OnClickCloseButton();
break;
// Install commands
case ID_INSTALL_SIMPLE_BUTTON: __fallthrough;
case ID_INSTALL_UPGRADE_BUTTON: __fallthrough;
case ID_INSTALL_BUTTON:
SavePageSettings();
hr = BalGetNumericVariable(L"InstallAllUsers", &installAllUsers);
ExitOnFailure(hr, L"Failed to get install scope");
hr = _engine->SetVariableNumeric(L"CompileAll", installAllUsers);
ExitOnFailure(hr, L"Failed to update CompileAll");
hr = EnsureTargetDir();
ExitOnFailure(hr, L"Failed to set TargetDir");
OnPlan(BOOTSTRAPPER_ACTION_INSTALL);
break;
case ID_CUSTOM1_BACK_BUTTON:
SavePageSettings();
if (_modifying) {
GoToPage(PAGE_MODIFY);
} else if (_upgrading) {
GoToPage(PAGE_UPGRADE);
} else {
GoToPage(PAGE_INSTALL);
}
break;
case ID_INSTALL_CUSTOM_BUTTON: __fallthrough;
case ID_INSTALL_UPGRADE_CUSTOM_BUTTON: __fallthrough;
case ID_CUSTOM2_BACK_BUTTON:
SavePageSettings();
GoToPage(PAGE_CUSTOM1);
break;
case ID_CUSTOM_NEXT_BUTTON:
SavePageSettings();
GoToPage(PAGE_CUSTOM2);
break;
case ID_CUSTOM_INSTALL_BUTTON:
SavePageSettings();
hr = EnsureTargetDir();
ExitOnFailure(hr, L"Failed to set TargetDir");
hr = BalGetStringVariable(L"TargetDir", &targetDir);
if (SUCCEEDED(hr)) {
// TODO: Check whether directory exists and contains another installation
ReleaseStr(targetDir);
}
OnPlan(_command.action);
break;
case ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX:
checked = ThemeIsControlChecked(_theme, ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX);
_engine->SetVariableNumeric(L"InstallLauncherAllUsers", checked);
ThemeControlElevates(_theme, ID_INSTALL_BUTTON, WillElevate());
break;
case ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX:
checked = ThemeIsControlChecked(_theme, ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX);
_engine->SetVariableNumeric(L"InstallLauncherAllUsers", checked);
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, WillElevate());
break;
case ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX:
checked = ThemeIsControlChecked(_theme, ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX);
_engine->SetVariableNumeric(L"InstallAllUsers", checked);
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, WillElevate());
ThemeControlEnable(_theme, ID_CUSTOM_BROWSE_BUTTON_LABEL, !checked);
if (checked) {
_engine->SetVariableNumeric(L"CompileAll", 1);
ThemeSendControlMessage(_theme, ID_CUSTOM_COMPILE_ALL_CHECKBOX, BM_SETCHECK, BST_CHECKED, 0);
}
ThemeGetTextControl(_theme, ID_TARGETDIR_EDITBOX, &targetDir);
if (targetDir) {
// Check the current value against the default to see
// if we should switch it automatically.
hr = BalGetStringVariable(
checked ? L"DefaultJustForMeTargetDir" : L"DefaultAllUsersTargetDir",
&defaultDir
);
if (SUCCEEDED(hr) && defaultDir) {
LPWSTR formatted = nullptr;
if (defaultDir[0] && SUCCEEDED(BalFormatString(defaultDir, &formatted))) {
if (wcscmp(formatted, targetDir) == 0) {
ReleaseStr(defaultDir);
defaultDir = nullptr;
ReleaseStr(formatted);
formatted = nullptr;
hr = BalGetStringVariable(
checked ? L"DefaultAllUsersTargetDir" : L"DefaultJustForMeTargetDir",
&defaultDir
);
if (SUCCEEDED(hr) && defaultDir && defaultDir[0] && SUCCEEDED(BalFormatString(defaultDir, &formatted))) {
ThemeSetTextControl(_theme, ID_TARGETDIR_EDITBOX, formatted);
ReleaseStr(formatted);
}
} else {
ReleaseStr(formatted);
}
}
ReleaseStr(defaultDir);
}
}
break;
case ID_CUSTOM_BROWSE_BUTTON:
browseInfo.hwndOwner = _hWnd;
browseInfo.pszDisplayName = wzPath;
browseInfo.lpszTitle = _theme->sczCaption;
browseInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI;
pidl = ::SHBrowseForFolderW(&browseInfo);
if (pidl && ::SHGetPathFromIDListW(pidl, wzPath)) {
ThemeSetTextControl(_theme, ID_TARGETDIR_EDITBOX, wzPath);
}
if (pidl) {
::CoTaskMemFree(pidl);
}
break;
// Modify commands
case ID_MODIFY_BUTTON:
// Some variables cannot be modified
_engine->SetVariableString(L"InstallAllUsersState", L"disable");
_engine->SetVariableString(L"InstallLauncherAllUsersState", L"disable");
_engine->SetVariableString(L"TargetDirState", L"disable");
_engine->SetVariableString(L"CustomBrowseButtonState", L"disable");
_modifying = TRUE;
GoToPage(PAGE_CUSTOM1);
break;
case ID_REPAIR_BUTTON:
OnPlan(BOOTSTRAPPER_ACTION_REPAIR);
break;
case ID_UNINSTALL_BUTTON:
OnPlan(BOOTSTRAPPER_ACTION_UNINSTALL);
break;
case ID_SUCCESS_MAX_PATH_BUTTON:
EnableMaxPathSupport();
ThemeControlEnable(_theme, ID_SUCCESS_MAX_PATH_BUTTON, FALSE);
break;
}
LExit:
return;
}