package com.limegroup.gnutella.altlocs;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import com.limegroup.gnutella.ErrorService;
import com.limegroup.gnutella.GUID;
import com.limegroup.gnutella.PushEndpoint;
import com.limegroup.gnutella.PushEndpointForSelf;
import com.limegroup.gnutella.RemoteFileDesc;
import com.limegroup.gnutella.RouterService;
import com.limegroup.gnutella.URN;
import com.limegroup.gnutella.http.HTTPConstants;
/**
* A firewalled altloc.
*/
public class PushAltLoc extends AlternateLocation {
/**
* the host we would send push to. Null if not firewalled.
*/
private final PushEndpoint _pushAddress;
/**
* creates a new AlternateLocation for a firewalled host.
* @param address
* @param sha1
* @throws IOException
*/
protected PushAltLoc(final PushEndpoint address, final URN sha1)
throws IOException {
super(sha1);
if (address == null)
throw new IOException("null address");
_pushAddress = address;
}
/**
* creates a new PushLocation for myself
*/
protected PushAltLoc(URN sha1) throws IOException{
super(sha1);
_pushAddress = PushEndpointForSelf.instance();
}
protected String generateHTTPString() {
return _pushAddress.httpStringValue();
}
public RemoteFileDesc createRemoteFileDesc(int size) {
Set urnSet = new HashSet();
urnSet.add(getSHA1Urn());
int quality = 3;
RemoteFileDesc ret = new RemoteFileDesc(
_pushAddress.getAddress(),_pushAddress.getPort(),0,
HTTPConstants.URI_RES_N2R+SHA1_URN,size,
1000, true, quality, false, null,
urnSet,false, true,ALT_VENDOR,System.currentTimeMillis(),
-1,_pushAddress);
return ret;
}
public synchronized AlternateLocation createClone() {
AlternateLocation ret = null;
try {
ret = new PushAltLoc(_pushAddress.createClone(),SHA1_URN);
} catch(IOException ioe) {
ErrorService.error(ioe);
return null;
}
ret._count = this._count;
return ret;
}
public boolean isMe() {
return Arrays.equals(_pushAddress.getClientGUID(),
RouterService.getMyGUID());
}
/**
* Updates the proxies in this PushEndpoint. If this method is
* called, the PE of this PushLoc will always point to the current
* set of proxies we know the remote host has. Otherwise, the PE
* will point to the set of proxies we knew the host had when it was
* created.
*
* Note: it is a really good idea to call this method before adding
* this pushloc to a AlternateLocationCollection which may already
* contain a pushloc for the same host.
*/
public void updateProxies(boolean isGood) {
_pushAddress.updateProxies(isGood);
}
/**
* @return the PushAddress.
*/
public PushEndpoint getPushAddress() {
return _pushAddress;
}
/**
* @return the Firewall transfer protocol version this altloc supports.
* 0 if its not supported.
*/
public int supportsFWTVersion() {
return _pushAddress.supportsFWTVersion();
}
// stubbed out -- no demotion or promotion for push locs.
void promote() {}
// stutbed out -- no demotion or promotion for push locs.
void demote() {}
/**
* PushLocs are considered demoted once all their proxies are empty.
* This ensures that the PE will stay alive until it has exhausted
* all possible proxies.
*/
public boolean isDemoted() {
return _pushAddress.getProxies().isEmpty();
}
public boolean equals(Object o) {
if (o==null || !(o instanceof PushAltLoc))
return false;
if (!super.equals(o)) {
return false;
}
PushAltLoc other = (PushAltLoc)o;
return _pushAddress.equals(other._pushAddress);
}
public int compareTo(Object obj) {
if (this==obj) //equal
return 0;
int ret = super.compareTo(obj);
if (ret!=0)
return ret;
if (!(obj instanceof PushAltLoc))
return 1;
PushAltLoc pal = (PushAltLoc) obj;
return GUID.GUID_BYTE_COMPARATOR.compare(
_pushAddress.getClientGUID(),
pal.getPushAddress().getClientGUID());
}
public int hashCode() {
if (hashCode==0) {
int result = super.hashCode();
result = (37* result)+this._pushAddress.hashCode();
hashCode=result;
}
return hashCode;
}
/**
* Overrides toString to return a string representation of this
* <tt>AlternateLocation</tt>, namely the pushAddress and the date.
*
* @return the string representation of this alternate location
*/
public String toString() {
return _pushAddress+","+_count;
}
}