package com.limegroup.gnutella.util; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; import com.limegroup.gnutella.io.ConnectObserver; import com.limegroup.gnutella.io.NBSocket; import com.limegroup.gnutella.io.SocketFactory; import com.limegroup.gnutella.settings.ConnectionSettings; class SimpleSocketController implements SocketController { /** * Makes a connection to the given InetSocketAddress. * If observer is null, this will block. * Otherwise, the observer will be notified of success or failure. */ public Socket connect(InetSocketAddress addr, int timeout, ConnectObserver observer) throws IOException { int proxyType = ProxyUtils.getProxyType(addr.getAddress()); if (proxyType != ConnectionSettings.C_NO_PROXY) return connectProxy(proxyType, addr, timeout, observer); else return connectPlain(addr, timeout, observer); } /** Allows endless # of sockets. */ public int getNumAllowedSockets() { return Integer.MAX_VALUE; } /** Does nothing. */ public boolean removeConnectObserver(ConnectObserver observer) { return false; } /** * Establishes a connection to the given host. * * If observer is null, this will block until a connection is established or an IOException is thrown. * Otherwise, this will return immediately and the Observer will be notified of success or failure. */ protected Socket connectPlain(InetSocketAddress addr, int timeout, ConnectObserver observer) throws IOException { NBSocket socket = SocketFactory.newSocket(); if(observer == null) socket.connect(addr, timeout); // blocking else socket.connect(addr, timeout, observer); // non-blocking return socket; } /** * Connects to a host using a proxy. */ protected Socket connectProxy(int type, InetSocketAddress addr, int timeout, ConnectObserver observer) throws IOException { String proxyHost = ConnectionSettings.PROXY_HOST.getValue(); int proxyPort = ConnectionSettings.PROXY_PORT.getValue(); InetSocketAddress proxyAddr = new InetSocketAddress(proxyHost, proxyPort); if(observer != null) { return connectPlain(proxyAddr, timeout, new ProxyUtils.ProxyConnector(type, observer, addr, timeout)); } else { Socket proxySocket = connectPlain(proxyAddr, timeout, null); try { return ProxyUtils.establishProxy(type, proxySocket, addr, timeout); } catch(IOException iox) { // Ensure the proxySocket is closed. Not all proxies cleanup correctly. try { proxySocket.close(); } catch(IOException ignored) {} throw iox; } } } }