www.pudn.com > 18900_netwall_lite.rar > RuleListView.cpp
/**************************************************************************/
/* RuleListView.cpp : implementation of the CRuleListView class */
/* */
/* 这个文件实现一个列表视图,通过左视图发来的消息在视图中分别显示适配器 */
/* 、规则,日志等的相关信息。 */
/* */
/* 当显示规则列表时,用户可以使用快捷菜单进行所有的规则操作。 */
/* */
/* */
/* */
/* */
/**************************************************************************/
#include "stdafx.h"
#include "netwall.h"
#include "RuleListView.h"
#include "MainFrm.h"
#include "RuleUtil.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRuleListView
IMPLEMENT_DYNCREATE(CRuleListView, CListView)
CRuleListView::CRuleListView()
{
m_nType = ADAPTER;
}
CRuleListView::~CRuleListView()
{
}
BEGIN_MESSAGE_MAP(CRuleListView, CListView)
//{{AFX_MSG_MAP(CRuleListView)
ON_WM_CONTEXTMENU()
ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemchanged)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CRuleListView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
cs.style = (cs.style & ~LVS_TYPEMASK) | LVS_REPORT | LVS_SHOWSELALWAYS;
cs.style |= LVS_AUTOARRANGE;
// Set full line select
//ListView_SetExtendedListViewStyle(GetSafeHwnd(), LVS_EX_FULLROWSELECT);
return CListView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CRuleListView drawing
void CRuleListView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CRuleListView diagnostics
#ifdef _DEBUG
void CRuleListView::AssertValid() const
{
CListView::AssertValid();
}
void CRuleListView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CRuleListView message handlers
void CRuleListView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
// this code only works for a report-mode list view
VERIFY(GetStyle() & LVS_REPORT);
// Set full line select
//ListView_SetExtendedListViewStyle(GetSafeHwnd(), LVS_EX_FULLROWSELECT);
}
void CRuleListView::OnContextMenu(CWnd* pWnd, CPoint point)
{
// CG: This block was added by the Pop-up Menu component
if (RULE == m_nType)
{
if (point.x == -1 && point.y == -1)
{
//keystroke invocation
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5, 5);
}
CMenu menu;
VERIFY(menu.LoadMenu(IDR_POPUP_RULE_LIST));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
{
pWndPopupOwner = pWndPopupOwner->GetParent();
}
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
}
}
void CRuleListView::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if (ADAPTER == m_nType)
{
return;
}
int pos = GetListCtrl().GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
if (-1 == pos) //未选中
{
((CMainFrame *)AfxGetMainWnd())->m_nIndex = -1;
}
else //获取选中项的索引
{
((CMainFrame *)AfxGetMainWnd())->m_nIndex = GetListCtrl().GetItemData(pos);
}
*pResult = 0;
}
void CRuleListView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
m_nType = (UINT)lHint;
switch (m_nType)
{
case ADAPTER:
InitHeadForAdapter();
RefreshAdapter((CAdapterInfo *)pHint);
break;
case RULE:
InitHeadForRule();
RefreshRule((CAdapterInfo *)pHint);
break;
default:
break;
}
((CMainFrame *)AfxGetMainWnd())->SendMessage(WM_SIZE);
}
BOOL CRuleListView::InitHeadForAdapter()
{
// Gain a reference to the list control itself
CListCtrl& listView = GetListCtrl();
listView.SetBkColor(RGB(255,255,255)); // set bk color to white
// Set full line select
ListView_SetExtendedListViewStyle(GetSafeHwnd(), LVS_EX_FULLROWSELECT);
// Delete all of the items
listView.DeleteAllItems();
// Delete all of the columns
int nColumnCount = listView.GetHeaderCtrl()->GetItemCount();
for (int i = 0; i < nColumnCount; i++)
{
listView.DeleteColumn(0);
}
// Insert Columns
listView.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 50, 0);
listView.InsertColumn(1, _T("项目"), LVCFMT_LEFT, 150, 0);
listView.InsertColumn(2, _T("值"), LVCFMT_LEFT, 450, 0);
return TRUE;
}
int CRuleListView::RefreshAdapter(CAdapterInfo *pAdapterInfo)
{
CListCtrl& listView = GetListCtrl();
int nIndex = 0;
CHAR szIndex[10];
RtlZeroMemory(szIndex, sizeof(szIndex));
// VirtualAdapterName
_stprintf(szIndex, _T("%d"), nIndex + 1);
listView.InsertItem(nIndex, szIndex);
listView.SetItemText(nIndex, 1, _T("VirtualAdapterName"));
listView.SetItemText(nIndex, 2, pAdapterInfo->m_strVirtualAdapterName);
// LowerAdapterName
_stprintf(szIndex, _T("%d"), ++nIndex + 1);
listView.InsertItem(nIndex, szIndex);
listView.SetItemText(nIndex, 1, _T("LowerAdapterName"));
listView.SetItemText(nIndex, 2, pAdapterInfo->m_strLowerAdapterName);
// FriendlyAdapterName
_stprintf(szIndex, _T("%d"), ++nIndex + 1);
listView.InsertItem(nIndex, szIndex);
listView.SetItemText(nIndex, 1, _T("FriendlyAdapterName"));
listView.SetItemText(nIndex, 2, pAdapterInfo->m_strFriendlyAdapterName);
// FriendlyAdapterName
_stprintf(szIndex, _T("%d"), ++nIndex + 1);
listView.InsertItem(nIndex, szIndex);
listView.SetItemText(nIndex, 1, _T("PhysicalAddress"));
listView.SetItemText(nIndex, 2, pAdapterInfo->m_strAdapterMacAddress);
return nIndex;
}
BOOL CRuleListView::InitHeadForRule()
{
// Gain a reference to the list control itself
CListCtrl& listView = GetListCtrl();
listView.SetBkColor(RGB(255,255,255)); // set bk color to white
// Set full line select
ListView_SetExtendedListViewStyle(GetSafeHwnd(), LVS_EX_FULLROWSELECT);
// Delete all of the items
listView.DeleteAllItems();
// Delete all of the columns
int nColumnCount = listView.GetHeaderCtrl()->GetItemCount();
for (int i = 0; i < nColumnCount; i++)
{
listView.DeleteColumn(0);
}
// Insert Columns
listView.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 40, 0);
listView.InsertColumn(1, _T("协议"), LVCFMT_LEFT, 40, 0);
listView.InsertColumn(2, _T("方向"), LVCFMT_LEFT, 40, 0);
listView.InsertColumn(3, _T("动作"), LVCFMT_LEFT, 40, 0);
listView.InsertColumn(4, _T("使用"), LVCFMT_LEFT, 40, 0);
listView.InsertColumn(5, _T("源起止IP"), LVCFMT_LEFT, 180, 0);
listView.InsertColumn(6, _T("源起止Port"), LVCFMT_LEFT, 80, 0);
listView.InsertColumn(7, _T("目的起止IP"), LVCFMT_LEFT, 180, 0);
listView.InsertColumn(8, _T("目的起止Port"), LVCFMT_LEFT, 80, 0);
listView.InsertColumn(9, _T("描述"), LVCFMT_LEFT, 256, 0);
return TRUE;
}
int CRuleListView::RefreshRule(CAdapterInfo *pAdapterInfo)
{
CListCtrl& listView = GetListCtrl();
int nIndex = 0;
CHAR szIndex[10];
RtlZeroMemory(szIndex, sizeof(szIndex));
RULE_ITEM * pItem = ((CMainFrame *)AfxGetMainWnd())->GetAdapterRuleItem();
ASSERT(pItem);
for (nIndex = 0; nIndex < pAdapterInfo->m_dwNumberOfRules; nIndex++)
{
// Order
_stprintf(szIndex, _T("%d"), nIndex + 1);
listView.InsertItem(nIndex, szIndex);
listView.SetItemData(nIndex, DWORD(nIndex));
// Protocol
char * pTemp = CRuleUtil::GetProtocolDescById(pItem->iProto);
listView.SetItemText(nIndex, 1, _T(pTemp));
// Direction
pTemp = CRuleUtil::GetDescByDirectionId(pItem->ucDirection);
listView.SetItemText(nIndex, 2, _T(pTemp));
// Action
pTemp = CRuleUtil::GetDescByActionId(pItem->ucAction);
listView.SetItemText(nIndex, 3, _T(pTemp));
// Use
pTemp = pItem->bUse == 1 ? "使用" : "禁用";
listView.SetItemText(nIndex, 4, _T(pTemp));
// Source Start - End IP
DWORD dwStartIP = pItem->ulSrcStartIp;
DWORD dwEndIP = pItem->ulSrcStartIp;
TCHAR szBuf[40];
RtlZeroMemory(szBuf, 40);
_stprintf(szBuf, "%d.%d.%d.%d : %d.%d.%d.%d",
(dwStartIP >> 24) & 0xFF, (dwStartIP >> 16) & 0xFF, (dwStartIP >> 8) & 0xFF, dwStartIP & 0xFF,
(dwEndIP >> 24) & 0xFF, (dwEndIP >> 16) & 0xFF, (dwEndIP >> 8) & 0xFF, dwEndIP & 0xFF);
listView.SetItemText(nIndex, 5, _T(szBuf));
// Source Start - End Port
RtlZeroMemory(szBuf, 40);
_stprintf(szBuf, "%d : %d", pItem->usSrcStartPort, pItem->usSrcEndPort);
listView.SetItemText(nIndex, 6, _T(szBuf));
// Destination Start - End IP
dwStartIP = pItem->ulDestStartIp;
dwEndIP = pItem->ulDestEndIp;
RtlZeroMemory(szBuf, 40);
_stprintf(szBuf, "%d.%d.%d.%d : %d.%d.%d.%d",
(dwStartIP >> 24) & 0xFF, (dwStartIP >> 16) & 0xFF, (dwStartIP >> 8) & 0xFF, dwStartIP & 0xFF,
(dwEndIP >> 24) & 0xFF, (dwEndIP >> 16) & 0xFF, (dwEndIP >> 8) & 0xFF, dwEndIP & 0xFF);
listView.SetItemText(nIndex, 7, _T(szBuf));
// Source Start - End Port
RtlZeroMemory(szBuf, 40);
_stprintf(szBuf, "%d : %d", pItem->usDestStartPort, pItem->usDestEndPort);
listView.SetItemText(nIndex, 8, _T(szBuf));
// Description
listView.SetItemText(nIndex, 9, _T(pItem->chMsg));
pItem = (RULE_ITEM *)((LPBYTE)pItem + pItem->cbSize);
}
return nIndex;
}