package lbms.plugins.mldht.kad.messages; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import lbms.plugins.mldht.kad.DBItem; import lbms.plugins.mldht.kad.DHT; import lbms.plugins.mldht.kad.DHTConstants; import lbms.plugins.mldht.kad.Key; import lbms.plugins.mldht.kad.DHT.DHTtype; import org.gudy.azureus2.core3.util.BEncoder; /** * @author Damokles * */ public class GetPeersResponse extends MessageBase { private byte[] token; private byte[] nodes; private byte[] nodes6; private List<DBItem> items; /** * @param mtid * @param id * @param nodes * @param token */ public GetPeersResponse (byte[] mtid, Key id, byte[] nodes, byte[] nodes6, byte[] token) { super(mtid, Method.GET_PEERS, Type.RSP_MSG, id); this.nodes = nodes; this.nodes6 = nodes6; this.token = token; } /* (non-Javadoc) * @see lbms.plugins.mldht.kad.messages.MessageBase#apply(lbms.plugins.mldht.kad.DHT) */ @Override public void apply (DHT dh_table) { dh_table.response(this); } /* (non-Javadoc) * @see lbms.plugins.mldht.kad.messages.MessageBase#encode(byte[]) */ @Override public byte[] encode () throws IOException { //BEncoder enc(new BEncoderBufferOutput(arr)); Map<String, Object> base = new HashMap<String, Object>(); Map<String, Object> innerMap = new HashMap<String, Object>(); base.put(DHTConstants.RSP, innerMap); innerMap.put("id", id.getHash()); innerMap.put("token", token); if(nodes != null) innerMap.put("nodes", nodes); if(nodes6 != null) innerMap.put("nodes6", nodes6); if(items != null && !items.isEmpty()) { List<byte[]> itemsList = new ArrayList<byte[]>(items.size()); for (DBItem item : items) { itemsList.add(item.getData()); } innerMap.put("values", itemsList); } base.put(DHTConstants.TID, mtid); base.put(DHTConstants.TYP, DHTConstants.RSP); base.put(DHTConstants.VER, DHTConstants.getVersion()); return BEncoder.encode(base); } //GetPeersRsp(byte mtid,Key id, DBItemList values,Key token); public byte[] getNodes(DHTtype type) { if(type == DHTtype.IPV4_DHT) return nodes; if(type == DHTtype.IPV6_DHT) return nodes6; return null; } public byte[] getNodes () { return nodes; } public byte[] getNodes6 () { return nodes6; } public void setPeerItems(List<DBItem> items) { this.items = items; } public List<DBItem> getPeerItems () { return items == null ? (List<DBItem>)Collections.EMPTY_LIST : Collections.unmodifiableList(items); } public byte[] getToken () { return token; } public boolean containsNodes () { return nodes != null || nodes6 != null; } public boolean containsValues () { return items != null && items.size() > 0; } public String toString() { return super.toString() + "contains: "+ (nodes != null ? (nodes.length/DHTtype.IPV4_DHT.NODES_ENTRY_LENGTH)+" nodes" : "") + (nodes6 != null ? (nodes6.length/DHTtype.IPV6_DHT.NODES_ENTRY_LENGTH)+" nodes6" : "") + (items != null ? (items.size())+" values" : "") ; } }