/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation **/ /**********************************************************************/ /* dlgroute.cpp Implementation of CDlgStaticRoutes, dialog to show the current static routes applied to this dialin client Implementation of CDlgAddRoute, dialog to create a new route to the list FILE HISTORY: */ // DlgStaticRoutes.cpp : implementation file // #include "stdafx.h" #include "helper.h" #include "rasdial.h" #include "DlgRoute.h" #include "helptable.h" #include "iastrace.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define MAX_ROUTES 256 ///////////////////////////////////////////////////////////////////////////// // CDlgStaticRoutes dialog CDlgStaticRoutes::CDlgStaticRoutes(CStrArray& Routes, CWnd* pParent /*=NULL*/) : m_strArrayRoute(Routes), CDialog(CDlgStaticRoutes::IDD, pParent) { //{{AFX_DATA_INIT(CDlgStaticRoutes) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_pNewRoute = NULL; m_dwNextRouteID = 1; } CDlgStaticRoutes::~CDlgStaticRoutes() { int count = 0; CString* pString; if(m_pNewRoute) count = m_pNewRoute->GetSize(); while(count --) { pString = m_pNewRoute->GetAt(0); m_pNewRoute->RemoveAt(0); delete pString; } delete m_pNewRoute; } void CDlgStaticRoutes::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgStaticRoutes) DDX_Control(pDX, IDC_LISTROUTES, m_ListRoutes); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDlgStaticRoutes, CDialog) //{{AFX_MSG_MAP(CDlgStaticRoutes) ON_BN_CLICKED(IDC_BUTTONDELETEROUTE, OnButtonDeleteRoute) ON_BN_CLICKED(IDC_BUTTONADDROUTE, OnButtonAddRoute) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LISTROUTES, OnItemchangedListroutes) ON_WM_CONTEXTMENU() ON_WM_HELPINFO() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDlgStaticRoutes message handlers int CDlgStaticRoutes::AllRouteEntry() { CStrArray* pRoutes; CString* pRouteString; pRoutes = m_pNewRoute; if(!pRoutes) // no new yet pRoutes = &m_strArrayRoute; int count = pRoutes->GetSize(); m_RouteIDs.RemoveAll(); m_ListRoutes.DeleteAllItems(); m_ListRoutes.SetItemCount(count); for(long i = 0; i < count; i++) { pRouteString = pRoutes->GetAt(i); ASSERT(pRouteString); IASTracePrintf("Route: %d --%s-- \n", i, *pRouteString); m_RouteIDs.Add(m_dwNextRouteID); AddRouteEntry(i, *pRouteString, m_dwNextRouteID++); } return count; } void CDlgStaticRoutes::AddRouteEntry(int i, CString& string, DWORD ID) { if(!string.GetLength()) return; CFramedRoute Route; CString strTemp; Route.SetRoute(&string); // dest Route.GetDest(strTemp); i = m_ListRoutes.InsertItem(i, (LPTSTR)(LPCTSTR)strTemp); m_ListRoutes.SetItemData(i, ID); m_ListRoutes.SetItemText(i, 0, (LPTSTR)(LPCTSTR)strTemp); IASTracePrintf("DEST: %s ", strTemp); // prefix length Route.GetMask(strTemp); m_ListRoutes.SetItemText(i, 1, (LPTSTR)(LPCTSTR)strTemp); IASTracePrintf("MASK %s ", strTemp); // metric Route.GetMetric(strTemp); m_ListRoutes.SetItemText(i, 2, (LPTSTR)(LPCTSTR)strTemp); IASTracePrintf("METRIC: %s \n", strTemp); m_ListRoutes.SetItemState(i, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); m_ListRoutes.SetFocus(); } BOOL CDlgStaticRoutes::OnInitDialog() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CDialog::OnInitDialog(); // Insert all the columns CString sDest; CString sPrefixLength; CString sMetric; try{ if(sDest.LoadString(IDS_DESTINATION) && sPrefixLength.LoadString(IDS_MASK) && sMetric.LoadString(IDS_METRIC)) { RECT rect; m_ListRoutes.GetClientRect(&rect); m_ListRoutes.InsertColumn(1, sDest, LVCFMT_LEFT, (rect.right - rect.left)* 3/8); m_ListRoutes.InsertColumn(2, sPrefixLength, LVCFMT_LEFT, (rect.right - rect.left) * 3/8); m_ListRoutes.InsertColumn(3, sMetric, LVCFMT_LEFT, (rect.right - rect.left) * 3/16); } // Insert all the items AllRouteEntry(); m_ListRoutes.SetItemCount(MAX_ROUTES); } catch(CMemoryException* pException) { pException->Delete(); TRACEAfxMessageBox(IDS_OUTOFMEMORY); } ListView_SetExtendedListViewStyle(m_ListRoutes.m_hWnd, LVS_EX_FULLROWSELECT); GetDlgItem(IDC_BUTTONDELETEROUTE)->EnableWindow(m_ListRoutes.GetSelectedCount() != 0); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDlgStaticRoutes::OnButtonDeleteRoute() { if(!m_pNewRoute) { m_pNewRoute = new CStrArray(m_strArrayRoute); if(!m_pNewRoute) { TRACEAfxMessageBox(IDS_OUTOFMEMORY); return; } } int count = m_pNewRoute->GetSize(); DWORD id; int i; int total; CString* pString; while(count--) { if(m_ListRoutes.GetItemState(count, LVIS_SELECTED)) { id = m_ListRoutes.GetItemData(count); total = m_RouteIDs.GetSize(); for(i = 0; i < total; i++) if(m_RouteIDs[i] == id) break; ASSERT(i < total); // must exist m_RouteIDs.RemoveAt(i); // from ID array pString = m_pNewRoute->GetAt(i); // from string array m_pNewRoute->RemoveAt(i); delete pString; m_ListRoutes.DeleteItem(count); } } GetDlgItem(IDC_BUTTONDELETEROUTE)->EnableWindow(m_ListRoutes.GetSelectedCount() != 0); // change focus when there is nothing to delete if(m_ListRoutes.GetSelectedCount() == 0) GotoDlgCtrl(GetDlgItem(IDC_BUTTONADDROUTE)); } void CDlgStaticRoutes::OnButtonAddRoute() { CString* pRouteStr = NULL; // it's fine not to catch, MFC function will catch it pRouteStr = new CString(); CDlgAddRoute dlg(pRouteStr, this); if(dlg.DoModal()== IDOK && pRouteStr->GetLength()) { if(!m_pNewRoute) { try{ m_pNewRoute = new CStrArray(m_strArrayRoute); } catch(CMemoryException*) { delete pRouteStr; throw; } } m_RouteIDs.Add(m_dwNextRouteID); AddRouteEntry(m_pNewRoute->GetSize(), *pRouteStr, m_dwNextRouteID++); m_pNewRoute->Add(pRouteStr); } else delete pRouteStr; } void CDlgStaticRoutes::OnOK() { if(m_pNewRoute) { // clear the existing one int count = m_strArrayRoute.GetSize(); CString* pString; while(count--) { pString = m_strArrayRoute.GetAt(0); m_strArrayRoute.RemoveAt(0); delete pString; } // copy over the new one count = m_pNewRoute->GetSize(); while(count--) { pString = m_pNewRoute->GetAt(0); m_pNewRoute->RemoveAt(0); ASSERT(pString); m_strArrayRoute.Add(pString); } } CDialog::OnOK(); } ///////////////////////////////////////////////////////////////////////////// // CDlgAddRoute dialog CDlgAddRoute::CDlgAddRoute(CString* pStr, CWnd* pParent /*=NULL*/) : CDialog(CDlgAddRoute::IDD, pParent) { //{{AFX_DATA_INIT(CDlgAddRoute) m_nMetric = MIN_METRIC; //}}AFX_DATA_INIT m_dwDest = 0xffffffff; m_dwMask = 0xffffff00; m_pStr = pStr; m_bInited = false; } void CDlgAddRoute::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgAddRoute) DDX_Control(pDX, IDC_SPINMETRIC, m_SpinMetric); DDX_Text(pDX, IDC_EDITMETRIC, m_nMetric); DDV_MinMaxUInt(pDX, m_nMetric, MIN_METRIC, MAX_METRIC); //}}AFX_DATA_MAP if(pDX->m_bSaveAndValidate) // save data to this class { // ip adress control SendDlgItemMessage(IDC_EDITDEST, IPM_GETADDRESS, 0, (LPARAM)&m_dwDest); SendDlgItemMessage(IDC_EDITMASK, IPM_GETADDRESS, 0, (LPARAM)&m_dwMask); } else // put to dialog { // ip adress control if(m_bInited) { SendDlgItemMessage(IDC_EDITDEST, IPM_SETADDRESS, 0, m_dwDest); SendDlgItemMessage(IDC_EDITMASK, IPM_SETADDRESS, 0, m_dwMask); } else { SendDlgItemMessage(IDC_EDITDEST, IPM_CLEARADDRESS, 0, m_dwDest); SendDlgItemMessage(IDC_EDITMASK, IPM_CLEARADDRESS, 0, m_dwMask); } } } BEGIN_MESSAGE_MAP(CDlgAddRoute, CDialog) //{{AFX_MSG_MAP(CDlgAddRoute) ON_WM_HELPINFO() ON_WM_CONTEXTMENU() ON_NOTIFY(IPN_FIELDCHANGED, IDC_EDITMASK, OnFieldchangedEditmask) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDlgAddRoute message handlers void CDlgAddRoute::OnOK() { // TODO: Add extra validation here if (!UpdateData(TRUE)) { IASTraceString("UpdateData failed during dialog termination."); // the UpdateData routine will set focus to correct item return; } // check to see if mask is valid -- no HOLEs DWORD mask = m_dwMask; DWORD bit = 0x80000000; DWORD nPrefixLen = 0; UINT nErrorId = 0; // find the # of 1s while ( ( bit & mask ) ) { nPrefixLen++; bit >>= 1; } if(nPrefixLen > 0 && nPrefixLen <= 32) { while(bit && ((bit & mask) == 0)) bit >>= 1; if(bit) // all bit is tested nErrorId = IDS_INVALIDMASK; } else nErrorId = IDS_INVALIDMASK; if(nErrorId) { AfxMessageBox(IDS_INVALIDMASK); GetDlgItem(IDC_EDITMASK)->SetFocus(); return; } // check if subnet address is correct / valid if((m_dwDest & m_dwMask) != m_dwDest) { CString strError, strError1; strError.LoadString(IDS_INVALIDADDR); WORD hi1, lo1; hi1 = HIWORD(m_dwDest); lo1 = LOWORD(m_dwDest); WORD hi2, lo2; hi2 = HIWORD(m_dwMask); lo2 = LOWORD(m_dwMask); WORD hi3, lo3; hi3 = HIWORD(m_dwMask & m_dwDest); lo3 = LOWORD(m_dwMask & m_dwDest); strError1.Format(strError, HIBYTE(hi1), LOBYTE(hi1), HIBYTE(lo1), LOBYTE(lo1), HIBYTE(hi2), LOBYTE(hi2), HIBYTE(lo2), LOBYTE(lo2), HIBYTE(hi3), LOBYTE(hi3), HIBYTE(lo3), LOBYTE(lo3), HIBYTE(hi3), LOBYTE(hi3), HIBYTE(lo3), LOBYTE(lo3)); if(AfxMessageBox(strError1, MB_YESNO) == IDYES) { m_dwDest = (m_dwMask & m_dwDest); UpdateData(FALSE); } GetDlgItem(IDC_EDITDEST)->SetFocus(); return; } // if everything is OK { WORD hi1, lo1; hi1 = HIWORD(m_dwDest); lo1 = LOWORD(m_dwDest); m_pStr->Format(_T("%-d.%-d.%d.%d/%-d 0.0.0.0 %-d"), HIBYTE(hi1), LOBYTE(hi1), HIBYTE(lo1), LOBYTE(lo1), nPrefixLen, m_nMetric); } EndDialog(IDOK); } BOOL CDlgStaticRoutes::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { // Trap Header control codes here HD_NOTIFY *phdn = (HD_NOTIFY *)lParam; BOOL bIsSet; BOOL bResult = SystemParametersInfo( SPI_GETDRAGFULLWINDOWS, 0, &bIsSet, 0 ); // if bIsSet == TRUE // NOTE: If the "show window contents while dragging" display // property is set multiple HDN_ITEMCHANGING and HDN_ITEMCHANGED // messages will be sent and the HDN_TRACK message will not be // sent. If this property is set the opposite will happen. // BOOL bResult = SystemParametersInfo( SPI_GETDRAGFULLWINDOWS, // 0, &bIsSet, 0 ); if bIsSet == TRUE "show window contents // while dragging" is set. switch( phdn->hdr.code ) { // Trap the HDN_TRACK message case HDN_TRACKA: case HDN_TRACKW: // See note above *pResult = 1; return( TRUE ); // return FALSE to continue tracking the divider break; // Trap the HDN_ITEMCHANGING message case HDN_ITEMCHANGINGA: case HDN_ITEMCHANGINGW: // See note above *pResult = 1; return( TRUE ); // return FALSE to allow changes break; } return CDialog::OnNotify(wParam, lParam, pResult); } BOOL CDlgAddRoute::OnInitDialog() { CDialog::OnInitDialog(); int l, h; l = max(MIN_METRIC, UD_MINVAL); h = min(MAX_METRIC, UD_MAXVAL); m_SpinMetric.SetRange(l, h); m_bInited = true; return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDlgStaticRoutes::OnItemchangedListroutes(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; GetDlgItem(IDC_BUTTONDELETEROUTE)->EnableWindow(m_ListRoutes.GetSelectedCount() != 0); *pResult = 0; } BOOL CDlgAddRoute::OnHelpInfo(HELPINFO* pHelpInfo) { ::WinHelp ((HWND)pHelpInfo->hItemHandle, AfxGetApp()->m_pszHelpFilePath, HELP_WM_HELP, (DWORD_PTR)(LPVOID)g_aHelpIDs_IDD_ADDROUTE); return CDialog::OnHelpInfo(pHelpInfo); } void CDlgAddRoute::OnContextMenu(CWnd* pWnd, CPoint point) { ::WinHelp (pWnd->m_hWnd, AfxGetApp()->m_pszHelpFilePath, HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)g_aHelpIDs_IDD_ADDROUTE); } void CDlgStaticRoutes::OnContextMenu(CWnd* pWnd, CPoint point) { ::WinHelp (pWnd->m_hWnd, AfxGetApp()->m_pszHelpFilePath, HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)g_aHelpIDs_IDD_STATICROUTES); } BOOL CDlgStaticRoutes::OnHelpInfo(HELPINFO* pHelpInfo) { ::WinHelp ((HWND)pHelpInfo->hItemHandle, AfxGetApp()->m_pszHelpFilePath, HELP_WM_HELP, (DWORD_PTR)(LPVOID)g_aHelpIDs_IDD_STATICROUTES); return CDialog::OnHelpInfo(pHelpInfo); } void CDlgAddRoute::OnFieldchangedEditmask(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here LPNMIPADDRESS pNMIpAdd = (LPNMIPADDRESS)pNMHDR; CWnd* pIPA = GetDlgItem(IDC_EDITMASK); BYTE F[4]; DWORD address; pIPA->SendMessage(IPM_GETADDRESS, 0, (LPARAM)&address); F[0] = FIRST_IPADDRESS((LPARAM)address); F[1] = SECOND_IPADDRESS((LPARAM)address); F[2] = THIRD_IPADDRESS((LPARAM)address); F[3] = FOURTH_IPADDRESS((LPARAM)address); if(pNMIpAdd->iValue == 255) { for ( int i = 0; i < pNMIpAdd->iField; i++) { F[i] = 255; } address = MAKEIPADDRESS(F[0], F[1], F[2], F[3]); pIPA->SendMessage(IPM_SETADDRESS, 0, (LPARAM)address); } *pResult = 0; }