# HG changeset patch # User Matthew Wild # Date 1228595151 0 # Node ID 81e68e5afce29685322c6c7aae2ece6aab27c238 # Parent 22f54a04471f883e64d5f7ed0b83b580439b063c# Parent 5879264e28e2d1f6bef29a1933a99e8773d8712f Merge from waqas diff -r 22f54a04471f -r 81e68e5afce2 core/modulemanager.lua --- a/core/modulemanager.lua Sat Dec 06 19:51:10 2008 +0000 +++ b/core/modulemanager.lua Sat Dec 06 20:25:51 2008 +0000 @@ -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 @@ function api:add_event_hook (...) return eventmanager.add_event_hook(...); end -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