util.pposix: Compatibility with Solaris systems (thanks Filip)
[prosody.git] / util / dataforms.lua
index 92d4f619d7ea2566d9d4c4c1636c3e76ab5c29fd..ed62f9b185dfdc60a23ca287987344d9c9e14617 100644 (file)
@@ -1,5 +1,16 @@
+-- Prosody IM
+-- Copyright (C) 2008-2009 Matthew Wild
+-- Copyright (C) 2008-2009 Waqas Hussain
+-- 
+-- This project is MIT/X11 licensed. Please see the
+-- COPYING file in the source package for more information.
+--
+
 local setmetatable = setmetatable;
 local pairs, ipairs = pairs, ipairs;
+local tostring, type = tostring, type;
+local t_concat = table.concat;
+
 local st = require "util.stanza";
 
 module "dataforms"
@@ -13,10 +24,8 @@ function new(layout)
        return setmetatable(layout, form_mt);
 end
 
-local form_x_attr = { xmlns = xmlns_forms };
-
 function form_t.form(layout, data)
-       local form = st.stanza("x", form_x_attr);
+       local form = st.stanza("x", { xmlns = xmlns_forms, type = "form" });
        if layout.title then
                form:tag("title"):text(layout.title):up();
        end
@@ -28,18 +37,20 @@ function form_t.form(layout, data)
                -- Add field tag
                form:tag("field", { type = field_type, var = field.name, label = field.label });
 
-               local value = data[field.name];
+               local value = data[field.name] or field.value;
                
                -- Add value, depending on type
                if field_type == "hidden" then
                        if type(value) == "table" then
                                -- Assume an XML snippet
-                               form:add_child(value);
+                               form:tag("value")
+                                       :add_child(value)
+                                       :up();
                        elseif value then
-                               form:text(tostring(value));
+                               form:tag("value"):text(tostring(value)):up();
                        end
                elseif field_type == "boolean" then
-                       form:tag("value"):text((value and "1") or "0");
+                       form:tag("value"):text((value and "1") or "0"):up();
                elseif field_type == "fixed" then
                        
                elseif field_type == "jid-multi" then
@@ -67,10 +78,65 @@ function form_t.form(layout, data)
        return form;
 end
 
+local field_readers = {};
+
 function form_t.data(layout, stanza)
+       local data = {};
        
+       for field_tag in stanza:childtags() do
+               local field_type = field_tag.attr.type;
+               
+               local reader = field_readers[field_type];
+               if reader then
+                       data[field_tag.attr.var] = reader(field_tag);
+               end
+               
+       end
+       return data;
 end
 
+field_readers["text-single"] = 
+       function (field_tag)
+               local value = field_tag:child_with_name("value");
+               if value then
+                       return value[1];
+               end
+       end
+
+field_readers["text-private"] = 
+       field_readers["text-single"];
+
+field_readers["text-multi"] = 
+       function (field_tag)
+               local result = {};
+               for value_tag in field_tag:childtags() do
+                       if value_tag.name == "value" then
+                               result[#result+1] = value_tag[1];
+                       end
+               end
+               return t_concat(result, "\n");
+       end
+
+field_readers["boolean"] = 
+       function (field_tag)
+               local value = field_tag:child_with_name("value");
+               if value then
+                       if value[1] == "1" or value[1] == "true" then
+                               return true;
+                       else
+                               return false;
+                       end
+               end             
+       end
+
+field_readers["hidden"] = 
+       function (field_tag)
+               local value = field_tag:child_with_name("value");
+               if value then
+                       return value[1];
+               end
+       end
+       
 return _M;