← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 3096: update the script plugin to use lambdas for hooks

 

------------------------------------------------------------
revno: 3096
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Mon 2012-10-29 20:14:01 +0100
message:
  update the script plugin to use lambdas for hooks
modified:
  plugins/Script/Plugin.cpp
  plugins/Script/Plugin.h


--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk

Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'plugins/Script/Plugin.cpp'
--- plugins/Script/Plugin.cpp	2012-10-06 03:20:43 +0000
+++ plugins/Script/Plugin.cpp	2012-10-29 19:14:01 +0000
@@ -19,7 +19,6 @@
 #include "stdafx.h"
 #include "Plugin.h"
 #include "version.h"
-
 #include "Util.h"
 
 Plugin* Plugin::instance = nullptr;
@@ -54,15 +53,16 @@
 	case ON_LOAD:
 		{
 			Bool res = True;
-			newInstance();
-			getInstance()->onLoad(core, (state == ON_INSTALL), res);
+			instance = new Plugin();
+			instance->onLoad(core, (state == ON_INSTALL), res);
 			return res;
 		}
 
 	case ON_UNINSTALL:
 	case ON_UNLOAD:
 		{
-			deleteInstance();
+			delete instance;
+			instance = nullptr;
 			return True;
 		}
 
@@ -117,17 +117,25 @@
 	Lunar<LuaManager>::Register(L);
 	lua_pop(L, lua_gettop(L));
 
-	events[HOOK_CHAT_OUT]				= hooks->bind_hook(HOOK_CHAT_OUT, &chatOutEvent, NULL);
-
-	events[HOOK_HUB_OFFLINE]			= hooks->bind_hook(HOOK_HUB_OFFLINE, &hubOfflineEvent, NULL);
-	events[HOOK_HUB_ONLINE]				= hooks->bind_hook(HOOK_HUB_ONLINE, &hubOnlineEvent, NULL);
-
-	events[HOOK_NETWORK_HUB_IN]			= hooks->bind_hook(HOOK_NETWORK_HUB_IN, &netHubInEvent, NULL);
-	events[HOOK_NETWORK_HUB_OUT]		= hooks->bind_hook(HOOK_NETWORK_HUB_OUT, &netHubOutEvent, NULL);
-	events[HOOK_NETWORK_CONN_IN]		= hooks->bind_hook(HOOK_NETWORK_CONN_IN, &netConnInEvent, NULL);
-	events[HOOK_NETWORK_CONN_OUT]		= hooks->bind_hook(HOOK_NETWORK_CONN_OUT, &netConnOutEvent, NULL);
-
-	events[HOOK_UI_PROCESS_CHAT_CMD]	= hooks->bind_hook(HOOK_UI_PROCESS_CHAT_CMD, &chatCmdEvent, NULL);
+	events[HOOK_CHAT_OUT] = hooks->bind_hook(HOOK_CHAT_OUT, [](dcptr_t pObject, dcptr_t pData, dcptr_t, Bool*) {
+		return instance->onOwnChatOut(reinterpret_cast<HubDataPtr>(pObject), reinterpret_cast<char*>(pData)); }, nullptr);
+
+	events[HOOK_HUB_ONLINE] = hooks->bind_hook(HOOK_HUB_ONLINE, [](dcptr_t pObject, dcptr_t, dcptr_t, Bool*) {
+		return instance->onHubConnected(reinterpret_cast<HubDataPtr>(pObject)); }, nullptr);
+	events[HOOK_HUB_OFFLINE] = hooks->bind_hook(HOOK_HUB_OFFLINE, [](dcptr_t pObject, dcptr_t, dcptr_t, Bool*) {
+		return instance->onHubDisconnected(reinterpret_cast<HubDataPtr>(pObject)); }, nullptr);
+
+	events[HOOK_NETWORK_HUB_IN] = hooks->bind_hook(HOOK_NETWORK_HUB_IN, [](dcptr_t pObject, dcptr_t pData, dcptr_t, Bool*) {
+		return instance->onHubDataIn(reinterpret_cast<HubDataPtr>(pObject), reinterpret_cast<char*>(pData)); }, nullptr);
+	events[HOOK_NETWORK_HUB_OUT] = hooks->bind_hook(HOOK_NETWORK_HUB_OUT, [](dcptr_t pObject, dcptr_t pData, dcptr_t, Bool* bBreak) {
+		return instance->onHubDataOut(reinterpret_cast<HubDataPtr>(pObject), reinterpret_cast<char*>(pData), bBreak); }, nullptr);
+	events[HOOK_NETWORK_CONN_IN] = hooks->bind_hook(HOOK_NETWORK_CONN_IN, [](dcptr_t pObject, dcptr_t pData, dcptr_t, Bool*) {
+		return instance->onConnectionDataIn(reinterpret_cast<ConnectionDataPtr>(pObject), reinterpret_cast<char*>(pData)); }, nullptr);
+	events[HOOK_NETWORK_CONN_OUT] = hooks->bind_hook(HOOK_NETWORK_CONN_OUT, [](dcptr_t pObject, dcptr_t pData, dcptr_t, Bool*) {
+		return instance->onConnectionDataOut(reinterpret_cast<ConnectionDataPtr>(pObject), reinterpret_cast<char*>(pData)); }, nullptr);
+
+	events[HOOK_UI_PROCESS_CHAT_CMD] = hooks->bind_hook(HOOK_UI_PROCESS_CHAT_CMD, [](dcptr_t pObject, dcptr_t pData, dcptr_t, Bool*) {
+		return instance->onHubEnter(reinterpret_cast<HubDataPtr>(pObject), reinterpret_cast<CommandDataPtr>(pData)); }, nullptr);
 
 	/// @todo let the user configure which files to auto-load
 	auto file = Util::fromUtf8(SETTING(ScriptPath)) + "startup.lua";
