diff options
Diffstat (limited to 'src/RequestGroupMan.cc')
| -rw-r--r-- | src/RequestGroupMan.cc | 204 |
1 files changed, 170 insertions, 34 deletions
diff --git a/src/RequestGroupMan.cc b/src/RequestGroupMan.cc index b1b87713..5d13a845 100644 --- a/src/RequestGroupMan.cc +++ b/src/RequestGroupMan.cc @@ -33,9 +33,64 @@ */ /* copyright --> */ #include "RequestGroupMan.h" +#include "BtProgressInfoFile.h" +#include "DlAbortEx.h" +#include "RequestGroup.h" +#include "LogFactory.h" #include "DownloadEngine.h" #include "message.h" #include <iomanip> +#include <sstream> + +RequestGroupMan::RequestGroupMan(const RequestGroups& requestGroups, + int32_t maxSimultaneousDownloads): + _requestGroups(requestGroups), + _logger(LogFactory::getInstance()), + _maxSimultaneousDownloads(maxSimultaneousDownloads), + _gidCounter(0) {} + +bool RequestGroupMan::downloadFinished() +{ + if(!_reservedGroups.empty()) { + return false; + } + for(RequestGroups::iterator itr = _requestGroups.begin(); + itr != _requestGroups.end(); ++itr) { + if((*itr)->getNumCommand() > 0 || !(*itr)->downloadFinished()) { + return false; + } + } + return true; +} + +void RequestGroupMan::addRequestGroup(const RequestGroupHandle& group) +{ + _requestGroups.push_back(group); +} + +void RequestGroupMan::addReservedGroup(const RequestGroups& groups) +{ + _reservedGroups.insert(_reservedGroups.end(), groups.begin(), groups.end()); +} + +void RequestGroupMan::addReservedGroup(const RequestGroupHandle& group) +{ + _reservedGroups.push_back(group); +} + +int32_t RequestGroupMan::countRequestGroup() const +{ + return _requestGroups.size(); +} + +RequestGroupHandle RequestGroupMan::getRequestGroup(int32_t index) const +{ + if(index < (int32_t)_requestGroups.size()) { + return _requestGroups[index]; + } else { + return 0; + } +} void RequestGroupMan::removeStoppedGroup() { @@ -43,18 +98,27 @@ void RequestGroupMan::removeStoppedGroup() RequestGroups temp; for(RequestGroups::iterator itr = _requestGroups.begin(); itr != _requestGroups.end(); ++itr) { - if((*itr)->numConnection > 0) { + if((*itr)->getNumCommand() > 0) { temp.push_back(*itr); } else { (*itr)->closeFile(); + RequestGroups nextGroups = (*itr)->postDownloadProcessing(); + if((*itr)->downloadFinished()) { _logger->notice(MSG_FILE_DOWNLOAD_COMPLETED, (*itr)->getFilePath().c_str()); - (*itr)->remove(); + (*itr)->getProgressInfoFile()->removeFile(); } else { - (*itr)->save(); + try { + (*itr)->getProgressInfoFile()->save(); + } catch(DlAbortEx* ex) { + _logger->error(EX_EXCEPTION_CAUGHT, ex); + delete ex; + } } + (*itr)->releaseRuntimeResource(); ++count; + _spentGroups.push_back(*itr); } } _requestGroups = temp; @@ -65,22 +129,28 @@ void RequestGroupMan::removeStoppedGroup() void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e) { + RequestGroups temp; 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(!groupToAdd->isDependencyResolved()) { + temp.push_front(groupToAdd); + continue; + } + try { + _requestGroups.push_back(groupToAdd); + Commands commands = groupToAdd->createInitialCommand(e); + ++count; + e->addCommand(commands); + } catch(DlAbortEx* ex) { + _logger->error(EX_EXCEPTION_CAUGHT, ex); + delete ex; + } } + copy(temp.begin(), temp.end(), front_inserter(_reservedGroups)); if(count > 0) { _logger->debug("%d RequestGroup(s) added.", count); } @@ -89,18 +159,48 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e) 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()); + for(RequestGroups::iterator itr = _requestGroups.begin(); + itr != _requestGroups.end();) { + if((*itr)->isDependencyResolved()) { + try { + Commands nextCommands = (*itr)->createInitialCommand(e); + copy(nextCommands.begin(), nextCommands.end(), back_inserter(commands)); + ++itr; + } catch(DlAbortEx* e) { + _logger->error(EX_EXCEPTION_CAUGHT, e); + delete e; + } + } else { + _reservedGroups.push_front((*itr)); + itr = _requestGroups.erase(itr); } } return commands; } +void RequestGroupMan::save() +{ + for(RequestGroups::iterator itr = _requestGroups.begin(); + itr != _requestGroups.end(); ++itr) { + if(!(*itr)->downloadFinished()) { + try { + (*itr)->getProgressInfoFile()->save(); + } catch(DlAbortEx* e) { + _logger->error(EX_EXCEPTION_CAUGHT, e); + delete e; + } + } + } +} + +void RequestGroupMan::closeFile() +{ + for(RequestGroups::iterator itr = _requestGroups.begin(); + itr != _requestGroups.end(); ++itr) { + (*itr)->closeFile(); + } +} + void RequestGroupMan::showDownloadResults(ostream& o) const { // Download Results: @@ -110,30 +210,48 @@ void RequestGroupMan::showDownloadResults(ostream& o) const <<_("Download Results:") << "\n" << "idx|stat|path/URI" << "\n" << "===+====+======================================================================" << "\n"; + /* + RequestGroups groups(_spentGroups.begin(), _spentGroups.end()); for(RequestGroups::const_iterator itr = _requestGroups.begin(); itr != _requestGroups.end(); ++itr) { - o << setw(3) << (*itr)->getGID() << "|"; if((*itr)->downloadFinished()) { - o << "OK "; - } else { - o << "ERR "; + groups.push_back(*itr); } - o << "|"; - if((*itr)->downloadFinished()) { - o << (*itr)->getFilePath(); - } else { - Strings uris = (*itr)->getUris(); - if(uris.empty()) { + } + */ + for(RequestGroups::const_iterator itr = _spentGroups.begin(); + itr != _spentGroups.end(); ++itr) { + o << formatDownloadResult((*itr)->downloadFinished()?"OK":"ERR", *itr) << "\n"; + } + for(RequestGroups::const_iterator itr = _requestGroups.begin(); + itr != _requestGroups.end(); ++itr) { + o << formatDownloadResult((*itr)->downloadFinished()?"OK":"INPR", *itr) << "\n"; + } +} + +string RequestGroupMan::formatDownloadResult(const string& status, const RequestGroupHandle& requestGroup) const +{ + stringstream o; + o << setw(3) << requestGroup->getGID() << "|" + << setw(4) << status << "|"; + if(requestGroup->downloadFinished()) { + o << requestGroup->getFilePath(); + } else { + Strings uris = requestGroup->getUris(); + if(uris.empty()) { + if(requestGroup->getFilePath().empty()) { o << "n/a"; } else { - o << uris.front(); - if(uris.size() > 1) { - o << " (" << uris.size()-1 << "more)"; - } + o << requestGroup->getFilePath(); + } + } else { + o << uris.front(); + if(uris.size() > 1) { + o << " (" << uris.size()-1 << "more)"; } } - o << "\n"; } + return o.str(); } bool RequestGroupMan::isSameFileBeingDownloaded(RequestGroup* requestGroup) const @@ -147,3 +265,21 @@ bool RequestGroupMan::isSameFileBeingDownloaded(RequestGroup* requestGroup) cons } return false; } + +void RequestGroupMan::halt() +{ + for(RequestGroups::const_iterator itr = _requestGroups.begin(); + itr != _requestGroups.end(); ++itr) { + (*itr)->setHaltRequested(true); + } +} + +TransferStat RequestGroupMan::calculateStat() +{ + TransferStat stat; + for(RequestGroups::const_iterator itr = _requestGroups.begin(); + itr != _requestGroups.end(); ++itr) { + stat = stat+(*itr)->calculateStat(); + } + return stat; +} |
