mirror of https://github.com/tongzx/nt5src
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.
351 lines
7.3 KiB
351 lines
7.3 KiB
// Copyright (C) 1997 Microsoft Corporation
|
|
//
|
|
// paths, part 2 page
|
|
//
|
|
// 1-8-97 sburns
|
|
|
|
|
|
|
|
#include "headers.hxx"
|
|
#include "page.hpp"
|
|
#include "Paths2Page.hpp"
|
|
#include "resource.h"
|
|
#include "state.hpp"
|
|
#include "common.hpp"
|
|
|
|
|
|
|
|
Paths2Page::Paths2Page()
|
|
:
|
|
DCPromoWizardPage(
|
|
IDD_PATHS2,
|
|
IDS_PATHS2_PAGE_TITLE,
|
|
IDS_PATHS2_PAGE_SUBTITLE),
|
|
touchWizButtons(true)
|
|
{
|
|
LOG_CTOR(Paths2Page);
|
|
}
|
|
|
|
|
|
|
|
Paths2Page::~Paths2Page()
|
|
{
|
|
LOG_DTOR(Paths2Page);
|
|
}
|
|
|
|
|
|
|
|
String
|
|
DetermineDefaultSysvolPath()
|
|
{
|
|
LOG_FUNCTION(DetermineDefaultSysvolPath);
|
|
|
|
// prefer windir, but if that's not ntfs 5, find one that is.
|
|
|
|
String result = Win::GetSystemWindowsDirectory();
|
|
|
|
if (FS::GetFileSystemType(result) != FS::NTFS5)
|
|
{
|
|
result = GetFirstNtfs5HardDrive();
|
|
}
|
|
else
|
|
{
|
|
result += L"\\";
|
|
}
|
|
|
|
LOG(result);
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
Paths2Page::OnInit()
|
|
{
|
|
LOG_FUNCTION(Paths2Page::OnInit);
|
|
|
|
Win::Edit_LimitText(Win::GetDlgItem(hwnd, IDC_SYSVOL), MAX_PATH);
|
|
|
|
State& state = State::GetInstance();
|
|
if (state.UsingAnswerFile())
|
|
{
|
|
Win::SetDlgItemText(
|
|
hwnd,
|
|
IDC_SYSVOL,
|
|
Win::ExpandEnvironmentStrings(
|
|
state.GetAnswerFileOption(State::OPTION_SYSVOL_PATH)));
|
|
}
|
|
|
|
String root = DetermineDefaultSysvolPath();
|
|
if (Win::GetTrimmedDlgItemText(hwnd, IDC_SYSVOL).empty())
|
|
{
|
|
Win::SetDlgItemText(
|
|
hwnd,
|
|
IDC_SYSVOL,
|
|
root + String::load(IDS_SYSVOL_SUFFIX));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void
|
|
Paths2Page::Enable()
|
|
{
|
|
// touchWizButtons is managed in the OnCommand handler for EN_KILLFOCUS.
|
|
// Turns out that if you call PropSheet_SetWizButtons while handling a kill
|
|
// focus event, you mess up the tab processing so that the focus jumps to
|
|
// the default wizard button. That's really cool -- NOT!
|
|
|
|
if (touchWizButtons)
|
|
{
|
|
int next =
|
|
!Win::GetTrimmedDlgItemText(hwnd, IDC_SYSVOL).empty()
|
|
? PSWIZB_NEXT : 0;
|
|
|
|
Win::PropSheet_SetWizButtons(Win::GetParent(hwnd), PSWIZB_BACK | next);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
Paths2Page::OnCommand(
|
|
HWND /* windowFrom */ ,
|
|
unsigned controlIdFrom,
|
|
unsigned code)
|
|
{
|
|
// LOG_FUNCTION(Paths2Page::OnCommand);
|
|
|
|
bool result = false;
|
|
|
|
switch (controlIdFrom)
|
|
{
|
|
case IDC_BROWSE:
|
|
{
|
|
if (code == BN_CLICKED)
|
|
{
|
|
String path = BrowseForFolder(hwnd, IDS_SYSVOL_BROWSE_TITLE);
|
|
if (!path.empty())
|
|
{
|
|
Win::SetDlgItemText(hwnd, IDC_SYSVOL, path);
|
|
}
|
|
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
case IDC_SYSVOL:
|
|
{
|
|
switch (code)
|
|
{
|
|
case EN_CHANGE:
|
|
{
|
|
SetChanged(controlIdFrom);
|
|
Enable();
|
|
result = true;
|
|
|
|
break;
|
|
}
|
|
case EN_KILLFOCUS:
|
|
{
|
|
// Since the normalization fully-expands relative paths, the
|
|
// full pathname may not match what the user entered. So we
|
|
// update the edit box contents to make sure they realize what
|
|
// the relative path expands to.
|
|
// NTRAID#NTBUG9-216148-2000/11/01-sburns
|
|
|
|
String text = Win::GetTrimmedDlgItemText(hwnd, controlIdFrom);
|
|
if (!text.empty())
|
|
{
|
|
// turn off setting of wizard buttons so that the call to
|
|
// Enable made by the EN_CHANGE handler (which will be
|
|
// called when we set the edit box text) will not call
|
|
// PropSheet_SetWizButtons, which will mess up the tab
|
|
// processing.
|
|
|
|
touchWizButtons = false;
|
|
Win::SetDlgItemText(
|
|
hwnd,
|
|
controlIdFrom,
|
|
FS::NormalizePath(text));
|
|
touchWizButtons = true;
|
|
}
|
|
|
|
result = true;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
// do nothing
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
// do nothing
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
Paths2Page::OnSetActive()
|
|
{
|
|
LOG_FUNCTION(Paths2Page::OnSetActive);
|
|
|
|
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();
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
// returns true if the path is valid, false if not. Pesters the user on
|
|
// validation failures.
|
|
|
|
bool
|
|
ValidateSYSVOLPath(const String& path, HWND parent, unsigned editResID)
|
|
{
|
|
LOG_FUNCTION(validateSysvolPath);
|
|
ASSERT(Win::IsWindow(parent));
|
|
ASSERT(!path.empty());
|
|
|
|
// check that the path is not the same as the database or log paths
|
|
// previously entered. 313059
|
|
|
|
State& state = State::GetInstance();
|
|
String db = state.GetDatabasePath();
|
|
if (db.icompare(path) == 0)
|
|
{
|
|
popup.Gripe(
|
|
parent,
|
|
editResID,
|
|
String::format(IDS_SYSVOL_CANT_MATCH_DB, db.c_str()));
|
|
return false;
|
|
}
|
|
|
|
String log = state.GetLogPath();
|
|
if (log.icompare(path) == 0)
|
|
{
|
|
popup.Gripe(
|
|
parent,
|
|
editResID,
|
|
String::format(IDS_SYSVOL_CANT_MATCH_LOG, log.c_str()));
|
|
return false;
|
|
}
|
|
|
|
// check that the path is not a parent folder of the database or log
|
|
// paths previously entered. 320685
|
|
|
|
if (FS::IsParentFolder(path, db))
|
|
{
|
|
popup.Gripe(
|
|
parent,
|
|
editResID,
|
|
String::format(IDS_SYSVOL_CANT_BE_DB_PARENT, db.c_str()));
|
|
return false;
|
|
}
|
|
|
|
if (FS::IsParentFolder(path, log))
|
|
{
|
|
popup.Gripe(
|
|
parent,
|
|
editResID,
|
|
String::format(IDS_SYSVOL_CANT_BE_LOG_PARENT, log.c_str()));
|
|
return false;
|
|
}
|
|
|
|
// // if replicating from media, destination sysvol folder may not be any
|
|
// // of the source paths.
|
|
//
|
|
// if (state.ReplicateFromMedia())
|
|
// {
|
|
// String p = state.GetReplicationSourcePath();
|
|
// if (p.icompare(path) == 0)
|
|
// {
|
|
// popup.Gripe(
|
|
// parent,
|
|
// editResID,
|
|
// String::format(IDS_SYSVOL_CANT_MATCH_SOURCE_PATH, p.c_str()));
|
|
// return false;
|
|
// }
|
|
// }
|
|
|
|
// if you change this, change the error message resource too.
|
|
|
|
static const unsigned SYSVOL_MIN_SPACE_MB = 100;
|
|
|
|
if (!CheckDiskSpace(path, SYSVOL_MIN_SPACE_MB))
|
|
{
|
|
popup.Gripe(
|
|
parent,
|
|
editResID,
|
|
String::format(IDS_SYSVOL_LOW_SPACE, log.c_str()));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
int
|
|
Paths2Page::Validate()
|
|
{
|
|
LOG_FUNCTION(Paths2Page::Validate);
|
|
|
|
int nextPage = -1;
|
|
String path =
|
|
FS::NormalizePath(Win::GetTrimmedDlgItemText(hwnd, IDC_SYSVOL));
|
|
if (
|
|
ValidateDcInstallPath(path, hwnd, IDC_SYSVOL, true)
|
|
&& ValidateSYSVOLPath(path, hwnd, IDC_SYSVOL) )
|
|
{
|
|
State& state = State::GetInstance();
|
|
state.SetSYSVOLPath(path);
|
|
if (state.GetOperation() == State::FOREST)
|
|
{
|
|
nextPage = IDD_NEW_SITE;
|
|
}
|
|
else
|
|
{
|
|
nextPage = IDD_PICK_SITE;
|
|
}
|
|
}
|
|
|
|
return nextPage;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|