Author: saces
Date: 2007-11-17 21:06:14 +0000 (Sat, 17 Nov 2007)
New Revision: 15800

Added:
   trunk/freenet/src/freenet/node/fcp/GetPluginInfo.java
   trunk/freenet/src/freenet/node/fcp/PluginInfoMessage.java
Modified:
   trunk/freenet/src/freenet/node/fcp/FCPMessage.java
   trunk/freenet/src/freenet/node/fcp/ProtocolErrorMessage.java
   trunk/freenet/src/freenet/pluginmanager/PluginManager.java
Log:
new fcp command to ask for the presence of a plugin (GetPluginInfo)

Modified: trunk/freenet/src/freenet/node/fcp/FCPMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPMessage.java  2007-11-17 12:29:18 UTC 
(rev 15799)
+++ trunk/freenet/src/freenet/node/fcp/FCPMessage.java  2007-11-17 21:06:14 UTC 
(rev 15800)
@@ -55,6 +55,8 @@
                        return new GetConfig(fs);
                if(name.equals(GetNode.NAME))
                        return new GetNode(fs);
+               if(name.equals(GetPluginInfo.NAME))
+                       return new GetPluginInfo(fs);
                if(name.equals(GetRequestStatusMessage.NAME))
                        return new GetRequestStatusMessage(fs);
                if(name.equals(ListPeerMessage.NAME))

Added: trunk/freenet/src/freenet/node/fcp/GetPluginInfo.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/GetPluginInfo.java                       
        (rev 0)
+++ trunk/freenet/src/freenet/node/fcp/GetPluginInfo.java       2007-11-17 
21:06:14 UTC (rev 15800)
@@ -0,0 +1,50 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.node.fcp;
+
+import freenet.node.Node;
+import freenet.pluginmanager.PluginInfoWrapper;
+import freenet.pluginmanager.PluginManager;
+import freenet.support.Fields;
+import freenet.support.SimpleFieldSet;
+
+public class GetPluginInfo extends FCPMessage {
+
+       static final String NAME = "GetPluginInfo";
+       
+       private final String identifier;
+       private final boolean detailed;
+       private final String plugname;
+       
+       public GetPluginInfo(SimpleFieldSet fs) throws MessageInvalidException {
+               identifier = fs.get("Identifier");  // optional
+               detailed = Fields.stringToBool(fs.get("Detailed"), false);
+               plugname = fs.get("PluginName");
+               if(plugname == null)
+                       throw new 
MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "GetPluginInfo must 
contain a PluginName field", null, false);
+       }
+       
+       public SimpleFieldSet getFieldSet() {
+               return new SimpleFieldSet(true);
+       }
+       
+       public String getName() {
+               return NAME;
+       }
+       
+       public void run(FCPConnectionHandler handler, Node node)
+                       throws MessageInvalidException {
+               if(!handler.hasFullAccess()) {
+                       throw new 
MessageInvalidException(ProtocolErrorMessage.ACCESS_DENIED, "GetPluginInfo 
requires full access", identifier, false);
+               }
+
+               PluginInfoWrapper pi = 
node.pluginManager.getPluginInfo(plugname);
+               if (pi == null) {
+                       handler.outputHandler.queue(new 
ProtocolErrorMessage(ProtocolErrorMessage.NO_SUCH_PLUGIN, false, "Plugin '"+ 
plugname + "' does not exist", identifier, false));
+               } else {
+                       handler.outputHandler.queue(new PluginInfoMessage(pi, 
identifier, detailed));
+               }
+       }
+       
+}

Added: trunk/freenet/src/freenet/node/fcp/PluginInfoMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PluginInfoMessage.java                   
        (rev 0)
+++ trunk/freenet/src/freenet/node/fcp/PluginInfoMessage.java   2007-11-17 
21:06:14 UTC (rev 15800)
@@ -0,0 +1,62 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.node.fcp;
+
+import freenet.node.Node;
+import freenet.pluginmanager.PluginInfoWrapper;
+import freenet.support.SimpleFieldSet;
+
+/**
+ * @author saces
+ *
+ */
+public class PluginInfoMessage extends FCPMessage {
+       
+       static final String NAME = "PluginInfo";
+       
+       private final String identifier;
+       
+       private final boolean detailed;
+
+       private final String classname;
+       private final String filename;
+
+       private final boolean isHTTP;
+       private final boolean isFCP;
+       
+       PluginInfoMessage(PluginInfoWrapper pi, String identifier, boolean 
detail) {
+               this.identifier = identifier;
+               this.detailed = detail;
+               
+               classname = pi.getPluginClassName();
+               filename = pi.getFilename();
+               
+               isHTTP = pi.isPproxyPlugin();
+               isFCP = pi.isFCPPlugin();
+       }
+
+       public SimpleFieldSet getFieldSet() {
+               SimpleFieldSet sfs = new SimpleFieldSet(true);
+               if(identifier != null) // is optional on these two only
+                       sfs.putSingle("Identifier", identifier);
+               sfs.putSingle("PluginName", classname);
+               
+               if (detailed) {
+                       sfs.putSingle("FileName", filename);
+                       
+                       sfs.put("IsHTTPPlugin", isHTTP);
+                       sfs.put("IsFCPPlugin", isFCP);
+               }
+               return sfs;
+       }
+
+       public String getName() {
+               return NAME;
+       }
+
+       public void run(FCPConnectionHandler handler, Node node) throws 
MessageInvalidException {
+               throw new 
MessageInvalidException(ProtocolErrorMessage.INVALID_MESSAGE, NAME + " goes 
from server to client not the other way around", null, false);
+       }
+
+}

Modified: trunk/freenet/src/freenet/node/fcp/ProtocolErrorMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ProtocolErrorMessage.java        
2007-11-17 12:29:18 UTC (rev 15799)
+++ trunk/freenet/src/freenet/node/fcp/ProtocolErrorMessage.java        
2007-11-17 21:06:14 UTC (rev 15800)
@@ -53,6 +53,7 @@
        static final int DUPLICATE_PEER_REF = 29;
        static final int OPENNET_DISABLED = 30;
        static final int DARKNET_ONLY = 31;
+       static final int NO_SUCH_PLUGIN = 32;  

        final int code;
        final String extra;
@@ -124,6 +125,8 @@
                        return "Opennet is currently disabled in the node's 
configuration";
                case DARKNET_ONLY:
                        return "Operation only available on a darknet peer";
+               case NO_SUCH_PLUGIN:
+                       return "No such plugin";
                default:
                        Logger.error(this, "Unknown error code: "+code, new 
Exception("debug"));
                return "(Unknown)";

Modified: trunk/freenet/src/freenet/pluginmanager/PluginManager.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginManager.java  2007-11-17 
12:29:18 UTC (rev 15799)
+++ trunk/freenet/src/freenet/pluginmanager/PluginManager.java  2007-11-17 
21:06:14 UTC (rev 15800)
@@ -346,6 +346,22 @@
        }

        /**
+        * look for PluginInfo for a Plugin with given classname
+        * @param plugname
+        * @return the PluginInfo or null if not found
+        */
+       public PluginInfoWrapper getPluginInfo(String plugname) {
+               synchronized (pluginWrappers) {
+                       for(int i=0;i<pluginWrappers.size();i++) {
+                               PluginInfoWrapper pi = (PluginInfoWrapper) 
pluginWrappers.get(i);
+                               if (pi.getPluginClassName().equals(plugname))
+                                       return pi;
+                       }
+               }
+               return null;
+       }
+       
+       /**
         * look for a FCPPlugin with given classname
         * @param plugname
         * @return the plugin or null if not found


Reply via email to