📄 azinstancemanagerimpl.java
字号:
protected void
search()
{
sendRequest( MT_REQUEST_SEARCH );
}
public AZInstance[]
getOtherInstances()
{
initial_search_sem.reserve();
try{
this_mon.enter();
return((AZInstance[])other_instances.values().toArray( new AZInstance[other_instances.size()]));
}finally{
this_mon.exit();
}
}
protected void
addAddresses(
AZInstance inst )
{
InetAddress internal_address = inst.getInternalAddress();
InetAddress external_address = inst.getExternalAddress();
int tcp = inst.getTCPListenPort();
int udp = inst.getUDPListenPort();
int udp2 = inst.getUDPNonDataListenPort();
modifyAddresses( internal_address, external_address, tcp, udp, udp2, true );
}
protected void
removeAddresses(
AZOtherInstanceImpl inst )
{
List internal_addresses = inst.getInternalAddresses();
InetAddress external_address = inst.getExternalAddress();
int tcp = inst.getTCPListenPort();
int udp = inst.getUDPListenPort();
int udp2 = inst.getUDPNonDataListenPort();
for (int i=0;i<internal_addresses.size();i++){
modifyAddresses( (InetAddress)internal_addresses.get(i), external_address, tcp, udp, udp2, false );
}
}
protected void
modifyAddresses(
InetAddress internal_address,
InetAddress external_address,
int tcp,
int udp,
int udp2,
boolean add )
{
if ( internal_address.isAnyLocalAddress()){
try{
internal_address = NetUtils.getLocalHost();
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
try{
this_mon.enter();
InetSocketAddress int_tcp = new InetSocketAddress(internal_address, tcp);
InetSocketAddress ext_tcp = new InetSocketAddress(external_address, tcp);
InetSocketAddress int_udp = new InetSocketAddress(internal_address, udp);
InetSocketAddress ext_udp = new InetSocketAddress(external_address, udp);
InetSocketAddress int_udp2 = new InetSocketAddress(internal_address, udp2);
InetSocketAddress ext_udp2 = new InetSocketAddress(external_address, udp2);
// not the most efficient code in the world this... will need rev
tcp_ext_to_lan = modifyAddress( tcp_ext_to_lan, ext_tcp, int_tcp, add );
tcp_lan_to_ext = modifyAddress( tcp_lan_to_ext, int_tcp, ext_tcp, add );
udp_ext_to_lan = modifyAddress( udp_ext_to_lan, ext_udp, int_udp, add );
udp_lan_to_ext = modifyAddress( udp_lan_to_ext, int_udp, ext_udp, add );
udp2_ext_to_lan = modifyAddress( udp2_ext_to_lan, ext_udp2, int_udp2, add );
udp2_lan_to_ext = modifyAddress( udp2_lan_to_ext, int_udp2, ext_udp2, add );
if ( !lan_addresses.contains( internal_address )){
Set new_lan_addresses = new HashSet( lan_addresses );
new_lan_addresses.add( internal_address );
lan_addresses = new_lan_addresses;
}
if ( !ext_addresses.contains( external_address )){
Set new_ext_addresses = new HashSet( ext_addresses );
new_ext_addresses.add( external_address );
ext_addresses = new_ext_addresses;
}
}finally{
this_mon.exit();
}
}
protected Map
modifyAddress(
Map map,
InetSocketAddress key,
InetSocketAddress value,
boolean add )
{
// System.out.println( "ModAddress: " + key + " -> " + value + " - " + (add?"add":"remove"));
InetSocketAddress old_value = (InetSocketAddress)map.get(key);
boolean same = old_value != null && old_value.equals( value );
Map new_map = map;
if ( add ){
if ( !same ){
new_map = new HashMap( map );
new_map.put( key, value );
}
}else{
if ( same ){
new_map = new HashMap( map );
new_map.remove( key );
}
}
return( new_map );
}
public InetSocketAddress
getLANAddress(
InetSocketAddress external_address,
int address_type )
{
Map map;
if ( address_type == AT_TCP ){
map = tcp_ext_to_lan;
}else if ( address_type == AT_UDP ){
map = udp_ext_to_lan;
}else{
map = udp2_ext_to_lan;
}
if ( map.size() == 0 ){
return( null );
}
return((InetSocketAddress)map.get( external_address ));
}
public InetSocketAddress
getExternalAddress(
InetSocketAddress lan_address,
int address_type )
{
Map map;
if ( address_type == AT_TCP ){
map = tcp_lan_to_ext;
}else if ( address_type == AT_UDP ){
map = udp_lan_to_ext;
}else{
map = udp2_lan_to_ext;
}
if ( map.size() == 0 ){
return( null );
}
return((InetSocketAddress)map.get( lan_address ));
}
public boolean
isLANAddress(
InetAddress address )
{
if ( DISABLE_LAN_LOCAL_STUFF ){
return( false );
}
if ( address == null ){
return( false );
}
String sp = socks_proxy;
if ( sp != null ){
if ( sp.equals( address.getHostAddress())){
return( false );
}
}
if ( include_well_known_lans ){
if ( address.isLoopbackAddress() ||
address.isLinkLocalAddress() ||
address.isSiteLocalAddress()){
return( true );
}
}
String host_address = address.getHostAddress();
for (int i=0;i<lan_subnets.size();i++){
Pattern p = (Pattern)lan_subnets.get(i);
if ( p.matcher( host_address ).matches()){
return( true );
}
}
if ( lan_addresses.contains( address )){
return( true );
}
return( false );
}
public boolean
addLANSubnet(
String subnet )
throws PatternSyntaxException
{
String str = "";
for (int i=0;i<subnet.length();i++){
char c = subnet.charAt(i);
if ( c == '*' ){
str += ".*?";
}else if ( c == '.' ){
str += "\\.";
}else{
str += c;
}
}
Pattern pattern = Pattern.compile( str );
for (int i=0;i<lan_subnets.size();i++){
if ( pattern.pattern().equals(((Pattern)lan_subnets.get(i)).pattern())){
return( false );
}
}
try{
this_mon.enter();
List new_nets = new ArrayList( lan_subnets );
new_nets.add( pattern );
lan_subnets = new_nets;
}finally{
this_mon.exit();
}
return( true );
}
public void
setIncludeWellKnownLANs(
boolean include )
{
include_well_known_lans = include;
}
public boolean
getIncludeWellKnownLANs()
{
return( include_well_known_lans );
}
public boolean
addInstance(
InetAddress explicit_address )
{
return( addInstanceSupport( explicit_address, true ));
}
protected boolean
addInstanceSupport(
InetAddress explicit_address,
boolean force_send_alive )
{
InetSocketAddress sad = new InetSocketAddress( explicit_address, MC_GROUP_PORT );
boolean new_peer = false;
if ( !explicit_peers.contains( sad )){
try{
this_mon.enter();
List new_peers = new ArrayList( explicit_peers );
new_peers.add( sad );
explicit_peers = new_peers;
}finally{
this_mon.exit();
}
new_peer = true;
}
if ( force_send_alive || new_peer ){
sendAlive( sad );
}
return( new_peer );
}
public boolean
isExternalAddress(
InetAddress address )
{
return( ext_addresses.contains( address ));
}
public AZInstanceTracked[]
track(
Download download )
{
if ( mc_group == null || download.getTorrent() == null || getOtherInstances().length == 0 ){
return( new AZInstanceTracked[0]);
}
Map body = new HashMap();
body.put( "hash", new SHA1Simple().calculateHash(download.getTorrent().getHash()));
body.put( "seed", new Long( download.isComplete()?1:0 ));
Map replies = sendRequest( MT_REQUEST_TRACK, body );
AZInstanceTracked[] res = new AZInstanceTracked[replies.size()];
Iterator it = replies.entrySet().iterator();
int pos = 0;
while( it.hasNext()){
Map.Entry entry = (Map.Entry)it.next();
AZInstance inst = (AZInstance)entry.getKey();
Map reply = (Map)entry.getValue();
boolean seed = ((Long)reply.get( "seed" )).intValue() == 1;
res[ pos++ ] = new trackedInstance( inst, download, seed );
}
return( res );
}
protected void
checkTimeouts()
{
long now = SystemTime.getCurrentTime();
List removed = new ArrayList();
try{
this_mon.enter();
Iterator it = other_instances.values().iterator();
while( it.hasNext()){
AZOtherInstanceImpl inst = (AZOtherInstanceImpl)it.next();
if ( now - inst.getAliveTime() > ALIVE_PERIOD * 2.5 ){
removed.add( inst );
it.remove();
}
}
}finally{
this_mon.exit();
}
for (int i=0;i<removed.size();i++){
AZOtherInstanceImpl inst = (AZOtherInstanceImpl)removed.get(i);
informRemoved( inst );
}
}
protected void
informRemoved(
AZOtherInstanceImpl inst )
{
removeAddresses( inst );
for (int i=0;i<listeners.size();i++){
try{
((AZInstanceManagerListener)listeners.get(i)).instanceLost( inst );
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
protected void
informAdded(
AZInstance inst )
{
addAddresses( inst );
for (int i=0;i<listeners.size();i++){
try{
((AZInstanceManagerListener)listeners.get(i)).instanceFound( inst );
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
protected void
informChanged(
AZInstance inst )
{
addAddresses( inst );
if ( inst == my_instance ){
sendAlive();
}
for (int i=0;i<listeners.size();i++){
try{
((AZInstanceManagerListener)listeners.get(i)).instanceChanged( inst );
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
protected void
informTracked(
AZInstanceTracked inst )
{
for (int i=0;i<listeners.size();i++){
try{
((AZInstanceManagerListener)listeners.get(i)).instanceTracked( inst );
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
protected Map
sendRequest(
int type )
{
return( new request( type, new HashMap()).getReplies());
}
protected Map
sendRequest(
int type,
Map body )
{
return( new request( type, body ).getReplies());
}
protected class
request
{
private long id;
private Set reply_instances = new HashSet();
private Map replies = new HashMap();
protected
request(
int type,
Map body )
{
try{
this_mon.enter();
id = search_id_next++;
requests.add( this );
}finally{
this_mon.exit();
}
body.put( "type", new Long( type ));
body.put( "rid", new Long( id ));
sendMessage( MT_REQUEST, body );
}
protected long
getID()
{
return( id );
}
protected void
addReply(
AZInstance instance,
Map body )
{
try{
this_mon.enter();
if ( !reply_instances.contains( instance.getID())){
reply_instances.add( instance.getID());
replies.put( instance, body );
}
}finally{
this_mon.exit();
}
}
protected Map
getReplies()
{
try{
Thread.sleep( 2500 );
}catch( Throwable e ){
}
try{
this_mon.enter();
requests.remove( this );
return( replies );
}finally{
this_mon.exit();
}
}
}
public void
addListener(
AZInstanceManagerListener l )
{
listeners.add( l );
}
public void
removeListener(
AZInstanceManagerListener l )
{
listeners.remove( l );
}
protected static class
trackedInstance
implements AZInstanceTracked
{
private AZInstance instance;
private Download download;
private boolean seed;
protected
trackedInstance(
AZInstance _instance,
Download _download,
boolean _seed )
{
instance = _instance;
download = _download;
seed = _seed;
}
public AZInstance
getInstance()
{
return( instance );
}
public Download
getDownload()
{
return( download );
}
public boolean
isSeed()
{
return( seed );
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -