//============================================================================ // Copyright(c) 1996, Microsoft Corporation // // File: ipxadd.cpp // // History: // 08/30/96 Ram Cherala Created // // Implementation of IPX Filter Add/Edit dialog code //============================================================================ #include "stdafx.h" #include "rtrfiltr.h" #include "ipxfltr.h" #include "datafmt.h" #include "IpxAdd.h" extern "C" { #include #include } #include "rtradmin.hm" ///////////////////////////////////////////////////////////////////////////// // CIpxAddEdit dialog CIpxAddEdit::CIpxAddEdit(CWnd* pParent, FilterListEntry ** ppFilterEntry) : CBaseDialog(CIpxAddEdit::IDD, pParent), m_ppFilterEntry( ppFilterEntry ), m_bValidate( TRUE ) { //{{AFX_DATA_INIT(CIpxAddEdit) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // SetHelpMap(m_dwHelpMap); } void CIpxAddEdit::DoDataExchange(CDataExchange* pDX) { CString cStr; CBaseDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CIpxAddEdit) DDX_Control(pDX, IDC_AEIPX_EB_SRC_SOCKET, m_ebSrcSocket); DDX_Control(pDX, IDC_AEIPX_EB_SRC_NODE, m_ebSrcNode); DDX_Control(pDX, IDC_AEIPX_EB_SRC_NET, m_ebSrcNet); DDX_Control(pDX, IDC_AEIPX_EB_SRC_MASK, m_ebSrcMask); DDX_Control(pDX, IDC_AEIPX_EB_PACKET_TYPE, m_ebPacketType); DDX_Control(pDX, IDC_AEIPX_EB_DST_SOCKET, m_ebDstSocket); DDX_Control(pDX, IDC_AEIPX_EB_DST_NODE, m_ebDstNode); DDX_Control(pDX, IDC_AEIPX_EB_DST_NET, m_ebDstNet); DDX_Control(pDX, IDC_AEIPX_EB_DST_MASK, m_ebDstMask); DDX_Text(pDX, IDC_AEIPX_EB_SRC_SOCKET, cStr); DDV_MaxChars(pDX, cStr, 4); DDX_Text(pDX, IDC_AEIPX_EB_SRC_NODE, cStr); DDV_MaxChars(pDX, cStr, 12); DDX_Text(pDX, IDC_AEIPX_EB_SRC_NET, cStr); DDV_MaxChars(pDX, cStr, 8); DDX_Text(pDX, IDC_AEIPX_EB_SRC_MASK, cStr); DDV_MaxChars(pDX, cStr, 8); DDX_Text(pDX, IDC_AEIPX_EB_DST_SOCKET, cStr); DDV_MaxChars(pDX, cStr, 4); DDX_Text(pDX, IDC_AEIPX_EB_DST_NODE, cStr); DDV_MaxChars(pDX, cStr, 12); DDX_Text(pDX, IDC_AEIPX_EB_DST_NET, cStr); DDV_MaxChars(pDX, cStr, 8); DDX_Text(pDX, IDC_AEIPX_EB_DST_MASK, cStr); DDV_MaxChars(pDX, cStr, 8); DDX_Text(pDX, IDC_AEIPX_EB_PACKET_TYPE, cStr); DDV_MaxChars(pDX, cStr, 4); //}}AFX_DATA_MAP } // change not to use KILLFOCUS to do data entry validation: // reason: create dead loop when the one loosing focus and the one getting focus both have invalid entries // here we change to do validation with OnOK BEGIN_MESSAGE_MAP(CIpxAddEdit, CBaseDialog) //{{AFX_MSG_MAP(CIpxAddEdit) /* ON_MESSAGE(WM_EDITLOSTFOCUS, OnEditLostFocus) ON_EN_KILLFOCUS(IDC_AEIPX_EB_SRC_NET, OnKillFocusSrcNet) ON_EN_KILLFOCUS(IDC_AEIPX_EB_SRC_MASK, OnKillFocusSrcNetMask) ON_EN_KILLFOCUS(IDC_AEIPX_EB_SRC_NODE, OnKillFocusSrcNode) ON_EN_KILLFOCUS(IDC_AEIPX_EB_SRC_SOCKET, OnKillFocusSrcSocket) ON_EN_KILLFOCUS(IDC_AEIPX_EB_DST_NET, OnKillFocusDstNet) ON_EN_KILLFOCUS(IDC_AEIPX_EB_DST_MASK, OnKillFocusDstNetMask) ON_EN_KILLFOCUS(IDC_AEIPX_EB_DST_NODE, OnKillFocusDstNode) ON_EN_KILLFOCUS(IDC_AEIPX_EB_DST_SOCKET, OnKillFocusDstSocket) ON_EN_KILLFOCUS(IDC_AEIPX_EB_PACKET_TYPE, OnKillFocusPacketType) */ ON_WM_PARENTNOTIFY() ON_WM_ACTIVATEAPP() ON_WM_QUERYENDSESSION() //}}AFX_MSG_MAP END_MESSAGE_MAP() DWORD CIpxAddEdit::m_dwHelpMap[] = { // IDC_AI_ST_SRC_NET, HIDC_AI_ST_SRC_NET, // IDC_AEIPX_EB_SRC_NET, HIDC_AEIPX_EB_SRC_NET, // IDC_AI_ST_SRC_MASK, HIDC_AI_ST_SRC_MASK, // IDC_AEIPX_EB_SRC_MASK, HIDC_AEIPX_EB_SRC_MASK, // IDC_AI_ST_SRC_NODE, HIDC_AI_ST_SRC_NODE, // IDC_AEIPX_EB_SRC_NODE, HIDC_AEIPX_EB_SRC_NODE, // IDC_AI_ST_SRC_SOCKET, HIDC_AI_ST_SRC_SOCKET, // IDC_AEIPX_EB_SRC_SOCKET, HIDC_AEIPX_EB_SRC_SOCKET, // IDC_AI_ST_DST_NET, HIDC_AI_ST_DST_NET, // IDC_AEIPX_EB_DST_NET, HIDC_AEIPX_EB_DST_NET, // IDC_AI_ST_DST_MASK, HIDC_AI_ST_DST_MASK, // IDC_AEIPX_EB_DST_MASK, HIDC_AEIPX_EB_DST_MASK, // IDC_AI_ST_DST_NODE, HIDC_AI_ST_DST_NODE, // IDC_AEIPX_EB_DST_NODE, HIDC_AEIPX_EB_DST_NODE, // IDC_AI_ST_DST_SOCKET, HIDC_AI_ST_DST_SOCKET, // IDC_AEIPX_EB_DST_SOCKET, HIDC_AEIPX_EB_DST_SOCKET, // IDC_AI_ST_PACKET_TYPE, HIDC_AI_ST_PACKET_TYPE, // IDC_AEIPX_EB_PACKET_TYPE, HIDC_AEIPX_EB_PACKET_TYPE, 0,0 }; ///////////////////////////////////////////////////////////////////////////// // CIpxAddEdit message handlers //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnInitDialog // // Handles 'WM_INITDIALOG' notification from the dialog //------------------------------------------------------------------------------ BOOL CIpxAddEdit::OnInitDialog() { CBaseDialog::OnInitDialog(); CString cStr; // // determine if a new filter is being added or if an // existing filter is being modified. // m_bEdit = ( *m_ppFilterEntry != NULL ); cStr.LoadString(m_bEdit ? IDS_IPX_EDIT_FILTER : IDS_IPX_ADD_FILTER); SetWindowText(cStr); // // Remove this style so we get the WM_PARENTNOTIFY when // the user clicks on the Cancel button // GetDlgItem(IDCANCEL)->ModifyStyleEx(WS_EX_NOPARENTNOTIFY,0); // // fill in the controls if user is editing an existing filter // if(m_bEdit) { FilterListEntry * pfle = *m_ppFilterEntry; if (pfle->FilterDefinition & IPX_TRAFFIC_FILTER_ON_SRCNET) { m_ebSrcNet.SetWindowText(cStr << CIPX_NETWORK(pfle->SourceNetwork)); m_ebSrcMask.SetWindowText(cStr << CIPX_NETWORK(pfle->SourceNetworkMask)); } if (pfle->FilterDefinition & IPX_TRAFFIC_FILTER_ON_SRCNODE) { m_ebSrcNode.SetWindowText(cStr << CIPX_NODE(pfle->SourceNode)); } if (pfle->FilterDefinition & IPX_TRAFFIC_FILTER_ON_SRCSOCKET) { m_ebSrcSocket.SetWindowText(cStr << CIPX_SOCKET(pfle->SourceSocket)); } if (pfle->FilterDefinition & IPX_TRAFFIC_FILTER_ON_DSTNET) { m_ebDstNet.SetWindowText(cStr << CIPX_NETWORK(pfle->DestinationNetwork)); m_ebDstMask.SetWindowText(cStr << CIPX_NETWORK(pfle->DestinationNetworkMask)); } if (pfle->FilterDefinition & IPX_TRAFFIC_FILTER_ON_DSTNODE) { m_ebDstNode.SetWindowText(cStr << CIPX_NODE(pfle->DestinationNode)); } if (pfle->FilterDefinition & IPX_TRAFFIC_FILTER_ON_DSTSOCKET) { m_ebDstSocket.SetWindowText(cStr << CIPX_SOCKET(pfle->DestinationSocket)); } if (pfle->FilterDefinition & IPX_TRAFFIC_FILTER_ON_PKTTYPE) { m_ebPacketType.SetWindowText(cStr << CIPX_PACKET_TYPE(pfle->PacketType)); } } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } DWORD IDCsToVerify[] = { IDC_AEIPX_EB_SRC_NET, IDC_AEIPX_EB_SRC_MASK, IDC_AEIPX_EB_SRC_NODE, IDC_AEIPX_EB_SRC_SOCKET, IDC_AEIPX_EB_DST_NET, IDC_AEIPX_EB_DST_MASK, IDC_AEIPX_EB_DST_NODE, IDC_AEIPX_EB_DST_SOCKET, IDC_AEIPX_EB_PACKET_TYPE, 0 }; //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnOK // // Handles 'BN_CLICKED' notification from the 'OK' button //------------------------------------------------------------------------------ void CIpxAddEdit::OnOK() { DWORD net, mask; CString cStr, cNet, cMask; FilterListEntry * pfle; INT n = 0; // validate the data entries while(IDCsToVerify[n] != 0) { if (TRUE != ValidateAnEntry(IDCsToVerify[n++])) return; }; if(!*m_ppFilterEntry) { // // new filter added, allocate memory and save information // *m_ppFilterEntry = new FilterListEntry; } VERIFY(*m_ppFilterEntry); pfle = *m_ppFilterEntry; do { // // init. flags field. // pfle->FilterDefinition = 0; // // Traffic filter source parameters // m_ebSrcNet.GetWindowText(cNet); m_ebSrcMask.GetWindowText(cMask); // // if net number is empty // if ( cNet.GetLength() == 0 ) { CString cEmpty = _T("00000000"); cEmpty >> CIPX_NETWORK(pfle->SourceNetwork); // // if net mask is also empty // if ( cMask.GetLength() == 0 ) { cEmpty >> CIPX_NETWORK(pfle->SourceNetworkMask); } else { cMask >> CIPX_NETWORK( pfle-> SourceNetworkMask ); pfle-> FilterDefinition |= IPX_TRAFFIC_FILTER_ON_SRCNET; } } // // if net number is not empty // else { // // if net mask is empty // if ( cMask.GetLength() == 0 ) { AfxMessageBox(IDS_ENTER_MASK); ::SetFocus((HWND)m_ebSrcMask); break; } // // both net and mask specified. Verify validity // if ( ( _stscanf (cNet, TEXT("%lx%n"), &net, &n) == 1 ) && ( n == cNet.GetLength() ) && ( _stscanf (cMask, TEXT("%lx%n"), &mask, &n) == 1 ) && ( n == cMask.GetLength() ) ) { if ( ( net & mask ) != net) { AfxMessageBox(IDS_ENTER_VALID_MASK); ::SetFocus((HWND)m_ebSrcMask); break; } } else { AfxMessageBox(IDS_ENTER_VALID_MASK); ::SetFocus((HWND)m_ebSrcMask); break; } // // valid network number and mask combination // cNet >> CIPX_NETWORK( pfle-> SourceNetwork ); cMask >> CIPX_NETWORK( pfle-> SourceNetworkMask ); pfle-> FilterDefinition |= IPX_TRAFFIC_FILTER_ON_SRCNET; } // // get source node // m_ebSrcNode.GetWindowText( cStr ); if ( cStr.GetLength() == 0 ) { CString cEmpty = _T( "000000000000" ); cEmpty >> CIPX_NODE(pfle->SourceNode); } else { cStr >> CIPX_NODE( pfle-> SourceNode ); pfle-> FilterDefinition |= IPX_TRAFFIC_FILTER_ON_SRCNODE; } // // get source socket // m_ebSrcSocket.GetWindowText( cStr ); if ( cStr.GetLength() == 0 ) { CString cEmpty = _T( "0000" ); cEmpty >> CIPX_SOCKET( pfle->SourceSocket ); } else { cStr >> CIPX_SOCKET( pfle-> SourceSocket ); pfle-> FilterDefinition |= IPX_TRAFFIC_FILTER_ON_SRCSOCKET; } // // Traffic filter destination parameters // m_ebDstNet.GetWindowText(cNet); m_ebDstMask.GetWindowText(cMask); // // if net number is empty // if ( cNet.GetLength() == 0 ) { CString cEmpty = _T("00000000"); cEmpty >> CIPX_NETWORK(pfle->DestinationNetwork); // // if net mask is also empty // if ( cMask.GetLength() == 0 ) { cEmpty >> CIPX_NETWORK(pfle->DestinationNetworkMask); } else { cMask >> CIPX_NETWORK( pfle-> DestinationNetworkMask ); pfle-> FilterDefinition |= IPX_TRAFFIC_FILTER_ON_DSTNET; } } // // if net number is not empty // else { // // if net mask is empty // if ( cMask.GetLength() == 0 ) { AfxMessageBox(IDS_ENTER_MASK); ::SetFocus((HWND)m_ebDstMask); break; } // // both net and mask specified. Verify validity // if ( ( _stscanf (cNet, TEXT("%lx%n"), &net, &n) == 1 ) && ( n == cNet.GetLength() ) && ( _stscanf (cMask, TEXT("%lx%n"), &mask, &n) == 1 ) && ( n == cMask.GetLength() ) ) { if ( ( net & mask ) != net) { AfxMessageBox(IDS_ENTER_VALID_MASK); ::SetFocus((HWND)m_ebDstMask); break; } } else { AfxMessageBox(IDS_ENTER_VALID_MASK); ::SetFocus((HWND)m_ebDstMask); break; } // // valid network number and mask combination // cNet >> CIPX_NETWORK( pfle-> DestinationNetwork ); cMask >> CIPX_NETWORK( pfle-> DestinationNetworkMask ); pfle-> FilterDefinition |= IPX_TRAFFIC_FILTER_ON_DSTNET; } // // get destination node // m_ebDstNode.GetWindowText( cStr ); if ( cStr.GetLength() == 0 ) { CString cEmpty = _T( "000000000000" ); cEmpty >> CIPX_NODE(pfle->DestinationNode); } else { cStr >> CIPX_NODE( pfle-> DestinationNode ); pfle-> FilterDefinition |= IPX_TRAFFIC_FILTER_ON_DSTNODE; } // // get destination socket // m_ebDstSocket.GetWindowText( cStr ); if ( cStr.GetLength() == 0 ) { CString cEmpty = _T( "0000" ); cEmpty >> CIPX_SOCKET( pfle->DestinationSocket ); } else { cStr >> CIPX_SOCKET( pfle-> DestinationSocket ); pfle-> FilterDefinition |= IPX_TRAFFIC_FILTER_ON_DSTSOCKET; } // // get packet type // m_ebPacketType.GetWindowText( cStr ); if ( cStr.GetLength() == 0 ) { CString cEmpty = _T( "0" ); cEmpty >> CIPX_PACKET_TYPE( pfle-> PacketType ); } else { cStr >> CIPX_PACKET_TYPE( &pfle-> PacketType ); pfle-> FilterDefinition |= IPX_TRAFFIC_FILTER_ON_PKTTYPE; } CBaseDialog::OnOK(); } while (FALSE); } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnCancel // // Handles 'BN_CLICKED' notification from the 'Cancel' button //------------------------------------------------------------------------------ void CIpxAddEdit::OnCancel() { // TODO: Add extra cleanup here CBaseDialog::OnCancel(); } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnKillFocusSrcNet // // Handles 'EN_KILLFOCUS' notification from the 'Source Network number' editbox //------------------------------------------------------------------------------ void CIpxAddEdit::OnKillFocusSrcNet() { PostMessage( WM_EDITLOSTFOCUS, IDC_AEIPX_EB_SRC_NET, 0 ); } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnKillFocusSrcMask // // Handles 'EN_KILLFOCUS' notification from the 'Source Network Mask' editbox //------------------------------------------------------------------------------ void CIpxAddEdit::OnKillFocusSrcNetMask() { PostMessage( WM_EDITLOSTFOCUS, IDC_AEIPX_EB_SRC_MASK, 0 ); } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnKillFocusSrcNode // // Handles 'EN_KILLFOCUS' notification from the 'Source Network Node' editbox //------------------------------------------------------------------------------ void CIpxAddEdit::OnKillFocusSrcNode() { PostMessage( WM_EDITLOSTFOCUS, IDC_AEIPX_EB_SRC_NODE, 0 ); } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnKillFocusSrcSocket // // Handles 'EN_KILLFOCUS' notification from the 'Source Network Socket' editbox //------------------------------------------------------------------------------ void CIpxAddEdit::OnKillFocusSrcSocket() { PostMessage( WM_EDITLOSTFOCUS, IDC_AEIPX_EB_SRC_SOCKET, 0 ); } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnKillFocusDstNet // // Handles 'EN_KILLFOCUS' notification from the 'Destination Network number' // editbox //------------------------------------------------------------------------------ void CIpxAddEdit::OnKillFocusDstNet() { PostMessage( WM_EDITLOSTFOCUS, IDC_AEIPX_EB_DST_NET, 0 ); } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnKillFocusDstMask // // Handles 'EN_KILLFOCUS' notification from the 'Destination Network mask' // editbox //------------------------------------------------------------------------------ void CIpxAddEdit::OnKillFocusDstNetMask() { PostMessage( WM_EDITLOSTFOCUS, IDC_AEIPX_EB_DST_MASK, 0 ); } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnKillFocusDstNode // // Handles 'EN_KILLFOCUS' notification from the 'Destination Node' editbox //------------------------------------------------------------------------------ void CIpxAddEdit::OnKillFocusDstNode() { PostMessage( WM_EDITLOSTFOCUS, IDC_AEIPX_EB_DST_NODE, 0 ); } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnKillFocusSrcNet // // Handles 'EN_KILLFOCUS' notification from the 'Destination socket' editbox //------------------------------------------------------------------------------ void CIpxAddEdit::OnKillFocusDstSocket() { PostMessage( WM_EDITLOSTFOCUS, IDC_AEIPX_EB_DST_SOCKET, 0 ); } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnKillFocusPacketType // // Handles 'EN_KILLFOCUS' notification from the 'Packet Type' editbox //------------------------------------------------------------------------------ void CIpxAddEdit::OnKillFocusPacketType() { PostMessage( WM_EDITLOSTFOCUS, IDC_AEIPX_EB_PACKET_TYPE, 0 ); } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnKillFocusPacketType // // Handles 'EN_KILLFOCUS' notification from the 'Packet Type' editbox //------------------------------------------------------------------------------ afx_msg LONG CIpxAddEdit::OnEditLostFocus( UINT uId, LONG lParam ) { ValidateAnEntry(uId); return 0; }; BOOL CIpxAddEdit::ValidateAnEntry( UINT uId) { BOOL bOK = FALSE; CString cStr, cStr1; if ( m_bValidate ) { if ( !UpdateData( TRUE ) ) { return 0; } switch ( uId ) { case IDC_AEIPX_EB_SRC_NET: m_ebSrcNet.GetWindowText( cStr ); if ( !( bOK = VerifyEntry( uId, cStr, cStr1 ) ) ) { ::AfxMessageBox( IDS_INVALID_NETWORK_NUMBER ); } break; case IDC_AEIPX_EB_SRC_MASK: m_ebSrcMask.GetWindowText( cStr ); m_ebSrcNet.GetWindowText( cStr1 ); bOK = VerifyEntry( uId, cStr, cStr1 ); break; case IDC_AEIPX_EB_SRC_NODE: m_ebSrcNode.GetWindowText( cStr ); if ( !( bOK = VerifyEntry( uId, cStr, cStr1 ) ) ) { ::AfxMessageBox( IDS_INVALID_NODE_NUMBER ); } break; case IDC_AEIPX_EB_SRC_SOCKET: m_ebSrcSocket.GetWindowText( cStr ); if ( !( bOK = VerifyEntry( uId, cStr, cStr1 ) ) ) { ::AfxMessageBox( IDS_INVALID_SOCKET_NUMBER ); } break; case IDC_AEIPX_EB_DST_NET: m_ebDstNet.GetWindowText( cStr ); if ( !( bOK = VerifyEntry( uId, cStr, cStr1 ) ) ) { ::AfxMessageBox( IDS_INVALID_NETWORK_NUMBER ); } break; case IDC_AEIPX_EB_DST_MASK: m_ebDstMask.GetWindowText( cStr ); m_ebDstNet.GetWindowText( cStr1 ); bOK = VerifyEntry( uId, cStr, cStr1 ); break; case IDC_AEIPX_EB_DST_NODE: m_ebDstNode.GetWindowText( cStr ); if ( !( bOK = VerifyEntry( uId, cStr, cStr1 ) ) ) { ::AfxMessageBox( IDS_INVALID_NODE_NUMBER ); } break; case IDC_AEIPX_EB_DST_SOCKET: m_ebDstSocket.GetWindowText( cStr ); if ( !( bOK = VerifyEntry( uId, cStr, cStr1 ) ) ) { ::AfxMessageBox( IDS_INVALID_SOCKET_NUMBER ); } break; case IDC_AEIPX_EB_PACKET_TYPE: m_ebPacketType.GetWindowText( cStr ); if ( !( bOK = VerifyEntry( uId, cStr, cStr1 ) ) ) { ::AfxMessageBox( IDS_INVALID_SERVICE_TYPE ); } break; } if ( !bOK ) { GetDlgItem( uId )-> SetFocus(); } } m_bValidate = TRUE; return bOK; } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnParentNotify // // Handles 'WM_PARENTNOTIFY' notification caused by a mouse click on the CANCEL // button //------------------------------------------------------------------------------ void CIpxAddEdit::OnParentNotify(UINT message, LPARAM lParam) { CBaseDialog::OnParentNotify(message, lParam); // // Mouse clicked on dialog. // CPoint ptButtonDown(LOWORD(lParam), HIWORD(lParam)); // // Did the user click the mouse on the cancel button? // if ( ( message == WM_LBUTTONDOWN ) && ( ChildWindowFromPoint( ptButtonDown ) == GetDlgItem(IDCANCEL) ) ) { m_bValidate = FALSE; } } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnActivateApp // // Handles 'WM_ACTIVATEAPP' notification //------------------------------------------------------------------------------ void CIpxAddEdit::OnActivateApp(BOOL bActive, HTASK hTask) { CBaseDialog::OnActivateApp(bActive, hTask); m_bValidate = bActive; } //------------------------------------------------------------------------------ // Function: CIpxAddEdit::OnQuerySession // // Handles 'WM_QUERYENDSESSION' notification //------------------------------------------------------------------------------ BOOL CIpxAddEdit::OnQueryEndSession() { if ( !CBaseDialog::OnQueryEndSession() ) { return FALSE; } // // Before ending this Windows session, // validate the dialog controls. // This is basically the code from CDialog::OnOK(); // if (!UpdateData(TRUE)) { return FALSE; } EndDialog(IDOK); return TRUE; } #define ValidHexCharSet TEXT( "1234567890abcdefABCDEF" ) //------------------------------------------------------------------------------ // Function: CIpxAddEdit::VerifyEntry // // Verifies entered data in each edit control //------------------------------------------------------------------------------ BOOL CIpxAddEdit::VerifyEntry( UINT uId, const CString& cStr, const CString& cNet ) { INT n = 0; DWORD dwNet, dwMask; // // if the value in cStr is not a mask // if ( uId != IDC_AEIPX_EB_SRC_MASK && uId != IDC_AEIPX_EB_DST_MASK ) { // // if empty string skip it. // if ( cStr.GetLength() == 0 ) { return TRUE; } // // check string has only valid hex characters // CString cTmp = cStr.SpanIncluding( (LPCTSTR) ValidHexCharSet ); return ( cTmp.GetLength() == cStr.GetLength() ); } // // the value in CStr is a mask. // // // Empty network and mask is a valid combination. // if ( cNet.GetLength() == 0 && cStr.GetLength() == 0 ) { return TRUE; } // // no network mask specified // if ( cStr.GetLength() == 0 ) { // // check if network number is valid. If it isn't // the network number check will fire, so do not // pop a box here. HACK to circumvent the KILLFOCUS // processing // CString cTmp = cNet.SpanIncluding( (LPCTSTR) ValidHexCharSet ); if ( cNet.GetLength() == cTmp.GetLength() ) { ::AfxMessageBox( IDS_ENTER_MASK ); return FALSE; } return TRUE; } // // verify mask has only hex chars. // CString cTmp = cStr.SpanIncluding( (LPCTSTR) ValidHexCharSet ); if ( cTmp.GetLength() != cStr.GetLength() ) { ::AfxMessageBox( IDS_ENTER_VALID_MASK ); return FALSE; } // // If net number is empty, return TRUE. // if ( cNet.GetLength() == 0 ) { return TRUE; } // // if net number contains invalid data, return TRUE. // Net number validation will take care of this. // cTmp = cNet.SpanIncluding( (LPCTSTR) ValidHexCharSet ); if ( cNet.GetLength() != cTmp.GetLength() ) { return TRUE; } // // verify net and mask jive // if ( ( _stscanf (cNet, TEXT("%lx%n"), &dwNet, &n) == 1 ) && ( n == cNet.GetLength() ) && ( _stscanf (cStr, TEXT("%lx%n"), &dwMask, &n) == 1 ) && ( n == cStr.GetLength() ) ) { if ( ( dwNet & dwMask ) != dwNet) { ::AfxMessageBox( (uId == IDC_AEIPX_EB_SRC_MASK) ? IDS_INVALID_SRC_MASK : IDS_INVALID_DST_MASK ); return FALSE; } } else { ::AfxMessageBox( IDS_ENTER_VALID_MASK ); return FALSE; } return TRUE; }