util/xmlrpc.lua

Wed, 15 Jul 2009 01:40:11 +0500

author
Waqas Hussain <waqas20@gmail.com>
date
Wed, 15 Jul 2009 01:40:11 +0500
changeset 1554
06030af44fad
parent 1523
841d61be198f
child 2923
b7049746bd29
permissions
-rw-r--r--

util.xmlrpc: Fixed table serialization (regression introduced in previous change)

1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1498
diff changeset
1 -- Prosody IM
874
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
2 -- Copyright (C) 2008-2009 Matthew Wild
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
3 -- Copyright (C) 2008-2009 Waqas Hussain
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
4 --
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
6 -- COPYING file in the source package for more information.
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
7 --
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
8
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
9
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
10 local pairs = pairs;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
11 local type = type;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
12 local error = error;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
13 local t_concat = table.concat;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
14 local t_insert = table.insert;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
15 local tostring = tostring;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
16 local tonumber = tonumber;
1498
481dfc89047a util.xmlrpc: Support for multiple parameters in requests
Matthew Wild <mwild1@gmail.com>
parents: 1497
diff changeset
17 local select = select;
874
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
18 local st = require "util.stanza";
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
19
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
20 module "xmlrpc"
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
21
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
22 local _lua_to_xmlrpc;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
23 local map = {
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
24 table=function(stanza, object)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
25 stanza:tag("struct");
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
26 for name, value in pairs(object) do
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
27 stanza:tag("member");
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
28 stanza:tag("name"):text(tostring(name)):up();
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
29 stanza:tag("value");
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
30 _lua_to_xmlrpc(stanza, value);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
31 stanza:up();
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
32 stanza:up();
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
33 end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
34 stanza:up();
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
35 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
36 boolean=function(stanza, object)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
37 stanza:tag("boolean"):text(object and "1" or "0"):up();
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
38 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
39 string=function(stanza, object)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
40 stanza:tag("string"):text(object):up();
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
41 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
42 number=function(stanza, object)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
43 stanza:tag("int"):text(tostring(object)):up();
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
44 end;
888
1059230969c3 util/xmlrpc: Added <nil/> extension to RPC functions (allowing nil parameters and return values)
Waqas Hussain <waqas20@gmail.com>
parents: 874
diff changeset
45 ["nil"]=function(stanza, object) -- nil extension
1059230969c3 util/xmlrpc: Added <nil/> extension to RPC functions (allowing nil parameters and return values)
Waqas Hussain <waqas20@gmail.com>
parents: 874
diff changeset
46 stanza:tag("nil"):up();
1059230969c3 util/xmlrpc: Added <nil/> extension to RPC functions (allowing nil parameters and return values)
Waqas Hussain <waqas20@gmail.com>
parents: 874
diff changeset
47 end;
874
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
48 };
1554
06030af44fad util.xmlrpc: Fixed table serialization (regression introduced in previous change)
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
49 _lua_to_xmlrpc = function(stanza, object)
06030af44fad util.xmlrpc: Fixed table serialization (regression introduced in previous change)
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
50 local h = map[type(object)];
06030af44fad util.xmlrpc: Fixed table serialization (regression introduced in previous change)
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
51 if h then
06030af44fad util.xmlrpc: Fixed table serialization (regression introduced in previous change)
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
52 h(stanza, object);
06030af44fad util.xmlrpc: Fixed table serialization (regression introduced in previous change)
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
53 else
06030af44fad util.xmlrpc: Fixed table serialization (regression introduced in previous change)
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
54 error("Type not supported by XML-RPC: " .. type(object));
874
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
55 end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
56 end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
57 function create_response(object)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
58 local stanza = st.stanza("methodResponse"):tag("params"):tag("param"):tag("value");
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
59 _lua_to_xmlrpc(stanza, object);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
60 stanza:up():up():up();
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
61 return stanza;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
62 end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
63 function create_error_response(faultCode, faultString)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
64 local stanza = st.stanza("methodResponse"):tag("fault"):tag("value");
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
65 _lua_to_xmlrpc(stanza, {faultCode=faultCode, faultString=faultString});
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
66 stanza:up():up();
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
67 return stanza;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
68 end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
69
1498
481dfc89047a util.xmlrpc: Support for multiple parameters in requests
Matthew Wild <mwild1@gmail.com>
parents: 1497
diff changeset
70 function create_request(method_name, ...)
1497
4c2c403ca04b util.xmlrpc: Add create_request
Matthew Wild <mwild1@gmail.com>
parents: 894
diff changeset
71 local stanza = st.stanza("methodCall")
4c2c403ca04b util.xmlrpc: Add create_request
Matthew Wild <mwild1@gmail.com>
parents: 894
diff changeset
72 :tag("methodName"):text(method_name):up()
1498
481dfc89047a util.xmlrpc: Support for multiple parameters in requests
Matthew Wild <mwild1@gmail.com>
parents: 1497
diff changeset
73 :tag("params");
1554
06030af44fad util.xmlrpc: Fixed table serialization (regression introduced in previous change)
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
74 for i=1,select('#', ...) do
06030af44fad util.xmlrpc: Fixed table serialization (regression introduced in previous change)
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
75 stanza:tag("param"):tag("value");
06030af44fad util.xmlrpc: Fixed table serialization (regression introduced in previous change)
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
76 _lua_to_xmlrpc(stanza, select(i, ...));
06030af44fad util.xmlrpc: Fixed table serialization (regression introduced in previous change)
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
77 stanza:up():up();
06030af44fad util.xmlrpc: Fixed table serialization (regression introduced in previous change)
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
78 end
1497
4c2c403ca04b util.xmlrpc: Add create_request
Matthew Wild <mwild1@gmail.com>
parents: 894
diff changeset
79 stanza:up():up():up();
4c2c403ca04b util.xmlrpc: Add create_request
Matthew Wild <mwild1@gmail.com>
parents: 894
diff changeset
80 return stanza;
4c2c403ca04b util.xmlrpc: Add create_request
Matthew Wild <mwild1@gmail.com>
parents: 894
diff changeset
81 end
874
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
82
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
83 local _xmlrpc_to_lua;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
84 local int_parse = function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
85 if #stanza.tags ~= 0 or #stanza == 0 then error("<"..stanza.name.."> must have a single text child"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
86 local n = tonumber(t_concat(stanza));
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
87 if n then return n; end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
88 error("Failed to parse content of <"..stanza.name..">");
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
89 end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
90 local rmap = {
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
91 methodCall=function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
92 if #stanza.tags ~= 2 then error("<methodCall> must have exactly two subtags"); end -- FIXME <params> is optional
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
93 if stanza.tags[1].name ~= "methodName" then error("First <methodCall> child tag must be <methodName>") end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
94 if stanza.tags[2].name ~= "params" then error("Second <methodCall> child tag must be <params>") end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
95 return _xmlrpc_to_lua(stanza.tags[1]), _xmlrpc_to_lua(stanza.tags[2]);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
96 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
97 methodName=function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
98 if #stanza.tags ~= 0 then error("<methodName> must not have any subtags"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
99 if #stanza == 0 then error("<methodName> must have text content"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
100 return t_concat(stanza);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
101 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
102 params=function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
103 local t = {};
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
104 for _, child in pairs(stanza.tags) do
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
105 if child.name ~= "param" then error("<params> can only have <param> children"); end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
106 t_insert(t, _xmlrpc_to_lua(child));
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
107 end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
108 return t;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
109 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
110 param=function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
111 if not(#stanza.tags == 1 and stanza.tags[1].name == "value") then error("<param> must have exactly one <value> child"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
112 return _xmlrpc_to_lua(stanza.tags[1]);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
113 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
114 value=function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
115 if #stanza.tags == 0 then return t_concat(stanza); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
116 if #stanza.tags ~= 1 then error("<value> must have a single child"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
117 return _xmlrpc_to_lua(stanza.tags[1]);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
118 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
119 int=int_parse;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
120 i4=int_parse;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
121 double=int_parse;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
122 boolean=function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
123 if #stanza.tags ~= 0 or #stanza == 0 then error("<boolean> must have a single text child"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
124 local b = t_concat(stanza);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
125 if b ~= "1" and b ~= "0" then error("Failed to parse content of <boolean>"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
126 return b == "1" and true or false;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
127 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
128 string=function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
129 if #stanza.tags ~= 0 then error("<string> must have a single text child"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
130 return t_concat(stanza);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
131 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
132 array=function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
133 if #stanza.tags ~= 1 then error("<array> must have a single <data> child"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
134 return _xmlrpc_to_lua(stanza.tags[1]);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
135 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
136 data=function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
137 local t = {};
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
138 for _,child in pairs(stanza.tags) do
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
139 if child.name ~= "value" then error("<data> can only have <value> children"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
140 t_insert(t, _xmlrpc_to_lua(child));
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
141 end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
142 return t;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
143 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
144 struct=function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
145 local t = {};
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
146 for _,child in pairs(stanza.tags) do
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
147 if child.name ~= "member" then error("<struct> can only have <member> children"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
148 local name, value = _xmlrpc_to_lua(child);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
149 t[name] = value;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
150 end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
151 return t;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
152 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
153 member=function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
154 if #stanza.tags ~= 2 then error("<member> must have exactly two subtags"); end -- FIXME <params> is optional
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
155 if stanza.tags[1].name ~= "name" then error("First <member> child tag must be <name>") end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
156 if stanza.tags[2].name ~= "value" then error("Second <member> child tag must be <value>") end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
157 return _xmlrpc_to_lua(stanza.tags[1]), _xmlrpc_to_lua(stanza.tags[2]);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
158 end;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
159 name=function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
160 if #stanza.tags ~= 0 then error("<name> must have a single text child"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
161 local n = t_concat(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
162 if tostring(tonumber(n)) == n then n = tonumber(n); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
163 return n;
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
164 end;
888
1059230969c3 util/xmlrpc: Added <nil/> extension to RPC functions (allowing nil parameters and return values)
Waqas Hussain <waqas20@gmail.com>
parents: 874
diff changeset
165 ["nil"]=function(stanza) -- nil extension
1059230969c3 util/xmlrpc: Added <nil/> extension to RPC functions (allowing nil parameters and return values)
Waqas Hussain <waqas20@gmail.com>
parents: 874
diff changeset
166 return nil;
1059230969c3 util/xmlrpc: Added <nil/> extension to RPC functions (allowing nil parameters and return values)
Waqas Hussain <waqas20@gmail.com>
parents: 874
diff changeset
167 end;
874
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
168 }
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
169 _xmlrpc_to_lua = function(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
170 local h = rmap[stanza.name];
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
171 if h then
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
172 return h(stanza);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
173 else
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
174 error("Unknown element: "..stanza.name);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
175 end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
176 end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
177 function translate_request(stanza)
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
178 if stanza.name ~= "methodCall" then error("XML-RPC requests must have <methodCall> as root element"); end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
179 return _xmlrpc_to_lua(stanza);
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
180 end
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
181
a554bf5057a0 Added util/xmlrpc.lua - functions for converting between XML-RPC stanzas and Lua objects
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
182 return _M;

mercurial