/* */ #include "RequestGroupMan.h" #include "DownloadEngine.h" #include "message.h" #include void RequestGroupMan::removeStoppedGroup() { int32_t count = 0; RequestGroups temp; for(RequestGroups::iterator itr = _requestGroups.begin(); itr != _requestGroups.end(); ++itr) { if((*itr)->numConnection > 0) { temp.push_back(*itr); } else { (*itr)->closeFile(); if((*itr)->downloadFinished()) { _logger->notice(MSG_FILE_DOWNLOAD_COMPLETED, (*itr)->getFilePath().c_str()); (*itr)->remove(); } else { (*itr)->save(); } ++count; } } _requestGroups = temp; if(count > 0) { _logger->debug("%d RequestGroup(s) deleted.", count); } } void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e) { removeStoppedGroup(); int32_t count = 0; for(int32_t num = _maxSimultaneousDownloads-_requestGroups.size(); num > 0 && _reservedGroups.size() > 0; --num) { RequestGroupHandle groupToAdd = _reservedGroups.front(); _reservedGroups.pop_front(); _requestGroups.push_back(groupToAdd); groupToAdd->initSegmentMan(); groupToAdd->setGID(++_gidCounter); Commands commands = groupToAdd->createNextCommand(e, 1); count += commands.size(); e->addCommand(commands); } if(count > 0) { _logger->debug("%d RequestGroup(s) added.", count); } } Commands RequestGroupMan::getInitialCommands(DownloadEngine* e) { Commands commands; for(RequestGroups::const_iterator itr = _requestGroups.begin(); itr != _requestGroups.end(); ++itr) { (*itr)->initSegmentMan(); (*itr)->setGID(++_gidCounter); Commands nextCommands = (*itr)->createNextCommand(e, 1); if(!nextCommands.empty()) { commands.push_back(nextCommands.front()); } } return commands; } void RequestGroupMan::showDownloadResults(ostream& o) const { // Download Results: // idx|stat|path/length // ===+====+======================================================================= o << "\n" <<_("Download Results:") << "\n" << "idx|stat|path/URI" << "\n" << "===+====+======================================================================" << "\n"; for(RequestGroups::const_iterator itr = _requestGroups.begin(); itr != _requestGroups.end(); ++itr) { o << setw(3) << (*itr)->getGID() << "|"; if((*itr)->downloadFinished()) { o << "OK "; } else { o << "ERR "; } o << "|"; if((*itr)->downloadFinished()) { o << (*itr)->getFilePath(); } else { Strings uris = (*itr)->getUris(); if(uris.empty()) { o << "n/a"; } else { o << uris.front(); if(uris.size() > 1) { o << " (" << uris.size()-1 << "more)"; } } } o << "\n"; } } bool RequestGroupMan::isSameFileBeingDownloaded(RequestGroup* requestGroup) const { for(RequestGroups::const_iterator itr = _requestGroups.begin(); itr != _requestGroups.end(); ++itr) { if((*itr).get() != requestGroup && (*itr)->getFilePath() == requestGroup->getFilePath()) { return true; } } return false; }