Merge with waqas for MUC/routing fixes
[prosody.git] / util / stanza.lua
index 3f6c4b76dd884de2f88b4e3bf967209cb4d54069..1c1cab0e40425281b0316ebf40b7e8413a774edd 100644 (file)
@@ -1,27 +1,18 @@
--- Prosody IM v0.1
--- Copyright (C) 2008 Matthew Wild
--- Copyright (C) 2008 Waqas Hussain
+-- Prosody IM v0.3
+-- Copyright (C) 2008-2009 Matthew Wild
+-- Copyright (C) 2008-2009 Waqas Hussain
 -- 
--- This program is free software; you can redistribute it and/or
--- modify it under the terms of the GNU General Public License
--- as published by the Free Software Foundation; either version 2
--- of the License, or (at your option) any later version.
--- 
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--- GNU General Public License for more details.
--- 
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+-- This project is MIT/X11 licensed. Please see the
+-- COPYING file in the source package for more information.
 --
 
 
 local t_insert      =  table.insert;
+local t_concat      =  table.concat;
 local t_remove      =  table.remove;
 local t_concat      =  table.concat;
 local s_format      = string.format;
+local s_match      = string.match;
 local tostring      =      tostring;
 local setmetatable  =  setmetatable;
 local pairs         =         pairs;
@@ -86,11 +77,17 @@ function stanza_mt:add_child(child)
 end
 
 function stanza_mt:child_with_name(name)
-       for _, child in ipairs(self) do 
+       for _, child in ipairs(self.tags) do    
                if child.name == name then return child; end
        end
 end
 
+function stanza_mt:child_with_ns(ns)
+       for _, child in ipairs(self.tags) do    
+               if child.attr.xmlns == ns then return child; end
+       end
+end
+
 function stanza_mt:children()
        local i = 0;
        return function (a)
@@ -118,11 +115,22 @@ end
 local xml_escape = xml_escape;
 
 local function dostring(t, buf, self, xml_escape)
+       local nsid, ns, attrk = 0;
        t_insert(buf, "<");
        t_insert(buf, t.name);
        for k, v in pairs(t.attr) do if type(k) == "string" then
                t_insert(buf, " ");
-               t_insert(buf, k);
+               ns, attrk = s_match(k, "^([^|]+)|(.+)$");
+               if ns then
+                       nsid = (nsid or -1) + 1;
+                       t_insert(buf, "xmlns:ns"..nsid);
+                       t_insert(buf, "='");
+                       t_insert(buf, (xml_escape(tostring(ns))));
+                       t_insert(buf, "' ");
+                       t_insert(buf, "ns"..nsid..":"..attrk);
+               else
+                       t_insert(buf, k);
+               end
                t_insert(buf, "='");
                t_insert(buf, (xml_escape(tostring(v))));
                t_insert(buf, "'");
@@ -198,6 +206,9 @@ function deserialize(stanza)
                                end
                        end
                        stanza.tags = tags;
+                       if not stanza.last_add then
+                               stanza.last_add = {};
+                       end
                end
        end