⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rulepage.cpp

📁 Windows网络与通信程序设计/王艳平, 张越编著
💻 CPP
字号:
// RulePage.cpp : implementation file
//

#include "stdafx.h"
#include "PhoenixFW.h"
#include "RulePage.h"
#include "Ruledlg.h"
#include "PhoenixFWDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CRulePage property page
extern CPhoenixApp theApp;


IMPLEMENT_DYNCREATE(CRulePage, CPropertyPage)

CRulePage::CRulePage() : CPropertyPage(CRulePage::IDD)
{
	//{{AFX_DATA_INIT(CRulePage)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}

CRulePage::~CRulePage()
{
}

void CRulePage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRulePage)
	DDX_Control(pDX, IDC_RULES, m_rules);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CRulePage, CPropertyPage)
	//{{AFX_MSG_MAP(CRulePage)
	ON_BN_CLICKED(IDC_ADD, OnAdd)
	ON_BN_CLICKED(IDC_DEL, OnDel)
	ON_NOTIFY(NM_CLICK, IDC_RULES, OnClickRules)
	ON_BN_CLICKED(IDC_EDIT, OnEdit)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_RULES, OnItemchangedRules)
	ON_NOTIFY(NM_DBLCLK, IDC_RULES, OnDblclkRules)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRulePage message handlers


BOOL CRulePage::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	
	// 初始化列表视图控件
	m_rules.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
	m_rules.InsertColumn(0, L"应用程序", LVCFMT_LEFT, sizeof(L"应用程序")*8, 0);
	m_rules.InsertColumn(1, L"动作", LVCFMT_LEFT, sizeof( L"动作")*8, 1);
	m_rules.InsertColumn(2, L"类型/端口", LVCFMT_LEFT, sizeof(L"类型/端口")*8, 2);
	m_rules.InsertColumn(3, L"应用程序路径", LVCFMT_LEFT, sizeof(L"应用程序路径")*12, 3);
	m_rules.InsertColumn(4, L"说明", LVCFMT_LEFT, sizeof(L"说明")*12, 4);

	// 更新列表,即向列表中添加规则
	UpdateList();

	// 无效删除和编辑按钮
	GetDlgItem(IDC_DEL)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT)->EnableWindow(FALSE);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CRulePage::UpdateList()
{
	// 清空列表
	m_rules.DeleteAllItems();

	// 向列表中添加规则
	for(int i=0; i<(int)g_RuleFile.m_header.ulLspRuleCount; i++)
		EditARule(&g_RuleFile.m_pLspRules[i]);
}

void CRulePage::EditARule(RULE_ITEM *pItem, int nEditIndex)
{
	// 如果nEditIndex大于等于0就编辑索引为nEditIndex的项,否则插入一个新项
	int nIndex = m_rules.GetItemCount();
	if(nEditIndex >= 0)
		nIndex = nEditIndex;
	else
		m_rules.InsertItem(nIndex, L"", 0);

	// 构建新项的文本
	CString sAction, sServType;

	sAction = (pItem->ucAction == 0) ? L"放行" : L"拒绝";

	switch(pItem->ucServiceType)
	{	
	case RULE_SERVICE_TYPE_ALL:
		sServType.Format(L"所有/%d", pItem->usServicePort);
		break;
	case RULE_SERVICE_TYPE_TCP:
		sServType.Format(L"TCP/%d", pItem->usServicePort);
		break;
	case RULE_SERVICE_TYPE_UDP:
		sServType.Format(L"UDP/%d", pItem->usServicePort);
		break;
	case RULE_SERVICE_TYPE_FTP:
		sServType.Format(L"FTP/%d", pItem->usServicePort);
		break;
	case RULE_SERVICE_TYPE_TELNET:
		sServType.Format(L"TELNET/%d", pItem->usServicePort);
		break;
	case RULE_SERVICE_TYPE_HTTP:
		sServType.Format(L"HTTP/%d", pItem->usServicePort);
		break;
	case RULE_SERVICE_TYPE_NNTP:
		sServType.Format(L"NNTP/%d", pItem->usServicePort);
		break;
	case RULE_SERVICE_TYPE_POP3:
		sServType.Format(L"POP3/%d", pItem->usServicePort);
		break;
	}

	// 设置新项的文本
	m_rules.SetItemText(nIndex, 0, GetFileName(pItem->szApplication));
	m_rules.SetItemText(nIndex, 1, sAction);
	m_rules.SetItemText(nIndex, 2, sServType);
	m_rules.SetItemText(nIndex, 3, GetFilePath(pItem->szApplication));
	m_rules.SetItemText(nIndex, 4, pItem->sDemo);
}




