package net.i2p.router.transport.udp; import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.util.Addresses; /** * Unique ID for a peer - its IP + port, all bundled into a tidy obj. * If the remote peer is not reachable through an IP+port, this contains * the hash of their identity. * */ final class RemoteHostId { private final byte _ip[]; private final int _port; private final Hash _peerHash; private final int _hashCode; /** direct */ public RemoteHostId(byte ip[], int port) { this(ip, port, null); } /** indirect */ public RemoteHostId(Hash peerHash) { this(null, 0, peerHash); } private RemoteHostId(byte ip[], int port, Hash peerHash) { _ip = ip; _port = port; _peerHash = peerHash; _hashCode = DataHelper.hashCode(_ip) ^ DataHelper.hashCode(_peerHash) ^ _port; } /** @return null if indirect */ public byte[] getIP() { return _ip; } /** @return 0 if indirect */ public int getPort() { return _port; } /** @return null if direct */ public Hash getPeerHash() { return _peerHash; } @Override public int hashCode() { return _hashCode; } @Override public boolean equals(Object obj) { if (obj == null) return false; if (!(obj instanceof RemoteHostId)) return false; RemoteHostId id = (RemoteHostId)obj; return (_port == id._port) && DataHelper.eq(_ip, id._ip) && DataHelper.eq(_peerHash, id._peerHash); } @Override public String toString() { if (_ip != null) { return Addresses.toString(_ip, _port); } else { return _peerHash.toString(); } } }