diff --git a/Makefile b/Makefile index 00ec735..48ab3a2 100644 --- a/Makefile +++ b/Makefile @@ -17,18 +17,18 @@ plugins: $(INSTALLDIR)$(NAME) installplugins: plugins bash testplugins/install.sh -install: $(INSTALLDIR)$(NAME) +install: $(BUILDDIR)$(NAME) uninstall: sudo rm -f $(INSTALLDIR)$(NAME) -link: - sudo ln -s $(realpath $(BUILDDIR)$(NAME)) $(INSTALLDIR) +link: $(BUILDDIR)$(NAME) + sudo ln -fs $(realpath $(BUILDDIR)$(NAME)) $(INSTALLDIR) $(INSTALLDIR)$(NAME): $(BUILDDIR)$(NAME) cp $(BUILDDIR)$(NAME) $(INSTALLDIR) -all: createhfiles $(BUILDDIR)$(NAME) +all: createhfiles link $(BUILDDIR)%.so: $(SRCDIR)%.cpp $(BUILDDIR) $(CXX) -fPIC -shared $(CFLAGS) $(SRCDIR)*.cpp -o $@ $(LDFLAGS) @@ -38,7 +38,7 @@ $(BUILDDIR)%: $(SRCDIR)%.cpp $(BUILDDIR) clean: $(RM) -r $(BUILDDIR) - $(RM) $(SERVER)plugins/*.so $(SERVER)plugins/CppPlugins/*.so testplugins/*/*.so + $(RM) $(SERVER)plugins/*.so $(SERVER)plugins/CppPlugins/*.so testplugins/*/*.so $(BUILDDIR): mkdir -p $@ diff --git a/src/main/cpp/inc/libplugin.h b/src/main/cpp/inc/libplugin.h index 7abd1c1..8f351d5 100644 --- a/src/main/cpp/inc/libplugin.h +++ b/src/main/cpp/inc/libplugin.h @@ -2,13 +2,32 @@ #include #include +#include + +#define DEBUG 0 +#define COLORS 0 + +#if COLORS == 1 + #define CBLUE std::string("\033[94m") + #define CRED std::string("\033[91m") + #define CYELLOW std::string("\033[93m") + #define CGREEN std::string("\033[92m") + #define CRESET std::string("\033[0m") + #define CGREY std::string("\033[90m") +#else +#define CBLUE std::string() + #define CRED std::string() + #define CYELLOW std::string() + #define CGREEN std::string() + #define CRESET std::string() + #define CGREY std::string() +#endif -#define DEBUG 1 #if DEBUG == 1 -#define DEB(A) std::cout << A << std::endl + #define DEB(A) std::cout << A << CRESET << std::endl #else -#define DEB(A) ; + #define DEB(A) ; #endif namespace Plugin { diff --git a/src/main/cpp/inc/plugin.h b/src/main/cpp/inc/plugin.h index 610a7f0..9e5bca1 100644 --- a/src/main/cpp/inc/plugin.h +++ b/src/main/cpp/inc/plugin.h @@ -29,6 +29,7 @@ public: virtual void onDisable(JNIEnv*); virtual std::map getEvents(); virtual ~CppPlugin(); + void printStacktrace(); }; bool registerCmd(JNIEnv* env, CppPlugin* plugin, std::string& cname, cmdfptr function); diff --git a/src/main/cpp/src/libplugin.cpp b/src/main/cpp/src/libplugin.cpp index 4bd5524..12009a5 100644 --- a/src/main/cpp/src/libplugin.cpp +++ b/src/main/cpp/src/libplugin.cpp @@ -111,7 +111,7 @@ void load(JNIEnv* env, long data) { + (!EVENTDATAF) + (!EVENTNAMEF) + (!PLUGINIDF) + (!BUKKITSERVER) + (!SERVERCMDMAP) + (!MAPGET) + (!MAPPUT) + (!MAPCLEAR) + (!LISTENERCONTR) + (!LISTENERSMALLCONTR) + (!CMDCONSTR) + (!CMDMAPREGISTER)) != 0) { - DEB("Error loading a Java Information:"); + DEB(CRED << "Error loading a Java Information:"); DEB("find classes: " << (!!CPPPLUGINCLASS) << (!!EVENTCLASS) << (!!MAPCLASS) << (!!LISTENERCLASS) << (!!CMDCLASS) << (!!BUKKITCLASS) << (!!CBSERVERCLASS) << (!!CMDMAPCLASS)); DEB("find fields: " << (!!EVENTDATAF) << (!!EVENTNAMEF) << (!!PLUGINIDF) << (!!BUKKITSERVER) << (!!SERVERCMDMAP)); DEB("find methods: " << (!!MAPGET) << (!!MAPPUT) << (!!MAPCLEAR) << (!!LISTENERCONTR) << (!!LISTENERSMALLCONTR) << (!!CMDCONSTR) << (!!CMDMAPREGISTER)); @@ -119,7 +119,7 @@ void load(JNIEnv* env, long data) { } bool registerCmd(JNIEnv* env, CppPlugin* plugin, std::string& cname, cmdfptr function) { - DEB("Register Cmd " + cname + " for " + plugin->name); + DEB(CYELLOW << "Register Cmd " << CGREEN << cname << CYELLOW << " for " << CGREEN << plugin->name); load(env, JNI_BUKKITCLASS | JNI_SERVERCMDMAPFIELD | JNI_CMDCONSTR | JNI_CMDMAPREGISTERMETH); // create cnd @@ -163,7 +163,7 @@ JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_loadPlugin(JNIEn const char* cpath = env->GetStringUTFChars(path, 0); //open plugin - DEB("open plugin " << cpath); + DEB(CBLUE << "open plugin " << cpath); void* handle = dlopen(cpath, RTLD_LAZY); if (!handle) { std::cout << "could not create handle of: " << cpath << " error: " << dlerror() << std::endl; @@ -180,25 +180,25 @@ JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_loadPlugin(JNIEn } Plugin::CppPlugin* plugin = initf(); - DEB("Initilized"); + DEB(CGREY << "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"); + DEB(CGREY << "name set"); // add to vector Plugin::plugins.push_back(plugin); int id = Plugin::plugins.size()-1; plugin->id = id; - DEB("plugin added to vector"); + DEB(CGREY << "plugin added to vector"); //store id Plugin::load(env,Plugin:: JNI_ALL); env->SetIntField(thisobj,Plugin:: PLUGINIDF, id); - DEB("Internal id set"); + DEB(CGREY << "Internal id set"); return (bool) plugin; // converted to boolean here } @@ -209,7 +209,7 @@ JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_loadPlugin(JNIEn * Signature: ()V */ JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onLoad(JNIEnv* env, jobject thisobj) { - DEB("lib::onLoad()"); + DEB(CGREY << "lib::onLoad()"); Plugin::getPlugin(env, thisobj)->onLoad(env); } @@ -219,7 +219,7 @@ JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onLoad(JNIEnv* env, * Signature: ()V */ JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onEnable_1(JNIEnv* env, jobject thisobj) { - DEB("lib::onEnable()"); + DEB(CGREY << "lib::onEnable()"); Plugin::getPlugin(env, thisobj)->onEnable(env); } @@ -230,7 +230,7 @@ JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onEnable_1(JNIEnv* e */ JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onDisable_1(JNIEnv* env, jobject thisobj) { //TODO - DEB("lib::onDisable()" ); + DEB(CGREY << "lib::onDisable()"); Plugin::CppPlugin* plugin = Plugin::getPlugin(env, thisobj); plugin->onDisable(env); dlclose(plugin->handle); @@ -242,9 +242,9 @@ JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onDisable_1(JNIEnv* * 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()" ); + DEB(CGREY << "lib::fireEvent()"); if(functionid == 0) { - DEB("invalid function id"); + DEB(CRED << "invalid function id"); return jevent; } @@ -256,8 +256,16 @@ JNIEXPORT jobject JNICALL Java_de_mrbesen_cppplugins_CppPlugin_fireEvent(JNIEnv* //cast event Plugin::Event event(env, jevent); + //get Plugin + Plugin::CppPlugin* plugin = Plugin::getPlugin(env, thisobj); + //call it - f(env, Plugin::getPlugin(env, thisobj), &event); + try { + f(env, plugin, &event); + } catch(...) { + std::cout << CRED << "Error while processing Event " << event.getName() << " in plugin: " << plugin->name << CRESET << std::endl; + return jevent; + } //put changed fields back in the jevent event.reapply(env, jevent); @@ -291,7 +299,7 @@ JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onCmd(JNIEnv* en try { result = cmdf(env, plugin, sender, cmd, clabel, cargs); } catch(...) { - std::cout << "Error while executing Command " << clabel << " in plugin: " << plugin->name << std::endl; + std::cout << CRED << "Error while executing Command " << clabel << " in plugin: " << plugin->name << CRESET << std::endl; return false; } @@ -308,13 +316,13 @@ JNIEXPORT jobjectArray JNICALL Java_de_mrbesen_cppplugins_CppPlugin_getListener( //call getEvents std::map events = Plugin::getPlugin(env, thisobj)->getEvents(); - DEB("found " << events.size() << " Events"); + DEB(CYELLOW << "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"); + DEB(CGREY << "populate array" ); //populate array int i = 0; for(auto it : events) { @@ -327,7 +335,7 @@ JNIEXPORT jobjectArray JNICALL Java_de_mrbesen_cppplugins_CppPlugin_getListener( env->SetObjectArrayElement(arr, i++, listener); } - DEB("Array finished"); + DEB(CGREY << "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 2de536a..a5f83ac 100644 --- a/src/main/cpp/src/plugin.cpp +++ b/src/main/cpp/src/plugin.cpp @@ -1,6 +1,9 @@ #include #include +#include //backtrace + +#define STACKTRACEBUFFER 100 namespace Plugin { @@ -17,7 +20,7 @@ void CppPlugin::onDisable(JNIEnv*) { } std::map CppPlugin::getEvents() { - std::cout << "Defaults::getEvents()" << std::endl; + //std::cout << "Defaults::getEvents()" << std::endl; return std::map(); } @@ -25,5 +28,27 @@ CppPlugin::~CppPlugin() { } +void CppPlugin::printStacktrace() { + //create stacktrace + void *buffer[STACKTRACEBUFFER]; + int count = backtrace(buffer, STACKTRACEBUFFER)-1; //dont print current frame + + std::cout << "Plugin: " << name << " Creating Stacktrace: "; + std::cout << count << " Frames traced\n"; + + char** strings = nullptr; + + strings = backtrace_symbols(buffer+1, count); + + if(strings == nullptr) { + std::cout << "Error, could not read symbols - compiled with \"-g\"?" << std::endl; + } else { + for(int i = 0; i < count; i++) { + std::cout << strings[i] << "\n"; + } + free(strings); + std::cout << std::endl; + } +} } //namespace