00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "Downloads_Progress.h"
00009 #include "DownloadsWnd.h"
00010 #include "fsDownloadMgr.h"
00011 #include "fsInternetDownloader.h"
00012
00013 #ifdef _DEBUG
00014 #define new DEBUG_NEW
00015 #undef THIS_FILE
00016 static char THIS_FILE[] = __FILE__;
00017 #endif
00018
00019 CDownloads_Progress::CDownloads_Progress()
00020 {
00021 m_pActiveDownload = NULL;
00022
00023 m_hevShutdown = CreateEvent (NULL, TRUE, FALSE, NULL);
00024 m_hevDraw = CreateEvent (NULL, TRUE, FALSE, NULL);
00025
00026 DWORD dw;
00027 m_hthDrawProgress = CreateThread (NULL, 0, _threadDrawProgress, this, 0, &dw);
00028
00029 m_iLastProgress = -1;
00030 }
00031
00032 CDownloads_Progress::~CDownloads_Progress()
00033 {
00034 SetEvent (m_hevShutdown);
00035 WaitForSingleObject (m_hthDrawProgress, INFINITE);
00036 CloseHandle (m_hthDrawProgress);
00037 CloseHandle (m_hevDraw);
00038 CloseHandle (m_hevShutdown);
00039 }
00040
00041 BEGIN_MESSAGE_MAP(CDownloads_Progress, CWnd)
00042
00043 ON_WM_PAINT()
00044 ON_WM_SIZE()
00045
00046 END_MESSAGE_MAP()
00047
00048 BOOL CDownloads_Progress::Create(CWnd *pParent)
00049 {
00050 CRect rc (0, 0, 50, 50);
00051
00052 if (FALSE == CWnd::Create (AfxRegisterWndClass (0, LoadCursor (NULL, IDC_ARROW), (HBRUSH) (COLOR_WINDOW+1), NULL) ,
00053 NULL, WS_CHILD, rc, pParent, 0x121))
00054 return FALSE;
00055
00056 m_brProgress.CreateSolidBrush (RGB (255, 255, 255));
00057 m_brDone.CreateSolidBrush (RGB (158, 208, 235));
00058 m_penQ.CreatePen (PS_SOLID, 1, RGB (0, 115, 170));
00059
00060 return TRUE;
00061 }
00062
00063 void CDownloads_Progress::OnPaint()
00064 {
00065 CPaintDC dc(this);
00066
00067 m_iLastProgress = -1;
00068 SetEvent (m_hevDraw);
00069 }
00070
00071 void CDownloads_Progress::DrawProgress(CDC *dc, vmsDownloadSmartPtr dld)
00072 {
00073 if (dld == NULL)
00074 return;
00075
00076 if (IsWindowVisible () == FALSE || (int)dld->pMgr->GetPercentDone () == m_iLastProgress)
00077 return;
00078
00079 UINT64 uFileSize = dld->pMgr->GetLDFileSize ();
00080
00081 if (uFileSize == 0 || uFileSize == _UI64_MAX)
00082 return;
00083
00084 CDC dcDraw;
00085 dcDraw.CreateCompatibleDC (dc);
00086 CBitmap *pbmdOld;
00087
00088 if (m_iLastProgress != -1 || m_bmpProgress.m_hObject == NULL)
00089 {
00090 if (m_bmpProgress.m_hObject)
00091 m_bmpProgress.DeleteObject ();
00092
00093 bool bDontUseAlreadyDraw = dld->pMgr->IsBittorrent () != FALSE;
00094
00095 std::vector <vmsSectionInfo> v;
00096 dld->pMgr->GetSplittedSectionsList (v);
00097
00098 m_bmpProgress.CreateCompatibleBitmap (dc, m_size.cx, m_size.cy);
00099 pbmdOld = dcDraw.SelectObject (&m_bmpProgress);
00100
00101 dcDraw.FillSolidRect (0, 0, m_size.cx, m_size.cy, GetSysColor (COLOR_WINDOW));
00102
00103 for (size_t i = 0; i < v.size (); i++)
00104 DrawSectionProgress (&dcDraw, &v[i], i, uFileSize, bDontUseAlreadyDraw);
00105 }
00106 else
00107 {
00108 pbmdOld = dcDraw.SelectObject (&m_bmpProgress);
00109 }
00110
00111 m_iLastProgress = (int)dld->pMgr->GetPercentDone ();
00112
00113 dc->BitBlt (0, 0, m_size.cx, m_size.cy, &dcDraw, 0, 0, SRCCOPY);
00114
00115 dcDraw.SelectObject (pbmdOld);
00116 dcDraw.DeleteDC ();
00117 }
00118
00119 void CDownloads_Progress::SetActiveDownload(vmsDownloadSmartPtr dld)
00120 {
00121 m_pActiveDownload = dld;
00122 set_FullRedraw ();
00123 Invalidate ();
00124 }
00125
00126 void CDownloads_Progress::OnSize(UINT , int cx, int cy)
00127 {
00128 m_size.cx = cx;
00129 m_size.cy = cy;
00130 set_FullRedraw ();
00131 Invalidate (TRUE);
00132 }
00133
00134 void CDownloads_Progress::DrawSectionProgress(CDC *dc, vmsSectionInfo *sect, int iSect, UINT64 uFileSize, bool bDontUseAlreadyDraw)
00135 {
00136 const int sqDimX = 6;
00137 const int sqDimY = 6;
00138 const int sqDist = 1;
00139
00140 int csqx = (m_size.cx - sqDist) / (sqDimX + sqDist);
00141 int csqy = (m_size.cy - sqDist) / (sqDimY + sqDist);
00142 int csq = csqx * csqy;
00143
00144 double nsqs = double ((INT64)sect->uDStart) / (INT64)uFileSize * csq;
00145 double nsqe = double ((INT64)sect->uDEnd) / (INT64)uFileSize * csq;
00146 double nsqc = double ((INT64)sect->uDCurrent) / (INT64)uFileSize * csq;
00147
00148 int xStart = sqDist;
00149 int yStart = sqDist;
00150
00151 CBrush* brold = dc->SelectObject (&m_brDone);
00152 CPen *penold = dc->SelectObject (&m_penQ);
00153
00154 for (int i = 0; i < nsqe; i++)
00155 {
00156 if (i >= nsqs)
00157 {
00158 if (i >= nsqc)
00159 dc->SelectObject (&m_brProgress);
00160
00161 dc->Rectangle (xStart, yStart, xStart + sqDimX, yStart + sqDimY);
00162 }
00163
00164 xStart += sqDimX + sqDist;
00165 if (xStart + sqDimX + sqDist >= m_size.cx)
00166 {
00167
00168 xStart = sqDist;
00169 yStart += sqDimY + sqDist;
00170 }
00171 }
00172
00173 dc->SelectObject (brold);
00174 dc->SelectObject (penold);
00175 }
00176
00177 vmsDownloadSmartPtr CDownloads_Progress::GetActiveDownload()
00178 {
00179 return m_pActiveDownload;
00180 }
00181
00182 void CDownloads_Progress::UpdateDownload()
00183 {
00184 SetEvent (m_hevDraw);
00185 }
00186
00187 void CDownloads_Progress::set_FullRedraw()
00188 {
00189 m_iLastProgress = -1;
00190 m_bmpProgress.DeleteObject ();
00191 }
00192
00193 DWORD WINAPI CDownloads_Progress::_threadDrawProgress(LPVOID lp)
00194 {
00195 CDownloads_Progress *pthis = (CDownloads_Progress*) lp;
00196
00197 SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE);
00198
00199 HANDLE phEvs [] = {pthis->m_hevDraw, pthis->m_hevShutdown};
00200
00201 while (WAIT_OBJECT_0 == WaitForMultipleObjects (2, phEvs, FALSE, INFINITE))
00202 {
00203 ResetEvent (pthis->m_hevDraw);
00204 vmsDownloadSmartPtr dld = pthis->m_pActiveDownload;
00205 if (dld != NULL)
00206 {
00207 CDC *dc = pthis->GetDC ();
00208 pthis->DrawProgress (dc, dld);
00209 pthis->ReleaseDC (dc);
00210 }
00211 }
00212
00213 return 0;
00214 }