PeersListCtrl.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:24k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // PeersListCtrl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "testbt.h"
  5. #include "PeersListCtrl.h"
  6. #include "FileDB.h"
  7. #include "download.h"
  8. #include "CategoryBarWnd.h"
  9. #include "FileBase.h"
  10. #include "SortClass.h"
  11. #include "MonitorWnd.h"
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. #define ID_MENUITEM_PAUSE_PEERS 52834
  18. #define ID_MENUITEM_CONTINUE_PEERS ID_MENUITEM_PAUSE_PEERS+1
  19. #define ID_MENUITEM_STOP_PEERS ID_MENUITEM_PAUSE_PEERS+2
  20. #define ID_MENUITEM_SHOW_PEER_INFO ID_MENUITEM_PAUSE_PEERS+3
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CPeersListCtrl
  23. CPeersListCtrl::CPeersListCtrl()
  24. :CListCtrlBaseEx("peerslistctrl", true)
  25. {
  26. m_pFileDBItem = 0;
  27. m_pSetupRegister = 0;
  28. m_pMonitorWnd = 0;
  29. //
  30. // column infos.
  31. //
  32. CString m_strArrToolTip[ePeersColumnCount];
  33. CString strArrPeersFieldNames[ePeersColumnCount];
  34. bool bColumnNumeric[ePeersColumnCount];
  35. m_strArrToolTip[eIcon] = "箭头向右:正在与该客户端建立连接rn箭头向上:正在向该客户端传送数据rn箭头向下:正在从该客户端下载数据rn";
  36. m_strArrToolTip[eIP] = "客户端的IP地址";
  37. m_strArrToolTip[eLocale] = "本地主动连接/远程主动连接";
  38. m_strArrToolTip[eDownRate] = "从客户端下载的速度";
  39. m_strArrToolTip[eUpRate] = "上传给客户端的速度";
  40. m_strArrToolTip[eDownCount] = "已经从客户端下载的数据量";
  41. m_strArrToolTip[eUpCount] = "已经上传给客户端的数据量";
  42. m_strArrToolTip[eHave] = "在客户端的机器上已经完成下载的比例";
  43. m_strArrToolTip[eInterested] = "你是否拥有客户端需要的数据";
  44. m_strArrToolTip[eChoking] = "你是否拒绝传输数据给客户端";
  45. m_strArrToolTip[eInteresting] = "客户端是否有你需要的数据";
  46. m_strArrToolTip[eChocked] = "客户端是否拒绝出数数据给你";
  47. strArrPeersFieldNames[eIcon] = "状态";
  48. strArrPeersFieldNames[eIP] = "IP";
  49. strArrPeersFieldNames[eLocale] = "连出/连入";
  50. strArrPeersFieldNames[eDownRate] = "下载速度";
  51. strArrPeersFieldNames[eUpRate] = "上传速度";
  52. strArrPeersFieldNames[eDownCount] = "已下载";
  53. strArrPeersFieldNames[eUpCount] = "已上传";
  54. strArrPeersFieldNames[eHave] = "对方已下载";
  55. strArrPeersFieldNames[eInterested] = "你是否有对方需要的数据";
  56. strArrPeersFieldNames[eChoking] = "你是否暂时拒绝传输数据给对方对方";
  57. strArrPeersFieldNames[eInteresting] = "对方是否有你需要的数据";
  58. strArrPeersFieldNames[eChocked] = "对方是否暂时拒绝传输数据给你";
  59. for (int i=0; i<ePeersColumnCount; i++)
  60. bColumnNumeric[i] = true;
  61. bColumnNumeric[eIcon] = false;
  62. bColumnNumeric[eIP] = false;
  63. bColumnNumeric[eDownRate] = true;
  64. bColumnNumeric[eUpRate] = true;
  65. bColumnNumeric[eDownCount] = true;
  66. bColumnNumeric[eUpCount] = true;
  67. bColumnNumeric[eHave] = false;
  68. for (i=0; i<ePeersColumnCount; i++)
  69. AddColumn(strArrPeersFieldNames[i], bColumnNumeric[i], 100, m_strArrToolTip[i]);
  70. // sort .
  71. m_iSortedCol = 0; // 
  72. // m_iSortedCol = -1;
  73. // m_bSortAscending = true;
  74. m_arrColType[eIcon] = CSortClass::dtSTRING;
  75. m_arrColType[eIP] = CSortClass::dtSTRING;
  76. m_arrColType[eLocale] = CSortClass::dtSTRING;
  77. m_arrColType[eDownRate] = CSortClass::dtSTRING;
  78. m_arrColType[eUpRate] = CSortClass::dtSTRING;
  79. m_arrColType[eDownCount] = CSortClass::dtSTRING;
  80. m_arrColType[eUpCount] = CSortClass::dtSTRING;
  81. m_arrColType[eHave] = CSortClass::dtINT;
  82. m_arrColType[eInterested] = CSortClass::dtSTRING;
  83. m_arrColType[eChoking] = CSortClass::dtSTRING;
  84. m_arrColType[eInteresting] = CSortClass::dtSTRING;
  85. m_arrColType[eChocked] = CSortClass::dtSTRING;
  86. }
  87. CPeersListCtrl::~CPeersListCtrl()
  88. {
  89. }
  90. // CListCtrlBaseEx
  91. BEGIN_MESSAGE_MAP(CPeersListCtrl, CListCtrlBaseEx)
  92. //{{AFX_MSG_MAP(CPeersListCtrl)
  93. ON_WM_CONTEXTMENU()
  94. ON_WM_CREATE()
  95. ON_NOTIFY_REFLECT(LVN_DELETEITEM, OnDeleteitem)
  96. ON_WM_SIZE()
  97. ON_WM_LBUTTONDBLCLK()
  98. ON_WM_LBUTTONDOWN()
  99. //}}AFX_MSG_MAP
  100. // ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
  101. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
  102. ON_COMMAND(ID_EDIT_COPY, OnMenuitemCopy)
  103. ON_COMMAND(ID_MENUITEM_SELECT_ALL, OnMenuitemSelectAll)
  104. ON_COMMAND_RANGE(ID_MENUITEM_PAUSE_PEERS, ID_MENUITEM_SHOW_PEER_INFO, OnMenuItemPeers)
  105. ON_COMMAND_RANGE(ID_MENUITEM_MONITOR_INFORMATION, ID_MENUITEM_MONITOR_LOGS, OnMenuitemMonitorSub)
  106. END_MESSAGE_MAP()
  107. /////////////////////////////////////////////////////////////////////////////
  108. // CPeersListCtrl message handlers
  109. BOOL CPeersListCtrl::CreateEx(CWnd *pParent, CRect rc, long lID, long lParam, CSetupRegister* pSetupRegister, CMonitorWnd* pMonitorWnd)
  110. {
  111. assert(pMonitorWnd && pSetupRegister);
  112. m_pSetupRegister = pSetupRegister;
  113. m_pMonitorWnd = pMonitorWnd;
  114. assert(pSetupRegister);
  115. return Create(WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_REPORT, rc, pParent, lID);
  116. }
  117. int CPeersListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  118. {
  119. if (CListCtrlBaseEx::OnCreate(lpCreateStruct) == -1)
  120. return -1;
  121. //
  122. // ImageList.
  123. //
  124. HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
  125. MAKEINTRESOURCE(IDB_BITMAP_IMAGELIST_PEER),
  126. IMAGE_BITMAP,
  127. 0,0, 
  128. LR_CREATEDIBSECTION);
  129. CBitmap bm;
  130. bm.Attach(hbm);
  131. m_ctlImage.Create(16, 17, ILC_COLOR8|ILC_MASK, 11, 4);
  132. m_ctlImage.SetBkColor(::GetSysColor(COLOR_WINDOW)); 
  133. m_ctlImage.Add(&bm, (COLORREF)RGB(255,0,255));
  134. // m_ctlImage.Create(16,17, ILC_COLOR8|ILC_MASK, 4, 4);
  135. // m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_ICON_ASTERISK1));
  136. SetImageList(&m_ctlImage, LVSIL_SMALL);
  137. SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
  138. SetSortColumn(1);
  139. return 0;
  140. }
  141. void CPeersListCtrl::OnSize(UINT nType, int cx, int cy) 
  142. {
  143. CListCtrlBaseEx::OnSize(nType, cx, cy);
  144. }
  145. void CPeersListCtrl::OnContextMenu(CWnd* pWnd, CPoint point) 
  146. {
  147. if (CListCtrlBaseEx::OnContextMenu(pWnd, point))
  148. return;
  149. bool bcopy = false, bContinue = false, bPause = false, bClose = false, bShowPeerInfo = false;
  150. if (GetSelectedCount() == 1)
  151. bShowPeerInfo = true;
  152. if (GetSelectedCount())
  153. bClose = bcopy = true;
  154. POSITION pos = GetFirstSelectedItemPosition();
  155. while (pos)
  156. {
  157. int nItem = GetNextSelectedItem(pos);
  158. CConncetionData* pData = (CConncetionData*)GetItemData(nItem);
  159. if (!pData)
  160. {
  161. assert(false);
  162. return;
  163. }
  164. if (pData->m_bPaused)
  165. bContinue = true;
  166. if (!pData->m_bPaused)
  167. bPause = true;
  168.  
  169. if (bPause && bContinue)
  170. break;
  171. }
  172. CMenu menu_bar;
  173. menu_bar.CreatePopupMenu();
  174. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_SHOW_PEER_INFO, "显示选中连接的详细信息(&S)t");
  175. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_CONTINUE_PEERS, "继续选中连接(&X)t");
  176. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_PAUSE_PEERS, "暂停选中连接(&P)t");
  177. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_STOP_PEERS, "关闭选中连接(&Q)t");
  178. menu_bar.AppendMenu(MF_SEPARATOR);
  179. menu_bar.AppendMenu(MF_STRING, ID_EDIT_COPY, "复制(&C)t");
  180. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_SELECT_ALL, "全选(&A)t");
  181. menu_bar.EnableMenuItem(ID_MENUITEM_CONTINUE_PEERS, MF_BYCOMMAND | 
  182. (bContinue ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  183. menu_bar.EnableMenuItem(ID_MENUITEM_PAUSE_PEERS, MF_BYCOMMAND | 
  184. (bPause ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  185. menu_bar.EnableMenuItem(ID_MENUITEM_STOP_PEERS, MF_BYCOMMAND | 
  186. (bClose ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  187. menu_bar.EnableMenuItem(ID_EDIT_COPY, MF_BYCOMMAND | 
  188. (bcopy? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  189. menu_bar.EnableMenuItem(ID_MENUITEM_SHOW_PEER_INFO, MF_BYCOMMAND | 
  190. (bShowPeerInfo? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  191. menu_bar.AppendMenu(MF_SEPARATOR);
  192. if (!m_pMonitorWnd)
  193. {
  194. assert(false);
  195. return;
  196. }
  197. m_pMonitorWnd->OnContextQuery(menu_bar);
  198. CPoint posMouse;
  199. GetCursorPos(&posMouse);
  200. menu_bar.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,posMouse.x,posMouse.y,this);
  201. }
  202. void CPeersListCtrl::OnMenuitemMonitorSub(UINT uID) 
  203. {
  204. if (!m_pMonitorWnd)
  205. {
  206. assert(false);
  207. return;
  208. }
  209. if (uID >= ID_MENUITEM_MONITOR_INFORMATION && 
  210. uID <= ID_MENUITEM_MONITOR_LOGS)
  211. {
  212. m_pMonitorWnd->OnShowNode(uID );
  213. }
  214. }
  215. void CPeersListCtrl::OnColumnSort(int iColumn)
  216. {
  217. assert(abs(iColumn) <= ePeersColumnCount && abs(iColumn) > 0);
  218. m_iSortedCol = iColumn;
  219. SortItems(Compare1, m_iSortedCol);
  220. /*
  221. assert(abs(iColumn) <= ePeersColumnCount && abs(iColumn) > 0);
  222. m_bSortAscending = iColumn > 0;
  223. m_iSortedCol = abs(iColumn) - 1;
  224. CSortClass csc(this, m_iSortedCol);
  225. csc.Sort(m_bSortAscending, (CSortClass::EDataType)m_arrColType[m_iSortedCol]);
  226. //*/
  227. }
  228. int CALLBACK CPeersListCtrl::Compare1(LPARAM lParam1, LPARAM lParam2, LPARAM 
  229.  lParamSort)
  230. {
  231. CConncetionData* pItem1 = (CConncetionData*) lParam1;
  232. CConncetionData* pItem2 = (CConncetionData*) lParam2;
  233. if (!pItem1 || !pItem2)
  234. {
  235. ASSERT(pItem1 && pItem2);
  236. return 0;
  237. }
  238. CConncetionData& conn1 = *pItem1;
  239. CConncetionData& conn2 = *pItem2;
  240. long sOrder = lParamSort < 0 ? -1 : 1; 
  241. eColumns eCol = (eColumns)((lParamSort * sOrder) - 1);
  242. ////////////////////////////////////////////////////////////
  243. // for dynamic data.
  244. CStatics statics1, statics2;
  245. int iStat1 = 0, iStat2 = 0;
  246. switch (eCol)
  247. {
  248. case eIcon:
  249. {
  250. int iState1 = 0, iState2 = 0;
  251. if (conn1.m_lDownRate > 0)
  252. iState1 = 2;
  253. else if (conn1.m_lUpRate > 0)
  254. iState1 = 1;
  255. if (conn2.m_lDownRate > 0)
  256. iState2= 2;
  257. else if (conn2.m_lUpRate > 0)
  258. iState2 = 1;
  259. return (iState1 - iState2) * sOrder;
  260. }
  261. break;
  262. case eIP:
  263. {
  264. /*
  265. in_addr inaddress;
  266. inaddress.S_un.S_addr = conn1.m_lAddr;
  267. CString str1 = inet_ntoa(inaddress);
  268. inaddress.S_un.S_addr = conn2.m_lAddr;
  269. CString str2 = inet_ntoa(inaddress);
  270. //*/
  271. ULONG l1 = ntohl(conn1.m_lAddr);
  272. ULONG l2 = ntohl(conn2.m_lAddr);
  273. if (l1 == l2) return 0;
  274. return ((l1 > l2) ? 1 : -1) * sOrder;
  275. }
  276. break;
  277. case eLocale:
  278. return (conn1.m_bLocallyInitiated- conn2.m_bLocallyInitiated) * sOrder;
  279. break;
  280. case eDownRate:
  281. return (conn1.m_lDownRate - conn2.m_lDownRate) * sOrder;
  282. break;
  283. case eUpRate:
  284. return (conn1.m_lUpRate - conn2.m_lUpRate) * sOrder;
  285. break;
  286. case eDownCount:
  287. return (conn1.m_lDownCount- conn2.m_lDownCount) * sOrder;
  288. break;
  289. case eUpCount:
  290. return (conn1.m_lUpCount - conn2.m_lUpCount) * sOrder;
  291. break;
  292. case eHave:
  293. return (conn1.m_fPeerHavePercent - conn2.m_fPeerHavePercent) * 100 * sOrder;
  294. break;
  295. case eInterested:
  296. return (conn1.m_bInterested - conn2.m_bInterested) * sOrder;
  297. break;
  298. case eChoking:
  299. return (conn1.m_bChoking - conn2.m_bChoking) * sOrder;
  300. break;
  301. case eInteresting:
  302. return (conn1.m_bInteresting - conn2.m_bInteresting) * sOrder;
  303. break;
  304. case eChocked:
  305. return (conn1.m_bChoked - conn2.m_bChoked) * sOrder;
  306. break;
  307. default:
  308. assert(false);
  309. break;
  310. }
  311. return 0;
  312. }
  313. /*
  314. void CPeersListCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
  315. {
  316. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  317. *pResult = 0;
  318. int iSubItem = GetLogicalIndex(pNMListView->iSubItem);
  319. if (iSubItem == -1)
  320. {
  321. assert(false);
  322. return;
  323. }
  324. if(iSubItem == m_iSortedCol)
  325. m_bSortAscending = !m_bSortAscending;
  326. else
  327. m_bSortAscending = TRUE;
  328. m_iSortedCol = iSubItem;
  329. CSortClass csc(this, m_iSortedCol);
  330. csc.Sort(m_bSortAscending, (CSortClass::EDataType)m_arrColType[m_iSortedCol]);
  331. }
  332. //*/
  333. void CPeersListCtrl::OnDeleteitem(NMHDR* pNMHDR, LRESULT* pResult) 
  334. {
  335. *pResult = 0;
  336. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  337. CConncetionData* pData = (CConncetionData*)pNMListView->lParam;;
  338. if (!pData)
  339. {
  340. assert(false);
  341. return;
  342. }
  343. delete pData;
  344. }
  345. void CPeersListCtrl::Monitor(CFileDBItem* pFileDBItem)
  346. {
  347. m_pFileDBItem = pFileDBItem;
  348. DeleteAllItems();
  349. }
  350. void CPeersListCtrl::ShowAllPeers(bool bRefreshInfo)
  351. {
  352. SetRedraw(false);
  353. _ShowAllPeers(bRefreshInfo);
  354. SetRedraw(true);
  355. if (m_PeerInfoWnd.IsMonitoring())
  356. {
  357. if (m_pFileDBItem && m_pFileDBItem->m_pDownload && m_pFileDBItem->m_pDownload->IsDownloading())
  358. {
  359. bool bFind = false;
  360. vector<CConncetionData> vConnections = m_pFileDBItem->m_pDownload->GetConnections();
  361. for (int i=0; i<vConnections.size(); i++)
  362. {
  363. if (vConnections[i].m_lAddr == m_PeerInfoWnd.m_conData.m_lAddr && 
  364. vConnections[i].m_sPort == m_PeerInfoWnd.m_conData.m_sPort)
  365. {
  366. bFind = true;
  367. m_PeerInfoWnd.ShowPeer(vConnections[i]);
  368. break;
  369. }
  370. }
  371. if (!bFind)
  372. m_PeerInfoWnd.ClosePeer();
  373. }
  374. }
  375. }
  376. }
  377. void CPeersListCtrl::_ShowAllPeers(bool bRefreshInfo)
  378. {
  379. if (bRefreshInfo)
  380. DeleteAllItems();
  381. if (m_pFileDBItem && m_pFileDBItem->m_pDownload && m_pFileDBItem->m_pDownload->IsDownloading())
  382. {
  383. vector<CConncetionData> vConnections = m_pFileDBItem->m_pDownload->GetConnections();
  384. if (!bRefreshInfo)
  385. {
  386. vector<int> arrDelIndex;
  387. const long lCount = GetItemCount();
  388. for (int j=0; j<lCount; j++)
  389. {
  390. CConncetionData* pData = (CConncetionData*)GetItemData(j);
  391. if (!pData)
  392. {
  393. assert(false);
  394. for (int k=0; k<lCount; k++)
  395. {
  396. pData = (CConncetionData*)GetItemData(k);
  397. }
  398. return;
  399. }
  400. bool bFind = false;
  401. for (int i=0; i<vConnections.size(); i++)
  402. {
  403. if (vConnections[i].m_lAddr == pData->m_lAddr && 
  404. vConnections[i].m_sPort == pData->m_sPort)
  405. {
  406. if (*pData != vConnections[i])
  407. {
  408. RefreshPeerText(j, vConnections[i]);
  409. *pData = vConnections[i];
  410. // ShowPeerText(j);
  411. }
  412. vConnections.erase(vConnections.begin() + i);
  413. bFind = true;
  414. break;
  415. }
  416. }
  417. if (!bFind)
  418. arrDelIndex.push_back(j);
  419. }
  420. for (j=arrDelIndex.size() - 1; j >=0; j--)
  421. DeleteItem(arrDelIndex[j]);
  422. }
  423. char szText[1024] = {0};
  424. for (int i=0; i<vConnections.size(); i++)
  425. {
  426. long lInx = GetItemCount();
  427. InsertItem(lInx, "");
  428. CConncetionData* pData = new CConncetionData(vConnections[i]);
  429. SetItemData(lInx, (long)pData);
  430. ShowPeerText(lInx);
  431. }
  432. }
  433. }
  434. void CPeersListCtrl::OnShowColumn(int iItem)
  435. {
  436. ShowPeerText(iItem);
  437. }
  438. void CPeersListCtrl::RefreshPeerText(int iItem, CConncetionData& Conn)
  439. {
  440. CConncetionData* pOldData = (CConncetionData*)GetItemData(iItem);
  441. if (!pOldData)
  442. {
  443. assert(false);
  444. return;
  445. }
  446. CConncetionData& oldConn = *pOldData;
  447. int iStateOld = 0;
  448. if (oldConn.m_lDownRate > 0)
  449. iStateOld = 2;
  450. else if (oldConn.m_lUpRate > 0)
  451. iStateOld = 1;
  452. int iState = 0;
  453. if (Conn.m_lDownRate > 0)
  454. iState= 2;
  455. else if (Conn.m_lUpRate > 0)
  456. iState = 1;
  457. if (iStateOld != iState)
  458. {
  459. *pOldData = Conn;
  460. ShowPeerText(iItem);
  461. return;
  462. }
  463. char szText[1024] = {0};
  464. if (oldConn.m_bLocallyInitiated != Conn.m_bLocallyInitiated)
  465. {
  466. sprintf(szText, Conn.m_bLocallyInitiated ? "出" : "入");
  467. SetItemTextEx(iItem, eLocale, szText);
  468. }
  469. if (oldConn.m_bInterested != Conn.m_bInterested)
  470. SetItemTextEx(iItem, eInterested, Conn.m_bInterested ? "有" : "无");
  471. if (oldConn.m_bChoking != Conn.m_bChoking)
  472. SetItemTextEx(iItem, eChoking, Conn.m_bChoking ? "是" : "否");
  473. if (oldConn.m_bInteresting != Conn.m_bInteresting)
  474. SetItemTextEx(iItem, eInteresting, Conn.m_bInteresting? "有" : "无");
  475. if (oldConn.m_bChoked != Conn.m_bChoked)
  476. SetItemTextEx(iItem, eChocked, Conn.m_bChoked ? "是" : "否");
  477. if (oldConn.m_lUpRate != Conn.m_lUpRate)
  478. SetItemTextEx(iItem, eUpRate, FormatSizeK(Conn.m_lUpRate).data());
  479. if (oldConn.m_lDownRate != Conn.m_lDownRate)
  480. SetItemTextEx(iItem, eDownRate, FormatSizeK(Conn.m_lDownRate).data());
  481. if (oldConn.m_lDownCount != Conn.m_lDownCount)
  482. SetItemTextEx(iItem, eDownCount, FormatSizeM(Conn.m_lDownCount).data());
  483. if (oldConn.m_lUpCount != Conn.m_lUpCount)
  484. SetItemTextEx(iItem, eUpCount, FormatSizeM(Conn.m_lUpCount).data());
  485. if (oldConn.m_fPeerHavePercent != Conn.m_fPeerHavePercent)
  486. {
  487. sprintf(szText, "%.0f%%", Conn.m_fPeerHavePercent*100);
  488. SetItemTextEx(iItem, eHave, szText);
  489. }
  490. if (oldConn.m_bPaused != Conn.m_bPaused || oldConn.m_lDownRate != Conn.m_lDownRate)
  491. {
  492. if (Conn.m_bPaused)
  493. SetItem(iItem, 0, LVIF_IMAGE, 0, IID_PAUSE, 0, 0, 0);
  494. else
  495. {
  496. if (Conn.m_lDownRate <= 0)
  497. {
  498. if (Conn.m_lUpRate <= 0)
  499. {
  500. SetItem(iItem, 0, LVIF_IMAGE, 0, IID_CONNECTING, 0, 0, 0);
  501. }
  502. else
  503. {
  504. SetItem(iItem, 0, LVIF_IMAGE, 0, IID_UPLOAD, 0, 0, 0);
  505. }
  506. }
  507. else
  508. SetItem(iItem, 0, LVIF_IMAGE, 0, IID_DOWNLOAD, 0, 0, 0);
  509. }
  510. }
  511. }
  512. void CPeersListCtrl::ShowPeerText(int iItem)
  513. {
  514. CConncetionData* pData = (CConncetionData*)GetItemData(iItem);
  515. if (!pData)
  516. {
  517. assert(false);
  518. return;
  519. }
  520. CConncetionData& Conn = *pData;
  521. char szText[1024] = {0};
  522. in_addr inaddress;
  523. inaddress.S_un.S_addr = Conn.m_lAddr;
  524. sprintf(szText, "%s:%d", inet_ntoa(inaddress), ntohs(Conn.m_sPort));
  525. SetItemTextEx(iItem, eIP, szText);
  526. sprintf(szText, Conn.m_bLocallyInitiated ? "出" : "入");
  527. SetItemTextEx(iItem, eLocale, szText);
  528. SetItemTextEx(iItem, eIcon, "");
  529. SetItemTextEx(iItem, eInterested, Conn.m_bInterested ? "有" : "无");
  530. SetItemTextEx(iItem, eChoking, Conn.m_bChoking ? "是" : "否");
  531. SetItemTextEx(iItem, eInteresting, Conn.m_bInteresting? "有" : "无");
  532. SetItemTextEx(iItem, eChocked, Conn.m_bChoked ? "是" : "否");
  533. SetItemTextEx(iItem, eUpRate, FormatSizeK(Conn.m_lUpRate).data());
  534. SetItemTextEx(iItem, eDownRate, FormatSizeK(Conn.m_lDownRate).data());
  535. SetItemTextEx(iItem, eDownCount, FormatSizeM(Conn.m_lDownCount).data());
  536. SetItemTextEx(iItem, eUpCount, FormatSizeM(Conn.m_lUpCount).data());
  537. sprintf(szText, "%.0f%%", Conn.m_fPeerHavePercent*100);
  538. SetItemTextEx(iItem, eHave, szText);
  539. if (pData->m_bPaused)
  540. SetItem(iItem, 0, LVIF_IMAGE, 0, IID_PAUSE, 0, 0, 0);
  541. else
  542. {
  543. if (pData->m_lDownRate <= 0)
  544. {
  545. if (pData->m_lUpRate <= 0)
  546. {
  547. SetItem(iItem, 0, LVIF_IMAGE, 0, IID_CONNECTING, 0, 0, 0);
  548. }
  549. else
  550. {
  551. SetItem(iItem, 0, LVIF_IMAGE, 0, IID_UPLOAD, 0, 0, 0);
  552. }
  553. }
  554. else
  555. SetItem(iItem, 0, LVIF_IMAGE, 0, IID_DOWNLOAD, 0, 0, 0);
  556. }
  557. }
  558. void CPeersListCtrl::OnMenuItemPeers(UINT uID)
  559. {
  560. if (!m_pFileDBItem || !m_pFileDBItem->m_pDownload || !m_pFileDBItem->m_pDownload->IsDownloading())
  561. {
  562. assert(false);
  563. return;
  564. }
  565. switch (uID)
  566. {
  567. case ID_MENUITEM_CONTINUE_PEERS:
  568. {
  569. POSITION pos = GetFirstSelectedItemPosition();
  570. while (pos)
  571. {
  572. int nItem = GetNextSelectedItem(pos);
  573. CConncetionData* pData = (CConncetionData*)GetItemData(nItem);
  574. if (!pData)
  575. {
  576. assert(false);
  577. return;
  578. }
  579. if (pData->m_bPaused)
  580. {
  581. m_pFileDBItem->m_pDownload->PausePeer(CAddrPort(pData->m_lAddr, pData->m_sPort), false);
  582. pData->m_bPaused = false;
  583. ShowPeerText(nItem);
  584. }
  585. }
  586. }
  587. break;
  588. case ID_MENUITEM_PAUSE_PEERS:
  589. {
  590. POSITION pos = GetFirstSelectedItemPosition();
  591. while (pos)
  592. {
  593. int nItem = GetNextSelectedItem(pos);
  594. CConncetionData* pData = (CConncetionData*)GetItemData(nItem);
  595. if (!pData)
  596. {
  597. assert(false);
  598. return;
  599. }
  600. if (!pData->m_bPaused)
  601. {
  602. m_pFileDBItem->m_pDownload->PausePeer(CAddrPort(pData->m_lAddr, pData->m_sPort), true);
  603. pData->m_bPaused = true;
  604. ShowPeerText(nItem);
  605. }
  606. pData = (CConncetionData*)GetItemData(nItem);
  607. if (!pData)
  608. {
  609. assert(false);
  610. return;
  611. }
  612. }
  613. }
  614. break;
  615. case ID_MENUITEM_STOP_PEERS:
  616. {
  617. POSITION pos = GetFirstSelectedItemPosition();
  618. while (pos)
  619. {
  620. int nItem = GetNextSelectedItem(pos);
  621. CConncetionData* pData = (CConncetionData*)GetItemData(nItem);
  622. if (!pData)
  623. {
  624. assert(false);
  625. return;
  626. }
  627. m_pFileDBItem->m_pDownload->ClosePeer(CAddrPort(pData->m_lAddr, pData->m_sPort));
  628. }
  629. }
  630. break;
  631. case ID_MENUITEM_SHOW_PEER_INFO:
  632. {
  633. POSITION pos = GetFirstSelectedItemPosition();
  634. if (pos)
  635. {
  636. int nItem = GetNextSelectedItem(pos);
  637. CConncetionData* pData = (CConncetionData*)GetItemData(nItem);
  638. ShowWindow(false);
  639. m_PeerInfoWnd.ShowWindow(true);
  640. m_PeerInfoWnd.ShowPeer(*pData);
  641. m_PeerInfoWnd.SetFocus();
  642. }
  643. }
  644. break;
  645. default:
  646. assert(false);
  647. }
  648. }
  649. void CPeersListCtrl::OnMenuitemCopy()
  650. {
  651. CString strSource;
  652. int nColumnCount = GetHeaderCtrl()->GetItemCount();
  653. POSITION pos = GetFirstSelectedItemPosition();
  654. while (pos)
  655. {
  656. int index = GetNextSelectedItem(pos);
  657. for (int i=0; i<nColumnCount; i++)
  658. strSource += GetItemText(index, i) + "  ";
  659. strSource += "rn";
  660. }
  661. if (!CopyTextToClipboard(strSource))
  662. AfxMessageBox("复制失败");
  663. }
  664. void CPeersListCtrl::OnMenuitemSelectAll()
  665. {
  666. for (int i=0; i<GetItemCount(); i++)
  667. SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);
  668. SetFocus();
  669. }
  670. void CPeersListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
  671. {
  672. LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
  673. switch(lplvcd->nmcd.dwDrawStage)
  674. {
  675. case CDDS_PREPAINT:
  676. *pResult = CDRF_NOTIFYSUBITEMDRAW;          // ask for subitem notifications.
  677. *pResult = CDRF_NOTIFYPOSTERASE;
  678. break;
  679. case CDDS_ITEMPREERASE:
  680. {
  681. int ik = 0;
  682. }
  683. break;
  684. case CDDS_ITEMPREPAINT:
  685. {
  686. *pResult = CDRF_DODEFAULT;
  687. if (!(lplvcd->nmcd.uItemState & CDIS_SELECTED ))
  688. {
  689. CConncetionData* pData = (CConncetionData*)lplvcd->nmcd.lItemlParam;
  690. if (!pData)
  691. {
  692. assert(false);
  693. return;
  694. }
  695. CConncetionData& Conn = *pData;
  696. if (Conn.m_lDownRate > 0)
  697. {
  698. lplvcd->clrTextBk = RGB(235, 242, 254);
  699. }
  700. else if (Conn.m_lUpRate > 0)
  701. {
  702. lplvcd->clrTextBk = RGB(255, 250, 237);
  703. }
  704. else
  705. {
  706. lplvcd->clrTextBk = RGB(255, 255, 255);
  707. }
  708. /*
  709. CSystemMsg* pData = (CSystemMsg*)lplvcd->nmcd.lItemlParam;
  710. CSystemMsg& msg = *pData;
  711. switch (msg.m_eMsgType)
  712. {
  713. case CSystemMsg::eMsgOut:
  714. lplvcd->clrTextBk = RGB(235, 242, 254);
  715. break;
  716. case CSystemMsg::eMsgIn:
  717. lplvcd->clrTextBk = RGB(255, 250, 237); //RGB(230, 230, 250); // 175, 238, 238
  718. break;
  719. case CSystemMsg::eCmd:
  720. lplvcd->clrTextBk = RGB(235, 242, 254);
  721. break;
  722. case CSystemMsg::eBad:
  723. lplvcd->clrTextBk = RGB(254, 238, 231);
  724. break;
  725. default:
  726. assert(false);
  727. return;
  728. }
  729. //*/
  730. *pResult = CDRF_NEWFONT;
  731. }
  732. //*pResult = CDRF_NOTIFYSUBITEMDRAW;          // ask for subitem notifications.
  733. }
  734. break;
  735. case CDDS_ITEMPREPAINT|CDDS_SUBITEM: // recd when CDRF_NOTIFYSUBITEMDRAW is returned in
  736. {                                    // response to CDDS_ITEMPREPAINT.
  737. *pResult = CDRF_DODEFAULT;
  738. int iCol = lplvcd->iSubItem;
  739. int iRow = lplvcd->nmcd.dwItemSpec;
  740. break;
  741. }
  742. default:// it wasn't a notification that was interesting to us.
  743. *pResult = CDRF_DODEFAULT;
  744. }
  745. }
  746. void CPeersListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) 
  747. {
  748. POSITION pos = GetFirstSelectedItemPosition();
  749. if (pos)
  750. {
  751. int nItem = GetNextSelectedItem(pos);
  752. CConncetionData* pData = (CConncetionData*)GetItemData(nItem);
  753. ShowWindow(false);
  754. m_PeerInfoWnd.ShowWindow(true);
  755. m_PeerInfoWnd.ShowPeer(*pData);
  756. m_PeerInfoWnd.SetFocus();
  757. }
  758. CListCtrlBaseEx::OnLButtonDblClk(nFlags, point);
  759. }
  760. void CPeersListCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
  761. {
  762. CListCtrlBaseEx::OnLButtonDown(nFlags, point);
  763. }
  764. void CPeersListCtrl::OnMenuItemPeerInfo(const UINT uID, const CConncetionData& conData )
  765. {
  766. if (!m_pFileDBItem)
  767. {
  768. assert(false);
  769. return;
  770. }
  771. switch (uID)
  772. {
  773. case ID_MENUITEM_CONTINUE_PEERS:
  774. {
  775. m_pFileDBItem->m_pDownload->PausePeer(CAddrPort(conData.m_lAddr, conData.m_sPort), false);
  776. }
  777. break;
  778. case ID_MENUITEM_PAUSE_PEERS:
  779. {
  780. m_pFileDBItem->m_pDownload->PausePeer(CAddrPort(conData.m_lAddr, conData.m_sPort), true);
  781. }
  782. break;
  783. case ID_MENUITEM_STOP_PEERS:
  784. {
  785. m_pFileDBItem->m_pDownload->ClosePeer(CAddrPort(conData.m_lAddr, conData.m_sPort));
  786. }
  787. break;
  788. default:
  789. {
  790. assert(false);
  791. return;
  792. }
  793. }
  794. }