You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
514 lines
13 KiB
514 lines
13 KiB
// Copyright (c) 2001 Microsoft Corporation
|
|
//
|
|
// File: CustomServerPage.cpp
|
|
//
|
|
// Synopsis: Defines Custom Server Page for the CYS
|
|
// Wizard
|
|
//
|
|
// History: 02/06/2001 JeffJon Created
|
|
|
|
|
|
#include "pch.h"
|
|
#include "resource.h"
|
|
|
|
#include "cys.h"
|
|
#include "InstallationUnitProvider.h"
|
|
#include "CustomServerPage.h"
|
|
#include "uiutil.h"
|
|
|
|
static PCWSTR CUSTOM_PAGE_HELP = L"cys.chm::/cys_topnode.htm";
|
|
|
|
CustomServerPage::CustomServerPage()
|
|
:
|
|
CYSWizardPage(
|
|
IDD_CUSTOM_SERVER_PAGE,
|
|
IDS_CUSTOM_SERVER_TITLE,
|
|
IDS_CUSTOM_SERVER_SUBTITLE,
|
|
CUSTOM_PAGE_HELP)
|
|
{
|
|
LOG_CTOR(CustomServerPage);
|
|
}
|
|
|
|
|
|
|
|
CustomServerPage::~CustomServerPage()
|
|
{
|
|
LOG_DTOR(CustomServerPage);
|
|
}
|
|
|
|
|
|
void
|
|
CustomServerPage::OnInit()
|
|
{
|
|
LOG_FUNCTION(CustomServerPage::OnInit);
|
|
|
|
CYSWizardPage::OnInit();
|
|
|
|
SetBoldFont(
|
|
hwnd,
|
|
IDC_ROLE_STATIC);
|
|
|
|
InitializeServerListView();
|
|
FillServerTypeList();
|
|
}
|
|
|
|
void
|
|
CustomServerPage::InitializeServerListView()
|
|
{
|
|
LOG_FUNCTION(CustomServerPage::InitializeServerListView);
|
|
|
|
// Prepare a column
|
|
|
|
HWND hwndBox = Win::GetDlgItem(hwnd, IDC_SERVER_TYPE_LIST);
|
|
|
|
RECT rect;
|
|
Win::GetClientRect(hwndBox, rect);
|
|
|
|
// Get the width of a scroll bar
|
|
|
|
// int scrollThumbWidth = ::GetSystemMetrics(SM_CXHTHUMB);
|
|
|
|
// net width of listview
|
|
|
|
int netWidth = rect.right /*- scrollThumbWidth*/ - ::GetSystemMetrics(SM_CXBORDER);
|
|
|
|
// Set full row select
|
|
|
|
Win::ListView_SetExtendedListViewStyle(
|
|
hwndBox,
|
|
LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP/* | LVS_EX_GRIDLINES*/);
|
|
|
|
// Get the size of the listview
|
|
|
|
|
|
LVCOLUMN column;
|
|
ZeroMemory(&column, sizeof(LVCOLUMN));
|
|
|
|
column.mask = LVCF_WIDTH | LVCF_TEXT;
|
|
|
|
// Use 80 percent of the width minus the scrollbar for the role and the rest for the status
|
|
|
|
column.cx = static_cast<int>(netWidth * 0.75);
|
|
|
|
String columnHeader = String::load(IDS_SERVER_ROLE_COLUMN_HEADER);
|
|
column.pszText = const_cast<wchar_t*>(columnHeader.c_str());
|
|
|
|
Win::ListView_InsertColumn(
|
|
hwndBox,
|
|
0,
|
|
column);
|
|
|
|
// Add the status column
|
|
|
|
columnHeader = String::load(IDS_STATUS_COLUMN_HEADER);
|
|
column.pszText = const_cast<wchar_t*>(columnHeader.c_str());
|
|
|
|
column.cx = netWidth - column.cx;
|
|
|
|
Win::ListView_InsertColumn(
|
|
hwndBox,
|
|
1,
|
|
column);
|
|
}
|
|
|
|
void
|
|
CustomServerPage::FillServerTypeList()
|
|
{
|
|
LOG_FUNCTION(CustomServerPage::FillServerTypeList);
|
|
|
|
// Load the status strings
|
|
|
|
String statusCompleted = String::load(IDS_STATUS_COMPLETED);
|
|
String statusNo = String::load(IDS_STATUS_NO);
|
|
|
|
// loop throught the table putting all the server
|
|
// types in the listbox
|
|
|
|
HWND hwndBox = Win::GetDlgItem(hwnd, IDC_SERVER_TYPE_LIST);
|
|
|
|
for (
|
|
size_t index = 0;
|
|
index < GetServerRoleStatusTableElementCount();
|
|
++index)
|
|
{
|
|
InstallationUnit& installationUnit =
|
|
InstallationUnitProvider::GetInstance().
|
|
GetInstallationUnitForType(serverRoleStatusTable[index].role);
|
|
|
|
InstallationStatus status =
|
|
serverRoleStatusTable[index].Status();
|
|
|
|
if (status != STATUS_NOT_AVAILABLE)
|
|
{
|
|
String serverTypeName = installationUnit.GetServiceName();
|
|
|
|
|
|
LVITEM listItem;
|
|
ZeroMemory(&listItem, sizeof(LVITEM));
|
|
|
|
listItem.iItem = (int) index;
|
|
listItem.mask = LVIF_TEXT | LVIF_PARAM;
|
|
listItem.pszText = const_cast<wchar_t*>(serverTypeName.c_str());
|
|
|
|
listItem.lParam = serverRoleStatusTable[index].role;
|
|
|
|
int newItem = Win::ListView_InsertItem(
|
|
hwndBox,
|
|
listItem);
|
|
|
|
ASSERT(newItem >= 0);
|
|
LOG(String::format(
|
|
L"New role inserted: %1 at index %2!d!",
|
|
serverTypeName.c_str(),
|
|
newItem));
|
|
|
|
// if the service is installed fill the status column
|
|
|
|
if (status == STATUS_COMPLETED ||
|
|
status == STATUS_CONFIGURED)
|
|
{
|
|
Win::ListView_SetItemText(
|
|
hwndBox,
|
|
newItem,
|
|
1,
|
|
statusCompleted);
|
|
}
|
|
else
|
|
{
|
|
Win::ListView_SetItemText(
|
|
hwndBox,
|
|
newItem,
|
|
1,
|
|
statusNo);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Set the focus of the first item so that the user can see
|
|
// the focus but don't select it
|
|
|
|
Win::ListView_SetItemState(
|
|
hwndBox,
|
|
0,
|
|
LVIS_FOCUSED,
|
|
LVIS_FOCUSED);
|
|
}
|
|
|
|
|
|
bool
|
|
CustomServerPage::OnSetActive()
|
|
{
|
|
LOG_FUNCTION(CustomServerPage::OnSetActive);
|
|
|
|
SetDescriptionForSelection();
|
|
|
|
// If log file is available then
|
|
// enable the link
|
|
|
|
if (IsLogFilePresent())
|
|
{
|
|
Win::ShowWindow(
|
|
Win::GetDlgItem(
|
|
hwnd,
|
|
IDC_LOG_STATIC),
|
|
SW_SHOW);
|
|
}
|
|
else
|
|
{
|
|
Win::ShowWindow(
|
|
Win::GetDlgItem(
|
|
hwnd,
|
|
IDC_LOG_STATIC),
|
|
SW_HIDE);
|
|
}
|
|
|
|
// If there is a selection set the Next button as
|
|
// the default with focus. If not, then give the
|
|
// list view the focus
|
|
|
|
HWND hwndBox = Win::GetDlgItem(hwnd, IDC_SERVER_TYPE_LIST);
|
|
|
|
int currentSelection = ListView_GetNextItem(hwndBox, -1, LVNI_SELECTED);
|
|
|
|
if (currentSelection >= 0)
|
|
{
|
|
Win::PostMessage(
|
|
Win::GetParent(hwnd),
|
|
WM_NEXTDLGCTL,
|
|
(WPARAM) Win::GetDlgItem(Win::GetParent(hwnd), Wizard::NEXT_BTN_ID),
|
|
TRUE);
|
|
}
|
|
else
|
|
{
|
|
Win::PostMessage(
|
|
Win::GetParent(hwnd),
|
|
WM_NEXTDLGCTL,
|
|
(WPARAM) hwndBox,
|
|
TRUE);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
InstallationUnit&
|
|
CustomServerPage::GetInstallationUnitFromSelection(int currentSelection)
|
|
{
|
|
LOG_FUNCTION(CustomServerPage::GetInstallationUnitFromSelection);
|
|
|
|
ASSERT(currentSelection >= 0);
|
|
|
|
HWND hwndBox = Win::GetDlgItem(hwnd, IDC_SERVER_TYPE_LIST);
|
|
|
|
// Now that we know the selection, find the installation type
|
|
|
|
LVITEM item;
|
|
ZeroMemory(&item, sizeof(item));
|
|
|
|
item.iItem = currentSelection;
|
|
item.mask = LVIF_PARAM;
|
|
|
|
bool result = Win::ListView_GetItem(hwndBox, item);
|
|
ASSERT(result);
|
|
|
|
LPARAM value = item.lParam;
|
|
|
|
LOG(String::format(
|
|
L"Selection = %1!d!, type = %2!d!",
|
|
currentSelection,
|
|
value));
|
|
|
|
return InstallationUnitProvider::GetInstance().GetInstallationUnitForType(
|
|
(ServerRole)value);
|
|
}
|
|
|
|
void
|
|
CustomServerPage::SetDescriptionForSelection()
|
|
{
|
|
LOG_FUNCTION(CustomServerPage::SetDescriptionForSelection);
|
|
|
|
HWND hwndDescription = Win::GetDlgItem(hwnd, IDC_TYPE_DESCRIPTION_STATIC);
|
|
HWND hwndBox = Win::GetDlgItem(hwnd, IDC_SERVER_TYPE_LIST);
|
|
|
|
int currentSelection = ListView_GetNextItem(hwndBox, -1, LVNI_SELECTED);
|
|
|
|
if (currentSelection >= 0)
|
|
{
|
|
InstallationUnit& installationUnit = GetInstallationUnitFromSelection(currentSelection);
|
|
|
|
String serverTypeName = installationUnit.GetServiceName();
|
|
Win::SetDlgItemText(hwnd, IDC_ROLE_STATIC, serverTypeName);
|
|
|
|
String serverTypeDescription = installationUnit.GetServiceDescription();
|
|
|
|
Win::SetWindowText(hwndDescription, serverTypeDescription);
|
|
Win::ShowWindow(hwndDescription, SW_SHOW);
|
|
Win::EnableWindow(hwndDescription, true);
|
|
|
|
InstallationStatus status =
|
|
installationUnit.GetStatus();
|
|
|
|
// Set the status column
|
|
|
|
if (status == STATUS_COMPLETED ||
|
|
status == STATUS_CONFIGURED)
|
|
{
|
|
String statusCompleted = String::load(IDS_STATUS_COMPLETED);
|
|
|
|
Win::ListView_SetItemText(
|
|
hwndBox,
|
|
currentSelection,
|
|
1,
|
|
statusCompleted);
|
|
}
|
|
else
|
|
{
|
|
String statusNo = String::load(IDS_STATUS_NO);
|
|
|
|
Win::ListView_SetItemText(
|
|
hwndBox,
|
|
currentSelection,
|
|
1,
|
|
statusNo);
|
|
}
|
|
|
|
Win::PropSheet_SetWizButtons(
|
|
Win::GetParent(hwnd),
|
|
PSWIZB_NEXT | PSWIZB_BACK);
|
|
}
|
|
else
|
|
{
|
|
// If no selection set the description text to blank
|
|
// For some reason the SysLink control doesn't like
|
|
// to be blank so I have to disable and hide the control
|
|
// instead of just setting a blank string
|
|
|
|
Win::EnableWindow(hwndDescription, false);
|
|
Win::ShowWindow(hwndDescription, SW_HIDE);
|
|
Win::SetDlgItemText(hwnd, IDC_ROLE_STATIC, L"");
|
|
|
|
// Set the wizard buttons
|
|
|
|
Win::PropSheet_SetWizButtons(
|
|
Win::GetParent(hwnd),
|
|
PSWIZB_BACK);
|
|
}
|
|
}
|
|
|
|
|
|
bool
|
|
CustomServerPage::OnNotify(
|
|
HWND /*windowFrom*/,
|
|
UINT_PTR controlIDFrom,
|
|
UINT code,
|
|
LPARAM lParam)
|
|
{
|
|
// LOG_FUNCTION(CustomServerPage::OnCommand);
|
|
|
|
bool result = false;
|
|
|
|
if (IDC_SERVER_TYPE_LIST == controlIDFrom &&
|
|
code == LVN_ITEMCHANGED)
|
|
{
|
|
LPNMLISTVIEW pnmv = reinterpret_cast<LPNMLISTVIEW>(lParam);
|
|
if (pnmv && pnmv->uNewState & LVNI_SELECTED)
|
|
{
|
|
SetDescriptionForSelection();
|
|
result = true;
|
|
}
|
|
else
|
|
{
|
|
// Check to see if we have something selected
|
|
// and set the state of the Next button accordingly
|
|
|
|
SetDescriptionForSelection();
|
|
SetNextButtonState();
|
|
}
|
|
}
|
|
else if (controlIDFrom == IDC_TYPE_DESCRIPTION_STATIC ||
|
|
controlIDFrom == IDC_ADD_REMOVE_STATIC)
|
|
{
|
|
switch (code)
|
|
{
|
|
case NM_CLICK:
|
|
case NM_RETURN:
|
|
{
|
|
if (controlIDFrom == IDC_TYPE_DESCRIPTION_STATIC)
|
|
{
|
|
HWND hwndBox = Win::GetDlgItem(hwnd, IDC_SERVER_TYPE_LIST);
|
|
|
|
int currentSelection = ListView_GetNextItem(hwndBox, -1, LVNI_SELECTED);
|
|
if (currentSelection >= 0)
|
|
{
|
|
InstallationUnit& installationUnit =
|
|
GetInstallationUnitFromSelection(currentSelection);
|
|
|
|
int linkIndex = LinkIndexFromNotifyLPARAM(lParam);
|
|
installationUnit.ServerRoleLinkSelected(linkIndex, hwnd);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// launch the sysocmgr
|
|
|
|
String fullPath =
|
|
String::format(
|
|
IDS_SYSOC_FULL_PATH,
|
|
Win::GetSystemDirectory().c_str());
|
|
|
|
String infPath =
|
|
Win::GetSystemWindowsDirectory() + L"\\inf\\sysoc.inf";
|
|
|
|
String commandLine =
|
|
String::format(
|
|
L"/i:%1",
|
|
infPath.c_str());
|
|
|
|
MyCreateProcess(fullPath, commandLine);
|
|
}
|
|
|
|
result = true;
|
|
}
|
|
default:
|
|
{
|
|
// do nothing
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if (controlIDFrom == IDC_LOG_STATIC)
|
|
{
|
|
switch (code)
|
|
{
|
|
case NM_CLICK:
|
|
case NM_RETURN:
|
|
{
|
|
OpenLogFile();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
void
|
|
CustomServerPage::SetNextButtonState()
|
|
{
|
|
HWND hwndBox = Win::GetDlgItem(hwnd, IDC_SERVER_TYPE_LIST);
|
|
int currentSelection = ListView_GetNextItem(hwndBox, -1, LVNI_SELECTED);
|
|
|
|
// Set the wizard buttons
|
|
|
|
Win::PropSheet_SetWizButtons(
|
|
Win::GetParent(hwnd),
|
|
(currentSelection < 0) ? PSWIZB_BACK : PSWIZB_NEXT | PSWIZB_BACK);
|
|
}
|
|
|
|
int
|
|
CustomServerPage::Validate()
|
|
{
|
|
LOG_FUNCTION(CustomServerPage::Validate);
|
|
|
|
HWND hwndBox = Win::GetDlgItem(hwnd, IDC_SERVER_TYPE_LIST);
|
|
|
|
int currentSelection = ListView_GetNextItem(hwndBox, -1, LVNI_SELECTED);
|
|
|
|
ASSERT(currentSelection >= 0);
|
|
|
|
// Now that we know the selection, find the installation type
|
|
|
|
LVITEM item;
|
|
ZeroMemory(&item, sizeof(item));
|
|
|
|
item.iItem = currentSelection;
|
|
item.mask = LVIF_PARAM;
|
|
|
|
bool result = Win::ListView_GetItem(hwndBox, item);
|
|
ASSERT(result);
|
|
|
|
// set the current install to the selected installation unit
|
|
|
|
InstallationUnit& currentInstallationUnit =
|
|
InstallationUnitProvider::GetInstance().SetCurrentInstallationUnit(
|
|
static_cast<ServerRole>(item.lParam));
|
|
|
|
// NTRAID#NTBUG-604592-2002/04/23-JeffJon-Key the action of the wizard
|
|
// off the installation status at this point. The InstallationProgressPage
|
|
// will call either CompletePath or UninstallService based on the value
|
|
// that is set here.
|
|
|
|
currentInstallationUnit.SetInstalling(
|
|
currentInstallationUnit.IsServiceInstalled());
|
|
|
|
int nextPage = currentInstallationUnit.GetWizardStart();
|
|
|
|
LOG(String::format(
|
|
L"nextPage = %1!d!",
|
|
nextPage));
|
|
|
|
return nextPage;
|
|
}
|