//----------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: A R P S D L G . C P P // // Contents: CArpsPage declaration // // Notes: // // Author: tongl 2 Feb 1998 // //----------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "arpsobj.h" #include "arpsdlg.h" #include "ncatlui.h" #include "ncstl.h" //#include "ncui.h" //#include "resource.h" #include "atmcommon.h" #include "atmhelp.h" // // CArpsPage // CArpsPage::CArpsPage(CArpsCfg * pArpscfg, const DWORD * adwHelpIDs) { Assert(pArpscfg); m_pArpscfg = pArpscfg; m_adwHelpIDs = adwHelpIDs; m_pAdapterInfo = pArpscfg->GetSecondMemoryAdapterInfo(); m_fEditState = FALSE; m_fModified = FALSE; } CArpsPage::~CArpsPage() { } LRESULT CArpsPage::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { RECT rect; LV_COLUMN lvCol = {0}; // list view column structure // initialize registered atm address list view ::GetClientRect(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), &rect); lvCol.mask = LVCF_FMT | LVCF_WIDTH; lvCol.fmt = LVCFMT_LEFT; lvCol.cx = rect.right; ListView_InsertColumn(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), 0, &lvCol); // initialize report view of multicast address list view int index, iNewItem; // Calculate column width ::GetClientRect(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), &rect); int colWidth = (rect.right/c_nColumns); // The mask specifies that the fmt, width and pszText members // of the structure are valid lvCol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT ; lvCol.fmt = LVCFMT_LEFT; // left-align column lvCol.cx = colWidth; // width of column in pixels // Add the two columns and header text. for (index = 0; index < c_nColumns; index++) { // column header text if (0 == index) // first column { lvCol.pszText = (PWSTR) SzLoadIds(IDS_IPADDRESS_FROM); } else { lvCol.pszText = (PWSTR) SzLoadIds(IDS_IPADDRESS_TO); } iNewItem = ListView_InsertColumn(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), index, &lvCol); AssertSz((iNewItem == index), "Invalid item inserted to list view !"); } m_hRegAddrs.m_hListView = GetDlgItem(IDC_LVW_ARPS_REG_ADDR); m_hRegAddrs.m_hAdd = GetDlgItem(IDC_PSH_ARPS_REG_ADD); m_hRegAddrs.m_hEdit = GetDlgItem(IDC_PSH_ARPS_REG_EDT); m_hRegAddrs.m_hRemove = GetDlgItem(IDC_PSH_ARPS_REG_RMV); m_hMulAddrs.m_hListView = GetDlgItem(IDC_LVW_ARPS_MUL_ADDR); m_hMulAddrs.m_hAdd = GetDlgItem(IDC_PSH_ARPS_MUL_ADD); m_hMulAddrs.m_hEdit = GetDlgItem(IDC_PSH_ARPS_MUL_EDT); m_hMulAddrs.m_hRemove = GetDlgItem(IDC_PSH_ARPS_MUL_RMV); // do this last SetRegisteredAtmAddrInfo(); SetMulticastIpAddrInfo(); return 0; } LRESULT CArpsPage::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs); return 0; } LRESULT CArpsPage::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { LPHELPINFO lphi = reinterpret_cast(lParam); Assert(lphi); if (HELPINFO_WINDOW == lphi->iContextType) { ShowContextHelp(static_cast(lphi->hItemHandle), HELP_WM_HELP, m_adwHelpIDs); } return 0; } LRESULT CArpsPage::OnActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { return 0; } LRESULT CArpsPage::OnKillActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { BOOL err = FALSE; // Update the in memory with what's in the UI UpdateInfo(); // Check duplicate ATM address int iDupRegAddr = CheckDupRegAddr(); if (iDupRegAddr >=0) { NcMsgBox(m_hWnd, IDS_MSFT_ARPS_TEXT, IDS_DUPLICATE_REG_ADDR, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); ListView_SetItemState(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), iDupRegAddr, LVIS_SELECTED, LVIS_SELECTED); err = TRUE; } // Check overlapped IP address range if (!err) { int iOverlappedIpRange = CheckOverlappedIpRange(); if (iOverlappedIpRange >=0) { NcMsgBox(m_hWnd, IDS_MSFT_ARPS_TEXT, IDS_OVERLAP_MUL_ADDR, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); ListView_SetItemState(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), iOverlappedIpRange, LVIS_SELECTED, LVIS_SELECTED); err = TRUE; } } ::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, err); return err; } LRESULT CArpsPage::OnItemChanged(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) { NM_LISTVIEW * pnmlv = reinterpret_cast(pnmh); Assert(pnmlv); // Reset the buttons based on the changed selection if (idCtrl == IDC_LVW_ARPS_REG_ADDR) { SetButtons(m_hRegAddrs); } else if (idCtrl == IDC_LVW_ARPS_MUL_ADDR) { SetButtons(m_hMulAddrs); } return 0; } int CArpsPage::CheckDupRegAddr() { int ret = -1; int idx = 0; for(VECSTR::iterator iterAtmAddr = m_pAdapterInfo->m_vstrRegisteredAtmAddrs.begin(); iterAtmAddr != m_pAdapterInfo->m_vstrRegisteredAtmAddrs.end(); iterAtmAddr ++) { VECSTR::iterator iterAtmAddrComp = iterAtmAddr; iterAtmAddrComp ++; while (iterAtmAddrComp != m_pAdapterInfo->m_vstrRegisteredAtmAddrs.end()) { if (**iterAtmAddr == **iterAtmAddrComp) { // we find a duplicate address ret = idx; break; } iterAtmAddrComp++; } // duplicate address found if (ret >=0 ) { break; } // move next idx ++; } return ret; } int CArpsPage::CheckOverlappedIpRange() { int ret = -1; int idx = 0; for(VECSTR::iterator iterIpRange = m_pAdapterInfo->m_vstrMulticastIpAddrs.begin(); iterIpRange != m_pAdapterInfo->m_vstrMulticastIpAddrs.end(); iterIpRange ++) { tstring strUpperIp; GetUpperIp( **iterIpRange, &strUpperIp); VECSTR::iterator iterIpRangeComp = iterIpRange; iterIpRangeComp ++; while (iterIpRangeComp != m_pAdapterInfo->m_vstrMulticastIpAddrs.end()) { tstring strLowerIpComp; GetLowerIp( **iterIpRangeComp, &strLowerIpComp); if (strUpperIp >= strLowerIpComp) { // we find an overlapped range ret = idx; break; } iterIpRangeComp++; } // duplicate address found if (ret >=0 ) { break; } // move next idx ++; } return ret; } LRESULT CArpsPage::OnApply(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { BOOL nResult = PSNRET_NOERROR; if (!IsModified()) { ::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, nResult); return nResult; } m_pArpscfg->SetSecondMemoryModified(); SetModifiedTo(FALSE); // this page is no longer modified ::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, nResult); return nResult; } LRESULT CArpsPage::OnCancel(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { return 0; } LRESULT CArpsPage::OnAddRegisteredAddr(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { m_fEditState = FALSE; CAtmAddrDlg * pDlgAddr = new CAtmAddrDlg(this, g_aHelpIDs_IDD_ARPS_REG_ADDR); if (pDlgAddr == NULL) { return(ERROR_NOT_ENOUGH_MEMORY); } pDlgAddr->m_strNewAtmAddr = m_strRemovedAtmAddr; // See if the address is added if (pDlgAddr->DoModal() == IDOK) { int nCount = ListView_GetItemCount(GetDlgItem(IDC_LVW_ARPS_REG_ADDR)); // insert the new item at the end of list LV_ITEM lvItem; lvItem.mask = LVIF_TEXT; lvItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED; lvItem.state = 0; lvItem.iItem=nCount; lvItem.iSubItem=0; lvItem.pszText= (PWSTR)(m_strRemovedAtmAddr.c_str()); int ret = ListView_InsertItem(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), &lvItem); // empty strings, this removes the saved address from RemoveAtmAddr m_strRemovedAtmAddr = c_szEmpty; SetButtons(m_hRegAddrs); PageModified(); } delete pDlgAddr; return 0; } LRESULT CArpsPage::OnEditRegisteredAddr(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { m_fEditState = TRUE; CAtmAddrDlg * pDlgAddr = new CAtmAddrDlg(this, g_aHelpIDs_IDD_ARPS_REG_ADDR); if (pDlgAddr == NULL) { return(ERROR_NOT_ENOUGH_MEMORY); } // get the user selection int itemSelected = ListView_GetNextItem(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), -1, LVNI_SELECTED); if (itemSelected != -1) { WCHAR buf[MAX_ATM_ADDRESS_LENGTH+1]; // save off the removed address LV_ITEM lvItem; lvItem.mask = LVIF_TEXT; lvItem.iItem = itemSelected; lvItem.iSubItem = 0; lvItem.pszText = buf; lvItem.cchTextMax = celems(buf); ListView_GetItem(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), &lvItem); pDlgAddr->m_strNewAtmAddr = buf; // See if the address is edited & address changed if ((pDlgAddr->DoModal() == IDOK) && (m_strRemovedAtmAddr != buf)) { // delete the old address ListView_DeleteItem(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), itemSelected); // replace the item with the new address lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.lParam =0; lvItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED; lvItem.state = 0; lvItem.iItem=itemSelected; lvItem.iSubItem=0; lvItem.pszText= (PWSTR)(m_strRemovedAtmAddr.c_str()); ListView_InsertItem(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), &lvItem); PageModified(); } } else // no current selection { NcMsgBox(::GetActiveWindow(), IDS_MSFT_ARPS_TEXT, IDS_NO_ITEM_SELECTED, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); } // don't save this registered address m_strRemovedAtmAddr = c_szEmpty; delete pDlgAddr; return 0; } LRESULT CArpsPage::OnRemoveRegisteredAddr(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { // get the current selected item and remove it int itemSelected = ListView_GetNextItem(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), -1, LVNI_SELECTED); if (itemSelected != -1) { WCHAR buf[MAX_ATM_ADDRESS_LENGTH+1]; LV_ITEM lvItem; lvItem.mask = LVIF_TEXT; lvItem.pszText = buf; lvItem.cchTextMax = celems(buf); // save off the removed address and delete it from the listview lvItem.iItem = itemSelected; lvItem.iSubItem = 0; ListView_GetItem(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), &lvItem); m_strRemovedAtmAddr = buf; ListView_DeleteItem(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), itemSelected); SetButtons(m_hRegAddrs); PageModified(); } else { NcMsgBox(::GetActiveWindow(), IDS_MSFT_ARPS_TEXT, IDS_NO_ITEM_SELECTED, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); } return 0; } LRESULT CArpsPage::OnAddMulticastAddr(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { m_fEditState = FALSE; CIpAddrRangeDlg * pDlgAddr = new CIpAddrRangeDlg(this, g_aHelpIDs_IDD_ARPS_MUL_ADDR); if (pDlgAddr == NULL) { return(ERROR_NOT_ENOUGH_MEMORY); } pDlgAddr->m_strNewIpRange = m_strRemovedIpRange; // See if the address is added if (pDlgAddr->DoModal() == IDOK) { LvInsertIpRangeInOrder(pDlgAddr->m_strNewIpRange); // empty strings, this removes the saved address from RemoveIP pDlgAddr->m_strNewIpRange = c_szEmpty; SetButtons(m_hMulAddrs); PageModified(); } m_strRemovedIpRange = pDlgAddr->m_strNewIpRange; delete pDlgAddr; return 0; } LRESULT CArpsPage::OnEditMulticastAddr(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { m_fEditState = TRUE; CIpAddrRangeDlg * pDlgAddr = new CIpAddrRangeDlg(this, g_aHelpIDs_IDD_ARPS_MUL_ADDR); if (pDlgAddr == NULL) { return(ERROR_NOT_ENOUGH_MEMORY); } // get the user selection int itemSelected = ListView_GetNextItem(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), -1, LVNI_SELECTED); if (itemSelected != -1) { WCHAR szBuf[IPRANGE_LIMIT]; // save off the removed address and delete it from the listview LV_ITEM lvItem; lvItem.mask = LVIF_TEXT; // lower ip lvItem.iItem = itemSelected; lvItem.iSubItem = 0; lvItem.pszText = szBuf; lvItem.cchTextMax = celems(szBuf); ListView_GetItem(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), &lvItem); pDlgAddr->m_strNewIpRange = szBuf; pDlgAddr->m_strNewIpRange += c_chSeparator; // upper ip lvItem.iItem = itemSelected; lvItem.iSubItem = 1; lvItem.pszText = szBuf; lvItem.cchTextMax = celems(szBuf); ListView_GetItem(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), &lvItem); pDlgAddr->m_strNewIpRange += szBuf; // See if the address is edited & address changed if ((pDlgAddr->DoModal() == IDOK) && (pDlgAddr->m_strNewIpRange != szBuf)) { // delete the old address ListView_DeleteItem(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), itemSelected); // insert new one LvInsertIpRangeInOrder(pDlgAddr->m_strNewIpRange); // empty strings, this removes the saved address from RemoveIP pDlgAddr->m_strNewIpRange = c_szEmpty; PageModified(); } } else // no current selection { NcMsgBox(::GetActiveWindow(), IDS_MSFT_ARPS_TEXT, IDS_NO_ITEM_SELECTED, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); } // don't save this IP range m_strRemovedIpRange = c_szEmpty; delete pDlgAddr; return 0; } void CArpsPage::LvInsertIpRangeInOrder(tstring& strNewIpRange) { tstring strLowerIp; GetLowerIp(strNewIpRange, &strLowerIp); int nCount = ListView_GetItemCount(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR)); // find the index to insert the new item LV_ITEM lvItem; lvItem.mask = LVIF_TEXT; WCHAR buf[IPRANGE_LIMIT]; lvItem.pszText = buf; lvItem.cchTextMax = celems(buf); for (int iItem =0; iItem m_vstrRegisteredAtmAddrs.begin(); iterAtmAddr != m_pAdapterInfo->m_vstrRegisteredAtmAddrs.end(); iterAtmAddr ++) { if ((**iterAtmAddr) == c_szEmpty) { continue; } lvItem.iItem=iItem; lvItem.iSubItem=0; lvItem.pszText=(PWSTR)((*iterAtmAddr)->c_str()); lvItem.cchTextMax = celems((*iterAtmAddr)->c_str()); int ret = ListView_InsertItem(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), &lvItem); iItem++; } // now set the button states SetButtons(m_hRegAddrs); } void CArpsPage::SetMulticastIpAddrInfo() { BOOL ret = ListView_DeleteAllItems(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR)); Assert(ret); LV_ITEM lvItem; lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.lParam =0; lvItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED; lvItem.state = 0; int iItem =0; tstring strIpLower; tstring strIpUpper; for (VECSTR::iterator iterIpAddrRange = m_pAdapterInfo->m_vstrMulticastIpAddrs.begin(); iterIpAddrRange != m_pAdapterInfo->m_vstrMulticastIpAddrs.end(); iterIpAddrRange ++) { if ((**iterIpAddrRange) == c_szEmpty) { continue; } GetLowerIp((**iterIpAddrRange), &strIpLower); GetUpperIp((**iterIpAddrRange), &strIpUpper); // Add the lower IP address lvItem.iItem=iItem; lvItem.iSubItem=0; lvItem.pszText=(PWSTR)(strIpLower.c_str()); SendDlgItemMessage(IDC_LVW_ARPS_MUL_ADDR, LVM_INSERTITEM, iItem, (LPARAM)&lvItem); // Add the upper IP address lvItem.iItem=iItem; lvItem.iSubItem=1; lvItem.pszText=(PWSTR)(strIpUpper.c_str()); // sub-item can not be inserted by ListView_InsertItem SendDlgItemMessage(IDC_LVW_ARPS_MUL_ADDR, LVM_SETITEMTEXT, iItem, (LPARAM)&lvItem); iItem++; } SetButtons(m_hMulAddrs); } void CArpsPage::SetButtons(HandleGroup& handles) { INT iSelected = ListView_GetNextItem(handles.m_hListView, -1, LVNI_SELECTED); if (iSelected == -1) // Nothing selected or list empty { ::EnableWindow(handles.m_hEdit, FALSE); ::EnableWindow(handles.m_hRemove, FALSE); ::SetFocus(handles.m_hListView); } else { ::EnableWindow(handles.m_hEdit, TRUE); ::EnableWindow(handles.m_hRemove, TRUE); } } void CArpsPage::UpdateInfo() { int i; // Update Registered ATM address FreeCollectionAndItem(m_pAdapterInfo->m_vstrRegisteredAtmAddrs); int nCount = ListView_GetItemCount(GetDlgItem(IDC_LVW_ARPS_REG_ADDR)); WCHAR szAtmAddr[MAX_ATM_ADDRESS_LENGTH+1]; LV_ITEM lvItem; lvItem.mask = LVIF_TEXT; for (i=0; i< nCount; i++) { lvItem.iItem = i; lvItem.iSubItem = 0; lvItem.pszText = szAtmAddr; lvItem.cchTextMax = celems(szAtmAddr); ListView_GetItem(GetDlgItem(IDC_LVW_ARPS_REG_ADDR), &lvItem); m_pAdapterInfo->m_vstrRegisteredAtmAddrs.push_back(new tstring(szAtmAddr)); } // Update Multicast IP address FreeCollectionAndItem(m_pAdapterInfo->m_vstrMulticastIpAddrs); nCount = ListView_GetItemCount(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR)); WCHAR szBuf[IPRANGE_LIMIT]; tstring strIpRange; for (i=0; i< nCount; i++) { LV_ITEM lvItem; lvItem.mask = LVIF_TEXT; // lower ip lvItem.iItem = i; lvItem.iSubItem = 0; lvItem.pszText = szBuf; lvItem.cchTextMax = celems(szBuf); ListView_GetItem(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), &lvItem); strIpRange = szBuf; strIpRange += c_chSeparator; // upper ip lvItem.iItem = i; lvItem.iSubItem = 1; lvItem.pszText = szBuf; lvItem.cchTextMax = celems(szBuf); ListView_GetItem(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), &lvItem); strIpRange += szBuf; m_pAdapterInfo->m_vstrMulticastIpAddrs.push_back(new tstring(strIpRange.c_str())); } } // // CAtmAddrDlg // CAtmAddrDlg::CAtmAddrDlg(CArpsPage * pAtmArpsPage, const DWORD* adwHelpIDs) { m_pParentDlg = pAtmArpsPage; m_adwHelpIDs = adwHelpIDs; m_hOkButton = 0; } LRESULT CAtmAddrDlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { // change the "Ok" button to "Add" if we are not editing if (FALSE == m_pParentDlg->m_fEditState) { SetDlgItemText(IDOK, L"Add"); } // Set the position of the pop up dialog to be right over the listbox // on parent dialog RECT rect; HWND hwndList = m_pParentDlg->m_hRegAddrs.m_hListView; Assert(hwndList); ::GetWindowRect(hwndList, &rect); SetWindowPos(NULL, rect.left, rect.top, 0,0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); // Save handles to the "Ok" button and the edit box m_hOkButton = GetDlgItem(IDOK); m_hEditBox = GetDlgItem(IDC_EDT_ARPS_REG_Address); // ATM addresses have a 40 character limit + separaters ::SendMessage(m_hEditBox, EM_SETLIMITTEXT, MAX_ATM_ADDRESS_LENGTH + (MAX_ATM_ADDRESS_LENGTH / 2), 0); // add the address that was just removed if (m_strNewAtmAddr.size()) { ::SetWindowText(m_hEditBox, m_strNewAtmAddr.c_str()); ::SendMessage(m_hEditBox, EM_SETSEL, 0, -1); ::EnableWindow(m_hOkButton, TRUE); } else { ::EnableWindow(m_hOkButton, FALSE); } ::SetFocus(m_hEditBox); return 0; } LRESULT CAtmAddrDlg::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs); return 0; } LRESULT CAtmAddrDlg::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { LPHELPINFO lphi = reinterpret_cast(lParam); Assert(lphi); if (HELPINFO_WINDOW == lphi->iContextType) { ShowContextHelp(static_cast(lphi->hItemHandle), HELP_WM_HELP, m_adwHelpIDs); } return 0; } LRESULT CAtmAddrDlg::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { WCHAR szAtmAddress[MAX_ATM_ADDRESS_LENGTH+1]; // Get the current address from the control and // add them to the adapter if valid ::GetWindowText(m_hEditBox, szAtmAddress, MAX_ATM_ADDRESS_LENGTH+1); int i, nId; if (! FIsValidAtmAddress(szAtmAddress, &i, &nId)) { // If invalid ATM address, we pop up a message box and set focus // back to the edit box // REVIEW(tongl): report first invalid character in mesg box NcMsgBox(m_hWnd, IDS_MSFT_ARPS_TEXT, IDS_INVALID_ATM_ADDRESS, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); ::SetFocus(GetDlgItem(IDC_EDT_ARPS_REG_Address)); return 0; } if (m_pParentDlg->m_fEditState == FALSE) // Add new address { m_pParentDlg->m_strRemovedAtmAddr = szAtmAddress; } else // if edit, see if string is having a diferent value now { if (m_pParentDlg->m_strRemovedAtmAddr != szAtmAddress) { m_pParentDlg->m_strRemovedAtmAddr = szAtmAddress; // update save addresses } else { EndDialog(IDCANCEL); } } EndDialog(IDOK); return 0; } LRESULT CAtmAddrDlg::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { EndDialog(IDCANCEL); return 0; } LRESULT CAtmAddrDlg::OnChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { WCHAR buf[2]; // Enable or disable the "Ok" button // based on whether the edit box is empty if (::GetWindowText(m_hEditBox, buf, celems(buf)) == 0) { ::EnableWindow(m_hOkButton, FALSE); } else { ::EnableWindow(m_hOkButton, TRUE); } return 0; } // // CIpAddrRangeDlg // CIpAddrRangeDlg::CIpAddrRangeDlg( CArpsPage * pAtmArpsPage, const DWORD* adwHelpIDs) { m_pParentDlg = pAtmArpsPage; m_hOkButton = 0; m_adwHelpIDs = adwHelpIDs; } LRESULT CIpAddrRangeDlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { // change the ok button to add if we are not editing if (FALSE == m_pParentDlg->m_fEditState) { SetDlgItemText(IDOK, L"Add"); } // Set the position of the pop up dialog to be right over the listbox // on parent dialog RECT rect; HWND hwndList = m_pParentDlg->m_hMulAddrs.m_hListView; Assert(hwndList); ::GetWindowRect(hwndList, &rect); SetWindowPos(NULL, rect.left, rect.top, 0,0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); // Save handles to the "Ok" button and the edit box m_hOkButton = GetDlgItem(IDOK); // create ip controls m_ipLower.Create(m_hWnd,IDC_ARPS_MUL_LOWER_IP); m_ipUpper.Create(m_hWnd,IDC_ARPS_MUL_UPPER_IP); // add the address that was just removed if (m_strNewIpRange.size()) { GetLowerIp(m_strNewIpRange, &m_strNewIpLower); GetUpperIp(m_strNewIpRange, &m_strNewIpUpper); Assert(m_strNewIpLower.size()>0); Assert(m_strNewIpUpper.size()>0); m_ipLower.SetAddress(m_strNewIpLower.c_str()); m_ipUpper.SetAddress(m_strNewIpUpper.c_str()); ::EnableWindow(m_hOkButton, TRUE); } else { m_strNewIpLower = c_szEmpty; m_strNewIpUpper = c_szEmpty; // the ip and subnet are blank, so there's nothing to save ::EnableWindow(m_hOkButton, FALSE); } return 0; } LRESULT CIpAddrRangeDlg::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs); return 0; } LRESULT CIpAddrRangeDlg::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { LPHELPINFO lphi = reinterpret_cast(lParam); Assert(lphi); if (HELPINFO_WINDOW == lphi->iContextType) { ShowContextHelp(static_cast(lphi->hItemHandle), HELP_WM_HELP, m_adwHelpIDs); } return 0; } LRESULT CIpAddrRangeDlg::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { tstring strIpLower; tstring strIpUpper; // Get the current address from the control and add them to the adapter if valid m_ipLower.GetAddress(&strIpLower); m_ipUpper.GetAddress(&strIpUpper); if (!IsValidIpRange(strIpLower, strIpUpper)) { NcMsgBox(::GetActiveWindow(), IDS_MSFT_ARPS_TEXT, IDS_INCORRECT_IPRANGE, MB_APPLMODAL | MB_ICONSTOP | MB_OK); ::SetFocus(m_ipLower); return 0; } if (m_pParentDlg->m_fEditState == FALSE) // when adding a new range { // Get the current address from the control and add them to the adapter if valid MakeIpRange(strIpLower, strIpUpper, &m_strNewIpRange); EndDialog(IDOK); } else // if editing an existing range { if ((strIpLower != m_strNewIpLower)||(strIpUpper != m_strNewIpUpper)) { MakeIpRange(strIpLower, strIpUpper, &m_strNewIpRange); EndDialog(IDOK); } else { // no change EndDialog(IDCANCEL); } } EndDialog(IDOK); return 0; } LRESULT CIpAddrRangeDlg::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { EndDialog(IDCANCEL); return 0; } LRESULT CIpAddrRangeDlg::OnChangeLowerIp(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case EN_CHANGE: if (m_ipLower.IsBlank() || m_ipUpper.IsBlank()) { ::EnableWindow(m_hOkButton, FALSE); } else { ::EnableWindow(m_hOkButton, TRUE); } break; default: break; } return 0; } LRESULT CIpAddrRangeDlg::OnChangeUpperIp(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case EN_CHANGE: if (m_ipLower.IsBlank() || m_ipUpper.IsBlank()) { ::EnableWindow(m_hOkButton, FALSE); } else { ::EnableWindow(m_hOkButton, TRUE); } break; default: break; } return 0; } LRESULT CIpAddrRangeDlg::OnIpFieldChange(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { return 0; }