📄 consoleinput.java
字号:
/*
* Written and copyright 2001-2004 Tobias Minich. Distributed under the GNU
* General Public License; see the README file. This code comes with NO
* WARRANTY.
*
*
* ConsoleInput.java
*
* Created on 6. Oktober 2003, 23:26
*/
package org.gudy.azureus2.ui.console;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Vector;
import org.apache.log4j.Appender;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.varia.DenyAllFilter;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.download.DownloadManagerState;
import org.gudy.azureus2.core3.global.GlobalManager;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.torrentdownloader.TorrentDownloader;
import org.gudy.azureus2.core3.torrentdownloader.TorrentDownloaderCallBackInterface;
import org.gudy.azureus2.core3.torrentdownloader.TorrentDownloaderFactory;
import org.gudy.azureus2.core3.torrentdownloader.impl.TorrentDownloaderManager;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.plugins.PluginException;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.PluginManager;
import org.gudy.azureus2.plugins.installer.InstallablePlugin;
import org.gudy.azureus2.plugins.installer.PluginInstallerListener;
import org.gudy.azureus2.plugins.update.Update;
import org.gudy.azureus2.plugins.update.UpdateCheckInstance;
import org.gudy.azureus2.plugins.update.UpdateCheckInstanceListener;
import org.gudy.azureus2.plugins.update.UpdateManager;
import org.gudy.azureus2.ui.common.UIConst;
import org.gudy.azureus2.ui.console.commands.*;
import org.gudy.azureus2.update.CorePatchChecker;
import org.gudy.azureus2.update.UpdaterUpdateChecker;
import com.aelitis.azureus.core.AzureusCore;
/**
* @author Tobias Minich
*/
public class ConsoleInput extends Thread {
private static final String ALIASES_CONFIG_FILE = "console.aliases.properties";
public final AzureusCore azureus_core;
public final PrintStream out;
public final List torrents = new ArrayList();
public File[] adds = null;
private final CommandReader br;
private final boolean controlling;
private boolean running;
// previous command
private final Vector oldcommand = new Vector();
private final static List pluginCommands = new ArrayList();
public final Properties aliases = new Properties();
private final Map commands = new LinkedHashMap();
private final List helpItems = new ArrayList();
private final UserProfile userProfile;
/**
* can be used by plugins to register console commands since they may not have access o
* each ConsoleInput object that is created.
*/
public static void registerPluginCommand(Class clazz)
{
if( ! clazz.isInstance(IConsoleCommand.class) )
{
throw new IllegalArgumentException("Class must be extend IConsoleCommand");
}
pluginCommands.add( clazz );
}
public static void unregisterPluginCommand(Class clazz)
{
pluginCommands.remove(clazz);
}
/** Creates a new instance of ConsoleInput */
public
ConsoleInput(
String con,
AzureusCore _azureus_core,
Reader _in,
PrintStream _out,
Boolean _controlling)
{
this( con, _azureus_core, _in, _out, _controlling, UserProfile.DEFAULT_USER_PROFILE);
}
public ConsoleInput( String con, AzureusCore _azureus_core, Reader _in, PrintStream _out, Boolean _controlling, UserProfile profile)
{
super("Console Input: " + con);
this.out = _out;
this.azureus_core = _azureus_core;
this.userProfile = profile;
this.controlling = _controlling.booleanValue();
this.br = new CommandReader(_in);
System.out.println( "ConsoleInput: initializing..." );
initialise();
System.out.println( "ConsoleInput: initialized OK" );
System.out.println( "ConsoleInput: starting..." );
start();
System.out.println( "ConsoleInput: started OK" );
}
/**
* Simple constructor to allow other components to use the console commands such as "set"
* @param con
* @param _azureus_core
* @param _out
*/
public ConsoleInput(AzureusCore _azureus_core, PrintStream _out )
{
super( "" );
this.out = _out;
this.azureus_core = _azureus_core;
this.userProfile = UserProfile.DEFAULT_USER_PROFILE;
this.controlling = false;
this.br = new CommandReader( new InputStreamReader( new ByteArrayInputStream(new byte[0])));
if (Logger.getRootLogger().getAppender("ConsoleAppender")==null) {
Appender app;
app = new ConsoleAppender(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN));
app.setName("ConsoleAppender");
app.addFilter( new DenyAllFilter() ); //'log off' by default
Logger.getRootLogger().addAppender(app);
}
initialise();
}
protected void initialise() {
registerAlertHandler();
registerCommands();
registerPluginCommands();
registerUpdateChecker();
try {
loadAliases();
} catch (IOException e) {
out.println("Error while loading aliases: " + e.getMessage());
}
// populate the old command so that '.' does something sensible first time around
oldcommand.add("sh");
oldcommand.add("t");
}
/**
* begins the download of the torrent in the specified file, downloading
* it to the specified output directory. We also annotate the download with the
* current username
* @param filename
* @param outputDir
*/
public void downloadTorrent( String filename, String outputDir )
{
DownloadManager manager = azureus_core.getGlobalManager().addDownloadManager(filename, outputDir);
manager.getDownloadState().setAttribute(DownloadManagerState.AT_USER, getUserProfile().getUsername());
}
/**
* downloads the remote torrent file. once we have downloaded the .torrent file, we
* pass the data to the downloadTorrent() method for further processing
* @param url
* @param outputDir
*/
public void downloadRemoteTorrent( String url, final String outputDir )
{
TorrentDownloader downloader = TorrentDownloaderFactory.create(new TorrentDownloaderCallBackInterface() {
public void TorrentDownloaderEvent(int state, TorrentDownloader inf) {
if( state == TorrentDownloader.STATE_FINISHED )
{
out.println("torrent file download complete. starting torrent");
TorrentDownloaderManager.getInstance().remove(inf);
downloadTorrent( inf.getFile().getAbsolutePath(), outputDir );
}
else
TorrentDownloaderManager.getInstance().TorrentDownloaderEvent(state, inf);
}
}, url, null, null, true);
TorrentDownloaderManager.getInstance().add(downloader);
}
/**
* downloads a torrent on the local file system to the default save directory
* @param fileName
*/
public void downloadTorrent(String fileName)
{
downloadTorrent(fileName, getDefaultSaveDirectory());
}
/**
* downloads the remote torrent file. once we have downloaded the .torrent file, we
* pass the data to the downloadTorrent() method for further processing
*/
public void downloadRemoteTorrent(String url) {
downloadRemoteTorrent(url, getDefaultSaveDirectory());
}
/**
* instantiates each of the plugin commands and registers t
*/
private void registerPluginCommands() {
Class clazz;
for (Iterator iter = pluginCommands.iterator(); iter.hasNext();) {
clazz = (Class) iter.next();
try {
IConsoleCommand command = (IConsoleCommand) clazz.newInstance();
registerCommand(command);
} catch (InstantiationException e)
{
out.println("Error while registering plugin command: " + clazz.getName() + ":" + e.getMessage());
} catch (IllegalAccessException e) {
out.println("Error while registering plugin command: " + clazz.getName() + ":" + e.getMessage());
}
}
}
protected void
registerAlertHandler()
{
org.gudy.azureus2.core3.logging.Logger.addListener(new ILogAlertListener() {
private java.util.Set history = Collections.synchronizedSet( new HashSet());
public void alertRaised(LogAlert alert) {
if (!alert.repeatable) {
if ( history.contains( alert.text )){
return;
}
history.add( alert.text );
}
out.println( alert.text );
if (alert.err != null)
alert.err.printStackTrace( out );
}
});
}
/**
* registers the commands available to be executed from this console
*/
protected void registerCommands()
{
registerCommand(new XML());
registerCommand(new Hack());
registerCommand(new AddFind());
registerCommand(new TorrentCheck());
registerCommand(new TorrentQueue());
registerCommand(new TorrentRemove());
registerCommand(new TorrentStart());
registerCommand(new TorrentStop());
registerCommand(new TorrentHost());
registerCommand(new TorrentPublish());
registerCommand(new TorrentForceStart());
registerCommand(new TorrentLog());
registerCommand(new Log());
registerCommand(new Move());
registerCommand(new Share());
registerCommand(new Set());
registerCommand(new Show());
registerCommand(new CommandUI());
registerCommand(new CommandLogout());
registerCommand(new CommandQuit());
registerCommand(new CommandHelp());
registerCommand(new Alias());
registerCommand(new Priority());
}
/**
* @param set
*/
protected void registerCommand(IConsoleCommand command)
{
for (Iterator iter = command.getCommandNames().iterator(); iter.hasNext();) {
String cmdName = (String) iter.next();
commands.put( cmdName, command);
}
helpItems.add(command);
}
protected void unregisterCommand(IConsoleCommand command)
{
for (Iterator iter = command.getCommandNames().iterator(); iter.hasNext();) {
String cmdName = (String) iter.next();
if( command.equals(commands.get(cmdName)) )
commands.remove( cmdName );
}
helpItems.remove(command);
}
protected void unregisterCommand(String commandName)
{
IConsoleCommand cmd = (IConsoleCommand)commands.get(commandName);
if( cmd == null )
return;
// check if there are any more commands registered to this command object,
// otherwise remove it
int numCommands = 0;
for (Iterator iter = commands.entrySet().iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry) iter.next();
if( cmd.equals(entry.getValue()) )
numCommands++;
}
if( numCommands == 1)
unregisterCommand(cmd);
else
commands.remove(commandName);
}
public ConsoleInput(String con, AzureusCore _azureus_core, InputStream _in, PrintStream _out, Boolean _controlling) {
this(con, _azureus_core, new InputStreamReader(_in), _out, _controlling);
}
private static void quit(boolean finish) {
if (finish)
UIConst.shutdown();
}
private class CommandHelp extends IConsoleCommand
{
public CommandHelp()
{
super(new String[] { "help", "?"});
}
public String getCommandDescriptions() {
return("help [torrents]\t\t\t?\tShow this help. 'torrents' shows info about the show torrents display.");
}
public void execute(String commandName, ConsoleInput ci, List args)
{
if (args.isEmpty()){
printconsolehelp(ci.out);
} else {
String subcommand = (String) args.get(0);
IConsoleCommand cmd = (IConsoleCommand) commands.get(subcommand);
if( cmd != null )
{
List newargs = new ArrayList(args);
newargs.remove(0);
cmd.printHelp(ci.out, newargs);
}
else if (subcommand.equalsIgnoreCase("torrents") || subcommand.equalsIgnoreCase("t")) {
ci.out.println("> -----");
ci.out.println("# [state] PercentDone Name (Filesize) ETA\r\n\tDownSpeed / UpSpeed\tDownloaded/Uploaded\tConnectedSeeds(total) / ConnectedPeers(total)");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -