mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1145 lines
30 KiB
1145 lines
30 KiB
//-----------------------------------------------------------------------
|
|
//
|
|
// 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<LPHELPINFO>(lParam);
|
|
Assert(lphi);
|
|
|
|
if (HELPINFO_WINDOW == lphi->iContextType)
|
|
{
|
|
ShowContextHelp(static_cast<HWND>(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<NM_LISTVIEW *>(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 <nCount; iItem++)
|
|
{
|
|
lvItem.iItem = iItem;
|
|
lvItem.iSubItem = 0;
|
|
ListView_GetItem(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), &lvItem);
|
|
|
|
Assert(buf);
|
|
|
|
if (strLowerIp < buf)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
lvItem.mask = LVIF_TEXT | LVIF_PARAM;
|
|
lvItem.lParam =0;
|
|
lvItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
|
|
lvItem.state = 0;
|
|
|
|
// lower IP address
|
|
lvItem.iItem=iItem;
|
|
lvItem.iSubItem=0;
|
|
lvItem.pszText= (PWSTR)(strLowerIp.c_str());
|
|
SendDlgItemMessage(IDC_LVW_ARPS_MUL_ADDR, LVM_INSERTITEM, 0, (LPARAM)&lvItem);
|
|
|
|
// upper IP address
|
|
tstring strUpperIp;
|
|
GetUpperIp(strNewIpRange, &strUpperIp);
|
|
|
|
lvItem.iItem=iItem;
|
|
lvItem.iSubItem=1;
|
|
lvItem.pszText= (PWSTR)(strUpperIp.c_str());
|
|
SendDlgItemMessage(IDC_LVW_ARPS_MUL_ADDR, LVM_SETITEMTEXT, iItem, (LPARAM)&lvItem);
|
|
}
|
|
|
|
LRESULT CArpsPage::OnRemoveMulticastAddr(WORD wNotifyCode, WORD wID,
|
|
HWND hWndCtl, BOOL& fHandled)
|
|
{
|
|
// get the current selected item and remove it
|
|
int itemSelected = ListView_GetNextItem(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), -1,
|
|
LVNI_SELECTED);
|
|
|
|
if (itemSelected != -1)
|
|
{
|
|
WCHAR szBuf[IPRANGE_LIMIT];
|
|
|
|
LV_ITEM lvItem;
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.pszText = szBuf;
|
|
lvItem.cchTextMax = celems(szBuf);
|
|
|
|
// save off the removed address
|
|
// lower ip
|
|
lvItem.iItem = itemSelected;
|
|
lvItem.iSubItem = 0;
|
|
lvItem.cchTextMax = celems(szBuf);
|
|
ListView_GetItem(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), &lvItem);
|
|
|
|
m_strRemovedIpRange = szBuf;
|
|
m_strRemovedIpRange += 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);
|
|
|
|
m_strRemovedIpRange += szBuf;
|
|
|
|
// delete it from the list view
|
|
ListView_DeleteItem(GetDlgItem(IDC_LVW_ARPS_MUL_ADDR), itemSelected);
|
|
|
|
SetButtons(m_hMulAddrs);
|
|
|
|
PageModified();
|
|
}
|
|
else
|
|
{
|
|
NcMsgBox(::GetActiveWindow(), IDS_MSFT_ARPS_TEXT,
|
|
IDS_NO_ITEM_SELECTED,
|
|
MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CArpsPage::SetRegisteredAtmAddrInfo()
|
|
{
|
|
BOOL ret = ListView_DeleteAllItems(GetDlgItem(IDC_LVW_ARPS_REG_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;
|
|
|
|
for (VECSTR::iterator iterAtmAddr = m_pAdapterInfo->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<LPHELPINFO>(lParam);
|
|
Assert(lphi);
|
|
|
|
if (HELPINFO_WINDOW == lphi->iContextType)
|
|
{
|
|
ShowContextHelp(static_cast<HWND>(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<LPHELPINFO>(lParam);
|
|
Assert(lphi);
|
|
|
|
if (HELPINFO_WINDOW == lphi->iContextType)
|
|
{
|
|
ShowContextHelp(static_cast<HWND>(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;
|
|
}
|
|
|
|
|