/* */ #include "DownloadEngine.h" #include "Util.h" #include #include #include #include #include using namespace std; DownloadEngine::DownloadEngine():noWait(false), segmentMan(NULL) {} DownloadEngine::~DownloadEngine() { assert(rsockets.empty()); assert(wsockets.empty()); } void DownloadEngine::run() { initStatistics(); while(!commands.empty()) { int max = commands.size(); for(int i = 0; i < max; i++) { Command* com = commands.front(); commands.pop(); if(com->execute()) { delete(com); } } shortSleep(); if(!noWait && !commands.empty()) { waitData(); } noWait = false; calculateStatistics(); } onEndOfRun(); } void DownloadEngine::shortSleep() const { struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 1000; fd_set rfds; FD_ZERO(&rfds); select(0, &rfds, NULL, NULL, &tv); } void DownloadEngine::waitData() { fd_set rfds; fd_set wfds; struct timeval tv; int retval; FD_ZERO(&rfds); FD_ZERO(&wfds); int max = 0; for(Sockets::iterator itr = rsockets.begin(); itr != rsockets.end(); itr++) { FD_SET((*itr)->getSockfd(), &rfds); if(max < (*itr)->getSockfd()) { max = (*itr)->getSockfd(); } } for(Sockets::iterator itr = wsockets.begin(); itr != wsockets.end(); itr++) { FD_SET((*itr)->getSockfd(), &wfds); if(max < (*itr)->getSockfd()) { max = (*itr)->getSockfd(); } } tv.tv_sec = 1; tv.tv_usec = 0; retval = select(max+1, &rfds, /*&wfds*/NULL, NULL, &tv); } bool DownloadEngine::addSocket(Sockets& sockets, Socket* socket) { Sockets::iterator itr = find(sockets.begin(), sockets.end(), socket); if(itr == sockets.end()) { sockets.push_back(socket); return true; } else { return false; } } bool DownloadEngine::deleteSocket(Sockets& sockets, Socket* socket) { Sockets::iterator itr = find(sockets.begin(), sockets.end(), socket); if(itr != sockets.end()) { sockets.erase(itr); return true; } else { return false; } } bool DownloadEngine::addSocketForReadCheck(Socket* socket) { return addSocket(rsockets, socket); } bool DownloadEngine::deleteSocketForReadCheck(Socket* socket) { return deleteSocket(rsockets , socket); } bool DownloadEngine::addSocketForWriteCheck(Socket* socket) { return addSocket(wsockets, socket); } bool DownloadEngine::deleteSocketForWriteCheck(Socket* socket) { return deleteSocket(wsockets, socket); }