package com.limegroup.gnutella.net.address;
import java.io.IOException;
import org.limewire.inject.EagerSingleton;
import org.limewire.io.Address;
import org.limewire.io.Connectable;
import org.limewire.logging.Log;
import org.limewire.logging.LogFactory;
import org.limewire.net.SocketsManager;
import org.limewire.net.TLSManager;
import org.limewire.net.SocketsManager.ConnectType;
import org.limewire.net.address.AddressConnector;
import org.limewire.nio.observer.ConnectObserver;
import com.google.inject.Inject;
/**
* This class handles connecting to addresses of type {@link Connectable}.
*/
@EagerSingleton
public class ConnectableConnector implements AddressConnector {
private static final Log LOG = LogFactory.getLog(ConnectableConnector.class, "address-connecting");
private final SocketsManager socketsManager;
private final TLSManager tlsManager;
@Inject
public ConnectableConnector(SocketsManager socketsManager, TLSManager tlsManager) {
this.socketsManager = socketsManager;
this.tlsManager = tlsManager;
socketsManager.registerConnector(this);
}
@Override
public boolean canConnect(Address address) {
boolean canConnect = address instanceof Connectable;
LOG.debugf("{0} connect remote address {1}", (canConnect ? "can" : "can not"), address);
return canConnect;
}
@Override
public void connect(Address address, ConnectObserver observer) {
Connectable connectable = (Connectable)address;
try {
ConnectType type = connectable.isTLSCapable() && tlsManager.isOutgoingTLSEnabled() ? ConnectType.TLS : ConnectType.PLAIN;
socketsManager.connect(connectable.getInetSocketAddress(), 10 * 1000, observer, type);
} catch (IOException e) {
observer.handleIOException(e);
}
}
}