/******************************************************************************* * Copyright (c) 2009 IBM, and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation ******************************************************************************/ package org.eclipse.ecf.provider.filetransfer.events.socket; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; import org.eclipse.ecf.core.util.Trace; import org.eclipse.ecf.filetransfer.events.socket.ISocketEvent; import org.eclipse.ecf.filetransfer.events.socket.ISocketEventSource; import org.eclipse.ecf.filetransfer.events.socket.ISocketListener; import org.eclipse.ecf.filetransfer.events.socketfactory.INonconnectedSocketFactory; import org.eclipse.ecf.internal.filetransfer.Activator; import org.eclipse.ecf.internal.provider.filetransfer.DebugOptions; public class SocketEventCreateUtil { static void fireEvent(final ISocketListener spyListener, ISocketEvent event) { if (spyListener != null) { spyListener.handleSocketEvent(event); } event.getSource().fireEvent(event); } public static Socket createSocket(final ISocketListener spyListener, final ISocketEventSource socketEventSource, final INonconnectedSocketFactory unconnectedFactory, final InetSocketAddress remoteInetAddress, final InetSocketAddress localInetAddress, int timeout) throws IOException { Trace.entering(Activator.PLUGIN_ID, DebugOptions.METHODS_ENTERING, SocketEventCreateUtil.class, "createSocket " + remoteInetAddress.toString() + " timeout=" + timeout); //$NON-NLS-1$ //$NON-NLS-2$ final Socket factorySocket = unconnectedFactory.createSocket(); fireEvent(spyListener, new SocketCreatedEvent(socketEventSource, factorySocket)); try { Trace.trace(Activator.PLUGIN_ID, "bind(" + localInetAddress.toString() + ")"); //$NON-NLS-1$//$NON-NLS-2$ factorySocket.bind(localInetAddress); Trace.trace(Activator.PLUGIN_ID, "connect(" + remoteInetAddress.toString() + ", " + timeout + ")"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ factorySocket.connect(remoteInetAddress, timeout); Trace.trace(Activator.PLUGIN_ID, "connected"); //$NON-NLS-1$ } catch (IOException e) { Trace.catching(Activator.PLUGIN_ID, DebugOptions.EXCEPTIONS_CATCHING, SocketEventCreateUtil.class, "createSocket", e); //$NON-NLS-1$ fireEvent(spyListener, new SocketClosedEvent(socketEventSource, factorySocket, factorySocket)); Trace.throwing(Activator.PLUGIN_ID, DebugOptions.EXCEPTIONS_THROWING, SocketEventCreateUtil.class, "createSocket", e); //$NON-NLS-1$ throw e; } final Socket[] wrap = new Socket[1]; final Socket myWrap = new AbstractSocketWrapper(factorySocket) { public void close() throws IOException { try { Trace.trace(Activator.PLUGIN_ID, "closing socket " + this.toString()); //$NON-NLS-1$ super.close(); } finally { fireEvent(spyListener, new SocketClosedEvent(socketEventSource, factorySocket, wrap[0])); } } }; SocketConnectedEvent connectedEvent = new SocketConnectedEvent(socketEventSource, factorySocket, myWrap); fireEvent(spyListener, connectedEvent); if (connectedEvent.getSocket() == myWrap) { wrap[0] = myWrap; } else { wrap[0] = connectedEvent.getSocket(); } return wrap[0]; } }