core/componentmanager.lua

changeset 939
b832f786af62
parent 894
2c0b9e3c11c3
child 945
699f0c46526a
equal deleted inserted replaced
938:663f75dd7b42 939:b832f786af62
17 local hosts = hosts; 17 local hosts = hosts;
18 18
19 local pairs, type, tostring = pairs, type, tostring; 19 local pairs, type, tostring = pairs, type, tostring;
20 20
21 local components = {}; 21 local components = {};
22
23 local disco_items = require "util.multitable".new();
24 local NULL = {};
25 require "core.discomanager".addDiscoItemsHandler("*host", function(reply, to, from, node)
26 if #node == 0 and hosts[to] then
27 for jid in pairs(disco_items:get(to) or NULL) do
28 reply:tag("item", {jid = jid}):up();
29 end
30 return true;
31 end
32 end);
33
22 34
23 module "componentmanager" 35 module "componentmanager"
24 36
25 function load_enabled_components(config) 37 function load_enabled_components(config)
26 local defined_hosts = config or configmanager.getconfig(); 38 local defined_hosts = config or configmanager.getconfig();
62 74
63 function register_component(host, component, session) 75 function register_component(host, component, session)
64 if not hosts[host] or (hosts[host].type == 'component' and not hosts[host].connected) then 76 if not hosts[host] or (hosts[host].type == 'component' and not hosts[host].connected) then
65 components[host] = component; 77 components[host] = component;
66 hosts[host] = session or create_component(host, component); 78 hosts[host] = session or create_component(host, component);
67 79 -- add to disco_items
80 if not(host:find("@", 1, true) or host:find("/", 1, true)) and host:find(".", 1, true) then
81 disco_items:set(host:sub(host:find(".", 1, true)+1), host, true);
82 end
68 -- FIXME only load for a.b.c if b.c has dialback, and/or check in config 83 -- FIXME only load for a.b.c if b.c has dialback, and/or check in config
69 modulemanager.load(host, "dialback"); 84 modulemanager.load(host, "dialback");
70 log("debug", "component added: "..host); 85 log("debug", "component added: "..host);
71 return session or hosts[host]; 86 return session or hosts[host];
72 else 87 else
77 function deregister_component(host) 92 function deregister_component(host)
78 if components[host] then 93 if components[host] then
79 modulemanager.unload(host, "dialback"); 94 modulemanager.unload(host, "dialback");
80 components[host] = nil; 95 components[host] = nil;
81 hosts[host] = nil; 96 hosts[host] = nil;
97 -- remove from disco_items
98 if not(host:find("@", 1, true) or host:find("/", 1, true)) and host:find(".", 1, true) then
99 disco_items:remove(host:sub(host:find(".", 1, true)+1), host);
100 end
82 log("debug", "component removed: "..host); 101 log("debug", "component removed: "..host);
83 return true; 102 return true;
84 else 103 else
85 log("error", "Attempt to remove component for non-existing host: "..host); 104 log("error", "Attempt to remove component for non-existing host: "..host);
86 end 105 end

mercurial