------------------------------------------------------------ revno: 3096 committer: poy <p...@123gen.com> 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; };
_______________________________________________ Mailing list: https://launchpad.net/~linuxdcpp-team Post to : linuxdcpp-team@lists.launchpad.net Unsubscribe : https://launchpad.net/~linuxdcpp-team More help : https://help.launchpad.net/ListHelp