WindowsXP-SP1/admin/cys/win32/domainpage.cpp
2020-09-30 16:53:49 +02:00

218 lines
4.3 KiB
C++

// Copyright (c) 1997-2001 Microsoft Corporation
//
// File: DomainPage.cpp
//
// Synopsis: Defines the new domain name page used in the
// Express path for the CYS Wizard
//
// History: 02/08/2001 JeffJon Created
#include "pch.h"
#include "resource.h"
#include "InstallationUnitProvider.h"
#include "DomainPage.h"
#include "state.h"
static PCWSTR DOMAIN_PAGE_HELP = L"cys.chm::/cys_configuring_first_server.htm";
ADDomainPage::ADDomainPage()
:
CYSWizardPage(
IDD_AD_DOMAIN_NAME_PAGE,
IDS_AD_DOMAIN_TITLE,
IDS_AD_DOMAIN_SUBTITLE,
DOMAIN_PAGE_HELP)
{
LOG_CTOR(ADDomainPage);
}
ADDomainPage::~ADDomainPage()
{
LOG_DTOR(ADDomainPage);
}
void
ADDomainPage::OnInit()
{
LOG_FUNCTION(ADDomainPage::OnInit);
}
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
ADDomainPage::OnSetActive()
{
LOG_FUNCTION(ADDomainPage::OnSetActive);
Win::Edit_LimitText(
Win::GetDlgItem(hwnd, IDC_DOMAIN),
DNS_DOMAIN_NAME_MAX_LIMIT_DUE_TO_POLICY);
enable(hwnd);
return true;
}
bool
ADDomainPage::OnCommand(
HWND /* windowFrom */ ,
unsigned controlIDFrom,
unsigned code)
{
// LOG_FUNCTION(ForestPage::OnCommand);
switch (controlIDFrom)
{
case IDC_DOMAIN:
{
if (code == EN_CHANGE)
{
enable(hwnd);
}
break;
}
default:
{
// do nothing
break;
}
}
return false;
}
bool
ForestValidateDomainDoesNotExist(
HWND dialog,
int editResID)
{
LOG_FUNCTION(ForestValidateDomainDoesNotExist);
ASSERT(Win::IsWindow(dialog));
ASSERT(editResID > 0);
// this can take awhile.
Win::WaitCursor cursor;
String name = Win::GetTrimmedDlgItemText(dialog, editResID);
// The invoking code should verify this condition, but we will handle
// it just in case.
ASSERT(!name.empty());
bool valid = true;
String message;
do
{
if (name.empty())
{
message = String::load(IDS_MUST_ENTER_DOMAIN);
valid = false;
break;
}
if (IsDomainReachable(name))
{
message = String::format(IDS_DOMAIN_NAME_IN_USE, name.c_str());
valid = false;
break;
}
HRESULT hr = MyNetValidateName(name, ::NetSetupNonExistentDomain);
if (hr == Win32ToHresult(ERROR_DUP_NAME))
{
message = String::format(IDS_DOMAIN_NAME_IN_USE, name.c_str());
valid = false;
break;
}
if (hr == Win32ToHresult(ERROR_NETWORK_UNREACHABLE))
{
// 25968
if (
popup.MessageBox(
dialog,
String::format(
IDS_NET_NOT_REACHABLE,
name.c_str()),
MB_YESNO | MB_ICONWARNING) != IDYES)
{
message.erase();
valid = false;
HWND edit = Win::GetDlgItem(dialog, editResID);
Win::SendMessage(edit, EM_SETSEL, 0, -1);
Win::SetFocus(edit);
}
}
// otherwise the domain does not exist
}
while (0);
if (!valid && !message.empty())
{
popup.Gripe(dialog, editResID, message);
}
return valid;
}
int
ADDomainPage::Validate()
{
LOG_FUNCTION(ADDomainPage::Validate);
int nextPage = -1;
String domain = Win::GetTrimmedDlgItemText(hwnd, IDC_DOMAIN);
if (domain.empty())
{
popup.Gripe(hwnd, IDC_DOMAIN, IDS_MUST_ENTER_DOMAIN);
return -1;
}
if (
!ValidateDomainDnsNameSyntax(hwnd, IDC_DOMAIN, true)
|| !ConfirmNetbiosLookingNameIsReallyDnsName(hwnd, IDC_DOMAIN)
// do this test last, as it is expensive
|| !ForestValidateDomainDoesNotExist(hwnd, IDC_DOMAIN))
{
nextPage = -1;
}
else
{
InstallationUnitProvider::GetInstance().GetADInstallationUnit().SetNewDomainDNSName(domain);
nextPage = IDD_NETBIOS_NAME;
}
return nextPage;
}