diff --git a/src/main/cpp/inc/event.h b/src/main/cpp/inc/event.h index b4f9f37..253ffe9 100644 --- a/src/main/cpp/inc/event.h +++ b/src/main/cpp/inc/event.h @@ -4,6 +4,8 @@ #include #include +namespace Plugin { + class Event { private: std::string name; //name of the event @@ -19,4 +21,6 @@ public: Event(JNIEnv* env, jobject jevent); //virtual ~Event(); -}; \ No newline at end of file +}; + +} //namespace Plugin diff --git a/src/main/cpp/inc/libplugin.h b/src/main/cpp/inc/libplugin.h index 0f5d01b..7abd1c1 100644 --- a/src/main/cpp/inc/libplugin.h +++ b/src/main/cpp/inc/libplugin.h @@ -11,6 +11,8 @@ #define DEB(A) ; #endif +namespace Plugin { + extern jclass CPPPLUGINCLASS; extern jclass EVENTCLASS; extern jclass MAPCLASS; @@ -80,3 +82,5 @@ inline CppPlugin* getPlugin(int id) { return getPlugin(0, 0, id); } +} //namespace Plugin + diff --git a/src/main/cpp/inc/plugin.h b/src/main/cpp/inc/plugin.h index 577dbe4..610a7f0 100644 --- a/src/main/cpp/inc/plugin.h +++ b/src/main/cpp/inc/plugin.h @@ -7,6 +7,8 @@ #include "event.h" +namespace Plugin { + //fwd declr class CppPlugin; @@ -65,7 +67,7 @@ enum Color : char { ITALIC = 'o', RESET = 'r' }; -const char COLORCHAR = '§'; +const char COLORCHAR = '\xA7'; // § inline std::string operator+(const Color c, const std::string& r) { std::string out(1, COLORCHAR); return out + ((char) c) + r; @@ -83,3 +85,6 @@ inline std::string operator+(const std::string& r, const Color c) { inline std::string operator+(const char* r, const Color c) { return r + COLORCHAR + (char) c; } + +} //namespace Plugin + diff --git a/src/main/cpp/src/event.cpp b/src/main/cpp/src/event.cpp index 691b67b..6c667ac 100644 --- a/src/main/cpp/src/event.cpp +++ b/src/main/cpp/src/event.cpp @@ -3,6 +3,8 @@ #include +namespace Plugin { + jobject Event::getMap(JNIEnv* env) { return env->GetObjectField(input, EVENTDATAF); } @@ -70,4 +72,7 @@ Event::Event(JNIEnv* env, jobject jevent) { jstring name = (jstring) env->GetObjectField(jevent, EVENTNAMEF); this->name = std::string(env->GetStringUTFChars(name, 0)); input = jevent; -} \ No newline at end of file +} + +} + diff --git a/src/main/cpp/src/libplugin.cpp b/src/main/cpp/src/libplugin.cpp index 98a1f3f..4bd5524 100644 --- a/src/main/cpp/src/libplugin.cpp +++ b/src/main/cpp/src/libplugin.cpp @@ -10,6 +10,8 @@ #include "libplugin.h" #include "plugin.h" +namespace Plugin { + jclass CPPPLUGINCLASS; jclass EVENTCLASS; jclass MAPCLASS; @@ -116,190 +118,6 @@ void load(JNIEnv* env, long data) { } } -JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_init_1(JNIEnv* env, jclass pluginclass) { - load(env, JNI_ALL); - return true; -} - - -/** - * Class: de_mrbesen_cppplugins_CppPlugin - * Method: loadPlugin - * Signature: (Ljava/lang/String;)Z - */ -JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_loadPlugin(JNIEnv* env, jobject thisobj, jstring path) { - const char* cpath = env->GetStringUTFChars(path, 0); - - //open plugin - DEB("open plugin " << cpath); - void* handle = dlopen(cpath, RTLD_LAZY); - if (!handle) { - std::cout << "could not create handle of: " << cpath << " error: " << dlerror() << std::endl; - return false; - } - //throw std::string("Error: plugin could not be opend. ") + dlerror(); - - //load function pointer - initfptr initf = (initfptr) dlsym(handle, "init"); - if(!initf) { - std::cout << "Could not find function init: " << dlerror() << std::endl; - dlclose(handle); - return false; - } - - CppPlugin* plugin = initf(); - DEB("Initilized"); - - plugin->handle = handle; - - //set name / handle id - plugin->name = std::string(cpath); - plugin->name = plugin->name.substr(plugin->name.rfind('/')+1); - DEB("name set"); - - // add to vector - plugins.push_back(plugin); - int id = plugins.size()-1; - plugin->id = id; - DEB("plugin added to vector"); - - //store id - load(env, JNI_ALL); - env->SetIntField(thisobj, PLUGINIDF, id); - DEB("Internal id set"); - - return (bool) plugin; // converted to boolean here -} - -/* - * Class: de_mrbesen_cppplugins_CppPlugin - * Method: onLoad - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onLoad(JNIEnv* env, jobject thisobj) { - DEB("lib::onLoad()"); - getPlugin(env, thisobj)->onLoad(env); -} - -/* - * Class: de_mrbesen_cppplugins_CppPlugin - * Method: onEnable_ - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onEnable_1(JNIEnv* env, jobject thisobj) { - DEB("lib::onEnable()"); - getPlugin(env, thisobj)->onEnable(env); -} - -/* - * Class: de_mrbesen_cppplugins_CppPlugin - * Method: onDisable_ - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onDisable_1(JNIEnv* env, jobject thisobj) { - //TODO - DEB("lib::onDisable()" ); - CppPlugin* plugin = getPlugin(env, thisobj); - plugin->onDisable(env); - dlclose(plugin->handle); -} - -/* - * Class: de_mrbesen_cppplugins_CppPlugin - * Method: fireEvent - * Signature: (Lde/mrbesen/cppplugins/CppEvent;I)Lde/mrbesen/cppplugins/CppEvent; - */ -JNIEXPORT jobject JNICALL Java_de_mrbesen_cppplugins_CppPlugin_fireEvent(JNIEnv* env, jobject thisobj, jobject jevent, jlong functionid) { - DEB("lib::fireEvent()" ); - if(functionid == 0) { - DEB("invalid function id"); - return jevent; - } - - load(env, JNI_EVENT | JNI_MAP); - - //cast function - eventfptr f = reinterpret_cast(functionid); - - //cast event - Event event(env, jevent); - - //call it - f(env, getPlugin(env, thisobj), &event); - - //put changed fields back in the jevent - event.reapply(env, jevent); - - return jevent; -} - -/* - * Class: de_mrbesen_cppplugins_CppPlugin - * Method: onCmd - * Signature: (Lorg/bukkit/command/CommandSender;Lorg/bukkit/command/Command;Ljava/lang/String;[Ljava/lang/String;J)Z - */ -JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onCmd(JNIEnv* env, jclass cppplugin, jobject sender, jobject cmd, jstring label, jobjectArray args, jlong fid, jint pluginid) { - if(fid == 0) return false; - CppPlugin* plugin = getPlugin(pluginid); - - //parse args - int argsize = env->GetArrayLength(args); - std::vector cargs(argsize); - for(int i = 0; i < argsize; i++) { - jstring ar = (jstring) env->GetObjectArrayElement(args, i); - cargs[i] = env->GetStringUTFChars(ar, 0); - } - - //parse label - std::string clabel = env->GetStringUTFChars(label, 0); - - //call function - cmdfptr cmdf = reinterpret_cast(fid); - bool result = false; - try { - result = cmdf(env, plugin, sender, cmd, clabel, cargs); - } catch(...) { - std::cout << "Error while executing Command " << clabel << " in plugin: " << plugin->name << std::endl; - return false; - } - - return result; -} - -/* - * Class: de_mrbesen_cppplugins_CppPlugin - * Method: getListener - * Signature: ()[Lde/mrbesen/cppplugins/CppPlugin/CppListener; - */ -JNIEXPORT jobjectArray JNICALL Java_de_mrbesen_cppplugins_CppPlugin_getListener(JNIEnv* env, jobject thisobj) { - load(env, JNI_LISTENER); - - //call getEvents - std::map events = getPlugin(env, thisobj)->getEvents(); - DEB("found " << events.size() << " Events"); - - //create array - jobject initial = env->NewObject(LISTENERCLASS, LISTENERSMALLCONTR); - jobjectArray arr = env->NewObjectArray(events.size(), LISTENERCLASS, initial); - - DEB("populate array"); - //populate array - int i = 0; - for(auto it : events) { - //create object - jstring eventname = env->NewStringUTF(it.first.c_str()); - jobject listener = env->NewObject(LISTENERCLASS, LISTENERCONTR, eventname, it.second); - env->DeleteLocalRef(eventname); - - //set array - env->SetObjectArrayElement(arr, i++, listener); - } - - DEB("Array finished"); - - return arr; -} - bool registerCmd(JNIEnv* env, CppPlugin* plugin, std::string& cname, cmdfptr function) { DEB("Register Cmd " + cname + " for " + plugin->name); load(env, JNI_BUKKITCLASS | JNI_SERVERCMDMAPFIELD | JNI_CMDCONSTR | JNI_CMDMAPREGISTERMETH); @@ -326,3 +144,190 @@ void send(JNIEnv* env, jobject sender, const char* text) { env->DeleteLocalRef(jtext); } +} //namespace + + + +JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_init_1(JNIEnv* env, jclass pluginclass) { + Plugin::load(env, Plugin::JNI_ALL); + return true; +} + + +/** + * Class: de_mrbesen_cppplugins_CppPlugin + * Method: loadPlugin + * Signature: (Ljava/lang/String;)Z + */ +JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_loadPlugin(JNIEnv* env, jobject thisobj, jstring path) { + const char* cpath = env->GetStringUTFChars(path, 0); + + //open plugin + DEB("open plugin " << cpath); + void* handle = dlopen(cpath, RTLD_LAZY); + if (!handle) { + std::cout << "could not create handle of: " << cpath << " error: " << dlerror() << std::endl; + return false; + } + //throw std::string("Error: plugin could not be opend. ") + dlerror(); + + //load function pointer + Plugin::initfptr initf = (Plugin::initfptr) dlsym(handle, "init"); + if(!initf) { + std::cout << "Could not find function init: " << dlerror() << std::endl; + dlclose(handle); + return false; + } + + Plugin::CppPlugin* plugin = initf(); + DEB("Initilized"); + + plugin->handle = handle; + + //set name / handle id + plugin->name = std::string(cpath); + plugin->name = plugin->name.substr(plugin->name.rfind('/')+1); + DEB("name set"); + + // add to vector + Plugin::plugins.push_back(plugin); + int id = Plugin::plugins.size()-1; + plugin->id = id; + DEB("plugin added to vector"); + + //store id + Plugin::load(env,Plugin:: JNI_ALL); + env->SetIntField(thisobj,Plugin:: PLUGINIDF, id); + DEB("Internal id set"); + + return (bool) plugin; // converted to boolean here +} + +/* + * Class: de_mrbesen_cppplugins_CppPlugin + * Method: onLoad + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onLoad(JNIEnv* env, jobject thisobj) { + DEB("lib::onLoad()"); + Plugin::getPlugin(env, thisobj)->onLoad(env); +} + +/* + * Class: de_mrbesen_cppplugins_CppPlugin + * Method: onEnable_ + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onEnable_1(JNIEnv* env, jobject thisobj) { + DEB("lib::onEnable()"); + Plugin::getPlugin(env, thisobj)->onEnable(env); +} + +/* + * Class: de_mrbesen_cppplugins_CppPlugin + * Method: onDisable_ + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onDisable_1(JNIEnv* env, jobject thisobj) { + //TODO + DEB("lib::onDisable()" ); + Plugin::CppPlugin* plugin = Plugin::getPlugin(env, thisobj); + plugin->onDisable(env); + dlclose(plugin->handle); +} + +/* + * Class: de_mrbesen_cppplugins_CppPlugin + * Method: fireEvent + * Signature: (Lde/mrbesen/cppplugins/CppEvent;I)Lde/mrbesen/cppplugins/CppEvent; + */ +JNIEXPORT jobject JNICALL Java_de_mrbesen_cppplugins_CppPlugin_fireEvent(JNIEnv* env, jobject thisobj, jobject jevent, jlong functionid) { + DEB("lib::fireEvent()" ); + if(functionid == 0) { + DEB("invalid function id"); + return jevent; + } + + Plugin::load(env, Plugin::JNI_EVENT | Plugin::JNI_MAP); + + //cast function + Plugin::eventfptr f = reinterpret_cast(functionid); + + //cast event + Plugin::Event event(env, jevent); + + //call it + f(env, Plugin::getPlugin(env, thisobj), &event); + + //put changed fields back in the jevent + event.reapply(env, jevent); + + return jevent; +} + +/* + * Class: de_mrbesen_cppplugins_CppPlugin + * Method: onCmd + * Signature: (Lorg/bukkit/command/CommandSender;Lorg/bukkit/command/Command;Ljava/lang/String;[Ljava/lang/String;J)Z + */ +JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onCmd(JNIEnv* env, jclass cppplugin, jobject sender, jobject cmd, jstring label, jobjectArray args, jlong fid, jint pluginid) { + if(fid == 0) return false; + Plugin::CppPlugin* plugin = Plugin::getPlugin(pluginid); + + //parse args + int argsize = env->GetArrayLength(args); + std::vector cargs(argsize); + for(int i = 0; i < argsize; i++) { + jstring ar = (jstring) env->GetObjectArrayElement(args, i); + cargs[i] = env->GetStringUTFChars(ar, 0); + } + + //parse label + std::string clabel = env->GetStringUTFChars(label, 0); + + //call function + Plugin::cmdfptr cmdf = reinterpret_cast(fid); + bool result = false; + try { + result = cmdf(env, plugin, sender, cmd, clabel, cargs); + } catch(...) { + std::cout << "Error while executing Command " << clabel << " in plugin: " << plugin->name << std::endl; + return false; + } + + return result; +} + +/* + * Class: de_mrbesen_cppplugins_CppPlugin + * Method: getListener + * Signature: ()[Lde/mrbesen/cppplugins/CppPlugin/CppListener; + */ +JNIEXPORT jobjectArray JNICALL Java_de_mrbesen_cppplugins_CppPlugin_getListener(JNIEnv* env, jobject thisobj) { + Plugin::load(env, Plugin::JNI_LISTENER); + + //call getEvents + std::map events = Plugin::getPlugin(env, thisobj)->getEvents(); + DEB("found " << events.size() << " Events"); + + //create array + jobject initial = env->NewObject(Plugin::LISTENERCLASS, Plugin::LISTENERSMALLCONTR); + jobjectArray arr = env->NewObjectArray(events.size(), Plugin::LISTENERCLASS, initial); + + DEB("populate array"); + //populate array + int i = 0; + for(auto it : events) { + //create object + jstring eventname = env->NewStringUTF(it.first.c_str()); + jobject listener = env->NewObject(Plugin::LISTENERCLASS, Plugin::LISTENERCONTR, eventname, it.second); + env->DeleteLocalRef(eventname); + + //set array + env->SetObjectArrayElement(arr, i++, listener); + } + + DEB("Array finished"); + + return arr; +} \ No newline at end of file diff --git a/src/main/cpp/src/plugin.cpp b/src/main/cpp/src/plugin.cpp index 3024601..2de536a 100644 --- a/src/main/cpp/src/plugin.cpp +++ b/src/main/cpp/src/plugin.cpp @@ -2,6 +2,8 @@ #include +namespace Plugin { + void CppPlugin::onLoad(JNIEnv*) { } @@ -21,4 +23,7 @@ std::map CppPlugin::getEvents() { CppPlugin::~CppPlugin() { -} \ No newline at end of file +} + + +} //namespace diff --git a/testplugins/01verysimpleplugin/src/plugin.cpp b/testplugins/01verysimpleplugin/src/plugin.cpp index ccb8e7f..618dce7 100644 --- a/testplugins/01verysimpleplugin/src/plugin.cpp +++ b/testplugins/01verysimpleplugin/src/plugin.cpp @@ -4,6 +4,8 @@ #include #include +using namespace Plugin; + extern "C" { class SimplePlugin : public CppPlugin { diff --git a/testplugins/02simpleEvents/src/plugin.cpp b/testplugins/02simpleEvents/src/plugin.cpp index 23ace4e..acbe3c9 100644 --- a/testplugins/02simpleEvents/src/plugin.cpp +++ b/testplugins/02simpleEvents/src/plugin.cpp @@ -4,6 +4,8 @@ #include #include +using namespace Plugin; + extern "C" { class EventsPlugin : public CppPlugin { diff --git a/testplugins/03simpleCmd/src/plugin.cpp b/testplugins/03simpleCmd/src/plugin.cpp index 62229cd..98ee7ac 100644 --- a/testplugins/03simpleCmd/src/plugin.cpp +++ b/testplugins/03simpleCmd/src/plugin.cpp @@ -5,8 +5,9 @@ #include #include -extern "C" { +using namespace Plugin; +extern "C" { bool hicmd(JNIEnv* env, CppPlugin* plugin, jobject sender, jobject cmd, std::string& label, std::vector& args) { std::cout << "HICMD::hi " << label << " argsize: " << args.size() << std::endl;