package com.limegroup.gnutella;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Set;
import org.limewire.core.settings.ConnectionSettings;
import org.limewire.io.IpPort;
import org.limewire.io.IpPortSet;
import org.limewire.net.SocketsManager.ConnectType;
import org.limewire.rudp.UDPMultiplexor;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import com.limegroup.gnutella.connection.RoutedConnection;
@Singleton
public class ConnectionServicesImpl implements ConnectionServices {
private final Provider<ConnectionManager> connectionManager;
private final Provider<HostCatcher> hostCatcher;
private final Provider<UDPMultiplexor> udpMultiplexor;
private final Provider<UploadManager> uploadManager;
private final Provider<Acceptor> acceptor;
private final Provider<SpamServices> spamServices;
@Inject
public ConnectionServicesImpl(
Provider<ConnectionManager> connectionManager,
Provider<HostCatcher> hostCatcher,
Provider<UDPMultiplexor> udpMultiplexor,
Provider<UploadManager> uploadManager, Provider<Acceptor> acceptor,
Provider<SpamServices> spamServices) {
this.connectionManager = connectionManager;
this.hostCatcher = hostCatcher;
this.udpMultiplexor = udpMultiplexor;
this.uploadManager = uploadManager;
this.acceptor = acceptor;
this.spamServices = spamServices;
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#isShieldedLeaf()
*/
public boolean isShieldedLeaf() {
return connectionManager.get().isShieldedLeaf();
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#isActiveSuperNode()
*/
public boolean isActiveSuperNode() {
return connectionManager.get().isActiveSupernode();
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#isSupernode()
*/
public boolean isSupernode() {
return connectionManager.get().isSupernode();
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#isConnecting()
*/
public boolean isConnecting() {
return connectionManager.get().isConnecting();
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#isConnected()
*/
public boolean isConnected() {
return connectionManager.get().isConnected();
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#isFullyConnected()
*/
public boolean isFullyConnected() {
return connectionManager.get().isFullyConnected();
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#getPreferencedHosts(boolean, java.lang.String, int)
*/
public Collection<IpPort> getPreferencedHosts(boolean isUltrapeer, String locale, int num) {
Set<IpPort> hosts = new IpPortSet();
if(isUltrapeer)
hosts.addAll(hostCatcher.get().getUltrapeersWithFreeUltrapeerSlots(locale,num));
else
hosts.addAll(hostCatcher.get().getUltrapeersWithFreeLeafSlots(locale,num));
// If we don't have enough hosts, add more.
if(hosts.size() < num) {
//we first try to get the connections that match the locale.
for(IpPort ipp : connectionManager.get().getInitializedConnectionsMatchLocale(locale)) {
if(hosts.size() >= num)
break;
hosts.add(ipp);
}
//if we still don't have enough hosts, get them from the list
//of all initialized connection
if(hosts.size() < num) {
for(IpPort ipp : connectionManager.get().getInitializedConnections()) {
if(hosts.size() >= num)
break;
hosts.add(ipp);
}
}
}
return hosts;
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#countConnectionsWithNMessages(int)
*/
public int countConnectionsWithNMessages(int messageThreshold) {
return connectionManager.get().countConnectionsWithNMessages(messageThreshold);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#getActiveConnectionMessages()
*/
public int getActiveConnectionMessages() {
return connectionManager.get().getActiveConnectionMessages();
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#removeConnection(com.limegroup.gnutella.ManagedConnection)
*/
public void removeConnection(RoutedConnection c) {
connectionManager.get().remove(c);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#disconnect()
*/
public void disconnect() {
// Delegate to connection manager
connectionManager.get().disconnect(false);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#connect()
*/
public void connect() {
// Delegate to connection manager
connectionManager.get().connect();
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#isConnectedTo(java.net.InetAddress)
*/
public boolean isConnectedTo(InetAddress addr) {
// ideally we would check download sockets too, but
// because of the way ManagedDownloader is built, it isn't
// too practical.
// TODO: rewrite ManagedDownloader
String host = addr.getHostAddress();
return connectionManager.get().isConnectedTo(host) ||
udpMultiplexor.get().isConnectedTo(addr) ||
uploadManager.get().isConnectedTo(addr); // ||
// dloadManager.isConnectedTo(addr);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#connectToHostAsynchronously(java.lang.String, int, com.limegroup.gnutella.util.SocketsManager.ConnectType)
*/
public void connectToHostAsynchronously(String hostname, int portnum, ConnectType type) {
//Don't allow connections to yourself. We have to special
//case connections to "localhost" or "127.0.0.1" since
//they are aliases for this machine.
byte[] cIP = null;
InetAddress addr;
try {
addr = InetAddress.getByName(hostname);
cIP = addr.getAddress();
} catch(UnknownHostException e) {
return;
}
if ((cIP[0] == 127) && (portnum==acceptor.get().getPort(true)) &&
ConnectionSettings.LOCAL_IS_PRIVATE.getValue()) {
return;
} else {
byte[] managerIP=acceptor.get().getAddress(true);
if (Arrays.equals(cIP, managerIP)
&& portnum==acceptor.get().getPort(true))
return;
}
if (spamServices.get().isAllowed(addr)) {
connectionManager.get().createConnectionAsynchronously(hostname, portnum, type);
}
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.ConnectionServices#getNumInitializedConnections()
*/
public int getNumInitializedConnections() {
return connectionManager.get().getNumInitializedConnections();
}
}