Wed, 08 Oct 2008 22:42:51 +0100
Fix for saving tables with non-string keys
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
1 | local t_insert = table.insert; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
2 | local t_remove = table.remove; |
23 | 3 | local s_format = string.format; |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
4 | local tostring = tostring; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
5 | local setmetatable = setmetatable; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
6 | local pairs = pairs; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
7 | local ipairs = ipairs; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
8 | local type = type; |
4 | 9 | local s_gsub = string.gsub; |
0 | 10 | module "stanza" |
11 | ||
12 | stanza_mt = {}; | |
13 | stanza_mt.__index = stanza_mt; | |
14 | ||
15 | function stanza(name, attr) | |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
16 | local stanza = { name = name, attr = attr or {}, tags = {}, last_add = {}}; |
0 | 17 | return setmetatable(stanza, stanza_mt); |
18 | end | |
19 | ||
20 | function stanza_mt:query(xmlns) | |
21 | return self:tag("query", { xmlns = xmlns }); | |
22 | end | |
23 | function stanza_mt:tag(name, attrs) | |
24 | local s = stanza(name, attrs); | |
25 | (self.last_add[#self.last_add] or self):add_child(s); | |
26 | t_insert(self.last_add, s); | |
27 | return self; | |
28 | end | |
29 | ||
30 | function stanza_mt:text(text) | |
31 | (self.last_add[#self.last_add] or self):add_child(text); | |
32 | return self; | |
33 | end | |
34 | ||
35 | function stanza_mt:up() | |
36 | t_remove(self.last_add); | |
37 | return self; | |
38 | end | |
39 | ||
40 | function stanza_mt:add_child(child) | |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
41 | if type(child) == "table" then |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
42 | t_insert(self.tags, child); |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
43 | end |
0 | 44 | t_insert(self, child); |
45 | end | |
46 | ||
47 | function stanza_mt:child_with_name(name) | |
48 | for _, child in ipairs(self) do | |
49 | if child.name == name then return child; end | |
50 | end | |
51 | end | |
52 | ||
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
53 | function stanza_mt:children() |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
54 | local i = 0; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
55 | return function (a) |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
56 | i = i + 1 |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
57 | local v = a[i] |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
58 | if v then return v; end |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
59 | end, self, i; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
60 | |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
61 | end |
2 | 62 | function stanza_mt:childtags() |
63 | local i = 0; | |
64 | return function (a) | |
65 | i = i + 1 | |
66 | local v = self.tags[i] | |
67 | if v then return v; end | |
68 | end, self.tags[1], i; | |
69 | ||
70 | end | |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
71 | |
4 | 72 | do |
73 | local xml_entities = { ["'"] = "'", ["\""] = """, ["<"] = "<", [">"] = ">", ["&"] = "&" }; | |
74 | function xml_escape(s) return s_gsub(s, "['&<>\"]", xml_entities); end | |
75 | end | |
76 | ||
77 | local xml_escape = xml_escape; | |
78 | ||
0 | 79 | function stanza_mt.__tostring(t) |
80 | local children_text = ""; | |
81 | for n, child in ipairs(t) do | |
4 | 82 | if type(child) == "string" then |
83 | children_text = children_text .. xml_escape(child); | |
84 | else | |
85 | children_text = children_text .. tostring(child); | |
86 | end | |
0 | 87 | end |
88 | ||
89 | local attr_string = ""; | |
90 | if t.attr then | |
23 | 91 | 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 |
0 | 92 | end |
93 | ||
23 | 94 | return s_format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name); |
0 | 95 | end |
96 | ||
97 | function stanza_mt.__add(s1, s2) | |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
98 | return s1:add_child(s2); |
0 | 99 | end |
100 | ||
101 | ||
102 | do | |
103 | local id = 0; | |
104 | function new_id() | |
105 | id = id + 1; | |
106 | return "lx"..id; | |
107 | end | |
108 | end | |
109 | ||
110 | function message(attr, body) | |
111 | if not body then | |
112 | return stanza("message", attr); | |
113 | else | |
114 | return stanza("message", attr):tag("body"):text(body); | |
115 | end | |
116 | end | |
117 | function iq(attr) | |
118 | if attr and not attr.id then attr.id = new_id(); end | |
119 | return stanza("iq", attr or { id = new_id() }); | |
120 | end | |
121 | ||
122 | function reply(orig) | |
123 | return stanza(orig.name, orig.attr and { to = orig.attr.from, from = orig.attr.to, id = orig.attr.id, type = ((orig.name == "iq" and "result") or nil) }); | |
124 | end | |
125 | ||
60
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
126 | function error_reply(orig, type, condition, message, clone) |
70
a6c00467a3f8
Fixed typo in variable name
Waqas Hussain <waqas20@gmail.com>
parents:
62
diff
changeset
|
127 | local t = reply(orig); |
60
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
128 | t.attr.type = "error"; |
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
129 | -- TODO use clone |
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
130 | t:tag("error", {type = type}) |
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
131 | :tag(condition, {xmlns = "urn:ietf:params:xml:ns:xmpp-stanzas"}):up(); |
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
132 | if (message) then t:tag("text"):text(message):up(); end |
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
133 | return t; -- stanza ready for adding app-specific errors |
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
134 | end |
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
135 | |
0 | 136 | function presence(attr) |
137 | return stanza("presence", attr); | |
138 | end | |
139 | ||
30 | 140 | return _M; |