package com.limegroup.gnutella.dht.db; import java.io.IOException; import java.io.OutputStream; import java.util.Set; import org.limewire.collection.BitNumbers; import org.limewire.io.Connectable; import org.limewire.io.ConnectableImpl; import org.limewire.io.IpPort; import org.limewire.io.IpPortImpl; import org.limewire.mojito.db.DHTValueType; import org.limewire.mojito.routing.Version; import org.limewire.net.address.StrictIpPortSet; import com.limegroup.gnutella.ApplicationServices; import com.limegroup.gnutella.NetworkManager; import com.limegroup.gnutella.PushEndpoint; import com.limegroup.gnutella.PushEndpointFactory; /** * An implementation of PushProxiesDHTValue for the localhost. * * Returns itself as a push proxy if the client is not behind a firewall. */ class PushProxiesValueForSelf extends AbstractPushProxiesValue { private static final long serialVersionUID = -3222117316287224578L; private final PushEndpoint self; private final NetworkManager networkManager; private final ApplicationServices applicationServices; public PushProxiesValueForSelf(NetworkManager networkManager, PushEndpointFactory pushEndpointFactory, ApplicationServices applicationServices) { super(AbstractPushProxiesValue.VERSION); this.networkManager = networkManager; this.self = pushEndpointFactory.createForSelf(); this.applicationServices = applicationServices; } @Override public DHTValueType getValueType() { return AbstractPushProxiesValue.PUSH_PROXIES; } @Override public Version getVersion() { return AbstractPushProxiesValue.VERSION; } public byte[] getValue() { return AbstractPushProxiesValue.serialize(this); } public void write(OutputStream out) throws IOException { out.write(getValue()); } public byte[] getGUID() { return applicationServices.getMyGUID(); } public byte getFeatures() { return self.getFeatures(); } public int getFwtVersion() { return self.getFWTVersion(); } public int getPort() { return self.getPort(); } /** * Returns a set of push proxies or the client's ip and port if it is not * firewalled. */ public Set<? extends IpPort> getPushProxies() { if (networkManager.acceptedIncomingConnection() && networkManager.isIpPortValid()) { // port should be the same as returned in #get return new StrictIpPortSet<Connectable>(new ConnectableImpl(new IpPortImpl(networkManager.getAddress(), networkManager.getPort()), networkManager.isIncomingTLSEnabled())); } else { return self.getProxies(); } } public BitNumbers getTLSInfo() { return AbstractPushProxiesValue.getNumbersFromProxies(getPushProxies()); } }