|
|
// Copyright (C) 1997 Microsoft Corporation
//
// paths page
//
// 12-22-97 sburns
#include "headers.hxx"
#include "page.hpp"
#include "PathsPage.hpp"
#include "resource.h"
#include "state.hpp"
#include "common.hpp"
// NTRAID#NTBUG9-468577-2001/09/17-sburns
// NTRAID#NTBUG9-475838-2001/10/02-sburns
static const int DB_AND_LOG_MAX_PATH = MAX_PATH - 13 // for 8.3 named files under the path
- 18; // for worst case UNC name of the path, 'cause NTBackup is broken.
PathsPage::PathsPage() : DCPromoWizardPage( IDD_PATHS, IDS_PATHS_PAGE_TITLE, IDS_PATHS_PAGE_SUBTITLE), touchWizButtons(true) { LOG_CTOR(PathsPage); }
PathsPage::~PathsPage() { LOG_DTOR(PathsPage); }
void PathsPage::OnInit() { LOG_FUNCTION(PathsPage::OnInit);
Win::Edit_LimitText(Win::GetDlgItem(hwnd, IDC_DB), DB_AND_LOG_MAX_PATH); Win::Edit_LimitText(Win::GetDlgItem(hwnd, IDC_LOG), DB_AND_LOG_MAX_PATH);
State& state = State::GetInstance(); if (state.UsingAnswerFile()) { Win::SetDlgItemText( hwnd, IDC_DB, Win::ExpandEnvironmentStrings( state.GetAnswerFileOption(AnswerFile::OPTION_DATABASE_PATH))); Win::SetDlgItemText( hwnd, IDC_LOG, Win::ExpandEnvironmentStrings( state.GetAnswerFileOption(AnswerFile::OPTION_LOG_PATH))); }
String root = Win::GetSystemWindowsDirectory(); if (Win::GetTrimmedDlgItemText(hwnd, IDC_DB).empty()) { Win::SetDlgItemText( hwnd, IDC_DB, root + String::load(IDS_DB_SUFFIX)); } if (Win::GetTrimmedDlgItemText(hwnd, IDC_LOG).empty()) { Win::SetDlgItemText( hwnd, IDC_LOG, root + String::load(IDS_LOG_SUFFIX)); } }
void PathsPage::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_DB).empty() && !Win::GetTrimmedDlgItemText(hwnd, IDC_LOG).empty() ) ? PSWIZB_NEXT : 0;
Win::PropSheet_SetWizButtons(Win::GetParent(hwnd), PSWIZB_BACK | next); } }
bool PathsPage::OnCommand( HWND /* windowFrom */ , unsigned controlIdFrom, unsigned code) { // LOG_FUNCTION(PathsPage::OnCommand);
bool result = false; switch (controlIdFrom) { case IDC_BROWSE_DB: { if (code == BN_CLICKED) { String path = BrowseForFolder(hwnd, IDS_DB_BROWSE_TITLE); if (!path.empty()) { Win::SetDlgItemText(hwnd, IDC_DB, path); }
result = true; } break; } case IDC_BROWSE_LOG: { if (code == BN_CLICKED) { String path = BrowseForFolder(hwnd, IDS_LOG_BROWSE_TITLE); if (!path.empty()) { Win::SetDlgItemText(hwnd, IDC_LOG, path); }
result = true; } break; } case IDC_DB: case IDC_LOG: { 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 result; }
bool PathsPage::OnSetActive() { LOG_FUNCTION(PathsPage::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; }
int PathsPage::Validate() { LOG_FUNCTION(PathsPage::Validate);
State& state = State::GetInstance();
String dbPath = FS::NormalizePath(Win::GetTrimmedDlgItemText(hwnd, IDC_DB)); String logPath = FS::NormalizePath(Win::GetTrimmedDlgItemText(hwnd, IDC_LOG));
// If you change these, make sure you change the low disk space messages in
// the resource file!
static const unsigned DB_MIN_SPACE_MB = 200; static const unsigned LOG_MIN_SPACE_MB = 50;
int nextPage = -1; bool valid = false; int editId = IDC_DB; String message; do { // // if replicating from media, destination folders may not be the
// // source path.
//
// if (state.ReplicateFromMedia())
// {
// String p = state.GetReplicationSourcePath();
// if (p.icompare(dbPath) == 0)
// {
// message = String::format(IDS_DB_CANT_MATCH_SOURCE_PATH, dbPath.c_str());
// break;
// }
// }
if (ValidateDcInstallPath(dbPath, hwnd, IDC_DB, false, true, true)) { // grab the "X:\" part of the path
String dbVolume = FS::GetRootFolder(dbPath); String logVolume = FS::GetRootFolder(logPath); bool sameVolume = (dbVolume.icompare(logVolume) == 0);
if ( !CheckDiskSpace( dbVolume, DB_MIN_SPACE_MB + (sameVolume ? LOG_MIN_SPACE_MB : 0)) ) { message = String::load(IDS_LOW_SPACE_DB); break; } if (dbPath.icompare(logPath) != 0) { // the paths are different, so check the log path
editId = IDC_LOG; if ( ValidateDcInstallPath( logPath, hwnd, IDC_LOG, false, true,
// require uncompressed folder for log, too.
// NTRAID#NTBUG9-523532-2002/04/19-sburns
true)) { if (!CheckDiskSpace(logVolume, LOG_MIN_SPACE_MB)) { message = String::load(IDS_LOW_SPACE_LOG); break; }
// if (state.ReplicateFromMedia())
// {
// String p = state.GetReplicationSourcePath();
// if (p.icompare(logPath) == 0)
// {
// message =
// String::format(
// IDS_LOG_CANT_MATCH_SOURCE_PATH,
// logPath.c_str());
// break;
// }
// }
// paths differ, both are valid
valid = true; } } else { // paths are the same, and we validated dbPath already
valid = true; } } } while (0);
if (!message.empty()) { popup.Gripe(hwnd, editId, message); } if (valid) { state.SetDatabasePath(dbPath); state.SetLogPath(logPath); nextPage = IDD_PATHS2; }
return nextPage; }
|