Software /
code /
prosody
Diff
core/modulemanager.lua @ 578:5879264e28e2
Changed module manager to use multitable (initial commit)
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sun, 07 Dec 2008 01:06:10 +0500 |
parent | 573:f6555ebf84ec |
child | 579:81e68e5afce2 |
line wrap: on
line diff
--- a/core/modulemanager.lua Sat Dec 06 04:03:33 2008 +0000 +++ b/core/modulemanager.lua Sun Dec 07 01:06:10 2008 +0500 @@ -26,6 +26,7 @@ local addDiscoInfoHandler = require "core.discomanager".addDiscoInfoHandler; local eventmanager = require "core.eventmanager"; local config = require "core.configmanager"; +local multitable_new = require "util.multitable".new; local loadfile, pcall = loadfile, pcall; @@ -45,6 +46,8 @@ local modulemap = {}; +local m_handler_info = multitable_new(); +local m_stanza_handlers = multitable_new(); local handler_info = {}; local stanza_handlers = {}; @@ -115,7 +118,7 @@ end -function handle_stanza(host, origin, stanza) +function _handle_stanza(host, origin, stanza) local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type; local handlers = stanza_handlers[host]; @@ -148,6 +151,21 @@ log("debug", "Stanza unhandled by any modules, xmlns: %s", stanza.attr.xmlns); return false; -- we didn't handle it end +function handle_stanza(host, origin, stanza) + local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type; + if name == "iq" and xmlns == "jabber:client" then + xmlns = stanza.tags[1].attr.xmlns; + log("debug", "Stanza of type %s from %s has xmlns: %s", name, origin_type, xmlns); + end + local handlers = m_stanza_handlers:get(host, origin_type, name, xmlns); + if handlers then + log("debug", "Passing stanza to mod_%s", handler_info[handlers[1]].name); + (handlers[1])(origin, stanza); + return true; + else + log("debug", "Stanza unhandled by any modules, xmlns: %s", stanza.attr.xmlns); -- we didn't handle it + end +end ----- API functions exposed to modules ----------- -- Must all be in api.* @@ -163,7 +181,7 @@ end -local function _add_iq_handler(module, origin_type, xmlns, handler) +local function __add_iq_handler(module, origin_type, xmlns, handler) local handlers = stanza_handlers[module.host]; handlers[origin_type] = handlers[origin_type] or {}; handlers[origin_type].iq = handlers[origin_type].iq or {}; @@ -175,6 +193,16 @@ module:log("warn", "I wanted to handle tag 'iq' [%s] with payload namespace '%s' but mod_%s already handles that", origin_type, xmlns, handler_info[handlers[origin_type].iq[xmlns]].name); end end +local function _add_iq_handler(module, origin_type, xmlns, handler) + local handlers = m_stanza_handlers:get(module.host, origin_type, "iq", xmlns); + if not handlers then + m_stanza_handlers:add(module.host, origin_type, "iq", xmlns, handler); + handler_info[handler] = module; + module:log("debug", "I now handle tag 'iq' [%s] with payload namespace '%s'", origin_type, xmlns); + else + module:log("warn", "I wanted to handle tag 'iq' [%s] with payload namespace '%s' but mod_%s already handles that", origin_type, xmlns, handler_info[handlers[1]].name); + end +end function api:add_iq_handler(origin_type, xmlns, handler) if not (origin_type and handler and xmlns) then return false; end @@ -198,7 +226,7 @@ api.add_event_hook = eventmanager.add_event_hook; -local function _add_handler(module, origin_type, tag, xmlns, handler) +local function __add_handler(module, origin_type, tag, xmlns, handler) local handlers = stanza_handlers[module.host]; handlers[origin_type] = handlers[origin_type] or {}; if not handlers[origin_type][tag] then @@ -210,6 +238,16 @@ log("warning", "I wanted to handle tag '%s' [%s] but mod_%s already handles that", tag, origin_type, handler_info[handlers[origin_type][tag]].module.name); end end +local function _add_handler(module, origin_type, tag, xmlns, handler) + local handlers = m_stanza_handlers:get(module.host, origin_type, tag, xmlns); + if not handlers then + m_stanza_handlers:add(module.host, origin_type, tag, xmlns, handler); + handler_info[handler] = module; + module:log("debug", "I now handle tag '%s' [%s] with xmlns '%s'", tag, origin_type, xmlns); + else + module:log("warning", "I wanted to handle tag '%s' [%s] but mod_%s already handles that", tag, origin_type, handler_info[handlers[1]].module.name); + end +end function api:add_handler(origin_type, tag, xmlns, handler) if not (origin_type and tag and xmlns and handler) then return false; end