/* */ #include "DHTInteractionCommand.h" #include "DownloadEngine.h" #include "RecoverableException.h" #include "DHTMessageDispatcher.h" #include "DHTMessageReceiver.h" #include "DHTTaskQueue.h" #include "DHTMessage.h" #include "Socket.h" #include "message.h" #include "RequestGroupMan.h" DHTInteractionCommand::DHTInteractionCommand(int32_t cuid, DownloadEngine* e): Command(cuid), _e(e), _dispatcher(0), _receiver(0), _taskQueue(0), _readCheckSocket(0) {} DHTInteractionCommand::~DHTInteractionCommand() { disableReadCheckSocket(_readCheckSocket); } void DHTInteractionCommand::setReadCheckSocket(const SocketHandle& socket) { _readCheckSocket = socket; _e->addSocketForReadCheck(socket, this); } void DHTInteractionCommand::disableReadCheckSocket(const SocketHandle& socket) { _e->deleteSocketForReadCheck(socket, this); } bool DHTInteractionCommand::execute() { if(_e->_requestGroupMan->downloadFinished() || _e->isHaltRequested()) { return true; } _taskQueue->executeTask(); for(size_t i = 0; i < 20 && _readCheckSocket->isReadable(0); ++i) { try { _receiver->receiveMessage(); } catch(RecoverableException* e) { logger->error(EX_EXCEPTION_CAUGHT, e); delete e; } } try { _receiver->handleTimeout(); _dispatcher->sendMessages(); } catch(RecoverableException* e) { logger->error(EX_EXCEPTION_CAUGHT, e); delete e; } _e->commands.push_back(this); return false; } void DHTInteractionCommand::setMessageDispatcher(const DHTMessageDispatcherHandle& dispatcher) { _dispatcher = dispatcher; } void DHTInteractionCommand::setMessageReceiver(const DHTMessageReceiverHandle& receiver) { _receiver = receiver; } void DHTInteractionCommand::setTaskQueue(const DHTTaskQueueHandle& taskQueue) { _taskQueue = taskQueue; }