public int
getNATStatus()
{
int state = getState();
PEPeerManager peerManager = controller.getPeerManager();
TRTrackerAnnouncer tc = getTrackerClient();
if ( tc != null && peerManager != null && (state == STATE_DOWNLOADING || state == STATE_SEEDING)) {
if ( peerManager.getNbRemoteTCPConnections() > 0 ){
return( ConnectionManager.NAT_OK );
}
long last_good_time = peerManager.getLastRemoteConnectionTime();
if ( last_good_time > 0 ){
// half an hour's grace
if ( SystemTime.getCurrentTime() - last_good_time < 30*60*1000 ){
return( ConnectionManager.NAT_OK );
}else{
return( ConnectionManager.NAT_PROBABLY_OK );
}
}
TRTrackerAnnouncerResponse announce_response = tc.getLastResponse();
int trackerStatus = announce_response.getStatus();
if( trackerStatus == TRTrackerAnnouncerResponse.ST_OFFLINE ||
trackerStatus == TRTrackerAnnouncerResponse.ST_REPORTED_ERROR){
return ConnectionManager.NAT_UNKNOWN;
}
// tracker's ok but no remotes - give it some time
if ( SystemTime.getCurrentTime() - peerManager.getTimeStarted() < 3*60*1000 ){
return ConnectionManager.NAT_UNKNOWN;
}
TRTrackerScraperResponse scrape_response = getTrackerScrapeResponse();
if ( scrape_response != null && scrape_response.isValid()){
// if we're connected to everyone then report OK as we can't get
// any incoming connections!
if ( peerManager.getNbSeeds() == scrape_response.getSeeds() &&
peerManager.getNbPeers() == scrape_response.getPeers()){
return ConnectionManager.NAT_UNKNOWN;
}
}