/* */ #include "TrackerWatcherCommand.h" #include "SleepCommand.h" #include "InitiateConnectionCommandFactory.h" #include "Util.h" TrackerWatcherCommand::TrackerWatcherCommand(int cuid, TorrentDownloadEngine* e): Command(cuid), e(e) { } TrackerWatcherCommand::~TrackerWatcherCommand() {} bool TrackerWatcherCommand::execute() { if(e->torrentMan->trackers == 0 && e->torrentMan->connections < 30) { e->torrentMan->req->resetTryCount(); 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; 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(command); e->torrentMan->trackers++; logger->info("CUID#%d - creating new tracker request command #%d", cuid, command->getCuid()); } SleepCommand* slpCommand = new SleepCommand(cuid, e, this, e->torrentMan->minInterval); e->commands.push(slpCommand); return false; }