core/modulemanager.lua

changeset 578
5879264e28e2
parent 573
f6555ebf84ec
child 579
81e68e5afce2
--- 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

mercurial