package lbms.plugins.mldht.azureus; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.SocketException; import java.util.EnumMap; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import lbms.plugins.mldht.kad.DHT; import lbms.plugins.mldht.kad.DHTConstants; import lbms.plugins.mldht.kad.DHTLogger; import lbms.plugins.mldht.kad.DHT.DHTtype; //import org.eclipse.swt.graphics.Image; //import org.gudy.azureus2.plugins.PluginException; import org.gudy.azureus2.plugins.PluginInterface; //import org.gudy.azureus2.plugins.PluginListener; //import org.gudy.azureus2.plugins.UnloadablePlugin; import org.gudy.azureus2.plugins.download.Download; import org.chris.portmapper.model.PortMapping; import org.chris.portmapper.model.Protocol; import org.chris.portmapper.router.RouterException; import org.milipede.portmapper.PortMapper; import org.milipede.portmapper.PortMapperService; //import org.gudy.azureus2.plugins.logging.Logger; //import org.gudy.azureus2.plugins.logging.LoggerChannel; //import org.gudy.azureus2.plugins.logging.LoggerChannelListener; //import org.gudy.azureus2.plugins.ui.UIInstance; //import org.gudy.azureus2.plugins.ui.UIManager; //import org.gudy.azureus2.plugins.ui.UIManagerListener; //import org.gudy.azureus2.plugins.ui.menus.MenuItem; //import org.gudy.azureus2.plugins.ui.menus.MenuItemListener; //import org.gudy.azureus2.plugins.ui.model.BasicPluginConfigModel; //import org.gudy.azureus2.plugins.ui.model.BasicPluginViewModel; //import org.gudy.azureus2.plugins.ui.tables.TableContextMenuItem; //import org.gudy.azureus2.plugins.ui.tables.TableManager; //import org.gudy.azureus2.plugins.ui.tables.TableRow; //import org.gudy.azureus2.ui.swt.plugins.UISWTInstance; //import com.aelitis.azureus.plugins.upnp.UPnPPlugin; /** * @author Damokles * */ public class MlDHTPlugin { //implements UnloadablePlugin, PluginListener { private PluginInterface pluginInterface; private Map<DHTtype,DHT> dhts; private Tracker tracker; // private BasicPluginConfigModel config_model; // private BasicPluginViewModel view_model; // private Logger logger; // private LoggerChannel logChannel; // private LoggerChannelListener logListener; // private UIManagerListener uiListener; // private UISWTInstance swtInstance = null; // private Image dhtStatusEntryIcon; //private Display display; // private SWTHelper swtHelper; // private Object mlDHTProvider; public org.gudy.azureus2.plugins.dht.mainline.MainlineDHTProvider mlDHTProvider; private static MlDHTPlugin singleton = new MlDHTPlugin(); /* * (non-Javadoc) * * @see org.gudy.azureus2.plugins.Plugin#initialize(org.gudy.azureus2.plugins.PluginInterface) */ public void initialize () { // final PluginInterface pluginInterface // }) // throws PluginException { // if (singleton != null) { // throw new IllegalStateException("Plugin already initialized"); // } // singleton = this; // this.pluginInterface = pluginInterface; // UIManager ui_manager = pluginInterface.getUIManager(); // config_model = ui_manager.createBasicPluginConfigModel("plugins", // "plugin.mldht"); // config_model.addBooleanParameter2("enable", "mldht.enable", true); // config_model.addIntParameter2("port", "mldht.port", 49001); // config_model.addBooleanParameter2("autoopen", "mldht.autoopen", true); // config_model.addBooleanParameter2("backupOnly", "mldht.backupOnly", // false); // config_model.addBooleanParameter2("onlyPeerBootstrap", // "mldht.onlyPeerBootstrap", false); // config_model.addBooleanParameter2("alwaysRestoreID", "mldht.restoreID", // true); // config_model.addBooleanParameter2("showStatusEntry", // "mldht.showStatusEntry", true); // //// view_model = ui_manager.createBasicPluginViewModel("Mainline DHT Log"); // // view_model.getActivity().setVisible(false); // view_model.getProgress().setVisible(false); // // view_model.getStatus().setText("Stopped"); // //// logger = pluginInterface.getLogger(); // logChannel = logger.getTimeStampedChannel("Mainline DHT"); // logListener = 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"); // } // }; // logChannel.addListener(logListener); // String version = pluginInterface.getPluginVersion(); // int parsedVersion = -1; // if(version != null) // { // version = version.replaceAll("[^0-9]", ""); // if(version.length() > 9) // version = version.substring(0, 8); // parsedVersion = Integer.parseInt(version); // } // DHTConstants.setVersion(parsedVersion); dhts = DHT.createDHTs(); DHT.setLogger(new DHTLogger() { /* * (non-Javadoc) * * @see lbms.plugins.mldht.kad.DHTLogger#log(java.lang.String) */ public void log (String message) { // logChannel.log(message); System.out.println(message); } /* * (non-Javadoc) * * @see lbms.plugins.mldht.kad.DHTLogger#log(java.lang.Exception) */ public void log (Exception e) { // logChannel.log(e); e.printStackTrace(); } }); try { mlDHTProvider = new org.gudy.azureus2.plugins.dht.mainline.MainlineDHTProvider() { /* * (non-Javadoc) * * @see org.gudy.azureus2.plugins.dht.mainline.MainlineDHTProvider#getDHTPort() */ public int getDHTPort () { // return pluginInterface.getPluginconfig() // .getPluginIntParameter("port"); return 49001; } /* * (non-Javadoc) * * @see org.gudy.azureus2.plugins.dht.mainline.MainlineDHTProvider#notifyOfIncomingPort(java.lang.String, * int) */ public void notifyOfIncomingPort (String ip_addr, int port) { System.out.println("incoming port nitification:"); for(DHT dht : dhts.values()) dht.addDHTNode(ip_addr, port); } }; // pluginInterface // .getMainlineDHTManager() // .setProvider( // (org.gudy.azureus2.plugins.dht.mainline.MainlineDHTProvider) mlDHTProvider); } catch (Throwable e) { } tracker = new Tracker(this); // uiListener = new UIManagerListener() { // /* // * (non-Javadoc) // * // * @see org.gudy.azureus2.plugins.ui.UIManagerListener#UIAttached(org.gudy.azureus2.plugins.ui.UIInstance) // */ // public void UIAttached (UIInstance instance) { // if (swtHelper == null) { // swtHelper = new SWTHelper(MlDHTPlugin.this); // } // swtHelper.UIAttached(instance); // } // // /* // * (non-Javadoc) // * // * @see org.gudy.azureus2.plugins.ui.UIManagerListener#UIDetached(org.gudy.azureus2.plugins.ui.UIInstance) // */ // public void UIDetached (UIInstance instance) { // if (swtHelper != null) { // swtHelper.UIDetached(instance); // } // // } // }; // // ui_manager.addUIListener(uiListener); // // TableContextMenuItem incompleteMenuItem = ui_manager.getTableManager() // .addContextMenuItem(TableManager.TABLE_MYTORRENTS_INCOMPLETE, // "tablemenu.main.item"); // TableContextMenuItem completeMenuItem = ui_manager.getTableManager() // .addContextMenuItem(TableManager.TABLE_MYTORRENTS_COMPLETE, // "tablemenu.main.item"); // // incompleteMenuItem.setStyle(MenuItem.STYLE_MENU); // completeMenuItem.setStyle(MenuItem.STYLE_MENU); // // TableContextMenuItem incAnnounceItem = ui_manager.getTableManager() // .addContextMenuItem(incompleteMenuItem, // "tablemenu.announce.item"); // // TableContextMenuItem comAnnounceItem = ui_manager // .getTableManager() // .addContextMenuItem(completeMenuItem, "tablemenu.announce.item"); // // MenuItemListener announceItemListener = new MenuItemListener() { // /* // * (non-Javadoc) // * // * @see org.gudy.azureus2.plugins.ui.menus.MenuItemListener#selected(org.gudy.azureus2.plugins.ui.menus.MenuItem, // * java.lang.Object) // */ // public void selected (MenuItem menu, Object target) { // TableRow row = (TableRow) target; // Download dl = (Download) row.getDataSource(); // tracker.announceDownload(dl); // } // }; // // incAnnounceItem.addListener(announceItemListener); // comAnnounceItem.addListener(announceItemListener); // // //must be at the end because on update you get a synchronous callback // pluginInterface.addListener(this); } //------------------------------------------------------------------- public static MlDHTPlugin getInstance () { return singleton; } private MlDHTPlugin () { // if ( singleton == null) { // singleton = new MlDHTPlugin(); // } } /** * @return the pluginInterface */ public PluginInterface getPluginInterface () { return pluginInterface; } /** * @return the dht */ public DHT getDHT (DHT.DHTtype type) { return dhts.get(type); } public Tracker getTracker () { return tracker; } // /** // * @return the logger // */ // public Logger getLogger () { // return logger; // } // /** // * Returns the user set status of whether or not the plugin should autoOpen // * // * @return boolean autoOpen // */ // public boolean isPluginAutoOpen () { // return pluginInterface.getPluginconfig().getPluginBooleanParameter( // "autoopen", true); // } private void registerUPnPMapping (int port) { PortMapperService mapper = PortMapper.getInstance(); mapper.loadSettings(); System.out.println("local host address: " + mapper.getLocalHostAddress()); try { boolean connected = mapper.connectRouter(); if (connected == true) { System.out.println(mapper.getRouter().getExternalIPAddress()); PortMapping mapping = new PortMapping(Protocol.UDP, mapper.getRouter().getExternalIPAddress(), 49001, mapper.getLocalHostAddress(), 49001, "torrent"); mapper.getRouter().addPortMapping(mapping); } } catch (RouterException ex) { ex.printStackTrace(); } try { // PluginInterface pi_upnp = pluginInterface.getPluginManager() // .getPluginInterfaceByClass(UPnPPlugin.class); // if (pi_upnp != null) { // ((UPnPPlugin) pi_upnp.getPlugin()).addMapping(pluginInterface // .getPluginName(), false, port, true); // } } catch (Throwable t) { t.printStackTrace(); } } //------------------------------------------------------------------- // /* // * (non-Javadoc) // * // * @see org.gudy.azureus2.plugins.UnloadablePlugin#unload() // */ // public void unload () throws PluginException { // if (swtHelper != null) { // swtHelper.onPluginUnload(); // } // if (dhtStatusEntryIcon != null) { // dhtStatusEntryIcon.dispose(); // dhtStatusEntryIcon = null; // } // if (swtInstance != null) { // swtInstance.removeViews(UISWTInstance.VIEW_MAIN, DHTView.VIEWID); // swtInstance = null; // } // stopDHT(); // // try { // pluginInterface.getMainlineDHTManager().setProvider(null); // } catch (Throwable e) { // } // // logChannel.removeListener(logListener); // pluginInterface.getUIManager().removeUIListener(uiListener); // view_model.destroy(); // config_model.destroy(); // pluginInterface.removeListener(this); // } /* * (non-Javadoc) * * @see org.gudy.azureus2.plugins.PluginListener#closedownComplete() */ public void closedownComplete () { // TODO Auto-generated method stub } /* * (non-Javadoc) * * @see org.gudy.azureus2.plugins.PluginListener#closedownInitiated() */ public void closedownInitiated () { stopDHT(); } /* * (non-Javadoc) * * @see org.gudy.azureus2.plugins.PluginListener#initializationComplete() */ public void initializationComplete () { // registerUPnPMapping(pluginInterface.getPluginconfig() // .getPluginIntParameter("port")); // if (pluginInterface.getPluginconfig().getPluginBooleanParameter( // "enable")) registerUPnPMapping(49001); { //start in a separate Thread, since it might block //when getPublicAddress is called and the version server is offline Thread t = new Thread(new Runnable() { public void run () { startDHT(); } }); t.setPriority(Thread.MIN_PRIORITY); t.start(); } } //------------------------------------------------------------------- private boolean success = false; public void startDHT () { // view_model.getStatus().setText("Initializing"); try { // try { // success = new File("C:\\", "dht.cache").createNewFile(); // } catch (IOException ex) { // Logger.getLogger(MlDHTPlugin.class.getName()).log(Level.SEVERE, null, ex); // } // if (success = true) { for(Map.Entry<DHTtype, DHT> e : dhts.entrySet()) { // e.getValue().start(new File("C://dht.cache"), 6881, false); e.getValue().start(new File("C:\\", "dht.cache"), 49001, false); // pluginInterface.getPluginconfig() // .getPluginIntParameter("port"), pluginInterface // .getPluginconfig().getPluginBooleanParameter( // "onlyPeerBootstrap")); e.getValue().bootstrap(); } tracker.start(); // } // view_model.getStatus().setText("Running"); } catch (SocketException e) { e.printStackTrace(); } } public void stopDHT () { tracker.stop(); for(DHT dht : dhts.values()) dht.stop(); // view_model.getStatus().setText("Stopped"); } }