author | matthew |
Sun, 24 Aug 2008 04:34:01 +0000 | |
changeset 2 | 9bb397205f26 |
parent 1 | b8787e859fd2 |
child 4 | 09c3845ed442 |
permissions | -rw-r--r-- |
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; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
3 |
local format = string.format; |
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; |
0 | 9 |
|
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:iq(attrs) |
|
21 |
return self + stanza("iq", attrs) |
|
22 |
end |
|
23 |
function stanza_mt:message(attrs) |
|
24 |
return self + stanza("message", attrs) |
|
25 |
end |
|
26 |
function stanza_mt:presence(attrs) |
|
27 |
return self + stanza("presence", attrs) |
|
28 |
end |
|
29 |
function stanza_mt:query(xmlns) |
|
30 |
return self:tag("query", { xmlns = xmlns }); |
|
31 |
end |
|
32 |
function stanza_mt:tag(name, attrs) |
|
33 |
local s = stanza(name, attrs); |
|
34 |
(self.last_add[#self.last_add] or self):add_child(s); |
|
35 |
t_insert(self.last_add, s); |
|
36 |
return self; |
|
37 |
end |
|
38 |
||
39 |
function stanza_mt:text(text) |
|
40 |
(self.last_add[#self.last_add] or self):add_child(text); |
|
41 |
return self; |
|
42 |
end |
|
43 |
||
44 |
function stanza_mt:up() |
|
45 |
t_remove(self.last_add); |
|
46 |
return self; |
|
47 |
end |
|
48 |
||
49 |
function stanza_mt:add_child(child) |
|
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
50 |
if type(child) == "table" then |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
51 |
t_insert(self.tags, child); |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
52 |
end |
0 | 53 |
t_insert(self, child); |
54 |
end |
|
55 |
||
56 |
function stanza_mt:child_with_name(name) |
|
57 |
for _, child in ipairs(self) do |
|
58 |
if child.name == name then return child; end |
|
59 |
end |
|
60 |
end |
|
61 |
||
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
62 |
function stanza_mt:children() |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
63 |
local i = 0; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
64 |
return function (a) |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
65 |
i = i + 1 |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
66 |
local v = a[i] |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
67 |
if v then return v; end |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
68 |
end, self, i; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
69 |
|
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
70 |
end |
2 | 71 |
function stanza_mt:childtags() |
72 |
local i = 0; |
|
73 |
return function (a) |
|
74 |
i = i + 1 |
|
75 |
local v = self.tags[i] |
|
76 |
if v then return v; end |
|
77 |
end, self.tags[1], i; |
|
78 |
||
79 |
end |
|
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
80 |
|
0 | 81 |
function stanza_mt.__tostring(t) |
82 |
local children_text = ""; |
|
83 |
for n, child in ipairs(t) do |
|
84 |
children_text = children_text .. tostring(child); |
|
85 |
end |
|
86 |
||
87 |
local attr_string = ""; |
|
88 |
if t.attr then |
|
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
89 |
for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. format(" %s='%s'", k, tostring(v)); end end |
0 | 90 |
end |
91 |
||
92 |
return format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name); |
|
93 |
end |
|
94 |
||
95 |
function stanza_mt.__add(s1, s2) |
|
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
96 |
return s1:add_child(s2); |
0 | 97 |
end |
98 |
||
99 |
||
100 |
do |
|
101 |
local id = 0; |
|
102 |
function new_id() |
|
103 |
id = id + 1; |
|
104 |
return "lx"..id; |
|
105 |
end |
|
106 |
end |
|
107 |
||
108 |
function message(attr, body) |
|
109 |
if not body then |
|
110 |
return stanza("message", attr); |
|
111 |
else |
|
112 |
return stanza("message", attr):tag("body"):text(body); |
|
113 |
end |
|
114 |
end |
|
115 |
function iq(attr) |
|
116 |
if attr and not attr.id then attr.id = new_id(); end |
|
117 |
return stanza("iq", attr or { id = new_id() }); |
|
118 |
end |
|
119 |
||
120 |
function reply(orig) |
|
121 |
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) }); |
|
122 |
end |
|
123 |
||
124 |
function presence(attr) |
|
125 |
return stanza("presence", attr); |
|
126 |
end |
|
127 |