381 lines
8.7 KiB
C++
381 lines
8.7 KiB
C++
|
// Copyright (c) 1997-2001 Microsoft Corporation
|
||
|
//
|
||
|
// File: WelcomePage.cpp
|
||
|
//
|
||
|
// Synopsis: Defines Welcome Page for the CYS
|
||
|
// Wizard
|
||
|
//
|
||
|
// History: 02/03/2001 JeffJon Created
|
||
|
|
||
|
|
||
|
#include "pch.h"
|
||
|
#include "resource.h"
|
||
|
|
||
|
#include "InstallationUnitProvider.h"
|
||
|
#include "WelcomePage.h"
|
||
|
#include "state.h"
|
||
|
#include "Dialogs.h"
|
||
|
|
||
|
static PCWSTR WELCOME_PAGE_HELP = L"cys.chm::/cys_topnode.htm";
|
||
|
|
||
|
WelcomePage::WelcomePage()
|
||
|
:
|
||
|
CYSWizardPage(
|
||
|
IDD_WELCOME_PAGE,
|
||
|
IDS_WELCOME_TITLE,
|
||
|
IDS_WELCOME_SUBTITLE,
|
||
|
WELCOME_PAGE_HELP,
|
||
|
true,
|
||
|
false)
|
||
|
{
|
||
|
LOG_CTOR(WelcomePage);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
WelcomePage::~WelcomePage()
|
||
|
{
|
||
|
LOG_DTOR(WelcomePage);
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
WelcomePage::OnInit()
|
||
|
{
|
||
|
LOG_FUNCTION(WelcomePage::OnInit);
|
||
|
|
||
|
SetLargeFont(hwnd, IDC_BIG_BOLD_TITLE);
|
||
|
|
||
|
Win::PropSheet_SetTitle(
|
||
|
Win::GetParent(hwnd),
|
||
|
0,
|
||
|
String::load(IDS_WIZARD_TITLE));
|
||
|
|
||
|
// Check to see if we are in a reboot scenario
|
||
|
|
||
|
String homeKeyValue;
|
||
|
if (State::GetInstance().GetHomeRegkey(homeKeyValue))
|
||
|
{
|
||
|
if (homeKeyValue.icompare(CYS_HOME_REGKEY_TERMINAL_SERVER_VALUE) == 0)
|
||
|
{
|
||
|
TerminalServerPostBoot();
|
||
|
}
|
||
|
else if (homeKeyValue.icompare(CYS_HOME_REGKEY_TERMINAL_SERVER_OPTIMIZED) == 0)
|
||
|
{
|
||
|
TerminalServerPostBoot(false);
|
||
|
}
|
||
|
else if (homeKeyValue.icompare(CYS_HOME_REGKEY_FIRST_SERVER_VALUE) == 0)
|
||
|
{
|
||
|
FirstServerPostBoot();
|
||
|
}
|
||
|
else if (homeKeyValue.icompare(CYS_HOME_REGKEY_DCPROMO_VALUE) == 0)
|
||
|
{
|
||
|
DCPromoPostBoot();
|
||
|
}
|
||
|
|
||
|
// Now set the home regkey back to "home" so that we won't run
|
||
|
// through these again
|
||
|
|
||
|
if (homeKeyValue.icompare(CYS_HOME_REGKEY_DEFAULT_VALUE) != 0)
|
||
|
{
|
||
|
bool result =
|
||
|
State::GetInstance().SetHomeRegkey(CYS_HOME_REGKEY_DEFAULT_VALUE);
|
||
|
|
||
|
ASSERT(result);
|
||
|
}
|
||
|
|
||
|
// Reset the must run key now that we have done the reboot stuff
|
||
|
|
||
|
bool regkeyResult = SetRegKeyValue(
|
||
|
CYS_HOME_REGKEY,
|
||
|
CYS_HOME_REGKEY_MUST_RUN,
|
||
|
CYS_HOME_RUN_KEY_DONT_RUN,
|
||
|
HKEY_LOCAL_MACHINE,
|
||
|
true);
|
||
|
ASSERT(regkeyResult);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
WelcomePage::TerminalServerPostBoot(bool installed)
|
||
|
{
|
||
|
LOG_FUNCTION(WelcomePage::TerminalServerPostBoot);
|
||
|
|
||
|
// Create the log file
|
||
|
|
||
|
String logName;
|
||
|
HANDLE logfileHandle = AppendLogFile(
|
||
|
CYS_LOGFILE_NAME,
|
||
|
logName);
|
||
|
if (logfileHandle)
|
||
|
{
|
||
|
LOG(String::format(L"New log file was created: %1", logName.c_str()));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOG(L"Unable to create the log file!!!");
|
||
|
}
|
||
|
|
||
|
// Prepare the finish dialog
|
||
|
|
||
|
FinishDialog dialog(
|
||
|
logName,
|
||
|
InstallationUnitProvider::GetInstance().GetApplicationInstallationUnit().GetFinishHelp());
|
||
|
|
||
|
if (installed)
|
||
|
{
|
||
|
if (InstallationUnitProvider::GetInstance().GetApplicationInstallationUnit().GetApplicationMode() == 1)
|
||
|
{
|
||
|
CYS_APPEND_LOG(String::load(IDS_LOG_APP_REBOOT_SUCCESS));
|
||
|
|
||
|
// Prompt the user to show help or log file
|
||
|
|
||
|
dialog.ModalExecute(hwnd);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Failed to install TS
|
||
|
|
||
|
CYS_APPEND_LOG(String::load(IDS_LOG_APP_REBOOT_FAILED));
|
||
|
|
||
|
dialog.OpenLogFile();
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Since all we did is optimize we should always be successful on reboot
|
||
|
|
||
|
dialog.ModalExecute(hwnd);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
WelcomePage::FirstServerPostBoot()
|
||
|
{
|
||
|
LOG_FUNCTION(WelcomePage::FirstServerPostBoot);
|
||
|
|
||
|
// Create the log file
|
||
|
|
||
|
String logName;
|
||
|
HANDLE logfileHandle = AppendLogFile(
|
||
|
CYS_LOGFILE_NAME,
|
||
|
logName);
|
||
|
if (logfileHandle)
|
||
|
{
|
||
|
LOG(String::format(L"New log file was created: %1", logName.c_str()));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOG(L"Unable to create the log file!!!");
|
||
|
}
|
||
|
|
||
|
// Verify the machine is a DC
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if (State::GetInstance().IsDC())
|
||
|
{
|
||
|
// Authorize the new DHCP scope
|
||
|
String dnsName = Win::GetComputerNameEx(ComputerNameDnsFullyQualified);
|
||
|
|
||
|
if (InstallationUnitProvider::GetInstance().GetDHCPInstallationUnit().AuthorizeDHCPScope(dnsName))
|
||
|
{
|
||
|
LOG(L"DHCP scope successfully authorized");
|
||
|
|
||
|
CYS_APPEND_LOG(String::load(IDS_LOG_DHCP_AUTHORIZATION_SUCCEEDED));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOG(L"DHCP scope authorization failed");
|
||
|
|
||
|
String failureMessage = String::load(IDS_LOG_DHCP_AUTHORIZATION_FAILED);
|
||
|
CYS_APPEND_LOG(failureMessage);
|
||
|
|
||
|
Win::MessageBox(
|
||
|
hwnd,
|
||
|
failureMessage,
|
||
|
String::load(IDS_WIZARD_TITLE),
|
||
|
MB_OK);
|
||
|
}
|
||
|
|
||
|
|
||
|
// Do TAPI config
|
||
|
|
||
|
if (State::GetInstance().IsFirstDC())
|
||
|
{
|
||
|
|
||
|
HRESULT hr =
|
||
|
InstallationUnitProvider::GetInstance().GetExpressInstallationUnit().DoTapiConfig(dnsName);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
LOG(L"TAPI config succeeded");
|
||
|
|
||
|
CYS_APPEND_LOG(String::load(IDS_LOG_TAPI_CONFIG_SUCCEEDED));
|
||
|
CYS_APPEND_LOG(
|
||
|
String::format(
|
||
|
String::load(IDS_LOG_TAPI_CONFIG_SUCCEEDED_FORMAT),
|
||
|
dnsName.c_str()));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOG(L"TAPI config failed");
|
||
|
|
||
|
CYS_APPEND_LOG(
|
||
|
String::format(
|
||
|
String::load(IDS_LOG_TAPI_CONFIG_FAILED_FORMAT),
|
||
|
hr));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Show dialog that lets the user open help or the log file
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOG(L"DCPromo failed on reboot");
|
||
|
|
||
|
CYS_APPEND_LOG(String::load(IDS_LOG_DCPROMO_REBOOT_FAILED));
|
||
|
break;
|
||
|
}
|
||
|
} while (false);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
WelcomePage::DCPromoPostBoot()
|
||
|
{
|
||
|
LOG_FUNCTION(WelcomePage::DCPromoPostBoot);
|
||
|
|
||
|
// Create the log file
|
||
|
|
||
|
String logName;
|
||
|
HANDLE logfileHandle = AppendLogFile(
|
||
|
CYS_LOGFILE_NAME,
|
||
|
logName);
|
||
|
if (logfileHandle)
|
||
|
{
|
||
|
LOG(String::format(L"New log file was created: %1", logName.c_str()));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOG(L"Unable to create the log file!!!");
|
||
|
ASSERT(false);
|
||
|
}
|
||
|
|
||
|
// Prepare the finish dialog
|
||
|
|
||
|
FinishDialog dialog(
|
||
|
logName,
|
||
|
InstallationUnitProvider::GetInstance().GetADInstallationUnit().GetFinishHelp());
|
||
|
|
||
|
|
||
|
CYS_APPEND_LOG(String::load(IDS_LOG_DOMAIN_CONTROLLER_HEADING));
|
||
|
CYS_APPEND_LOG(String::load(IDS_LOG_DOMAIN_CONTROLLER_INSTALL));
|
||
|
|
||
|
if (State::GetInstance().IsDC())
|
||
|
{
|
||
|
CYS_APPEND_LOG(String::load(IDS_LOG_DOMAIN_CONTROLLER_SUCCESS));
|
||
|
|
||
|
// Show the log/help dialog
|
||
|
|
||
|
dialog.ModalExecute(hwnd);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CYS_APPEND_LOG(String::load(IDS_LOG_DOMAIN_CONTROLLER_FAILED));
|
||
|
|
||
|
// just open the log
|
||
|
|
||
|
dialog.OpenLogFile();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
WelcomePage::OnSetActive()
|
||
|
{
|
||
|
LOG_FUNCTION(WelcomePage::OnSetActive);
|
||
|
|
||
|
// Only Next and Cancel are available from the Welcome page
|
||
|
|
||
|
Win::PropSheet_SetWizButtons(Win::GetParent(hwnd), PSWIZB_NEXT);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
int
|
||
|
WelcomePage::Validate()
|
||
|
{
|
||
|
LOG_FUNCTION(WelcomePage::Validate);
|
||
|
|
||
|
// For now, just initialize the state object and then
|
||
|
// go directly to the custom server page. Eventually
|
||
|
// we will figure out what we want express path to do
|
||
|
// and then we will have to delay retrieving machine
|
||
|
// info and go to the BeforeBeginPage.
|
||
|
|
||
|
// Gather the machine network and role information
|
||
|
|
||
|
State& state = State::GetInstance();
|
||
|
|
||
|
if (!state.HasStateBeenRetrieved())
|
||
|
{
|
||
|
if (!state.RetrieveMachineConfigurationInformation(hwnd))
|
||
|
{
|
||
|
ASSERT(false);
|
||
|
LOG(L"The machine configuration could not be retrieved.");
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int nextPage = IDD_CUSTOM_SERVER_PAGE;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if (state.GetNICCount() != 1)
|
||
|
{
|
||
|
LOG(String::format(
|
||
|
L"GetNICCount() = %1!d!",
|
||
|
state.GetNICCount()));
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (state.IsDC())
|
||
|
{
|
||
|
LOG(L"Computer is DC");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (InstallationUnitProvider::GetInstance().GetDNSInstallationUnit().IsServiceInstalled())
|
||
|
{
|
||
|
LOG(L"Computer is DNS server");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (InstallationUnitProvider::GetInstance().GetDHCPInstallationUnit().IsServiceInstalled())
|
||
|
{
|
||
|
LOG(L"Computer is DHCP server");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (state.IsDHCPServerAvailable())
|
||
|
{
|
||
|
LOG(L"DHCP server found on the network");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
nextPage = IDD_DECISION_PAGE;
|
||
|
|
||
|
} while (false);
|
||
|
|
||
|
LOG(String::format(
|
||
|
L"nextPage = %1!d!",
|
||
|
nextPage));
|
||
|
|
||
|
return nextPage;
|
||
|
|
||
|
}
|
||
|
|
||
|
|