void CDownloadQueue::AddDownload(CPartFile* file, bool paused, uint8 category) { wxCHECK_RET(!IsFileExisting(file->GetFileHash()), wxT("Adding duplicate part-file")); if (file->GetStatus(true) == PS_ALLOCATING) { file->PauseFile(); } else if (paused && GetFileCount()) { file->StopFile(); } { wxMutexLocker lock(m_mutex); m_filelist.push_back( file ); DoSortByPriority(); } NotifyObservers( EventType( EventType::INSERTED, file ) ); if (category < theApp->glob_prefs->GetCatCount()) { file->SetCategory(category); } else { AddDebugLogLineN( logDownloadQueue, wxT("Tried to add download into invalid category.") ); } Notify_DownloadCtrlAddFile( file ); theApp->searchlist->UpdateSearchFileByHash(file->GetFileHash()); // Update file in the search dialog if it's still open AddLogLineC(CFormat(_("Downloading %s")) % file->GetFileName() ); }
void CDownloadQueue::Process() { // send src requests to local server ProcessLocalRequests(); { wxMutexLocker lock(m_mutex); uint32 downspeed = 0; if (thePrefs::GetMaxDownload() != UNLIMITED && m_datarate > 1500) { downspeed = (((uint32)thePrefs::GetMaxDownload())*1024*100)/(m_datarate+1); if (downspeed < 50) { downspeed = 50; } else if (downspeed > 200) { downspeed = 200; } } m_datarate = 0; m_udcounter++; uint32 cur_datarate = 0; uint32 cur_udcounter = m_udcounter; std::list<int> m_sourcecountlist; bool mustPreventSleep = false; for ( uint16 i = 0; i < m_filelist.size(); i++ ) { CPartFile* file = m_filelist[i]; CMutexUnlocker unlocker(m_mutex); uint8 status = file->GetStatus(); mustPreventSleep |= !(status == PS_ERROR || status == PS_INSUFFICIENT || status == PS_PAUSED || status == PS_COMPLETE); if (status == PS_READY || status == PS_EMPTY ){ cur_datarate += file->Process( downspeed, cur_udcounter ); } else { //This will make sure we don't keep old sources to paused and stoped files.. file->StopPausedFile(); } if (!file->IsPaused() && !file->IsStopped()) { m_sourcecountlist.push_back(file->GetSourceCount()); } } if (thePrefs::GetPreventSleepWhileDownloading()) { if ((mustPreventSleep == false) && (theStats::GetSessionSentBytes() < theStats::GetSessionReceivedBytes())) { // I can see right through your clever plan. mustPreventSleep = true; } if (mustPreventSleep) { PlatformSpecific::PreventSleepMode(); } else { PlatformSpecific::AllowSleepMode(); } } else { // Just in case the value changes while we're preventing. Calls to this function are totally inexpensive anwyay PlatformSpecific::AllowSleepMode(); } // Set the source rarity thresholds int nSourceGroups = m_sourcecountlist.size(); if (nSourceGroups) { m_sourcecountlist.sort(); if (nSourceGroups == 1) { // High anyway. m_rareFileThreshold = m_sourcecountlist.front() + 1; m_commonFileThreshold = m_rareFileThreshold + 1; } else if (nSourceGroups == 2) { // One high, one low (unless they're both 0, then both high) m_rareFileThreshold = (m_sourcecountlist.back() > 0) ? (m_sourcecountlist.back() - 1) : 1; m_commonFileThreshold = m_rareFileThreshold + 1; } else { // More than two, time to do some math. // Lower 25% with the current #define values. int rarecutpoint = (nSourceGroups / RARITY_FACTOR); for (int i = 0; i < rarecutpoint; ++ i) { m_sourcecountlist.pop_front(); } m_rareFileThreshold = (m_sourcecountlist.front() > 0) ? (m_sourcecountlist.front() - 1) : 1; // 50% of the non-rare ones, with the curent #define values. int commoncutpoint = (nSourceGroups - rarecutpoint) / NORMALITY_FACTOR; for (int i = 0; i < commoncutpoint; ++ i) { m_sourcecountlist.pop_front(); } m_commonFileThreshold = (m_sourcecountlist.front() > 0) ? (m_sourcecountlist.front() - 1) : 1; } } else { m_rareFileThreshold = RARE_FILE; m_commonFileThreshold = 100; } m_datarate += cur_datarate; if (m_udcounter == 5) { if (theApp->serverconnect->IsUDPSocketAvailable()) { if( (::GetTickCount() - m_lastudpstattime) > UDPSERVERSTATTIME) { m_lastudpstattime = ::GetTickCount(); CMutexUnlocker unlocker(m_mutex); theApp->serverlist->ServerStats(); } } } if (m_udcounter == 10) { m_udcounter = 0; if (theApp->serverconnect->IsUDPSocketAvailable()) { if ( (::GetTickCount() - m_lastudpsearchtime) > UDPSERVERREASKTIME) { SendNextUDPPacket(); } } } if ( (::GetTickCount() - m_lastsorttime) > 10000 ) { DoSortByPriority(); } // Check if any paused files can be resumed CheckDiskspace(thePrefs::GetTempDir()); } // Check for new links once per second. if ((::GetTickCount() - m_nLastED2KLinkCheck) >= 1000) { theApp->AddLinksFromFile(); m_nLastED2KLinkCheck = ::GetTickCount(); } }
void CDownloadQueue::LoadMetFiles(const CPath& path) { AddLogLineNS(CFormat(_("Loading temp files from %s.")) % path.GetPrintable()); std::vector<CPath> files; // Locate part-files to be loaded CDirIterator TempDir(path); CPath fileName = TempDir.GetFirstFile(CDirIterator::File, wxT("*.part.met")); while (fileName.IsOk()) { files.push_back(path.JoinPaths(fileName)); fileName = TempDir.GetNextFile(); } // Loading in order makes it easier to figure which // file is broken in case of crashes, or the like. std::sort(files.begin(), files.end()); // Load part-files for ( size_t i = 0; i < files.size(); i++ ) { AddLogLineNS(CFormat(_("Loading PartFile %u of %u")) % (i + 1) % files.size()); fileName = files[i].GetFullName(); CPartFile *toadd = new CPartFile(); bool result = toadd->LoadPartFile(path, fileName) != 0; if (!result) { // Try from backup result = toadd->LoadPartFile(path, fileName, true) != 0; } if (result && !IsFileExisting(toadd->GetFileHash())) { { wxMutexLocker lock(m_mutex); m_filelist.push_back(toadd); } NotifyObservers(EventType(EventType::INSERTED, toadd)); Notify_DownloadCtrlAddFile(toadd); } else { wxString msg; if (result) { msg << CFormat(wxT("WARNING: Duplicate partfile with hash '%s' found, skipping: %s")) % toadd->GetFileHash().Encode() % fileName; } else { // If result is false, then reading of both the primary and the backup .met failed AddLogLineN(_("ERROR: Failed to load backup file. Search http://forum.amule.org for .part.met recovery solutions.")); msg << CFormat(wxT("ERROR: Failed to load PartFile '%s'")) % fileName; } AddLogLineCS(msg); // Delete the partfile object in the end. delete toadd; } } AddLogLineNS(_("All PartFiles Loaded.")); if ( GetFileCount() == 0 ) { AddLogLineN(_("No part files found")); } else { AddLogLineN(CFormat(wxPLURAL("Found %u part file", "Found %u part files", GetFileCount())) % GetFileCount()); DoSortByPriority(); CheckDiskspace( path ); Notify_ShowUpdateCatTabTitles(); } }
void CDownloadQueue::Process() { // send src requests to local server ProcessLocalRequests(); { wxMutexLocker lock(m_mutex); uint32 downspeed = 0; if (thePrefs::GetMaxDownload() != UNLIMITED && m_datarate > 1500) { downspeed = (((uint32)thePrefs::GetMaxDownload())*1024*100)/(m_datarate+1); if (downspeed < 50) { downspeed = 50; } else if (downspeed > 200) { downspeed = 200; } } m_datarate = 0; m_udcounter++; uint32 cur_datarate = 0; uint32 cur_udcounter = m_udcounter; for ( uint16 i = 0; i < m_filelist.size(); i++ ) { CPartFile* file = m_filelist[i]; CMutexUnlocker unlocker(m_mutex); if ( file->GetStatus() == PS_READY || file->GetStatus() == PS_EMPTY ){ cur_datarate += file->Process( downspeed, cur_udcounter ); } else { //This will make sure we don't keep old sources to paused and stoped files.. file->StopPausedFile(); } } m_datarate += cur_datarate; if (m_udcounter == 5) { if (theApp->serverconnect->IsUDPSocketAvailable()) { if( (::GetTickCount() - m_lastudpstattime) > UDPSERVERSTATTIME) { m_lastudpstattime = ::GetTickCount(); CMutexUnlocker unlocker(m_mutex); theApp->serverlist->ServerStats(); } } } if (m_udcounter == 10) { m_udcounter = 0; if (theApp->serverconnect->IsUDPSocketAvailable()) { if ( (::GetTickCount() - m_lastudpsearchtime) > UDPSERVERREASKTIME) { SendNextUDPPacket(); } } } if ( (::GetTickCount() - m_lastsorttime) > 10000 ) { DoSortByPriority(); } // Check if any paused files can be resumed CheckDiskspace(thePrefs::GetTempDir()); } // Check for new links once per second. if ((::GetTickCount() - m_nLastED2KLinkCheck) >= 1000) { theApp->AddLinksFromFile(); m_nLastED2KLinkCheck = ::GetTickCount(); } }