📄 azinstancemanagerimpl.java
字号:
try{
this_mon.enter();
removed = other_instances.remove( inst.getID()) != null;
}finally{
this_mon.exit();
}
if ( removed ){
informRemoved( inst );
}
}
public AZInstance
getMyInstance()
{
return( my_instance );
}
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.getTrackerClientPort();
int udp = inst.getDHTPort();
modifyAddresses( internal_address, external_address, tcp, udp, true );
}
protected void
removeAddresses(
AZOtherInstanceImpl inst )
{
List internal_addresses = inst.getInternalAddresses();
InetAddress external_address = inst.getExternalAddress();
int tcp = inst.getTrackerClientPort();
int udp = inst.getDHTPort();
for (int i=0;i<internal_addresses.size();i++){
modifyAddresses( (InetAddress)internal_addresses.get(i), external_address, tcp, udp, false );
}
}
protected void
modifyAddresses(
InetAddress internal_address,
InetAddress external_address,
int tcp,
int udp,
boolean add )
{
if ( internal_address.isAnyLocalAddress()){
try{
internal_address = InetAddress.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);
// 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 );
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,
boolean is_tcp )
{
Map map = is_tcp?tcp_ext_to_lan:udp_ext_to_lan;
if ( map.size() == 0 ){
return( null );
}
return((InetSocketAddress)map.get( external_address ));
}
public InetSocketAddress
getExternalAddress(
InetSocketAddress lan_address,
boolean is_tcp )
{
Map map = is_tcp?tcp_lan_to_ext:udp_lan_to_ext;
if ( map.size() == 0 ){
return( null );
}
return((InetSocketAddress)map.get( lan_address ));
}
public boolean
isLANAddress(
InetAddress address )
{
if ( address.isLoopbackAddress()){
return( true );
}
if ( lan_addresses.contains( address )){
return( true );
}
return( false );
}
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 + -