📄 ipfilterdlg.cpp
字号:
//this file is part of eMule
//Copyright (C)2002 Merkur ( devs@emule-project.net / http://www.emule-project.net )
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either
//version 2 of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "stdafx.h"
#include "emule.h"
#include "IPFilterDlg.h"
#include "IPFilter.h"
#include "OtherFunctions.h"
#include "Preferences.h"
#include "MenuCmds.h"
#include "ZipFile.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////////////////////////////////////////////
// COLUMN_INIT -- List View Columns
enum EIPFilterCols
{
IPFILTER_COL_START = 0,
IPFILTER_COL_END,
IPFILTER_COL_LEVEL,
IPFILTER_COL_HITS,
IPFILTER_COL_DESC
};
static LCX_COLUMN_INIT _aColumns[] =
{
{ IPFILTER_COL_START, _T("Start"), IDS_IP_START, LVCFMT_LEFT, -1, 0, ASCENDING, NONE, _T("255.255.255.255") },
{ IPFILTER_COL_END, _T("End"), IDS_IP_END, LVCFMT_LEFT, -1, 1, ASCENDING, NONE, _T("255.255.255.255")},
{ IPFILTER_COL_LEVEL, _T("Level"), IDS_IP_LEVEL, LVCFMT_RIGHT, -1, 2, ASCENDING, NONE, _T("999") },
{ IPFILTER_COL_HITS, _T("Hits"), IDS_IP_HITS, LVCFMT_RIGHT, -1, 3, DESCENDING, NONE, _T("99999") },
{ IPFILTER_COL_DESC, _T("Description"), IDS_IP_DESC, LVCFMT_LEFT, -1, 4, ASCENDING, NONE, _T("long long long long long long long long file name") },
};
#define PREF_INI_SECTION _T("IPFilterDlg")
int CIPFilterDlg::sm_iSortColumn = IPFILTER_COL_HITS;
IMPLEMENT_DYNAMIC(CIPFilterDlg, CDialog)
BEGIN_MESSAGE_MAP(CIPFilterDlg, CResizableDialog)
ON_WM_DESTROY()
ON_NOTIFY(LVN_COLUMNCLICK, IDC_IPFILTER, OnLvnColumnClickIPFilter)
ON_NOTIFY(LVN_KEYDOWN, IDC_IPFILTER, OnLvnKeyDownIPFilter)
ON_BN_CLICKED(IDC_COPY, OnBnClickedCopy)
ON_BN_CLICKED(IDC_REMOVE, OnBnClickedDelete)
ON_BN_CLICKED(IDC_APPEND, OnBnClickedAppend)
ON_COMMAND(MP_COPYSELECTED, OnCopyIPFilter)
ON_COMMAND(MP_REMOVE, OnDeleteIPFilter)
ON_COMMAND(MP_SELECTALL, OnSelectAllIPFilter)
ON_COMMAND(MP_FIND, OnFind)
ON_BN_CLICKED(IDC_SAVE, OnBnClickedSave)
ON_NOTIFY(LVN_GETDISPINFO, IDC_IPFILTER, OnLvnGetdispinfoIpfilter)
ON_NOTIFY(LVN_DELETEITEM, IDC_IPFILTER, OnLvnDeleteitemIpfilter)
END_MESSAGE_MAP()
CIPFilterDlg::CIPFilterDlg(CWnd* pParent /*=NULL*/)
: CResizableDialog(CIPFilterDlg::IDD, pParent)
{
m_uIPFilterItems = 0;
m_ppIPFilterItems = NULL;
m_icoDlg = NULL;
m_pMenuIPFilter = NULL;
m_ulFilteredIPs = 0;
m_ipfilter.m_pParent = this;
m_ipfilter.SetRegistryKey(PREF_INI_SECTION);
m_ipfilter.SetRegistryPrefix(_T("IPfilters_"));
}
CIPFilterDlg::~CIPFilterDlg()
{
if (m_ppIPFilterItems)
free(m_ppIPFilterItems);
delete m_pMenuIPFilter;
sm_iSortColumn = m_ipfilter.GetSortColumn();
if (m_icoDlg)
VERIFY( ::DestroyIcon(m_icoDlg) );
}
void CIPFilterDlg::DoDataExchange(CDataExchange* pDX)
{
CResizableDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_IPFILTER, m_ipfilter);
}
static int _lParamSort = 0;
int __cdecl CompareIPFilterItems(const void* lParam1, const void* lParam2)
{
#define COMPARE_NUM( a, b ) ((a) < (b)) \
? -1 \
: ( ((b) < (a)) \
? 1 \
: 0 \
)
int iResult;
if (_lParamSort == IPFILTER_COL_START)
{
iResult = COMPARE_NUM((*((const SIPFilter**)lParam1))->start, (*((const SIPFilter**)lParam2))->start);
}
else if (_lParamSort == IPFILTER_COL_END)
{
iResult = COMPARE_NUM((*((const SIPFilter**)lParam1))->end, (*((const SIPFilter**)lParam2))->end);
}
else if (_lParamSort == IPFILTER_COL_LEVEL)
{
iResult = COMPARE_NUM((*((const SIPFilter**)lParam1))->level, (*((const SIPFilter**)lParam2))->level);
}
else if (_lParamSort == IPFILTER_COL_HITS)
{
iResult = COMPARE_NUM((*((const SIPFilter**)lParam1))->hits, (*((const SIPFilter**)lParam2))->hits);
}
else if (_lParamSort == IPFILTER_COL_DESC)
{
iResult = CompareLocaleStringNoCase((*((const SIPFilter**)lParam1))->desc, (*((const SIPFilter**)lParam2))->desc);
}
else
{
ASSERT(0);
iResult = 0;
}
#undef COMPARE_NUM
if (_aColumns[_lParamSort].eSortOrder == DESCENDING)
return -iResult;
else
return iResult;
}
void CIPFilterDlg::SortIPFilterItems()
{
// Update (sort, if needed) the listview items
if (m_ipfilter.GetSortColumn() != -1)
{
_lParamSort = m_ipfilter.GetSortColumn();
qsort((void*)m_ppIPFilterItems, m_uIPFilterItems, sizeof(*m_ppIPFilterItems), CompareIPFilterItems);
}
}
void CIPFilterDlg::OnLvnColumnClickIPFilter(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
m_ipfilter.UpdateSortOrder(pNMLV, ARRSIZE(_aColumns), _aColumns);
SortIPFilterItems();
m_ipfilter.Update(-1);
*pResult = 0;
}
BOOL CIPFilterDlg::OnInitDialog()
{
CResizableDialog::OnInitDialog();
InitWindowStyles(this);
AddAnchor(IDC_IPFILTER, TOP_LEFT, BOTTOM_RIGHT);
AddAnchor(IDC_TOTAL_IPFILTER_LABEL, BOTTOM_LEFT);
AddAnchor(IDC_TOTAL_IPFILTER, BOTTOM_LEFT);
AddAnchor(IDC_TOTAL_IPS_LABEL, BOTTOM_LEFT);
AddAnchor(IDC_TOTAL_IPS, BOTTOM_LEFT);
AddAnchor(IDC_COPY, BOTTOM_RIGHT);
AddAnchor(IDC_REMOVE, BOTTOM_RIGHT);
AddAnchor(IDC_APPEND, BOTTOM_RIGHT);
AddAnchor(IDC_SAVE, BOTTOM_RIGHT);
AddAnchor(IDOK, BOTTOM_RIGHT);
EnableSaveRestore(PREF_INI_SECTION);
ASSERT( m_ipfilter.GetStyle() & LVS_OWNERDATA );
#ifdef _UNICODE
m_ipfilter.SendMessage(CCM_SETUNICODEFORMAT, TRUE);
#endif
m_ipfilter.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_ipfilter.EnableHdrCtrlSortBitmaps();
m_ipfilter.ReadColumnStats(ARRSIZE(_aColumns), _aColumns);
m_ipfilter.CreateColumns(ARRSIZE(_aColumns), _aColumns);
m_ipfilter.InitColumnOrders(ARRSIZE(_aColumns), _aColumns);
m_ipfilter.UpdateSortColumn(ARRSIZE(_aColumns), _aColumns);
m_icoDlg = theApp.LoadIcon(_T("IPFilter"));
SetIcon(m_icoDlg, FALSE);
InitIPFilters();
m_pMenuIPFilter = new CMenu();
if (m_pMenuIPFilter->CreatePopupMenu())
{
m_pMenuIPFilter->AppendMenu(MF_ENABLED | MF_STRING, MP_COPYSELECTED, GetResString(IDS_COPY));
m_pMenuIPFilter->AppendMenu(MF_ENABLED | MF_STRING, MP_REMOVE, GetResString(IDS_REMOVE));
m_pMenuIPFilter->AppendMenu(MF_SEPARATOR);
m_pMenuIPFilter->AppendMenu(MF_ENABLED | MF_STRING, MP_SELECTALL, GetResString(IDS_SELECTALL));
m_pMenuIPFilter->AppendMenu(MF_SEPARATOR);
m_pMenuIPFilter->AppendMenu(MF_ENABLED | MF_STRING, MP_FIND, GetResString(IDS_FIND));
}
m_ipfilter.m_pMenu = m_pMenuIPFilter;
m_ipfilter.m_pParent = this;
// localize
SetWindowText(GetResString(IDS_IPFILTER));
SetDlgItemText(IDC_STATICIPLABEL,GetResString(IDS_IP_RULES));
SetDlgItemText(IDC_TOTAL_IPFILTER_LABEL,GetResString(IDS_TOTAL_IPFILTER_LABEL));
SetDlgItemText(IDC_TOTAL_IPS_LABEL,GetResString(IDS_TOTAL_IPS_LABEL));
SetDlgItemText(IDC_COPY,GetResString(IDS_COPY));
SetDlgItemText(IDC_REMOVE,GetResString(IDS_DELETESELECTED));
SetDlgItemText(IDC_APPEND,GetResString(IDS_APPEND));
SetDlgItemText(IDC_SAVE,GetResString(IDS_SAVE));
SetDlgItemText(IDOK,GetResString(IDS_FD_CLOSE));
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CIPFilterDlg::InitIPFilters()
{
CWaitCursor curWait;
m_uIPFilterItems = 0;
if (m_ppIPFilterItems)
{
free(m_ppIPFilterItems);
m_ppIPFilterItems = NULL;
}
const CIPFilterArray& ipfilter = theApp.ipfilter->GetIPFilter();
m_uIPFilterItems = ipfilter.GetCount();
m_ppIPFilterItems = (const SIPFilter**)malloc(sizeof(*m_ppIPFilterItems) * m_uIPFilterItems);
m_ulFilteredIPs = 0;
for (UINT i = 0; i < m_uIPFilterItems; i++)
{
const SIPFilter* pFilter = ipfilter[i];
m_ppIPFilterItems[i] = pFilter;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -