Changed order of checking for component hosts to check the full and bare JIDs before...
[prosody.git] / util / stanza.lua
index 5a6ba8c5305c7ce00f2e5bf70ab30c8cf9db64c1..dd05ddaba440878a186fe2596af658b310bbfe67 100644 (file)
@@ -1,5 +1,26 @@
+-- Prosody IM v0.2
+-- Copyright (C) 2008 Matthew Wild
+-- Copyright (C) 2008 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.
+--
+
+
 local t_insert      =  table.insert;
 local t_remove      =  table.remove;
+local t_concat      =  table.concat;
 local s_format      = string.format;
 local tostring      =      tostring;
 local setmetatable  =  setmetatable;
@@ -7,10 +28,10 @@ local pairs         =         pairs;
 local ipairs        =        ipairs;
 local type          =          type;
 local next          =          next;
-local print          =          print;
+local print         =         print;
 local unpack        =        unpack;
 local s_gsub        =   string.gsub;
-local os = os;
+local os            =            os;
 
 local do_pretty_printing = not os.getenv("WINDIR");
 local getstyle, getstring = require "util.termcolours".getstyle, require "util.termcolours".getstring;
@@ -30,6 +51,11 @@ end
 function stanza_mt:query(xmlns)
        return self:tag("query", { xmlns = xmlns });
 end
+
+function stanza_mt:body(text, attr)
+       return self:tag("body", attr):text(text);
+end
+
 function stanza_mt:tag(name, attrs)
        local s = stanza(name, attrs);
        (self.last_add[#self.last_add] or self):add_direct_child(s);
@@ -91,27 +117,40 @@ end
 
 local xml_escape = xml_escape;
 
-function stanza_mt.__tostring(t)
-       local children_text = "";
+local function dostring(t, buf, self, xml_escape)
+       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);
+               t_insert(buf, "='");
+               t_insert(buf, (xml_escape(tostring(v))));
+               t_insert(buf, "'");
+       end end
+       t_insert(buf, ">");
        for n, child in ipairs(t) do
-               if type(child) == "string" then 
-                       children_text = children_text .. xml_escape(child);
+               if child.name then 
+                       self(child, buf, self, xml_escape);
                else
-                       children_text = children_text .. tostring(child);
+                       t_insert(buf, (xml_escape(child)));
                end
        end
+       t_insert(buf, "</");
+       t_insert(buf, t.name);
+       t_insert(buf, ">");
+end
 
-       local attr_string = "";
-       if t.attr then
-               for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(" %s='%s'", k, tostring(v)); end end
-       end
-       return s_format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name);
+function stanza_mt.__tostring(t)
+       local buf = {};
+       dostring(t, buf, dostring, xml_escape);
+       return t_concat(buf);
 end
 
+
 function stanza_mt.top_tag(t)
        local attr_string = "";
        if t.attr then
-               for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(" %s='%s'", k, tostring(v)); end end
+               for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(" %s='%s'", k, xml_escape(tostring(v))); end end
        end
        return s_format("<%s%s>", t.name, attr_string);
 end