/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.debug.model.remote; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import org.eclipse.core.runtime.IStatus; import org.python.pydev.core.log.Log; import org.python.pydev.debug.core.PydevDebugPlugin; import org.python.pydev.shared_core.net.SocketUtil; public class ListenConnector implements Runnable { protected volatile int timeout; protected ServerSocket serverSocket; protected Socket socket; // what got accepted protected Exception e; public ListenConnector(int timeout) throws IOException { this.timeout = timeout; try { serverSocket = SocketUtil.createLocalServerSocket(); } catch (IOException e) { Log.log("Error when creating server socket.", e); throw e; } } public void setTimeout(int timeout) { this.timeout = timeout; } Exception getException() { return e; } public Socket getSocket() { return socket; } public void stopListening() { if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { PydevDebugPlugin.log(IStatus.WARNING, "Error closing pydevd socket", e); } finally { serverSocket = null; } } } public boolean isDisposed() { return serverSocket == null; } @Override public void run() { try { socket = waitForConnection(); } catch (IOException e) { this.e = e; } } public Socket waitForConnection() throws SocketException, IOException { serverSocket.setSoTimeout(timeout); return serverSocket.accept(); } public int getLocalPort() throws IOException { int localPort = serverSocket.getLocalPort(); SocketUtil.checkValidPort(localPort); return localPort; } @Override protected void finalize() throws Throwable { //Clear resources when garbage-collected. try { this.stopListening(); } catch (Throwable e) { //Never fail! PydevDebugPlugin.log(IStatus.WARNING, "Error finalizing ListenConnector", e); } } }