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

P2P编程

开发平台:

Visual C++

  1. // InfomationList.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "testbt.h"
  5. #include "InfomationList.h"
  6. #include "FileDB.h"
  7. #include "FileBase.h"
  8. #include "StorageWrapper.h"
  9. #include "SetupRegister.h"
  10. #include "MonitorWnd.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CInfomationList
  18. CInfomationList::CInfomationList():
  19. CListCtrlBaseEx("InfomationList", false)
  20. {
  21. //
  22. // column infos.
  23. //
  24. CString strFieldNames[eColumnCount];
  25. bool bColumnNumeric[eColumnCount];
  26. strFieldNames[eTime] = "参数";
  27. strFieldNames[eInfo] = "值";
  28. bColumnNumeric[eTime] = false;
  29. bColumnNumeric[eInfo] = false;
  30. AddColumn(strFieldNames[0], bColumnNumeric[0]);
  31. AddColumn(strFieldNames[1], bColumnNumeric[1], 1000);
  32. m_pFileDBItem = 0;
  33. m_pSetupRegister = 0;
  34. m_pMonitorWnd = 0;
  35. m_lBasicInfoInx = 0;
  36. m_lRunInfoInx = 8;
  37. m_lRunParamInx = 17;
  38. }
  39. CInfomationList::~CInfomationList()
  40. {
  41. }
  42. BEGIN_MESSAGE_MAP(CInfomationList, CListCtrlBaseEx)
  43. //{{AFX_MSG_MAP(CInfomationList)
  44. ON_WM_CREATE()
  45. ON_WM_CONTEXTMENU()
  46. //}}AFX_MSG_MAP
  47. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
  48. ON_COMMAND(ID_EDIT_COPY, OnMenuitemCopy)
  49. ON_COMMAND(ID_MENUITEM_SELECT_ALL, OnMenuitemSelectAll)
  50. ON_COMMAND_RANGE(ID_MENUITEM_MONITOR_INFORMATION, ID_MENUITEM_MONITOR_LOGS, OnMenuitemMonitorSub)
  51. END_MESSAGE_MAP()
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CInfomationList message handlers
  54. BOOL CInfomationList::CreateEx(CWnd *pParent, CRect rc, long lID, long lParam, CSetupRegister* pSetupRegister, CMonitorWnd* pMonitorWnd)
  55. {
  56. assert(pSetupRegister);
  57. m_pSetupRegister = pSetupRegister;
  58. m_pMonitorWnd = pMonitorWnd;
  59. return Create(WS_CHILD|WS_BORDER|WS_VISIBLE|WS_VSCROLL|LVS_REPORT, rc, pParent, lID);
  60. }
  61. int CInfomationList::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  62. {
  63. if (CListCtrlBaseEx::OnCreate(lpCreateStruct) == -1)
  64. return -1;
  65. m_ctlImage.Create(16,17, ILC_COLOR8|ILC_MASK, 4, 4);
  66. m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_ICON_ASTERISK1));
  67. SetImageList(&m_ctlImage, LVSIL_SMALL);
  68. SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
  69. // show title.
  70. long lBasicInfoInx = m_lBasicInfoInx;
  71. InsertItem(lBasicInfoInx, "文件信息", eASTERISK);
  72. lBasicInfoInx ++;
  73. InsertItem(lBasicInfoInx , "保存文件名", eASTERISK);
  74. lBasicInfoInx ++;
  75. InsertItem(lBasicInfoInx , "torrent文件名", eASTERISK);
  76. lBasicInfoInx ++;
  77. InsertItem(lBasicInfoInx , "认证码(hash)", eASTERISK);
  78. lBasicInfoInx ++;
  79. InsertItem(lBasicInfoInx , "文件大小", eASTERISK);
  80. lBasicInfoInx ++;
  81. InsertItem(lBasicInfoInx, "创建时间", eASTERISK);
  82. lBasicInfoInx ++;
  83. InsertItem(lBasicInfoInx , "已完成", eASTERISK);
  84. lBasicInfoInx ++;
  85. InsertItem(lBasicInfoInx, "", -1);
  86. lBasicInfoInx ++;
  87. long lRunInfoInx = m_lRunInfoInx;
  88. InsertItem(lRunInfoInx, "运行信息:", eASTERISK);
  89. InsertItem(lRunInfoInx + 1,  "当前状态:", eASTERISK);
  90. InsertItem(lRunInfoInx + 2, "下载速度:", eASTERISK);
  91. InsertItem(lRunInfoInx + 3,  "上传速度:", eASTERISK);
  92. InsertItem(lRunInfoInx + 4, "剩余时间:", eASTERISK);
  93. InsertItem(lRunInfoInx + 5, "已运行时间:", eASTERISK);
  94. InsertItem(lRunInfoInx + 6, "种子/连接数:", eASTERISK);
  95. InsertItem(lRunInfoInx + 7, "绑定端口:", eASTERISK);
  96. InsertItem(lRunInfoInx + 8, "", -1);
  97. long lRunParamInx = m_lRunParamInx;
  98. InsertItem(lRunParamInx, "运行参数:", eASTERISK);
  99. InsertItem(lRunParamInx + 1, "最小下载者数:", eASTERISK);
  100. InsertItem(lRunParamInx + 2, "最大下载者数:", eASTERISK);
  101. InsertItem(lRunParamInx + 3, "显示间隔:", eASTERISK);
  102. InsertItem(lRunParamInx + 4, "文件安置模式:", eASTERISK);
  103. InsertItem(lRunParamInx + 5, "最大打开文件:", eASTERISK);
  104. InsertItem(lRunParamInx + 6, "最大上传速度:", eASTERISK);
  105. InsertItem(lRunParamInx + 7, "最大上传连接:", eASTERISK);
  106. return 0;
  107. }
  108. void CInfomationList::OnContextMenu(CWnd* pWnd, CPoint point) 
  109. {
  110. // if (CListCtrlBaseEx::OnContextMenu(pWnd, point))
  111. // return;
  112. CRect rc;
  113. GetClientRect(&rc);
  114. ClientToScreen(rc);
  115. if (!rc.PtInRect(point))
  116. {
  117. CWnd::OnContextMenu(pWnd, point);
  118. return;
  119. }
  120. bool bcopy = false;
  121. if (GetSelectedCount())
  122. bcopy = true;
  123. CMenu menu_bar;
  124. menu_bar.CreatePopupMenu();
  125. menu_bar.AppendMenu(MF_STRING, ID_EDIT_COPY, "复制(&C)t");
  126. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_SELECT_ALL, "全选(&A)t");
  127. menu_bar.EnableMenuItem(ID_EDIT_COPY, MF_BYCOMMAND | 
  128. (bcopy? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  129. menu_bar.AppendMenu(MF_SEPARATOR);
  130. if (!m_pMonitorWnd)
  131. {
  132. assert(false);
  133. return;
  134. }
  135. m_pMonitorWnd->OnContextQuery(menu_bar);
  136. CPoint posMouse;
  137. GetCursorPos(&posMouse);
  138. menu_bar.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,posMouse.x,posMouse.y,this);
  139. }
  140. void CInfomationList::OnMenuitemCopy()
  141. {
  142. CString strSource; 
  143. int nColumnCount = GetHeaderCtrl()->GetItemCount();
  144. POSITION pos = GetFirstSelectedItemPosition();
  145. while (pos)
  146. {
  147. int index = GetNextSelectedItem(pos);
  148. for (int i=0; i<nColumnCount; i++)
  149. strSource += GetItemText(index, i) + "  ";
  150. strSource += "rn";
  151. }
  152. if (!CopyTextToClipboard(strSource))
  153. AfxMessageBox("复制失败");
  154. }
  155. void CInfomationList::OnMenuitemMonitorSub(UINT uID) 
  156. {
  157. if (!m_pMonitorWnd)
  158. {
  159. assert(false);
  160. return;
  161. }
  162. if (uID >= ID_MENUITEM_MONITOR_INFORMATION && 
  163. uID <= ID_MENUITEM_MONITOR_LOGS)
  164. {
  165. m_pMonitorWnd->OnShowNode(uID );
  166. }
  167. }
  168. void CInfomationList::OnMenuitemSelectAll()
  169. {
  170. for (int i=0; i<GetItemCount(); i++)
  171. SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);
  172. SetFocus();
  173. }
  174. void CInfomationList::OnShowColumn(int iItem)
  175. {
  176. // ShowMsgText(iItem);
  177. }
  178. void CInfomationList::Monitor(CFileDBItem* pFileDBItem)
  179. {
  180. m_pFileDBItem = pFileDBItem;
  181. for (int i=0; i<GetItemCount(); i++)
  182. SetItemText(i, 1, "");
  183. }
  184. void CInfomationList::ShowInfomation(bool bRefreshInfo)
  185. {
  186. if (bRefreshInfo) 
  187. {
  188. for (int i=0; i<GetItemCount(); i++)
  189. SetItemText(i, 1, "");
  190. // DeleteAllItems();
  191. }
  192. if (!m_pFileDBItem) return;
  193. long lBasicInfoInx = m_lBasicInfoInx;
  194. long lCompleteInx = lBasicInfoInx + 6;
  195. if (bRefreshInfo) 
  196. {
  197. // InsertItem(lBasicInfoInx, "文件信息", eASTERISK);
  198. lBasicInfoInx ++;
  199. // InsertItem(lBasicInfoInx , "保存文件名", eASTERISK);
  200. SetItemText(lBasicInfoInx, 1, m_pFileDBItem->m_strFileName.data());
  201. lBasicInfoInx ++;
  202. // InsertItem(lBasicInfoInx , "torrent文件名", eASTERISK);
  203. SetItemText(lBasicInfoInx, 1, m_pFileDBItem->m_strTorrentFileName.data());
  204. lBasicInfoInx ++;
  205. // InsertItem(lBasicInfoInx , "认证码(hash)", eASTERISK);
  206. SetItemText(lBasicInfoInx, 1, m_pFileDBItem->m_strHash.data());
  207. lBasicInfoInx ++;
  208. // InsertItem(lBasicInfoInx , "文件大小", eASTERISK);
  209. SetItemText(lBasicInfoInx, 1, FormatSize(m_pFileDBItem->m_lFileSize).data());
  210. lBasicInfoInx ++;
  211. CTime tCreatedTime(m_pFileDBItem->m_tTime);
  212. // InsertItem(lBasicInfoInx, "创建时间", eASTERISK);
  213. SetItemText(lBasicInfoInx, 1, tCreatedTime.Format("%Y-%m-%d %H:%M"));
  214. lBasicInfoInx ++;
  215. CString strText;
  216. strText.Format("%d%%", (long)((m_pFileDBItem->m_fComplete)*100));
  217. SetItemText(lCompleteInx, 1, strText);
  218. }
  219. long lRunInfoInx = m_lRunInfoInx;
  220. if (m_pFileDBItem && m_pFileDBItem->m_pDownload && m_pFileDBItem->m_pDownload->IsDownloading())
  221. {
  222. // the download is terminated.
  223. CString strStatus;
  224. if (m_pFileDBItem ->m_pDownload->IsBad())
  225. {
  226. if (bRefreshInfo || m_eRunState != eBad)
  227. {
  228. strStatus = "错误";
  229. SetItemText(lRunInfoInx + 1, 1, strStatus);
  230. SetItemText(lRunInfoInx + 2, 1, "");
  231. SetItemText(lRunInfoInx + 3, 1, "");
  232. SetItemText(lRunInfoInx + 4, 1, "");
  233. SetItemText(lRunInfoInx + 5, 1, "");
  234. SetItemText(lRunInfoInx + 6, 1, "");
  235. SetItemText(lRunInfoInx + 7, 1, "");
  236. }
  237. m_eRunState = eBad;
  238. }
  239. else if (m_pFileDBItem->m_pDownload->IsPause())
  240. {
  241. strStatus = "暂停 ";
  242. SetItemText(lRunInfoInx + 1, 1, strStatus);
  243. m_eRunState = ePause;
  244. }
  245. else if (!m_pFileDBItem->m_pDownload->IsDownloading())// download maybe not begin yet.
  246. {
  247. if (bRefreshInfo || m_eRunState != eWait)
  248. {
  249. strStatus = "等待";
  250. SetItemTextEx(lRunInfoInx + 1, 1, strStatus);
  251. SetItemTextEx(lRunInfoInx + 2, 1, "");
  252. SetItemTextEx(lRunInfoInx + 3, 1, "");
  253. SetItemTextEx(lRunInfoInx + 4, 1, "");
  254. SetItemTextEx(lRunInfoInx + 5, 1, "");
  255. SetItemTextEx(lRunInfoInx + 6, 1, "");
  256. SetItemTextEx(lRunInfoInx + 7, 1, "");
  257. }
  258. m_eRunState = eWait;
  259. }
  260. else
  261. {
  262. strStatus = "正在运行 ";
  263. m_eRunState = eRun;
  264. }
  265. if (m_eRunState == eRun || (m_eRunState == ePause && bRefreshInfo))
  266. {
  267. CStatics statics = m_pFileDBItem->m_pDownload->GetStatics();
  268. char szText[1024] = {0};
  269. if (statics.m_bAllocating)
  270. {
  271. sprintf(szText, "分配空间(%.2f)", statics.m_fAllocatingPercent);
  272. strStatus += szText;
  273. SetItemText(lRunInfoInx + 1, 1, strStatus);
  274. if (bRefreshInfo || m_eRunState != eAllocate)
  275. {
  276. SetItemTextEx(lRunInfoInx + 2, 1, "");
  277. SetItemTextEx(lRunInfoInx + 3, 1, "");
  278. SetItemTextEx(lRunInfoInx + 4, 1, "");
  279. SetItemTextEx(lRunInfoInx + 5, 1, "");
  280. SetItemTextEx(lRunInfoInx + 6, 1, "");
  281. SetItemTextEx(lRunInfoInx + 7, 1, "");
  282. }
  283. m_eRunState = eAllocate;
  284. }
  285. else  if (statics.m_bStorageChecking)
  286. {
  287. sprintf(szText, "Checking(%.2f)", statics.m_fCheckingPercent);
  288. strStatus += szText;
  289. SetItemText(lRunInfoInx + 1, 1, strStatus);
  290. if (bRefreshInfo || m_eRunState != eCheck)
  291. {
  292. SetItemTextEx(lRunInfoInx + 2, 1, "");
  293. SetItemTextEx(lRunInfoInx + 3, 1, "");
  294. SetItemTextEx(lRunInfoInx + 4, 1, "");
  295. SetItemTextEx(lRunInfoInx + 5, 1, "");
  296. SetItemTextEx(lRunInfoInx + 6, 1, "");
  297. SetItemTextEx(lRunInfoInx + 7, 1, "");
  298. }
  299. m_eRunState = eCheck;
  300. }
  301. else 
  302. {
  303. if (m_eRunState != ePause)
  304. {
  305. SetItemText(lRunInfoInx + 1, 1, strStatus);
  306. }
  307. CString strText;
  308. strText.Format("%d%%", (long)((statics.m_fCompleted)*100));
  309. SetItemText(lCompleteInx, 1, strText);
  310. sprintf(szText, "%s", FormatSize(statics.m_lDownRate).data());
  311. SetItemText(lRunInfoInx + 2, 1, szText);
  312. sprintf(szText, "%s", FormatSize(statics.m_lUpRate).data());
  313. SetItemText(lRunInfoInx + 3, 1, szText);
  314. if (statics.m_tTimeLeft < 0)
  315. {
  316. SetItemText(lRunInfoInx + 4, 1, "-");
  317. }
  318. else
  319. {
  320. CTimeSpan TimeLeft(statics.m_tTimeLeft);
  321. SetItemText(lRunInfoInx + 4, 1, TimeLeft.Format("%D:%H:%M:%S"));
  322. }
  323. CTimeSpan TimeRunned(statics.m_tTimeRunned);
  324. SetItemText(lRunInfoInx + 5, 1, TimeRunned.Format("%D:%H:%M:%S"));
  325. sprintf(szText, "%d/%d", statics.m_lSeedsCount, statics.m_lPeersCount);
  326. SetItemText(lRunInfoInx + 6, 1, szText);
  327. long lPort = 0, lPeerMin = 0, lPeerMax = 0, lDisplayItval = 0, lAllocType = 0, lFileOpenMax =0;
  328. m_pFileDBItem->m_pDownload->GetRunParameter(lPort,lPeerMin, lPeerMax, lDisplayItval, lAllocType, lFileOpenMax);
  329. sprintf(szText, "%d", lPort);
  330. SetItemText(lRunInfoInx + 7, 1, szText);
  331. // set data
  332. // pItem->m_fComplete = statics.m_fCompleted;
  333. //  set image
  334. /*
  335. bool bCompleted = fCompleted >= 1;
  336. int iImageID = 0;
  337. if (!statics.m_bTrackerConnected)
  338. {
  339. iImageID = bCompleted ? IID_UPLOAD_TRACKER : IID_DOWNLOAD_TRACKER;
  340. }
  341. else if(statics.m_lPeersCount == 0)
  342. {
  343. iImageID = bCompleted ? IID_UPLOAD_OTHERS: IID_DOWNLOAD_OTHERS;
  344. }
  345. else if (statics.m_bFired)
  346. {
  347. iImageID = bCompleted ? IID_UPLOAD_FIRE: IID_DOWNLOAD_FIRE;
  348. }
  349. else if (statics.m_lSeedsCount == 0)
  350. {
  351. iImageID = bCompleted ? IID_UPLOAD_SEED : IID_DOWNLOAD_SEED;
  352. }
  353. else
  354. {
  355. iImageID = bCompleted ? IID_UPLOAD : IID_DOWNLOAD;
  356. }
  357. SetItem(i, 0, LVIF_IMAGE, 0, iImageID, 0, 0, 0);
  358. //*/
  359. }
  360. }
  361. }
  362. long lRunParamInx = m_lRunParamInx;
  363. if (bRefreshInfo) 
  364. {
  365. CString strText;
  366. long lPort = 0, lPeerMin = 0, lPeerMax = 0, lDisplayItval = 0, lAllocType = 0, lFileOpenMax =0;
  367. if (m_pFileDBItem && m_pFileDBItem->m_pDownload && m_pFileDBItem->m_pDownload->IsDownloading())
  368. {
  369. m_pFileDBItem->m_pDownload->GetRunParameter(lPort,lPeerMin, lPeerMax, lDisplayItval, lAllocType, lFileOpenMax);
  370. }
  371. else
  372. {
  373. if (m_pSetupRegister)
  374. {
  375. lPeerMin = m_pSetupRegister->m_lPeersMin;
  376. lPeerMax = m_pSetupRegister->m_lPeersMax;
  377. lDisplayItval = m_pSetupRegister->m_lDisplayItval;
  378. lAllocType = m_pSetupRegister->m_eAllocType;
  379. lFileOpenMax = m_pSetupRegister->m_lFileOpenMax;
  380. }
  381. }
  382. // lPeerMax = m_pFileDBItem->m_lUploadPeerMax;
  383. // m_pFileDBItem->m_
  384. strText.Format("%d", lPeerMin);
  385. SetItemText(lRunParamInx + 1, 1, strText);
  386. strText.Format("%d", lPeerMax);
  387. SetItemText(lRunParamInx + 2, 1, strText);
  388. strText.Format("%d微秒", lDisplayItval);
  389. SetItemText(lRunParamInx + 3, 1, strText);
  390. switch (lAllocType)
  391. {
  392. case CStorageWrapperEx::eAllocNormal:
  393. strText = "普通分配";
  394. break;
  395. case CStorageWrapperEx::eAllocSparse:
  396. strText = "特殊分配";
  397. break;
  398. case CStorageWrapperEx::eAllocPreAllocate:
  399. strText = "预分配";
  400. break;
  401. case CStorageWrapperEx::eAllocBackGound:
  402. strText = "后台分配";
  403. break;
  404. }
  405. SetItemText(lRunParamInx + 4, 1, strText);
  406. strText.Format("%d", lFileOpenMax);
  407. SetItemText(lRunParamInx + 5, 1, strText);
  408. strText.Format("%d(K)", m_pFileDBItem->m_lUploadSpeedMax);
  409. SetItemText(lRunParamInx + 6, 1, strText);
  410. strText.Format("%d", m_pFileDBItem->m_lUploadPeerMax);
  411. SetItemText(lRunParamInx + 7, 1, strText);
  412. }
  413. }
  414. void CInfomationList::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
  415. {
  416. LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
  417. switch(lplvcd->nmcd.dwDrawStage)
  418. {
  419. case CDDS_PREPAINT:
  420. *pResult = CDRF_NOTIFYSUBITEMDRAW;          // ask for subitem notifications.
  421. break;
  422. case CDDS_ITEMPREPAINT:
  423. {
  424. *pResult = CDRF_DODEFAULT;
  425. if (lplvcd->nmcd.dwItemSpec == m_lBasicInfoInx)
  426. {
  427. lplvcd->clrTextBk = RGB(235, 242, 254);
  428. }
  429. else if (lplvcd->nmcd.dwItemSpec == m_lRunInfoInx)
  430. {
  431. lplvcd->clrTextBk = RGB(235, 242, 254);
  432. }
  433. else if (lplvcd->nmcd.dwItemSpec == m_lRunParamInx)
  434. {
  435. lplvcd->clrTextBk = RGB(235, 242, 254);
  436. }
  437. else
  438. {
  439. return;
  440. }
  441. *pResult = CDRF_NEWFONT;
  442. }
  443. break;
  444. }
  445. }