Software /
code /
prosody
Changeset
90:da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 09 Oct 2008 00:50:45 +0100 |
parents | 89:081e920dc74e |
children | 91:6d66eb6b24cb |
files | plugins/mod_vcard.lua util/stanza.lua |
diffstat | 2 files changed, 39 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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;