windows-nt/Source/XPSP1/NT/net/mmc/dhcp/mscopwiz.cpp
2020-09-26 16:20:57 +08:00

1426 lines
34 KiB
C++

/**********************************************************************/
/** 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();
}