/* */ #include "BtPortMessage.h" #include "bittorrent_helper.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" #include "StringFormat.h" #include "a2functional.h" namespace aria2 { const std::string BtPortMessage::NAME("port"); BtPortMessage::BtPortMessage(uint16_t port): SimpleBtMessage(ID, NAME), _port(port) {} SharedHandle BtPortMessage::create (const unsigned char* data, size_t dataLength) { bittorrent::assertPayloadLengthEqual(3, dataLength, NAME); bittorrent::assertID(ID, data, NAME); uint16_t port = bittorrent::getShortIntParam(data, 1); SharedHandle message(new BtPortMessage(port)); return message; } void BtPortMessage::doReceivedAction() { if(!_taskFactory.isNull() && !_taskQueue.isNull()) { if(_port == 0) { if(getLogger()->debug()) { getLogger()->debug("Ignored port 0."); } return; } // 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(getPeer()->getIPAddress()); node->setPort(_port); { SharedHandle task = _taskFactory->createPingTask(node); _taskQueue->addImmediateTask(task); } if(_routingTable->countBucket() == 1) { // initiate bootstrap getLogger()->info("Dispatch node_lookup since too few buckets."); _taskQueue->addImmediateTask (_taskFactory->createNodeLookupTask(_localNode->getID())); } } else { getLogger()->info ("DHT port message received while localhost didn't declare support it."); } } unsigned char* BtPortMessage::createMessage() { /** * len --- 5, 4bytes * id --- 4, 1byte * port --- port number, 2bytes * total: 7bytes */ unsigned char* msg = new unsigned char[MESSAGE_LENGTH]; bittorrent::createPeerMessageString(msg, MESSAGE_LENGTH, 3, ID); bittorrent::setShortIntParam(&msg[5], _port); return msg; } size_t BtPortMessage::getMessageLength() { return MESSAGE_LENGTH; } std::string BtPortMessage::toString() const { return strconcat(NAME, " 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