📄 localtrackerplugin.java
字号:
/*
* Created on 23-Dec-2005
* Created by Paul Gardner
* Copyright (C) 2005, 2006 Aelitis, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package com.aelitis.azureus.plugins.tracker.local;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.InetAddress;
import java.util.*;
import org.gudy.azureus2.plugins.*;
import org.gudy.azureus2.plugins.download.Download;
import org.gudy.azureus2.plugins.download.DownloadListener;
import org.gudy.azureus2.plugins.download.DownloadManagerListener;
import org.gudy.azureus2.plugins.logging.LoggerChannel;
import org.gudy.azureus2.plugins.logging.LoggerChannelListener;
import org.gudy.azureus2.plugins.peers.PeerManager;
import org.gudy.azureus2.plugins.torrent.Torrent;
import org.gudy.azureus2.plugins.torrent.TorrentAttribute;
import org.gudy.azureus2.plugins.ui.UIManager;
import org.gudy.azureus2.plugins.ui.config.BooleanParameter;
import org.gudy.azureus2.plugins.ui.config.ConfigSection;
import org.gudy.azureus2.plugins.ui.config.LabelParameter;
import org.gudy.azureus2.plugins.ui.config.StringParameter;
import org.gudy.azureus2.plugins.ui.model.BasicPluginConfigModel;
import org.gudy.azureus2.plugins.ui.model.BasicPluginViewModel;
import org.gudy.azureus2.plugins.utils.*;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.instancemanager.AZInstance;
import com.aelitis.azureus.core.instancemanager.AZInstanceManager;
import com.aelitis.azureus.core.instancemanager.AZInstanceManagerListener;
import com.aelitis.azureus.core.instancemanager.AZInstanceTracked;
public class
LocalTrackerPlugin
implements Plugin, AZInstanceManagerListener, DownloadManagerListener, DownloadListener
{
private static final String PLUGIN_NAME = "LAN Peer Finder";
private static final String PLUGIN_CONFIGSECTION_ID = "Plugin.localtracker.name";
private static final long ANNOUNCE_PERIOD = 5*60*1000;
private static final long RE_ANNOUNCE_PERIOD = 1*60*1000;
private PluginInterface plugin_interface;
private AZInstanceManager instance_manager;
private boolean active;
private TorrentAttribute ta_networks;
private Map downloads = new HashMap();
private Map track_times = new HashMap();
private String last_autoadd = "";
private String last_subnets = "";
private BooleanParameter enabled;
private long plugin_start_time;
private long current_time;
private LoggerChannel log;
private Monitor mon;
public void
initialize(
PluginInterface _plugin_interface )
{
plugin_interface = _plugin_interface;
plugin_interface.getPluginProperties().setProperty( "plugin.version", "1.0" );
plugin_interface.getPluginProperties().setProperty( "plugin.name", PLUGIN_NAME );
ta_networks = plugin_interface.getTorrentManager().getAttribute( TorrentAttribute.TA_NETWORKS );
mon = plugin_interface.getUtilities().getMonitor();
log = plugin_interface.getLogger().getTimeStampedChannel(PLUGIN_NAME);
UIManager ui_manager = plugin_interface.getUIManager();
BasicPluginConfigModel config = ui_manager.createBasicPluginConfigModel( ConfigSection.SECTION_PLUGINS, PLUGIN_CONFIGSECTION_ID );
config.addLabelParameter2( "Plugin.localtracker.info" );
enabled = config.addBooleanParameter2( "Plugin.localtracker.enable", "Plugin.localtracker.enable", true );
LabelParameter lp1 = config.addLabelParameter2( "Plugin.localtracker.networks.info" );
final StringParameter subnets = config.addStringParameter2( "Plugin.localtracker.networks", "Plugin.localtracker.networks", "" );
final BooleanParameter include_wellknown = config.addBooleanParameter2( "Plugin.localtracker.wellknownlocals", "Plugin.localtracker.wellknownlocals", true );
LabelParameter lp2 = config.addLabelParameter2( "Plugin.localtracker.autoadd.info" );
final StringParameter autoadd = config.addStringParameter2( "Plugin.localtracker.autoadd", "Plugin.localtracker.autoadd", "" );
/*
* actually these parameters affect LAN detection as a whole, not just the local tracker,
* so leave them enabled...
*
enabled.addEnabledOnSelection( lp1 );
enabled.addEnabledOnSelection( subnets );
enabled.addEnabledOnSelection( lp2 );
enabled.addEnabledOnSelection( autoadd );
*/
final BasicPluginViewModel view_model =
plugin_interface.getUIManager().createBasicPluginViewModel( "Plugin.localtracker.name" );
view_model.setConfigSectionID(PLUGIN_CONFIGSECTION_ID);
view_model.getActivity().setVisible( false );
view_model.getProgress().setVisible( false );
log.addListener(
new LoggerChannelListener()
{
public void
messageLogged(
int type,
String content )
{
view_model.getLogArea().appendText( content + "\n" );
}
public void
messageLogged(
String str,
Throwable error )
{
if ( str.length() > 0 ){
view_model.getLogArea().appendText( str + "\n" );
}
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter( sw );
error.printStackTrace( pw );
pw.flush();
view_model.getLogArea().appendText( sw.toString() + "\n" );
}
});
plugin_start_time = plugin_interface.getUtilities().getCurrentSystemTime();
instance_manager = AzureusCoreFactory.getSingleton().getInstanceManager();
instance_manager.addListener( this );
plugin_interface.getPluginconfig().addListener(
new PluginConfigListener()
{
public void
configSaved()
{
processSubNets( subnets.getValue(),include_wellknown.getValue() );
processAutoAdd( autoadd.getValue());
}
});
// we have to take this off the init thread as any auto-added instances can
// cause an attempt to get out external address which unfortunately hangs
// az initalisation if the version server is unavailable and it tries
// to use the DHT which is pending completion of this init...
// XXX Would be better if we fired this off after (any) UI is complete,
// instead of a timer
Utilities utilities = plugin_interface.getUtilities();
utilities.createTimer("azlocalplugin:init", Thread.MIN_PRIORITY).addEvent(
utilities.getCurrentSystemTime() + 15000, new UTTimerEventPerformer() {
public void perform(UTTimerEvent event) {
processSubNets(subnets.getValue(), include_wellknown.getValue());
processAutoAdd(autoadd.getValue());
// take this off the main thread to reduce initialisation delay if we
// have a lot of torrents
plugin_interface.getDownloadManager().addListener(
LocalTrackerPlugin.this);
}
});
}
public void
instanceFound(
AZInstance instance )
{
if ( !enabled.getValue()){
return;
}
log.log( "Found: " + instance.getString());
try{
mon.enter();
track_times.put( instance.getID(), new HashMap());
}finally{
mon.exit();
}
checkActivation();
}
protected void
checkActivation()
{
try{
mon.enter();
if ( active ){
return;
}
active = true;
plugin_interface.getUtilities().createThread(
"Tracker",
new Runnable()
{
public void
run()
{
track();
}
});
}finally{
mon.exit();
}
}
public void
instanceChanged(
AZInstance instance )
{
if ( !enabled.getValue()){
return;
}
log.log( "Changed: " + instance.getString());
}
public void
instanceLost(
AZInstance instance )
{
try{
mon.enter();
track_times.remove( instance.getID());
}finally{
mon.exit();
}
if ( !enabled.getValue()){
return;
}
log.log( "Lost: " + instance.getString());
}
public void
instanceTracked(
AZInstanceTracked instance )
{
if ( !enabled.getValue()){
return;
}
handleTrackResult( instance );
}
protected void
track()
{
long now = plugin_interface.getUtilities().getCurrentSystemTime();
if ( now - plugin_start_time < 60*1000 ){
try{
// initial small delay to let things stabilise
Thread.sleep( 15*1000 );
}catch( Throwable e ){
}
}
plugin_interface.getUtilities().createTimer( "LanPeerFinder:Tracker", true ).addPeriodicEvent(
30*1000,
new UTTimerEventPerformer() {
public void perform( UTTimerEvent event ) {
current_time = plugin_interface.getUtilities().getCurrentSystemTime();
try{
List todo = new ArrayList();
try{
mon.enter();
Iterator it = downloads.entrySet().iterator();
while( it.hasNext()){
Map.Entry entry = (Map.Entry)it.next();
Download dl = (Download)entry.getKey();
long when = ((Long)entry.getValue()).longValue();
if ( when > current_time || current_time - when > ANNOUNCE_PERIOD ){
todo.add( dl );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -