/* */ #include "TrackerUpdateCommand.h" #include "LogFactory.h" #include "DlAbortEx.h" #include "message.h" #include "PeerInitiateConnectionCommand.h" #include "SleepCommand.h" #include "Util.h" #include "CUIDCounter.h" #include TrackerUpdateCommand::TrackerUpdateCommand(int32_t cuid, TorrentDownloadEngine* e, const BtContextHandle& btContext): BtContextAwareCommand(cuid, btContext), e(e) { logger = LogFactory::getInstance(); } TrackerUpdateCommand::~TrackerUpdateCommand() {} bool TrackerUpdateCommand::prepareForRetry() { e->commands.push_back(this); return false; } string TrackerUpdateCommand::getTrackerResponse() { stringstream strm; char data[2048]; try { while(1) { int32_t dataLength = e->_requestGroupMan->getRequestGroup(0)->getSegmentMan()->diskWriter->readData(data, sizeof(data), strm.tellp()); strm.write(data, dataLength); if(dataLength != sizeof(data)) { break; } } return strm.str(); } catch(RecoverableException* e) { throw; } } bool TrackerUpdateCommand::execute() { if(btAnnounce->noMoreAnnounce()) { return true; } if(e->_requestGroupMan->countRequestGroup() == 0 || !e->_requestGroupMan->downloadFinished()) { return prepareForRetry(); } try { string trackerResponse = getTrackerResponse(); btAnnounce->processAnnounceResponse(trackerResponse.c_str(), trackerResponse.size()); while(!btRuntime->isHalt() && btRuntime->lessThanMinPeer()) { PeerHandle peer = peerStorage->getUnusedPeer(); if(peer.isNull()) { break; } peer->cuid = CUIDCounterSingletonHolder::instance()->newID(); PeerInitiateConnectionCommand* command = new PeerInitiateConnectionCommand(peer->cuid, peer, e, btContext); e->commands.push_back(command); logger->debug("CUID#%d - Adding new command CUID#%d", cuid, peer->cuid); } btAnnounce->announceSuccess(); btAnnounce->resetAnnounce(); e->_requestGroupMan->removeStoppedGroup(); } catch(RecoverableException* err) { logger->error(MSG_TRACKER_RESPONSE_PROCESSING_FAILED, err, cuid); e->_requestGroupMan->getRequestGroup(0)->getSegmentMan()->errors++; delete err; } return prepareForRetry(); }