Changeset

200:5e8b3cce798f

Priority based message routing, etc
author Waqas Hussain <waqas20@gmail.com>
date Sun, 02 Nov 2008 06:53:31 +0500
parents 199:eccf66b42bd7
children 201:bb1b3201bab5
files core/stanza_router.lua
diffstat 1 files changed, 18 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/core/stanza_router.lua	Sun Nov 02 06:36:42 2008 +0500
+++ b/core/stanza_router.lua	Sun Nov 02 06:53:31 2008 +0500
@@ -22,6 +22,7 @@
 local format = string.format;
 local tostring = tostring;
 local t_concat = table.concat;
+local t_insert = table.insert;
 local tonumber = tonumber;
 local s_find = string.find;
 
@@ -218,6 +219,7 @@
 	local st_from, st_to = stanza.attr.from, stanza.attr.to;
 	stanza.attr.from, stanza.attr.to = from_bare, to_bare;
 	if stanza.attr.type == "probe" then
+		log("debug", "inbound probe from "..from_bare.." for "..to_bare);
 		if rostermanager.is_contact_subscribed(node, host, from_bare) then
 			if 0 == send_presence_of_available_resources(node, host, from_bare, origin) then
 				-- TODO send last recieved unavailable presence (or we MAY do nothing, which is fine too)
@@ -281,22 +283,28 @@
 					if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then
 						handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare);
 					else -- sender is available or unavailable
-						for k in pairs(user.sessions) do -- presence broadcast to all user resources. FIXME should this be just for available resources? Do we need to check subscription?
-							if user.sessions[k].full_jid then
-								stanza.attr.to = user.sessions[k].full_jid; -- reset at the end of function
-								user.sessions[k].send(stanza);
+						for _, session in pairs(user.sessions) do -- presence broadcast to all user resources.
+							if session.full_jid then -- FIXME should this be just for available resources? Do we need to check subscription?
+								stanza.attr.to = session.full_jid; -- reset at the end of function
+								session.send(stanza);
 							end
 						end
 					end
 				elseif stanza.name == "message" then -- select a resource to recieve message
-					for k in pairs(user.sessions) do
-						if user.sessions[k].full_jid then
-							res = user.sessions[k];
-							break;
+					local priority = 0;
+					local recipients = {};
+					for _, session in pairs(user.sessions) do -- find resource with greatest priority
+						local p = session.priority;
+						if p > priority then
+							priority = p;
+							recipients = {session};
+						elseif p == priority then
+							t_insert(recipients, session);
 						end
 					end
-					-- TODO find resource with greatest priority
-					res.send(stanza);
+					for _, session in pairs(recipient) do
+						session.send(stanza);
+					end
 				else
 					-- TODO send IQ error
 				end