44 |
44 |
45 local api = {}; -- Module API container |
45 local api = {}; -- Module API container |
46 |
46 |
47 local modulemap = {}; |
47 local modulemap = {}; |
48 |
48 |
49 local m_handler_info = multitable_new(); |
49 local stanza_handlers = multitable_new(); |
50 local m_stanza_handlers = multitable_new(); |
|
51 local handler_info = {}; |
50 local handler_info = {}; |
52 local stanza_handlers = {}; |
|
53 |
51 |
54 local modulehelpers = setmetatable({}, { __index = _G }); |
52 local modulehelpers = setmetatable({}, { __index = _G }); |
55 |
53 |
56 -- Load modules when a host is activated |
54 -- Load modules when a host is activated |
57 function load_modules_for_host(host) |
55 function load_modules_for_host(host) |
75 return nil, err; |
73 return nil, err; |
76 end |
74 end |
77 |
75 |
78 if not modulemap[host] then |
76 if not modulemap[host] then |
79 modulemap[host] = {}; |
77 modulemap[host] = {}; |
80 stanza_handlers[host] = {}; |
|
81 elseif modulemap[host][module_name] then |
78 elseif modulemap[host][module_name] then |
82 log("warn", "%s is already loaded for %s, so not loading again", module_name, host); |
79 log("warn", "%s is already loaded for %s, so not loading again", module_name, host); |
83 return nil, "module-already-loaded"; |
80 return nil, "module-already-loaded"; |
84 end |
81 end |
85 |
82 |
122 local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type; |
119 local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type; |
123 if name == "iq" and xmlns == "jabber:client" then |
120 if name == "iq" and xmlns == "jabber:client" then |
124 xmlns = stanza.tags[1].attr.xmlns; |
121 xmlns = stanza.tags[1].attr.xmlns; |
125 log("debug", "Stanza of type %s from %s has xmlns: %s", name, origin_type, xmlns); |
122 log("debug", "Stanza of type %s from %s has xmlns: %s", name, origin_type, xmlns); |
126 end |
123 end |
127 local handlers = m_stanza_handlers:get(host, origin_type, name, xmlns); |
124 local handlers = stanza_handlers:get(host, origin_type, name, xmlns); |
128 if handlers then |
125 if handlers then |
129 log("debug", "Passing stanza to mod_%s", handler_info[handlers[1]].name); |
126 log("debug", "Passing stanza to mod_%s", handler_info[handlers[1]].name); |
130 (handlers[1])(origin, stanza); |
127 (handlers[1])(origin, stanza); |
131 return true; |
128 return true; |
132 else |
129 else |
146 function api:get_host() |
143 function api:get_host() |
147 return self.host; |
144 return self.host; |
148 end |
145 end |
149 |
146 |
150 local function _add_handler(module, origin_type, tag, xmlns, handler) |
147 local function _add_handler(module, origin_type, tag, xmlns, handler) |
151 local handlers = m_stanza_handlers:get(module.host, origin_type, tag, xmlns); |
148 local handlers = stanza_handlers:get(module.host, origin_type, tag, xmlns); |
152 local msg = (tag == "iq") and "namespace" or "payload namespace"; |
149 local msg = (tag == "iq") and "namespace" or "payload namespace"; |
153 if not handlers then |
150 if not handlers then |
154 m_stanza_handlers:add(module.host, origin_type, tag, xmlns, handler); |
151 stanza_handlers:add(module.host, origin_type, tag, xmlns, handler); |
155 handler_info[handler] = module; |
152 handler_info[handler] = module; |
156 module:log("debug", "I now handle tag '%s' [%s] with %s '%s'", tag, origin_type, msg, xmlns); |
153 module:log("debug", "I now handle tag '%s' [%s] with %s '%s'", tag, origin_type, msg, xmlns); |
157 else |
154 else |
158 module:log("warn", "I wanted to handle tag '%s' [%s] with %s '%s' but mod_%s already handles that", tag, origin_type, msg, xmlns, handler_info[handlers[1]].module.name); |
155 module:log("warn", "I wanted to handle tag '%s' [%s] with %s '%s' but mod_%s already handles that", tag, origin_type, msg, xmlns, handler_info[handlers[1]].module.name); |
159 end |
156 end |