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

302 lines
5.5 KiB
C++

// Copyright (C) 1997 Microsoft Corporation
//
// replica page
//
// 12-22-97 sburns
#include "headers.hxx"
#include "page.hpp"
#include "ReplicaPage.hpp"
#include "resource.h"
#include "ds.hpp"
#include "common.hpp"
#include "state.hpp"
#include "dns.hpp"
ReplicaPage::ReplicaPage()
:
DCPromoWizardPage(
IDD_REPLICA,
IDS_REPLICA_PAGE_TITLE,
IDS_REPLICA_PAGE_SUBTITLE)
{
LOG_CTOR(ReplicaPage);
}
ReplicaPage::~ReplicaPage()
{
LOG_DTOR(ReplicaPage);
}
void
ReplicaPage::Enable()
{
int next =
!Win::GetTrimmedDlgItemText(hwnd, IDC_DOMAIN).empty()
? PSWIZB_NEXT : 0;
Win::PropSheet_SetWizButtons(
Win::GetParent(hwnd),
PSWIZB_BACK | next);
}
bool
ReplicaPage::OnCommand(
HWND /* windowFrom */ ,
unsigned controlIDFrom,
unsigned code)
{
// LOG_FUNCTION(ReplicaPage::OnCommand);
switch (controlIDFrom)
{
case IDC_BROWSE:
{
if (code == BN_CLICKED)
{
String domain = BrowseForDomain(hwnd);
if (!domain.empty())
{
Win::SetDlgItemText(hwnd, IDC_DOMAIN, domain);
}
return true;
}
break;
}
case IDC_DOMAIN:
{
if (code == EN_CHANGE)
{
SetChanged(controlIDFrom);
Enable();
}
break;
}
default:
{
// do nothing
break;
}
}
return false;
}
void
ReplicaPage::OnInit()
{
LOG_FUNCTION(ReplicaPage::OnInit);
Win::Edit_LimitText(
Win::GetDlgItem(hwnd, IDC_DOMAIN),
DNS_DOMAIN_NAME_MAX_LIMIT_DUE_TO_POLICY);
State& state = State::GetInstance();
if (state.UsingAnswerFile())
{
// Ignore the answerfile if we got the domain name from the
// ReplicateFromMediaPage.
if (
!state.ReplicateFromMedia()
|| state.GetReplicaDomainDNSName().empty())
{
Win::SetDlgItemText(
hwnd,
IDC_DOMAIN,
state.GetAnswerFileOption(
State::OPTION_REPLICA_DOMAIN_NAME));
}
}
else
{
// default domain is that the server is joined to.
Win::SetDlgItemText(
hwnd,
IDC_DOMAIN,
state.GetComputer().GetDomainDnsName());
}
}
bool
ReplicaPage::ShouldSkipPage()
{
LOG_FUNCTION(ReplicaPage::ShouldSkipPage);
bool result = false;
State& state = State::GetInstance();
do
{
// check to see if we got the domain name from the
// ReplicateFromMediaPage. If so, then we don't need to show this
// page.
if (
state.ReplicateFromMedia()
&& !state.GetReplicaDomainDNSName().empty() )
{
// dns domain name is from the ReplicateFromMediaPage, which
// saved that name in the state instance. So put that name
// in the ui.
Win::SetDlgItemText(
hwnd,
IDC_DOMAIN,
state.GetReplicaDomainDNSName());
result = true;
break;
}
if (state.RunHiddenUnattended())
{
result = true;
break;
}
}
while (0);
LOG(result ? L"true" : L"false");
return result;
}
bool
ReplicaPage::OnSetActive()
{
LOG_FUNCTION(ReplicaPage::OnSetActive);
ASSERT(State::GetInstance().GetOperation() == State::REPLICA);
Win::PropSheet_SetWizButtons(
Win::GetParent(hwnd),
PSWIZB_BACK);
State& state = State::GetInstance();
if (ShouldSkipPage())
{
LOG(L"skipping ReplicaPage");
Wizard& wiz = GetWizard();
if (wiz.IsBacktracking())
{
// backup once again
wiz.Backtrack(hwnd);
return true;
}
int nextPage = ReplicaPage::Validate();
if (nextPage != -1)
{
wiz.SetNextPageID(hwnd, nextPage);
}
else
{
state.ClearHiddenWhileUnattended();
}
}
Enable();
return true;
}
int
ReplicaPage::Validate()
{
LOG_FUNCTION(ReplicaPage::Validate);
int nextPage = -1;
// 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
{
String domain = Win::GetTrimmedDlgItemText(hwnd, IDC_DOMAIN);
if (domain.empty())
{
popup.Gripe(hwnd, IDC_DOMAIN, IDS_MUST_ENTER_DOMAIN);
break;
}
if (!ValidateDomainDnsNameSyntax(hwnd, IDC_DOMAIN, true))
{
break;
}
// now ensure that the domain exists
String dnsName;
if (!ValidateDomainExists(hwnd, IDC_DOMAIN, dnsName))
{
break;
}
if (!dnsName.empty())
{
// the user specified the netbios name of the domain, and
// confirmed it, so use the dns domain name returned.
Win::SetDlgItemText(hwnd, IDC_DOMAIN, dnsName);
domain = dnsName;
}
State& state = State::GetInstance();
if (!state.IsDomainInForest(domain))
{
popup.Gripe(
hwnd,
IDC_DOMAIN,
String::format(
IDS_DOMAIN_NOT_IN_FOREST,
domain.c_str(),
state.GetUserForestName().c_str()));
break;
}
// valid
ClearChanges();
state.SetReplicaDomainDNSName(domain);
nextPage = IDD_PATHS;
}
while (0);
return nextPage;
}