blob: 3397644735337d9069cf7d5f261b4e068faea040 [file] [log] [blame]
/*******************************************************************************
* 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];
}
}