Sun, 24 Aug 2008 01:51:02 +0000
Switched to new connection framework, courtesy of the luadch project
Now supports SSL on 5223
Beginning support for presence (aka. the proper routing of stanzas)
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 |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
71 | |
0 | 72 | function stanza_mt.__tostring(t) |
73 | local children_text = ""; | |
74 | for n, child in ipairs(t) do | |
75 | children_text = children_text .. tostring(child); | |
76 | end | |
77 | ||
78 | local attr_string = ""; | |
79 | if t.attr then | |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
80 | 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 | 81 | end |
82 | ||
83 | return format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name); | |
84 | end | |
85 | ||
86 | function stanza_mt.__add(s1, s2) | |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
87 | return s1:add_child(s2); |
0 | 88 | end |
89 | ||
90 | ||
91 | do | |
92 | local id = 0; | |
93 | function new_id() | |
94 | id = id + 1; | |
95 | return "lx"..id; | |
96 | end | |
97 | end | |
98 | ||
99 | function message(attr, body) | |
100 | if not body then | |
101 | return stanza("message", attr); | |
102 | else | |
103 | return stanza("message", attr):tag("body"):text(body); | |
104 | end | |
105 | end | |
106 | function iq(attr) | |
107 | if attr and not attr.id then attr.id = new_id(); end | |
108 | return stanza("iq", attr or { id = new_id() }); | |
109 | end | |
110 | ||
111 | function reply(orig) | |
112 | 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) }); | |
113 | end | |
114 | ||
115 | function presence(attr) | |
116 | return stanza("presence", attr); | |
117 | end | |
118 |