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 |