Priority based message routing, etc

Sun, 02 Nov 2008 06:53:31 +0500

author
Waqas Hussain <waqas20@gmail.com>
date
Sun, 02 Nov 2008 06:53:31 +0500
changeset 200
5e8b3cce798f
parent 199
eccf66b42bd7
child 201
bb1b3201bab5

Priority based message routing, etc

core/stanza_router.lua file | annotate | diff | comparison | revisions
--- 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

mercurial