byte tag_count = rawData.get();
List<Tag> tag_list = new LinkedList<Tag>();
for (byte i = 0; i < tag_count; i++) {
Tag tag = TagScanner.scanTag(rawData);
if (tag == null)
throw new CorruptedPacketException();
tag_list.add(tag);
}
KadContact contact = routing_table.getContact(clientID);
if (contact != null) {
contact.setTCPPort(tcpPort);
contact.setUDPPort(packet.getAddress().getPort());
contact.setVersion(version);
}
KadPacket response = PacketFactory
.getHello2ResPacket(TagList.EMPTY_TAG_LIST);
_network_manager.sendKadPacket(response, sender_address,
sender_port);
} else if (packetOPCode == KADEMLIA2_HELLO_RES) {
byte[] client_id_raw = new byte[16];
rawData.get(client_id_raw);
ClientID clientID = new ClientID(client_id_raw);
int tcpPort = shortToInt(rawData.getShort());
byte version = rawData.get();
byte tag_count = rawData.get();
List<Tag> tag_list = new LinkedList<Tag>();
for (byte i = 0; i < tag_count; i++) {
Tag tag = TagScanner.scanTag(rawData);
if (tag == null)
throw new CorruptedPacketException();
tag_list.add(tag);
}
KadContact contact = routing_table.getContact(clientID);
if (contact != null) {
contact.setTCPPort(tcpPort);
contact.setVersion(version);
}
// ignore message if contact is not in routing table
/*
* ContactAddress address = new ContactAddress(new
* IPAddress(packet.getSender()),packet.getSender().getPort());
* KadContact add_contact = new KadContact(clientID, address,
* tcpPort,version, null);
* routing_table.addContact(add_contact);
*
* add_contact.setConnected(true);
*/
} else if (packetOPCode == KADEMLIA2_REQ) {
byte type = rawData.get();
byte[] client_id_raw = new byte[16];
rawData.get(client_id_raw);
ClientID targetClientID = new ClientID(client_id_raw);
client_id_raw = new byte[16];
rawData.get(client_id_raw);
ClientID receiverClientID = new ClientID(client_id_raw);
RequestType requestType = RequestType.FIND_VALUE;
switch (type) {
case JKadConstants.FIND_VALUE:
requestType = RequestType.FIND_VALUE;
break;
case JKadConstants.STORE:
requestType = RequestType.STORE;
break;
case JKadConstants.FIND_NODE:
requestType = RequestType.FIND_NODE;
break;
}
lookup.processRequest(packet.getAddress(), requestType,
targetClientID, receiverClientID, 2);
} else if (packetOPCode == KADEMLIA2_RES) {
byte[] client_id_raw = new byte[16];
rawData.get(client_id_raw);
int contactCount = byteToInt(rawData.get());
List<KadContact> contact_list = new LinkedList<KadContact>();
for (int i = 0; i < contactCount; i++) {
contact_list.add(getContact(rawData));
}
lookup.processResponse(packet.getAddress(), new ClientID(
client_id_raw), contact_list);
} else if (packetOPCode == KADEMLIA2_PUBLISH_KEY_REQ) {
byte[] client_id = new byte[16];
rawData.get(client_id);
ClientID clientID = new ClientID(client_id);
int count = rawData.getShort();
for (int i = 0; i < count; i++) {
byte[] hash = new byte[16];
rawData.get(hash);
byte tagCount = rawData.get();
TagList tag_list = new TagList();
for (int j = 0; j < tagCount; j++) {
Tag tag = TagScanner.scanTag(rawData);
if (tag == null)
throw new CorruptedPacketException();
tag_list.addTag(tag);
}
Source source = new Source(clientID, tag_list);
source.setAddress(new IPAddress(packet.getAddress()));
source.setUDPPort(packet.getAddress().getPort());
KadContact contact = routing_table.getContact(clientID);
if (contact != null)
source.setTCPPort(contact.getTCPPort());
indexer.addKeywordSource(new Int128(hash), source);
}
KadPacket response = PacketFactory.getPublishRes2Packet(
clientID, indexer.getKeywordLoad());
_network_manager.sendKadPacket(response, sender_address,
sender_port);
} else if (packetOPCode == KADEMLIA2_PUBLISH_RES) {
byte targetID[] = new byte[16];
rawData.get(targetID);
int load = byteToInt(rawData.get());
publisher.processGenericResponse(new ClientID(targetID), load);
} else if (packetOPCode == KADEMLIA2_PUBLISH_SOURCE_REQ) {
byte[] client_id = new byte[16];
byte[] source_id = new byte[16];
rawData.get(client_id);
rawData.get(source_id);
int tagCount = rawData.get();
TagList tag_list = new TagList();
for (int i = 0; i < tagCount; i++) {
Tag tag = TagScanner.scanTag(rawData);
if (tag == null)
throw new CorruptedPacketException();
tag_list.addTag(tag);
}
Source source = new Source(new ClientID(client_id), tag_list);
source.setAddress(new IPAddress(packet.getAddress()));
source.setUDPPort(packet.getAddress().getPort());