/* */ #include "TrackerWatcherCommand.h" #include "InitiateConnectionCommandFactory.h" #include "Util.h" #include "SleepCommand.h" #include "prefs.h" TrackerWatcherCommand::TrackerWatcherCommand(int cuid, TorrentDownloadEngine* e, int interval): Command(cuid), e(e), interval(interval) {} TrackerWatcherCommand::~TrackerWatcherCommand() {} bool TrackerWatcherCommand::execute() { if(e->segmentMan->errors > 0) { // we assume the tracker request has failed. e->torrentMan->trackers = 0; e->segmentMan->init(); // sleep a few seconds. SleepCommand* sleepCommand = new SleepCommand(cuid, e, this, e->option->getAsInt(PREF_RETRY_WAIT)); e->commands.push_back(sleepCommand); return false; } if(e->torrentMan->trackers == 0 && (e->torrentMan->connections < MAX_PEER_UPDATE || e->torrentMan->isHalt() || checkPoint.elapsed(interval))) { checkPoint.reset(); e->torrentMan->req->resetTryCount(); int numWant = 50; if(e->torrentMan->connections >= MIN_PEERS || e->torrentMan->isHalt()) { numWant = 0; } if(e->torrentMan->isHalt()) { e->torrentMan->req->setTrackerEvent(Request::STOPPED); } else if(e->torrentMan->downloadComplete()) { if(e->torrentMan->req->getTrackerEvent() == Request::COMPLETED) { e->torrentMan->req->setTrackerEvent(Request::AFTER_COMPLETED); } else { if(e->torrentMan->req->getTrackerEvent() == Request::STARTED) { e->torrentMan->req->setTrackerEvent(Request::AFTER_COMPLETED); } else if(e->torrentMan->req->getTrackerEvent() != Request::AFTER_COMPLETED) { e->torrentMan->req->setTrackerEvent(Request::COMPLETED); } } } string event; switch(e->torrentMan->req->getTrackerEvent()) { case Request::STARTED: event = "started"; break; case Request::STOPPED: event = "stopped"; break; case Request::COMPLETED: event = "completed"; break; } string url = e->torrentMan->announce+"?"+ "info_hash="+Util::urlencode(e->torrentMan->getInfoHash(), 20)+"&"+ "peer_id="+e->torrentMan->peerId+"&"+ "port="+Util::itos(e->torrentMan->getPort())+"&"+ "uploaded="+Util::llitos(e->torrentMan->getSessionUploadLength())+"&"+ "downloaded="+Util::llitos(e->torrentMan->getSessionDownloadLength())+"&"+ "left="+(e->torrentMan->getTotalLength()-e->torrentMan->getDownloadLength() <= 0 ? "0" : Util::llitos(e->torrentMan->getTotalLength()-e->torrentMan->getDownloadLength()))+"&"+ "compact=1"+"&"+ "key="+e->torrentMan->peerId+"&"+ "numwant="+Util::itos(numWant); if(!event.empty()) { url += string("&")+"event="+event; } if(!e->torrentMan->trackerId.empty()) { url += string("&")+"trackerid="+e->torrentMan->trackerId; } e->torrentMan->req->setUrl(url); Command* command = InitiateConnectionCommandFactory::createInitiateConnectionCommand(e->torrentMan->getNewCuid(), e->torrentMan->req, e); e->commands.push_back(command); e->torrentMan->trackers++; logger->info("CUID#%d - Creating new tracker request command #%d", cuid, command->getCuid()); if(e->torrentMan->isHalt()) { return true; } } interval = e->torrentMan->minInterval; e->commands.push_back(this); return false; }