@@ -135,8 +143,21 @@
 		ScriptInstance::EvaluateFile(file);
 
 	// This ensures that FormatChatText is only called when present...
-	if(CheckFunction("dcpp", "FormatChatHTML"))
-		events[HOOK_UI_CHAT_DISPLAY] = hooks->bind_hook(HOOK_UI_CHAT_DISPLAY, &chatDisplayEvent, NULL);
+	if(CheckFunction("dcpp", "FormatChatHTML")) {
+		events[HOOK_UI_CHAT_DISPLAY] = hooks->bind_hook(HOOK_UI_CHAT_DISPLAY, [](dcptr_t pObject, dcptr_t pData, dcptr_t, Bool* bBreak) {
+			return instance->onFormatChat(reinterpret_cast<UserDataPtr>(pObject), reinterpret_cast<StringDataPtr>(pData), bBreak); }, nullptr);
+	}
+}
+
+void Plugin::setTimer(bool bState) {
+	auto i = events.find(HOOK_TIMER_SECOND);
+	if(bState && i == events.end()) {
+		events[HOOK_TIMER_SECOND] = hooks->bind_hook(HOOK_TIMER_SECOND, [](dcptr_t, dcptr_t, dcptr_t, Bool*) {
+			return instance->onTimer(); }, nullptr);
+	} else if(i != events.end()) {
+		hooks->release_hook(i->second);
+		i->second = nullptr;
+	}
 }
 
 Bool Plugin::onHubEnter(HubDataPtr hHub, CommandDataPtr cmd) {
@@ -203,6 +224,12 @@
 	return MakeCall("dcpp", "OnCommandEnter", 1, hHub, string(message)) ? GetLuaBool() : False;
 }
 
+Bool Plugin::onHubConnected(HubDataPtr hHub) {
+	MakeCall(GetHubType(hHub), "OnHubAdded", 0, hHub);
+
+	return False;
+}
+
 Bool Plugin::onHubDisconnected(HubDataPtr hHub) {
 	// fixme: DC++ may trigger this incorrectly (for hubs where OnHubAdded was never invoked), if socket creation fails...
 	MakeCall(GetHubType(hHub), "OnHubRemoved", 0, hHub);
@@ -211,12 +238,6 @@
 	return False;
 }
 
