|
|
/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1999 **/ /**********************************************************************/
/*
srvlatpp.cpp Brings up the property page for the server node FILE HISTORY: */
#include "stdafx.h"
#include "winssnap.h"
#include "shlobj.h"
#include "srvlatpp.h"
#include "server.h"
#include "service.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
#define MAX_HOURS 23
#define MAX_MINUTES 59
#define MAX_SECONDS 59
/////////////////////////////////////////////////////////////////////////////
// CServerPropGeneral property page
IMPLEMENT_DYNCREATE(CServerPropGeneral, CPropertyPageBase)
CServerPropGeneral::CServerPropGeneral() : CPropertyPageBase(CServerPropGeneral::IDD) { //{{AFX_DATA_INIT(CServerPropGeneral)
m_fBackupDB = FALSE; m_fEnableAutoRefresh = FALSE; m_strBackupPath = _T(""); m_nRefreshHours = 0; m_nRefreshMinutes = 0; m_nRefreshSeconds = 0; //}}AFX_DATA_INIT
m_fUpdateConfig = FALSE; }
CServerPropGeneral::~CServerPropGeneral() { }
void CServerPropGeneral::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CServerPropGeneral)
DDX_Control(pDX, IDC_EDIT_REFRESH_MINUTES2, m_editRefreshMn); DDX_Control(pDX, IDC_EDIT_REFRESH_HOURS2, m_editRefreshHr); DDX_Control(pDX, IDC_EDIT_REFRESH_SECONDS2, m_editRefreshSc); DDX_Control(pDX, IDC_SPIN_REFRESH_SECONDS2, m_spinRefreshSc); DDX_Control(pDX, IDC_SPIN_REFRESH_MINUTES2, m_spinRefreshmn); DDX_Control(pDX, IDC_SPIN_REFRESH_HOURS2, m_spinRefreshHr); DDX_Control(pDX, IDC_EDIT_BACKUPPATH, m_editBackupPath); DDX_Control(pDX, IDC_CHECK_BACKUPDB, m_check_BackupOnTermination); DDX_Control(pDX, IDC_CHECK_ENABLE_AUTOREFRESH, m_check_EnableAutoRefresh); DDX_Control(pDX, IDC_BUTTON_BROWSE, m_button_Browse); DDX_Check(pDX, IDC_CHECK_BACKUPDB, m_fBackupDB); DDX_Check(pDX, IDC_CHECK_ENABLE_AUTOREFRESH, m_fEnableAutoRefresh); DDX_Text(pDX, IDC_EDIT_BACKUPPATH, m_strBackupPath); DDX_Text(pDX, IDC_EDIT_REFRESH_HOURS2, m_nRefreshHours); DDV_MinMaxInt(pDX, m_nRefreshHours, 0, MAX_HOURS); DDX_Text(pDX, IDC_EDIT_REFRESH_MINUTES2, m_nRefreshMinutes); DDV_MinMaxInt(pDX, m_nRefreshMinutes, 0, MAX_MINUTES); DDX_Text(pDX, IDC_EDIT_REFRESH_SECONDS2, m_nRefreshSeconds); DDV_MinMaxInt(pDX, m_nRefreshSeconds, 0, MAX_SECONDS); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CServerPropGeneral, CPropertyPageBase) //{{AFX_MSG_MAP(CServerPropGeneral)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse) ON_BN_CLICKED(IDC_CHECK_ENABLE_AUTOREFRESH, OnCheckEnableAutorefresh) ON_EN_CHANGE(IDC_EDIT_BACKUPPATH, OnChangeEditBackuppath) ON_EN_CHANGE(IDC_EDIT_REFRESH_HOURS2, OnChangeRefresh) ON_EN_CHANGE(IDC_EDIT_REFRESH_MINUTES2, OnChangeRefresh) ON_EN_CHANGE(IDC_EDIT_REFRESH_SECONDS2, OnChangeRefresh) ON_BN_CLICKED(IDC_CHECK_BACKUPDB, OnChangeCheckBackupdb) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CServerPropGeneral message handlers
BOOL CServerPropGeneral::OnApply() { HRESULT hr = UpdateServerConfiguration(); if (FAILED(hr)) { return FALSE; } else { m_fUpdateConfig = FALSE;
return CPropertyPageBase::OnApply(); } }
void CServerPropGeneral::OnOK() { HRESULT hr = UpdateServerConfiguration(); if (SUCCEEDED(hr)) { CPropertyPageBase::OnOK(); } }
BOOL CServerPropGeneral::OnInitDialog() { CPropertyPageBase::OnInitDialog(); GetConfig();
m_fBackupDB = m_pConfig->m_fBackupOnTermination;
// get the server
SPITFSNode spNode; CWinsServerHandler *pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode);
SetRefreshData();
if (pServer->m_dwFlags & FLAG_AUTO_REFRESH) { m_fEnableAutoRefresh = TRUE; m_check_EnableAutoRefresh.SetCheck(1); } else { m_fEnableAutoRefresh = FALSE; m_check_EnableAutoRefresh.SetCheck(0);
// diable the controls
m_spinRefreshHr.EnableWindow(FALSE); m_spinRefreshmn.EnableWindow(FALSE); m_spinRefreshSc.EnableWindow(FALSE); m_editRefreshHr.EnableWindow(FALSE); m_editRefreshMn.EnableWindow(FALSE); m_editRefreshSc.EnableWindow(FALSE); }
m_spinRefreshHr.SetRange(0, 23); m_spinRefreshmn.SetRange(0, 59); m_spinRefreshSc.SetRange(0, 59);
// browse only available on local machine
m_button_Browse.EnableWindow(IsLocalConnection());
m_check_BackupOnTermination.SetCheck(m_pConfig->m_fBackupOnTermination);
m_editBackupPath.SetWindowText(m_pConfig->m_strBackupPath);
// load the correct icon
for (int i = 0; i < ICON_IDX_MAX; i++) { if (g_uIconMap[i][1] == m_uImage) { HICON hIcon = LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(g_uIconMap[i][0])); if (hIcon) ((CStatic *) GetDlgItem(IDC_STATIC_ICON))->SetIcon(hIcon); break; } } m_fUpdateConfig = FALSE;
SetDirty(FALSE);
return TRUE; }
void CServerPropGeneral::OnChangeEditBackuppath() { m_fUpdateConfig = TRUE; SetDirty(TRUE); }
void CServerPropGeneral::OnChangeRefresh() { SetDirty(TRUE); }
void CServerPropGeneral::OnChangeCheckBackupdb() { m_fUpdateConfig = TRUE;
SetDirty(TRUE); }
/*---------------------------------------------------------------------------
CServerPropGeneral::IsLocalConnection() Checks if the local machine is being monitored ---------------------------------------------------------------------------*/ BOOL CServerPropGeneral::IsLocalConnection() { // get the server
SPITFSNode spNode; CWinsServerHandler *pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode);
return pServer->IsLocalConnection(); }
void CServerPropGeneral::OnButtonBrowse() { TCHAR szBuffer[MAX_PATH];
LPITEMIDLIST pidlPrograms = NULL; //CSIDL_DRIVES
SHGetSpecialFolderLocation(m_hWnd, CSIDL_DRIVES, &pidlPrograms);
BROWSEINFO browseInfo; browseInfo.hwndOwner = m_hWnd; browseInfo.pidlRoot = pidlPrograms; browseInfo.pszDisplayName = szBuffer; CString strSel; strSel.LoadString(IDS_SELECT_FOLDER);
browseInfo.lpszTitle = strSel; browseInfo.ulFlags = BIF_NEWDIALOGSTYLE | BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS ; browseInfo.lpfn = NULL; browseInfo.lParam = 0; LPITEMIDLIST pidlBrowse = SHBrowseForFolder(&browseInfo);
if (pidlBrowse) { SHGetPathFromIDList(pidlBrowse, szBuffer);
CString strBackupPath(szBuffer);
// check if it's a network drive, if yes, don't allow.
/* int nPos = strBackupPath.Find(_T("\\"));
if (nPos != -1) { CString strDrive = strBackupPath.Left(nPos);
UINT uType = GetDriveType(strDrive);
if(uType == DRIVE_REMOTE) { // tell the user that the files ccanot be backed up the location chosen
CString strBackup; AfxFormatString1(strBackup, IDS_BACKUP_LOCATION, strBackupPath); AfxMessageBox(strBackup, MB_OK | MB_ICONINFORMATION); return; } } */ if (!strBackupPath.IsEmpty()) m_editBackupPath.SetWindowText(strBackupPath); } }
/*---------------------------------------------------------------------------
CServerPropGeneral::UpdateServerConfiguration() Updates the variables in the Server Handler ---------------------------------------------------------------------------*/ HRESULT CServerPropGeneral::UpdateServerConfiguration() { UpdateData();
// Reflect the changes in the server's CConfiguration object
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// get the server
SPITFSNode spNode; CWinsServerHandler *pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode);
// update config displays any necessary error dialogs
if (!UpdateConfig()) return E_FAIL;
DWORD err = ERROR_SUCCESS;
// now write to server
if (m_fUpdateConfig) { err = m_pConfig->Store(); if (err != ERROR_SUCCESS) { // something bad happened
WinsMessageBox(err); } else { // success update our local copy
pServer->SetConfig(*m_pConfig); } }
return HRESULT_FROM_WIN32(err); }
/*---------------------------------------------------------------------------
CServerPropGeneral::UpdateConfig() Updates the Config object in the server handler ---------------------------------------------------------------------------*/ BOOL CServerPropGeneral::UpdateConfig() { // get the server
SPITFSNode spNode; CWinsServerHandler *pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode); CString strTemp; m_editBackupPath.GetWindowText(strTemp);
// backup path needs to be non-null when backup on termination is set
if (m_fBackupDB && strTemp.IsEmpty()) { CThemeContextActivator themeActivator; AfxMessageBox(IDS_SPECIFY_DEFAULT_BACKUP_PATH); return FALSE; }
if (m_fUpdateConfig) { m_pConfig->m_strBackupPath = strTemp; m_pConfig->m_fBackupOnTermination = m_fBackupDB; }
pServer->m_dwRefreshInterval = CalculateRefrInt(); if (m_fEnableAutoRefresh) { pServer->m_dwFlags |= FLAG_AUTO_REFRESH; } else { pServer->m_dwFlags &= ~FLAG_AUTO_REFRESH; }
// since these settins are stored in the console file, mark it as dirty
SPITFSNode spRootNode; spNode->GetParent(&spRootNode); spRootNode->SetData(TFS_DATA_DIRTY, TRUE);
return TRUE; }
/*---------------------------------------------------------------------------
CServerPropGeneral::CalculateRefrInt() Rteurns the refresh interval in seconds ---------------------------------------------------------------------------*/ int CServerPropGeneral::CalculateRefrInt() { UpdateData(); CString strValue;
// get the server
SPITFSNode spNode; CWinsServerHandler *pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode);
int nHour = m_spinRefreshHr.GetPos(); int nMinute = m_spinRefreshmn.GetPos(); int nSecond = m_spinRefreshSc.GetPos();
int nRenewInterval = nHour * SEC_PER_HOUR + nMinute * SEC_PER_MINUTE + nSecond;
pServer->m_dwRefreshInterval = nRenewInterval; pServer->m_dlgStats.ReInitRefresherThread();
return nRenewInterval; }
/*---------------------------------------------------------------------------
CServerPropGeneral::ToString(int nNumber) Returns string value of an integer ---------------------------------------------------------------------------*/ CString CServerPropGeneral::ToString(int nNumber) { TCHAR szStr[20]; _itot(nNumber, szStr, 10); CString str(szStr); return str; }
/*---------------------------------------------------------------------------
CServerPropGeneral::SetRefreshData() Sets the variables' dtata for the refresh group. ---------------------------------------------------------------------------*/ void CServerPropGeneral::SetRefreshData() { // get the server
SPITFSNode spNode; CWinsServerHandler *pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode); DWORD dwInterval = pServer->m_dwRefreshInterval;
m_spinRefreshmn.SetRange(0, MAX_MINUTES); m_spinRefreshSc.SetRange(0, MAX_SECONDS); m_spinRefreshHr.SetRange(0, UD_MAXVAL);
int nHours, nMinutes, nSeconds;
nHours = dwInterval / SEC_PER_HOUR; dwInterval -= nHours * SEC_PER_HOUR;
nMinutes = dwInterval / SEC_PER_MINUTE; dwInterval -= nMinutes * SEC_PER_MINUTE;
nSeconds = dwInterval ;
// convert them to strings
CString strHr = ToString(nHours); CString strMn = ToString(nMinutes); CString strSc = ToString(nSeconds); m_spinRefreshHr.SetPos(nHours); m_spinRefreshmn.SetPos(nMinutes); m_spinRefreshSc.SetPos(nSeconds); }
/*---------------------------------------------------------------------------
CServerPropGeneral::GetConfig() Gets the Configuration object from the server ---------------------------------------------------------------------------*/ HRESULT CServerPropGeneral::GetConfig() { AFX_MANAGE_STATE(AfxGetStaticModuleState());
HRESULT hr = hrOK;
m_pConfig = ((CServerProperties *) GetHolder())->GetConfig();
return hr; }
void CServerPropGeneral::OnCheckEnableAutorefresh() { SetDirty(TRUE);
UpdateData(); if (m_check_EnableAutoRefresh.GetCheck() == 1) { m_fEnableAutoRefresh = TRUE; m_spinRefreshHr.EnableWindow(TRUE); m_spinRefreshmn.EnableWindow(TRUE); m_spinRefreshSc.EnableWindow(TRUE); m_editRefreshHr.EnableWindow(TRUE); m_editRefreshMn.EnableWindow(TRUE); m_editRefreshSc.EnableWindow(TRUE); } else { m_fEnableAutoRefresh = FALSE; m_spinRefreshHr.EnableWindow(FALSE); m_spinRefreshmn.EnableWindow(FALSE); m_spinRefreshSc.EnableWindow(FALSE); m_editRefreshHr.EnableWindow(FALSE); m_editRefreshMn.EnableWindow(FALSE); m_editRefreshSc.EnableWindow(FALSE); }
// mark the snap-in as dirty, so as to prompt the user
// mark the snap-in as dirty
SPITFSNode spNode ; spNode = GetHolder()->GetNode(); SPITFSNodeMgr spNodeManager; SPITFSNode spRootNode;
spNode->GetNodeMgr(&spNodeManager); spNodeManager->GetRootNode(&spRootNode);
// mark the data as dirty so that we'll ask the user to save.
spRootNode->SetData(TFS_DATA_DIRTY, TRUE); }
/////////////////////////////////////////////////////////////////////////////
// CServerPropDBRecord property page
IMPLEMENT_DYNCREATE(CServerPropDBRecord, CPropertyPageBase)
CServerPropDBRecord::CServerPropDBRecord() : CPropertyPageBase(CServerPropDBRecord::IDD) { //{{AFX_DATA_INIT(CServerPropDBRecord)
m_nExtintDay = 0; m_nExtIntHour = 0; m_nExtIntMinute = 0; m_nExtTmDay = 0; m_nExtTmHour = 0; m_nExtTmMinute = 0; m_nRenewDay = 0; m_nrenewMinute = 0; m_nRenewMinute = 0; m_nVerifyDay = 0; m_nVerifyHour = 0; m_nVerifyMinute = 0; //}}AFX_DATA_INIT
}
CServerPropDBRecord::~CServerPropDBRecord() { }
void CServerPropDBRecord::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CServerPropDBRecord)
DDX_Control(pDX, IDC_EDIT_EXTINCT_INT_MINUTE, m_editExtIntMinute); DDX_Control(pDX, IDC_SPIN_VERIFY_INT_MINUTE, m_spinVerifyMinute); DDX_Control(pDX, IDC_SPIN_VERIFY_INT_HOUR, m_spinVerifyHour); DDX_Control(pDX, IDC_SPIN_VERIFY_INT_DAY, m_spinVerifyDay); DDX_Control(pDX, IDC_SPIN_RENEW_INT_MINUTE, m_spinRefrIntMinute); DDX_Control(pDX, IDC_SPIN_RENEW_INT_HOUR, m_spinRefrIntHour); DDX_Control(pDX, IDC_SPIN_RENEW_INT_DAY, m_spinRefrIntDay); DDX_Control(pDX, IDC_SPIN_EXTINCT_TM_MINUTE, m_spinExtTmMinute); DDX_Control(pDX, IDC_SPIN_EXTINCT_TM_HOUR, m_spinExtTmHour); DDX_Control(pDX, IDC_SPIN_EXTINCT_TM_DAY, m_spinExtTmDay); DDX_Control(pDX, IDC_SPIN_EXTINCT_INT_MINUTE, m_spinExtIntMinute); DDX_Control(pDX, IDC_SPIN_EXTINCT_INT_HOUR, m_spinExtIntHour); DDX_Control(pDX, IDC_SPIN_EXTINCT_INT_DAY, m_spinExtIntDay); DDX_Control(pDX, IDC_EDIT_VERIFY_MINUTE, m_editVerifyMinute); DDX_Control(pDX, IDC_EDIT_VERIFY_HOUR, m_editVerifyHour); DDX_Control(pDX, IDC_EDIT_VERIFY_DAY, m_editVerifyDay); DDX_Control(pDX, IDC_EDIT_RENEW_MINUTE, m_editRefrIntMinute); DDX_Control(pDX, IDC_EDIT_RENEW_HOUR, m_editRefrIntHour); DDX_Control(pDX, IDC_EDIT_RENEW_DAY, m_editRefrIntDay); DDX_Control(pDX, IDC_EDIT_EXTINCT_TIMEOUT_HOUR, m_editExtTmHour); DDX_Control(pDX, IDC_EDIT_EXTINCT_TIMEOUT_MINUTE, m_editExtTmMinute); DDX_Control(pDX, IDC_EDIT_EXTINCT_TIMEOUT_DAY, m_editExtTmDay); DDX_Control(pDX, IDC_EDIT_EXTINCT_INT_HOUR, m_editExtIntHour); DDX_Control(pDX, IDC_EDIT_EXTINCT_INT_DAY, m_editExtIntDay); DDX_Text(pDX, IDC_EDIT_EXTINCT_INT_DAY, m_nExtintDay); DDV_MinMaxInt(pDX, m_nExtintDay, 0, 365); DDX_Text(pDX, IDC_EDIT_EXTINCT_INT_HOUR, m_nExtIntHour); DDV_MinMaxInt(pDX, m_nExtIntHour, 0, MAX_HOURS); DDX_Text(pDX, IDC_EDIT_EXTINCT_INT_MINUTE, m_nExtIntMinute); DDV_MinMaxInt(pDX, m_nExtIntMinute, 0, MAX_MINUTES); DDX_Text(pDX, IDC_EDIT_EXTINCT_TIMEOUT_DAY, m_nExtTmDay); DDV_MinMaxInt(pDX, m_nExtTmDay, 0, 365); DDX_Text(pDX, IDC_EDIT_EXTINCT_TIMEOUT_HOUR, m_nExtTmHour); DDV_MinMaxInt(pDX, m_nExtTmHour, 0, MAX_HOURS); DDX_Text(pDX, IDC_EDIT_EXTINCT_TIMEOUT_MINUTE, m_nExtTmMinute); DDV_MinMaxInt(pDX, m_nExtTmMinute, 0, MAX_MINUTES); DDX_Text(pDX, IDC_EDIT_RENEW_DAY, m_nRenewDay); DDV_MinMaxInt(pDX, m_nRenewDay, 0, 365); DDX_Text(pDX, IDC_EDIT_RENEW_HOUR, m_nrenewMinute); DDV_MinMaxInt(pDX, m_nrenewMinute, 0, MAX_HOURS); DDX_Text(pDX, IDC_EDIT_RENEW_MINUTE, m_nRenewMinute); DDV_MinMaxInt(pDX, m_nRenewMinute, 0, MAX_MINUTES); DDX_Text(pDX, IDC_EDIT_VERIFY_DAY, m_nVerifyDay); DDV_MinMaxInt(pDX, m_nVerifyDay, 0, 365); DDX_Text(pDX, IDC_EDIT_VERIFY_HOUR, m_nVerifyHour); DDV_MinMaxInt(pDX, m_nVerifyHour, 0, MAX_HOURS); DDX_Text(pDX, IDC_EDIT_VERIFY_MINUTE, m_nVerifyMinute); DDV_MinMaxInt(pDX, m_nVerifyMinute, 0, MAX_MINUTES); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CServerPropDBRecord, CPropertyPageBase) //{{AFX_MSG_MAP(CServerPropDBRecord)
ON_BN_CLICKED(IDC_BUTTON_SET_DEFAULT, OnButtonSetDefault) ON_EN_CHANGE(IDC_EDIT_EXTINCT_INT_DAY, OnChangeEditExtinctIntHour) ON_EN_CHANGE(IDC_EDIT_EXTINCT_INT_HOUR, OnChangeEditExtinctIntHour) ON_EN_CHANGE(IDC_EDIT_EXTINCT_INT_MINUTE, OnChangeEditExtinctIntHour) ON_EN_CHANGE(IDC_EDIT_EXTINCT_TIMEOUT_DAY, OnChangeEditExtinctIntHour) ON_EN_CHANGE(IDC_EDIT_EXTINCT_TIMEOUT_HOUR, OnChangeEditExtinctIntHour) ON_EN_CHANGE(IDC_EDIT_EXTINCT_TIMEOUT_MINUTE, OnChangeEditExtinctIntHour) ON_EN_CHANGE(IDC_EDIT_RENEW_DAY, OnChangeEditExtinctIntHour) ON_EN_CHANGE(IDC_EDIT_RENEW_HOUR, OnChangeEditExtinctIntHour) ON_EN_CHANGE(IDC_EDIT_RENEW_MINUTE, OnChangeEditExtinctIntHour) ON_EN_CHANGE(IDC_EDIT_VERIFY_DAY, OnChangeEditExtinctIntHour) ON_EN_CHANGE(IDC_EDIT_VERIFY_HOUR, OnChangeEditExtinctIntHour) ON_EN_CHANGE(IDC_EDIT_VERIFY_MINUTE, OnChangeEditExtinctIntHour) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CServerPropDBRecord message handlers
BOOL CServerPropDBRecord::OnInitDialog() { CPropertyPageBase::OnInitDialog();
// get the server
SPITFSNode spNode; CWinsServerHandler *pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode); // get the interval stuff from the server and display in the spinner controlss
HRESULT hr = GetConfig(); DWORD m_dwRefreshInterval = m_pConfig->m_dwRefreshInterval;
m_spinRefrIntHour.SetRange(0, MAX_HOURS); m_spinRefrIntMinute.SetRange(0, MAX_MINUTES); m_spinRefrIntDay.SetRange(0, UD_MAXVAL);
int nDays = 0, nHours = 0, nMinutes = 0;
nDays = m_dwRefreshInterval /86400;// SEC_PER_DAY;
m_dwRefreshInterval -= (nDays * SEC_PER_DAY);
if (m_dwRefreshInterval) { nHours = m_dwRefreshInterval / SEC_PER_HOUR;
m_dwRefreshInterval -= (nHours * SEC_PER_HOUR); if(m_dwRefreshInterval) { nMinutes = m_dwRefreshInterval / SEC_PER_MINUTE; m_dwRefreshInterval -= (nMinutes * SEC_PER_MINUTE); } }
m_spinRefrIntDay.SetPos(nDays); m_spinRefrIntHour.SetPos(nHours); m_spinRefrIntMinute.SetPos(nMinutes);
SetVerifyData(); SetExtTimeData(); SetExtIntData();
SetDirty(FALSE); return TRUE; }
BOOL CServerPropDBRecord::OnApply() { if (!CheckValues()) { return FALSE; }
HRESULT hr = UpdateServerConfiguration(); if (FAILED(hr)) { return FALSE; } else { return CPropertyPageBase::OnApply(); } }
void CServerPropDBRecord::OnOK() { HRESULT hr = UpdateServerConfiguration(); if (FAILED(hr)) { return; } else { CPropertyPageBase::OnOK(); } }
/*---------------------------------------------------------------------------
CServerPropDBRecord::CalculateRenewInt() Returns the Renew interval in seconds ---------------------------------------------------------------------------*/ DWORD CServerPropDBRecord::CalculateRenewInt() { UpdateData();
int nDay = m_spinRefrIntDay.GetPos(); int nHour = m_spinRefrIntHour.GetPos(); int nMinute = m_spinRefrIntMinute.GetPos();
int nRenewInterval = nDay * SEC_PER_DAY + nHour * SEC_PER_HOUR + nMinute * SEC_PER_MINUTE;
return nRenewInterval; }
/*---------------------------------------------------------------------------
CServerPropDBRecord::CalculateExtInt() Returns the Extinction interval in seconds ---------------------------------------------------------------------------*/ DWORD CServerPropDBRecord::CalculateExtInt() { UpdateData();
int nDay = m_spinExtIntDay.GetPos(); int nHour = m_spinExtIntHour.GetPos(); int nMinute = m_spinExtIntMinute.GetPos();
int nExtInterval = nDay * SEC_PER_DAY + nHour * SEC_PER_HOUR + nMinute * SEC_PER_MINUTE;
return nExtInterval; }
/*---------------------------------------------------------------------------
CServerPropDBRecord::CalculateExtTm() Returns the Extinction timeout interval in seconds ---------------------------------------------------------------------------*/ DWORD CServerPropDBRecord::CalculateExtTm() { UpdateData();
int nDay = m_spinExtTmDay.GetPos(); int nHour = m_spinExtTmHour.GetPos(); int nMinute = m_spinExtTmMinute.GetPos();
int nExtTm = nDay * SEC_PER_DAY + nHour * SEC_PER_HOUR + nMinute * SEC_PER_MINUTE;
return nExtTm; }
/*----------------------------------------------------------------------------
CServerPropDBRecord::CalculateVerifyInt() Returns the Verify interval in seconds ---------------------------------------------------------------------------*/ DWORD CServerPropDBRecord::CalculateVerifyInt() { UpdateData();
int nDay = m_spinVerifyDay.GetPos(); int nHour = m_spinVerifyHour.GetPos(); int nMinute = m_spinVerifyMinute.GetPos();
int nVerifyInt = nDay * SEC_PER_DAY + nHour * SEC_PER_HOUR + nMinute * SEC_PER_MINUTE;
return nVerifyInt; }
/*---------------------------------------------------------------------------
CServerPropDBRecord::UpdateServerConfiguration() Updates the server handler variables ---------------------------------------------------------------------------*/ HRESULT CServerPropDBRecord::UpdateServerConfiguration() { UpdateData();
// Reflect the changes in the server's CConfiguration object
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// get the server
SPITFSNode spNode; CWinsServerHandler *pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode);
m_pConfig->m_dwRefreshInterval = CalculateRenewInt(); m_pConfig->m_dwTombstoneInterval = CalculateExtInt(); m_pConfig->m_dwTombstoneTimeout = CalculateExtTm(); m_pConfig->m_dwVerifyInterval = CalculateVerifyInt();
// now write to server
DWORD err = m_pConfig->Store(); if (err != ERROR_SUCCESS) { // something bad happened
WinsMessageBox(err); } else { // success update our local copy
pServer->SetConfig(*m_pConfig); }
return HRESULT_FROM_WIN32(err); }
void CServerPropDBRecord::OnButtonSetDefault() { SetDefaultRenewInt(); SetDefaultExtInt(); SetDefaultExtTm(); SetDefaultVerifyInt(); }
//
// note, these defaults come from winscnf.c in the wins server code.
// if that code changes, these function will need to change as well.
//
/*---------------------------------------------------------------------------
CServerPropDBRecord::SetDefaultRenewInt() Sets the defalut values for the Renew interval ---------------------------------------------------------------------------*/ void CServerPropDBRecord::SetDefaultRenewInt() { int nValue = WINSCNF_DEF_REFRESH_INTERVAL;
int nDays = 0, nHours = 0, nMinutes = 0;
CalcDaysHoursMinutes(nValue, nDays, nHours, nMinutes);
m_spinRefrIntDay.SetPos(nDays); m_spinRefrIntHour.SetPos(nHours); m_spinRefrIntMinute.SetPos(nMinutes); }
/*---------------------------------------------------------------------------
CServerPropDBRecord::SetDefaultExtInt() Sets the defalut values for the Extinction interval ---------------------------------------------------------------------------*/ void CServerPropDBRecord::SetDefaultExtInt() { int nValue = WINSCNF_MAKE_TOMB_INTVL_M(WINSCNF_DEF_REFRESH_INTERVAL, 0);
int nDays = 0, nHours = 0, nMinutes = 0;
CalcDaysHoursMinutes(nValue, nDays, nHours, nMinutes);
m_spinExtIntDay.SetPos(nDays); m_spinExtIntHour.SetPos(nHours); m_spinExtIntMinute.SetPos(nMinutes); }
/*---------------------------------------------------------------------------
CServerPropDBRecord::SetDefaultExtTm() Sets the defalut values for the Extinction timeout interval ---------------------------------------------------------------------------*/ void CServerPropDBRecord::SetDefaultExtTm() { int nValue = WINSCNF_DEF_REFRESH_INTERVAL;
int nDays = 0, nHours = 0, nMinutes = 0;
CalcDaysHoursMinutes(nValue, nDays, nHours, nMinutes);
m_spinExtTmDay.SetPos(nDays); m_spinExtTmHour.SetPos(nHours); m_spinExtTmMinute.SetPos(nMinutes); }
/*---------------------------------------------------------------------------
CServerPropDBRecord::SetDefaultExtTm() Sets the defalut values for the verify interval ---------------------------------------------------------------------------*/ void CServerPropDBRecord::SetDefaultVerifyInt() { int nValue = WINSCNF_MAKE_VERIFY_INTVL_M(WINSCNF_MAKE_TOMB_INTVL_M(WINSCNF_DEF_REFRESH_INTERVAL, 0));
int nDays = 0, nHours = 0, nMinutes = 0;
CalcDaysHoursMinutes(nValue, nDays, nHours, nMinutes);
m_spinVerifyDay.SetPos(nDays); m_spinVerifyHour.SetPos(nHours); m_spinVerifyMinute.SetPos(nMinutes); }
void CServerPropDBRecord::CalcDaysHoursMinutes(int nValue, int & nDays, int & nHours, int & nMinutes) { nDays = 0; nHours = 0; nMinutes = 0;
nDays = nValue / SEC_PER_DAY; // 86400;
nValue -= (nDays * SEC_PER_DAY);
if (nValue) { nHours = nValue / SEC_PER_HOUR;
nValue -= (nHours * SEC_PER_HOUR); if (nValue) { nMinutes = nValue / SEC_PER_MINUTE; nValue -= (nMinutes * SEC_PER_MINUTE); } } }
/*---------------------------------------------------------------------------
CServerPropDBRecord::GetConfig() Updates the configuration object from the server handler ---------------------------------------------------------------------------*/ HRESULT CServerPropDBRecord::GetConfig() { AFX_MANAGE_STATE(AfxGetStaticModuleState());
HRESULT hr = hrOK;
m_pConfig = ((CServerProperties *) GetHolder())->GetConfig();
return hr; }
/*---------------------------------------------------------------------------
CServerPropDBRecord::SetVerifyData() Sets the controls' data for verify interval ---------------------------------------------------------------------------*/ void CServerPropDBRecord::SetVerifyData() { DWORD dwInterval = m_pConfig->m_dwVerifyInterval;
m_spinVerifyHour.SetRange(0, MAX_HOURS); m_spinVerifyMinute.SetRange(0, MAX_MINUTES); m_spinVerifyDay.SetRange(0, UD_MAXVAL);
int nDays =0, nHours =0, nMinutes =0;
if(dwInterval) { nDays = dwInterval / SEC_PER_DAY; dwInterval -= nDays * SEC_PER_DAY; if(dwInterval) { nHours = dwInterval / SEC_PER_HOUR; dwInterval -= nHours * SEC_PER_HOUR; if(dwInterval) {
nMinutes = dwInterval / SEC_PER_MINUTE; dwInterval -= nMinutes * SEC_PER_MINUTE; } } }
m_spinVerifyDay.SetPos(nDays); m_spinVerifyHour.SetPos(nHours); m_spinVerifyMinute.SetPos(nMinutes); }
/*---------------------------------------------------------------------------
CServerPropDBRecord::SetExtTimeData() Sets the controls' data for extinction timeout interval ---------------------------------------------------------------------------*/ void CServerPropDBRecord::SetExtTimeData() { DWORD dwInterval = m_pConfig->m_dwTombstoneTimeout;
m_spinExtTmHour.SetRange(0, MAX_HOURS); m_spinExtTmMinute.SetRange(0, MAX_MINUTES); m_spinExtTmDay.SetRange(0, UD_MAXVAL);
int nHours = 0, nMinutes =0, nDays =0;
if(dwInterval) { nDays = dwInterval / SEC_PER_DAY; dwInterval -= nDays * SEC_PER_DAY; if(dwInterval) { nHours = dwInterval / SEC_PER_HOUR; dwInterval -= nHours * SEC_PER_HOUR;
if(dwInterval) { nMinutes = dwInterval / SEC_PER_MINUTE; dwInterval -= nMinutes * SEC_PER_MINUTE; } } }
m_spinExtTmDay.SetPos(nDays); m_spinExtTmHour.SetPos(nHours); m_spinExtTmMinute.SetPos(nMinutes);
}
/*---------------------------------------------------------------------------
CServerPropDBRecord::SetExtData() Sets the controls' data for extinction interval ---------------------------------------------------------------------------*/ void CServerPropDBRecord::SetExtIntData() { DWORD dwInterval = m_pConfig->m_dwTombstoneInterval;
m_spinExtIntHour.SetRange(0, MAX_HOURS); m_spinExtIntMinute.SetRange(0, MAX_MINUTES); m_spinExtIntDay.SetRange(0, UD_MAXVAL);
int nHours =0, nMinutes =0, nDays =0;
if(dwInterval) { nDays = dwInterval / SEC_PER_DAY; dwInterval -= nDays * SEC_PER_DAY;
if(dwInterval) { nHours = dwInterval / SEC_PER_HOUR; dwInterval -= nHours * SEC_PER_HOUR;
if(dwInterval) { nMinutes = dwInterval / SEC_PER_MINUTE; dwInterval -= nMinutes * SEC_PER_MINUTE; } } } m_spinExtIntDay.SetPos(nDays); m_spinExtIntHour.SetPos(nHours); m_spinExtIntMinute.SetPos(nMinutes);
}
void CServerPropDBRecord::OnChangeEditExtinctIntHour() { SetDirty(TRUE); }
/*---------------------------------------------------------------------------
CServerPropDBRecord::CheckValues() checks if the values are valid NOTE: All of these checks mimic what the server does since we write directly to the registry and don't go through an API. If these every change, the error messages will need to be updated as well. Author: EricDav ---------------------------------------------------------------------------*/ BOOL CServerPropDBRecord::CheckValues() { BOOL fValid = TRUE;
UpdateData();
do { DWORD dwRenew = CalculateRenewInt(); if (dwRenew < WINSCNF_MIN_REFRESH_INTERVAL) { AfxMessageBox(IDS_ERR_RENEW_INTERVAL); fValid = FALSE; break; }
DWORD dwExtTm = CalculateExtTm();
if (dwExtTm < WINSCNF_MIN_TOMBSTONE_TIMEOUT) { // minimum value
AfxMessageBox(IDS_ERR_EXTINCTION_TIMEOUT_MIN); fValid = FALSE; break; }
if (dwExtTm < dwRenew) { // bad... must be at least this value
AfxMessageBox(IDS_ERR_EXTINCTION_TIMEOUT); fValid = FALSE; break; }
DWORD dwExtInt = CalculateExtInt(); //--ft:07/10/00--
// replaced WINSCNF_MAKE_TOMB_INTVL_M macro with its expansion..
// otherwise, the compiler with CLEAN64_BIT=1 reports an error
// since max(any_dword, 0) is always true - and the compiler is dumb enough
// to signal this as an error..
//
//if (dwExtInt < WINSCNF_MAKE_TOMB_INTVL_M(dwRenew, 0))
if (dwExtInt < min(dwRenew, FOUR_DAYS)) { // bad... must be at least that value
AfxMessageBox(IDS_ERR_EXTINCTION_INTERVAL); fValid = FALSE; break; }
DWORD dwVerifyInt = CalculateVerifyInt();
if (dwVerifyInt < WINSCNF_MAKE_VERIFY_INTVL_M(dwExtInt)) { // bad... must be at least this value
if (WINSCNF_MAKE_VERIFY_INTVL_M(dwExtInt) == TWENTY_FOUR_DAYS) { AfxMessageBox(IDS_ERR_VERIFY_INTERVAL_24_DAYS); } else { CString strTemp; strTemp.Format(IDS_ERR_VERIFY_INTERVAL_CALC, TOMB_MULTIPLIER_FOR_VERIFY); AfxMessageBox(strTemp); }
fValid = FALSE; break; } } while (FALSE);
return fValid; }
/////////////////////////////////////////////////////////////////////////////
// CServerPropDBVerification property page
IMPLEMENT_DYNCREATE(CServerPropDBVerification, CPropertyPageBase)
CServerPropDBVerification::CServerPropDBVerification() : CPropertyPageBase(CServerPropDBVerification::IDD) { //{{AFX_DATA_INIT(CServerPropDBVerification)
m_fCCPeriodic = FALSE; m_nCCCheckRandom = -1; m_nCCHour = 0; m_nCCMinute = 0; m_nCCSecond = 0; m_nCCMaxChecked = 0; m_nCCTimeInterval = 0; //}}AFX_DATA_INIT
}
CServerPropDBVerification::~CServerPropDBVerification() { }
void CServerPropDBVerification::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CServerPropDBVerification)
DDX_Control(pDX, IDC_EDIT_CC_START_SECOND, m_editCCSecond); DDX_Control(pDX, IDC_EDIT_CC_START_MINUTE, m_editCCMinute); DDX_Control(pDX, IDC_EDIT_CC_START_HOUR, m_editCCHour); DDX_Control(pDX, IDC_SPIN_CC_START_MINUTE, m_spinCCMinute); DDX_Control(pDX, IDC_EDIT_CC_INTERVAL, m_editCCInterval); DDX_Control(pDX, IDC_EDIT_CC_MAX_CHECKED, m_editCCMaxChecked); DDX_Control(pDX, IDC_RADIO_CHECK_OWNER, m_radioCheckOwner); DDX_Control(pDX, IDC_CHECK_PERIODIC_CC, m_checkEnableCC); DDX_Control(pDX, IDC_SPIN_CC_START_SECOND, m_spinCCSecond); DDX_Control(pDX, IDC_SPIN_CC_START_HOUR, m_spinCCHour); DDX_Check(pDX, IDC_CHECK_PERIODIC_CC, m_fCCPeriodic); DDX_Radio(pDX, IDC_RADIO_CHECK_OWNER, m_nCCCheckRandom); DDX_Text(pDX, IDC_EDIT_CC_START_HOUR, m_nCCHour); DDV_MinMaxInt(pDX, m_nCCHour, 0, MAX_HOURS); DDX_Text(pDX, IDC_EDIT_CC_START_MINUTE, m_nCCMinute); DDV_MinMaxInt(pDX, m_nCCMinute, 0, MAX_MINUTES); DDX_Text(pDX, IDC_EDIT_CC_START_SECOND, m_nCCSecond); DDV_MinMaxInt(pDX, m_nCCSecond, 0, MAX_SECONDS); DDX_Text(pDX, IDC_EDIT_CC_MAX_CHECKED, m_nCCMaxChecked); DDV_MinMaxUInt(pDX, m_nCCMaxChecked, WINSCNF_CC_MIN_RECS_AAT, 4294967295); DDX_Text(pDX, IDC_EDIT_CC_INTERVAL, m_nCCTimeInterval); DDV_MinMaxUInt(pDX, m_nCCTimeInterval, WINSCNF_CC_MIN_INTERVAL/(60*60), 24); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CServerPropDBVerification, CPropertyPageBase) //{{AFX_MSG_MAP(CServerPropDBVerification)
ON_BN_CLICKED(IDC_CHECK_PERIODIC_CC, OnCheckPeriodicCc) ON_EN_CHANGE(IDC_EDIT_CC_INTERVAL, OnChangeEditCcInterval) ON_EN_CHANGE(IDC_EDIT_CC_MAX_CHECKED, OnChangeEditCcMaxChecked) ON_EN_CHANGE(IDC_EDIT_CC_START_HOUR, OnChangeEditCcStartHour) ON_EN_CHANGE(IDC_EDIT_CC_START_MINUTE, OnChangeEditCcStartMinute) ON_EN_CHANGE(IDC_EDIT_CC_START_SECOND, OnChangeEditCcStartSecond) ON_BN_CLICKED(IDC_RADIO_CHECK_OWNER, OnRadioCheckOwner) ON_BN_CLICKED(IDC_RADIO_CHECK_RANDOM, OnRadioCheckRandom) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CServerPropDBVerification message handlers
BOOL CServerPropDBVerification::OnInitDialog() { CPropertyPageBase::OnInitDialog();
// get the server
SPITFSNode spNode; CWinsServerHandler *pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode); // get the interval stuff from the server and display in the spinner controlss
HRESULT hr = GetConfig(); m_spinCCHour.SetRange(0, MAX_HOURS); m_spinCCMinute.SetRange(0, MAX_MINUTES); m_spinCCSecond.SetRange(0, MAX_SECONDS); SetCCInfo(); UpdateCCControls();
SetDirty(FALSE); return TRUE; }
BOOL CServerPropDBVerification::OnApply() { HRESULT hr = UpdateServerConfiguration(); if (FAILED(hr)) { return FALSE; } else { return CPropertyPageBase::OnApply(); } }
void CServerPropDBVerification::OnOK() { HRESULT hr = UpdateServerConfiguration(); if (FAILED(hr)) { return; } else { CPropertyPageBase::OnOK(); } }
void CServerPropDBVerification::OnCheckPeriodicCc() { UpdateCCControls(); SetDirty(TRUE); }
void CServerPropDBVerification::OnChangeEditCcInterval() { SetDirty(TRUE); }
void CServerPropDBVerification::OnChangeEditCcMaxChecked() { SetDirty(TRUE); }
void CServerPropDBVerification::OnChangeEditCcStartHour() { SetDirty(TRUE); }
void CServerPropDBVerification::OnChangeEditCcStartMinute() { SetDirty(TRUE); }
void CServerPropDBVerification::OnChangeEditCcStartSecond() { SetDirty(TRUE); }
void CServerPropDBVerification::OnRadioCheckOwner() { SetDirty(TRUE); }
void CServerPropDBVerification::OnRadioCheckRandom() { SetDirty(TRUE); }
/*---------------------------------------------------------------------------
CServerPropDBVerification::UpdateServerConfiguration() Updates the server handler variables ---------------------------------------------------------------------------*/ HRESULT CServerPropDBVerification::UpdateServerConfiguration() { UpdateData();
// Reflect the changes in the server's CConfiguration object
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// get the server
SPITFSNode spNode; CWinsServerHandler *pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode);
// consistency check
m_pConfig->m_fPeriodicConsistencyCheck = m_fCCPeriodic; m_pConfig->m_fCCUseRplPnrs = m_nCCCheckRandom; m_pConfig->m_dwMaxRecsAtATime = m_nCCMaxChecked; // convert to seconds
m_pConfig->m_dwCCTimeInterval = m_nCCTimeInterval * (60*60); // start time
CTime curTime = CTime::GetCurrentTime();
int nYear = curTime.GetYear(); int nMonth = curTime.GetMonth(); int nDay = curTime.GetDay();
CTime tempTime(nYear, nMonth, nDay, m_nCCHour, m_nCCMinute, m_nCCSecond); m_pConfig->m_itmCCStartTime = tempTime;
// now write to server
DWORD err = m_pConfig->Store(); if (err != ERROR_SUCCESS) { // something bad happened
WinsMessageBox(err); } else { // success update our local copy
pServer->SetConfig(*m_pConfig); }
return HRESULT_FROM_WIN32(err); }
/*---------------------------------------------------------------------------
CServerPropDBVerification::GetConfig() Updates the configuration object from the server handler ---------------------------------------------------------------------------*/ HRESULT CServerPropDBVerification::GetConfig() { AFX_MANAGE_STATE(AfxGetStaticModuleState());
HRESULT hr = hrOK;
m_pConfig = ((CServerProperties *) GetHolder())->GetConfig();
return hr; }
/*---------------------------------------------------------------------------
CServerPropDBVerification::UpdateCCControls() Enables/disables depending on checkbox Author: EricDav ---------------------------------------------------------------------------*/ void CServerPropDBVerification::UpdateCCControls() { UpdateData(); BOOL fEnable = FALSE;
if (m_fCCPeriodic) { fEnable = TRUE; }
m_spinCCHour.EnableWindow(fEnable); m_spinCCMinute.EnableWindow(fEnable); m_spinCCSecond.EnableWindow(fEnable);
m_editCCHour.EnableWindow(fEnable); m_editCCMinute.EnableWindow(fEnable); m_editCCSecond.EnableWindow(fEnable);
m_editCCMaxChecked.EnableWindow(fEnable); m_editCCInterval.EnableWindow(fEnable); m_radioCheckOwner.EnableWindow(fEnable); GetDlgItem(IDC_RADIO_CHECK_RANDOM)->EnableWindow(fEnable);
// TODO: static text
}
/*---------------------------------------------------------------------------
CServerPropDBVerification::SetCCInfo() Sets the interval values for Consistency checking Author: EricDav ---------------------------------------------------------------------------*/ void CServerPropDBVerification::SetCCInfo() { CString strTemp; CButton * pRadio;
m_checkEnableCC.SetCheck(m_pConfig->m_fPeriodicConsistencyCheck); if (m_pConfig->m_fCCUseRplPnrs) { pRadio = (CButton *) GetDlgItem(IDC_RADIO_CHECK_RANDOM); } else { pRadio = (CButton *) GetDlgItem(IDC_RADIO_CHECK_OWNER); }
pRadio->SetCheck(TRUE);
strTemp.Format(_T("%lu"), m_pConfig->m_dwMaxRecsAtATime); m_editCCMaxChecked.SetWindowText(strTemp);
// convert the TimeInterval into hours from seconds
int nTimeTemp = m_pConfig->m_dwCCTimeInterval / (60 * 60);
strTemp.Format(_T("%lu"), nTimeTemp); m_editCCInterval.SetWindowText(strTemp); m_spinCCHour.SetPos(m_pConfig->m_itmCCStartTime.GetHour()); m_spinCCMinute.SetPos(m_pConfig->m_itmCCStartTime.GetMinute()); m_spinCCSecond.SetPos(m_pConfig->m_itmCCStartTime.GetSecond()); }
/////////////////////////////////////////////////////////////////////////////
// CServerPropAdvanced property page
IMPLEMENT_DYNCREATE(CServerPropAdvanced, CPropertyPageBase)
CServerPropAdvanced::CServerPropAdvanced() : CPropertyPageBase(CServerPropAdvanced::IDD) { //{{AFX_DATA_INIT(CServerPropAdvanced)
m_fLogEvents = FALSE; m_strStartVersion = _T(""); m_fLanNames = FALSE; m_fBurstHandling = FALSE; m_nQueSelection = -1; m_strDbPath = _T(""); //}}AFX_DATA_INIT
m_fRestart = FALSE; }
CServerPropAdvanced::~CServerPropAdvanced() { }
void CServerPropAdvanced::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CServerPropAdvanced)
DDX_Control(pDX, IDC_BUTTON_BROWSE_DATABASE, m_buttonBrowse); DDX_Control(pDX, IDC_EDIT_DATABASE_PATH, m_editDbPath); DDX_Control(pDX, IDC_CHECK_BURST_HANDLING, m_checkBurstHandling); DDX_Control(pDX, IDC_CHECK_LANNAMES, m_checkLanNames); DDX_Control(pDX, IDC_EDIT_START_VERSION, m_editVersionCount); DDX_Control(pDX, IDC_CHECK_LOGEVENTS, m_checkLogDetailedEvents); DDX_Check(pDX, IDC_CHECK_LOGEVENTS, m_fLogEvents); DDX_Text(pDX, IDC_EDIT_START_VERSION, m_strStartVersion); DDV_MaxChars(pDX, m_strStartVersion, 16); DDX_Check(pDX, IDC_CHECK_LANNAMES, m_fLanNames); DDX_Check(pDX, IDC_CHECK_BURST_HANDLING, m_fBurstHandling); DDX_Radio(pDX, IDC_RADIO_LOW, m_nQueSelection); DDX_Text(pDX, IDC_EDIT_DATABASE_PATH, m_strDbPath); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CServerPropAdvanced, CPropertyPageBase) //{{AFX_MSG_MAP(CServerPropAdvanced)
ON_BN_CLICKED(IDC_CHECK_LANNAMES, OnCheckLannames) ON_BN_CLICKED(IDC_CHECK_BURST_HANDLING, OnCheckBurstHandling) ON_BN_CLICKED(IDC_RADIO_CUSTOM, OnRadioCustom) ON_BN_CLICKED(IDC_RADIO_HIGH, OnRadioHigh) ON_BN_CLICKED(IDC_RADIO_LOW, OnRadioLow) ON_BN_CLICKED(IDC_RADIO_MEDIUM, OnRadioMedium) ON_EN_CHANGE(IDC_EDIT_CUSTOM_VALUE, OnChangeEditCustomValue) ON_BN_CLICKED(IDC_BUTTON_BROWSE_DATABASE, OnButtonBrowseDatabase) ON_BN_CLICKED(IDC_CHECK_LOGEVENTS, MarkDirty) ON_EN_CHANGE(IDC_EDIT_START_VERSION, MarkDirty) ON_EN_CHANGE(IDC_EDIT_DATABASE_PATH, OnChangeEditDatabasePath) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CServerPropAdvanced message handlers
BOOL CServerPropAdvanced::OnInitDialog() { CPropertyPageBase::OnInitDialog(); GetConfig();
// get the server
SPITFSNode spNode; CWinsServerHandler *pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode); m_fLogEvents = m_pConfig->m_fLogDetailedEvents; if (m_fLogEvents) { m_checkLogDetailedEvents.SetCheck(1); } else { m_checkLogDetailedEvents.SetCheck(0); }
if (pServer->m_dwFlags & FLAG_LANMAN_COMPATIBLE) { m_fLanNames = TRUE; m_checkLanNames.SetCheck(TRUE); } else { m_fLanNames = FALSE; m_checkLanNames.SetCheck(FALSE); }
LONG lLowWord = m_pConfig->m_dwVersCountStart_LowWord; LONG lHighWord = m_pConfig->m_dwVersCountStart_HighWord;
CString strVersion = GetVersionInfo(lLowWord, lHighWord); m_editVersionCount.SetWindowText(strVersion);
// burst que stuff
m_checkBurstHandling.SetCheck(m_pConfig->m_fBurstHandling); ((CEdit *) GetDlgItem(IDC_EDIT_CUSTOM_VALUE))->LimitText(5); SetQueSize(); UpdateBurstHandling();
// db path stuff
// browse only available on local machine
// get the server
m_buttonBrowse.ShowWindow(FALSE); // we may add this back in later
m_buttonBrowse.EnableWindow(pServer->IsLocalConnection());
m_editDbPath.EnableWindow(pServer->IsLocalConnection()); m_editDbPath.SetWindowText(m_pConfig->m_strDbPath);
SetDirty(FALSE); m_fRestart = FALSE;
return TRUE; }
void CServerPropAdvanced::OnOK() { HRESULT hr = UpdateServerConfiguration(); if (FAILED(hr)) { return; } else { CPropertyPageBase::OnOK(); } }
BOOL CServerPropAdvanced::OnApply() { BOOL fRestartNow = FALSE;
UpdateData();
// validate the value for Hex
for (int i=0; i < m_strStartVersion.GetLength(); i++) { if (!(((m_strStartVersion[i] >= _T('0') ) && (m_strStartVersion[i] <= _T('9') )) || ((m_strStartVersion[i] >= _T('A') ) && (m_strStartVersion[i] <= _T('F') )) || ((m_strStartVersion[i] >= _T('a') ) && (m_strStartVersion[i] <= _T('f') )) )) { ::WinsMessageBox(IDS_ERR_VERSION_NUMBER); m_editVersionCount.SetFocus(); m_editVersionCount.SetSel(0,-1); return FALSE; } }
DWORD dwSize = GetQueSize(); if (dwSize < WINS_QUEUE_HWM_MIN || dwSize > WINS_QUEUE_HWM_MAX) { CString strMin, strMax, strDisplay;
strMin.Format(_T("%d"), WINS_QUEUE_HWM_MIN); strMax.Format(_T("%d"), WINS_QUEUE_HWM_MAX);
AfxFormatString2(strDisplay, IDS_ERR_BURST_QUE_SIZE, strMin, strMax);
AfxMessageBox(strDisplay);
GetDlgItem(IDC_EDIT_CUSTOM_VALUE)->SetFocus(); return FALSE; }
// warn the user
if (m_fRestart) { int nRet = AfxMessageBox(IDS_DATABASE_PATH_CHANGE, MB_YESNOCANCEL); if (nRet == IDCANCEL) { return FALSE; } else if (nRet == IDYES) { fRestartNow = TRUE; } }
HRESULT hr = UpdateServerConfiguration(); if (FAILED(hr)) { return FALSE; }
if (fRestartNow) { CString strServiceName; strServiceName.LoadString(IDS_SERVICE_NAME);
// get the server
SPITFSNode spNode; CWinsServerHandler *pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode);
DWORD dwError = TFSStopServiceEx(m_pConfig->GetOwner(), _T("WINS"), _T("WINS Service"), strServiceName); if (dwError) { WinsMessageBox(dwError); } else { dwError = TFSStartServiceEx(m_pConfig->GetOwner(), _T("WINS"), _T("WINS Service"), strServiceName); if (dwError) { WinsMessageBox(dwError); } }
pServer->ConnectToWinsServer(spNode); }
m_fRestart = FALSE;
return CPropertyPageBase::OnApply(); }
/*---------------------------------------------------------------------------
CServerPropAdvanced::GetConfig() Updates the configuration object from the server handler ---------------------------------------------------------------------------*/ HRESULT CServerPropAdvanced::GetConfig() { AFX_MANAGE_STATE(AfxGetStaticModuleState());
HRESULT hr = hrOK;
m_pConfig = ((CServerProperties *) GetHolder())->GetConfig();
return hr; }
/*---------------------------------------------------------------------------
CServerPropAdvanced::UpdateServerConfiguration() Updates the variables in the server handler ---------------------------------------------------------------------------*/ HRESULT CServerPropAdvanced::UpdateServerConfiguration() { UpdateData();
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// get the server
SPITFSNode spNode; CWinsServerHandler * pServer;
spNode = GetHolder()->GetNode(); pServer = GETHANDLER(CWinsServerHandler, spNode);
// update our settings
m_pConfig->m_fLogDetailedEvents = m_fLogEvents; if (m_fLanNames) { pServer->m_dwFlags |= FLAG_LANMAN_COMPATIBLE; } else { pServer->m_dwFlags &= (~FLAG_LANMAN_COMPATIBLE); }
// version stuff
LONG lLowWord, lHighWord; FillVersionInfo(lLowWord, lHighWord);
m_pConfig->m_dwVersCountStart_HighWord = lHighWord; m_pConfig->m_dwVersCountStart_LowWord = lLowWord; // burst handling
m_pConfig->m_fBurstHandling = m_fBurstHandling; m_pConfig->m_dwBurstQueSize = GetQueSize();
// db path
if (m_fRestart) { m_pConfig->m_strDbPath = m_strDbPath; }
// now write to server
DWORD err = m_pConfig->Store(); if (err != ERROR_SUCCESS) { // something bad happened
WinsMessageBox(err); } else { // success update our local copy
pServer->SetConfig(*m_pConfig); }
return HRESULT_FROM_WIN32(err); }
/*---------------------------------------------------------------------------
CServerPropAdvanced::FillVersionInfo(LONG &lLowValue, LONG &lHighValue) fills the version info in the related controls ---------------------------------------------------------------------------*/ void CServerPropAdvanced::FillVersionInfo(LONG &lLowValue, LONG &lHighValue) { CString str ; m_editVersionCount.GetWindowText(str);
int j = str.GetLength();
if ( j > 16 || !j ) { //
// Invalid string
//
return; }
TCHAR sz[] = _T("0000000000000000"); TCHAR *pch;
::_tcscpy(sz + 16 - j, (LPCTSTR)str); pch = sz + 8; ::_stscanf(pch, _T("%08lX"),&lLowValue); *pch = '\0'; ::_stscanf(sz, _T("%08lX"),&lHighValue);
return; }
CString CServerPropAdvanced::GetVersionInfo(LONG lLowWord, LONG lHighWord) { CString strVersionCount;
TCHAR sz[20]; TCHAR *pch = sz; ::wsprintf(sz, _T("%08lX%08lX"), lHighWord, lLowWord); // Kill leading zero's
while (*pch == '0') { ++pch; } // At least one digit...
if (*pch == '\0') { --pch; }
strVersionCount = pch;
return strVersionCount;
}
void CServerPropAdvanced::OnCheckLannames() { SetDirty(TRUE);
// mark the snap-in as dirty
SPITFSNode spNode ; spNode = GetHolder()->GetNode(); SPITFSNodeMgr spNodeManager; SPITFSNode spRootNode;
spNode->GetNodeMgr(&spNodeManager); spNodeManager->GetRootNode(&spRootNode);
// mark the data as dirty so that we'll ask the user to save.
spRootNode->SetData(TFS_DATA_DIRTY, TRUE); }
void CServerPropAdvanced::MarkDirty() { SetDirty(TRUE); }
void CServerPropAdvanced::OnCheckBurstHandling() { SetDirty(TRUE); UpdateBurstHandling(); }
void CServerPropAdvanced::OnRadioCustom() { SetDirty(TRUE); EnableCustomEntry(); }
void CServerPropAdvanced::OnRadioHigh() { SetDirty(TRUE); EnableCustomEntry(); }
void CServerPropAdvanced::OnRadioLow() { SetDirty(TRUE); EnableCustomEntry(); }
void CServerPropAdvanced::OnRadioMedium() { SetDirty(TRUE); EnableCustomEntry(); }
void CServerPropAdvanced::OnChangeEditCustomValue() { SetDirty(TRUE); }
void CServerPropAdvanced::OnButtonBrowseDatabase() { // TODO: browse for a path
}
void CServerPropAdvanced::OnChangeEditDatabasePath() { SetDirty(TRUE); m_fRestart = TRUE; }
void CServerPropAdvanced::UpdateBurstHandling() { if (IsWindow(m_checkBurstHandling.GetSafeHwnd())) { EnableQueSelection(m_checkBurstHandling.GetCheck()); } }
void CServerPropAdvanced::EnableQueSelection(BOOL bEnable) { GetDlgItem(IDC_RADIO_LOW)->EnableWindow(bEnable); GetDlgItem(IDC_RADIO_MEDIUM)->EnableWindow(bEnable); GetDlgItem(IDC_RADIO_HIGH)->EnableWindow(bEnable); GetDlgItem(IDC_RADIO_CUSTOM)->EnableWindow(bEnable); GetDlgItem(IDC_EDIT_CUSTOM_VALUE)->EnableWindow(bEnable);
EnableCustomEntry(); }
void CServerPropAdvanced::EnableCustomEntry() { BOOL bEnable = ((CButton *)GetDlgItem(IDC_RADIO_CUSTOM))->GetCheck() && m_checkBurstHandling.GetSafeHwnd() && m_checkBurstHandling.GetCheck();
GetDlgItem(IDC_EDIT_CUSTOM_VALUE)->EnableWindow(bEnable); }
void CServerPropAdvanced::SetQueSize() { UINT uControlID = IDC_RADIO_CUSTOM;
switch (m_pConfig->m_dwBurstQueSize) { case BURST_QUE_SIZE_LOW: uControlID = IDC_RADIO_LOW; m_nQueSelection = 0; break;
case BURST_QUE_SIZE_MEDIUM: uControlID = IDC_RADIO_MEDIUM; m_nQueSelection = 1; break;
case BURST_QUE_SIZE_HIGH: uControlID = IDC_RADIO_HIGH; m_nQueSelection = 2; break; default: { TCHAR szBuf[10];
_itot(m_pConfig->m_dwBurstQueSize, szBuf, 10); m_nQueSelection = 3; GetDlgItem(IDC_EDIT_CUSTOM_VALUE)->SetWindowText(szBuf); } break; }
((CButton *) GetDlgItem(uControlID))->SetCheck(TRUE); }
DWORD CServerPropAdvanced::GetQueSize() { DWORD dwSize = 0;
UpdateData();
if (IsDlgButtonChecked(IDC_RADIO_LOW)) { dwSize = BURST_QUE_SIZE_LOW; } else if (IsDlgButtonChecked(IDC_RADIO_MEDIUM)) { dwSize = BURST_QUE_SIZE_MEDIUM; } else if (IsDlgButtonChecked(IDC_RADIO_HIGH)) { dwSize = BURST_QUE_SIZE_HIGH; } else { // must be custom
CString strText;
GetDlgItem(IDC_EDIT_CUSTOM_VALUE)->GetWindowText(strText); dwSize = (DWORD) _ttoi(strText); }
return dwSize; }
/////////////////////////////////////////////////////////////////////////////
//
// CServerProperties holder
//
/////////////////////////////////////////////////////////////////////////////
CServerProperties::CServerProperties ( ITFSNode * pNode, IComponentData * pComponentData, ITFSComponentData * pTFSCompData, LPCTSTR pszSheetName ) : CPropertyPageHolderBase(pNode, pComponentData, pszSheetName)
{ m_bAutoDeletePages = FALSE; // we have the pages as embedded members
m_bTheme = TRUE;
AddPageToList((CPropertyPageBase*) &m_pageGeneral); AddPageToList((CPropertyPageBase*) &m_pageDBRecord); AddPageToList((CPropertyPageBase*) &m_pageDBVerification); AddPageToList((CPropertyPageBase*) &m_pageAdvanced);
Assert(pTFSCompData != NULL); m_spTFSCompData.Set(pTFSCompData); }
CServerProperties::~CServerProperties() { RemovePageFromList((CPropertyPageBase*) &m_pageGeneral, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pageDBRecord, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pageDBVerification, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pageAdvanced, FALSE); }
|