|
|
//-----------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: D L G F I L T. C P P
//
// Contents: Implementation of CFilteringDialog and CAddFilterDialog
//
// Notes: CFilterDialog is the TCP/IP filtering dialog
//
// Author: tongl 6 Sept 1998
//-----------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "tcpipobj.h"
#include "ncatlui.h"
#include "ncstl.h"
#include "resource.h"
#include "tcphelp.h"
#include "tcpmacro.h"
#include "tcputil.h"
#include "dlgopt.h"
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { unsigned long a = (unsigned long)lParam1; unsigned long b = (unsigned long)lParam2;
if (a < b) return -1;
return a != b; }
//
// CFilterDialog
//
CFilterDialog::CFilterDialog(CTcpOptionsPage * pOptionsPage, GLOBAL_INFO * pGlbDlg, ADAPTER_INFO * pAdapterDlg, const DWORD* adwHelpIDs) { Assert(pOptionsPage != NULL); Assert(pGlbDlg != NULL); Assert(pAdapterDlg != NULL);
m_pParentDlg = pOptionsPage; m_pGlobalInfo = pGlbDlg; m_pAdapterInfo = pAdapterDlg; m_adwHelpIDs = adwHelpIDs;
m_fModified = FALSE; }
CFilterDialog::~CFilterDialog() { }
LRESULT CFilterDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { m_hlistTcp = GetDlgItem(IDC_FILTERING_TCP); m_hlistUdp = GetDlgItem(IDC_FILTERING_UDP); m_hlistIp = GetDlgItem(IDC_FILTERING_IP);
// Label columns in the listviews
LV_COLUMN lvCol; RECT rect; int iNewCol;
lvCol.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; lvCol.fmt = LVCFMT_LEFT;
// TCP ports
::GetClientRect(m_hlistTcp, &rect); lvCol.pszText = (PWSTR)SzLoadIds(IDS_FILTERING_TCP_LABEL); lvCol.cx = rect.right; iNewCol = ListView_InsertColumn(m_hlistTcp, 0, &lvCol); Assert(iNewCol == 0);
// UDP ports
::GetClientRect(m_hlistUdp, &rect); lvCol.pszText = (PWSTR)SzLoadIds(IDS_FILTERING_UDP_LABEL); lvCol.cx = rect.right; iNewCol = ListView_InsertColumn(m_hlistUdp, 0, &lvCol); Assert(iNewCol == 0);
// IP protocols
::GetClientRect(m_hlistIp, &rect); lvCol.pszText = (PWSTR)SzLoadIds(IDS_FILTERING_IP_LABEL); lvCol.cx = rect.right; iNewCol = ListView_InsertColumn(m_hlistIp, 0, &lvCol); Assert(iNewCol == 0);
SetInfo(); SetButtons();
m_fModified = FALSE; return 0; }
LRESULT CFilterDialog::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs); return 0; }
LRESULT CFilterDialog::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 CFilterDialog::OnEnableFiltering( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case BN_CLICKED: case BN_DOUBLECLICKED:
m_fModified = TRUE;
if (m_pGlobalInfo->m_fEnableFiltering) // if Filtering was enabled
{ // disable filtering
NcMsgBox(::GetActiveWindow(), IDS_MSFT_TCP_TEXT, IDS_FILTERING_DISABLE, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
m_pGlobalInfo->m_fEnableFiltering = FALSE; } else { m_pGlobalInfo->m_fEnableFiltering = TRUE; } }
return 0; }
LRESULT CFilterDialog::OnTcpPermit( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { m_fModified = TRUE;
// check "Enable Filtering"
CheckDlgButton(IDC_FILTERING_ENABLE, TRUE); m_pGlobalInfo->m_fEnableFiltering = TRUE;
EnableGroup(wID, !IsDlgButtonChecked(IDC_FILTERING_FILTER_TCP)); SetButtons();
return 0; }
LRESULT CFilterDialog::OnUdpPermit(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { m_fModified = TRUE;
// check "Enable Filtering"
CheckDlgButton(IDC_FILTERING_ENABLE, TRUE); m_pGlobalInfo->m_fEnableFiltering = TRUE;
EnableGroup(wID, !IsDlgButtonChecked(IDC_FILTERING_FILTER_UDP)); SetButtons();
return 0; }
LRESULT CFilterDialog::OnIpPermit(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { m_fModified = TRUE;
// check "Enable Filtering"
CheckDlgButton(IDC_FILTERING_ENABLE, TRUE); m_pGlobalInfo->m_fEnableFiltering = TRUE;
EnableGroup(wID, !IsDlgButtonChecked(IDC_FILTERING_FILTER_IP)); SetButtons();
return 0; }
LRESULT CFilterDialog::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { if (m_fModified) { m_pParentDlg->m_fPropDlgModified = TRUE; UpdateInfo(); }
EndDialog(IDOK); return 0; }
LRESULT CFilterDialog::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { m_fModified = FALSE; EndDialog(IDCANCEL);
return 0; }
LRESULT CFilterDialog::OnAdd(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { CAddFilterDialog * pDlgAddFilter = new CAddFilterDialog(this, wID, g_aHelpIDs_IDD_FILTER_ADD); if (pDlgAddFilter == NULL) { return(ERROR_NOT_ENOUGH_MEMORY); }
if (pDlgAddFilter->DoModal() == IDOK) m_fModified = TRUE;
SetButtons();
delete pDlgAddFilter;
return 0; }
LRESULT CFilterDialog::OnRemove(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { HWND hList = NULL; HWND hAdd = NULL;
switch (wID) { case IDC_FILTERING_TCP_REMOVE: hList = m_hlistTcp; hAdd = GetDlgItem(IDC_FILTERING_TCP_ADD); break;
case IDC_FILTERING_UDP_REMOVE: hList = m_hlistUdp; hAdd = GetDlgItem(IDC_FILTERING_UDP_ADD); break;
case IDC_FILTERING_IP_REMOVE: hList = m_hlistIp; hAdd = GetDlgItem(IDC_FILTERING_IP_ADD); break;
default: Assert(FALSE); break; }
Assert(hList); if (NULL == hList || NULL == hAdd) { return TRUE; }
// see if an item is selected
int i = ::SendMessage(hList, LVM_GETNEXTITEM, -1, MAKELPARAM(LVNI_SELECTED, 0));
if (i == -1) { NcMsgBox(::GetActiveWindow(), IDS_MSFT_TCP_TEXT, IDS_FILTERING_ITEM_NOT_SELECTED, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
return TRUE; }
// remove the item and make item 0 selected
ListView_DeleteItem(hList, i); ListView_GetItemCount(hList);
m_fModified = TRUE; if (i) { LV_ITEM lvItem; lvItem.stateMask = LVIS_SELECTED; lvItem.state = LVIS_SELECTED; ::SendMessage(hList, LVM_SETITEMSTATE, 0, (LPARAM)&lvItem); } else // Force focus to the Add button
{ IsWindow(::SetFocus(hAdd)); }
SetButtons(); return TRUE; }
void CFilterDialog::UpdateInfo() { m_pGlobalInfo->m_fEnableFiltering = IsDlgButtonChecked(IDC_FILTERING_ENABLE);
FreeCollectionAndItem(m_pAdapterInfo->m_vstrTcpFilterList); FreeCollectionAndItem(m_pAdapterInfo->m_vstrUdpFilterList); FreeCollectionAndItem(m_pAdapterInfo->m_vstrIpFilterList);
HWND list[3]; VSTR * pvstr[3]; int nId[3] = {IDC_FILTERING_FILTER_TCP, IDC_FILTERING_FILTER_UDP, IDC_FILTERING_FILTER_IP};
// Initialize values
list[0] = m_hlistTcp; list[1] = m_hlistUdp; list[2] = m_hlistIp; pvstr[0] = &m_pAdapterInfo->m_vstrTcpFilterList; pvstr[1] = &m_pAdapterInfo->m_vstrUdpFilterList; pvstr[2] = &m_pAdapterInfo->m_vstrIpFilterList;
for(int iLists = 0; iLists < 3; ++iLists) { int nlvCount = ListView_GetItemCount(list[iLists]);
// "" (Empty String) == All ports
// "0" == No ports
// "x y z" == ports x, y, x
// if the All Filter button is checked, use Empty String
if (IsDlgButtonChecked(nId[iLists])) { pvstr[iLists]->push_back(new tstring(L"0")); continue; }
if (nlvCount == 0) { pvstr[iLists]->push_back(new tstring(L"")); continue; }
LV_ITEM lvItem; lvItem.mask = LVIF_PARAM; lvItem.iSubItem = 0;
for (int iItem = 0; iItem < nlvCount; iItem++) { WCHAR szBuf[16];
lvItem.iItem = iItem; ListView_GetItem(list[iLists], &lvItem);
Assert(lvItem.lParam != 0); _itow((int)lvItem.lParam, szBuf, 10);
Assert(szBuf); pvstr[iLists]->push_back(new tstring(szBuf)); } } }
void CFilterDialog::SetInfo() { CheckDlgButton(IDC_FILTERING_ENABLE, m_pGlobalInfo->m_fEnableFiltering);
int anId[3] = {IDC_FILTERING_FILTER_TCP, IDC_FILTERING_FILTER_UDP, IDC_FILTERING_FILTER_IP}; int anIdSel[3] = {IDC_FILTERING_FILTER_TCP_SEL, IDC_FILTERING_FILTER_UDP_SEL, IDC_FILTERING_FILTER_IP_SEL}; HWND aplist[3]; VSTR * apvect[3];
aplist[0] = m_hlistTcp; aplist[1] = m_hlistUdp; aplist[2] = m_hlistIp;
ListView_DeleteAllItems(m_hlistTcp); ListView_DeleteAllItems(m_hlistUdp); ListView_DeleteAllItems(m_hlistIp);
apvect[0] = &m_pAdapterInfo->m_vstrTcpFilterList; apvect[1] = &m_pAdapterInfo->m_vstrUdpFilterList; apvect[2] = &m_pAdapterInfo->m_vstrIpFilterList;
int iItem; for (int iLists = 0; iLists < 3; ++iLists) { iItem = 0;
//if the list is empty, that means no value is accepted
if (apvect[iLists]->empty()) { EnableGroup(anId[iLists], TRUE); CheckRadioButton(anId[iLists], anIdSel[iLists], anIdSel[iLists]); continue; }
for(VSTR_ITER iter = apvect[iLists]->begin() ; iter != apvect[iLists]->end() ; ++iter) { if (**iter == L"0") { EnableGroup(anId[iLists], FALSE); CheckRadioButton(anId[iLists], anIdSel[iLists], anId[iLists]); break; }
EnableGroup(anId[iLists], TRUE); CheckRadioButton(anId[iLists], anIdSel[iLists], anIdSel[iLists]);
if (**iter == L"") break;
unsigned long nNum = wcstoul((*iter)->c_str(), NULL, 10);
LV_ITEM lvItem;
lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.lParam = nNum; lvItem.iItem = iItem; lvItem.iSubItem = 0; lvItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED; lvItem.state =0; lvItem.pszText = (PWSTR)(*iter)->c_str();
::SendMessage(aplist[iLists], LVM_INSERTITEM, 0, (LPARAM)&lvItem);
lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED; lvItem.state = LVIS_SELECTED | LVIS_FOCUSED; :: SendMessage(aplist[iLists], LVM_SETITEMSTATE, iItem, (LPARAM)&lvItem);
++iItem; } ListView_SortItems(aplist[iLists], CompareFunc, 0); }
// Update the RemoveButtons
SetButtons(); }
void CFilterDialog::EnableGroup(int nId, BOOL fEnable) { int nIdAdd = 0; int nIdRemove = 0; int nIdList = 0;
switch (nId) { case IDC_FILTERING_FILTER_TCP: case IDC_FILTERING_FILTER_TCP_SEL: nIdAdd = IDC_FILTERING_TCP_ADD; nIdRemove = IDC_FILTERING_TCP_REMOVE; nIdList = IDC_FILTERING_TCP; break;
case IDC_FILTERING_FILTER_UDP: case IDC_FILTERING_FILTER_UDP_SEL: nIdAdd = IDC_FILTERING_UDP_ADD; nIdRemove = IDC_FILTERING_UDP_REMOVE; nIdList = IDC_FILTERING_UDP; break;
case IDC_FILTERING_FILTER_IP: case IDC_FILTERING_FILTER_IP_SEL: nIdAdd = IDC_FILTERING_IP_ADD; nIdRemove = IDC_FILTERING_IP_REMOVE; nIdList = IDC_FILTERING_IP; break;
default: Assert(FALSE); break; }
if (0 != nIdAdd && 0 != nIdRemove && 0 != nIdList) { ::EnableWindow(GetDlgItem(nIdAdd), fEnable); ::EnableWindow(GetDlgItem(nIdRemove), fEnable); ::EnableWindow(GetDlgItem(nIdList), fEnable); } }
void CFilterDialog::SetButtons() { if (ListView_GetItemCount(m_hlistTcp)>0) { ::EnableWindow(GetDlgItem(IDC_FILTERING_TCP_REMOVE), !IsDlgButtonChecked(IDC_FILTERING_FILTER_TCP)); }
if (ListView_GetItemCount(m_hlistUdp)>0) { ::EnableWindow(GetDlgItem(IDC_FILTERING_UDP_REMOVE), !IsDlgButtonChecked(IDC_FILTERING_FILTER_UDP)); }
if (ListView_GetItemCount(m_hlistIp)>0) { ::EnableWindow(GetDlgItem(IDC_FILTERING_IP_REMOVE), !IsDlgButtonChecked(IDC_FILTERING_FILTER_IP)); }
}
//
// CAddFilterDialog
//
CAddFilterDialog::CAddFilterDialog(CFilterDialog* pParentDlg, int ID, const DWORD* adwHelpIDs) { Assert(pParentDlg != NULL); Assert(ID != 0);
m_pParentDlg = pParentDlg; m_nId = ID; m_hList = NULL;
m_adwHelpIDs = adwHelpIDs; }
CAddFilterDialog::~CAddFilterDialog() { }
LRESULT CAddFilterDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { int nTextId = 0;
Assert(m_pParentDlg != NULL);
// Position the dialog
RECT rect; switch (m_nId) { case IDC_FILTERING_TCP_ADD: m_hList = m_pParentDlg->m_hlistTcp; nTextId = IDS_FILTERING_TCP_TEXT; break;
case IDC_FILTERING_UDP_ADD: m_hList = m_pParentDlg->m_hlistUdp; nTextId = IDS_FILTERING_UDP_TEXT; break;
case IDC_FILTERING_IP_ADD: m_hList = m_pParentDlg->m_hlistIp; nTextId = IDS_FILTERING_IP_TEXT; break;
default: Assert(FALSE); break; }
Assert(IsWindow(m_hList));
if (IsWindow(m_hList)) { ::GetWindowRect(m_hList, &rect); SetWindowPos(NULL, rect.left, rect.top-8, 0,0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); }
// Set the static text and limit the edit control to 5 characters
SetDlgItemText(IDC_FILTERING_TEXT, SzLoadIds(nTextId)); SendDlgItemMessage(IDC_FILTERING_ADD_EDIT, EM_SETLIMITTEXT, FILTER_ADD_LIMIT, 0); ::EnableWindow(GetDlgItem(IDOK), FALSE);
return TRUE; }
LRESULT CAddFilterDialog::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs); return 0; }
LRESULT CAddFilterDialog::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 CAddFilterDialog::OnFilterAddEdit(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch (wNotifyCode) { case EN_CHANGE:
::EnableWindow(GetDlgItem(IDOK), Tcp_Edit_LineLength(GetDlgItem(wID), -1)); break;
default: break; }
return 0; }
LRESULT CAddFilterDialog::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { WCHAR szData[FILTER_ADD_LIMIT+1];
szData[0] = 0; ::GetWindowText(GetDlgItem(IDC_FILTERING_ADD_EDIT), szData, FILTER_ADD_LIMIT+1);
Assert(IsWindow(m_hList));
// check the range of the number
PWSTR pStr; unsigned long num = wcstoul(szData, &pStr, 10); unsigned long maxNum = 65535; int nId = IDS_FILTERING_RANGE_WORD;
if (m_hList == m_pParentDlg->m_hlistIp) { maxNum = 255; nId = IDS_FILTERING_RANGE_BYTE; }
if (num < 1 || num > maxNum) { NcMsgBox(::GetActiveWindow(), IDS_MSFT_TCP_TEXT, nId, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
return 0; }
// See if the item is in the list
LV_FINDINFO info; info.flags = LVFI_PARAM; info.lParam = num; int i = ListView_FindItem(m_hList, -1, &info);
if (i != -1) { NcMsgBox(::GetActiveWindow(), IDS_MSFT_TCP_TEXT, IDS_FILTERING_ITEM_IN_LIST, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
return 0; }
int index = ListView_GetItemCount(m_hList);
LV_ITEM lvItem;
lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.lParam = num; lvItem.iItem = index; lvItem.iSubItem = 0; lvItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED; lvItem.state =0; lvItem.pszText = (PWSTR)szData;
::SendMessage(m_hList, LVM_INSERTITEM, 0, (LPARAM)&lvItem);
ListView_SortItems(m_hList, CompareFunc, 0);
lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED; lvItem.state = LVIS_SELECTED | LVIS_FOCUSED;
::SendMessage(m_hList, LVM_SETITEMSTATE, (WPARAM)i, (LPARAM)&lvItem);
EndDialog(IDOK);
return 0; }
LRESULT CAddFilterDialog::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { EndDialog(IDOK);
return 0; }
|