package com.limegroup.gnutella.handshaking;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.util.List;
import org.limewire.nio.channel.NIOMultiplexor;
import org.limewire.nio.statemachine.IOState;
import org.limewire.nio.statemachine.IOStateMachine;
import org.limewire.nio.statemachine.IOStateObserver;
import com.limegroup.gnutella.Constants;
public class AsyncIncomingHandshaker implements Handshaker, IOStateObserver {
private final HandshakeSupport support;
private final IOStateMachine shaker;
private final HandshakeObserver observer;
private final Socket socket;
public AsyncIncomingHandshaker(HandshakeResponder responder,
Socket socket,
HandshakeObserver observer) {
this.socket = socket;
this.support = new HandshakeSupport(socket.getInetAddress().getHostAddress());
List<IOState> states = HandshakeState.getIncomingHandshakeStates(support, responder);
this.shaker = new IOStateMachine(this, states);
this.observer = observer;
}
public void shake() throws SocketException {
socket.setSoTimeout(Constants.TIMEOUT);
((NIOMultiplexor)socket).setReadObserver(shaker);
((NIOMultiplexor)socket).setWriteObserver(shaker);
}
public HandshakeResponse getWrittenHeaders() {
return support.getWrittenHandshakeResponse();
}
public HandshakeResponse getReadHeaders() {
return support.getReadHandshakeResponse();
}
public void handleStatesFinished() {
observer.handleHandshakeFinished(this);
}
public void handleIOException(IOException iox) {
if(iox instanceof NoGnutellaOkException) {
NoGnutellaOkException ngok = (NoGnutellaOkException)iox;
observer.handleNoGnutellaOk(ngok.getCode(), ngok.getMessage());
} else {
observer.handleBadHandshake();
}
}
public void shutdown() {
observer.shutdown();
}
}