PageRenderTime 59ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 1ms

/srchybrid/StatisticsDlg.cpp

https://github.com/acat/emule
C++ | 3498 lines | 2949 code | 277 blank | 272 comment | 646 complexity | d574d37a32225f8da8c164e512d36778 MD5 | raw file
Possible License(s): LGPL-2.0, LGPL-3.0, BSD-3-Clause

Large files files are truncated, but you can click here to view the full file

  1. //this file is part of eMule
  2. //Copyright (C)2002-2008 Merkur ( strEmail.Format("%s@%s", "devteam", "emule-project.net") / http://www.emule-project.net )
  3. //
  4. //This program is free software; you can redistribute it and/or
  5. //modify it under the terms of the GNU General Public License
  6. //as published by the Free Software Foundation; either
  7. //version 2 of the License, or (at your option) any later version.
  8. //
  9. //This program is distributed in the hope that it will be useful,
  10. //but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. //GNU General Public License for more details.
  13. //
  14. //You should have received a copy of the GNU General Public License
  15. //along with this program; if not, write to the Free Software
  16. //Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. #include "stdafx.h"
  18. #include "emule.h"
  19. #include "StatisticsDlg.h"
  20. #include "UploadQueue.h"
  21. #include "Statistics.h"
  22. #include "emuledlg.h"
  23. #include "OtherFunctions.h"
  24. #include "WebServer.h"
  25. #include "DownloadQueue.h"
  26. #include "ClientList.h"
  27. #include "Preferences.h"
  28. #include "ListenSocket.h"
  29. #include "ServerList.h"
  30. #include "SharedFileList.h"
  31. #include "UpDownClient.h"
  32. #include "UserMsgs.h"
  33. #include "HelpIDs.h"
  34. #include "Kademlia/Kademlia/kademlia.h"
  35. #include "Kademlia/Kademlia/Prefs.h"
  36. #include "kademlia/kademlia/UDPFirewallTester.h"
  37. #ifdef _DEBUG
  38. #define new DEBUG_NEW
  39. #undef THIS_FILE
  40. static char THIS_FILE[] = __FILE__;
  41. #endif
  42. #ifdef _DEBUG
  43. extern _CRT_ALLOC_HOOK g_pfnPrevCrtAllocHook;
  44. #endif
  45. // CStatisticsDlg dialog
  46. IMPLEMENT_DYNAMIC(CStatisticsDlg, CDialog)
  47. BEGIN_MESSAGE_MAP(CStatisticsDlg, CResizableDialog)
  48. ON_WM_SHOWWINDOW()
  49. ON_WM_SIZE()
  50. ON_BN_CLICKED(IDC_BNMENU, OnMenuButtonClicked)
  51. ON_WM_SYSCOLORCHANGE()
  52. ON_WM_CTLCOLOR()
  53. ON_STN_DBLCLK(IDC_SCOPE_D, OnStnDblclickScopeD)
  54. ON_STN_DBLCLK(IDC_SCOPE_U, OnStnDblclickScopeU)
  55. ON_STN_DBLCLK(IDC_STATSSCOPE, OnStnDblclickStatsscope)
  56. ON_MESSAGE(UM_OSCOPEPOSITION, OnOscopePositionMsg)
  57. ON_WM_HELPINFO()
  58. END_MESSAGE_MAP()
  59. CStatisticsDlg::CStatisticsDlg(CWnd* pParent /*=NULL*/)
  60. : CResizableDialog(CStatisticsDlg::IDD, pParent)
  61. , m_DownloadOMeter(3)
  62. , m_Statistics(4)
  63. , m_UploadOMeter(5)
  64. {
  65. m_oldcx=0;
  66. m_oldcy=0;
  67. m_TimeToolTips = NULL;
  68. }
  69. CStatisticsDlg::~CStatisticsDlg()
  70. {
  71. delete m_TimeToolTips;
  72. #ifdef _DEBUG
  73. POSITION pos = blockFiles.GetStartPosition();
  74. while (pos != NULL)
  75. {
  76. const unsigned char* fileName;
  77. HTREEITEM* pTag;
  78. blockFiles.GetNextAssoc(pos, fileName, pTag);
  79. delete pTag;
  80. }
  81. #endif
  82. }
  83. void CStatisticsDlg::DoDataExchange(CDataExchange* pDX)
  84. {
  85. CResizableDialog::DoDataExchange(pDX);
  86. DDX_Control(pDX, IDC_STATTREE, stattree);
  87. }
  88. void CStatisticsDlg::OnSysColorChange()
  89. {
  90. CResizableDialog::OnSysColorChange();
  91. SetAllIcons();
  92. }
  93. void CStatisticsDlg::SetAllIcons()
  94. {
  95. InitWindowStyles(this);
  96. CImageList iml;
  97. iml.Create(16, 16, theApp.m_iDfltImageListColorFlags | ILC_MASK, 0, 1);
  98. iml.Add(CTempIconLoader(_T("StatsGeneric"))); // Dots & Arrow (Default icon for stats)
  99. iml.Add(CTempIconLoader(_T("TransferUpDown"))); // Transfer
  100. iml.Add(CTempIconLoader(_T("Connection"))); // Connection
  101. iml.Add(CTempIconLoader(_T("StatsClients"))); // Clients
  102. iml.Add(CTempIconLoader(_T("Server"))); // Server
  103. iml.Add(CTempIconLoader(_T("SharedFiles"))); // Shared Files
  104. iml.Add(CTempIconLoader(_T("Upload"))); // Transfer > Upload
  105. iml.Add(CTempIconLoader(_T("Download"))); // Transfer > Download
  106. iml.Add(CTempIconLoader(_T("StatsDetail"))); // Session Sections
  107. iml.Add(CTempIconLoader(_T("StatsCumulative"))); // Cumulative Sections
  108. iml.Add(CTempIconLoader(_T("StatsRecords"))); // Records
  109. iml.Add(CTempIconLoader(_T("TransferUpDown"))); // Connection > General
  110. iml.Add(CTempIconLoader(_T("StatsTime"))); // Time Section
  111. iml.Add(CTempIconLoader(_T("StatsProjected"))); // Time > Averages and Projections
  112. iml.Add(CTempIconLoader(_T("StatsDay"))); // Time > Averages and Projections > Daily
  113. iml.Add(CTempIconLoader(_T("StatsMonth"))); // Time > Averages and Projections > Monthly
  114. iml.Add(CTempIconLoader(_T("StatsYear"))); // Time > Averages and Projections > Yearly
  115. iml.Add(CTempIconLoader(_T("HardDisk"))); // Diskspace
  116. stattree.SetImageList(&iml, TVSIL_NORMAL);
  117. imagelistStatTree.DeleteImageList();
  118. imagelistStatTree.Attach(iml.Detach());
  119. COLORREF crBk = GetSysColor(COLOR_WINDOW);
  120. COLORREF crFg = GetSysColor(COLOR_WINDOWTEXT);
  121. theApp.LoadSkinColorAlt(_T("StatisticsTvBk"), _T("DefLvBk"), crBk);
  122. theApp.LoadSkinColorAlt(_T("StatisticsTvFg"), _T("DefLvFg"), crFg);
  123. stattree.SetBkColor(crBk);
  124. stattree.SetTextColor(crFg);
  125. // can't use 'TVM_SETLINECOLOR' because the color may not match that one used in "StatsGeneric" item image.
  126. //stattree.SendMessage(TVM_SETLINECOLOR, 0, (LPARAM)crFg);
  127. }
  128. BOOL CStatisticsDlg::OnInitDialog()
  129. {
  130. CResizableDialog::OnInitDialog();
  131. EnableWindow(FALSE);
  132. SetAllIcons();
  133. m_bTreepaneHidden=false;
  134. if (theApp.m_fontSymbol.m_hObject)
  135. {
  136. GetDlgItem(IDC_BNMENU)->SetFont(&theApp.m_fontSymbol);
  137. GetDlgItem(IDC_BNMENU)->SetWindowText(_T("6")); // show a down-arrow
  138. }
  139. // Win98: Explicitly set to Unicode to receive Unicode notifications.
  140. stattree.SendMessage(CCM_SETUNICODEFORMAT, TRUE);
  141. if (thePrefs.GetUseSystemFontForMainControls())
  142. stattree.SendMessage(WM_SETFONT, NULL, FALSE);
  143. CreateMyTree();
  144. // Setup download-scope
  145. CRect rcDown;
  146. GetDlgItem(IDC_SCOPE_D)->GetWindowRect(rcDown);
  147. GetDlgItem(IDC_SCOPE_D)->DestroyWindow();
  148. ScreenToClient(rcDown);
  149. m_DownloadOMeter.Create(WS_VISIBLE | WS_CHILD, rcDown, this, IDC_SCOPE_D);
  150. SetARange(true, thePrefs.GetMaxGraphDownloadRate());
  151. m_DownloadOMeter.SetYUnits(GetResString(IDS_KBYTESPERSEC));
  152. // Setup upload-scope
  153. CRect rcUp;
  154. GetDlgItem(IDC_SCOPE_U)->GetWindowRect(rcUp);
  155. GetDlgItem(IDC_SCOPE_U)->DestroyWindow();
  156. ScreenToClient(rcUp);
  157. // compensate rounding errors due to dialog units, make each of the 3 panes with same height
  158. rcUp.top = rcDown.bottom + 4;
  159. rcUp.bottom = rcUp.top + rcDown.Height();
  160. m_UploadOMeter.Create(WS_VISIBLE | WS_CHILD, rcUp, this, IDC_SCOPE_U);
  161. SetARange(false, thePrefs.GetMaxGraphUploadRate(true));
  162. m_UploadOMeter.SetYUnits(GetResString(IDS_KBYTESPERSEC));
  163. // Setup additional graph-scope
  164. CRect rcConn;
  165. GetDlgItem(IDC_STATSSCOPE)->GetWindowRect(rcConn);
  166. GetDlgItem(IDC_STATSSCOPE)->DestroyWindow();
  167. ScreenToClient(rcConn);
  168. // compensate rounding errors due to dialog units, make each of the 3 panes with same height
  169. rcConn.top = rcUp.bottom + 4;
  170. rcConn.bottom = rcConn.top + rcDown.Height();
  171. m_Statistics.Create(WS_VISIBLE | WS_CHILD, rcConn, this, IDC_STATSSCOPE);
  172. m_Statistics.SetRanges(0, thePrefs.GetStatsMax());
  173. m_Statistics.autofitYscale = false;
  174. // Set the trend ratio of the Active Connections trend in the Connection Statistics scope.
  175. m_Statistics.SetTrendRatio(0, thePrefs.GetStatsConnectionsGraphRatio());
  176. m_Statistics.SetYUnits(_T(""));
  177. m_Statistics.SetXUnits(GetResString(IDS_TIME));
  178. RepaintMeters();
  179. m_Statistics.SetBackgroundColor(thePrefs.GetStatsColor(0)) ;
  180. m_Statistics.SetGridColor(thePrefs.GetStatsColor(1)) ;
  181. m_DownloadOMeter.InvalidateCtrl();
  182. m_UploadOMeter.InvalidateCtrl();
  183. m_Statistics.InvalidateCtrl();
  184. if (thePrefs.GetStatsInterval()==0)
  185. GetDlgItem(IDC_STATTREE)->EnableWindow(false);
  186. UpdateData(FALSE);
  187. EnableWindow( TRUE );
  188. m_ilastMaxConnReached = 0;
  189. CRect rcW,rcSpl,rcTree,rcStat;
  190. GetWindowRect(rcW);
  191. ScreenToClient(rcW);
  192. GetDlgItem(IDC_STATTREE)->GetWindowRect(rcTree);
  193. ScreenToClient(rcTree);
  194. m_DownloadOMeter.GetWindowRect(rcDown);
  195. ScreenToClient(rcDown);
  196. m_UploadOMeter.GetWindowRect(rcUp);
  197. ScreenToClient(rcUp);
  198. m_Statistics.GetWindowRect(rcStat);
  199. ScreenToClient(rcStat);
  200. //vertical splitter
  201. rcSpl.left = rcTree.right;
  202. rcSpl.right = rcSpl.left + 4;
  203. rcSpl.top = rcW.top + 2;
  204. rcSpl.bottom = rcW.bottom - 5;
  205. m_wndSplitterstat.Create(WS_CHILD | WS_VISIBLE, rcSpl, this, IDC_SPLITTER_STAT);
  206. int PosStatVinitX = rcSpl.left;
  207. int PosStatVnewX = thePrefs.GetSplitterbarPositionStat()*rcW.Width()/100;
  208. int maxX = rcW.right-13;
  209. int minX = rcW.left+8;
  210. if (thePrefs.GetSplitterbarPositionStat() > 90)
  211. PosStatVnewX = maxX;
  212. else if (thePrefs.GetSplitterbarPositionStat() < 10)
  213. PosStatVnewX = minX;
  214. rcSpl.left = PosStatVnewX;
  215. rcSpl.right = PosStatVnewX + 4;
  216. m_wndSplitterstat.MoveWindow(rcSpl);
  217. //HR splitter
  218. rcSpl.left = rcDown.left;
  219. rcSpl.right = rcDown.right;
  220. rcSpl.top = rcDown.bottom;
  221. rcSpl.bottom = rcSpl.top + 4;
  222. m_wndSplitterstat_HR.Create(WS_CHILD | WS_VISIBLE, rcSpl, this, IDC_SPLITTER_STAT_HR);
  223. int PosStatVinitZ = rcSpl.top;
  224. int PosStatVnewZ = thePrefs.GetSplitterbarPositionStat_HR()*rcW.Height()/100;
  225. int maxZ = rcW.bottom-14;
  226. int minZ = 0;
  227. if (thePrefs.GetSplitterbarPositionStat_HR() > 90)
  228. PosStatVnewZ = maxZ;
  229. else if (thePrefs.GetSplitterbarPositionStat_HR() < 10)
  230. PosStatVnewZ = minZ;
  231. rcSpl.top = PosStatVnewZ;
  232. rcSpl.bottom = PosStatVnewZ+4;
  233. m_wndSplitterstat_HR.MoveWindow(rcSpl);
  234. //HL splitter
  235. rcSpl.left = rcUp.left;
  236. rcSpl.right = rcUp.right;
  237. rcSpl.top = rcUp.bottom;
  238. rcSpl.bottom = rcSpl.top + 4;
  239. m_wndSplitterstat_HL.Create(WS_CHILD | WS_VISIBLE, rcSpl, this, IDC_SPLITTER_STAT_HL);
  240. int PosStatVinitY = rcSpl.top;
  241. int PosStatVnewY = thePrefs.GetSplitterbarPositionStat_HL()*rcW.Height()/100;
  242. int maxY = rcW.bottom-9;
  243. int minY = 10;
  244. if (thePrefs.GetSplitterbarPositionStat_HL() > 90)
  245. PosStatVnewY = maxY;
  246. else if (thePrefs.GetSplitterbarPositionStat_HL() < 10)
  247. PosStatVnewY = minY;
  248. rcSpl.top = PosStatVnewY;
  249. rcSpl.bottom = PosStatVnewY+4;
  250. m_wndSplitterstat_HL.MoveWindow(rcSpl);
  251. DoResize_V(PosStatVnewX - PosStatVinitX);
  252. DoResize_HL(PosStatVnewY - PosStatVinitY);
  253. DoResize_HR(PosStatVnewZ - PosStatVinitZ);
  254. Localize();
  255. ShowStatistics(true);
  256. m_TimeToolTips = new CToolTipCtrl();
  257. m_TimeToolTips->Create(this);
  258. m_TimeToolTips->AddTool(GetDlgItem(IDC_SCOPE_D), _T(""), NULL, 0);
  259. m_TimeToolTips->AddTool(GetDlgItem(IDC_SCOPE_U), _T(""), NULL, 0);
  260. m_TimeToolTips->AddTool(GetDlgItem(IDC_STATSSCOPE), _T(""), NULL, 0);
  261. // Any Autopop-Time which is specified higher than ~30 sec. will get reset to 5 sec.
  262. m_TimeToolTips->SetDelayTime(TTDT_AUTOPOP, 30000);
  263. m_TimeToolTips->SetDelayTime(TTDT_INITIAL, 30000);
  264. m_TimeToolTips->SetDelayTime(TTDT_RESHOW, 30000);
  265. EnableToolTips(TRUE);
  266. return true;
  267. }
  268. void CStatisticsDlg::initCSize()
  269. {
  270. UINT x = thePrefs.GetSplitterbarPositionStat();
  271. UINT y = thePrefs.GetSplitterbarPositionStat_HL();
  272. UINT z = thePrefs.GetSplitterbarPositionStat_HR();
  273. if (x > 90)
  274. x = 100;
  275. else if (x < 10)
  276. x = 0;
  277. if (y > 90)
  278. y = 100;
  279. else if (y < 10)
  280. y = 0;
  281. if (z > 90)
  282. z = 100;
  283. else if (z < 10)
  284. z = 0;
  285. RemoveAnchor(IDC_BNMENU);
  286. AddAnchor(IDC_BNMENU,CSize(0,0));
  287. //StatTitle
  288. RemoveAnchor(IDC_STATIC_LASTRESET);
  289. AddAnchor(IDC_STATIC_LASTRESET,CSize(0,0),CSize(x,0));
  290. //stattree
  291. RemoveAnchor(stattree);
  292. AddAnchor(stattree,CSize(0,0),CSize(x,100));
  293. //graph
  294. RemoveAnchor(m_DownloadOMeter);
  295. AddAnchor(m_DownloadOMeter,CSize(x,0),CSize(100,z));
  296. RemoveAnchor(m_UploadOMeter);
  297. AddAnchor(m_UploadOMeter,CSize(x,z),CSize(100,y));
  298. RemoveAnchor(m_Statistics);
  299. AddAnchor(m_Statistics,CSize(x,y),CSize(100,100));
  300. //set range
  301. CRect rcW;
  302. GetWindowRect(rcW);
  303. ScreenToClient(rcW);
  304. CRect rcHR,rcHL;
  305. m_wndSplitterstat_HR.GetWindowRect(rcHR);
  306. m_wndSplitterstat_HL.GetWindowRect(rcHL);
  307. ScreenToClient(rcHR);
  308. ScreenToClient(rcHL);
  309. m_wndSplitterstat.SetRange(rcW.left+11, rcW.right-11);
  310. m_wndSplitterstat_HL.SetRange(rcHR.bottom+5, rcW.bottom-7);
  311. m_wndSplitterstat_HR.SetRange(rcW.top+3, rcHL.top-5);
  312. }
  313. void CStatisticsDlg::DoResize_HL(int delta)
  314. {
  315. if(!delta)
  316. return;
  317. m_DownloadOMeter.InvalidateCtrl(true);
  318. CSplitterControl::ChangeHeight(&m_UploadOMeter, delta , CW_TOPALIGN);
  319. CSplitterControl::ChangeHeight(&m_Statistics, -delta, CW_BOTTOMALIGN);
  320. CRect rcW;
  321. GetWindowRect(rcW);
  322. ScreenToClient(rcW);
  323. CRect rcspl;
  324. m_UploadOMeter.GetWindowRect(rcspl);
  325. ScreenToClient(rcspl);
  326. thePrefs.SetSplitterbarPositionStat_HL(rcspl.bottom*100/rcW.Height());
  327. initCSize();
  328. ShowInterval();
  329. Invalidate();
  330. UpdateWindow();
  331. }
  332. void CStatisticsDlg::DoResize_HR(int delta)
  333. {
  334. if(!delta)
  335. return;
  336. CSplitterControl::ChangeHeight(&m_DownloadOMeter, delta , CW_TOPALIGN);
  337. CSplitterControl::ChangeHeight(&m_UploadOMeter, -delta, CW_BOTTOMALIGN);
  338. m_Statistics.InvalidateCtrl(true);
  339. CRect rcW;
  340. GetWindowRect(rcW);
  341. ScreenToClient(rcW);
  342. CRect rcspl;
  343. m_DownloadOMeter.GetWindowRect(rcspl);
  344. ScreenToClient(rcspl);
  345. thePrefs.SetSplitterbarPositionStat_HR(rcspl.bottom*100/rcW.Height());
  346. initCSize();
  347. ShowInterval();
  348. Invalidate();
  349. UpdateWindow();
  350. }
  351. void CStatisticsDlg::DoResize_V(int delta)
  352. {
  353. if(!delta)
  354. return;
  355. CSplitterControl::ChangeWidth(GetDlgItem(IDC_STATIC_LASTRESET), delta);
  356. CSplitterControl::ChangeWidth(&stattree, delta);
  357. CSplitterControl::ChangeWidth(&m_DownloadOMeter, -delta, CW_RIGHTALIGN);
  358. CSplitterControl::ChangeWidth(&m_UploadOMeter, -delta, CW_RIGHTALIGN);
  359. CSplitterControl::ChangeWidth(&m_Statistics, -delta, CW_RIGHTALIGN);
  360. CRect rcW;
  361. GetWindowRect(rcW);
  362. ScreenToClient(rcW);
  363. CRect rcspl;
  364. GetDlgItem(IDC_STATTREE)->GetWindowRect(rcspl);
  365. ScreenToClient(rcspl);
  366. thePrefs.SetSplitterbarPositionStat(rcspl.right*100/rcW.Width());
  367. if (rcspl.left==rcspl.right) {
  368. GetDlgItem(IDC_STATTREE)->ShowWindow(SW_HIDE);
  369. GetDlgItem(IDC_BNMENU)->ShowWindow(SW_HIDE);
  370. GetDlgItem(IDC_STATIC_LASTRESET)->ShowWindow(SW_HIDE);
  371. m_bTreepaneHidden=true;
  372. } else if (m_bTreepaneHidden) {
  373. m_bTreepaneHidden=false;
  374. GetDlgItem(IDC_STATTREE)->ShowWindow(SW_SHOW);
  375. GetDlgItem(IDC_BNMENU)->ShowWindow(SW_SHOW);
  376. GetDlgItem(IDC_STATIC_LASTRESET)->ShowWindow(SW_SHOW);
  377. }
  378. initCSize();
  379. ShowInterval();
  380. Invalidate();
  381. UpdateWindow();
  382. }
  383. LRESULT CStatisticsDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  384. {
  385. switch (message)
  386. {
  387. case WM_PAINT:
  388. if (m_wndSplitterstat)
  389. {
  390. CRect rctree,rcSpl,rcW;
  391. GetWindowRect(rcW);
  392. ScreenToClient(rcW);
  393. GetDlgItem(IDC_STATTREE)->GetWindowRect(rctree);
  394. ScreenToClient(rctree);
  395. if (rcW.Width()>0)
  396. {
  397. rcSpl.left = rctree.right;
  398. rcSpl.right = rcSpl.left + 4;
  399. rcSpl.top = rcW.top + 2;
  400. rcSpl.bottom = rcW.bottom - 5;
  401. m_wndSplitterstat.MoveWindow(rcSpl,true);
  402. }
  403. }
  404. if (m_wndSplitterstat_HL)
  405. {
  406. CRect rcUp,rcSpl,rcW;
  407. CWnd* pWnd;
  408. GetWindowRect(rcW);
  409. ScreenToClient(rcW);
  410. pWnd = &m_UploadOMeter;
  411. pWnd->GetWindowRect(rcUp);
  412. ScreenToClient(rcUp);
  413. if (rcW.Height()>0)
  414. {
  415. rcSpl.left = rcUp.left;
  416. rcSpl.right = rcUp.right;
  417. rcSpl.top = rcUp.bottom;
  418. rcSpl.bottom = rcUp.bottom + 4;
  419. m_wndSplitterstat_HL.MoveWindow(rcSpl,true);
  420. }
  421. }
  422. if (m_wndSplitterstat_HR)
  423. {
  424. CRect rcDown,rcSpl,rcW;
  425. CWnd* pWnd;
  426. GetWindowRect(rcW);
  427. ScreenToClient(rcW);
  428. pWnd = &m_DownloadOMeter;
  429. pWnd->GetWindowRect(rcDown);
  430. ScreenToClient(rcDown);
  431. if (rcW.Height()>0)
  432. {
  433. rcSpl.left = rcDown.left;
  434. rcSpl.right = rcDown.right;
  435. rcSpl.top = rcDown.bottom;
  436. rcSpl.bottom = rcDown.bottom + 4;
  437. m_wndSplitterstat_HR.MoveWindow(rcSpl,true);
  438. }
  439. }
  440. break;
  441. case WM_NOTIFY:
  442. if (wParam == IDC_SPLITTER_STAT)
  443. {
  444. SPC_NMHDR* pHdr = (SPC_NMHDR*) lParam;
  445. DoResize_V(pHdr->delta);
  446. }
  447. else if (wParam == IDC_SPLITTER_STAT_HL)
  448. {
  449. SPC_NMHDR* pHdr = (SPC_NMHDR*) lParam;
  450. DoResize_HL(pHdr->delta);
  451. }
  452. else if (wParam == IDC_SPLITTER_STAT_HR)
  453. {
  454. SPC_NMHDR* pHdr = (SPC_NMHDR*) lParam;
  455. DoResize_HR(pHdr->delta);
  456. }
  457. break;
  458. case WM_WINDOWPOSCHANGED:
  459. {
  460. CRect rcW;
  461. GetWindowRect(rcW);
  462. ScreenToClient(rcW);
  463. if (m_wndSplitterstat && rcW.Width()>0) Invalidate();
  464. if (m_wndSplitterstat_HL && rcW.Height()>0) Invalidate();
  465. if (m_wndSplitterstat_HR && rcW.Height()>0) Invalidate();
  466. break;
  467. }
  468. case WM_SIZE:
  469. {
  470. //set range
  471. if (m_wndSplitterstat)
  472. {
  473. CRect rcW;
  474. GetWindowRect(rcW);
  475. ScreenToClient(rcW);
  476. if (rcW.Width()>0)
  477. {
  478. CRect rcSpl;
  479. CRect rcTree,rcDown;
  480. stattree.GetWindowRect(rcTree);
  481. m_DownloadOMeter.GetWindowRect(rcDown);
  482. ScreenToClient(rcTree);
  483. ScreenToClient(rcDown);
  484. long splitposstat=thePrefs.GetSplitterbarPositionStat()*rcW.Width()/100;
  485. rcSpl.left = splitposstat;
  486. rcSpl.right = rcSpl.left + 4;
  487. rcSpl.top = rcW.top + 2;
  488. rcSpl.bottom = rcW.bottom - 5;
  489. m_wndSplitterstat.MoveWindow(rcSpl,true);
  490. m_wndSplitterstat.SetRange(rcW.left+11, rcW.right-11);
  491. }
  492. }
  493. if (m_wndSplitterstat_HR)
  494. {
  495. CRect rcW;
  496. GetWindowRect(rcW);
  497. ScreenToClient(rcW);
  498. if (rcW.Width()>0)
  499. {
  500. CRect rcSpl;
  501. CRect rcDown;
  502. m_DownloadOMeter.GetWindowRect(rcDown);
  503. ScreenToClient(rcDown);
  504. long splitposstat=thePrefs.GetSplitterbarPositionStat()*rcW.Width()/100;
  505. long splitposstat_HR=thePrefs.GetSplitterbarPositionStat_HR()*rcW.Height()/100;
  506. long splitposstat_HL=thePrefs.GetSplitterbarPositionStat_HL()*rcW.Height()/100;
  507. rcSpl.left = splitposstat + 7;
  508. rcSpl.right = rcW.right - 14;
  509. rcSpl.top = splitposstat_HR;
  510. rcSpl.bottom = rcSpl.top + 4;
  511. m_wndSplitterstat_HR.MoveWindow(rcSpl,true);
  512. m_wndSplitterstat_HR.SetRange(rcW.top+3, splitposstat_HL-4);
  513. }
  514. }
  515. if (m_wndSplitterstat_HL)
  516. {
  517. CRect rcW;
  518. GetWindowRect(rcW);
  519. ScreenToClient(rcW);
  520. if (rcW.Width()>0)
  521. {
  522. CRect rcSpl;
  523. CRect rcStat;
  524. m_Statistics.GetWindowRect(rcStat);
  525. ScreenToClient(rcStat);
  526. long splitposstat=thePrefs.GetSplitterbarPositionStat()*rcW.Width()/100;
  527. long splitposstat_HR=thePrefs.GetSplitterbarPositionStat_HR()*rcW.Height()/100;
  528. long splitposstat_HL=thePrefs.GetSplitterbarPositionStat_HL()*rcW.Height()/100;
  529. rcSpl.left = splitposstat + 7;
  530. rcSpl.right = rcW.right - 14;
  531. rcSpl.top = splitposstat_HL;
  532. rcSpl.bottom = rcSpl.top + 4;
  533. m_wndSplitterstat_HL.MoveWindow(rcSpl,true);
  534. m_wndSplitterstat_HL.SetRange(splitposstat_HR+14, rcW.bottom-7);
  535. }
  536. }
  537. break;
  538. }
  539. }
  540. return CResizableDialog::DefWindowProc(message, wParam, lParam);
  541. }
  542. void CStatisticsDlg::RepaintMeters()
  543. {
  544. CString Buffer;
  545. m_DownloadOMeter.SetBackgroundColor(thePrefs.GetStatsColor(0)); // Background
  546. m_DownloadOMeter.SetGridColor(thePrefs.GetStatsColor(1)); // Grid
  547. m_DownloadOMeter.SetPlotColor(thePrefs.GetStatsColor(4), 0); // Download session
  548. m_DownloadOMeter.SetPlotColor(thePrefs.GetStatsColor(3), 1); // Download average
  549. m_DownloadOMeter.SetPlotColor(thePrefs.GetStatsColor(2), 2); // Download current
  550. m_DownloadOMeter.SetBarsPlot(thePrefs.GetFillGraphs(), 2);
  551. m_UploadOMeter.SetBackgroundColor(thePrefs.GetStatsColor(0));
  552. m_UploadOMeter.SetGridColor(thePrefs.GetStatsColor(1)); // Grid
  553. m_UploadOMeter.SetPlotColor(thePrefs.GetStatsColor(7), 0); // Upload session
  554. m_UploadOMeter.SetPlotColor(thePrefs.GetStatsColor(6), 1); // Upload average
  555. m_UploadOMeter.SetPlotColor(thePrefs.GetStatsColor(5), 2); // Upload current
  556. m_UploadOMeter.SetPlotColor(thePrefs.GetStatsColor(14), 3); // Upload current (excl. overhead)
  557. m_UploadOMeter.SetPlotColor(thePrefs.GetStatsColor(13), 4); // Upload friend slots
  558. m_UploadOMeter.SetBarsPlot(thePrefs.GetFillGraphs(), 2);
  559. m_Statistics.SetBackgroundColor(thePrefs.GetStatsColor(0));
  560. m_Statistics.SetGridColor(thePrefs.GetStatsColor(1));
  561. m_Statistics.SetPlotColor(thePrefs.GetStatsColor(8), 0); // Active Connections
  562. m_Statistics.SetPlotColor(thePrefs.GetStatsColor(10), 1); // Active Uploads
  563. m_Statistics.SetPlotColor(thePrefs.GetStatsColor(9), 2); // Total Uploads
  564. m_Statistics.SetPlotColor(thePrefs.GetStatsColor(12), 3); // Active Downloads
  565. m_Statistics.SetBarsPlot(thePrefs.GetFillGraphs(), 0);
  566. m_DownloadOMeter.SetYUnits(GetResString(IDS_ST_DOWNLOAD));
  567. m_DownloadOMeter.SetLegendLabel(GetResString(IDS_ST_SESSION), 0); // Download session
  568. Buffer.Format(_T(" (%u %s)"), thePrefs.GetStatsAverageMinutes(), GetResString(IDS_MINS));
  569. m_DownloadOMeter.SetLegendLabel(GetResString(IDS_AVG) + Buffer, 1); // Download average
  570. m_DownloadOMeter.SetLegendLabel(GetResString(IDS_ST_CURRENT), 2); // Download current
  571. m_UploadOMeter.SetYUnits(GetResString(IDS_ST_UPLOAD));
  572. m_UploadOMeter.SetLegendLabel(GetResString(IDS_ST_SESSION), 0); // Upload session
  573. Buffer.Format(_T(" (%u %s)"), thePrefs.GetStatsAverageMinutes(), GetResString(IDS_MINS));
  574. m_UploadOMeter.SetLegendLabel(GetResString(IDS_AVG) + Buffer, 1); // Upload average
  575. m_UploadOMeter.SetLegendLabel(GetResString(IDS_ST_ULCURRENT), 2); // Upload current
  576. m_UploadOMeter.SetLegendLabel(GetResString(IDS_ST_ULSLOTSNOOVERHEAD), 3); // Upload current (excl. overhead)
  577. m_UploadOMeter.SetLegendLabel(GetResString(IDS_ST_ULFRIEND), 4); // Upload friend slots
  578. m_Statistics.SetYUnits(GetResString(IDS_FSTAT_CONNECTION));
  579. Buffer.Format(_T("%s (1:%u)"), GetResString(IDS_ST_ACTIVEC), thePrefs.GetStatsConnectionsGraphRatio());
  580. m_Statistics.SetLegendLabel(Buffer, 0); // Active Connections
  581. m_Statistics.SetLegendLabel(GetResString(IDS_ST_ACTIVEU_ZZ), 1); // Active Uploads
  582. m_Statistics.SetLegendLabel(GetResString(IDS_SP_TOTALUL), 2); // Total Uploads
  583. m_Statistics.SetLegendLabel(GetResString(IDS_ST_ACTIVED), 3); // Active Downloads
  584. }
  585. void CStatisticsDlg::SetCurrentRate(float uploadrate, float downloadrate)
  586. {
  587. if (!theApp.emuledlg->IsRunning())
  588. return;
  589. // Download
  590. double m_dPlotDataDown[3];
  591. m_dPlotDataDown[0] = theStats.GetAvgDownloadRate(AVG_SESSION);
  592. m_dPlotDataDown[1] = theStats.GetAvgDownloadRate(AVG_TIME);
  593. m_dPlotDataDown[2] = downloadrate;
  594. m_DownloadOMeter.AppendPoints(m_dPlotDataDown);
  595. // Upload
  596. double m_dPlotDataUp[5];
  597. m_dPlotDataUp[0] = theStats.GetAvgUploadRate(AVG_SESSION);
  598. m_dPlotDataUp[1] = theStats.GetAvgUploadRate(AVG_TIME);
  599. // current rate to network (standardPackets + controlPackets)
  600. m_dPlotDataUp[2] = uploadrate;
  601. // current rate (excl. overhead)
  602. m_dPlotDataUp[3] = uploadrate - (float)theStats.GetUpDatarateOverhead() / 1024;
  603. // current rate to friends
  604. m_dPlotDataUp[4] = uploadrate - (float)theApp.uploadqueue->GetToNetworkDatarate() / 1024;
  605. m_UploadOMeter.AppendPoints(m_dPlotDataUp);
  606. // Connections
  607. CDownloadQueue::SDownloadStats myStats;
  608. theApp.downloadqueue->GetDownloadSourcesStats(myStats);
  609. m_dPlotDataMore[0] = theApp.listensocket->GetActiveConnections();
  610. m_dPlotDataMore[1] = theApp.uploadqueue->GetActiveUploadsCount();
  611. m_dPlotDataMore[2] = theApp.uploadqueue->GetUploadQueueLength();
  612. m_dPlotDataMore[3] = myStats.a[1];
  613. m_Statistics.AppendPoints(m_dPlotDataMore);
  614. // Websever
  615. UpDown updown;
  616. updown.upload = uploadrate;
  617. updown.download = downloadrate;
  618. updown.connections = theApp.listensocket->GetActiveConnections();
  619. theApp.webserver->AddStatsLine(updown);
  620. }
  621. void CStatisticsDlg::ShowStatistics(bool forceUpdate)
  622. {
  623. stattree.SetRedraw(false);
  624. CString cbuffer;
  625. // Set Tree Values
  626. // TRANSFER SECTION
  627. // If a section is not expanded, don't waste CPU cycles updating it.
  628. if (forceUpdate || stattree.IsExpanded(h_transfer))
  629. {
  630. uint32 statGoodSessions = 0;
  631. uint32 statBadSessions = 0;
  632. double percentSessions = 0;
  633. // Transfer Ratios
  634. if ( theStats.sessionReceivedBytes>0 && theStats.sessionSentBytes>0 )
  635. {
  636. // Session
  637. if (theStats.sessionReceivedBytes<theStats.sessionSentBytes)
  638. {
  639. cbuffer.Format(_T("%s %.2f : 1"),GetResString(IDS_STATS_SRATIO),(float)theStats.sessionSentBytes/theStats.sessionReceivedBytes);
  640. stattree.SetItemText(trans[0], cbuffer);
  641. }
  642. else
  643. {
  644. cbuffer.Format(_T("%s 1 : %.2f"),GetResString(IDS_STATS_SRATIO),(float)theStats.sessionReceivedBytes/theStats.sessionSentBytes);
  645. stattree.SetItemText(trans[0], cbuffer);
  646. }
  647. }
  648. else
  649. {
  650. cbuffer.Format(_T("%s %s"), GetResString(IDS_STATS_SRATIO), GetResString(IDS_FSTAT_WAITING)); // Localize
  651. stattree.SetItemText(trans[0], cbuffer);
  652. }
  653. if ( theStats.sessionReceivedBytes>0 && theStats.sessionSentBytes>0)
  654. {
  655. // Session
  656. if (theStats.sessionSentBytes > theStats.sessionSentBytesToFriend && theStats.sessionReceivedBytes<theStats.sessionSentBytes-theStats.sessionSentBytesToFriend)
  657. {
  658. cbuffer.Format(_T("%s %.2f : 1"),GetResString(IDS_STATS_FRATIO),(float)(theStats.sessionSentBytes-theStats.sessionSentBytesToFriend)/theStats.sessionReceivedBytes);
  659. stattree.SetItemText(trans[1], cbuffer);
  660. }
  661. else
  662. {
  663. cbuffer.Format(_T("%s 1 : %.2f"),GetResString(IDS_STATS_FRATIO),(float)theStats.sessionReceivedBytes/(theStats.sessionSentBytes-theStats.sessionSentBytesToFriend));
  664. stattree.SetItemText(trans[1], cbuffer);
  665. }
  666. }
  667. else
  668. {
  669. cbuffer.Format(_T("%s %s"), GetResString(IDS_STATS_FRATIO), GetResString(IDS_FSTAT_WAITING)); // Localize
  670. stattree.SetItemText(trans[1], cbuffer);
  671. }
  672. if ( (thePrefs.GetTotalDownloaded()>0 && thePrefs.GetTotalUploaded()>0) || (theStats.sessionReceivedBytes>0 && theStats.sessionSentBytes>0) )
  673. {
  674. // Cumulative
  675. if ((theStats.sessionReceivedBytes+thePrefs.GetTotalDownloaded())<(theStats.sessionSentBytes+thePrefs.GetTotalUploaded()))
  676. {
  677. cbuffer.Format(_T("%s %.2f : 1"),GetResString(IDS_STATS_CRATIO),(float)(theStats.sessionSentBytes+thePrefs.GetTotalUploaded())/(theStats.sessionReceivedBytes+thePrefs.GetTotalDownloaded()));
  678. stattree.SetItemText(trans[2], cbuffer);
  679. }
  680. else
  681. {
  682. cbuffer.Format(_T("%s 1 : %.2f"),GetResString(IDS_STATS_CRATIO),(float)(theStats.sessionReceivedBytes+thePrefs.GetTotalDownloaded())/(theStats.sessionSentBytes+thePrefs.GetTotalUploaded()));
  683. stattree.SetItemText(trans[2], cbuffer);
  684. }
  685. }
  686. else
  687. {
  688. cbuffer.Format(_T("%s %s"), GetResString(IDS_STATS_CRATIO), GetResString(IDS_FSTAT_WAITING)); // Localize
  689. stattree.SetItemText(trans[2], cbuffer);
  690. }
  691. // TRANSFER -> DOWNLOADS SECTION
  692. if (forceUpdate || stattree.IsExpanded(h_download))
  693. {
  694. uint64 DownOHTotal = 0;
  695. uint64 DownOHTotalPackets = 0;
  696. CDownloadQueue::SDownloadStats myStats;
  697. theApp.downloadqueue->GetDownloadSourcesStats(myStats);
  698. // TRANSFER -> DOWNLOADS -> SESSION SECTION
  699. if (forceUpdate || stattree.IsExpanded(h_down_session))
  700. {
  701. // Downloaded Data
  702. cbuffer.Format( GetResString( IDS_STATS_DDATA ) , CastItoXBytes( theStats.sessionReceivedBytes, false, false ) );
  703. stattree.SetItemText( down_S[0] , cbuffer );
  704. if (forceUpdate || stattree.IsExpanded(down_S[0]))
  705. {
  706. // Downloaded Data By Client
  707. if (forceUpdate || stattree.IsExpanded(hdown_scb))
  708. {
  709. int i = 0;
  710. uint64 DownDataTotal = thePrefs.GetDownSessionClientData();
  711. uint64 DownDataClient = thePrefs.GetDownData_EMULE();
  712. double percentClientTransferred = 0;
  713. if ( DownDataTotal!=0 && DownDataClient!=0 )
  714. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  715. cbuffer.Format( _T("eMule: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ) , percentClientTransferred);
  716. stattree.SetItemText( down_scb[i] , cbuffer );
  717. i++;
  718. DownDataClient = thePrefs.GetDownData_EDONKEYHYBRID();
  719. if ( DownDataTotal!=0 && DownDataClient!=0 )
  720. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  721. else
  722. percentClientTransferred = 0;
  723. cbuffer.Format( _T("eD Hybrid: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ) , percentClientTransferred );
  724. stattree.SetItemText( down_scb[i] , cbuffer );
  725. i++;
  726. DownDataClient = thePrefs.GetDownData_EDONKEY();
  727. if ( DownDataTotal!=0 && DownDataClient!=0 )
  728. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  729. else
  730. percentClientTransferred = 0;
  731. cbuffer.Format( _T("eDonkey: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ), percentClientTransferred );
  732. stattree.SetItemText( down_scb[i] , cbuffer );
  733. i++;
  734. DownDataClient = thePrefs.GetDownData_AMULE();
  735. if ( DownDataTotal!=0 && DownDataClient!=0 )
  736. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  737. else
  738. percentClientTransferred = 0;
  739. cbuffer.Format( _T("aMule: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ), percentClientTransferred );
  740. stattree.SetItemText( down_scb[i] , cbuffer );
  741. i++;
  742. DownDataClient = thePrefs.GetDownData_MLDONKEY();
  743. if ( DownDataTotal!=0 && DownDataClient!=0 )
  744. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  745. else
  746. percentClientTransferred = 0;
  747. cbuffer.Format( _T("MLdonkey: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ), percentClientTransferred );
  748. stattree.SetItemText( down_scb[i] , cbuffer );
  749. i++;
  750. DownDataClient = thePrefs.GetDownData_SHAREAZA();
  751. if ( DownDataTotal!=0 && DownDataClient!=0 )
  752. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  753. else
  754. percentClientTransferred = 0;
  755. cbuffer.Format( _T("Shareaza: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ), percentClientTransferred );
  756. stattree.SetItemText( down_scb[i] , cbuffer );
  757. i++;
  758. DownDataClient = thePrefs.GetDownData_EMULECOMPAT();
  759. if ( DownDataTotal!=0 && DownDataClient!=0 )
  760. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  761. else
  762. percentClientTransferred = 0;
  763. cbuffer.Format( _T("eM Compat: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ), percentClientTransferred );
  764. stattree.SetItemText( down_scb[i] , cbuffer );
  765. i++;
  766. DownDataClient = thePrefs.GetDownData_URL();
  767. if ( DownDataTotal!=0 && DownDataClient!=0 )
  768. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  769. else
  770. percentClientTransferred = 0;
  771. cbuffer.Format( _T("URL: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ), percentClientTransferred );
  772. stattree.SetItemText( down_scb[i] , cbuffer );
  773. i++;
  774. }
  775. // Downloaded Data By Port
  776. if (forceUpdate || stattree.IsExpanded(hdown_spb))
  777. {
  778. int i = 0;
  779. uint64 PortDataDefault = thePrefs.GetDownDataPort_4662();
  780. uint64 PortDataOther = thePrefs.GetDownDataPort_OTHER();
  781. uint64 PortDataPeerCache = thePrefs.GetDownDataPort_PeerCache();
  782. uint64 PortDataTotal = thePrefs.GetDownSessionDataPort();
  783. double percentPortTransferred = 0;
  784. if ( PortDataTotal!=0 && PortDataDefault!=0 )
  785. percentPortTransferred = (double) 100 * PortDataDefault / PortDataTotal;
  786. cbuffer.Format( _T("%s: %s (%1.1f%%)") , GetResString(IDS_STATS_PRTDEF) , CastItoXBytes( PortDataDefault, false, false ) , percentPortTransferred);
  787. stattree.SetItemText( down_spb[i] , cbuffer );
  788. i++;
  789. if ( PortDataTotal!=0 && PortDataOther!=0 )
  790. percentPortTransferred = (double) 100 * PortDataOther / PortDataTotal;
  791. else
  792. percentPortTransferred = 0;
  793. cbuffer.Format( _T("%s: %s (%1.1f%%)") , GetResString(IDS_STATS_PRTOTHER) , CastItoXBytes( PortDataOther, false, false ) , percentPortTransferred);
  794. stattree.SetItemText( down_spb[i] , cbuffer );
  795. i++;
  796. if ( PortDataTotal!=0 && PortDataPeerCache!=0 )
  797. percentPortTransferred = (double) 100 * PortDataPeerCache / PortDataTotal;
  798. else
  799. percentPortTransferred = 0;
  800. cbuffer.Format( _T("%s: %s (%1.1f%%)") , thePrefs.GetPeerCacheShow() ? _T("PeerCache") : GetResString(IDS_STATS_PRTOTHER) , CastItoXBytes( PortDataPeerCache, false, false ) , percentPortTransferred);
  801. stattree.SetItemText( down_spb[i] , cbuffer );
  802. i++;
  803. }
  804. }
  805. // Completed Downloads
  806. cbuffer.Format( _T("%s: %u") , GetResString( IDS_STATS_COMPDL ) , thePrefs.GetDownSessionCompletedFiles() );
  807. stattree.SetItemText( down_S[1] , cbuffer );
  808. // Active Downloads
  809. cbuffer.Format( GetResString( IDS_STATS_ACTDL ) , myStats.a[1] );
  810. stattree.SetItemText( down_S[2] , cbuffer );
  811. // Found Sources
  812. cbuffer.Format( GetResString( IDS_STATS_FOUNDSRC ) , myStats.a[0] );
  813. stattree.SetItemText( down_S[3] , cbuffer );
  814. if (forceUpdate || stattree.IsExpanded(down_S[3]))
  815. {
  816. int i = 0;
  817. // Sources By Status
  818. cbuffer.Format( _T("%s: %u") , GetResString( IDS_ONQUEUE ) , myStats.a[2] );
  819. stattree.SetItemText( down_sources[i] , cbuffer );
  820. i++;
  821. cbuffer.Format( _T("%s: %u") , GetResString( IDS_QUEUEFULL ) , myStats.a[3] );
  822. stattree.SetItemText( down_sources[i] , cbuffer );
  823. i++;
  824. cbuffer.Format( _T("%s: %u") , GetResString( IDS_NONEEDEDPARTS ) , myStats.a[4] );
  825. stattree.SetItemText( down_sources[i] , cbuffer );
  826. i++;
  827. cbuffer.Format( _T("%s: %u") , GetResString( IDS_ASKING ) , myStats.a[5] );
  828. stattree.SetItemText( down_sources[i] , cbuffer );
  829. i++;
  830. cbuffer.Format( _T("%s: %u") , GetResString( IDS_RECHASHSET ) , myStats.a[6] );
  831. stattree.SetItemText( down_sources[i] , cbuffer );
  832. i++;
  833. cbuffer.Format( _T("%s: %u") , GetResString( IDS_CONNECTING ) , myStats.a[7] );
  834. stattree.SetItemText( down_sources[i] , cbuffer );
  835. i++;
  836. cbuffer.Format( _T("%s: %u") , GetResString(IDS_CONNVIASERVER) , myStats.a[8] );
  837. stattree.SetItemText( down_sources[i] , cbuffer );
  838. i++;
  839. cbuffer.Format( _T("%s: %u") , GetResString(IDS_TOOMANYCONNS) , myStats.a[9] );
  840. stattree.SetItemText( down_sources[i] , cbuffer );
  841. i++;
  842. cbuffer.Format( _T("%s: %u") , GetResString(IDS_NOCONNECTLOW2LOW) , myStats.a[10] );
  843. stattree.SetItemText( down_sources[i] , cbuffer );
  844. i++;
  845. cbuffer.Format( _T("%s: %u") , GetResString(IDS_STATS_PROBLEMATIC) , myStats.a[12] );
  846. stattree.SetItemText( down_sources[i] , cbuffer );
  847. i++;
  848. cbuffer.Format( _T("%s: %u") , GetResString(IDS_BANNED) , myStats.a[13] );
  849. stattree.SetItemText( down_sources[i] , cbuffer );
  850. i++;
  851. cbuffer.Format( _T("%s: %u") , GetResString(IDS_ASKED4ANOTHERFILE) , myStats.a[15] );
  852. stattree.SetItemText( down_sources[i] , cbuffer );
  853. i++;
  854. cbuffer.Format( _T("%s: %u") , GetResString(IDS_UNKNOWN) , myStats.a[11] );
  855. stattree.SetItemText( down_sources[i] , cbuffer );
  856. i++;
  857. // where from? (3)
  858. cbuffer.Format( _T("%s: %u") , GetResString( IDS_VIAED2KSQ ) , myStats.a[16] );
  859. stattree.SetItemText( down_sources[i] , cbuffer );
  860. i++;
  861. cbuffer.Format( _T("%s: %u") , GetResString( IDS_VIAKAD ) , myStats.a[17] );
  862. stattree.SetItemText( down_sources[i] , cbuffer );
  863. i++;
  864. cbuffer.Format( _T("%s: %u") , GetResString( IDS_VIASE ) , myStats.a[18] );
  865. stattree.SetItemText( down_sources[i] , cbuffer );
  866. i++;
  867. cbuffer.Format( _T("%s: %u") , GetResString( IDS_VIAPASSIVE ) , myStats.a[14] );
  868. stattree.SetItemText( down_sources[i] , cbuffer );
  869. i++;
  870. cbuffer.Format( _T("eD2K: %u (%.1f%%)") , myStats.a[19], myStats.a[0] ? (myStats.a[19] * 100.0 / myStats.a[0]) : 0.0 );
  871. stattree.SetItemText( down_sources[i] , cbuffer );
  872. i++;
  873. cbuffer.Format( _T("Kad: %u (%.1f%%)") , myStats.a[20], myStats.a[0] ? (myStats.a[20] * 100.0 / myStats.a[0]) : 0.0 );
  874. stattree.SetItemText( down_sources[i] , cbuffer );
  875. i++;
  876. cbuffer.Format( _T("eD2K/Kad: %u (%.1f%%)") , myStats.a[21], myStats.a[0] ? (myStats.a[21] * 100.0 / myStats.a[0]) : 0.0 );
  877. stattree.SetItemText( down_sources[i] , cbuffer );
  878. i++;
  879. cbuffer.Format(_T("%s: %s, %s: %s (%.1f%%)"), GetResString(IDS_UDPREASKS), CastItoIShort(theApp.downloadqueue->GetUDPFileReasks()), GetResString(IDS_UFAILED), CastItoIShort(theApp.downloadqueue->GetFailedUDPFileReasks()), theApp.downloadqueue->GetUDPFileReasks() ? (theApp.downloadqueue->GetFailedUDPFileReasks() * 100.0 / theApp.downloadqueue->GetUDPFileReasks()) : 0.0 );
  880. stattree.SetItemText( down_sources[i] , cbuffer );
  881. i++;
  882. cbuffer.Format(_T("%s: %s (%s + %s)"), GetResString(IDS_DEADSOURCES), CastItoIShort(theApp.clientlist->m_globDeadSourceList.GetDeadSourcesCount() + myStats.a[22]), CastItoIShort(theApp.clientlist->m_globDeadSourceList.GetDeadSourcesCount()), CastItoIShort((UINT)myStats.a[22]));
  883. stattree.SetItemText( down_sources[i] , cbuffer );
  884. i++;
  885. }
  886. // Set Download Sessions
  887. statGoodSessions = thePrefs.GetDownS_SuccessfulSessions() + myStats.a[1]; // Add Active Downloads
  888. statBadSessions = thePrefs.GetDownS_FailedSessions();
  889. cbuffer.Format( _T("%s: %u") , GetResString(IDS_STATS_DLSES) , statGoodSessions + statBadSessions );
  890. stattree.SetItemText( down_S[4] , cbuffer );
  891. if (forceUpdate || stattree.IsExpanded(down_S[4]))
  892. {
  893. // Set Successful Download Sessions and Average Downloaded Per Session
  894. percentSessions = 0;
  895. if (statGoodSessions > 0)
  896. {
  897. percentSessions = (double) 100 * statGoodSessions / (statGoodSessions + statBadSessions);
  898. cbuffer.Format( _T("%s: %s") , GetResString(IDS_STATS_AVGDATADLSES) , CastItoXBytes( theStats.sessionReceivedBytes / statGoodSessions, false, false ) );
  899. }
  900. else
  901. cbuffer.Format( _T("%s: %s") , GetResString(IDS_STATS_AVGDATADLSES) , CastItoXBytes((uint32)0, false, false) );
  902. stattree.SetItemText( down_ssessions[2] , cbuffer ); // Set Avg DL/Session
  903. cbuffer.Format( _T("%s: %u (%1.1f%%)") , GetResString(IDS_STATS_SDLSES) , statGoodSessions , percentSessions );
  904. stattree.SetItemText( down_ssessions[0] , cbuffer ); // Set Succ Sessions
  905. // Set Failed Download Sessions (Avoid Division)
  906. if (percentSessions != 0 && statBadSessions > 0)
  907. percentSessions = 100 - percentSessions; // There were some good sessions and bad ones...
  908. else if (percentSessions == 0 && statBadSessions > 0)
  909. percentSessions = 100; // There were bad sessions and no good ones, must be 100%
  910. else
  911. percentSessions = 0; // No sessions at all, or no bad ones.
  912. cbuffer.Format( _T("%s: %u (%1.1f%%)") , GetResString(IDS_STATS_FDLSES) , statBadSessions , percentSessions );
  913. stattree.SetItemText( down_ssessions[1] , cbuffer );
  914. // Set Average Download Time
  915. cbuffer.Format(_T("%s: %s"), GetResString(IDS_STATS_AVGDLTIME), CastSecondsToLngHM(thePrefs.GetDownS_AvgTime()));
  916. stattree.SetItemText( down_ssessions[3] , cbuffer );
  917. }
  918. // Set Gain Due To Compression
  919. cbuffer.Format(GetResString(IDS_STATS_GAINCOMP) + _T(" (%.1f%%)"), CastItoXBytes(thePrefs.GetSesSavedFromCompression(), false, false), theStats.sessionReceivedBytes!=0 ? (thePrefs.GetSesSavedFromCompression() * 100.0 / theStats.sessionReceivedBytes) : 0.0);
  920. stattree.SetItemText( down_S[5] , cbuffer );
  921. // Set Lost Due To Corruption
  922. cbuffer.Format(GetResString(IDS_STATS_LOSTCORRUPT) + _T(" (%.1f%%)"), CastItoXBytes(thePrefs.GetSesLostFromCorruption(), false, false), theStats.sessionReceivedBytes!=0 ? (thePrefs.GetSesLostFromCorruption() * 100.0 / theStats.sessionReceivedBytes) : 0.0);
  923. stattree.SetItemText( down_S[6] , cbuffer );
  924. // Set Parts Saved Due To ICH
  925. cbuffer.Format(GetResString(IDS_STATS_ICHSAVED), thePrefs.GetSesPartsSavedByICH());
  926. stattree.SetItemText( down_S[7] , cbuffer );
  927. // Calculate downline OH totals
  928. DownOHTotal = theStats.GetDownDataOverheadFileRequest() +
  929. theStats.GetDownDataOverheadSourceExchange() +
  930. theStats.GetDownDataOverheadServer() +
  931. theStats.GetDownDataOverheadKad() +
  932. theStats.GetDownDataOverheadOther();
  933. DownOHTotalPackets =
  934. theStats.GetDownDataOverheadFileRequestPackets() +
  935. theStats.GetDownDataOverheadSourceExchangePackets() +
  936. theStats.GetDownDataOverheadServerPackets() +
  937. theStats.GetDownDataOverheadKadPackets() +
  938. theStats.GetDownDataOverheadOtherPackets();
  939. // Downline Overhead
  940. cbuffer.Format( GetResString( IDS_TOVERHEAD ) , CastItoXBytes( DownOHTotal, false, false ) , CastItoIShort( DownOHTotalPackets ) );
  941. stattree.SetItemText( hdown_soh , cbuffer );
  942. if (forceUpdate || stattree.IsExpanded(hdown_soh))
  943. {
  944. int i = 0;
  945. // Set down session file req OH
  946. cbuffer.Format( GetResString( IDS_FROVERHEAD ) , CastItoXBytes( theStats.GetDownDataOverheadFileRequest(), false, false ) , CastItoIShort( theStats.GetDownDataOverheadFileRequestPackets() ) );
  947. stattree.SetItemText( down_soh[i] , cbuffer );
  948. i++;
  949. // Set down session source exch OH
  950. cbuffer.Format( GetResString( IDS_SSOVERHEAD ) , CastItoXBytes( theStats.GetDownDataOverheadSourceExchange(), false, false ), CastItoIShort( theStats.GetDownDataOverheadSourceExchangePackets() ) );
  951. stattree.SetItemText( down_soh[i] , cbuffer );
  952. i++;
  953. // Set down session server OH
  954. cbuffer.Format(GetResString(IDS_SOVERHEAD),
  955. CastItoXBytes(theStats.GetDownDataOverheadServer(), false, false),
  956. CastItoIShort(theStats.GetDownDataOverheadServerPackets()));
  957. stattree.SetItemText( down_soh[i] , cbuffer );
  958. i++;
  959. // Set down session Kad OH
  960. cbuffer.Format(GetResString(IDS_KADOVERHEAD),
  961. CastItoXBytes(theStats.GetDownDataOverheadKad(), false, false),
  962. CastItoIShort(theStats.GetDownDataOverheadKadPackets()));
  963. stattree.SetItemText( down_soh[i] , cbuffer );
  964. i++;
  965. }
  966. }
  967. // TRANSFER -> DOWNLOADS -> CUMULATIVE SECTION
  968. if (forceUpdate || stattree.IsExpanded(h_down_total))
  969. {
  970. // Downloaded Data
  971. uint64 ullCumReceived = theStats.sessionReceivedBytes + thePrefs.GetTotalDownloaded();
  972. cbuffer.Format(GetResString(IDS_STATS_DDATA), CastItoXBytes(ullCumReceived, false, false));
  973. stattree.SetItemText(down_T[0], cbuffer);
  974. if (forceUpdate || stattree.IsExpanded(down_T[0]))
  975. {
  976. // Downloaded Data By Client
  977. if (forceUpdate || stattree.IsExpanded(hdown_tcb))
  978. {
  979. int i = 0;
  980. uint64 DownDataTotal = thePrefs.GetDownTotalClientData();
  981. uint64 DownDataClient = thePrefs.GetCumDownData_EMULE();
  982. double percentClientTransferred = 0;
  983. if ( DownDataTotal!=0 && DownDataClient!=0 )
  984. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  985. cbuffer.Format( _T("eMule: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ) , percentClientTransferred);
  986. stattree.SetItemText( down_tcb[i] , cbuffer );
  987. i++;
  988. DownDataClient = thePrefs.GetCumDownData_EDONKEYHYBRID();
  989. if ( DownDataTotal!=0 && DownDataClient!=0 )
  990. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  991. else
  992. percentClientTransferred = 0;
  993. cbuffer.Format( _T("eD Hybrid: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ) , percentClientTransferred );
  994. stattree.SetItemText( down_tcb[i] , cbuffer );
  995. i++;
  996. DownDataClient = thePrefs.GetCumDownData_EDONKEY();
  997. if ( DownDataTotal!=0 && DownDataClient!=0 )
  998. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  999. else
  1000. percentClientTransferred = 0;
  1001. cbuffer.Format( _T("eDonkey: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ), percentClientTransferred );
  1002. stattree.SetItemText( down_tcb[i] , cbuffer );
  1003. i++;
  1004. DownDataClient = thePrefs.GetCumDownData_AMULE();
  1005. if ( DownDataTotal!=0 && DownDataClient!=0 )
  1006. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  1007. else
  1008. percentClientTransferred = 0;
  1009. cbuffer.Format( _T("aMule: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ), percentClientTransferred );
  1010. stattree.SetItemText( down_tcb[i] , cbuffer );
  1011. i++;
  1012. DownDataClient = thePrefs.GetCumDownData_MLDONKEY();
  1013. if ( DownDataTotal!=0 && DownDataClient!=0 )
  1014. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  1015. else
  1016. percentClientTransferred = 0;
  1017. cbuffer.Format( _T("MLdonkey: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ), percentClientTransferred );
  1018. stattree.SetItemText( down_tcb[i] , cbuffer );
  1019. i++;
  1020. DownDataClient = thePrefs.GetCumDownData_SHAREAZA();
  1021. if ( DownDataTotal!=0 && DownDataClient!=0 )
  1022. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  1023. else
  1024. percentClientTransferred = 0;
  1025. cbuffer.Format( _T("Shareaza: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ), percentClientTransferred );
  1026. stattree.SetItemText( down_tcb[i] , cbuffer );
  1027. i++;
  1028. DownDataClient = thePrefs.GetCumDownData_EMULECOMPAT();
  1029. if ( DownDataTotal!=0 && DownDataClient!=0 )
  1030. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  1031. else
  1032. percentClientTransferred = 0;
  1033. cbuffer.Format( _T("eM Compat: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ), percentClientTransferred );
  1034. stattree.SetItemText( down_tcb[i] , cbuffer );
  1035. i++;
  1036. DownDataClient = thePrefs.GetCumDownData_URL();
  1037. if ( DownDataTotal!=0 && DownDataClient!=0 )
  1038. percentClientTransferred = (double) 100 * DownDataClient / DownDataTotal;
  1039. else
  1040. percentClientTransferred = 0;
  1041. cbuffer.Format( _T("URL: %s (%1.1f%%)") , CastItoXBytes( DownDataClient, false, false ), percentClientTransferred );
  1042. stattree.SetItemText( down_tcb[i] , cbuffer );
  1043. i++;
  1044. }
  1045. // Downloaded Data By Port
  1046. if (forceUpdate || stattree.IsExpanded(hdown_tpb))
  1047. {
  1048. int i = 0;
  1049. uint64 PortDataDefault = thePrefs.GetCumDownDataPort_4662();
  1050. uint64 PortDataOther = thePrefs.GetCumDownDataPort_OTHER();
  1051. uint64 PortDataPeerCache = thePrefs.GetCumDownDataPort_PeerCache();
  1052. uint64 PortDataTotal = thePrefs.GetDownTotalPortData();
  1053. double percentPortTransferred = 0;
  1054. if ( PortDataTotal!=0 && PortDataDefault!=0 )
  1055. percentPortTransferred = (double) 100 * PortDataDefault / PortDataTotal;
  1056. cbuffer.Format( _T("%s: %s (%1.1f%%)") , GetResString(IDS_STATS_PRTDEF) , CastItoXBytes( PortDataDefault, false, false ) , percentPortTransferred);
  1057. stattree.SetItemText( down_tpb[i] , cbuffer );
  1058. i++;
  1059. if ( PortDataTotal!=0 && PortDataOther!=0 )
  1060. percentPortTransferred = (double) 100 * PortDataOther / PortDataTotal;
  1061. else
  1062. percentPortTransferred = 0;
  1063. cbuffer.Format( _T("%s: %s (%1.1f%%)") , GetResString(IDS_STATS_PRTOTHER) , CastItoXBytes( PortDataOther, false, false ) , percentPortTransferred);
  1064. stattree.SetItemText( down_tpb[i] , cbuffer );
  1065. i++;
  1066. if ( PortDataTotal!=0 && PortDataPeerCache!=0 )
  1067. percentPortTransferred = (double) 100 * PortDataPeerCache / PortDataTotal;
  1068. else
  1069. percentPortTransferred = 0;
  1070. cbuffer.Format( _T("%s: %s (%1.1f%%)") , thePrefs.GetPeerCacheShow() ? _T("PeerCache") : GetResString(IDS_STATS_PRTOTHER) , CastItoXBytes( PortDataPeerCache, false, false ) , percentPortTransferred);
  1071. stattree.SetItemText( down_tpb[i] , cbuffer );
  1072. i++;
  1073. }
  1074. }
  1075. // Set Cum Completed Downloads
  1076. cbuffer.Format(_T("%s: %u"), GetResString(IDS_STATS_COMPDL), thePrefs.GetDownCompletedFiles() );
  1077. stattree.SetItemText(down_T[1], cbuffer);
  1078. // Set Cum Download Sessions
  1079. statGoodSessions = thePrefs.GetDownC_SuccessfulSessions() + myStats.a[1]; // Need to reset these from the session section. Declared up there.
  1080. statBadSessions = thePrefs.GetDownC_FailedSessions(); // ^^^^^^^^^^^^^^
  1081. cbuffer.Format(_T("%s: %u"), GetResString(IDS_STATS_DLSES), statGoodSessions+statBadSessions );
  1082. stattree.SetItemText(down_T[2], cbuffer);
  1083. if (forceUpdate || stattree.IsExpanded(down_T[2]))
  1084. {
  1085. // Set Cum Successful Download Sessions & Cum Average Download Per Sessions (Save an if-else statement)
  1086. if (statGoodSessions > 0)
  1087. {
  1088. percentSessions = (double) 100 * statGoodSessions / (statGoodSessions + statBadSessions);
  1089. cbuffer.Format( _T("%s: %s") , GetResString(IDS_STATS_AVGDATADLSES), CastItoXBytes(ullCumReceived / statGoodSessions, false, false));
  1090. }
  1091. else
  1092. {
  1093. percentSessions = 0;
  1094. cbuffer.Format( _T("%s: %s") , GetResString(IDS_STATS_AVGDATADLSES) , CastItoXBytes((uint32)0, false, false) );
  1095. }
  1096. stattree.SetItemText( down_tsessions[2] , cbuffer ); // Set Avg DL/Session
  1097. cbuffer.Format( _T("%s: %u (%1.1f%%)"), GetResString(IDS_STATS_SDLSES) , statGoodSessions , percentSessions );
  1098. stattree.SetItemText( down_tsessions[0] , cbuffer ); // Set Successful Sessions
  1099. // Set Cum Failed Download Sessions
  1100. if (percentSessions != 0 && statBadSessions > 0)
  1101. percentSessions = 100 - percentSessions; // There were some good sessions and bad ones...
  1102. else if (percentSessions == 0 && statBadSessions > 0)
  1103. percentSessions = 100; // There were bad sessions and no good ones, must be 100%
  1104. else
  1105. percentSessions = 0; // No sessions at all, or no bad ones.
  1106. cbuffer.Format( _T("%s: %u (%1.1f%%)") , GetResString(IDS_STATS_FDLSES) , statBadSessions , percentSessions);
  1107. stattree.SetItemText( down_tsessions[1] , cbuffer );
  1108. // Set Cumulative Average Download Time
  1109. uint32 avgDownTime = thePrefs.GetDownS_AvgTime();
  1110. if (thePrefs.GetDownC_AvgTime()<=0)
  1111. thePrefs.SetDownCAvgTime(avgDownTime);
  1112. avgDownTime = (uint32) (avgDownTime+thePrefs.GetDownC_AvgTime())/2;
  1113. cbuffer.Format(_T("%s: %s"), GetResString(IDS_STATS_AVGDLTIME), CastSecondsToLngHM(avgDownTime));
  1114. stattree.SetItemText(down_tsessions[3], cbuffer);
  1115. }
  1116. // Set Cumulative Gained Due To Compression
  1117. uint64 ullCumCompressed = thePrefs.GetSesSavedFromCompression() + thePrefs.GetCumSavedFromCompression();
  1118. cbuffer.Format(GetResString(IDS_STATS_GAINCOMP) + _T(" (%.1f%%)"), CastItoXBytes(ullCumCompressed, false, false), ullCumReceived!=0 ? (ullCumCompressed * 100.0 / ullCumReceived) : 0.0);
  1119. stattree.SetItemText( down_T[3] , cbuffer );
  1120. // Set Cumulative Lost Due To Corruption
  1121. uint64 ullCumCorrupted = thePrefs.GetSesLostFromCorruption() + thePrefs.GetCumLostFromCorruption();
  1122. cbuffer.Format(GetResString(IDS_STATS_LOSTCORRUPT) + _T(" (%.1f%%)"), CastItoXBytes(ullCumCorrupted, false, false

Large files files are truncated, but you can click here to view the full file