Author: toad
Date: 2007-09-08 17:57:16 +0000 (Sat, 08 Sep 2007)
New Revision: 15068

Modified:
   trunk/freenet/src/freenet/pluginmanager/PluginHandler.java
   trunk/freenet/src/freenet/pluginmanager/PluginManager.java
Log:
Register for callback services (e.g. web interface) just before runPlugin() for 
threaded, and just after for threadless - plugin may need to have the 
PluginRespirator before handling incoming callbacks esp web - prevents an NPE

Modified: trunk/freenet/src/freenet/pluginmanager/PluginHandler.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginHandler.java  2007-09-08 
17:48:23 UTC (rev 15067)
+++ trunk/freenet/src/freenet/pluginmanager/PluginHandler.java  2007-09-08 
17:57:16 UTC (rev 15068)
@@ -43,7 +43,7 @@
        }

        private static class PluginStarter implements Runnable {
-               private Object plugin = null;
+               private FredPlugin plugin = null;
                private PluginRespirator pr;
                private PluginManager pm = null;
                final PluginInfoWrapper pi;
@@ -53,15 +53,20 @@
                        this.pi = pi;
                }

-               public void setPlugin(PluginManager pm, Object plugin) {
+               public void setPlugin(PluginManager pm, FredPlugin plugin) {
                        this.plugin = plugin;
                        this.pm = pm;
                }

                public void run() {
+                       boolean threadless = plugin instanceof 
FredPluginThreadless;
                        if (plugin instanceof FredPlugin) {
                                try {
+                                       if(!threadless) // Have to do it now 
because threaded
+                                               pm.register(plugin, pi);
                                        ((FredPlugin)plugin).runPlugin(pr);
+                                       if(threadless) // Don't want it to 
receive callbacks until after it has the PluginRespirator, else get NPEs
+                                               pm.register(plugin, pi);
                                } catch (OutOfMemoryError e) {
                                        OOMHandler.handleOOM(e);
                                } catch (Throwable t) {

Modified: trunk/freenet/src/freenet/pluginmanager/PluginManager.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginManager.java  2007-09-08 
17:48:23 UTC (rev 15067)
+++ trunk/freenet/src/freenet/pluginmanager/PluginManager.java  2007-09-08 
17:57:16 UTC (rev 15068)
@@ -120,18 +120,6 @@
                try {
                        plug = LoadPlugin(filename);
                        PluginInfoWrapper pi = PluginHandler.startPlugin(this, 
filename, plug, pluginRespirator);
-                       // handles FProxy? If so, register
-
-                       if (pi.isPproxyPlugin())
-                               registerToadlet(plug);
-
-                       if(pi.isIPDetectorPlugin()) {
-                               
node.ipDetector.registerIPDetectorPlugin((FredPluginIPDetector) plug);
-                       }
-                       if(pi.isPortForwardPlugin()) {
-                               
node.ipDetector.registerPortForwardPlugin((FredPluginPortForward) plug);
-                       }
-
                        synchronized (pluginWrappers) {
                                pluginWrappers.add(pi);
                        }
@@ -155,6 +143,20 @@
                if(store) core.storeConfig();
        }

+       void register(FredPlugin plug, PluginInfoWrapper pi) {
+               // handles FProxy? If so, register
+
+               if (pi.isPproxyPlugin())
+                       registerToadlet(plug);
+
+               if(pi.isIPDetectorPlugin()) {
+                       
node.ipDetector.registerIPDetectorPlugin((FredPluginIPDetector) plug);
+               }
+               if(pi.isPortForwardPlugin()) {
+                       
node.ipDetector.registerPortForwardPlugin((FredPluginPortForward) plug);
+               }
+       }
+       
        private String l10n(String key, String pattern, String value) {
                return L10n.getString("PluginManager."+key, pattern, value);
        }


Reply via email to