int CRulePage::InitAddRule(LPCTSTR szQueryApp)
{
	if(g_RuleFile.m_header.ulLspRuleCount > MAX_RULE_COUNT)
	{
		AfxMessageBox(L" 超过规则的最大数目,不能够再添加");
		return -1;
	}

	// 设置一个默认的规则
	RULE_ITEM tmpRule;

	_tcscpy(tmpRule.sDemo, L"");
	_tcscpy(tmpRule.szApplication, L"");
	tmpRule.ucAction = RULE_ACTION_PASS;
	tmpRule.ucDirection = RULE_DIRECTION_IN_OUT;
	tmpRule.ucServiceType = RULE_SERVICE_TYPE_ALL;
	tmpRule.usServicePort = RULE_SERVICE_PORT_ALL;

	// 设置传递的参数
	CRuleDlg::m_sPathName = szQueryApp;
	CRuleDlg::m_RuleItem = tmpRule;
	CRuleDlg::m_bAppQuery = (szQueryApp == NULL) ? 0 : 1;

	// 设置本页面为活动页面
	if(CRuleDlg::m_bAppQuery)
		((CMainDlg*)theApp.m_pMainWnd)->m_sheet.SetActivePage(this);

	// 弹出添加规则对话框
	CRuleDlg dlg;
	if(dlg.DoModal() == IDCANCEL)
	{
		return -1;
	}

	// 将规则添加到文件
	if(!g_RuleFile.AddLspRules(&CRuleDlg::m_RuleItem, 1))
	{
		AfxMessageBox(L"添加 ACL 规则错误。");
		return -1;
	}

	// 将规则添加到列表试图
	EditARule(&CRuleDlg::m_RuleItem);

	return CRuleDlg::m_RuleItem.ucAction;
}

BOOL CRulePage::AddQueryRule(LPCTSTR pszQueryApp) // 静态函数
{
	int nRet = ((CMainDlg*)theApp.m_pMainWnd)->m_RulePage.InitAddRule(pszQueryApp);
	if( nRet == -1 )
		return FALSE;

	// 将规则保存到文件
	g_RuleFile.SaveRules();

	// 将规则应用到DLL模块
	theApp.ApplyFileData();
	// 无效主对话框的应用按钮
	((CMainDlg*)theApp.m_pMainWnd)->GetDlgItem(IDC_APPLY)->EnableWindow(FALSE);

	return nRet == RULE_ACTION_PASS;
}

void CRulePage::OnAdd()		// 用户点击“添加”按钮
{
	if(InitAddRule() != 0)
		return;
	// 有效主对话框的应用按钮
	GetOwner()->GetOwner()->GetDlgItem(IDC_APPLY)->EnableWindow(TRUE);
}



void CRulePage::OnEdit()									// 用户点击“编辑” 按钮
{
	if(m_nListIndex < 0)
		return;

	CRuleDlg::m_RuleItem = g_RuleFile.m_pLspRules[m_nListIndex];
	CRuleDlg::m_bAppQuery = FALSE;

	CRuleDlg dlg;
	if(dlg.DoModal() == IDOK)
	{
		g_RuleFile.m_pLspRules[m_nListIndex] = CRuleDlg::m_RuleItem;
		EditARule(&CRuleDlg::m_RuleItem, m_nListIndex);
		GetOwner()->GetOwner()->GetDlgItem(IDC_APPLY)->EnableWindow(TRUE);
	}
}

void CRulePage::OnDblclkRules(NMHDR* pNMHDR, LRESULT* pResult) 	// 用户双击列表
{
	NM_LISTVIEW* pNMList = (NM_LISTVIEW*)pNMHDR;
	if((m_nListIndex = pNMList->iItem) != -1)
	{
		OnEdit();
	}
	*pResult = 0;
}

void CRulePage::OnDel()					// 用户点击“删除” 按钮
{	
	if(m_nListIndex < 0)
		return;

	// 从文件中将规则删除
	g_RuleFile.DelLspRule(m_nListIndex);
	// 从列表试图中将文件删除
	m_rules.DeleteItem(m_nListIndex);
	// 有效主窗口的“应用”按钮
	GetOwner()->GetOwner()->GetDlgItem(IDC_APPLY)->EnableWindow(TRUE);

	// 如果没有规则了,则无效“编辑”和“删除”按钮
	if(m_rules.GetItemCount() <= 0)
	{
		GetDlgItem(IDC_DEL)->EnableWindow(FALSE);
		GetDlgItem(IDC_EDIT)->EnableWindow(FALSE);	
		return;
	}
	// 否则,选中下一个规则
	if(m_nListIndex == m_rules.GetItemCount()) // 如果删除的是最后一个
		m_nListIndex--;
	m_rules.SetItemState(m_nListIndex, LVIS_SELECTED, LVIS_SELECTED);
}

void CRulePage::OnItemchangedRules(NMHDR* pNMHDR, LRESULT* pResult) // 用户改变所选项
{
	NM_LISTVIEW* pNMList = (NM_LISTVIEW*)pNMHDR;
	// 获取当前选择项的索引,如果没有选择任何项目,则无效“编辑”和“删除”按钮
	if((m_nListIndex = pNMList->iItem) != -1)
	{
		GetDlgItem(IDC_DEL)->EnableWindow(TRUE);
		GetDlgItem(IDC_EDIT)->EnableWindow(TRUE);
	}

	*pResult = 0;
}

void CRulePage::OnClickRules(NMHDR* pNMHDR, LRESULT* pResult)		// 用户单击列表
{
	NM_LISTVIEW* pNMList = (NM_LISTVIEW*)pNMHDR;
	// 获取当前选择项的索引,如果没有选择任何项目,则无效“编辑”和“删除”按钮
	if((m_nListIndex = pNMList->iItem) == -1)
	{
		GetDlgItem(IDC_DEL)->EnableWindow(FALSE);
		GetDlgItem(IDC_EDIT)->EnableWindow(FALSE);
	}
	*pResult = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -