From 23d218f86fcf7afd226d4fce399d3f076528e865 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Tue, 21 Oct 2014 03:20:05 -0400 Subject: [PATCH] Added error messages to plugin load routine; load() is now called if found. --- Jupiter/Plugin.cpp | 43 +++++++++++++++++++++++++++++++++++-------- Release/Jupiter.lib | Bin 247414 -> 247414 bytes 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/Jupiter/Plugin.cpp b/Jupiter/Plugin.cpp index 747bb3e..f172255 100644 --- a/Jupiter/Plugin.cpp +++ b/Jupiter/Plugin.cpp @@ -98,19 +98,46 @@ Jupiter::Plugin *Jupiter::loadPluginFile(const char *file) #else // _WIN32 dPlug->lib = dlopen(file, RTLD_LAZY); #endif // _WIN32 - if (dPlug->lib == nullptr) goto fail; + if (dPlug->lib == nullptr) + { + fprintf(stderr, "Error: Unable to load plugin file \"%s\" (File failed to load)", file); + goto fail; + } - // Get the "getPlugin" function - typedef Jupiter::Plugin *(*func_type)(void); + { + // Get the "getPlugin" function + typedef Jupiter::Plugin *(*func_type)(void); #if defined _WIN32 - func_type func = (func_type) GetProcAddress(dPlug->lib, "getPlugin"); + func_type func = (func_type)GetProcAddress(dPlug->lib, "getPlugin"); #else // _WIN32 - func_type func = (func_type)dlsym(dPlug->lib, "getPlugin"); + func_type func = (func_type)dlsym(dPlug->lib, "getPlugin"); #endif // _WIN32 - if (func == nullptr) goto fail; + if (func == nullptr) + { + fprintf(stderr, "Error: Unable to load plugin file \"%s\" (Invalid plugin)", file); + goto fail; + } - dPlug->plugin = func(); - if (dPlug->plugin == nullptr) goto fail; + dPlug->plugin = func(); + if (dPlug->plugin == nullptr) + { + fprintf(stderr, "Error: Unable to load plugin file \"%s\" (Plugin failed to initialize)", file); + goto fail; + } + } + { + typedef bool(*func_type)(void); +#if defined _WIN32 + func_type func = (func_type)GetProcAddress(dPlug->lib, "load"); +#else // _WIN32 + func_type func = (func_type)dlsym(dPlug->lib, "load"); +#endif // _WIN32 + if (func != nullptr && func() == false) + { + fprintf(stderr, "Error: Unable to load plugin file \"%s\" (Plugin failed to load)", file); + goto fail; + } + } _libList.add(dPlug); _plugins.add(dPlug->plugin); diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 71cc322bce3711ac0417adfe22451227c73d165c..f1ea97acd132ee414978650f657f1f3c653a304f 100644 GIT binary patch delta 18072 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 OaMb34s1Ezsjr%`RE`-4V delta 18059 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