-\r
-local t_insert = table.insert;\r
-local jid_split = require "util.jid".split;\r
-local ipairs = ipairs;\r
-local st = require "util.stanza";\r
-\r
-module "discohelper";\r
-\r
-local function addDiscoItemsHandler(self, jid, func)\r
- if self.item_handlers[jid] then\r
- t_insert(self.item_handlers[jid], func);\r
- else\r
- self.item_handlers[jid] = {func};\r
- end\r
-end\r
-\r
-local function addDiscoInfoHandler(self, jid, func)\r
- if self.info_handlers[jid] then\r
- t_insert(self.info_handlers[jid], func);\r
- else\r
- self.info_handlers[jid] = {func};\r
- end\r
-end\r
-\r
-local function handle(self, stanza)\r
- if stanza.name == "iq" and stanza.tags[1].name == "query" then\r
- local query = stanza.tags[1];\r
- local to = stanza.attr.to;\r
- local from = stanza.attr.from\r
- local node = query.attr.node or "";\r
- local to_node, to_host = jid_split(to);\r
-\r
- local reply = st.reply(stanza):query(query.attr.xmlns);\r
- local handlers;\r
- if query.attr.xmlns == "http://jabber.org/protocol/disco#info" then -- select handler set\r
- handlers = self.info_handlers;\r
- elseif query.attr.xmlns == "http://jabber.org/protocol/disco#items" then\r
- handlers = self.item_handlers;\r
- end\r
- local handler = handlers[to]; -- get the handler\r
- if not handler then -- if not found then use default handler\r
- if to_node then\r
- handler = handlers["*defaultnode"];\r
- else\r
- handler = handlers["*defaulthost"];\r
- end\r
- end\r
- local found; -- to keep track of any handlers found\r
- if handler then\r
- for _, h in ipairs(handler) do\r
- if h(reply, to, from, node) then found = true; end\r
- end\r
- end\r
- if to_node then -- handlers which get called always\r
- handler = handlers["*node"];\r
- else\r
- handler = handlers["*host"];\r
- end\r
- if handler then -- call always called handler\r
- for _, h in ipairs(handler) do\r
- if h(reply, to, from, node) then found = true; end\r
- end\r
- end\r
- if found then return reply; end -- return the reply if there was one\r
- return st.error_reply(stanza, "cancel", "service-unavailable");\r
- end\r
-end\r
-\r
-function new()\r
- return {\r
- item_handlers = {};\r
- info_handlers = {};\r
- addDiscoItemsHandler = addDiscoItemsHandler;\r
- addDiscoInfoHandler = addDiscoInfoHandler;\r
- handle = handle;\r
- };\r
-end\r
-\r
-return _M;\r
+-- Prosody IM
+-- Copyright (C) 2008-2009 Matthew Wild
+-- Copyright (C) 2008-2009 Waqas Hussain
+--
+-- This project is MIT/X11 licensed. Please see the
+-- COPYING file in the source package for more information.
+--
+
+
+
+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;
+ local found; -- to keep track of any handlers found
+ 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
+ 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
+ if handler then
+ 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;