package org.limewire.io; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.HashSet; import com.google.inject.Inject; import com.google.inject.Singleton; /** * Returns the current port and address for the local system. A <a * href="http://en.wikipedia.org/wiki/Singleton_pattern"> Singleton</a> * pattern, <code>IpPortForSelf</code> keeps a static reference which can be * reused. * <p> * It's ok to put <code>IpPortForSelf</code> in {@link HashSet HashSets}.<br> * It's not ok to put <code>IpPortForSelf</code> in {@link IpPortSet IpPortSets}.<br> * It's not ok to put <code>DirectAltLoc</code>s using this in * <code>AlternateLocationCollections</code>.<br> * It's not ok to use <code>IpPortForSelf</code> in objects whose hashCode or * equals will depend on the values returned by any of the getters. */ @Singleton public class IpPortForSelf implements IpPort, Connectable { private final InetAddress localhost; private final LocalSocketAddressProvider localSocketAddressProvider; @Inject IpPortForSelf(LocalSocketAddressProvider localSocketAddressProvider) { this.localSocketAddressProvider = localSocketAddressProvider; byte [] b = new byte[] {(byte)127,(byte)0,(byte)0,(byte)1}; InetAddress addr = null; try { addr = InetAddress.getByAddress(b); } catch (UnknownHostException impossible) { throw new RuntimeException(impossible); } localhost = addr; } public byte[] getAddressAsBytes() { return localSocketAddressProvider.getLocalAddress(); } public String getAddress() { return getInetAddress().getHostName(); } public InetAddress getInetAddress() { try { return InetAddress.getByAddress(localSocketAddressProvider.getLocalAddress()); } catch (UnknownHostException bad) { return localhost; } } public int getPort() { return localSocketAddressProvider.getLocalPort(); } public InetSocketAddress getInetSocketAddress() { return new InetSocketAddress(getInetAddress(), getPort()); } @Override public String getAddressDescription() { return getInetSocketAddress().toString(); } @Override public String toString() { return getAddress() +":"+getPort(); } public boolean isTLSCapable() { return localSocketAddressProvider.isTLSCapable(); } }