mod_presence: Bounce errors for invalid presence types (thanks nolan/Astro)
[prosody.git] / util / stanza.lua
index 28e26e0a407232701ce7b2bdc8af0efa41e473e3..7d1f569307a30feeff94dd44fe42fbc7766c6ff8 100644 (file)
@@ -44,11 +44,13 @@ module "stanza"
 
 stanza_mt = { __type = "stanza" };
 stanza_mt.__index = stanza_mt;
+local stanza_mt = stanza_mt;
 
 function stanza(name, attr)
-       local stanza = { name = name, attr = attr or {}, tags = {}, last_add = {}};
+       local stanza = { name = name, attr = attr or {}, tags = {} };
        return setmetatable(stanza, stanza_mt);
 end
+local stanza = stanza;
 
 function stanza_mt:query(xmlns)
        return self:tag("query", { xmlns = xmlns });
@@ -60,26 +62,27 @@ end
 
 function stanza_mt:tag(name, attrs)
        local s = stanza(name, attrs);
-       (self.last_add[#self.last_add] or self):add_direct_child(s);
-       t_insert(self.last_add, s);
+       local last_add = self.last_add;
+       if not last_add then last_add = {}; self.last_add = last_add; end
+       (last_add[#last_add] or self):add_direct_child(s);
+       t_insert(last_add, s);
        return self;
 end
 
 function stanza_mt:text(text)
-       (self.last_add[#self.last_add] or self):add_direct_child(text);
+       local last_add = self.last_add;
+       (last_add and last_add[#last_add] or self):add_direct_child(text);
        return self;
 end
 
 function stanza_mt:up()
-       t_remove(self.last_add);
+       local last_add = self.last_add;
+       if last_add then t_remove(last_add); end
        return self;
 end
 
 function stanza_mt:reset()
-       local last_add = self.last_add;
-       for i = 1,#last_add do
-               last_add[i] = nil;
-       end
+       self.last_add = nil;
        return self;
 end
 
@@ -91,7 +94,8 @@ function stanza_mt:add_direct_child(child)
 end
 
 function stanza_mt:add_child(child)
-       (self.last_add[#self.last_add] or self):add_direct_child(child);
+       local last_add = self.last_add;
+       (last_add and last_add[#last_add] or self):add_direct_child(child);
        return self;
 end
 
@@ -106,6 +110,14 @@ function stanza_mt:get_child(name, xmlns)
        end
 end
 
+function stanza_mt:get_child_text(name, xmlns)
+       local tag = self:get_child(name, xmlns);
+       if tag then
+               return tag:get_text();
+       end
+       return nil;
+end
+
 function stanza_mt:child_with_name(name)
        for _, child in ipairs(self.tags) do
                if child.name == name then return child; end
@@ -240,7 +252,7 @@ function stanza_mt.get_error(stanza)
        end
        type = error_tag.attr.type;
        
-       for child in error_tag:children() do
+       for child in error_tag:childtags() do
                if child.attr.xmlns == xmlns_stanzas then
                        if not text and child.name == "text" then
                                text = child:get_text();
@@ -252,7 +264,7 @@ function stanza_mt.get_error(stanza)
                        end
                end
        end
-       return type, condition or "undefined-condition", text or "";
+       return type, condition or "undefined-condition", text;
 end
 
 function stanza_mt.__add(s1, s2)
@@ -311,9 +323,6 @@ function deserialize(stanza)
                                end
                        end
                        stanza.tags = tags;
-                       if not stanza.last_add then
-                               stanza.last_add = {};
-                       end
                end
        end