00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "vmsDownloadMgrEx.h"
00009
00010 #ifdef _DEBUG
00011 #undef THIS_FILE
00012 static char THIS_FILE[]=__FILE__;
00013 #define new DEBUG_NEW
00014 #endif
00015
00016 vmsDownloadMgrEx::vmsDownloadMgrEx()
00017 {
00018 m_pMgr = NULL;
00019 m_pBtMgr = NULL;
00020 }
00021
00022 vmsDownloadMgrEx::~vmsDownloadMgrEx()
00023 {
00024 SAFE_DELETE (m_pMgr);
00025 SAFE_DELETE (m_pBtMgr);
00026 }
00027
00028 void vmsDownloadMgrEx::Attach(fsDownloadMgr *pMgr)
00029 {
00030 SAFE_DELETE (m_pMgr);
00031 SAFE_DELETE (m_pBtMgr);
00032 m_pMgr = pMgr;
00033 }
00034
00035 void vmsDownloadMgrEx::Attach(vmsBtDownloadManager *pBtMgr)
00036 {
00037 SAFE_DELETE (m_pMgr);
00038 SAFE_DELETE (m_pBtMgr);
00039 m_pBtMgr = pBtMgr;
00040 }
00041
00042 fsDownloadMgr* vmsDownloadMgrEx::GetDownloadMgr()
00043 {
00044 return m_pMgr;
00045 }
00046
00047 vmsBtDownloadManager* vmsDownloadMgrEx::GetBtDownloadMgr()
00048 {
00049 return m_pBtMgr;
00050 }
00051
00052 fsString vmsDownloadMgrEx::get_OutputFilePathName()
00053 {
00054 if (m_pMgr)
00055 return m_pMgr->GetDP ()->pszFileName;
00056 else
00057 return m_pBtMgr->get_OutputFilePathName ();
00058 }
00059
00060 float vmsDownloadMgrEx::GetPercentDone()
00061 {
00062 if (m_pMgr)
00063 return m_pMgr->GetDownloader ()->GetPercentDone ();
00064 else
00065 return m_pBtMgr->GetPercentDone ();
00066 }
00067
00068 BOOL vmsDownloadMgrEx::IsLaunchWhenDone()
00069 {
00070 if (m_pMgr)
00071 return m_pMgr->GetDP ()->dwFlags & DPF_STARTWHENDONE;
00072 else
00073 return m_pBtMgr->get_Flags () & BTDF_LAUNCH_WHEN_DONE;
00074 }
00075
00076 fsResumeSupportType vmsDownloadMgrEx::IsResumeSupported()
00077 {
00078 if (m_pMgr)
00079 return m_pMgr->GetDownloader ()->IsResumeSupported ();
00080
00081 return RST_PRESENT;
00082 }
00083
00084 BOOL vmsDownloadMgrEx::IsDone()
00085 {
00086 if (m_pMgr)
00087 return m_pMgr->IsDone ();
00088 else
00089 return m_pBtMgr->IsDone ();
00090 }
00091
00092 BOOL vmsDownloadMgrEx::IsRunning()
00093 {
00094 if (m_pMgr)
00095 return m_pMgr->IsRunning ();
00096 else
00097 return m_pBtMgr->IsRunning ();
00098 }
00099
00100 BOOL vmsDownloadMgrEx::IsFileInitializedOnDisk()
00101 {
00102 if (m_pMgr)
00103 return m_pMgr->IsFileInit ();
00104 else
00105 return TRUE;
00106 }
00107
00108 void vmsDownloadMgrEx::set_LaunchWhenDone(BOOL b)
00109 {
00110 if (m_pMgr)
00111 {
00112 if (b)
00113 m_pMgr->GetDP ()->dwFlags |= DPF_STARTWHENDONE;
00114 else
00115 m_pMgr->GetDP ()->dwFlags &= ~DPF_STARTWHENDONE;
00116 }
00117 else
00118 {
00119 if (b)
00120 m_pBtMgr->enable_Flags (BTDF_LAUNCH_WHEN_DONE);
00121 else
00122 m_pBtMgr->disable_Flags (BTDF_LAUNCH_WHEN_DONE);
00123 }
00124 }
00125
00126 fsString vmsDownloadMgrEx::get_URL(BOOL bInclAuth)
00127 {
00128 if (m_pMgr)
00129 return m_pMgr->GetDownloader ()->get_URL (bInclAuth);
00130 else
00131 return m_pBtMgr->get_URL ();
00132 }
00133
00134 int vmsDownloadMgrEx::GetNumberOfSections()
00135 {
00136 if (m_pMgr)
00137 return m_pMgr->GetDownloader ()->GetNumberOfSections ();
00138 else
00139 return m_pBtMgr->GetNumberOfSections ();
00140 }
00141
00142 UINT64 vmsDownloadMgrEx::GetLDFileSize()
00143 {
00144 if (m_pMgr)
00145 return m_pMgr->GetDownloader ()->GetLDFileSize ();
00146 else
00147 return m_pBtMgr->GetTotalFilesSize ();
00148 }
00149
00150 UINT64 vmsDownloadMgrEx::GetDownloadedBytesCount()
00151 {
00152 if (m_pMgr)
00153 return m_pMgr->GetDownloader ()->GetDownloadedBytesCount ();
00154 else
00155 return m_pBtMgr->GetDownloadedBytesCount ();
00156 }
00157
00158 BOOL vmsDownloadMgrEx::IsDownloading()
00159 {
00160 if (m_pMgr)
00161 return m_pMgr->GetDownloader ()->IsDownloading ();
00162 else
00163 return m_pBtMgr->IsDownloading ();
00164 }
00165
00166 UINT64 vmsDownloadMgrEx::GetSSFileSize()
00167 {
00168 if (m_pMgr)
00169 return m_pMgr->GetDownloader ()->GetSSFileSize ();
00170 else
00171 return m_pBtMgr->GetTotalFilesSize ();
00172 }
00173
00174 void vmsDownloadMgrEx::GetSectionInfo(int nIndex, vmsSectionInfo *sect, BOOL bNoCacheAccounting)
00175 {
00176 if (m_pMgr)
00177 {
00178 fsSection s;
00179 m_pMgr->GetDownloader ()->GetSectionInfo (nIndex, &s, bNoCacheAccounting);
00180 sect->uDStart = s.uDStart;
00181 sect->uDCurrent = s.uDCurrent;
00182 sect->uDEnd = s.uDEnd;
00183 }
00184 else
00185 {
00186 m_pBtMgr->GetSectionInfo (nIndex, sect);
00187 }
00188 }
00189
00190 int vmsDownloadMgrEx::GetDownloadingSectionCount()
00191 {
00192 if (m_pMgr)
00193 return m_pMgr->GetDownloader ()->GetDownloadingSectionCount ();
00194 else
00195 return m_pBtMgr->GetDownloadingSectionCount ();
00196 }
00197
00198 void vmsDownloadMgrEx::CreateOneMoreSection()
00199 {
00200 if (m_pMgr)
00201 m_pMgr->CreateOneMoreSection ();
00202
00203 ASSERT (GetBtDownloadMgr () == NULL);
00204 }
00205
00206 void vmsDownloadMgrEx::StopSection()
00207 {
00208 if (m_pMgr)
00209 m_pMgr->StopSection ();
00210
00211 ASSERT (GetBtDownloadMgr () == NULL);
00212 }
00213
00214 UINT64 vmsDownloadMgrEx::GetBytesLeft()
00215 {
00216 if (m_pMgr)
00217 return m_pMgr->GetDownloader ()->GetBytesLeft ();
00218 else
00219 return m_pBtMgr->GetTotalFilesSize () - m_pBtMgr->GetDownloadedBytesCount ();
00220 }
00221
00222 UINT vmsDownloadMgrEx::GetSpeed()
00223 {
00224 if (m_pMgr)
00225 return m_pMgr->GetDownloader ()->GetSpeed ();
00226 else
00227 return m_pBtMgr->GetSpeed ();
00228 }
00229
00230 BOOL vmsDownloadMgrEx::MoveToFolder(LPCSTR pszPath)
00231 {
00232 if (m_pMgr)
00233 return m_pMgr->MoveToFolder (pszPath);
00234 else
00235 return m_pBtMgr->MoveToFolder (pszPath);
00236 }
00237
00238 BOOL vmsDownloadMgrEx::IsStoppedByUser()
00239 {
00240 if (m_pMgr)
00241 return m_pMgr->GetDownloader ()->IsStoppedByUser ();
00242 else
00243 return m_pBtMgr->IsStoppedByUser ();
00244 }
00245
00246 BOOL vmsDownloadMgrEx::IsCantStart()
00247 {
00248 if (m_pMgr)
00249 return m_pMgr->IsCantStart ();
00250 else
00251 return m_pBtMgr->IsCantStart ();
00252 }
00253
00254 fsInternetResult vmsDownloadMgrEx::RestartDownloading()
00255 {
00256 if (m_pMgr)
00257 return m_pMgr->RestartDownloading ();
00258 else
00259 return m_pBtMgr->RestartDownloading ();
00260 }
00261
00262 BOOL vmsDownloadMgrEx::IsDescriptionFileShouldBeGenerated()
00263 {
00264 if (m_pMgr)
00265 return m_pMgr->GetDP ()->dwFlags & DPF_GENERATEDESCFILE;
00266 else
00267 return m_pBtMgr->get_Flags () & BTDF_GENERATE_DESC_FILE;
00268 }
00269
00270 BOOL vmsDownloadMgrEx::IsHtmlSpiderDownload()
00271 {
00272 if (m_pMgr)
00273 return m_pMgr->GetDP ()->dwFlags & DLD_USEDBYHTMLSPIDER;
00274 else
00275 return FALSE;
00276 }
00277
00278 fsInternetResult vmsDownloadMgrEx::StartDownloading()
00279 {
00280 if (m_pMgr)
00281 return m_pMgr->StartDownloading ();
00282 else
00283 return m_pBtMgr->StartDownloading ();
00284 }
00285
00286 void vmsDownloadMgrEx::StopDownloading()
00287 {
00288 if (m_pMgr)
00289 m_pMgr->StopDownloading ();
00290 else
00291 m_pBtMgr->StopDownloading ();
00292 }
00293
00294 void vmsDownloadMgrEx::LimitTraffic(UINT uLimit)
00295 {
00296 if (m_pMgr)
00297 m_pMgr->GetDownloader ()->LimitTraffic (uLimit);
00298 else
00299 m_pBtMgr->LimitTraffic (uLimit);
00300 }
00301
00302 UINT vmsDownloadMgrEx::GetTrafficLimit()
00303 {
00304 if (m_pMgr)
00305 return m_pMgr->GetDownloader ()->GetTrafficLimit ();
00306 else
00307 return m_pBtMgr->GetTrafficLimit ();
00308 }
00309
00310 void vmsDownloadMgrEx::UseDetailedLog(BOOL b)
00311 {
00312 if (m_pMgr)
00313 m_pMgr->GetDownloader ()->UseDetailedLog (b);
00314 else
00315 m_pBtMgr->UseDetailedLog (b);
00316 }
00317
00318 BOOL vmsDownloadMgrEx::DeleteFile()
00319 {
00320 if (m_pMgr)
00321 return m_pMgr->DeleteFile ();
00322 else
00323 return m_pBtMgr->DeleteFile ();
00324 }
00325
00326 BOOL vmsDownloadMgrEx::IsDontConfirmLaunchWhenDone()
00327 {
00328 if (m_pMgr)
00329 return m_pMgr->GetDP ()->dwFlags & DPF_STARTWHENDONE_NOCONF;
00330 else
00331 return m_pBtMgr->get_Flags () & BTDF_LAUNCH_WHEN_DONE_NO_CONFIRM;
00332 }
00333
00334 fsInternetResult vmsDownloadMgrEx::SetToRestartState()
00335 {
00336 if (m_pMgr)
00337 return m_pMgr->SetToRestartState ();
00338 else
00339 return m_pBtMgr->SetToRestartState ();
00340 }
00341
00342 int vmsDownloadMgrEx::GetConnectionCount()
00343 {
00344 if (m_pMgr)
00345 return m_pMgr->GetDownloader ()->GetRunningSectionCount ();
00346 else
00347 return m_pBtMgr->get_ConnectionCount ();
00348 }
00349
00350 BOOL vmsDownloadMgrEx::SaveState(LPBYTE pb, DWORD *pdwSize)
00351 {
00352 if (pb)
00353 (*pdwSize)--;
00354
00355 BOOL bOk = m_pMgr ? m_pMgr->SaveState (pb ? pb + 1 : NULL, pdwSize) :
00356 m_pBtMgr->SaveState (pb ? pb + 1 : NULL, pdwSize);
00357
00358 (*pdwSize)++;
00359
00360 if (bOk == FALSE)
00361 return FALSE;
00362
00363 if (pb)
00364 *pb = m_pMgr == NULL;
00365
00366 return bOk;
00367 }
00368
00369 BOOL vmsDownloadMgrEx::LoadState(LPBYTE lpBuffer, LPDWORD lpdwSize, WORD wVer)
00370 {
00371 #define CHECK_BOUNDS(need) if (need < 0 || need > int(*lpdwSize) - (pB - LPBYTE (lpBuffer))) return FALSE;
00372 LPBYTE pB = LPBYTE (lpBuffer);
00373
00374 BYTE bBitTorrent = FALSE;
00375 DWORD dwMgrStateSize = *lpdwSize;
00376 DWORD dwConsumed = 0;
00377
00378 if (wVer > 9)
00379 {
00380 CHECK_BOUNDS (sizeof (BYTE));
00381 bBitTorrent = *lpBuffer++;
00382 dwConsumed++;
00383 dwMgrStateSize--;
00384 }
00385
00386 BOOL bOk;
00387
00388 if (bBitTorrent)
00389 {
00390 Attach (new vmsBtDownloadManager);
00391 bOk = m_pBtMgr->LoadState (lpBuffer, &dwMgrStateSize, wVer);
00392 }
00393 else
00394 {
00395 Attach (new fsDownloadMgr);
00396 bOk = m_pMgr->LoadState (lpBuffer, &dwMgrStateSize, wVer);
00397 }
00398
00399 if (bOk == FALSE)
00400 return FALSE;
00401
00402 dwConsumed += dwMgrStateSize;
00403 *lpdwSize = dwConsumed;
00404
00405 return TRUE;
00406 }
00407
00408 BOOL vmsDownloadMgrEx::IsBittorrent()
00409 {
00410 return m_pBtMgr != NULL;
00411 }
00412
00413 void vmsDownloadMgrEx::GetSplittedSectionsList(std::vector <vmsSectionInfo> &v)
00414 {
00415 try{
00416
00417 std::vector <vmsSectionInfo> vBtSects;
00418 if (m_pBtMgr)
00419 m_pBtMgr->GetSectionsInfo (vBtSects);
00420
00421 v.clear ();
00422 size_t num = GetNumberOfSections ();
00423 vmsSectionInfo *sectLast = NULL;
00424
00425 for (size_t i = 0; i < num; i++)
00426 {
00427 vmsSectionInfo sect;
00428 if (m_pBtMgr)
00429 sect = vBtSects [i];
00430 else
00431 GetSectionInfo (i, §);
00432 if (sectLast != NULL &&
00433 (sectLast->uDCurrent == sect.uDStart || sectLast->uDCurrent+1 == sect.uDStart))
00434 {
00435 sectLast->uDEnd = sect.uDEnd;
00436 sectLast->uDCurrent = sect.uDCurrent;
00437 }
00438 else
00439 {
00440 v.push_back (sect);
00441 sectLast = v.end () - 1;
00442 }
00443 }
00444
00445 }catch (...) {v.clear ();}
00446 }
00447
00448 BOOL vmsDownloadMgrEx::IsReservingDiskSpace()
00449 {
00450 if (m_pMgr)
00451 return (m_pMgr->get_State () & DS_RESERVINGSPACE) != 0;
00452 else
00453 return m_pBtMgr->get_State () == BTDSE_ALLOCATING;
00454 }
00455
00456 int vmsDownloadMgrEx::get_ReservingDiskSpaceProgress()
00457 {
00458 if (m_pMgr)
00459 return m_pMgr->get_ReservingDiskSpaceProgress ();
00460 else
00461 return m_pBtMgr->get_CurrentTaskProgress ();
00462 }
00463
00464 void vmsDownloadMgrEx::Do_OpenFolder()
00465 {
00466 if (m_pMgr && m_pMgr->IsFileInit () == FALSE)
00467 {
00468 ShellExecute (NULL, "explore", get_OutputFilePathName (), NULL, NULL, SW_SHOW);
00469 }
00470 else
00471 {
00472 CString strFileName = get_OutputFilePathName ();
00473
00474 if (m_pBtMgr && m_pBtMgr->get_FileCount () > 1)
00475 strFileName += m_pBtMgr->get_RootFolderName ();
00476
00477 if (GetFileAttributes (strFileName) == DWORD (-1))
00478 {
00479 char szPath [MY_MAX_PATH];
00480
00481 fsGetPath (strFileName, szPath);
00482 ShellExecute (NULL, "explore", szPath, NULL, NULL, SW_SHOW);
00483 }
00484 else
00485 {
00486 CString strCmd;
00487 strCmd.Format ("/select,\"%s\"", strFileName);
00488 ShellExecute (NULL, "open", "explorer.exe", strCmd, NULL, SW_SHOW);
00489 }
00490 }
00491 }