package com.limegroup.gnutella; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.Set; import org.limewire.io.IpPort; import org.limewire.io.IpPortImpl; import org.limewire.io.NetworkInstanceUtils; import org.limewire.io.NetworkUtils; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; @Singleton public class SelfEndpoint extends AbstractPushEndpoint { private final NetworkManager networkManager; private final Provider<ConnectionManager> connectionManager; private final ApplicationServices applicationServices; private final PushEndpointCache pushEndpointCache; private final NetworkInstanceUtils networkInstanceUtils; @Inject SelfEndpoint(NetworkManager networkManager, ApplicationServices applicationServices, Provider<ConnectionManager> connectionManager, PushEndpointCache pushEndpointCache, NetworkInstanceUtils networkInstanceUtils) { this.networkManager = networkManager; this.applicationServices = applicationServices; this.connectionManager = connectionManager; this.pushEndpointCache = pushEndpointCache; this.networkInstanceUtils = networkInstanceUtils; } /** * delegate the call to connection manager */ public Set<? extends IpPort> getProxies() { return connectionManager.get().getPushProxies(); } /** * we always have the same features */ public byte getFeatures() { return 0; } /** * we support the same FWT version if we support FWT at all */ public int getFWTVersion() { return networkManager.supportsFWTVersion(); } /** * Our address is our external address if it is valid and external. * Otherwise we return the BOGUS_IP */ public String getAddress() { byte[] addr = networkManager.getExternalAddress(); if (NetworkUtils.isValidAddress(addr) && !networkInstanceUtils.isPrivateAddress(addr)) return NetworkUtils.ip2string(addr); return RemoteFileDesc.BOGUS_IP; } /** * @return our external address. First converts it to string since * 1.3 jvms does not support getting it from byte[]. */ public InetAddress getInetAddress() { try { return InetAddress.getByName(getAddress()); } catch (UnknownHostException bad) { return null; } } /** * Our port is our external port */ public int getPort() { if (networkManager.canDoFWT() && !networkManager.acceptedIncomingConnection()) return networkManager.getStableUDPPort(); return networkManager.getPort(); } public IpPort getValidExternalAddress() { try { String addr = getAddress(); int port = getPort(); if (addr.equals(RemoteFileDesc.BOGUS_IP) || !NetworkUtils.isValidPort(port)) return null; return new IpPortImpl(addr, getPort()); } catch (UnknownHostException bad) { return null; } } public boolean isLocal() { return true; } public PushEndpoint createClone() { return new PushEndpointImpl(getClientGUID(), getProxies(), getFeatures(), getFWTVersion(), getValidExternalAddress(), pushEndpointCache, networkInstanceUtils); } public byte[] getClientGUID() { return applicationServices.getMyGUID(); } public void updateProxies(boolean good) { } public InetSocketAddress getInetSocketAddress() { IpPort externalAddress = getValidExternalAddress(); if (externalAddress != null) { return externalAddress.getInetSocketAddress(); } else { return null; } } @Override public String getAddressDescription() { IpPort addr = getValidExternalAddress(); return addr == null ? null : addr.getAddress(); } }