windows-nt/Source/XPSP1/NT/admin/dcpromo/exe/treepage.cpp
2020-09-26 16:20:57 +08:00

270 lines
5.2 KiB
C++

// Copyright (C) 1997 Microsoft Corporation
//
// new tree page
//
// 1-7-98 sburns
#include "headers.hxx"
#include "page.hpp"
#include "TreePage.hpp"
#include "resource.h"
#include "state.hpp"
#include "common.hpp"
#include "dns.hpp"
TreePage::TreePage()
:
DCPromoWizardPage(
IDD_NEW_TREE,
IDS_TREE_PAGE_TITLE,
IDS_TREE_PAGE_SUBTITLE)
{
LOG_CTOR(TreePage);
}
TreePage::~TreePage()
{
LOG_DTOR(TreePage);
}
void
TreePage::OnInit()
{
LOG_FUNCTION(TreePage::OnInit);
Win::Edit_LimitText(
Win::GetDlgItem(hwnd, IDC_DOMAIN),
DNS_DOMAIN_NAME_MAX_LIMIT_DUE_TO_POLICY);
State& state = State::GetInstance();
if (state.UsingAnswerFile())
{
// this will cause IDC_DOMAIN to be marked changed, so the validation
// code will be called.
Win::SetDlgItemText(
hwnd,
IDC_DOMAIN,
state.GetAnswerFileOption(
State::OPTION_NEW_DOMAIN_NAME));
}
}
static
void
enable(HWND dialog)
{
ASSERT(Win::IsWindow(dialog));
int next =
!Win::GetTrimmedDlgItemText(dialog, IDC_DOMAIN).empty()
? PSWIZB_NEXT
: 0;
Win::PropSheet_SetWizButtons(
Win::GetParent(dialog),
PSWIZB_BACK | next);
}
bool
TreePage::OnSetActive()
{
LOG_FUNCTION(TreePage::OnSetActive);
ASSERT(State::GetInstance().GetOperation() == State::TREE);
Win::PropSheet_SetWizButtons(
Win::GetParent(hwnd),
PSWIZB_BACK);
State& state = State::GetInstance();
if (state.RunHiddenUnattended())
{
int nextPage = Validate();
if (nextPage != -1)
{
GetWizard().SetNextPageID(hwnd, nextPage);
}
else
{
state.ClearHiddenWhileUnattended();
}
}
enable(hwnd);
return true;
}
bool
TreePage::OnCommand(
HWND /* windowFrom */ ,
unsigned controlIDFrom,
unsigned code)
{
// LOG_FUNCTION(TreePage::OnCommand);
switch (controlIDFrom)
{
case IDC_DOMAIN:
{
if (code == EN_CHANGE)
{
SetChanged(controlIDFrom);
enable(hwnd);
}
break;
}
default:
{
// do nothing
break;
}
}
return false;
}
int
TreePage::Validate()
{
LOG_FUNCTION(TreePage::Validate);
String domain = Win::GetTrimmedDlgItemText(hwnd, IDC_DOMAIN);
if (domain.empty())
{
popup.Gripe(hwnd, IDC_DOMAIN, IDS_MUST_ENTER_DOMAIN);
return -1;
}
State& state = State::GetInstance();
int nextPage =
state.GetRunContext() == State::PDC_UPGRADE
? IDD_PATHS
: IDD_NETBIOS_NAME;
// SPB:251431 do validation even if this page is untouched, as upstream
// pages may have been changed in such a fashion that re-validation is
// required.
// if (!WasChanged(IDC_DOMAIN))
// {
// return nextPage;
// }
do
{
// verify that the new domain name is properly formatted and does
// not exist.
if (
!ValidateDomainDnsNameSyntax(hwnd, IDC_DOMAIN, true)
|| !ConfirmNetbiosLookingNameIsReallyDnsName(hwnd, IDC_DOMAIN)
// do this test last, as it is expensive
|| !ValidateDomainDoesNotExist(hwnd, IDC_DOMAIN) )
{
break;
}
domain = Win::GetTrimmedDlgItemText(hwnd, IDC_DOMAIN);
String conflictingDomain;
switch (state.DomainFitsInForest(domain, conflictingDomain))
{
case DnsNameCompareLeftParent:
{
// can't encompass another tree
popup.Gripe(
hwnd,
IDC_DOMAIN,
String::format(
IDS_SUPERIOR_TO_TREE,
domain.c_str(),
conflictingDomain.c_str()));
break;
}
case DnsNameCompareRightParent:
{
// should be a child domain instead
popup.Gripe(
hwnd,
IDC_DOMAIN,
String::format(
IDS_INFERIOR_TO_TREE,
domain.c_str(),
conflictingDomain.c_str()));
break;
}
case DnsNameCompareEqual:
{
// shouldn't happen, ValidateDomainDNSName call above would
// have caught it.
ASSERT(false);
popup.Gripe(
hwnd,
IDC_DOMAIN,
String::format(IDS_DOMAIN_NAME_IN_USE, domain.c_str()));
break;
}
case DnsNameCompareInvalid:
{
// shouldn't happen, ValidateDomainDNSName call above would
// have caught it.
ASSERT(false);
popup.Gripe(
hwnd,
IDC_DOMAIN,
String::format(
IDS_BAD_DNS_SYNTAX,
domain.c_str(),
Dns::MAX_LABEL_LENGTH));
break;
}
case DnsNameCompareNotEqual:
{
// valid
ClearChanges();
state.SetParentDomainDNSName(state.GetUserForestName());
state.SetNewDomainDNSName(domain);
return nextPage;
}
default:
{
ASSERT(false);
break;
}
}
}
while (0);
return -1;
}