/* * This file is part of mlDHT. * * mlDHT is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * mlDHT is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with mlDHT. If not, see <http://www.gnu.org/licenses/>. */ package lbms.plugins.mldht.kad; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.util.Arrays; import lbms.plugins.mldht.kad.DHT.DHTtype; import the8472.bencode.Utils; public class PeerAddressDBItem extends DBItem { boolean seed; byte[] originatorVersion; public static PeerAddressDBItem createFromAddress(InetAddress addr, int port, boolean isSeed) { byte[] tdata = new byte[addr.getAddress().length + 2]; ByteBuffer bb = ByteBuffer.wrap(tdata); bb.put(addr.getAddress()); bb.putShort((short) port); return new PeerAddressDBItem(tdata, isSeed); } public PeerAddressDBItem(byte[] data, boolean isSeed) { super(data); if(data.length != DHTtype.IPV4_DHT.ADDRESS_ENTRY_LENGTH && data.length != DHTtype.IPV6_DHT.ADDRESS_ENTRY_LENGTH) throw new IllegalArgumentException("byte array length does not match ipv4 or ipv6 raw InetAddress+Port length"); seed = isSeed; } public void setVersion(byte[] ary) { originatorVersion = ary; } public InetAddress getInetAddress() { try { if (item.length == DHTtype.IPV4_DHT.ADDRESS_ENTRY_LENGTH) return InetAddress.getByAddress(Arrays.copyOf(item, 4)); if (item.length == DHTtype.IPV6_DHT.ADDRESS_ENTRY_LENGTH) return InetAddress.getByAddress(Arrays.copyOf(item, 16)); } catch (UnknownHostException e) { // should not happen e.printStackTrace(); } return null; } public InetSocketAddress toSocketAddress() { return new InetSocketAddress(getAddressAsString(), getPort()); } public String getAddressAsString() { return getInetAddress().getHostAddress(); } public Class<? extends InetAddress> getAddressType() { if(item.length == DHTtype.IPV4_DHT.ADDRESS_ENTRY_LENGTH) return DHTtype.IPV4_DHT.PREFERRED_ADDRESS_TYPE; if(item.length == DHTtype.IPV6_DHT.ADDRESS_ENTRY_LENGTH) return DHTtype.IPV6_DHT.PREFERRED_ADDRESS_TYPE; return null; } @Override public boolean equals(Object obj) { if(obj instanceof PeerAddressDBItem) { PeerAddressDBItem other = (PeerAddressDBItem) obj; if(other.item.length != item.length) return false; for(int i=0;i<item.length-2;i++) if(other.item[i] != item[i]) return false; return true; } return false; } @Override public int hashCode() { return Arrays.hashCode(Arrays.copyOf(item, item.length-2)); } @Override public String toString() { StringBuilder b = new StringBuilder(25); b.append(" addr:"); b.append(toSocketAddress()); b.append(" seed:"); b.append(seed); if(originatorVersion != null) b.append(" version:").append(Utils.prettyPrint(originatorVersion)); return b.toString(); } public int getPort() { if (item.length == DHTtype.IPV4_DHT.ADDRESS_ENTRY_LENGTH) return (item[4] & 0xFF) << 8 | (item[5] & 0xFF); if (item.length == DHTtype.IPV6_DHT.ADDRESS_ENTRY_LENGTH) return (item[16] & 0xFF) << 8 | (item[17] & 0xFF); return 0; } public boolean isSeed() { return seed; } }