|
|
/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1999 **/ /**********************************************************************/
/*
mscopewiz.cpp DHCP multicast scope creation dialog FILE HISTORY: */
#include "stdafx.h"
#include "server.h"
#include "mscope.h"
#include "mscopwiz.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
#define HOURS_MAX 23
#define MINUTES_MAX 59
int CMScopeWizLeaseTime::m_nDaysDefault = MSCOPE_DFAULT_LEASE_DAYS; int CMScopeWizLeaseTime::m_nHoursDefault = MSCOPE_DFAULT_LEASE_HOURS; int CMScopeWizLeaseTime::m_nMinutesDefault = MSCOPE_DFAULT_LEASE_MINUTES;
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWiz holder
//
/////////////////////////////////////////////////////////////////////////////
CMScopeWiz::CMScopeWiz ( ITFSNode * pNode, IComponentData * pComponentData, ITFSComponentData * pTFSCompData, LPCTSTR pszSheetName ) : CPropertyPageHolderBase(pNode, pComponentData, pszSheetName) { //ASSERT(pFolderNode == GetContainerNode());
m_bAutoDeletePages = FALSE; // we have the pages as embedded members
AddPageToList((CPropertyPageBase*) &m_pageWelcome); AddPageToList((CPropertyPageBase*) &m_pageName); AddPageToList((CPropertyPageBase*) &m_pageInvalidName); AddPageToList((CPropertyPageBase*) &m_pageSetRange); AddPageToList((CPropertyPageBase*) &m_pageSetExclusions); AddPageToList((CPropertyPageBase*) &m_pageLeaseTime); AddPageToList((CPropertyPageBase*) &m_pageActivate); AddPageToList((CPropertyPageBase*) &m_pageFinished);
Assert(pTFSCompData != NULL); m_spTFSCompData.Set(pTFSCompData);
m_bWiz97 = TRUE;
m_spTFSCompData->SetWatermarkInfo(&g_WatermarkInfoScope); }
CMScopeWiz::~CMScopeWiz() { RemovePageFromList((CPropertyPageBase*) &m_pageName, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pageInvalidName, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pageSetRange, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pageSetExclusions, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pageLeaseTime, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pageActivate, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pageFinished, FALSE); }
//
// Called from the OnWizardFinish to add the DHCP Server to the list
//
DWORD CMScopeWiz::OnFinish() { return CreateScope(); }
BOOL CMScopeWiz::GetScopeRange(CDhcpIpRange * pdhcpIpRange) { return m_pageSetRange.GetScopeRange(pdhcpIpRange); }
DWORD CMScopeWiz::CreateScope() { LONG err = 0, err2 ; BOOL fScopeCreated = FALSE; CString strLangTag; CDhcpMScope * pobScope = NULL ; CDhcpIpRange dhcpIpRange; CDhcpServer * pServer; SPITFSNode spNode, spServerNode;
spServerNode = GetNode(); do { m_pageSetRange.GetScopeRange(&dhcpIpRange);
pServer = GETHANDLER(CDhcpServer, spServerNode); //
// Create the scope on the server and then we can
// create our internal object.
//
DHCP_MSCOPE_INFO MScopeInfo = {0}; MScopeInfo.MScopeName = (LPWSTR) ((LPCTSTR) m_pageName.m_strName); MScopeInfo.MScopeComment = (LPWSTR) ((LPCTSTR) m_pageName.m_strComment); // scope ID is the starting address of the madcap scope
MScopeInfo.MScopeId = dhcpIpRange.QueryAddr(TRUE); MScopeInfo.MScopeAddressPolicy = 0; MScopeInfo.MScopeState = (m_pageActivate.m_fActivate) ? DhcpSubnetEnabled : DhcpSubnetDisabled; MScopeInfo.MScopeFlags = 0;
// TBD: there is a DCR to be able to set this value.
// set to infinite for now
MScopeInfo.ExpiryTime.dwLowDateTime = DHCP_DATE_TIME_INFINIT_LOW; MScopeInfo.ExpiryTime.dwHighDateTime = DHCP_DATE_TIME_INFINIT_HIGH; MScopeInfo.TTL = m_pageSetRange.GetTTL(); err = pServer->CreateMScope(&MScopeInfo); if (err != 0) { Trace1("CMScopeWiz::CreateScope() - Couldn't create scope! Error = %d\n", err); break; }
SPITFSComponentData spTFSCompData; spTFSCompData = GetTFSCompData();
pobScope = new CDhcpMScope(spTFSCompData); if ( pobScope == NULL ) { err = ERROR_NOT_ENOUGH_MEMORY ; break ; }
SPITFSNodeMgr spNodeMgr; spServerNode->GetNodeMgr(&spNodeMgr);
//
// Store the server object in the holder
//
CreateContainerTFSNode(&spNode, &GUID_DhcpServerNodeType, pobScope, pobScope, spNodeMgr);
// Tell the handler to initialize any specific data
pobScope->SetServer(spServerNode); pobScope->InitMScopeInfo(&MScopeInfo); pobScope->InitializeNode((ITFSNode *) spNode);
pServer = GETHANDLER(CDhcpServer, spServerNode);
pServer->AddMScopeSorted(spServerNode, spNode); pobScope->Release();
fScopeCreated = TRUE;
//
// Finish updating the scope. First, the IP address range
// from which to allocate addresses.
//
if ( err = pobScope->SetIpRange( dhcpIpRange, TRUE ) ) { Trace1("SetIpRange failed!! %d\n", err); break ; }
//
// Next, see if any exclusions were specified.
//
err = pobScope->StoreExceptionList( m_pageSetExclusions.GetExclusionList() ) ; if (err != ERROR_SUCCESS) { Trace1("StoreExceptionList failed!! %d\n", err); break; }
//
// set the lease time
//
DWORD dwLeaseTime;
dwLeaseTime = m_pageLeaseTime.GetLeaseTime();
err = pobScope->SetLeaseTime(dwLeaseTime); if (err != ERROR_SUCCESS) { Trace1("SetLeaseTime failed!! %d\n", err); break; } } while ( FALSE ) ;
if ( err ) { //
// CODEWORK:: The scope should never have been added
// to the remote registry in the first place.
//
if (pobScope != NULL) { if (fScopeCreated) { Trace0("Bad scope nevertheless was created\n"); err2 = pServer->DeleteMSubnet(pobScope->GetName()); if (err2 != ERROR_SUCCESS) { Trace1("Couldn't remove the bad scope! Error = %d\n", err2); } } spServerNode->RemoveChild(spNode); } }
return err; }
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizName property page
//
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CMScopeWizName, CPropertyPageBase)
CMScopeWizName::CMScopeWizName() : CPropertyPageBase(CMScopeWizName::IDD) { //{{AFX_DATA_INIT(CMScopeWizName)
m_strName = _T(""); m_strComment = _T(""); //}}AFX_DATA_INIT
InitWiz97(FALSE, IDS_MSCOPE_WIZ_NAME_TITLE, IDS_MSCOPE_WIZ_NAME_SUBTITLE); }
CMScopeWizName::~CMScopeWizName() { }
void CMScopeWizName::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMScopeWizName)
DDX_Control(pDX, IDC_EDIT_SCOPE_NAME, m_editScopeName); DDX_Control(pDX, IDC_EDIT_SCOPE_COMMENT, m_editScopeComment); DDX_Text(pDX, IDC_EDIT_SCOPE_NAME, m_strName); DDX_Text(pDX, IDC_EDIT_SCOPE_COMMENT, m_strComment); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMScopeWizName, CPropertyPageBase) //{{AFX_MSG_MAP(CMScopeWizName)
ON_EN_CHANGE(IDC_EDIT_SCOPE_NAME, OnChangeEditScopeName) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizName message handlers
//
/////////////////////////////////////////////////////////////////////////////
BOOL CMScopeWizName::OnInitDialog() { CPropertyPageBase::OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
LRESULT CMScopeWizName::OnWizardNext() { UpdateData(); return IDW_MSCOPE_SET_SCOPE; }
BOOL CMScopeWizName::OnSetActive() { UpdateButtons(); return CPropertyPageBase::OnSetActive(); }
void CMScopeWizName::OnChangeEditScopeName() { UpdateButtons(); }
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizName implementation specific
//
/////////////////////////////////////////////////////////////////////////////
void CMScopeWizName::UpdateButtons() { BOOL bValid = FALSE;
UpdateData();
if (m_strName.GetLength() > 0) bValid = TRUE;
GetHolder()->SetWizardButtonsMiddle(bValid); }
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizInvalidName property page
//
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CMScopeWizInvalidName, CPropertyPageBase)
CMScopeWizInvalidName::CMScopeWizInvalidName() : CPropertyPageBase(CMScopeWizInvalidName::IDD) { //{{AFX_DATA_INIT(CMScopeWizInvalidName)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
InitWiz97(FALSE, IDS_MSCOPE_WIZ_INVALID_NAME_TITLE, IDS_MSCOPE_WIZ_INVALID_NAME_SUBTITLE); }
CMScopeWizInvalidName::~CMScopeWizInvalidName() { }
void CMScopeWizInvalidName::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMScopeWizInvalidName)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMScopeWizInvalidName, CPropertyPageBase) //{{AFX_MSG_MAP(CMScopeWizInvalidName)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizInvalidName message handlers
//
/////////////////////////////////////////////////////////////////////////////
BOOL CMScopeWizInvalidName::OnInitDialog() { CPropertyPageBase::OnInitDialog(); return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
LRESULT CMScopeWizInvalidName::OnWizardBack() { // TODO: Add your specialized code here and/or call the base class
return IDW_MSCOPE_NAME; }
BOOL CMScopeWizInvalidName::OnSetActive() { GetHolder()->SetWizardButtonsLast(FALSE); return CPropertyPageBase::OnSetActive(); }
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizSetRange property page
//
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CMScopeWizSetRange, CPropertyPageBase)
CMScopeWizSetRange::CMScopeWizSetRange() : CPropertyPageBase(CMScopeWizSetRange::IDD) { //{{AFX_DATA_INIT(CMScopeWizSetRange)
//}}AFX_DATA_INIT
InitWiz97(FALSE, IDS_MSCOPE_WIZ_SCOPE_TITLE, IDS_MSCOPE_WIZ_SCOPE_SUBTITLE); }
CMScopeWizSetRange::~CMScopeWizSetRange() { }
void CMScopeWizSetRange::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMScopeWizSetRange)
DDX_Control(pDX, IDC_SPIN_TTL, m_spinTTL); DDX_Control(pDX, IDC_EDIT_TTL, m_editTTL); //}}AFX_DATA_MAP
DDX_Control(pDX, IDC_IPADDR_POOL_START, m_ipaStart); DDX_Control(pDX, IDC_IPADDR_POOL_STOP, m_ipaEnd); }
BEGIN_MESSAGE_MAP(CMScopeWizSetRange, CPropertyPageBase) //{{AFX_MSG_MAP(CMScopeWizSetRange)
ON_EN_KILLFOCUS(IDC_IPADDR_POOL_START, OnKillfocusPoolStart) ON_EN_KILLFOCUS(IDC_IPADDR_POOL_STOP, OnKillfocusPoolStop) ON_EN_CHANGE(IDC_EDIT_MASK_LENGTH, OnChangeEditMaskLength)
ON_EN_CHANGE(IDC_IPADDR_POOL_START, OnChangePoolStart) ON_EN_CHANGE(IDC_IPADDR_POOL_STOP, OnChangePoolStop) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizSetRange message handlers
//
/////////////////////////////////////////////////////////////////////////////
BOOL CMScopeWizSetRange::OnInitDialog() { CPropertyPageBase::OnInitDialog();
m_spinTTL.SetRange(1, 255); m_spinTTL.SetPos(32);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
LRESULT CMScopeWizSetRange::OnWizardNext() { UpdateData(); CDhcpIpRange rangeMScope, rangeMulticast;
rangeMulticast.SetAddr(MCAST_ADDRESS_MIN, TRUE); rangeMulticast.SetAddr(MCAST_ADDRESS_MAX, FALSE);
// check the TTL
int nTTL = m_spinTTL.GetPos();
if ( (nTTL < 1) || (nTTL > 255) ) { // invalid TTL specified
AfxMessageBox(IDS_INVALID_TTL); m_editTTL.SetFocus(); m_editTTL.SetSel(0,-1); return -1; }
// valid address range?
GetScopeRange(&rangeMScope); if (rangeMScope.QueryAddr(TRUE) >= rangeMScope.QueryAddr(FALSE)) { AfxMessageBox(IDS_ERR_IP_RANGE_INV_START); m_ipaStart.SetFocus(); return -1; } if (!rangeMScope.IsSubset(rangeMulticast)) { AfxMessageBox(IDS_INVALID_MCAST_ADDRESS); m_ipaStart.SetFocus(); return -1; }
// if the mcast scope range falls in the scoped area, make sure
// the range is at least 256 addresses
if (rangeMScope.QueryAddr(FALSE) > MCAST_SCOPED_RANGE_MIN) { if ( ((rangeMScope.QueryAddr(FALSE) - rangeMScope.QueryAddr(TRUE)) + 1) < 256) { AfxMessageBox(IDS_INVALID_MCAST_SCOPED_RANGE); m_ipaStart.SetFocus(); return -1; } }
// is the scope ID in use?
SPITFSNode spServerNode; CDhcpServer * pServer; spServerNode = GetHolder()->GetNode(); pServer = GETHANDLER(CDhcpServer, spServerNode);
if (pServer->DoesMScopeExist(spServerNode, rangeMScope.QueryAddr(TRUE))) { AfxMessageBox(IDS_ERR_IP_RANGE_OVERLAP); return -1; }
return IDW_MSCOPE_SET_EXCLUSIONS; }
LRESULT CMScopeWizSetRange::OnWizardBack() { return IDW_MSCOPE_NAME; }
BOOL CMScopeWizSetRange::OnSetActive() { m_fPageActive = TRUE;
UpdateButtons();
return CPropertyPageBase::OnSetActive(); }
BOOL CMScopeWizSetRange::OnKillActive() { m_fPageActive = FALSE;
UpdateButtons();
return CPropertyPageBase::OnKillActive(); }
void CMScopeWizSetRange::OnKillfocusPoolStart() { }
void CMScopeWizSetRange::OnKillfocusPoolStop() { }
void CMScopeWizSetRange::OnChangeEditMaskLength() { UpdateButtons(); }
void CMScopeWizSetRange::OnChangePoolStop() { UpdateButtons(); }
void CMScopeWizSetRange::OnChangePoolStart() { UpdateButtons(); }
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizSetRange implementation specific
//
/////////////////////////////////////////////////////////////////////////////
BOOL CMScopeWizSetRange::GetScopeRange(CDhcpIpRange * pdhcpIpRange) { DHCP_IP_RANGE dhcpIpRange;
if ( !m_ipaStart.GetAddress( & dhcpIpRange.StartAddress ) ) { return FALSE ; }
if ( !m_ipaEnd.GetAddress( & dhcpIpRange.EndAddress ) ) { return FALSE; }
*pdhcpIpRange = dhcpIpRange;
return TRUE; }
BYTE CMScopeWizSetRange::GetTTL() { BYTE TTL;
TTL = (LOBYTE(LOWORD(m_spinTTL.GetPos())));
return TTL; }
void CMScopeWizSetRange::UpdateButtons() { DWORD lStart, lEnd;
m_ipaStart.GetAddress(&lStart); m_ipaEnd.GetAddress(&lEnd);
if (lStart && lEnd) GetHolder()->SetWizardButtonsMiddle(TRUE); else GetHolder()->SetWizardButtonsMiddle(FALSE);
}
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizSetExclusions property page
//
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CMScopeWizSetExclusions, CPropertyPageBase)
CMScopeWizSetExclusions::CMScopeWizSetExclusions() : CPropertyPageBase(CMScopeWizSetExclusions::IDD) { //{{AFX_DATA_INIT(CMScopeWizSetExclusions)
//}}AFX_DATA_INIT
InitWiz97(FALSE, IDS_MSCOPE_WIZ_EXCLUSIONS_TITLE, IDS_MSCOPE_WIZ_EXCLUSIONS_SUBTITLE); }
CMScopeWizSetExclusions::~CMScopeWizSetExclusions() { while (m_listExclusions.GetCount()) delete m_listExclusions.RemoveHead(); }
void CMScopeWizSetExclusions::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMScopeWizSetExclusions)
DDX_Control(pDX, IDC_LIST_EXCLUSION_RANGES, m_listboxExclusions); DDX_Control(pDX, IDC_BUTTON_EXCLUSION_DELETE, m_buttonExclusionDelete); DDX_Control(pDX, IDC_BUTTON_EXCLUSION_ADD, m_buttonExclusionAdd); //}}AFX_DATA_MAP
//
// IP Address custom controls
//
DDX_Control(pDX, IDC_IPADDR_EXCLUSION_START, m_ipaStart); DDX_Control(pDX, IDC_IPADDR_EXCLUSION_END, m_ipaEnd); }
BEGIN_MESSAGE_MAP(CMScopeWizSetExclusions, CPropertyPageBase) //{{AFX_MSG_MAP(CMScopeWizSetExclusions)
ON_BN_CLICKED(IDC_BUTTON_EXCLUSION_ADD, OnButtonExclusionAdd) ON_BN_CLICKED(IDC_BUTTON_EXCLUSION_DELETE, OnButtonExclusionDelete) //}}AFX_MSG_MAP
ON_EN_CHANGE(IDC_IPADDR_EXCLUSION_START, OnChangeExclusionStart) ON_EN_CHANGE(IDC_IPADDR_EXCLUSION_END, OnChangeExclusionEnd)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizSetExclusions message handlers
//
/////////////////////////////////////////////////////////////////////////////
BOOL CMScopeWizSetExclusions::OnInitDialog() { CPropertyPageBase::OnInitDialog(); return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
LRESULT CMScopeWizSetExclusions::OnWizardNext() { return IDW_MSCOPE_LEASE_TIME; }
LRESULT CMScopeWizSetExclusions::OnWizardBack() { return IDW_MSCOPE_SET_SCOPE; }
BOOL CMScopeWizSetExclusions::OnSetActive() { GetHolder()->SetWizardButtonsMiddle(TRUE); UpdateButtons();
return CPropertyPageBase::OnSetActive(); }
void CMScopeWizSetExclusions::OnChangeExclusionStart() { UpdateButtons(); }
void CMScopeWizSetExclusions::OnChangeExclusionEnd() { UpdateButtons(); }
void CMScopeWizSetExclusions::OnButtonExclusionAdd() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); DWORD err = 0; CDhcpIpRange dhcpExclusionRange; CDhcpIpRange dhcpScopeRange;
((CMScopeWiz *)GetHolder())->GetScopeRange(&dhcpScopeRange); //
// Get the data into a range object.
//
if ( !GetExclusionRange(dhcpExclusionRange) ) { err = IDS_ERR_IP_RANGE_INVALID ; } else if ( IsOverlappingRange( dhcpExclusionRange ) ) { //
// Walk the current list, determining if the new range is valid.
// Then, if OK, verify that it's really a sub-range of the current range.
//
err = IDS_ERR_IP_RANGE_OVERLAP ; m_ipaStart.SetFocus(); } else if ( ! dhcpExclusionRange.IsSubset( dhcpScopeRange ) ) { //
// Guarantee that the new range is an (improper) subset of the scope's range
//
err = IDS_ERR_IP_RANGE_NOT_SUBSET ; m_ipaStart.SetFocus(); } if ( err == 0 ) { //TRY
{ //
// Create a new IP range object and add it to the current list
//
CDhcpIpRange * pIpRange = new CDhcpIpRange( dhcpExclusionRange ) ;
m_listExclusions.AddTail(pIpRange);
//
// Refill the exclusions listbox including the new item.
//
Fill( (int) (m_listExclusions.GetCount() - 1) ) ; } //CATCH_ALL(e)
//{
// err = ERROR_NOT_ENOUGH_MEMORY ;
//}
//END_CATCH_ALL
}
if ( err ) { ::DhcpMessageBox( err ) ; } else { //
// Succesfully added the exlusion range, now blank out the
// ip controls
//
m_ipaStart.ClearAddress(); m_ipaEnd.ClearAddress(); m_ipaStart.SetFocus(); } }
void CMScopeWizSetExclusions::OnButtonExclusionDelete() { //
// Index into the listbox, delete the item from the active list
// and move its data into the edit controls
//
int index = m_listboxExclusions.GetCurSel() ;
ASSERT( index >= 0 ) ; // Button should not be enabled if no selection.
if ( index < 0 ) { return ; }
POSITION pos = m_listExclusions.FindIndex(index); CDhcpIpRange * pdhcRange = (CDhcpIpRange *) m_listExclusions.GetAt(pos);
m_listExclusions.RemoveAt(pos);
ASSERT( pdhcRange != NULL ) ;
//
// Put the deleted range into the exclusions controls
//
FillExcl( pdhcRange ) ;
//
// Refill the list box and call HandleActivation()
//
if ( index >= m_listboxExclusions.GetCount() ) { index-- ; } Fill( index ) ; m_ipaStart.SetFocus();
UpdateButtons(); }
//
// Format the IP range pair into the exclusion edit controls
//
void CMScopeWizSetExclusions::FillExcl ( CDhcpIpRange * pdhcIpRange ) { LONG lStart = pdhcIpRange->QueryAddr( TRUE ); LONG lEnd = pdhcIpRange->QueryAddr( FALSE );
m_ipaStart.SetAddress( lStart ) ; m_ipaStart.SetModify( TRUE ) ; m_ipaStart.Invalidate() ;
//
// If the ending address is the same as the starting address,
// do not fill in the ending address.
//
if (lStart != lEnd) { m_ipaEnd.SetAddress( lEnd ) ; } else { m_ipaEnd.ClearAddress(); }
m_ipaEnd.SetModify( TRUE ) ; m_ipaEnd.Invalidate() ; }
//
// Convert the IP address range controls to a range.
//
BOOL CMScopeWizSetExclusions::GetExclusionRange ( CDhcpIpRange & dhcIpRange ) { DHCP_IP_RANGE dhipr ;
if ( !m_ipaStart.GetAddress( & dhipr.StartAddress ) ) { m_ipaStart.SetFocus(); return FALSE ; } if ( !m_ipaEnd.GetAddress( & dhipr.EndAddress ) ) { //
// If no ending range was specified, assume a singular exlusion
// (the starting address) was requested.
//
m_ipaEnd.SetFocus(); dhipr.EndAddress = dhipr.StartAddress; }
dhcIpRange = dhipr ; return (BOOL) dhcIpRange ; }
BOOL CMScopeWizSetExclusions::IsOverlappingRange ( CDhcpIpRange & dhcpIpRange ) { POSITION pos; CDhcpIpRange * pdhcpRange ; BOOL bOverlap = FALSE ;
pos = m_listExclusions.GetHeadPosition(); while ( pos ) { pdhcpRange = m_listExclusions.GetNext(pos); if ( bOverlap = pdhcpRange->IsOverlap( dhcpIpRange ) ) { break ; } }
return bOverlap ; }
//
// Fill the exclusions listbox from the current list
//
void CMScopeWizSetExclusions::Fill ( int nCurSel, BOOL bToggleRedraw ) { POSITION pos; CDhcpIpRange * pIpRange ; CString strIp1 ; CString strIp2 ; CString strFormatPair ; CString strFormatSingleton ; TCHAR chBuff [STRING_LENGTH_MAX] ;
if ( ! strFormatPair.LoadString( IDS_INFO_FORMAT_IP_RANGE ) ) { return ; }
if ( ! strFormatSingleton.LoadString( IDS_INFO_FORMAT_IP_UNITARY ) ) { return ; }
if ( bToggleRedraw ) { m_listboxExclusions.SetRedraw( FALSE ) ; }
m_listboxExclusions.ResetContent() ; pos = m_listExclusions.GetHeadPosition();
while ( pos ) { pIpRange = m_listExclusions.GetNext(pos);
DHCP_IP_RANGE dhipr = *pIpRange ;
CString & strFmt = dhipr.StartAddress == dhipr.EndAddress ? strFormatSingleton : strFormatPair ;
//
// Format the IP addresses
//
UtilCvtIpAddrToWstr( dhipr.StartAddress, &strIp1 ) ; UtilCvtIpAddrToWstr( dhipr.EndAddress, &strIp2 ) ;
//
// Construct the display line
//
::wsprintf( chBuff, (LPCTSTR) strFmt, (LPCTSTR) strIp1, (LPCTSTR) strIp2 ) ;
//
// Add it to the list box.
//
if ( m_listboxExclusions.AddString( chBuff ) < 0 ) { break ; } }
//
// Check that we loaded the list box successfully.
//
if ( pos != NULL ) { AfxMessageBox( IDS_ERR_DLG_UPDATE ) ; }
if ( bToggleRedraw ) { m_listboxExclusions.SetRedraw( TRUE ) ; m_listboxExclusions.Invalidate() ; }
if ( nCurSel >= 0 ) { m_listboxExclusions.SetCurSel( nCurSel ) ; } }
void CMScopeWizSetExclusions::UpdateButtons() { DWORD dwAddress; BOOL bEnable;
m_ipaStart.GetAddress(&dwAddress);
if (dwAddress) { bEnable = TRUE; } else { bEnable = FALSE; if (m_buttonExclusionAdd.GetButtonStyle() & BS_DEFPUSHBUTTON) { m_buttonExclusionAdd.SetButtonStyle(BS_PUSHBUTTON); } } m_buttonExclusionAdd.EnableWindow(bEnable); if (m_listboxExclusions.GetCurSel() != LB_ERR) { bEnable = TRUE; } else { bEnable = FALSE; if (m_buttonExclusionDelete.GetButtonStyle() & BS_DEFPUSHBUTTON) { m_buttonExclusionDelete.SetButtonStyle(BS_PUSHBUTTON); } } m_buttonExclusionDelete.EnableWindow(bEnable); }
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizLeaseTime property page
//
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CMScopeWizLeaseTime, CPropertyPageBase)
CMScopeWizLeaseTime::CMScopeWizLeaseTime() : CPropertyPageBase(CMScopeWizLeaseTime::IDD) { //{{AFX_DATA_INIT(CMScopeWizLeaseTime)
//}}AFX_DATA_INIT
InitWiz97(FALSE, IDS_MSCOPE_WIZ_LEASE_TITLE, IDS_MSCOPE_WIZ_LEASE_SUBTITLE); }
CMScopeWizLeaseTime::~CMScopeWizLeaseTime() { }
void CMScopeWizLeaseTime::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMScopeWizLeaseTime)
DDX_Control(pDX, IDC_SPIN_LEASE_MINUTES, m_spinMinutes); DDX_Control(pDX, IDC_SPIN_LEASE_HOURS, m_spinHours); DDX_Control(pDX, IDC_SPIN_LEASE_DAYS, m_spinDays); DDX_Control(pDX, IDC_EDIT_LEASE_MINUTES, m_editMinutes); DDX_Control(pDX, IDC_EDIT_LEASE_HOURS, m_editHours); DDX_Control(pDX, IDC_EDIT_LEASE_DAYS, m_editDays); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMScopeWizLeaseTime, CPropertyPageBase) //{{AFX_MSG_MAP(CMScopeWizLeaseTime)
ON_BN_CLICKED(IDC_RADIO_LEASE_LIMITED, OnRadioLeaseLimited) ON_BN_CLICKED(IDC_RADIO_LEASE_UNLIMITED, OnRadioLeaseUnlimited) ON_EN_CHANGE(IDC_EDIT_LEASE_HOURS, OnChangeEditLeaseHours) ON_EN_CHANGE(IDC_EDIT_LEASE_MINUTES, OnChangeEditLeaseMinutes) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizLeaseTime message handlers
//
/////////////////////////////////////////////////////////////////////////////
BOOL CMScopeWizLeaseTime::OnInitDialog() { CPropertyPageBase::OnInitDialog(); m_spinMinutes.SetRange(0, MINUTES_MAX); m_spinHours.SetRange(0, HOURS_MAX); m_spinDays.SetRange(0, 999);
m_editMinutes.LimitText(2); m_editHours.LimitText(2); m_editDays.LimitText(3);
m_spinMinutes.SetPos(CMScopeWizLeaseTime::m_nMinutesDefault); m_spinHours.SetPos(CMScopeWizLeaseTime::m_nHoursDefault); m_spinDays.SetPos(CMScopeWizLeaseTime::m_nDaysDefault);
ActivateDuration(TRUE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
LRESULT CMScopeWizLeaseTime::OnWizardNext() { DWORD dwLeaseTime = GetLeaseTime(); if (dwLeaseTime == 0) { AfxMessageBox(IDS_ERR_NO_DURATION_SPECIFIED); return -1; } else { return IDW_MSCOPE_ACTIVATE; } }
LRESULT CMScopeWizLeaseTime::OnWizardBack() { return IDW_MSCOPE_SET_EXCLUSIONS; }
BOOL CMScopeWizLeaseTime::OnSetActive() { GetHolder()->SetWizardButtonsMiddle(TRUE); return CPropertyPageBase::OnSetActive(); }
void CMScopeWizLeaseTime::OnRadioLeaseLimited() { ActivateDuration(TRUE); }
void CMScopeWizLeaseTime::OnRadioLeaseUnlimited() { ActivateDuration(FALSE); }
void CMScopeWizLeaseTime::OnChangeEditLeaseHours() { if (IsWindow(m_editHours.GetSafeHwnd())) { CString strText; m_editHours.GetWindowText(strText);
// check to see if the value is greater than the max
if (_ttoi(strText) > HOURS_MAX) { LPTSTR pBuf = strText.GetBuffer(5);
_itot(HOURS_MAX, pBuf, 10); strText.ReleaseBuffer();
m_editHours.SetWindowText(strText); m_spinHours.SetPos(HOURS_MAX);
MessageBeep(MB_ICONEXCLAMATION); } } }
void CMScopeWizLeaseTime::OnChangeEditLeaseMinutes() { if (IsWindow(m_editMinutes.GetSafeHwnd())) { CString strText; m_editMinutes.GetWindowText(strText);
// check to see if the value is greater than the max
if (_ttoi(strText) > MINUTES_MAX) { LPTSTR pBuf = strText.GetBuffer(5);
_itot(MINUTES_MAX, pBuf, 10); strText.ReleaseBuffer();
m_editMinutes.SetWindowText(strText); m_spinMinutes.SetPos(MINUTES_MAX);
MessageBeep(MB_ICONEXCLAMATION); } } }
DWORD CMScopeWizLeaseTime::GetLeaseTime() { DWORD dwLeaseTime = 0;
int nDays, nHours, nMinutes;
nDays = m_spinDays.GetPos(); nHours = m_spinHours.GetPos(); nMinutes = m_spinMinutes.GetPos();
//
// Lease time is in minutes so convert
//
dwLeaseTime = UtilConvertLeaseTime(nDays, nHours, nMinutes);
return dwLeaseTime; }
void CMScopeWizLeaseTime::ActivateDuration ( BOOL fActive ) { m_spinMinutes.EnableWindow(fActive); m_spinHours.EnableWindow(fActive); m_spinDays.EnableWindow(fActive);
m_editMinutes.EnableWindow(fActive); m_editHours.EnableWindow(fActive); m_editDays.EnableWindow(fActive);
GetDlgItem(IDC_STATIC_DAYS)->EnableWindow(fActive); GetDlgItem(IDC_STATIC_HOURS)->EnableWindow(fActive); GetDlgItem(IDC_STATIC_MINUTES)->EnableWindow(fActive); }
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizFinished property page
//
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CMScopeWizFinished, CPropertyPageBase)
CMScopeWizFinished::CMScopeWizFinished() : CPropertyPageBase(CMScopeWizFinished::IDD) { //{{AFX_DATA_INIT(CMScopeWizFinished)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
InitWiz97(TRUE, 0, 0); }
CMScopeWizFinished::~CMScopeWizFinished() { }
void CMScopeWizFinished::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMScopeWizFinished)
DDX_Control(pDX, IDC_STATIC_FINISHED_TITLE, m_staticTitle); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMScopeWizFinished, CPropertyPageBase) //{{AFX_MSG_MAP(CMScopeWizFinished)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// CMScopeWizFinished message handlers
//
/////////////////////////////////////////////////////////////////////////////
BOOL CMScopeWizFinished::OnInitDialog() { CPropertyPageBase::OnInitDialog(); CString strFontName; CString strFontSize;
strFontName.LoadString(IDS_BIG_BOLD_FONT_NAME); strFontSize.LoadString(IDS_BIG_BOLD_FONT_SIZE);
CClientDC dc(this);
int nFontSize = _ttoi(strFontSize) * 10; if (m_fontBig.CreatePointFont(nFontSize, strFontName, &dc)) m_staticTitle.SetFont(&m_fontBig);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CMScopeWizFinished::OnWizardFinish() { DWORD err;
BEGIN_WAIT_CURSOR;
err = GetHolder()->OnFinish();
END_WAIT_CURSOR; if (err) { ::DhcpMessageBox(err); return FALSE; } else { return TRUE; } }
BOOL CMScopeWizFinished::OnSetActive() { GetHolder()->SetWizardButtonsLast(TRUE); return CPropertyPageBase::OnSetActive(); }
/////////////////////////////////////////////////////////////////////////////
// CMScopeWizWelcome property page
IMPLEMENT_DYNCREATE(CMScopeWizWelcome, CPropertyPageBase)
CMScopeWizWelcome::CMScopeWizWelcome() : CPropertyPageBase(CMScopeWizWelcome::IDD) { //{{AFX_DATA_INIT(CMScopeWizWelcome)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
InitWiz97(TRUE, 0, 0); }
CMScopeWizWelcome::~CMScopeWizWelcome() { }
void CMScopeWizWelcome::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMScopeWizWelcome)
DDX_Control(pDX, IDC_STATIC_WELCOME_TITLE, m_staticTitle); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMScopeWizWelcome, CPropertyPageBase) //{{AFX_MSG_MAP(CMScopeWizWelcome)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMScopeWizWelcome message handlers
BOOL CMScopeWizWelcome::OnInitDialog() { CPropertyPageBase::OnInitDialog(); CString strFontName; CString strFontSize;
strFontName.LoadString(IDS_BIG_BOLD_FONT_NAME); strFontSize.LoadString(IDS_BIG_BOLD_FONT_SIZE);
CClientDC dc(this);
int nFontSize = _ttoi(strFontSize) * 10; if (m_fontBig.CreatePointFont(nFontSize, strFontName, &dc)) m_staticTitle.SetFont(&m_fontBig); return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CMScopeWizWelcome::OnSetActive() { GetHolder()->SetWizardButtonsFirst(TRUE); return CPropertyPage::OnSetActive(); }
/////////////////////////////////////////////////////////////////////////////
// CMScopeWizActivate property page
IMPLEMENT_DYNCREATE(CMScopeWizActivate, CPropertyPageBase)
CMScopeWizActivate::CMScopeWizActivate() : CPropertyPageBase(CMScopeWizActivate::IDD) { //{{AFX_DATA_INIT(CMScopeWizActivate)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_fActivate = TRUE;
InitWiz97(FALSE, IDS_MSCOPE_WIZ_ACTIVATE_TITLE, IDS_MSCOPE_WIZ_ACTIVATE_SUBTITLE); }
CMScopeWizActivate::~CMScopeWizActivate() { }
void CMScopeWizActivate::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMScopeWizActivate)
DDX_Control(pDX, IDC_RADIO_YES, m_radioYes); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMScopeWizActivate, CPropertyPageBase) //{{AFX_MSG_MAP(CMScopeWizActivate)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMScopeWizActivate message handlers
BOOL CMScopeWizActivate::OnInitDialog() { CPropertyPageBase::OnInitDialog(); m_radioYes.SetCheck(TRUE); return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
LRESULT CMScopeWizActivate::OnWizardNext() { m_fActivate = m_radioYes.GetCheck(); return CPropertyPageBase::OnWizardNext(); }
BOOL CMScopeWizActivate::OnSetActive() { GetHolder()->SetWizardButtonsMiddle(TRUE); return CPropertyPageBase::OnSetActive(); }
|