diff options
author | Matthew Wild <mwild1@gmail.com> | 2008-10-09 00:50:45 +0100 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2008-10-09 00:50:45 +0100 |
commit | 5ec7a9c8b4d215817cb158d824be869ff2441dbc (patch) | |
tree | 8b23999f066a4bfbe93a5f4f011e3831d8719dd9 /util/stanza.lua | |
parent | ebf2876664150333b33e6ef2f359df6dab3dabfe (diff) | |
download | prosody-5ec7a9c8b4d215817cb158d824be869ff2441dbc.tar.gz prosody-5ec7a9c8b4d215817cb158d824be869ff2441dbc.zip |
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Diffstat (limited to 'util/stanza.lua')
-rw-r--r-- | util/stanza.lua | 37 |
1 files changed, 36 insertions, 1 deletions
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; |