Software /
code /
prosody
Comparison
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 |
comparison
equal
deleted
inserted
replaced
573:f6555ebf84ec | 578:5879264e28e2 |
---|---|
24 local logger = require "util.logger"; | 24 local logger = require "util.logger"; |
25 local log = logger.init("modulemanager"); | 25 local log = logger.init("modulemanager"); |
26 local addDiscoInfoHandler = require "core.discomanager".addDiscoInfoHandler; | 26 local addDiscoInfoHandler = require "core.discomanager".addDiscoInfoHandler; |
27 local eventmanager = require "core.eventmanager"; | 27 local eventmanager = require "core.eventmanager"; |
28 local config = require "core.configmanager"; | 28 local config = require "core.configmanager"; |
29 local multitable_new = require "util.multitable".new; | |
29 | 30 |
30 | 31 |
31 local loadfile, pcall = loadfile, pcall; | 32 local loadfile, pcall = loadfile, pcall; |
32 local setmetatable, setfenv, getfenv = setmetatable, setfenv, getfenv; | 33 local setmetatable, setfenv, getfenv = setmetatable, setfenv, getfenv; |
33 local pairs, ipairs = pairs, ipairs; | 34 local pairs, ipairs = pairs, ipairs; |
43 | 44 |
44 local api = {}; -- Module API container | 45 local api = {}; -- Module API container |
45 | 46 |
46 local modulemap = {}; | 47 local modulemap = {}; |
47 | 48 |
49 local m_handler_info = multitable_new(); | |
50 local m_stanza_handlers = multitable_new(); | |
48 local handler_info = {}; | 51 local handler_info = {}; |
49 local stanza_handlers = {}; | 52 local stanza_handlers = {}; |
50 | 53 |
51 local modulehelpers = setmetatable({}, { __index = _G }); | 54 local modulehelpers = setmetatable({}, { __index = _G }); |
52 | 55 |
113 end | 116 end |
114 end | 117 end |
115 | 118 |
116 end | 119 end |
117 | 120 |
118 function handle_stanza(host, origin, stanza) | 121 function _handle_stanza(host, origin, stanza) |
119 local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type; | 122 local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type; |
120 | 123 |
121 local handlers = stanza_handlers[host]; | 124 local handlers = stanza_handlers[host]; |
122 if not handlers then | 125 if not handlers then |
123 log("warn", "No handlers for %s", host); | 126 log("warn", "No handlers for %s", host); |
146 end | 149 end |
147 end | 150 end |
148 log("debug", "Stanza unhandled by any modules, xmlns: %s", stanza.attr.xmlns); | 151 log("debug", "Stanza unhandled by any modules, xmlns: %s", stanza.attr.xmlns); |
149 return false; -- we didn't handle it | 152 return false; -- we didn't handle it |
150 end | 153 end |
154 function handle_stanza(host, origin, stanza) | |
155 local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type; | |
156 if name == "iq" and xmlns == "jabber:client" then | |
157 xmlns = stanza.tags[1].attr.xmlns; | |
158 log("debug", "Stanza of type %s from %s has xmlns: %s", name, origin_type, xmlns); | |
159 end | |
160 local handlers = m_stanza_handlers:get(host, origin_type, name, xmlns); | |
161 if handlers then | |
162 log("debug", "Passing stanza to mod_%s", handler_info[handlers[1]].name); | |
163 (handlers[1])(origin, stanza); | |
164 return true; | |
165 else | |
166 log("debug", "Stanza unhandled by any modules, xmlns: %s", stanza.attr.xmlns); -- we didn't handle it | |
167 end | |
168 end | |
151 | 169 |
152 ----- API functions exposed to modules ----------- | 170 ----- API functions exposed to modules ----------- |
153 -- Must all be in api.* | 171 -- Must all be in api.* |
154 | 172 |
155 -- Returns the name of the current module | 173 -- Returns the name of the current module |
161 function api:get_host() | 179 function api:get_host() |
162 return self.host; | 180 return self.host; |
163 end | 181 end |
164 | 182 |
165 | 183 |
166 local function _add_iq_handler(module, origin_type, xmlns, handler) | 184 local function __add_iq_handler(module, origin_type, xmlns, handler) |
167 local handlers = stanza_handlers[module.host]; | 185 local handlers = stanza_handlers[module.host]; |
168 handlers[origin_type] = handlers[origin_type] or {}; | 186 handlers[origin_type] = handlers[origin_type] or {}; |
169 handlers[origin_type].iq = handlers[origin_type].iq or {}; | 187 handlers[origin_type].iq = handlers[origin_type].iq or {}; |
170 if not handlers[origin_type].iq[xmlns] then | 188 if not handlers[origin_type].iq[xmlns] then |
171 handlers[origin_type].iq[xmlns]= handler; | 189 handlers[origin_type].iq[xmlns]= handler; |
173 module:log("debug", "I now handle tag 'iq' [%s] with payload namespace '%s'", origin_type, xmlns); | 191 module:log("debug", "I now handle tag 'iq' [%s] with payload namespace '%s'", origin_type, xmlns); |
174 else | 192 else |
175 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); | 193 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); |
176 end | 194 end |
177 end | 195 end |
196 local function _add_iq_handler(module, origin_type, xmlns, handler) | |
197 local handlers = m_stanza_handlers:get(module.host, origin_type, "iq", xmlns); | |
198 if not handlers then | |
199 m_stanza_handlers:add(module.host, origin_type, "iq", xmlns, handler); | |
200 handler_info[handler] = module; | |
201 module:log("debug", "I now handle tag 'iq' [%s] with payload namespace '%s'", origin_type, xmlns); | |
202 else | |
203 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); | |
204 end | |
205 end | |
178 | 206 |
179 function api:add_iq_handler(origin_type, xmlns, handler) | 207 function api:add_iq_handler(origin_type, xmlns, handler) |
180 if not (origin_type and handler and xmlns) then return false; end | 208 if not (origin_type and handler and xmlns) then return false; end |
181 if type(origin_type) == "table" then | 209 if type(origin_type) == "table" then |
182 for _, origin_type in ipairs(origin_type) do | 210 for _, origin_type in ipairs(origin_type) do |
196 end); | 224 end); |
197 end | 225 end |
198 | 226 |
199 api.add_event_hook = eventmanager.add_event_hook; | 227 api.add_event_hook = eventmanager.add_event_hook; |
200 | 228 |
201 local function _add_handler(module, origin_type, tag, xmlns, handler) | 229 local function __add_handler(module, origin_type, tag, xmlns, handler) |
202 local handlers = stanza_handlers[module.host]; | 230 local handlers = stanza_handlers[module.host]; |
203 handlers[origin_type] = handlers[origin_type] or {}; | 231 handlers[origin_type] = handlers[origin_type] or {}; |
204 if not handlers[origin_type][tag] then | 232 if not handlers[origin_type][tag] then |
205 handlers[origin_type][tag] = handlers[origin_type][tag] or {}; | 233 handlers[origin_type][tag] = handlers[origin_type][tag] or {}; |
206 handlers[origin_type][tag][xmlns]= handler; | 234 handlers[origin_type][tag][xmlns]= handler; |
208 module:log("debug", "I now handle tag '%s' [%s] with xmlns '%s'", tag, origin_type, xmlns); | 236 module:log("debug", "I now handle tag '%s' [%s] with xmlns '%s'", tag, origin_type, xmlns); |
209 elseif handler_info[handlers[origin_type][tag]] then | 237 elseif handler_info[handlers[origin_type][tag]] then |
210 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); | 238 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); |
211 end | 239 end |
212 end | 240 end |
241 local function _add_handler(module, origin_type, tag, xmlns, handler) | |
242 local handlers = m_stanza_handlers:get(module.host, origin_type, tag, xmlns); | |
243 if not handlers then | |
244 m_stanza_handlers:add(module.host, origin_type, tag, xmlns, handler); | |
245 handler_info[handler] = module; | |
246 module:log("debug", "I now handle tag '%s' [%s] with xmlns '%s'", tag, origin_type, xmlns); | |
247 else | |
248 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); | |
249 end | |
250 end | |
213 | 251 |
214 function api:add_handler(origin_type, tag, xmlns, handler) | 252 function api:add_handler(origin_type, tag, xmlns, handler) |
215 if not (origin_type and tag and xmlns and handler) then return false; end | 253 if not (origin_type and tag and xmlns and handler) then return false; end |
216 if type(origin_type) == "table" then | 254 if type(origin_type) == "table" then |
217 for _, origin_type in ipairs(origin_type) do | 255 for _, origin_type in ipairs(origin_type) do |