/* */ #include "DHTMessageDispatcherImpl.h" #include "DHTMessage.h" #include "DHTMessageCallback.h" #include "DHTMessageEntry.h" #include "DHTMessageTracker.h" #include "RecoverableException.h" #include "LogFactory.h" #include "Logger.h" #include "DHTConstants.h" namespace aria2 { DHTMessageDispatcherImpl::DHTMessageDispatcherImpl(const SharedHandle& tracker): _tracker(tracker), _logger(LogFactory::getInstance()) {} DHTMessageDispatcherImpl::~DHTMessageDispatcherImpl() {} void DHTMessageDispatcherImpl::addMessageToQueue(const SharedHandle& message, time_t timeout, const SharedHandle& callback) { _messageQueue.push_back(new DHTMessageEntry(message, timeout, callback)); } void DHTMessageDispatcherImpl::addMessageToQueue(const SharedHandle& message, const SharedHandle& callback) { addMessageToQueue(message, DHT_MESSAGE_TIMEOUT, callback); } void DHTMessageDispatcherImpl::sendMessage(const SharedHandle& entry) { try { entry->_message->send(); if(!entry->_message->isReply()) { _tracker->addMessage(entry->_message, entry->_timeout, entry->_callback); } _logger->info("Message sent: %s", entry->_message->toString().c_str()); } catch(RecoverableException* e) { _logger->error("Failed to send message: %s", e, entry->_message->toString().c_str()); delete e; } } void DHTMessageDispatcherImpl::sendMessages() { // TODO I can't use bind1st and mem_fun here because bind1st cannot bind a // function which takes a reference as an argument.. for(std::deque >::iterator itr = _messageQueue.begin(); itr != _messageQueue.end(); ++itr) { sendMessage(*itr); } _messageQueue.clear(); } size_t DHTMessageDispatcherImpl::countMessageInQueue() const { return _messageQueue.size(); } } // namespace aria2