aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2008-10-09 00:50:45 +0100
committerMatthew Wild <mwild1@gmail.com>2008-10-09 00:50:45 +0100
commit5ec7a9c8b4d215817cb158d824be869ff2441dbc (patch)
tree8b23999f066a4bfbe93a5f4f011e3831d8719dd9
parentebf2876664150333b33e6ef2f359df6dab3dabfe (diff)
downloadprosody-5ec7a9c8b4d215817cb158d824be869ff2441dbc.tar.gz
prosody-5ec7a9c8b4d215817cb158d824be869ff2441dbc.zip
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
-rw-r--r--plugins/mod_vcard.lua6
-rw-r--r--util/stanza.lua37
2 files changed, 39 insertions, 4 deletions
diff --git a/plugins/mod_vcard.lua b/plugins/mod_vcard.lua
index 356b9836..a2296132 100644
--- a/plugins/mod_vcard.lua
+++ b/plugins/mod_vcard.lua
@@ -18,10 +18,10 @@ add_iq_handler("c2s", "vcard-temp",
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 @@ add_iq_handler("c2s", "vcard-temp",
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?
diff --git a/util/stanza.lua b/util/stanza.lua
index 06991cda..a4fd0f82 100644
--- a/util/stanza.lua
+++ b/util/stanza.lua
@@ -6,6 +6,7 @@ local setmetatable = setmetatable;
local pairs = pairs;
local ipairs = ipairs;
local type = type;
+local unpack = unpack;
local s_gsub = string.gsub;
module "stanza"
@@ -107,6 +108,40 @@ do
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 @@ function presence(attr)
return stanza("presence", attr);
end
-return _M; \ No newline at end of file
+return _M;