/* */ #include "BtPortMessage.h" #include "PeerMessageUtil.h" #include "DlAbortEx.h" #include "Util.h" #include "message.h" #include "Logger.h" #include "Peer.h" #include "DHTNode.h" #include "DHTRoutingTable.h" #include "DHTTaskQueue.h" #include "DHTTaskFactory.h" #include "DHTTask.h" namespace aria2 { BtPortMessage::BtPortMessage(uint16_t port): _port(port), _msg(0) {} BtPortMessage::~BtPortMessage() { delete [] _msg; } SharedHandle BtPortMessage::create(const unsigned char* data, size_t dataLength) { if(dataLength != 3) { throw new DlAbortEx(EX_INVALID_PAYLOAD_SIZE, "port", dataLength, 3); } uint8_t id = PeerMessageUtil::getId(data); if(id != ID) { throw new DlAbortEx(EX_INVALID_BT_MESSAGE_ID, id, "piece", ID); } uint16_t port = PeerMessageUtil::getShortIntParam(data, 1); SharedHandle message = new BtPortMessage(port); return message; } void BtPortMessage::doReceivedAction() { if(!_taskFactory.isNull() && !_taskQueue.isNull()) { // node id is random at this point. When ping reply received, new DHTNode // instance created with proper node ID and is added to a routing table. SharedHandle node = new DHTNode(); node->setIPAddress(peer->ipaddr); node->setPort(_port); { SharedHandle task = _taskFactory->createPingTask(node); _taskQueue->addImmediateTask(task); } if(_routingTable->countBucket() == 1) { // initiate bootstrap logger->info("Dispatch node_lookup since too few buckets."); _taskQueue->addImmediateTask(_taskFactory->createNodeLookupTask(_localNode->getID())); } } else { logger->info("DHT port message received while localhost didn't declare support it."); } } const unsigned char* BtPortMessage::getMessage() { if(!_msg) { /** * len --- 5, 4bytes * id --- 4, 1byte * port --- port number, 2bytes * total: 7bytes */ _msg = new unsigned char[MESSAGE_LENGTH]; PeerMessageUtil::createPeerMessageString(_msg, MESSAGE_LENGTH, 3, ID); PeerMessageUtil::setShortIntParam(&_msg[5], _port); } return _msg; } size_t BtPortMessage::getMessageLength() { return MESSAGE_LENGTH; } std::string BtPortMessage::toString() const { return "port port="+Util::uitos(_port); } void BtPortMessage::setLocalNode(const WeakHandle& localNode) { _localNode = localNode; } void BtPortMessage::setRoutingTable(const WeakHandle& routingTable) { _routingTable = routingTable; } void BtPortMessage::setTaskQueue(const WeakHandle& taskQueue) { _taskQueue = taskQueue; } void BtPortMessage::setTaskFactory(const WeakHandle& taskFactory) { _taskFactory = taskFactory; } } // namespace aria2