summaryrefslogtreecommitdiff
path: root/src/RequestGroupMan.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/RequestGroupMan.cc')
-rw-r--r--src/RequestGroupMan.cc204
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;
+}