local pairs = pairs;
local ipairs = ipairs;
local type = type;
+local unpack = unpack;
local s_gsub = string.gsub;
module "stanza"
return setmetatable(stanza, stanza_mt);
end
-function stanza_mt:iq(attrs)
- return self + stanza("iq", attrs)
-end
-function stanza_mt:message(attrs)
- return self + stanza("message", attrs)
-end
-function stanza_mt:presence(attrs)
- return self + stanza("presence", attrs)
-end
function stanza_mt:query(xmlns)
return self:tag("query", { xmlns = xmlns });
end
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
+ if stanza then
+ 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
+ end
+
+ return stanza;
+end
+
function message(attr, body)
if not body then
return stanza("message", attr);
end
function error_reply(orig, type, condition, message, clone)
- local r = reply(orig);
+ local t = reply(orig);
t.attr.type = "error";
-- TODO use clone
t:tag("error", {type = type})
return stanza("presence", attr);
end
-return _M;
\ No newline at end of file
+return _M;