package lbms.plugins.mldht.kad.messages; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import lbms.plugins.mldht.kad.DHT; import lbms.plugins.mldht.kad.DHTConstants; import lbms.plugins.mldht.kad.Key; import org.gudy.azureus2.core3.util.BEncoder; /** * @author Damokles * */ public abstract class AbstractLookupRequest extends MessageBase { protected Key target; private boolean want4; private boolean want6; /** * @param id * @param info_hash */ public AbstractLookupRequest (Key id, Key target, Method m) { super(new byte[] {(byte) 0xFF}, m, Type.REQ_MSG, id); this.target = target; } /* (non-Javadoc) * @see lbms.plugins.mldht.kad.messages.MessageBase#encode() */ @Override public byte[] encode () throws IOException { Map<String, Object> base = new HashMap<String, Object>(); Map<String, Object> inner = new HashMap<String, Object>(); base.put(DHTConstants.ARG, inner); inner.put("id", id.getHash()); inner.put(targetBencodingName(), target.getHash()); List<String> want = new ArrayList<String>(2); if(want4) want.add("n4"); if(want6) want.add("n6"); inner.put("want",want); base.put(DHTConstants.REQ, requestMethod()); base.put(DHTConstants.TID, mtid); base.put(DHTConstants.TYP, DHTConstants.REQ); base.put(DHTConstants.VER, DHTConstants.getVersion()); return BEncoder.encode(base); } protected abstract String targetBencodingName(); protected abstract String requestMethod(); /** * @return the info_hash */ public Key getTarget () { return target; } public boolean doesWant4() { return want4; } public void decodeWant(List<byte[]> want) { if(want == null) return; List<String> wants = new ArrayList<String>(2); for(byte[] bytes : want) wants.add(new String(bytes)); want4 |= wants.contains("n4"); want6 |= wants.contains("n6"); } public void setWant4(boolean want4) { this.want4 = want4; } public boolean doesWant6() { return want6; } public void setWant6(boolean want6) { this.want6 = want6; } public String toString() { //return super.toString() + "targetKey:"+target+" ("+(160-DHT.getSingleton().getOurID().findApproxKeyDistance(target))+")"; return super.toString() + "targetKey:"+target; } }