/* */ #include "DHTRoutingTableDeserializer.h" #include "DHTNode.h" #include "DHTConstants.h" #include "PeerMessageUtil.h" #include "DlAbortEx.h" #include "Logger.h" #include #include #include #include #include namespace aria2 { DHTRoutingTableDeserializer::DHTRoutingTableDeserializer(): _localNode(0) {} DHTRoutingTableDeserializer::~DHTRoutingTableDeserializer() {} SharedHandle DHTRoutingTableDeserializer::getLocalNode() const { return _localNode; } const std::deque >& DHTRoutingTableDeserializer::getNodes() const { return _nodes; } void DHTRoutingTableDeserializer::deserialize(std::istream& in) { try { char header[8]; memset(header, 0, sizeof(header)); // magic header[0] = 0xa1; header[1] = 0xa2; // format ID header[2] = 0x02; // version header[6] = 0; header[7] = 0x01; char zero[8]; memset(zero, 0, sizeof(zero)); char buf[26]; // header in.read(buf, 8); if(memcmp(header, buf, 8) != 0) { throw new DlAbortEx("Failed to load DHT routing table. cause:%s", "bad header"); } // time in.read(buf, 4); _serializedTime.setTimeInSec(ntohl(*reinterpret_cast(buf))); // 4bytes reserved in.read(buf, 4); // localnode // 8bytes reserved in.read(buf, 8); // localnode ID in.read(buf, DHT_ID_LENGTH); SharedHandle localNode = new DHTNode(reinterpret_cast(buf)); // 4bytes reserved in.read(buf, 4); // number of nodes in.read(buf, 4); uint32_t numNodes = ntohl(*reinterpret_cast(buf)); // 4bytes reserved in.read(buf, 4); // nodes for(size_t i = 0; i < numNodes; ++i) { // 6bytes compact peer info in.read(buf, 6); if(memcmp(zero, buf, 6) == 0) { // skip this entry in.read(buf, 26); continue; } std::pair peer = PeerMessageUtil::unpackcompact(buf); if(peer.first.empty()) { // skip this entry in.read(buf, 26); continue; } // 2bytes reserved in.read(buf, 2); // localnode ID in.read(buf, DHT_ID_LENGTH); SharedHandle node = new DHTNode(reinterpret_cast(buf)); node->setIPAddress(peer.first); node->setPort(peer.second); // 4bytes reserved in.read(buf, 4); _nodes.push_back(node); } _localNode = localNode; } catch(std::ios::failure const& exception) { _nodes.clear(); throw new DlAbortEx("Failed to load DHT routing table. cause:%s", strerror(errno)); } } } // namespace aria2