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