summaryrefslogtreecommitdiffstats
path: root/src/Bindings/PluginLua.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Bindings/PluginLua.h')
-rw-r--r--src/Bindings/PluginLua.h86
1 files changed, 31 insertions, 55 deletions
diff --git a/src/Bindings/PluginLua.h b/src/Bindings/PluginLua.h
index db6612671..e53fbaaa8 100644
--- a/src/Bindings/PluginLua.h
+++ b/src/Bindings/PluginLua.h
@@ -10,7 +10,6 @@
#pragma once
#include "Plugin.h"
-#include "WebPlugin.h"
#include "LuaState.h"
// Names for the global variables through which the plugin is identified in its LuaState
@@ -29,8 +28,7 @@ class cWindow;
// tolua_begin
class cPluginLua :
- public cPlugin,
- public cWebPlugin
+ public cPlugin
{
typedef cPlugin super;
@@ -64,36 +62,6 @@ public:
- /** A base class that represents something related to a plugin
- The plugin can reset this class so that the instance can continue to exist but will not engage the (possibly non-existent) plugin anymore.
- This is used for scheduled tasks etc., so that they can be queued and reset when the plugin is terminated, without removing them from the queue. */
- class cResettable
- {
- public:
- /** Creates a new instance bound to the specified plugin. */
- cResettable(cPluginLua & a_Plugin);
-
- // Force a virtual destructor in descendants:
- virtual ~cResettable() {}
-
- /** Resets the plugin instance stored within.
- The instance will continue to exist, but should not call into the plugin anymore. */
- virtual void Reset(void);
-
- protected:
- /** The plugin that this instance references.
- If nullptr, the plugin has already unloaded and the instance should bail out any processing.
- Protected against multithreaded access by m_CSPlugin. */
- cPluginLua * m_Plugin;
-
- /** The mutex protecting m_Plugin against multithreaded access. */
- cCriticalSection m_CSPlugin;
- };
-
- typedef SharedPtr<cResettable> cResettablePtr;
- typedef std::vector<cResettablePtr> cResettablePtrs;
-
-
cPluginLua(const AString & a_PluginDirectory);
~cPluginLua();
@@ -181,14 +149,6 @@ public:
/** Returns true if the plugin contains the function for the specified hook type, using the old-style registration (#121) */
bool CanAddOldStyleHook(int a_HookType);
- // cWebPlugin overrides
- virtual const AString GetWebTitle(void) const override {return GetName(); }
- virtual AString HandleWebRequest(const HTTPRequest & a_Request) override;
-
- /** Adds a new web tab to webadmin.
- Displaying the tab calls the referenced function. */
- bool AddWebTab(const AString & a_Title, lua_State * a_LuaState, int a_FunctionReference); // Exported in ManualBindings.cpp
-
/** Binds the command to call the function specified by a Lua function reference. Simply adds to CommandMap. */
void BindCommand(const AString & a_Command, int a_FnRef);
@@ -211,11 +171,9 @@ public:
/** Returns the name of Lua function that should handle the specified hook type in the older (#121) API */
static const char * GetHookFnName(int a_HookType);
- /** Adds a Lua function to be called for the specified hook.
- The function has to be on the Lua stack at the specified index a_FnRefIdx
- Returns true if the hook was added successfully.
- */
- bool AddHookRef(int a_HookType, int a_FnRefIdx);
+ /** Adds a Lua callback to be called for the specified hook.
+ Returns true if the hook was added successfully. */
+ bool AddHookCallback(int a_HookType, cLuaState::cCallbackPtr a_Callback);
/** Calls a function in this plugin's LuaState with parameters copied over from a_ForeignState.
The values that the function returns are placed onto a_ForeignState.
@@ -235,29 +193,23 @@ public:
return m_LuaState.Call(a_Fn, a_Args...);
}
- /** Adds the specified cResettable instance to m_Resettables, so that it is notified when the plugin is being closed. */
- void AddResettable(cResettablePtr a_Resettable);
-
protected:
/** Maps command name into Lua function reference */
typedef std::map<AString, int> CommandMap;
/** Provides an array of Lua function references */
- typedef std::vector<cLuaState::cRef *> cLuaRefs;
+ typedef std::vector<cLuaState::cCallbackPtr> cLuaCallbacks;
/** Maps hook types into arrays of Lua function references to call for each hook type */
- typedef std::map<int, cLuaRefs> cHookMap;
+ typedef std::map<int, cLuaCallbacks> cHookMap;
- /** The mutex protecting m_LuaState and each of the m_Resettables[] against multithreaded use. */
+ /** The mutex protecting m_LuaState against multithreaded use. */
cCriticalSection m_CriticalSection;
/** The plugin's Lua state. */
cLuaState m_LuaState;
- /** Objects that need notification when the plugin is about to be unloaded. */
- cResettablePtrs m_Resettables;
-
/** In-game commands that the plugin has registered. */
CommandMap m_Commands;
@@ -270,6 +222,30 @@ protected:
/** Releases all Lua references, notifies and removes all m_Resettables[] and closes the m_LuaState. */
void Close(void);
+
+ /** Removes all WebTabs currently registered for this plugin from the WebAdmin. */
+ void ClearWebTabs(void);
+
+ /** Calls a hook that has the simple format - single bool return value specifying whether the chain should continue.
+ The advanced hook types that need more processing implement a similar loop manually instead.
+ Returns true if any of hook calls wants to abort the hook (returned true), false if all hook calls returned false. */
+ template <typename... Args>
+ bool CallSimpleHooks(int a_HookType, Args && ... a_Args)
+ {
+ cCSLock lock(m_CriticalSection);
+ auto & hooks = m_HookMap[a_HookType];
+ bool res = false;
+ for (auto & hook: hooks)
+ {
+ hook->Call(std::forward<Args>(a_Args)..., cLuaState::Return, res);
+ if (res)
+ {
+ // Hook wants to terminate the chain processing
+ return true;
+ }
+ }
+ return false;
+ }
} ; // tolua_export