Software / code / prosody
Comparison
core/modulemanager.lua @ 4896:27cda15104f2
modulemanager, moduleapi: Turn module.event_handlers into a multitable and track object->event->handler associations correctly (thanks Zash)
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sat, 19 May 2012 15:39:16 +0100 |
| parent | 4893:98ff89ab5d1d |
| child | 5021:85b2689dbcfe |
comparison
equal
deleted
inserted
replaced
| 4895:36df30395c44 | 4896:27cda15104f2 |
|---|---|
| 8 | 8 |
| 9 local logger = require "util.logger"; | 9 local logger = require "util.logger"; |
| 10 local log = logger.init("modulemanager"); | 10 local log = logger.init("modulemanager"); |
| 11 local config = require "core.configmanager"; | 11 local config = require "core.configmanager"; |
| 12 local pluginloader = require "util.pluginloader"; | 12 local pluginloader = require "util.pluginloader"; |
| 13 local set = require "util.set"; | |
| 14 | |
| 15 local new_multitable = require "util.multitable".new; | |
| 13 | 16 |
| 14 local hosts = hosts; | 17 local hosts = hosts; |
| 15 local prosody = prosody; | 18 local prosody = prosody; |
| 16 | 19 |
| 17 local pcall, xpcall = pcall, xpcall; | 20 local pcall, xpcall = pcall, xpcall; |
| 24 local n = select("#", ...); | 27 local n = select("#", ...); |
| 25 local params = {...}; | 28 local params = {...}; |
| 26 return xpcall(function() return f(unpack(params, 1, n)) end, function(e) return tostring(e).."\n"..debug_traceback(); end); | 29 return xpcall(function() return f(unpack(params, 1, n)) end, function(e) return tostring(e).."\n"..debug_traceback(); end); |
| 27 end | 30 end |
| 28 | 31 |
| 29 local set = require "util.set"; | |
| 30 | |
| 31 local autoload_modules = {"presence", "message", "iq", "offline", "c2s", "s2s"}; | 32 local autoload_modules = {"presence", "message", "iq", "offline", "c2s", "s2s"}; |
| 32 local component_inheritable_modules = {"tls", "dialback", "iq", "s2s"}; | 33 local component_inheritable_modules = {"tls", "dialback", "iq", "s2s"}; |
| 33 | 34 |
| 34 -- We need this to let modules access the real global namespace | 35 -- We need this to let modules access the real global namespace |
| 35 local _G = _G; | 36 local _G = _G; |
| 89 if (not ok) and err then | 90 if (not ok) and err then |
| 90 log("warn", "Non-fatal error unloading module '%s' on '%s': %s", name, host, err); | 91 log("warn", "Non-fatal error unloading module '%s' on '%s': %s", name, host, err); |
| 91 end | 92 end |
| 92 end | 93 end |
| 93 | 94 |
| 94 for event, data in pairs(mod.module.event_handlers) do | 95 for object, event, handler in mod.module.event_handlers:iter(nil, nil, nil) do |
| 95 data.object.remove_handler(event, data.handler); | 96 object.remove_handler(event, handler); |
| 96 end | 97 end |
| 97 | 98 |
| 98 if mod.module.items then -- remove items | 99 if mod.module.items then -- remove items |
| 99 local events = (host == "*" and prosody.events) or hosts[host].events; | 100 local events = (host == "*" and prosody.events) or hosts[host].events; |
| 100 for key,t in pairs(mod.module.items) do | 101 for key,t in pairs(mod.module.items) do |
| 130 elseif modulemap["*"][module_name] then | 131 elseif modulemap["*"][module_name] then |
| 131 local mod = modulemap["*"][module_name]; | 132 local mod = modulemap["*"][module_name]; |
| 132 if module_has_method(mod, "add_host") then | 133 if module_has_method(mod, "add_host") then |
| 133 local _log = logger.init(host..":"..module_name); | 134 local _log = logger.init(host..":"..module_name); |
| 134 local host_module_api = setmetatable({ | 135 local host_module_api = setmetatable({ |
| 135 host = host, event_handlers = {}, items = {}; | 136 host = host, event_handlers = new_multitable(), items = {}; |
| 136 _log = _log, log = function (self, ...) return _log(...); end; | 137 _log = _log, log = function (self, ...) return _log(...); end; |
| 137 },{ | 138 },{ |
| 138 __index = modulemap["*"][module_name].module; | 139 __index = modulemap["*"][module_name].module; |
| 139 }); | 140 }); |
| 140 local host_module = setmetatable({ module = host_module_api }, { __index = mod }); | 141 local host_module = setmetatable({ module = host_module_api }, { __index = mod }); |
| 157 return nil, err; | 158 return nil, err; |
| 158 end | 159 end |
| 159 | 160 |
| 160 local _log = logger.init(host..":"..module_name); | 161 local _log = logger.init(host..":"..module_name); |
| 161 local api_instance = setmetatable({ name = module_name, host = host, path = err, | 162 local api_instance = setmetatable({ name = module_name, host = host, path = err, |
| 162 _log = _log, log = function (self, ...) return _log(...); end, event_handlers = {} } | 163 _log = _log, log = function (self, ...) return _log(...); end, event_handlers = new_multitable() } |
| 163 , { __index = api }); | 164 , { __index = api }); |
| 164 | 165 |
| 165 local pluginenv = setmetatable({ module = api_instance }, { __index = _G }); | 166 local pluginenv = setmetatable({ module = api_instance }, { __index = _G }); |
| 166 api_instance.environment = pluginenv; | 167 api_instance.environment = pluginenv; |
| 167 | 168 |