📄 startstoprulesdefaultplugin.java
字号:
/*
* File : StartStopRulesDefaultPlugin.java
* Created : 12-Jan-2004
* By : TuxPaper
*
* Azureus - a Java Bittorrent client
*
* 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.
*
* 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 ( see the LICENSE file ).
*
* 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
*/
package com.aelitis.azureus.plugins.startstoprules.defaultplugin;
import java.util.*;
import org.gudy.azureus2.core3.config.COConfigurationListener;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.AEMonitor;
import org.gudy.azureus2.core3.util.Constants;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.core3.util.SystemTime;
import org.gudy.azureus2.core3.util.TimeFormatter;
import org.gudy.azureus2.plugins.Plugin;
import org.gudy.azureus2.plugins.PluginConfig;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.PluginListener;
import org.gudy.azureus2.plugins.download.*;
import org.gudy.azureus2.plugins.torrent.*;
import org.gudy.azureus2.plugins.logging.LoggerChannel;
import org.gudy.azureus2.plugins.ui.menus.MenuItem;
import org.gudy.azureus2.plugins.ui.menus.MenuItemListener;
import org.gudy.azureus2.plugins.ui.tables.*;
import org.gudy.azureus2.ui.swt.TextViewerWindow;
import org.gudy.azureus2.ui.swt.views.configsections.*;
import org.gudy.azureus2.ui.swt.views.table.TableColumnCore;
/** Handles Starting and Stopping of torrents.
*
* TODO: RANK_TIMED is quite a hack and is spread all over. It needs to be
* redone, probably with a timer on each seeding torrent which triggers
* when time is up and it needs to stop.
*/
public class StartStopRulesDefaultPlugin
implements Plugin, COConfigurationListener
{
// for debugging
private static final String sStates = " WPRDS.XEQ";
/** Do not rank completed torrents */
public static final int RANK_NONE = 0;
/** Rank completed torrents using Seeds:Peer Ratio */
public static final int RANK_SPRATIO = 1;
/** Rank completed torrents using Seed Count method */
public static final int RANK_SEEDCOUNT = 2;
/** Rank completed torrents using a timed rotation of minTimeAlive */
public static final int RANK_TIMED = 3;
/** All of the First Priority rules must match */
public static final int FIRSTPRIORITY_ALL = 0;
/** Any of the First Priority rules must match */
public static final int FIRSTPRIORITY_ANY = 1;
// Seeding Rank (SR) Limits and Values
private static final int SR_INCOMPLETE_ENDS_AT = 1000000000; // billion
private static final int SR_TIMED_QUEUED_ENDS_AT = 10000000;
private static final int SR_FIRST_PRIORITY_STARTS_AT= 50000000;
private static final int SR_NOTQUEUED = -2;
private static final int SR_RATIOMET = -3;
private static final int SR_NUMSEEDSMET = -4;
private static final int SR_0PEERS = -5;
private static final int SR_SHARERATIOMET = -6;
private static final int FORCE_ACTIVE_FOR = 30000;
private static final int FORCE_CHECK_PERIOD = 30000;
private static final int CHECK_FOR_GROSS_CHANGE_PERIOD = 30000;
private static final int PROCESS_CHECK_PERIOD = 500;
private PluginInterface plugin_interface;
private PluginConfig plugin_config;
private DownloadManager download_manager;
private Timer changeCheckerTimer;
private TimerTask recalcSeedingRanksTask;
/** Map to relate downloadData to a Download */
private Map downloadDataMap = AEMonitor.getSynchronisedMap(new HashMap());
private volatile boolean closingDown;
private volatile boolean somethingChanged;
private LoggerChannel log;
private long startedOn;
// Config Settings
int minPeersToBoostNoSeeds;
int minSpeedForActiveDL;
int minSpeedForActiveSeeding;
// count x peers as a full copy, but..
int numPeersAsFullCopy;
// don't count x peers as a full copy if seeds below
int iFakeFullCopySeedStart;
int maxActive;
int maxDownloads;
// Ignore torrent if seed count is at least..
int iIgnoreSeedCount;
// Ignore even when First Priority
boolean bIgnore0Peers;
int iIgnoreShareRatio;
int iIgnoreShareRatio_SeedStart;
int iIgnoreRatioPeers;
int iIgnoreRatioPeers_SeedStart;
int iRankType = -1;
int iRankTypeSeedFallback;
boolean bAutoReposition;
long minTimeAlive;
boolean bPreferLargerSwarms;
boolean bDebugLog;
TableContextMenuItem debugMenuItem = null;
int minQueueingShareRatio;
int iFirstPriorityType;
int iFirstPrioritySeedingMinutes;
int iFirstPriorityDLMinutes;
boolean bAutoStart0Peers;
int iMaxUploadSpeed;
TableColumn seedingRankColumn;
private AEMonitor this_mon = new AEMonitor( "StartStopRules" );
public void initialize(PluginInterface _plugin_interface) {
startedOn = SystemTime.getCurrentTime();
changeCheckerTimer = new Timer(true);
plugin_interface = _plugin_interface;
plugin_interface.getPluginProperties().setProperty( "plugin.name", "Start/Stop Rules" );
plugin_interface.addListener(new PluginListener() {
public void initializationComplete() { /* not implemented */ }
public void
closedownInitiated()
{
closingDown = true;
// we don't want to go off recalculating stuff when config is saved on closedown
COConfigurationManager.removeListener(StartStopRulesDefaultPlugin.this);
}
public void closedownComplete() { /* not implemented */ }
});
log = plugin_interface.getLogger().getChannel("StartStopRules");
log.log( LoggerChannel.LT_INFORMATION, "Default StartStopRules Plugin Initialisation" );
COConfigurationManager.addListener(this);
plugin_config = plugin_interface.getPluginconfig();
try {
TableManager tm = plugin_interface.getUIManager().getTableManager();
seedingRankColumn = tm.createColumn(TableManager.TABLE_MYTORRENTS_COMPLETE,
"SeedingRank");
seedingRankColumn.initialize(TableColumn.ALIGN_TRAIL, TableColumn.POSITION_LAST,
80, TableColumn.INTERVAL_LIVE);
SeedingRankColumnListener columnListener = new SeedingRankColumnListener();
seedingRankColumn.addCellRefreshListener(columnListener);
seedingRankColumn.addCellAddedListener(columnListener);
tm.addColumn(seedingRankColumn);
plugin_interface.addConfigSection(new ConfigSectionQueue());
plugin_interface.addConfigSection(new ConfigSectionSeeding());
plugin_interface.addConfigSection(new ConfigSectionSeedingAutoStarting());
plugin_interface.addConfigSection(new ConfigSectionSeedingFirstPriority());
plugin_interface.addConfigSection(new ConfigSectionSeedingIgnore());
} catch (NoClassDefFoundError e) {
/* Ignore. SWT probably not installed */
log.log(LoggerChannel.LT_WARNING,
"SWT UI Config not loaded for StartStopRulesDefaulPlugin. " +
e.getMessage() + " not found.");
} catch( Throwable e ){
Debug.printStackTrace( e );
}
reloadConfigParams();
download_manager = plugin_interface.getDownloadManager();
download_manager.addListener(new StartStopDMListener());
changeCheckerTimer.schedule(new ChangeCheckerTimerTask(), 10000, CHECK_FOR_GROSS_CHANGE_PERIOD );
changeCheckerTimer.schedule(new ChangeFlagCheckerTask(), 10000, PROCESS_CHECK_PERIOD );
}
private void recalcAllSeedingRanks(boolean force) {
if ( closingDown ){
return;
}
try{
this_mon.enter();
downloadData[] dlDataArray =
(downloadData[])downloadDataMap.values().toArray(new downloadData[0]);
// Check Group #1: Ones that always should run since they set things
for (int i = 0; i < dlDataArray.length; i++) {
if (force)
dlDataArray[i].setSeedingRank(0);
dlDataArray[i].recalcSeedingRank();
}
}finally{
this_mon.exit();
}
}
/** A simple timer task to recalculate all seeding ranks.
*/
private class RecalcSeedingRanksTask extends TimerTask
{
public void run() {
// System.out.println("RecalcAllSeedingRanks");
recalcAllSeedingRanks(false);
}
}
/** This class check if the somethingChanged flag and call process() when
* its set. This allows pooling of changes, thus cutting down on the number
* of sucessive process() calls.
*/
private class ChangeFlagCheckerTask extends TimerTask
{
long last_process_time = 0;
public void run() {
if (closingDown)
return;
long now = SystemTime.getCurrentTime();
if ( now < last_process_time ||
now - last_process_time >= FORCE_CHECK_PERIOD ){
somethingChanged = true;
}
if (somethingChanged) {
try {
last_process_time = now;
process();
} catch( Exception e ) {
Debug.printStackTrace( e );
}
}
}
}
/** Listen to Download changes and recalc SR if needed
*/
private class StartStopDownloadListener implements DownloadListener
{
public void stateChanged(Download download, int old_state, int new_state) {
downloadData dlData = (downloadData)downloadDataMap.get(download);
if (dlData != null) {
// force a SR recalc, so that it gets positiong properly next process()
dlData.recalcSeedingRank();
somethingChanged = true;
if (bDebugLog)
log.log(LoggerChannel.LT_INFORMATION,
"somethingChanged: stateChange for " + download.getName());
}
}
public void positionChanged(Download download,
int oldPosition, int newPosition) {
downloadData dlData = (downloadData)downloadDataMap.get(download);
if (dlData != null) {
dlData.recalcSeedingRank();
somethingChanged = true;
if (bDebugLog)
log.log(LoggerChannel.LT_INFORMATION,
"somethingChanged: positionChanged for " + download.getName());
}
}
}
/** Update SeedingRank when a new scrape result comes in.
*/
private class StartStopDMTrackerListener implements DownloadTrackerListener
{
public void scrapeResult( DownloadScrapeResult result ) {
downloadData dlData = (downloadData)downloadDataMap.get(result.getDownload());
if (dlData != null) {
dlData.recalcSeedingRank();
somethingChanged = true;
if (bDebugLog)
log.log(LoggerChannel.LT_INFORMATION,
"somethingChanged: new scrapeResult for " + result.getDownload().getName());
}
}
public void announceResult( DownloadAnnounceResult result ) {
}
}
/* Create/Remove downloadData object when download gets added/removed.
* RecalcSeedingRank & process if necessary.
*/
private class StartStopDMListener implements DownloadManagerListener
{
private DownloadTrackerListener download_tracker_listener;
private DownloadListener download_listener;
public StartStopDMListener() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -