/* 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.support.plugins.helpers1; import java.io.PrintWriter; import java.io.StringWriter; import freenet.pluginmanager.PluginNotFoundException; import freenet.pluginmanager.PluginReplySender; import freenet.support.Logger; import freenet.support.SimpleFieldSet; import freenet.support.api.Bucket; public abstract class AbstractFCPHandler { private static volatile boolean logDEBUG; static { Logger.registerClass(AbstractFCPHandler.class); } public static class FCPException extends Exception { private static final long serialVersionUID = 1L; public static final int UNKNOWN_ERROR = -1; public static final int OK = 0; public static final int MISSING_IDENTIFIER = 1; public static final int MISSING_COMMAND = 2; public static final int NO_SUCH_COMMAND = 3; public static final int UNSUPPORTED_OPERATION = 4; public static final int INTERNAL_ERROR = 5; final int code; protected FCPException(int eCode, String message) { super(message); code = eCode; } } protected final PluginContext pluginContext; protected AbstractFCPHandler(PluginContext pluginContext2) { this.pluginContext = pluginContext2; } public final void handle(PluginReplySender replysender, SimpleFieldSet params, Bucket data, int accesstype) throws PluginNotFoundException { if (logDEBUG) { Logger.debug(this, "Got Message: " + params.toOrderedString()); } final String command = params.get("Command"); final String identifier = params.get("Identifier"); if ("Ping".equals(command)) { SimpleFieldSet sfs = new SimpleFieldSet(true); sfs.put("Pong", System.currentTimeMillis()); if (identifier != null) sfs.putSingle("Identifier", identifier); replysender.send(sfs); return; } if (identifier == null || identifier.trim().length() == 0) { sendError(replysender, FCPException.MISSING_IDENTIFIER, "<invalid>", "Empty identifier!"); return; } if (command == null || command.trim().length() == 0) { sendError(replysender, FCPException.MISSING_COMMAND, identifier, "Empty Command name"); return; } try { handle(replysender, command, identifier, params, data, accesstype); } catch (FCPException e) { sendError(replysender, identifier, e); } catch (UnsupportedOperationException uoe) { sendError(replysender, FCPException.UNSUPPORTED_OPERATION, identifier, uoe.toString()); } } protected abstract void handle(PluginReplySender replysender, String command, String identifier, SimpleFieldSet params, Bucket data, int accesstype) throws FCPException, PluginNotFoundException; public static void sendErrorWithTrace(PluginReplySender replysender, String identifier, Exception error) throws PluginNotFoundException { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); error.printStackTrace(pw); pw.flush(); sendError(replysender, FCPException.INTERNAL_ERROR, identifier, error.getLocalizedMessage()); } public static void sendError(PluginReplySender replysender, String identifier, FCPException error) throws PluginNotFoundException { sendError(replysender, error.code, identifier, error.getLocalizedMessage()); } public static void sendError(PluginReplySender replysender, int code, String identifier, String description) throws PluginNotFoundException { sendError(replysender, code, identifier, description, null); } public static void sendError(PluginReplySender replysender, int code, String identifier, String description, byte[] data) throws PluginNotFoundException { SimpleFieldSet sfs = new SimpleFieldSet(true); sfs.putOverwrite("Status", "Error"); sfs.put("Code", code); sfs.putSingle("Identifier", identifier); sfs.putOverwrite("Description", description); replysender.send(sfs, data); } public static void sendNOP(PluginReplySender replysender, String identifier) throws PluginNotFoundException { sendError(replysender, -1, identifier, "Not implemented", null); } public static void sendSuccess(PluginReplySender replysender, String identifier, String description) throws PluginNotFoundException { SimpleFieldSet sfs = new SimpleFieldSet(true); sfs.putOverwrite("Status", "Success"); sfs.put("Code", 0); sfs.putSingle("Identifier", identifier); sfs.putSingle("Description", description); replysender.send(sfs); } public static void sendProgress(PluginReplySender replysender, String identifier, String description) throws PluginNotFoundException { SimpleFieldSet sfs = new SimpleFieldSet(true); sfs.putSingle("Status", "Progress"); sfs.putSingle("Identifier", identifier); sfs.putSingle("Description", description); replysender.send(sfs); } }