IpMonitorView.cpp
上传用户:nnxzhh
上传日期:2007-01-11
资源大小:742k
文件大小:8k
开发平台:

WINDOWS

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright 1999 - 2000 Mark Roddy
  4. // All Rights Reserved
  5. //
  6. // Hollis Technology Solutions
  7. // 94 Dow Road
  8. // Hollis, NH 03049
  9. // info@hollistech.com
  10. //
  11. // Synopsis: 
  12. // 
  13. //
  14. // Version Information:
  15. //
  16. // $Header: /iphook/usr/IpMonitor/IpMonitorView.cpp 3     1/27/00 10:35p Markr $ 
  17. //
  18. ///////////////////////////////////////////////////////////////////////////////
  19. // IpMonitorView.cpp : implementation of the CIpMonitorView class
  20. //
  21. #include "stdafx.h"
  22. #include "IpMonitor.h"
  23. #include "IpMonitorDoc.h"
  24. #include "IpMonitorView.h"
  25. #include "Mainfrm.h"
  26. #include "winsock2.h"
  27. #ifdef _DEBUG
  28. #define new DEBUG_NEW
  29. #undef THIS_FILE
  30. static char THIS_FILE[] = __FILE__;
  31. #endif
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CIpMonitorView
  34. IMPLEMENT_DYNCREATE(CIpMonitorView, CListView)
  35. BEGIN_MESSAGE_MAP(CIpMonitorView, CListView)
  36. //{{AFX_MSG_MAP(CIpMonitorView)
  37. ON_WM_CREATE()
  38. ON_MESSAGE(BUFFER_AVAILABLE_MSG, OnBufferMessage)
  39. ON_COMMAND(ID_DOC_CLEAR, OnDocClear)
  40. //}}AFX_MSG_MAP
  41. // Standard printing commands
  42. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  43. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  44. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  45. END_MESSAGE_MAP()
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CIpMonitorView construction/destruction
  48. CIpMonitorView::CIpMonitorView()
  49. {
  50. m_dwDefaultStyle |= LVS_REPORT;
  51. theApp.m_theView = this;
  52. }
  53. CIpMonitorView::~CIpMonitorView()
  54. {
  55. }
  56. BOOL CIpMonitorView::PreCreateWindow(CREATESTRUCT& cs)
  57. {
  58. // TODO: Modify the Window class or styles here by modifying
  59. //  the CREATESTRUCT cs
  60. cs.style |= LVS_REPORT;
  61. return CListView::PreCreateWindow(cs);
  62. }
  63. /////////////////////////////////////////////////////////////////////////////
  64. // CIpMonitorView drawing
  65. void CIpMonitorView::OnDraw(CDC* pDC)
  66. {
  67. CIpMonitorDoc* pDoc = GetDocument();
  68. ASSERT_VALID(pDoc);
  69. // TODO: add draw code for native data here
  70. }
  71. /////////////////////////////////////////////////////////////////////////////
  72. // CIpMonitorView printing
  73. BOOL CIpMonitorView::OnPreparePrinting(CPrintInfo* pInfo)
  74. {
  75. // default preparation
  76. return DoPreparePrinting(pInfo);
  77. }
  78. void CIpMonitorView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  79. {
  80. // TODO: add extra initialization before printing
  81. }
  82. void CIpMonitorView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  83. {
  84. // TODO: add cleanup after printing
  85. }
  86. /////////////////////////////////////////////////////////////////////////////
  87. // CIpMonitorView diagnostics
  88. #ifdef _DEBUG
  89. void CIpMonitorView::AssertValid() const
  90. {
  91. CListView::AssertValid();
  92. }
  93. void CIpMonitorView::Dump(CDumpContext& dc) const
  94. {
  95. CListView::Dump(dc);
  96. }
  97. CIpMonitorDoc* CIpMonitorView::GetDocument() // non-debug version is inline
  98. {
  99. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CIpMonitorDoc)));
  100. return (CIpMonitorDoc*)m_pDocument;
  101. }
  102. #endif //_DEBUG
  103. /////////////////////////////////////////////////////////////////////////////
  104. // CIpMonitorView message handlers
  105. void CIpMonitorView::OnInitialUpdate() 
  106. {
  107. CListView::OnInitialUpdate();
  108. // TODO: Add your specialized code here and/or call the base class
  109. // this code only works for a report-mode list view
  110. ASSERT(GetStyle() & LVS_REPORT);
  111. // Gain a reference to the list control itself
  112. CListCtrl& theCtrl = GetListCtrl();
  113. // Insert a column. This override is the most convenient.
  114. theCtrl.InsertColumn(0, _T("TIME                        "), LVCFMT_LEFT);
  115. // The other InsertColumn() override requires an initialized
  116. // LVCOLUMN structure.
  117. LVCOLUMN col;
  118. col.mask = LVCF_FMT | LVCF_TEXT;
  119. col.pszText = _T("SEQ      ");
  120. col.fmt = LVCFMT_LEFT;
  121. theCtrl.InsertColumn(1, &col);
  122. col.mask = LVCF_FMT | LVCF_TEXT;
  123. col.pszText = _T("S/R");
  124. col.fmt = LVCFMT_LEFT;
  125. theCtrl.InsertColumn(2, &col);
  126. col.mask = LVCF_FMT | LVCF_TEXT;
  127. col.pszText = _T("IP HEADER                                            ");
  128. col.fmt = LVCFMT_LEFT;
  129. theCtrl.InsertColumn(3, &col);
  130. //
  131. // this last column is just and 'end of row marker'.
  132. //
  133. col.mask = LVCF_FMT | LVCF_TEXT;
  134. col.pszText = _T("");
  135. col.fmt = LVCFMT_LEFT;
  136. theCtrl.InsertColumn(4, &col);
  137. // Set reasonable widths for our columns
  138. theCtrl.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER);
  139. theCtrl.SetColumnWidth(1, LVSCW_AUTOSIZE_USEHEADER);
  140. theCtrl.SetColumnWidth(2, LVSCW_AUTOSIZE_USEHEADER);
  141. theCtrl.SetColumnWidth(3, LVSCW_AUTOSIZE_USEHEADER);
  142. theCtrl.SetColumnWidth(4, 0);
  143. }
  144. void CIpMonitorView::displayContents(IPHOOK_DATA * data)
  145. {
  146. if (!validIpHookData(data)) {
  147. return;
  148. }
  149. LVITEM item;
  150. CString msg;
  151. CString docItem;
  152. //
  153. // time 
  154. //
  155. msg.Format(_T("%016.16I64x"), data->timestamp);
  156. LPTSTR  tbuf = msg.LockBuffer();
  157. item.mask = LVIF_TEXT | LVIF_PARAM;
  158. item.iItem = 0x7FFFFFFF;
  159. item.iSubItem = 0;
  160. item.pszText = tbuf;
  161. item.cchTextMax = _tcslen( item.pszText ) + 1;
  162. item.lParam = 0;
  163. int row = GetListCtrl().InsertItem(&item);
  164. if (row == -1) {
  165. AfxErrorMessageBox(CString(_T("InsertItem failed")), 0);
  166. return;
  167. }
  168. msg.UnlockBuffer();
  169. docItem = msg;
  170. msg.Format("%08.8x", data->sequence);
  171. tbuf = msg.LockBuffer();
  172. GetListCtrl().SetItemText(row, 1, tbuf);
  173. msg.UnlockBuffer();
  174. docItem += CString(" ") + msg;
  175. //
  176. // S/R
  177. //
  178. if (data->direction) {
  179. msg = _T(" R ");
  180. } else {
  181. msg = _T(" S ");
  182. }
  183. tbuf = msg.LockBuffer();
  184. GetListCtrl().SetItemText(row, 2, tbuf);
  185. msg.UnlockBuffer();
  186. docItem += CString(" ") + msg;
  187. //
  188. // IP Header
  189. //
  190. msg.Format(
  191. _T("VL: %02.2x TOS: %02.2x LEN: %04.4x ID: %04.4x OFF: %04.4x TTL: %02.2x  PROT: %02.2x SRC: %08.8x DEST: %08.8x"),
  192. data->header.iph_verlen,
  193. data->header.iph_tos,
  194. ntohs(data->header.iph_length),
  195. ntohs(data->header.iph_id),
  196. ntohs(data->header.iph_offset),
  197. data->header.iph_ttl,
  198. data->header.iph_protocol,
  199. ntohl(data->header.iph_src),
  200. ntohl(data->header.iph_dest));
  201. tbuf = msg.LockBuffer();
  202. GetListCtrl().SetItemText(row, 3, tbuf);
  203. msg.UnlockBuffer();
  204. docItem += CString(" ") + msg;
  205. if (theApp.m_theDoc) {
  206. theApp.m_theDoc->addItem(docItem);
  207. }
  208. }
  209. int CIpMonitorView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  210. {
  211. lpCreateStruct->style |= LVS_REPORT;
  212. if (CListView::OnCreate(lpCreateStruct) == -1)
  213. return -1;
  214. // TODO: Add your specialized creation code here
  215. return 0;
  216. }
  217. afx_msg LRESULT CIpMonitorView::OnBufferMessage(WPARAM wParam, LPARAM lParam)
  218. {
  219. IPHOOK_BUFFER * buffer = (IPHOOK_BUFFER * )wParam;
  220. UCHAR * rawBuffer = (UCHAR *) buffer;
  221. if (!validIpHookBuffer(buffer)) {
  222. delete[] rawBuffer;
  223. rawBuffer = NULL;
  224. return 0;
  225. }
  226. //
  227. // lets just assume that it is valid? not!
  228. //
  229. if (buffer->valid > buffer->entries) {
  230. delete[] rawBuffer;
  231. return 0;
  232. }
  233. //
  234. // display the contents
  235. //
  236. for (UINT index = 0; index < buffer->valid; index++) {
  237. displayContents(&buffer->buffer[index]);
  238. }
  239. //
  240. // delete the buffer
  241. //
  242. delete[] rawBuffer;
  243. //
  244. // if scrolling is enabled, make the last item visible
  245. //
  246. // Ensure that the last item is visible.
  247. //
  248. int nCount = GetListCtrl().GetItemCount();
  249. if (nCount > 0) {
  250.    
  251. GetListCtrl().EnsureVisible( nCount -1, FALSE );
  252. }
  253. return 0;
  254. }
  255. void CIpMonitorView::reInitView()
  256. {
  257. GetListCtrl().DeleteAllItems();
  258. }
  259. void CIpMonitorView::OnDocClear() 
  260. {
  261. reInitView();
  262. }
  263. ///////////////////////////////////////////////////////////////////////////////
  264. // 
  265. // Change History Log
  266. //
  267. // $Log: /iphook/usr/IpMonitor/IpMonitorView.cpp $
  268. // 
  269. // 3     1/27/00 10:35p Markr
  270. // Prepare to release!
  271. //
  272. ///////////////////////////////////////////////////////////////////////////////