public void runCommandLoop() { while (true) { int cmd = readInt(); if (cmd == -1) { loader.init(); // init intercom_return(); } else if (cmd == -2) { // shutdown intercom_return(); return; } else // callback { CallbackInfo cb = callbacks.get(cmd); ArrayList<Object> args = new ArrayList<Object>(); for (InterprocType type : cb.getTypes()) { switch (type) { case boolType: args.add(readBool()); break; case int8: args.add(readByte()); break; case int16: args.add(readShort()); break; case int32: args.add(readInt()); break; case int64: args.add(readLong()); break; case floatType: args.add(readFloat()); break; case string: args.add(readString()); break; } } boolean retval = false; try { retval = (Boolean) cb.getMethod().invoke(cb.getObject(), args.toArray()); } catch (Throwable e) { logger_log( LogType.LOG_CRITICAL, "msJavaPlugin-java", "An unhandled exception was thrown in a callback function."); PrintWriter pw = new PrintWriter(new StringWriter()); e.printStackTrace(pw); logger_log(LogType.LOG_CRITICAL, "msJavaPlugin-java", pw.toString()); } intercom_return(retval); } } }
public void plugin_addCallback(String hookID, Object obj, Method method) { /* string HookID int32 function id int32 argument count int8 type of arg1 ... int8 type of argn */ CallbackInfo cb = new CallbackInfo(obj, method); writeInt(ClientCommand.plugin_addCallback.ordinal()); writeString(hookID); writeInt(cb.getIndex()); // function id writeInt(method.getParameterTypes().length); // argument count // argument types writeArgTypes(cb.getTypes()); callbacks.add(cb); }