00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "DownloadProperties_MirrorsPage.h"
00009 #include "WaitDlg.h"
00010 #include "UrlWithLoginDlg.h"
00011 #include "inetutil.h"
00012
00013 #ifdef _DEBUG
00014 #define new DEBUG_NEW
00015 #undef THIS_FILE
00016 static char THIS_FILE[] = __FILE__;
00017 #endif
00018
00019 IMPLEMENT_DYNCREATE(CDownloadProperties_MirrorsPage, CPropertyPage)
00020
00021 CDownloadProperties_MirrorsPage::CDownloadProperties_MirrorsPage() : CPropertyPage(CDownloadProperties_MirrorsPage::IDD)
00022 {
00023 m_psp.dwFlags |= PSP_USETITLE;
00024 m_psp.pszTitle = LS (L_MIRRORS);
00025 }
00026
00027 CDownloadProperties_MirrorsPage::~CDownloadProperties_MirrorsPage()
00028 {
00029 }
00030
00031 void CDownloadProperties_MirrorsPage::DoDataExchange(CDataExchange* pDX)
00032 {
00033 CPropertyPage::DoDataExchange(pDX);
00034
00035 DDX_Control(pDX, IDC_MIRRS, m_wndMirrs);
00036
00037 }
00038
00039 BEGIN_MESSAGE_MAP(CDownloadProperties_MirrorsPage, CPropertyPage)
00040
00041 ON_WM_CONTEXTMENU()
00042 ON_WM_HELPINFO()
00043 ON_COMMAND(ID_WHATISTHIS, OnWhatisthis)
00044 ON_BN_CLICKED(IDC_CALCMIRRSPEED, OnCalcmirrspeed)
00045 ON_BN_CLICKED(IDC_ADDMIRROR, OnAddmirror)
00046 ON_BN_CLICKED(IDC_FINDMIRRORS, OnFindmirrors)
00047 ON_NOTIFY(NM_CLICK, IDC_MIRRS, OnClickMirrs)
00048 ON_NOTIFY(LVN_KEYDOWN, IDC_MIRRS, OnKeydownMirrs)
00049 ON_BN_CLICKED(IDC_REMOVE, OnRemove)
00050
00051 END_MESSAGE_MAP()
00052
00053 BOOL CDownloadProperties_MirrorsPage::OnInitDialog()
00054 {
00055 CPropertyPage::OnInitDialog();
00056
00057 RECT rc;
00058 m_wndMirrs.GetClientRect (&rc);
00059 m_wndMirrs.InsertColumn (0, LS (L_MIRRURLS), LVCFMT_LEFT, rc.right - 50-90 -
00060 GetSystemMetrics (SM_CXVSCROLL) - 1);
00061 m_wndMirrs.InsertColumn (1, LS (L_SERVSPEED), LVCFMT_LEFT, 90);
00062 m_wndMirrs.InsertColumn (2, LS (L_ISUSED), LVCFMT_LEFT, 50);
00063 m_wndMirrs.SetExtendedStyle (LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
00064
00065 fsInternetDownloader* dldr = m_dld->pMgr->GetDownloadMgr ()->GetDownloader ();
00066
00067 FillMirrsList ();
00068
00069 UpdateMirrSpeed ();
00070 UpdateMirrUsing ();
00071
00072 if (dldr->GetMirrorURLCount () == 0)
00073 GetDlgItem (IDC_CALCMIRRSPEED)->EnableWindow (FALSE);
00074
00075 if (dldr->IsMirrSearchPerformed ())
00076 GetDlgItem (IDC_FINDMIRRORS)->EnableWindow (FALSE);
00077
00078 ApplyLanguage ();
00079 UpdateEnabled ();
00080
00081 return TRUE;
00082 }
00083
00084 void CDownloadProperties_MirrorsPage::OnContextMenu(CWnd* , CPoint point)
00085 {
00086 PrepareCHMgr (point);
00087 _CHMgr.ShowMenu ();
00088 }
00089
00090 BOOL CDownloadProperties_MirrorsPage::OnHelpInfo(HELPINFO* pHelpInfo)
00091 {
00092 RECT rc;
00093 CWnd *pItem = GetDlgItem (pHelpInfo->iCtrlId);
00094 if (pItem == NULL)
00095 return TRUE;
00096 pItem->GetWindowRect (&rc);
00097 if (PtInRect (&rc, pHelpInfo->MousePos) == FALSE)
00098 {
00099 pHelpInfo->MousePos.x = rc.left + (rc.right - rc.left) / 2;
00100 pHelpInfo->MousePos.y = rc.top + (rc.bottom - rc.top) / 2;
00101 }
00102 PrepareCHMgr (pHelpInfo->MousePos);
00103 _CHMgr.OnWT ();
00104 return TRUE;
00105 }
00106
00107 void CDownloadProperties_MirrorsPage::OnWhatisthis()
00108 {
00109 _CHMgr.OnWT ();
00110 }
00111
00112 void CDownloadProperties_MirrorsPage::ApplyLanguage()
00113 {
00114 fsDlgLngInfo lnginfo [] = {
00115 fsDlgLngInfo (IDC_ADDMIRROR, L_ADD),
00116 fsDlgLngInfo (IDC_REMOVE, L_REMOVE),
00117 fsDlgLngInfo (IDC_FINDMIRRORS, L_FINDMIRROR),
00118 fsDlgLngInfo (IDC_CALCMIRRSPEED, L_CALCMIRRSSPEED),
00119 };
00120
00121 _LngMgr.ApplyLanguage (this, lnginfo, sizeof (lnginfo) / sizeof (fsDlgLngInfo), 0);
00122 }
00123
00124 void CDownloadProperties_MirrorsPage::PrepareCHMgr(CPoint point)
00125 {
00126 fsCtrlContextHelp aCH1 [] = {
00127 fsCtrlContextHelp (IDC_ADDMIRROR, LS (L_ADDMIRRORHERE)),
00128 fsCtrlContextHelp (IDC_FINDMIRRORS, LS (L_FINDMIRRORHERE)),
00129 fsCtrlContextHelp (IDC_CALCMIRRSPEED, LS (L_CALCMIRRSSPEEDHERE)),
00130 };
00131
00132 static fsCtrlContextHelp aCH [sizeof (aCH1) / sizeof (fsCtrlContextHelp)];
00133 CopyMemory (aCH, aCH1, sizeof (aCH));
00134
00135 _CHMgr.PrepareContextMenu (this, point, aCH, sizeof (aCH) / sizeof (fsCtrlContextHelp));
00136 }
00137
00138 void CDownloadProperties_MirrorsPage::UpdateMirrSpeed()
00139 {
00140 fsInternetDownloader *dldr = m_dld->pMgr->GetDownloadMgr ()->GetDownloader ();
00141
00142 DWORD dwBasePing = dldr->Get_BaseServerPingTime ();
00143 if (dwBasePing == UINT_MAX)
00144 {
00145 for (int i = 0; i < dldr->GetMirrorURLCount (); i++)
00146 dwBasePing = min (dwBasePing, dldr->GetMirrorPingTime (i));
00147 }
00148
00149 double fBasePing = dwBasePing;
00150
00151 for (int i = 0; i < dldr->GetMirrorURLCount (); i++)
00152 {
00153 UINT uPT = dldr->GetMirrorPingTime (i);
00154 CString str;
00155 if (uPT)
00156 {
00157 if (uPT != UINT_MAX)
00158 {
00159 str.Format ("%.*g", 3, fBasePing / double (uPT) * 100.0);
00160 str += "%";
00161 }
00162 else
00163 str = LS (L_UNKNOWN);
00164 }
00165 else
00166 str = "local";
00167 m_wndMirrs.SetItemText (i, 1, str);
00168 }
00169 }
00170
00171 void CDownloadProperties_MirrorsPage::UpdateMirrUsing()
00172 {
00173 fsInternetDownloader *dldr = m_dld->pMgr->GetDownloadMgr ()->GetDownloader ();
00174
00175 for (int i = 0; i < dldr->GetMirrorURLCount (); i++)
00176 {
00177 int cRefs = dldr->GetMirrorRefs (i);
00178 CString str = "";
00179 if (cRefs)
00180 str.Format ("%d", cRefs);
00181 m_wndMirrs.SetItemText (i, 2, str);
00182 }
00183 }
00184
00185 void CDownloadProperties_MirrorsPage::OnCalcmirrspeed()
00186 {
00187 CWaitDlg dlg;
00188 dlg.StartWaiting (LS (L_CALCULATINGMIRRORSSPEED), _threadCalcMirrSpeed, TRUE, this);
00189
00190 UpdateMirrSpeed ();
00191 UpdateMirrUsing ();
00192 }
00193
00194 void CDownloadProperties_MirrorsPage::OnAddmirror()
00195 {
00196 CUrlWithLoginDlg dlg;
00197
00198 _DlgMgr.OnDoModal (&dlg);
00199 UINT nRet = dlg.DoModal ();
00200 _DlgMgr.OnEndDialog (&dlg);
00201
00202 if (nRet == IDCANCEL)
00203 return;
00204
00205 LOG ("DP_MP:adding mirror..." << nl);
00206
00207 m_dld->pMgr->GetDownloadMgr ()->GetDownloader ()->AddMirrorURL (dlg.m_strUrl,
00208 dlg.m_strUser, dlg.m_strPassword);
00209
00210 LOG ("DP_MP:clone settings..." << nl);
00211
00212 LOG ("DP_MP:cloned" << nl);
00213
00214 FullUpdateMirrList ();
00215 CancelToClose ();
00216 }
00217
00218 void CDownloadProperties_MirrorsPage::OnFindmirrors()
00219 {
00220 if (m_dld->pMgr->GetDownloadMgr ()->GetDownloader ()->IsMirrSearchPerformed ())
00221 {
00222 MessageBox (LS (L_MIRRSEARCHPERFORMEDALREADY), LS (L_DONE), MB_ICONEXCLAMATION);
00223 return;
00224 }
00225
00226 CWaitDlg dlg;
00227 dlg.StartWaiting (LS (L_SEARCHINGFORMIRRORS), _threadFindMirrors, TRUE, this);
00228
00229 FullUpdateMirrList ();
00230
00231 if (m_dld->pMgr->GetDownloadMgr ()->GetDownloader ()->GetFoundMirrorCount ())
00232 {
00233 char sz [10000];
00234 sprintf (sz, LS (L_NMIRRORSFOUND), m_dld->pMgr->GetDownloadMgr ()->GetDownloader ()->GetFoundMirrorCount ());
00235 MessageBox (sz, LS (L_DONE));
00236 CancelToClose ();
00237 }
00238 else
00239 MessageBox (LS (L_NOMIRRORSFOUND), LS (L_DONE));
00240 }
00241
00242 void CDownloadProperties_MirrorsPage::CheckFileSizeKnown()
00243 {
00244 if (m_dld->pMgr->GetDownloadMgr ()->IsRunning () == FALSE && m_dld->pMgr->GetDownloadMgr ()->IsDone () == FALSE &&
00245 m_dld->pMgr->GetDownloadMgr ()->IsQueringSize () == FALSE &&
00246 m_dld->pMgr->GetDownloadMgr ()->GetDownloader ()->GetNumberOfSections () == 0)
00247 {
00248 m_dld->pMgr->GetDownloadMgr ()->QuerySize2 ();
00249 while (m_dld->pMgr->GetDownloadMgr ()->IsQueringSize ())
00250 Sleep (10);
00251 }
00252 }
00253
00254 DWORD WINAPI CDownloadProperties_MirrorsPage::_threadFindMirrors(LPVOID lp)
00255 {
00256 ProcWaitInfo *info = (ProcWaitInfo*) lp;
00257 CDownloadProperties_MirrorsPage* pThis = (CDownloadProperties_MirrorsPage*) info->lpParam1;
00258
00259 pThis->m_bNeedStop = FALSE;
00260
00261 DWORD dwThread;
00262 HANDLE hThread = CreateThread (NULL, 0, _threadFindMirrors2, pThis, 0, &dwThread);
00263
00264 DWORD dw;
00265 do
00266 {
00267 dw = WaitForSingleObject (hThread, 500);
00268
00269 if (info->bNeedStop)
00270 {
00271 pThis->m_bNeedStop = TRUE;
00272
00273 if (pThis->m_dld->pMgr->GetDownloadMgr ()->IsQueringSize ())
00274 pThis->m_dld->pMgr->GetDownloadMgr ()->StopQuering ();
00275
00276 pThis->m_dld->pMgr->GetDownloadMgr ()->StopDownloading ();
00277
00278 break;
00279 }
00280 }
00281 while (dw == WAIT_TIMEOUT);
00282
00283 if (dw == WAIT_TIMEOUT)
00284 WaitForSingleObject (hThread, INFINITE);
00285
00286 CloseHandle (hThread);
00287
00288 info->bWaitDone = TRUE;
00289
00290 return 0;
00291 }
00292
00293 DWORD WINAPI CDownloadProperties_MirrorsPage::_threadFindMirrors2(LPVOID lp)
00294 {
00295 CDownloadProperties_MirrorsPage* pThis = (CDownloadProperties_MirrorsPage*) lp;
00296
00297 pThis->CheckFileSizeKnown ();
00298
00299 if (pThis->m_dld->pMgr->GetDownloadMgr ()->GetDownloader ()->GetSSFileSize () == UINT_MAX)
00300 {
00301
00302 }
00303
00304 if (pThis->m_bNeedStop)
00305 return 0;
00306
00307 fsInternetResult ir = pThis->m_dld->pMgr->GetDownloadMgr ()->FindMirrors ();
00308
00309 if (ir != IR_SUCCESS)
00310 {
00311 char szErr [10000];
00312 fsIRToStr (ir, szErr, sizeof (szErr));
00313 pThis->MessageBox (szErr, LS (L_ERR), MB_ICONERROR);
00314 }
00315
00316 return 0;
00317 }
00318
00319 void CDownloadProperties_MirrorsPage::FillMirrsList()
00320 {
00321 fsInternetDownloader* dldr = m_dld->pMgr->GetDownloadMgr ()->GetDownloader ();
00322
00323 m_wndMirrs.DeleteAllItems ();
00324
00325 for (int i = 0; i < dldr->GetMirrorURLCount (); i++)
00326 {
00327 fsDownload_NetworkProperties *dnp = dldr->MirrorDNP (i);
00328 fsURL url;
00329 char szUrl [10000];
00330 DWORD dwLen = sizeof (szUrl);
00331
00332 url.Create (fsNPToScheme (dnp->enProtocol), dnp->pszServerName,
00333 dnp->uServerPort, "", "", dnp->pszPathName, szUrl, &dwLen);
00334
00335 m_wndMirrs.InsertItem (i, szUrl);
00336 }
00337 }
00338
00339 DWORD WINAPI CDownloadProperties_MirrorsPage::_threadCalcMirrSpeed(LPVOID lp)
00340 {
00341 ProcWaitInfo *info = (ProcWaitInfo*) lp;
00342 CDownloadProperties_MirrorsPage* pThis = (CDownloadProperties_MirrorsPage*) info->lpParam1;
00343
00344 pThis->m_bNeedStop = FALSE;
00345
00346 DWORD dwThread;
00347 HANDLE hThread = CreateThread (NULL, 0, _threadCalcMirrSpeed2, pThis, 0, &dwThread);
00348
00349 DWORD dw;
00350 do
00351 {
00352 dw = WaitForSingleObject (hThread, 500);
00353
00354 if (info->bNeedStop)
00355 {
00356 pThis->m_dld->pMgr->GetDownloadMgr ()->StopDownloading ();
00357 break;
00358 }
00359 }
00360 while (dw == WAIT_TIMEOUT);
00361
00362 if (dw == WAIT_TIMEOUT)
00363 WaitForSingleObject (hThread, INFINITE);
00364
00365 CloseHandle (hThread);
00366
00367 info->bWaitDone = TRUE;
00368
00369 return 0;
00370 }
00371
00372 DWORD WINAPI CDownloadProperties_MirrorsPage::_threadCalcMirrSpeed2(LPVOID lp)
00373 {
00374 CDownloadProperties_MirrorsPage* pThis = (CDownloadProperties_MirrorsPage*) lp;
00375
00376 if (pThis->m_bNeedStop)
00377 return 0;
00378
00379 pThis->m_dld->pMgr->GetDownloadMgr ()->MeasureMirrorsSpeed ();
00380
00381 return 0;
00382 }
00383
00384 void CDownloadProperties_MirrorsPage::FullUpdateMirrList()
00385 {
00386 LOG ("Entering DP_MP::FUML..." << nl);
00387
00388 FillMirrsList ();
00389 UpdateMirrSpeed ();
00390 UpdateMirrUsing ();
00391
00392 if (m_dld->pMgr->GetDownloadMgr ()->GetDownloader ()->GetMirrorURLCount ())
00393 GetDlgItem (IDC_CALCMIRRSPEED)->EnableWindow (TRUE);
00394
00395 UpdateEnabled ();
00396
00397 LOG ("Exit DP_MP::FUML" << nl);
00398 }
00399
00400 void CDownloadProperties_MirrorsPage::UpdateEnabled()
00401 {
00402 GetDlgItem (IDC_REMOVE)->EnableWindow (m_wndMirrs.GetSelectedCount ());
00403 }
00404
00405 void CDownloadProperties_MirrorsPage::OnClickMirrs(NMHDR* pNMHDR, LRESULT* pResult)
00406 {
00407 UpdateEnabled ();
00408 *pResult = 0;
00409 }
00410
00411 void CDownloadProperties_MirrorsPage::OnKeydownMirrs(NMHDR* pNMHDR, LRESULT* pResult)
00412 {
00413 LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
00414
00415 if (pLVKeyDow->wVKey == VK_DELETE)
00416 OnRemove ();
00417
00418 UpdateEnabled ();
00419 *pResult = 0;
00420 }
00421
00422 void CDownloadProperties_MirrorsPage::OnRemove()
00423 {
00424 fs::list <int> v;
00425 POSITION pos = m_wndMirrs.GetFirstSelectedItemPosition ();
00426 while (pos)
00427 v.add (m_wndMirrs.GetNextSelectedItem (pos));
00428
00429 BOOL bAllWasDeleted = TRUE;
00430
00431 for (int i = v.size ()-1; i >= 0; i--)
00432 {
00433 if (m_dld->pMgr->GetDownloadMgr ()->GetDownloader ()->RemoveMirror (v [i]))
00434 m_wndMirrs.DeleteItem (v [i]);
00435 else
00436 bAllWasDeleted = FALSE;
00437 }
00438
00439 CancelToClose ();
00440 UpdateEnabled ();
00441
00442 if (bAllWasDeleted == FALSE)
00443 MessageBox ("Failed to remove mirros(s).\nPlease try again later.", "Failed", MB_OK | MB_ICONEXCLAMATION);
00444 }