📄 localtrackerplugin.java
字号:
}finally{
mon.exit();
}
for (int i=0;i<todo.size();i++){
track((Download)todo.get(i));
}
}catch( Throwable e ){
log.log(e);
}
}
});
}
protected void
track(
Download download )
{
long now = plugin_interface.getUtilities().getCurrentSystemTime();
boolean ok = false;
try{
mon.enter();
Long l_last_track = (Long)downloads.get( download );
if ( l_last_track == null ){
return;
}
long last_track = l_last_track.longValue();
if ( last_track > now || now - last_track > RE_ANNOUNCE_PERIOD ){
ok = true;
downloads.put( download, new Long( now ));
}
}finally{
mon.exit();
}
if ( ok ){
trackSupport( download );
}
}
protected void
trackSupport(
Download download )
{
if ( !enabled.getValue()){
return;
}
int state = download.getState();
if ( state == Download.ST_ERROR || state == Download.ST_STOPPED ){
return;
}
AZInstanceTracked[] peers = instance_manager.track( download );
for (int i=0;i<peers.length;i++){
handleTrackResult( peers[i] );
}
}
protected void
forceTrack(
Download download )
{
try{
mon.enter();
downloads.put( download, new Long(0));
String dl_key = plugin_interface.getUtilities().getFormatters().encodeBytesToString(download.getTorrent().getHash());
Iterator it = track_times.values().iterator();
while( it.hasNext()){
((Map)it.next()).remove( dl_key );
}
}finally{
mon.exit();
}
track( download );
}
protected void
handleTrackResult(
AZInstanceTracked tracked_inst )
{
AZInstance inst = tracked_inst.getInstance();
Download download = tracked_inst.getDownload();
boolean is_seed = tracked_inst.isSeed();
long now = plugin_interface.getUtilities().getCurrentSystemTime();
boolean skip = false;
// this code is here to deal with multiple interface machines that receive the result multiple times
try{
mon.enter();
Map map = (Map)track_times.get( inst.getID() );
if ( map == null ){
map = new HashMap();
track_times.put( inst.getID(), map );
}
String dl_key = plugin_interface.getUtilities().getFormatters().encodeBytesToString(download.getTorrent().getHash());
Long last_track = (Long)map.get( dl_key );
if ( last_track != null ){
long lt = last_track.longValue();
if ( now - lt < 30*1000 ){
skip = true;
}
}
map.put( dl_key, new Long(now));
}finally{
mon.exit();
}
if ( skip ){
return;
}
log.log( "Tracked: " + inst.getString() + ": " + download.getName() + ", seed = " + is_seed );
if ( download.isComplete() && is_seed ){
return;
}
PeerManager peer_manager = download.getPeerManager();
if ( peer_manager != null ){
String peer_ip = inst.getInternalAddress().getHostAddress();
int peer_tcp_port = inst.getTCPListenPort();
int peer_udp_port = inst.getUDPListenPort();
log.log( " " + download.getName() + ": Injecting peer " + peer_ip + ":" + peer_tcp_port + "/" + peer_udp_port);
peer_manager.addPeer( peer_ip, peer_tcp_port, peer_udp_port, false );
}
}
public void
downloadAdded(
Download download )
{
try{
mon.enter();
Torrent torrent = download.getTorrent();
if ( torrent == null ){
return;
}
if ( torrent.isPrivate()){
log.log( "Not tracking " + download.getName() + ": torrent is private" );
return;
}
String[] networks = download.getListAttribute( ta_networks );
boolean public_net = false;
for (int i=0;i<networks.length;i++){
if ( networks[i].equalsIgnoreCase( "Public" )){
public_net = true;
break;
}
}
if ( !public_net ){
log.log( "Not tracking " + download.getName() + ": torrent has no public network" );
return;
}
if ( enabled.getValue()){
log.log( "Tracking " + download.getName());
}
downloads.put( download, new Long(0));
download.addListener( this );
}finally{
mon.exit();
}
}
public void
downloadRemoved(
Download download )
{
try{
mon.enter();
downloads.remove( download );
download.removeListener( this );
}finally{
mon.exit();
}
}
public void
stateChanged(
Download download,
int old_state,
int new_state )
{
if ( new_state == Download.ST_DOWNLOADING ||
new_state == Download.ST_SEEDING ){
forceTrack( download );
}
}
public void
positionChanged(
Download download,
int oldPosition,
int newPosition )
{
}
protected void
processSubNets(
String subnets,
boolean include_well_known )
{
if ( include_well_known != instance_manager.getIncludeWellKnownLANs()){
instance_manager.setIncludeWellKnownLANs( include_well_known );
log.log( "Include well known local networks set to " + include_well_known );
}
if ( subnets.equals( last_subnets )){
return;
}
last_subnets = subnets;
StringTokenizer tok = new StringTokenizer( subnets, ";");
while( tok.hasMoreTokens()){
String net = tok.nextToken().trim();
try{
if ( instance_manager.addLANSubnet( net )){
log.log( "Added network '" + net + "'" );
}
}catch( Throwable e ){
log.log( "Failed to add network '" + net + "'", e );
}
}
}
protected void
processAutoAdd(
String autoadd )
{
if ( autoadd.equals( last_autoadd )){
return;
}
last_autoadd = autoadd;
StringTokenizer tok = new StringTokenizer( autoadd, ";");
while( tok.hasMoreTokens()){
String peer = tok.nextToken();
try{
InetAddress p = InetAddress.getByName( peer.trim());
if ( instance_manager.addInstance( p )){
log.log( "Added peer '" + peer + "'" );
}
}catch( Throwable e ){
log.log( "Failed to decode peer '" + peer + "'", e );
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -