Diff

core/stanza_router.lua @ 251:5b6dec537914

Merge from waqas
author Matthew Wild <mwild1@gmail.com>
date Thu, 13 Nov 2008 16:58:29 +0000
parent 250:9f66ede8deeb
child 257:762274c98040
line wrap: on
line diff
--- a/core/stanza_router.lua	Thu Nov 13 16:47:16 2008 +0000
+++ b/core/stanza_router.lua	Thu Nov 13 16:58:29 2008 +0000
@@ -13,6 +13,7 @@
 
 local rostermanager = require "core.rostermanager";
 local sessionmanager = require "core.sessionmanager";
+local offlinemanager = require "core.offlinemanager";
 
 local s2s_verify_dialback = require "core.s2smanager".verify_dialback;
 local s2s_make_authenticated = require "core.s2smanager".make_authenticated;
@@ -149,6 +150,10 @@
 							core_route_stanza(origin, request);
 						end
 					end
+					for _, msg in ipairs(offlinemanager.load(node, host) or {}) do
+						origin.send(msg); -- FIXME do we need to modify to/from in any way?
+					end
+					offlinemanager.deleteAll(node, host);
 				end
 				origin.priority = 0;
 				if stanza.attr.type == "unavailable" then
@@ -168,11 +173,16 @@
 				end
 				stanza.attr.to = nil; -- reset it
 			else
-				-- TODO error, bad type
+				log("warn", "Unhandled c2s presence: %s", tostring(stanza));
+				origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); -- FIXME correct error?
 			end
+		else
+			log("warn", "Unhandled c2s stanza: %s", tostring(stanza));
+			origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); -- FIXME correct error?
 		end -- TODO handle other stanzas
 	else
-		log("warn", "Unhandled origin: %s", origin.type); -- FIXME reply with error
+		log("warn", "Unhandled origin: %s", origin.type);
+		origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); -- FIXME correct error?
 	end
 end
 
@@ -328,8 +338,14 @@
 							t_insert(recipients, session);
 						end
 					end
+					local count = 0;
 					for _, session in pairs(recipients) do
 						session.send(stanza);
+						count = count + 1;
+					end
+					if count == 0 then
+						offlinemanager.store(node, host, stanza);
+						-- TODO deal with storage errors
 					end
 				else
 					-- TODO send IQ error
@@ -349,7 +365,12 @@
 						-- TODO send unavailable presence or unsubscribed
 					end
 				elseif stanza.name == "message" then
-					-- TODO send message error, or store offline messages
+					if stanza.attr.type == "chat" or stanza.attr.type == "normal" or not stanza.attr.type then
+						offlinemanager.store(node, host, stanza);
+						-- FIXME don't store messages with only chat state notifications
+					end
+					-- TODO allow configuration of offline storage
+					-- TODO send error if not storing offline
 				elseif stanza.name == "iq" then
 					-- TODO send IQ error
 				end