void CDownloadQueueManager::CancelRequests(IDownloadQueueObserver *aObserver) { CSingleLock lock(m_critical); // run through all our queues and remove all requests from this observer for (QUEUEPOOL::iterator it = m_queues.begin(); it != m_queues.end(); ++it) { CDownloadQueue* downloadQueue = *it; downloadQueue->CancelRequests(aObserver); } }
CDownloadQueue* CDownloadQueueManager::GetNextDownloadQueue() { CDownloadQueue* pQueueAvailable = NULL; // if we haven't added any queues to the pool, add one. if (m_queues.size() < 1) { m_queues.push_back( new CDownloadQueue() ); } // return the queue with the least number of items pending for (QUEUEPOOL::iterator it = m_queues.begin(); it != m_queues.end(); ++it) { // always choose the first queue if we haven't selected one yet if (!pQueueAvailable) { pQueueAvailable = *it; } else { // pick this queue if it has less items pending than our previous selection if ( pQueueAvailable->Size() > (*it)->Size() ) { pQueueAvailable = *it; } } } // if we picked a queue with pending items and we haven't reached out max pool limit if (pQueueAvailable->Size() > 0 && m_queues.size() < MAX_DOWNLOAD_QUEUES) { // spawn a new queue pQueueAvailable = new CDownloadQueue(); m_queues.push_back(pQueueAvailable); } assert(pQueueAvailable != NULL); return pQueueAvailable; }
TEST_F(TestDownloadQueue, RequestFile) { IDownloadQueueObserver observer; CDownloadQueue queue; CTestDownloadQueueThread thread; unsigned int count; std::vector<CStdString> urls = CXBMCTestUtils::Instance().getTestDownloadQueueUrls(); std::vector<CStdString>::iterator it; count = 0; for (it = urls.begin(); it < urls.end(); it++) { std::cout << "Testing URL: " << *it << "\n"; TICKET t = queue.RequestFile(*it, &observer); EXPECT_EQ(count, t.dwItemId); count++; } thread.Sleep(1000); queue.Flush(); EXPECT_EQ(0, queue.Size()); }
CPartFile* CDlgAddTask::SilenceAddNewTask(LPCTSTR lpszUrl, LPCTSTR lpszSaveDir /* = NULL */) { CString Link(lpszUrl); CString tcsPrefix = Link.Left(Link.Find(_T(':'))); CPartFile * pPartFile = NULL; CDownloadQueue * pQueue = CGlobalVariable::downloadqueue; // added by vc-yavey 20100507 : 保存到指定目录 <begin> CString strSaveDir = (lpszSaveDir != NULL && lpszSaveDir[0] != NULL ? lpszSaveDir : thePrefs.GetMuleDirectory(EMULE_INCOMINGDIR)); // added by vc-yavey 20100507 : 保存到指定目录 <begin> if (tcsPrefix.CompareNoCase(_T("ed2k")) == 0) { CED2KFileLink *pLink = NULL; CFileHashKey key; CAddTaskDoc::SItem item; pLink = CreateFileLinkFromUrl(lpszUrl); if (NULL != pLink) { key = pLink->GetHashKey(); item.strLinkText = lpszUrl; item.bCheck = TRUE; item.iCategory = 0; int iState = CGlobalVariable::filemgr.GetFileState((const uchar*)&key); if (pQueue) pPartFile = pQueue->GetFileByID((const uchar*)&key); CString strPrompt; CString strFileName; m_uAddState = 1; switch (iState) { case FILESTATE_DOWNLOADING: strFileName = CGlobalVariable::filemgr.GetFileName(item.strLinkText); strPrompt = GetResString(IDS_TASK_IN_DOWNLOADING); strPrompt += strFileName; CGlobalVariable::ShowNotifier(strPrompt,TBN_IMPORTANTEVENT); break; case FILESTATE_COMPLETED: case FILESTATE_HASH: case FILESTATE_LOCAL_SHARE: case FILESTATE_DOWNLOADED_SHARE: case FILESTATE_SHARE_TASK_DELED: strFileName = CGlobalVariable::filemgr.GetFileName(item.strLinkText); strPrompt = GetResString(IDS_ALREADY_DOWNLOAD); strPrompt += strFileName; CGlobalVariable::ShowNotifier(strPrompt,TBN_IMPORTANTEVENT); break; case FILESTATE_DELETED: /* strFileName = CGlobalVariable::filemgr.GetFileName(item.strLinkText); strPrompt = GetResString(IDS_DOWN_DELED_LINKS); strPrompt += strFileName; break; if(IDNO == MessageBox(strPrompt,GetResString(IDS_CAPTION),MB_YESNO)) break; */ case FILESTATE_NOT_EXIST: // MODIFIED by VC-yavey on 2010-04-16 <begin> // 安全地创建filelink CED2KFileLink *pFilelink = NULL; pFilelink = CreateFileLinkFromUrl(item.strLinkText); if( pFilelink && pFilelink->GetSize()> OLD_MAX_EMULE_FILE_SIZE && !thePrefs.CanFSHandleLargeFiles()) { // modifyed by vc-yavey on 2010-5-6 <begin> // 既然是SilenceAddNewTask就不要弹框吧? /* CString strMessage = GetResString(IDS_ERR_FSCANTHANDLEFILE); strMessage += _T("\n"); strMessage += pFilelink->GetName(); ::AfxMessageBox(strMessage); */ // pFilelink需要被删除 SAFE_DELETE(pFilelink); // modifyed by vc-yavey on 2010-5-6 <end> break; } // MODIFIED by VC-yavey on 2010-04-16 <end> SAFE_DELETE(pFilelink); // modified by vc-yavey 20100507 : 保存到指定目录 <begin> // CGlobalVariable::filemgr.NewDownloadFile(item.strLinkText, thePrefs.GetMuleDirectory(EMULE_INCOMINGDIR), item.iCategory); CGlobalVariable::filemgr.NewDownloadFile(item.strLinkText, strSaveDir, item.iCategory); // modified by vc-yavey 20100507 : 保存到指定目录 <end> // modifyed by vc-yavey on 2010-5-6 <begin> // 避免订阅时跳来跳去(此函数只在电驴更新和订阅时使用) /* CCmdGotoPage cmdGotoPage; if(thePrefs.bringtoforeground == 1) cmdGotoPage.GotoDownloading(); */ // modifyed by vc-yavey on 2010-5-6 <end> break; } SAFE_DELETE(pLink); // m_doc.SetItem(key, item); return pPartFile; } } else if (tcsPrefix.CollateNoCase(_T("http")) == 0) { int iState = CGlobalVariable::filemgr.GetUrlTaskState(lpszUrl); CString strPrompt; CString strFileName; m_uAddState = 1; for (POSITION pos = pQueue->filelist.GetHeadPosition();pos != 0;) { CPartFile* cur_file = pQueue->filelist.GetNext(pos); if (cur_file->GetPartFileURL().CompareNoCase(lpszUrl) == 0) { pPartFile = cur_file; break; } } switch (iState) { case FILESTATE_DOWNLOADING: strFileName = CGlobalVariable::filemgr.GetUrlFileName(lpszUrl); strPrompt = GetResString(IDS_TASK_IN_DOWNLOADING); strPrompt += strFileName; CGlobalVariable::ShowNotifier(strPrompt,TBN_IMPORTANTEVENT); break; case FILESTATE_COMPLETED: case FILESTATE_HASH: case FILESTATE_LOCAL_SHARE: strFileName = CGlobalVariable::filemgr.GetUrlFileName(lpszUrl); strPrompt = GetResString(IDS_ALREADY_DOWNLOAD); strPrompt += strFileName; CGlobalVariable::ShowNotifier(strPrompt,TBN_IMPORTANTEVENT); break; case FILESTATE_DOWNLOADED_SHARE: case FILESTATE_SHARE_TASK_DELED: case FILESTATE_DELETED: case FILESTATE_ZEROSIZE_DOWNLOADED: /* strFileName = CGlobalVariable::filemgr.GetUrlFileName(lpszUrl); strPrompt = GetResString(IDS_DOWN_DELED_LINKS); strPrompt += strFileName; break; if(IDNO == MessageBox(strPrompt,GetResString(IDS_CAPTION),MB_YESNO)) break; */ case FILESTATE_NOT_EXIST: // modified by vc-yavey 20100507 : 保存到指定目录 <begin> //CmdFuncs::ActualllyAddUrlDownload(lpszUrl,thePrefs.GetMuleDirectory(EMULE_INCOMINGDIR)); CmdFuncs::ActualllyAddUrlDownload(lpszUrl, strSaveDir); // modified by vc-yavey 20100507 : 保存到指定目录 <end> // modifyed by vc-yavey on 2010-5-6 <begin> // 避免订阅时跳来跳去(此函数只在电驴更新和订阅时使用) /* CCmdGotoPage cmdGotoPage; if(thePrefs.bringtoforeground == 1) cmdGotoPage.GotoDownloading(); */ // modifyed by vc-yavey on 2010-5-6 <end> break; } //m_doc.AppendUrl(lpszUrl); return pPartFile; } return pPartFile; }