Annotate

util/stanza.lua @ 1:b8787e859fd2

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)
author matthew
date Sun, 24 Aug 2008 01:51:02 +0000
parent 0:3e3171b59028
child 2:9bb397205f26
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
9
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
10 module "stanza"
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
11
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
12 stanza_mt = {};
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
13 stanza_mt.__index = stanza_mt;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
14
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
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
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
17 return setmetatable(stanza, stanza_mt);
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
18 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
19
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
20 function stanza_mt:iq(attrs)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
21 return self + stanza("iq", attrs)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
22 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
23 function stanza_mt:message(attrs)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
24 return self + stanza("message", attrs)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
25 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
26 function stanza_mt:presence(attrs)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
27 return self + stanza("presence", attrs)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
28 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
29 function stanza_mt:query(xmlns)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
30 return self:tag("query", { xmlns = xmlns });
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
31 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
32 function stanza_mt:tag(name, attrs)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
33 local s = stanza(name, attrs);
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
34 (self.last_add[#self.last_add] or self):add_child(s);
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
35 t_insert(self.last_add, s);
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
36 return self;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
37 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
38
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
39 function stanza_mt:text(text)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
40 (self.last_add[#self.last_add] or self):add_child(text);
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
41 return self;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
42 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
43
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
44 function stanza_mt:up()
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
45 t_remove(self.last_add);
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
46 return self;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
47 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
48
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
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
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
53 t_insert(self, child);
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
54 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
55
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
56 function stanza_mt:child_with_name(name)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
57 for _, child in ipairs(self) do
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
58 if child.name == name then return child; end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
59 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
60 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
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
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
72 function stanza_mt.__tostring(t)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
73 local children_text = "";
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
74 for n, child in ipairs(t) do
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
75 children_text = children_text .. tostring(child);
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
76 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
77
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
78 local attr_string = "";
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
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
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
81 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
82
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
83 return format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name);
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
84 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
85
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
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
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
88 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
89
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
90
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
91 do
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
92 local id = 0;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
93 function new_id()
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
94 id = id + 1;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
95 return "lx"..id;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
96 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
97 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
98
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
99 function message(attr, body)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
100 if not body then
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
101 return stanza("message", attr);
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
102 else
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
103 return stanza("message", attr):tag("body"):text(body);
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
104 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
105 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
106 function iq(attr)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
107 if attr and not attr.id then attr.id = new_id(); end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
108 return stanza("iq", attr or { id = new_id() });
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
109 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
110
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
111 function reply(orig)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
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) });
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
113 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
114
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
115 function presence(attr)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
116 return stanza("presence", attr);
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
117 end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
118