diff options
author | Matthew Wild <mwild1@gmail.com> | 2008-11-23 05:03:36 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2008-11-23 05:03:36 +0000 |
commit | b94fd79634deabef5f4761825495e0940aec0ac6 (patch) | |
tree | be1d302b3f7e9e812e294b95cad8750e1a690ac6 /util/discohelper.lua | |
parent | 21df2699e2ffd587a014c9c345ca1161d6a4fc5c (diff) | |
parent | 43c503330db3d5b1613c1babcd5ef150d2ccf247 (diff) | |
download | prosody-b94fd79634deabef5f4761825495e0940aec0ac6.tar.gz prosody-b94fd79634deabef5f4761825495e0940aec0ac6.zip |
Merge from waqas
Diffstat (limited to 'util/discohelper.lua')
-rw-r--r-- | util/discohelper.lua | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/util/discohelper.lua b/util/discohelper.lua new file mode 100644 index 00000000..4ac8f227 --- /dev/null +++ b/util/discohelper.lua @@ -0,0 +1,79 @@ +
+local t_insert = table.insert;
+local jid_split = require "util.jid".split;
+local ipairs = ipairs;
+local st = require "util.stanza";
+
+module "discohelper";
+
+local function addDiscoItemsHandler(self, jid, func)
+ if self.item_handlers[jid] then
+ t_insert(self.item_handlers[jid], func);
+ else
+ self.item_handlers[jid] = {func};
+ end
+end
+
+local function addDiscoInfoHandler(self, jid, func)
+ if self.info_handlers[jid] then
+ t_insert(self.info_handlers[jid], func);
+ else
+ self.info_handlers[jid] = {func};
+ end
+end
+
+local function handle(self, stanza)
+ if stanza.name == "iq" and stanza.tags[1].name == "query" then
+ local query = stanza.tags[1];
+ local to = stanza.attr.to;
+ local from = stanza.attr.from
+ local node = query.attr.node or "";
+ local to_node, to_host = jid_split(to);
+
+ local reply = st.reply(stanza):query(query.attr.xmlns);
+ local handlers;
+ if query.attr.xmlns == "http://jabber.org/protocol/disco#info" then -- select handler set
+ handlers = self.info_handlers;
+ elseif query.attr.xmlns == "http://jabber.org/protocol/disco#items" then
+ handlers = self.item_handlers;
+ end
+ local handler = handlers[to]; -- get the handler
+ if not handler then -- if not found then use default handler
+ if to_node then
+ handler = handlers["*defaultnode"];
+ else
+ handler = handlers["*defaulthost"];
+ end
+ end
+ local found; -- to keep track of any handlers found
+ if handler then
+ for _, h in ipairs(handler) do
+ if h(reply, to, from, node) then found = true; end
+ end
+ end
+ if to_node then -- handlers which get called always
+ handler = handlers["*node"];
+ else
+ handler = handlers["*host"];
+ end
+ if handler then -- call always called handler
+ for _, h in ipairs(handler) do
+ if h(reply, to, from, node) then found = true; end
+ end
+ end
+ if found then return reply; end -- return the reply if there was one
+ return st.error_reply(stanza, "cancel", "service-unavailable");
+ end
+end
+
+function new()
+ return {
+ item_handlers = {};
+ info_handlers = {};
+ addDiscoItemsHandler = addDiscoItemsHandler;
+ addDiscoInfoHandler = addDiscoInfoHandler;
+ handle = handle;
+ };
+end
+
+return _M;
|