Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.

Thu, 09 Oct 2008 00:50:45 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Thu, 09 Oct 2008 00:50:45 +0100
changeset 90
da468ed49a7b
parent 89
081e920dc74e
child 91
6d66eb6b24cb

Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.

plugins/mod_vcard.lua file | annotate | diff | comparison | revisions
util/stanza.lua file | annotate | diff | comparison | revisions
--- a/plugins/mod_vcard.lua	Thu Oct 09 03:40:16 2008 +0500
+++ b/plugins/mod_vcard.lua	Thu Oct 09 00:50:45 2008 +0100
@@ -18,10 +18,10 @@
 					if to then
 						local node, host = jid_split(to);
 						if hosts[host] and hosts[host].type == "local" then
-							vCard = datamanager.load(node, host, "vCard"); -- load vCard for user or server
+							vCard = st.deserialize(datamanager.load(node, host, "vCard")); -- load vCard for user or server
 						end
 					else
-						vCard = datamanager.load(session.username, session.host, "vCard");-- load user's own vCard
+						vCard = st.deserialize(datamanager.load(session.username, session.host, "vCard"));-- load user's own vCard
 					end
 					if vCard then
 						local iq = st.reply(stanza);
@@ -32,7 +32,7 @@
 					end
 				elseif stanza.attr.type == "set" then
 					if not to or to == session.username.."@"..session.host then
-						if datamanager.store(session.username, session.host, "vCard", stanza.tags[1]) then
+						if datamanager.store(session.username, session.host, "vCard", st.preserialize(stanza.tags[1])) then
 							send(session, st.reply(stanza));
 						else
 							-- TODO unable to write file, file may be locked, etc, what's the correct error?
--- a/util/stanza.lua	Thu Oct 09 03:40:16 2008 +0500
+++ b/util/stanza.lua	Thu Oct 09 00:50:45 2008 +0100
@@ -6,6 +6,7 @@
 local pairs         =         pairs;
 local ipairs        =        ipairs;
 local type          =          type;
+local unpack        =        unpack;
 local s_gsub        =   string.gsub;
 module "stanza"
 
@@ -107,6 +108,40 @@
         end
 end
 
+function preserialize(stanza)
+	local s = { name = stanza.name, attr = stanza.attr };
+	for _, child in ipairs(stanza) do
+		if type(child) == "table" then
+			t_insert(s, preserialize(child));
+		else
+			t_insert(s, child);
+		end
+	end
+	return s;
+end
+
+function deserialize(stanza)
+	-- Set metatable
+	setmetatable(stanza, stanza_mt);
+	for _, child in ipairs(stanza) do
+		if type(child) == "table" then
+			deserialize(child);
+		end
+	end
+	if not stanza.tags then
+		-- Rebuild tags
+		local tags = {};
+		for _, child in ipairs(stanza) do
+			if type(child) == "table" then
+				t_insert(tags, child);
+			end
+		end
+		stanza.tags = tags;
+	end
+	
+	return stanza;
+end
+
 function message(attr, body)
 	if not body then
 		return stanza("message", attr);
@@ -137,4 +172,4 @@
 	return stanza("presence", attr);
 end
 
-return _M;
\ No newline at end of file
+return _M;

mercurial