17 local handlers = {}; |
17 local handlers = {}; |
18 |
18 |
19 local modulehelpers = setmetatable({}, { __index = _G }); |
19 local modulehelpers = setmetatable({}, { __index = _G }); |
20 |
20 |
21 function modulehelpers.add_iq_handler(origin_type, xmlns, handler) |
21 function modulehelpers.add_iq_handler(origin_type, xmlns, handler) |
|
22 if not (origin_type and handler and xmlns) then return false; end |
22 handlers[origin_type] = handlers[origin_type] or {}; |
23 handlers[origin_type] = handlers[origin_type] or {}; |
23 handlers[origin_type].iq = handlers[origin_type].iq or {}; |
24 handlers[origin_type].iq = handlers[origin_type].iq or {}; |
24 if not handlers[origin_type].iq[xmlns] then |
25 if not handlers[origin_type].iq[xmlns] then |
25 handlers[origin_type].iq[xmlns]= handler; |
26 handlers[origin_type].iq[xmlns]= handler; |
26 handler_info[handler] = getfenv(2).module; |
27 handler_info[handler] = getfenv(2).module; |
28 else |
29 else |
29 log("warning", "mod_%s wants to handle tag 'iq' with query namespace '%s' but mod_%s already handles that", getfenv(2).module.name, xmlns, handler_info[handlers[origin_type].iq[xmlns]].module.name); |
30 log("warning", "mod_%s wants to handle tag 'iq' with query namespace '%s' but mod_%s already handles that", getfenv(2).module.name, xmlns, handler_info[handlers[origin_type].iq[xmlns]].module.name); |
30 end |
31 end |
31 end |
32 end |
32 |
33 |
33 function modulehelpers.add_handler(origin_type, tag, handler) |
34 function modulehelpers.add_handler(origin_type, tag, xmlns, handler) |
|
35 if not (origin_type and tag and xmlns and handler) then return false; end |
34 handlers[origin_type] = handlers[origin_type] or {}; |
36 handlers[origin_type] = handlers[origin_type] or {}; |
35 if not handlers[origin_type][tag] then |
37 if not handlers[origin_type][tag] then |
36 handlers[origin_type][tag]= handler; |
38 handlers[origin_type][tag]= handler; |
37 handler_info[handler] = getfenv(2).module; |
39 handler_info[handler] = getfenv(2).module; |
38 log("debug", "mod_%s now handles tag '%s'", getfenv(2).module.name, tag); |
40 log("debug", "mod_%s now handles tag '%s'", getfenv(2).module.name, tag); |
78 log("debug", "Passing stanza to mod_%s", handler_info[handler].name); |
80 log("debug", "Passing stanza to mod_%s", handler_info[handler].name); |
79 return handler(origin, stanza) or true; |
81 return handler(origin, stanza) or true; |
80 end |
82 end |
81 |
83 |
82 end |
84 end |
83 --FIXME: All iq's must be replied to, here we should return service-unavailable I think |
|
84 elseif handlers[origin_type] then |
85 elseif handlers[origin_type] then |
85 local handler = handlers[origin_type][name]; |
86 local handler = handlers[origin_type][name]; |
86 if handler then |
87 if handler then |
87 log("debug", "Passing stanza to mod_%s", handler_info[handler].name); |
88 log("debug", "Passing stanza to mod_%s", handler_info[handler].name); |
88 return handler(origin, stanza) or true; |
89 return handler(origin, stanza) or true; |