package com.limegroup.gnutella; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.util.Set; import java.util.Vector; import com.limegroup.gnutella.browser.MagnetOptions; import com.limegroup.gnutella.chat.Chatter; import com.limegroup.gnutella.search.HostData; import com.limegroup.gnutella.version.UpdateInformation; /** * The command-line UI for the Gnutella servent. */ public class Main implements ActivityCallback, ErrorCallback { public static void main(String args[]) { ActivityCallback callback = new Main(); //RouterService.setCallback(callback); RouterService service = new RouterService(callback); RouterService.preGuiInit(); service.start(); System.out.println("For a command list type help."); BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); for ( ; ;) { System.out.print("LimeRouter> "); try { String command=in.readLine(); if (command==null) break; else if (command.equals("help")) { System.out.println("catcher "+ "Print host catcher."); System.out.println("connect <host> [<port>] "+ "Connect to a host[:port]."); System.out.println("help "+ "Print this message."); System.out.println("listen <port> "+ "Set the port you are listening on."); // System.out.println("push "+ // "Print push routes."); System.out.println("query <string> "+ "Send a query to the network."); System.out.println("quit "+ "Quit the application."); // System.out.println("route "+ // "Print routing tables."); // System.out.println("stat "+ // "Print statistics."); System.out.println("update "+ "Send pings to update the statistics."); } else if (command.equals("quit")) break; // //Print routing tables // else if (command.equals("route")) // RouterService.dumpRouteTable(); // //Print connections // else if (command.equals("push")) // RouterService.dumpPushRouteTable(); //Print push route String[] commands=split(command); //Connect to remote host (establish outgoing connection) if (commands.length>=2 && commands[0].equals("connect")) { try { int port=6346; if (commands.length>=3) port=Integer.parseInt(commands[2]); RouterService.connectToHostBlocking(commands[1], port); } catch (IOException e) { System.out.println("Couldn't establish connection."); } catch (NumberFormatException e) { System.out.println("Please specify a valid port."); } } else if (commands.length>=2 && commands[0].equals("query")) { //Get query string from command (possibly multiple words) int i=command.indexOf(' '); Assert.that(i!=-1 && i<command.length()); String query=command.substring(i+1); RouterService.query(RouterService.newQueryGUID(), query); } else if (commands.length==2 && commands[0].equals("listen")) { try { int port=Integer.parseInt(commands[1]); RouterService.setListeningPort(port); } catch (NumberFormatException e) { System.out.println("Please specify a valid port."); } catch (IOException e) { System.out.println("Couldn't change port. Try another value."); } } } catch (IOException e) { System.exit(1); } } System.out.println("Good bye."); RouterService.shutdown(); //write gnutella.net } /////////////////////////// ActivityCallback methods ////////////////////// public void connectionInitializing(Connection c) { } public void connectionInitialized(Connection c) { // String host = c.getOrigHost(); // int port = c.getOrigPort(); ;//System.out.println("Connected to "+host+":"+port+"."); } public void connectionClosed(Connection c) { // String host = c.getOrigHost(); // int port = c.getOrigPort(); //System.out.println("Connection to "+host+":"+port+" closed."); } public void knownHost(Endpoint e) { //Do nothing. } // public void handleQueryReply( QueryReply qr ) { // synchronized(System.out) { // System.out.println("Query reply from "+qr.getIP()+":"+qr.getPort()+":"); // try { // for (Iterator iter=qr.getResults(); iter.hasNext(); ) // System.out.println(" "+((Response)iter.next()).getName()); // } catch (BadPacketException e) { } // } // } public void handleQueryResult(RemoteFileDesc rfd ,HostData data, Set loc) { synchronized(System.out) { System.out.println("Query hit from "+rfd.getHost()+":"+rfd.getPort()+":"); System.out.println(" "+rfd.getFileName()); } } /** * Add a query string to the monitor screen */ public void handleQueryString( String query ) { } public void error(int errorCode) { error(errorCode, null); } public void error(Throwable problem, String msg) { problem.printStackTrace(); System.out.println(msg); } /** * Implements ActivityCallback. */ public void error(Throwable problem) { problem.printStackTrace(); } public void error(int message, Throwable t) { System.out.println("Error: "+message); t.printStackTrace(); } /////////////////////////////////////////////////////////////////////////// /** Returns an array of strings containing the words of s, where * a word is any sequence of characters not containing a space. */ public static String[] split(String s) { s=s.trim(); int n=s.length(); if (n==0) return new String[0]; Vector buf=new Vector(); //s[i] is the start of the word to add to buf //s[j] is just past the end of the word for (int i=0; i<n; ) { Assert.that(s.charAt(i)!=' '); int j=s.indexOf(' ',i+1); if (j==-1) j=n; buf.add(s.substring(i,j)); //Skip past whitespace (if any) following s[j] for (i=j+1; j<n ; ) { if (s.charAt(i)!=' ') break; i++; } } String[] ret=new String[buf.size()]; for (int i=0; i<ret.length; i++) ret[i]=(String)buf.get(i); return ret; } public boolean overwriteFile(String file) {return false;}; public void addDownload(Downloader mgr) {} public void removeDownload(Downloader mgr) {} public void addUpload(Uploader mgr) {} public void removeUpload(Uploader mgr) {} public void setPort(int port){} public int getNumUploads(){ return 0; } public boolean warnAboutSharingSensitiveDirectory(final File dir) { return false; } public void handleFileEvent(FileManagerEvent evt) {} public void handleSharedFileUpdate(File file) {} public void fileManagerLoading() {} public void acceptChat(Chatter chat) {} public void receiveMessage(Chatter chat) {} public void chatUnavailable(Chatter chatter) {} public void chatErrorMessage(Chatter chatter, String st) {} public void downloadsComplete() {} public void fileManagerLoaded() {} public void uploadsComplete() {} public void promptAboutCorruptDownload(Downloader dloader) { dloader.discardCorruptDownload(false); } public void restoreApplication() {} public void showDownloads() {} public String getHostValue(String key){ return null; } public void browseHostFailed(GUID guid) {} public void setAnnotateEnabled(boolean enabled) {} public void updateAvailable(UpdateInformation update) { if (update.getUpdateCommand() != null) System.out.println("there's a new version out "+update.getUpdateVersion()+ ", to get it shutdown limewire and run "+update.getUpdateCommand()); else System.out.println("You're running an older version. Get " + update.getUpdateVersion() + ", from " + update.getUpdateURL()); } public boolean isQueryAlive(GUID guid) { return false; } public void componentLoading(String component) { System.out.println("Loading component: " + component); } public void addressStateChanged() {} public boolean handleMagnets(final MagnetOptions[] magnets) { return false; } public void acceptedIncomingChanged(boolean status) { } public void disconnected() {} }