package com.limegroup.gnutella.messages;
import java.util.LinkedList;
import java.util.List;
import org.limewire.core.settings.ConnectionSettings;
import org.limewire.io.GUID;
import org.limewire.util.NameValue;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.limegroup.gnutella.ConnectionServices;
import com.limegroup.gnutella.NetworkManager;
import com.limegroup.gnutella.messages.Message.Network;
@Singleton
public class PingRequestFactoryImpl implements PingRequestFactory {
public final NetworkManager networkManager;
private final ConnectionServices connectionServices;
@Inject
public PingRequestFactoryImpl(NetworkManager networkManager, ConnectionServices connectionServices) {
this.networkManager = networkManager;
this.connectionServices = connectionServices;
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.messages.PingRequestFactory#createPingRequest(byte[], byte, byte)
*/
public PingRequest createPingRequest(byte[] guid, byte ttl, byte hops) {
return new PingRequestImpl(guid, ttl, hops);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.messages.PingRequestFactory#createPingRequest(byte[], byte, byte, byte[])
*/
public PingRequest createFromNetwork(byte[] guid, byte ttl,
byte hops, byte[] payload, Network network) {
return new PingRequestImpl(guid, ttl, hops, payload);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.messages.PingRequestFactory#createPingRequest(byte)
*/
public PingRequest createPingRequest(byte ttl) {
return new PingRequestImpl(ttl);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.messages.PingRequestFactory#createPingRequest(byte[], byte)
*/
public PingRequest createPingRequest(byte[] guid, byte ttl) {
return new PingRequestImpl(guid, ttl);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.messages.PingRequestFactory#createQueryKeyRequest()
*/
public PingRequest createQueryKeyRequest() {
List<NameValue<?>> l = new LinkedList<NameValue<?>>();
l.add(new NameValue(GGEPKeys.GGEP_HEADER_QUERY_KEY_SUPPORT));
return new PingRequestImpl(GUID.makeGuid(), (byte)1, l);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.messages.PingRequestFactory#createUDPPing()
*/
public PingRequest createUDPPing() {
List<NameValue<?>> l = new LinkedList<NameValue<?>>();
return new PingRequestImpl(populateUDPGGEPList(l).bytes(), (byte)1, l);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.messages.PingRequestFactory#createUDPingWithDHTIPPRequest()
*/
public PingRequest createUDPingWithDHTIPPRequest() {
List<NameValue<?>> l = new LinkedList<NameValue<?>>();
GUID guid = new GUID();
l.add(new NameValue(GGEPKeys.GGEP_HEADER_DHT_IPPORTS));
return new PingRequestImpl(guid.bytes(), (byte)1, l);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.messages.PingRequestFactory#createUHCPing()
*/
public PingRequest createUHCPing() {
List<NameValue<?>> ggeps = new LinkedList<NameValue<?>>();
GUID guid = populateUDPGGEPList(ggeps);
ggeps.add(new NameValue(GGEPKeys.GGEP_HEADER_UDP_HOST_CACHE));
return new PingRequestImpl(guid.bytes(),(byte)1,ggeps);
}
/**
* Creates a TTL 1 Ping for faster bootstrapping, intended
* for sending to the multicast network.
*/
public PingRequest createMulticastPing() {
GUID guid = new GUID();
List<NameValue<?>> l = new LinkedList<NameValue<?>>();
l.add(new NameValue<byte[]>(GGEPKeys.GGEP_HEADER_SUPPORT_CACHE_PONGS, getSCPData()));
return new PingRequestImpl(guid.bytes(), (byte)1, l);
}
/**
* @param l list to put the standard extentions we add to UDP pings
* @return the guid to use for the ping
*/
private GUID populateUDPGGEPList(List<NameValue<?>> l) {
GUID guid;
if(ConnectionSettings.EVER_ACCEPTED_INCOMING.getValue()) {
guid = PingRequest.UDP_GUID;
} else {
l.add(new NameValue(GGEPKeys.GGEP_HEADER_IPPORT));
guid = networkManager.getSolicitedGUID();
}
l.add(new NameValue<byte[]>(GGEPKeys.GGEP_HEADER_SUPPORT_CACHE_PONGS, getSCPData()));
return guid;
}
byte[] getSCPData() {
byte[] data = new byte[1];
if(connectionServices.isSupernode())
data[0] = PingRequest.SCP_ULTRAPEER;
else
data[0] = PingRequest.SCP_LEAF;
if(networkManager.isIncomingTLSEnabled())
data[0] |= PingRequest.SCP_TLS; // add our support for TLS.
return data;
}
}