From 1570af3f4dff4a6d8dc20d9d8dca9098708261a1 Mon Sep 17 00:00:00 2001 From: lethosor Date: Sat, 7 Mar 2015 15:56:43 -0500 Subject: [PATCH] Allow plugins to export additional functions through a class --- library/PluginManager.cpp | 11 +++++++++++ library/include/PluginManager.h | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/library/PluginManager.cpp b/library/PluginManager.cpp index bd376f9aa..50410f9a0 100644 --- a/library/PluginManager.cpp +++ b/library/PluginManager.cpp @@ -268,6 +268,7 @@ bool Plugin::load(color_ostream &con) plugin_enable = (command_result (*)(color_ostream &,bool)) LookupPlugin(plug, "plugin_enable"); plugin_is_enabled = (bool*) LookupPlugin(plug, "plugin_is_enabled"); plugin_eval_ruby = (command_result (*)(color_ostream &, const char*)) LookupPlugin(plug, "plugin_eval_ruby"); + plugin_get_exports = (void* (*)(void)) LookupPlugin(plug, "plugin_get_exports"); index_lua(plug); this->name = *plug_name; plugin_lib = plug; @@ -757,6 +758,16 @@ Plugin *PluginManager::getPluginByCommand(const std::string &command) return NULL; } +void *PluginManager::getPluginExports(const std::string &name) +{ + Plugin *plug = getPluginByName(name); + if (!plug) + return NULL; + if (plug->getState() != Plugin::plugin_state::PS_LOADED) + return NULL; + return plug->getExports(); +} + // FIXME: handle name collisions... command_result PluginManager::InvokeCommand(color_ostream &out, const std::string & command, std::vector & parameters) { diff --git a/library/include/PluginManager.h b/library/include/PluginManager.h index befc030ff..09030664a 100644 --- a/library/include/PluginManager.h +++ b/library/include/PluginManager.h @@ -162,6 +162,12 @@ namespace DFHack command_result invoke(color_ostream &out, const std::string & command, std::vector & parameters); bool can_invoke_hotkey(const std::string & command, df::viewscreen *top ); plugin_state getState () const; + void *getExports() + { + if (plugin_get_exports) + return plugin_get_exports(); + return NULL; + }; RPCService *rpc_connect(color_ostream &out); @@ -224,6 +230,7 @@ namespace DFHack command_result (*plugin_enable)(color_ostream &, bool); RPCService* (*plugin_rpcconnect)(color_ostream &); command_result (*plugin_eval_ruby)(color_ostream &, const char*); + void* (*plugin_get_exports)(void); }; class DFHACK_EXPORT PluginManager { @@ -241,6 +248,7 @@ namespace DFHack public: Plugin *getPluginByName (const std::string & name); Plugin *getPluginByCommand (const std::string &command); + void *getPluginExports(const std::string &name); command_result InvokeCommand(color_ostream &out, const std::string & command, std::vector & parameters); bool CanInvokeHotkey(const std::string &command, df::viewscreen *top); Plugin* operator[] (std::size_t index) @@ -283,6 +291,17 @@ namespace DFHack DFhackDataExport bool plugin_is_enabled = false; \ bool &varname = plugin_is_enabled; +#define DFHACK_PLUGIN_EXPORTS(clsname) \ + DFhackCExport void* plugin_get_exports() \ + { \ + static clsname* instance = NULL; \ + if (!instance) \ + instance = new clsname; \ + return (void*)instance; \ + } +#define GET_PLUGIN_EXPORTS(plugname, clsname) \ + (clsname*)DFHack::Core::getInstance().getPluginManager()->getPluginExports(plugname) + #define DFHACK_PLUGIN_LUA_COMMANDS \ DFhackCExport const DFHack::CommandReg plugin_lua_commands[] = #define DFHACK_PLUGIN_LUA_FUNCTIONS \