-Bool Plugin::onHubConnected(HubDataPtr hHub) {
-	MakeCall(GetHubType(hHub), "OnHubAdded", 0, hHub);
-
-	return False;
-}
-
 Bool Plugin::onHubDataIn(HubDataPtr hHub, const char* message) {
 	Lock l(cs);
 	return MakeCall(GetHubType(hHub), "DataArrival", 1, hHub, string(message)) ? GetLuaBool() : False;

=== modified file 'plugins/Script/Plugin.h'
--- plugins/Script/Plugin.h	2012-07-19 22:01:31 +0000
+++ plugins/Script/Plugin.h	2012-10-29 19:14:01 +0000
@@ -21,8 +21,6 @@
 
 #include "ScriptInstance.h"
 
-#include <Singleton.h>
-
 #include <map>
 #include <set>
 
@@ -30,20 +28,12 @@
 using std::map;
 using std::set;
 
-class Plugin : public ScriptInstance, public dcpp::Singleton<Plugin>
+class Plugin : public ScriptInstance
 {
 public:
 	static Bool DCAPI main(PluginState state, DCCorePtr core, dcptr_t);
 
-	void setTimer(bool bState) {
-		auto i = events.find(HOOK_TIMER_SECOND);
-		if(bState &&  i == events.end()) {
-			events[HOOK_TIMER_SECOND] = hooks->bind_hook(HOOK_TIMER_SECOND, &timerEvent, NULL);
-		} else if(i != events.end()) {
-			hooks->release_hook(i->second);
-			i->second = NULL;
-		}
-	}
+	void setTimer(bool bState);
 
 	HubDataPtr createHub(const char* url, const char* nick, const char* password) {
 		auto hHub = hub->add_hub(url, nick, password);
@@ -85,17 +75,17 @@
 			connection->terminate_conn(hConn, graceless ? True : False);
 	}
 
+	static Plugin* getInstance() { return instance; }
+
 private:
-	friend class dcpp::Singleton<Plugin>;
-
 	Plugin();
 	~Plugin();
 
 	void onLoad(DCCorePtr core, bool install, Bool& loadRes);
 	Bool onHubEnter(HubDataPtr hHub, CommandDataPtr cmd);
 	Bool onOwnChatOut(HubDataPtr hHub, const char* message);
+	Bool onHubConnected(HubDataPtr hHub);
 	Bool onHubDisconnected(HubDataPtr hHub);
-	Bool onHubConnected(HubDataPtr hHub);
 	Bool onHubDataIn(HubDataPtr hHub, const char* message);
 	Bool onHubDataOut(HubDataPtr hHub, const char* message, Bool* bBreak);
 	Bool onConnectionDataIn(ConnectionDataPtr hConn, const char* message);
@@ -103,18 +93,6 @@
 	Bool onFormatChat(UserDataPtr hUser, StringDataPtr line, Bool* bBreak);
 	Bool onTimer();
 
-	// Event wrappers
-	static Bool DCAPI chatOutEvent(dcptr_t pObject, dcptr_t pData, dcptr_t, Bool* /*bBreak*/) { return getInstance()->onOwnChatOut(reinterpret_cast<HubDataPtr>(pObject), reinterpret_cast<char*>(pData)); }
-	static Bool DCAPI hubOfflineEvent(dcptr_t pObject, dcptr_t /*pData*/, dcptr_t, Bool* /*bBreak*/) { return getInstance()->onHubDisconnected(reinterpret_cast<HubDataPtr>(pObject)); }
-	static Bool DCAPI hubOnlineEvent(dcptr_t pObject, dcptr_t /*pData*/, dcptr_t, Bool* /*bBreak*/) { return getInstance()->onHubConnected(reinterpret_cast<HubDataPtr>(pObject)); }
-	static Bool DCAPI netHubInEvent(dcptr_t pObject, dcptr_t pData, dcptr_t, Bool* /*bBreak*/) { return getInstance()->onHubDataIn(reinterpret_cast<HubDataPtr>(pObject), reinterpret_cast<char*>(pData)); }
-	static Bool DCAPI netHubOutEvent(dcptr_t pObject, dcptr_t pData, dcptr_t, Bool* bBreak) { return getInstance()->onHubDataOut(reinterpret_cast<HubDataPtr>(pObject), reinterpret_cast<char*>(pData), bBreak); }
-	static Bool DCAPI netConnInEvent(dcptr_t pObject, dcptr_t pData, dcptr_t, Bool* /*bBreak*/) { return getInstance()->onConnectionDataIn(reinterpret_cast<ConnectionDataPtr>(pObject), reinterpret_cast<char*>(pData)); }
-	static Bool DCAPI netConnOutEvent(dcptr_t pObject, dcptr_t pData, dcptr_t, Bool* /*bBreak*/) { return getInstance()->onConnectionDataOut(reinterpret_cast<ConnectionDataPtr>(pObject), reinterpret_cast<char*>(pData)); }
-	static Bool DCAPI chatCmdEvent(dcptr_t pObject, dcptr_t pData, dcptr_t, Bool* /*bBreak*/) { return getInstance()->onHubEnter(reinterpret_cast<HubDataPtr>(pObject), reinterpret_cast<CommandDataPtr>(pData)); }
-	static Bool DCAPI chatDisplayEvent(dcptr_t pObject, dcptr_t pData, dcptr_t, Bool* bBreak) { return getInstance()->onFormatChat((UserDataPtr)pObject, reinterpret_cast<StringDataPtr>(pData), bBreak); }
-	static Bool DCAPI timerEvent(dcptr_t /*pObject*/, dcptr_t /*pData*/, dcptr_t, Bool* /*bBreak*/) { return getInstance()->onTimer(); }
-
 	void removeChatCache(const HubDataPtr hub) {
 		auto j = chatCache.find(hub->url);
 		if(j != chatCache.end())
@@ -131,6 +109,8 @@
 	DCHubPtr hub;
 	DCConnectionPtr connection;
 
+	/** @todo switch to dcpp::Singleton when <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51494>
+	is fixed */
 	static Plugin* instance;
 };