Wed, 13 Jan 2010 00:04:38 +0000
prosodyctl: Use mode r+ for opening the file so 1) it fails if the file doesn't exist 2) we have write access to lock it
1523
841d61be198f
Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents:
1517
diff
changeset
|
1 | -- Prosody IM |
760
90ce865eebd8
Update copyright notices for 2009
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
2 | -- Copyright (C) 2008-2009 Matthew Wild |
90ce865eebd8
Update copyright notices for 2009
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
3 | -- Copyright (C) 2008-2009 Waqas Hussain |
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
373
diff
changeset
|
4 | -- |
758 | 5 | -- This project is MIT/X11 licensed. Please see the |
6 | -- COPYING file in the source package for more information. | |
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
373
diff
changeset
|
7 | -- |
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
373
diff
changeset
|
8 | |
1984
f2b1f89e1d7c
util.stanza: Don't add xmlns to tags when serializing if same as the parent tag's xmlns. Should hopefully shut up Gajim once and for all :)
Matthew Wild <mwild1@gmail.com>
parents:
1935
diff
changeset
|
9 | |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
10 | local t_insert = table.insert; |
626
cf1d26fd4d6f
Optimized stanza_mt.__tostring (called when doing tostring(stanza))
Waqas Hussain <waqas20@gmail.com>
parents:
519
diff
changeset
|
11 | local t_concat = table.concat; |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
12 | local t_remove = table.remove; |
613
6c09127b50fb
New, faster, stanza serialization
Matthew Wild <mwild1@gmail.com>
parents:
519
diff
changeset
|
13 | local t_concat = table.concat; |
23 | 14 | local s_format = string.format; |
829
b01fd698495e
util/stanza: Added clone function
Waqas Hussain <waqas20@gmail.com>
parents:
776
diff
changeset
|
15 | local s_match = string.match; |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
16 | local tostring = tostring; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
17 | local setmetatable = setmetatable; |
829
b01fd698495e
util/stanza: Added clone function
Waqas Hussain <waqas20@gmail.com>
parents:
776
diff
changeset
|
18 | local getmetatable = getmetatable; |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
19 | local pairs = pairs; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
20 | local ipairs = ipairs; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
21 | local type = type; |
145 | 22 | local next = next; |
626
cf1d26fd4d6f
Optimized stanza_mt.__tostring (called when doing tostring(stanza))
Waqas Hussain <waqas20@gmail.com>
parents:
519
diff
changeset
|
23 | local print = print; |
90
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
24 | local unpack = unpack; |
4 | 25 | local s_gsub = string.gsub; |
1416
f916f0ff90e5
util.stanza: Rewrote stanza_mt.__tostring. 20-30% faster stanza serialization. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1415
diff
changeset
|
26 | local s_char = string.char; |
1431
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
27 | local s_find = string.find; |
613
6c09127b50fb
New, faster, stanza serialization
Matthew Wild <mwild1@gmail.com>
parents:
519
diff
changeset
|
28 | local os = os; |
145 | 29 | |
262 | 30 | local do_pretty_printing = not os.getenv("WINDIR"); |
1932
af8cdbb63b13
util.stanza: Soften dependency on util.termcolours
Matthew Wild <mwild1@gmail.com>
parents:
1931
diff
changeset
|
31 | local getstyle, getstring; |
af8cdbb63b13
util.stanza: Soften dependency on util.termcolours
Matthew Wild <mwild1@gmail.com>
parents:
1931
diff
changeset
|
32 | if do_pretty_printing then |
af8cdbb63b13
util.stanza: Soften dependency on util.termcolours
Matthew Wild <mwild1@gmail.com>
parents:
1931
diff
changeset
|
33 | local ok, termcolours = pcall(require, "util.termcolours"); |
af8cdbb63b13
util.stanza: Soften dependency on util.termcolours
Matthew Wild <mwild1@gmail.com>
parents:
1931
diff
changeset
|
34 | if ok then |
af8cdbb63b13
util.stanza: Soften dependency on util.termcolours
Matthew Wild <mwild1@gmail.com>
parents:
1931
diff
changeset
|
35 | getstyle, getstring = termcolours.getstyle, termcolours.getstring; |
af8cdbb63b13
util.stanza: Soften dependency on util.termcolours
Matthew Wild <mwild1@gmail.com>
parents:
1931
diff
changeset
|
36 | else |
af8cdbb63b13
util.stanza: Soften dependency on util.termcolours
Matthew Wild <mwild1@gmail.com>
parents:
1931
diff
changeset
|
37 | do_pretty_printing = nil; |
af8cdbb63b13
util.stanza: Soften dependency on util.termcolours
Matthew Wild <mwild1@gmail.com>
parents:
1931
diff
changeset
|
38 | end |
af8cdbb63b13
util.stanza: Soften dependency on util.termcolours
Matthew Wild <mwild1@gmail.com>
parents:
1931
diff
changeset
|
39 | end |
262 | 40 | |
0 | 41 | module "stanza" |
42 | ||
1874
262ea889016f
util.stanza: Add __type to metatable
Matthew Wild <mwild1@gmail.com>
parents:
1523
diff
changeset
|
43 | stanza_mt = { __type = "stanza" }; |
0 | 44 | stanza_mt.__index = stanza_mt; |
45 | ||
46 | function stanza(name, attr) | |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
47 | local stanza = { name = name, attr = attr or {}, tags = {}, last_add = {}}; |
0 | 48 | return setmetatable(stanza, stanza_mt); |
49 | end | |
50 | ||
51 | function stanza_mt:query(xmlns) | |
52 | return self:tag("query", { xmlns = xmlns }); | |
53 | end | |
373
dd0345edeaf4
Add helper function for adding message bodies to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
338
diff
changeset
|
54 | |
dd0345edeaf4
Add helper function for adding message bodies to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
338
diff
changeset
|
55 | function stanza_mt:body(text, attr) |
dd0345edeaf4
Add helper function for adding message bodies to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
338
diff
changeset
|
56 | return self:tag("body", attr):text(text); |
dd0345edeaf4
Add helper function for adding message bodies to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
338
diff
changeset
|
57 | end |
dd0345edeaf4
Add helper function for adding message bodies to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
338
diff
changeset
|
58 | |
0 | 59 | function stanza_mt:tag(name, attrs) |
60 | local s = stanza(name, attrs); | |
180
d8b9a19d70eb
Make add_child() behave as expected. Old add_child() is now add_direct_child()
Matthew Wild <mwild1@gmail.com>
parents:
145
diff
changeset
|
61 | (self.last_add[#self.last_add] or self):add_direct_child(s); |
0 | 62 | t_insert(self.last_add, s); |
63 | return self; | |
64 | end | |
65 | ||
66 | function stanza_mt:text(text) | |
180
d8b9a19d70eb
Make add_child() behave as expected. Old add_child() is now add_direct_child()
Matthew Wild <mwild1@gmail.com>
parents:
145
diff
changeset
|
67 | (self.last_add[#self.last_add] or self):add_direct_child(text); |
0 | 68 | return self; |
69 | end | |
70 | ||
71 | function stanza_mt:up() | |
72 | t_remove(self.last_add); | |
73 | return self; | |
74 | end | |
75 | ||
964
3296db2ad4a0
util.stanza: stanza:reset() method to reset building state
Matthew Wild <mwild1@gmail.com>
parents:
894
diff
changeset
|
76 | function stanza_mt:reset() |
3296db2ad4a0
util.stanza: stanza:reset() method to reset building state
Matthew Wild <mwild1@gmail.com>
parents:
894
diff
changeset
|
77 | local last_add = self.last_add; |
3296db2ad4a0
util.stanza: stanza:reset() method to reset building state
Matthew Wild <mwild1@gmail.com>
parents:
894
diff
changeset
|
78 | for i = 1,#last_add do |
3296db2ad4a0
util.stanza: stanza:reset() method to reset building state
Matthew Wild <mwild1@gmail.com>
parents:
894
diff
changeset
|
79 | last_add[i] = nil; |
3296db2ad4a0
util.stanza: stanza:reset() method to reset building state
Matthew Wild <mwild1@gmail.com>
parents:
894
diff
changeset
|
80 | end |
3296db2ad4a0
util.stanza: stanza:reset() method to reset building state
Matthew Wild <mwild1@gmail.com>
parents:
894
diff
changeset
|
81 | return self; |
3296db2ad4a0
util.stanza: stanza:reset() method to reset building state
Matthew Wild <mwild1@gmail.com>
parents:
894
diff
changeset
|
82 | end |
3296db2ad4a0
util.stanza: stanza:reset() method to reset building state
Matthew Wild <mwild1@gmail.com>
parents:
894
diff
changeset
|
83 | |
180
d8b9a19d70eb
Make add_child() behave as expected. Old add_child() is now add_direct_child()
Matthew Wild <mwild1@gmail.com>
parents:
145
diff
changeset
|
84 | function stanza_mt:add_direct_child(child) |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
85 | if type(child) == "table" then |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
86 | t_insert(self.tags, child); |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
87 | end |
0 | 88 | t_insert(self, child); |
89 | end | |
90 | ||
180
d8b9a19d70eb
Make add_child() behave as expected. Old add_child() is now add_direct_child()
Matthew Wild <mwild1@gmail.com>
parents:
145
diff
changeset
|
91 | function stanza_mt:add_child(child) |
d8b9a19d70eb
Make add_child() behave as expected. Old add_child() is now add_direct_child()
Matthew Wild <mwild1@gmail.com>
parents:
145
diff
changeset
|
92 | (self.last_add[#self.last_add] or self):add_direct_child(child); |
d8b9a19d70eb
Make add_child() behave as expected. Old add_child() is now add_direct_child()
Matthew Wild <mwild1@gmail.com>
parents:
145
diff
changeset
|
93 | return self; |
d8b9a19d70eb
Make add_child() behave as expected. Old add_child() is now add_direct_child()
Matthew Wild <mwild1@gmail.com>
parents:
145
diff
changeset
|
94 | end |
d8b9a19d70eb
Make add_child() behave as expected. Old add_child() is now add_direct_child()
Matthew Wild <mwild1@gmail.com>
parents:
145
diff
changeset
|
95 | |
0 | 96 | function stanza_mt:child_with_name(name) |
689
94b043fbaf33
Add child_with_ns() method to stanza elements, and fix child_with_name() to iterate tags rather than all children
Matthew Wild <mwild1@gmail.com>
parents:
680
diff
changeset
|
97 | for _, child in ipairs(self.tags) do |
0 | 98 | if child.name == name then return child; end |
99 | end | |
100 | end | |
101 | ||
689
94b043fbaf33
Add child_with_ns() method to stanza elements, and fix child_with_name() to iterate tags rather than all children
Matthew Wild <mwild1@gmail.com>
parents:
680
diff
changeset
|
102 | function stanza_mt:child_with_ns(ns) |
94b043fbaf33
Add child_with_ns() method to stanza elements, and fix child_with_name() to iterate tags rather than all children
Matthew Wild <mwild1@gmail.com>
parents:
680
diff
changeset
|
103 | for _, child in ipairs(self.tags) do |
94b043fbaf33
Add child_with_ns() method to stanza elements, and fix child_with_name() to iterate tags rather than all children
Matthew Wild <mwild1@gmail.com>
parents:
680
diff
changeset
|
104 | if child.attr.xmlns == ns then return child; end |
94b043fbaf33
Add child_with_ns() method to stanza elements, and fix child_with_name() to iterate tags rather than all children
Matthew Wild <mwild1@gmail.com>
parents:
680
diff
changeset
|
105 | end |
94b043fbaf33
Add child_with_ns() method to stanza elements, and fix child_with_name() to iterate tags rather than all children
Matthew Wild <mwild1@gmail.com>
parents:
680
diff
changeset
|
106 | end |
94b043fbaf33
Add child_with_ns() method to stanza elements, and fix child_with_name() to iterate tags rather than all children
Matthew Wild <mwild1@gmail.com>
parents:
680
diff
changeset
|
107 | |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
108 | function stanza_mt:children() |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
109 | local i = 0; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
110 | return function (a) |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
111 | i = i + 1 |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
112 | local v = a[i] |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
113 | if v then return v; end |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
114 | end, self, i; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
115 | |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
116 | end |
2 | 117 | function stanza_mt:childtags() |
118 | local i = 0; | |
119 | return function (a) | |
120 | i = i + 1 | |
121 | local v = self.tags[i] | |
122 | if v then return v; end | |
123 | end, self.tags[1], i; | |
124 | ||
125 | end | |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
126 | |
1931
f203330eb82e
util.stanza: Make xml_escape publicly accessible
Matthew Wild <mwild1@gmail.com>
parents:
1874
diff
changeset
|
127 | local xml_escape |
f203330eb82e
util.stanza: Make xml_escape publicly accessible
Matthew Wild <mwild1@gmail.com>
parents:
1874
diff
changeset
|
128 | do |
1416
f916f0ff90e5
util.stanza: Rewrote stanza_mt.__tostring. 20-30% faster stanza serialization. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1415
diff
changeset
|
129 | local escape_table = { ["'"] = "'", ["\""] = """, ["<"] = "<", [">"] = ">", ["&"] = "&" }; |
1931
f203330eb82e
util.stanza: Make xml_escape publicly accessible
Matthew Wild <mwild1@gmail.com>
parents:
1874
diff
changeset
|
130 | function xml_escape(str) return (s_gsub(str, "['&<>\"]", escape_table)); end |
f203330eb82e
util.stanza: Make xml_escape publicly accessible
Matthew Wild <mwild1@gmail.com>
parents:
1874
diff
changeset
|
131 | _M.xml_escape = xml_escape; |
f203330eb82e
util.stanza: Make xml_escape publicly accessible
Matthew Wild <mwild1@gmail.com>
parents:
1874
diff
changeset
|
132 | end |
f203330eb82e
util.stanza: Make xml_escape publicly accessible
Matthew Wild <mwild1@gmail.com>
parents:
1874
diff
changeset
|
133 | |
1984
f2b1f89e1d7c
util.stanza: Don't add xmlns to tags when serializing if same as the parent tag's xmlns. Should hopefully shut up Gajim once and for all :)
Matthew Wild <mwild1@gmail.com>
parents:
1935
diff
changeset
|
134 | local function _dostring(t, buf, self, xml_escape, parentns) |
1431
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
135 | local nsid = 0; |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
136 | local name = t.name |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
137 | t_insert(buf, "<"..name); |
1416
f916f0ff90e5
util.stanza: Rewrote stanza_mt.__tostring. 20-30% faster stanza serialization. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1415
diff
changeset
|
138 | for k, v in pairs(t.attr) do |
2077
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
139 | if s_find(k, "\1", 1, true) then |
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
140 | local ns, attrk = s_match(k, "^([^\1]*)\1?(.*)$"); |
1416
f916f0ff90e5
util.stanza: Rewrote stanza_mt.__tostring. 20-30% faster stanza serialization. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1415
diff
changeset
|
141 | nsid = nsid + 1; |
f916f0ff90e5
util.stanza: Rewrote stanza_mt.__tostring. 20-30% faster stanza serialization. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1415
diff
changeset
|
142 | t_insert(buf, " xmlns:ns"..nsid.."='"..xml_escape(ns).."' ".."ns"..nsid..":"..attrk.."='"..xml_escape(v).."'"); |
2077
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
143 | elseif not(k == "xmlns" and v == parentns) then |
1416
f916f0ff90e5
util.stanza: Rewrote stanza_mt.__tostring. 20-30% faster stanza serialization. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1415
diff
changeset
|
144 | t_insert(buf, " "..k.."='"..xml_escape(v).."'"); |
776
89eb9f59993c
util.stanza: Temporary fix for serializing attributes with namespaces
Matthew Wild <mwild1@gmail.com>
parents:
760
diff
changeset
|
145 | end |
1416
f916f0ff90e5
util.stanza: Rewrote stanza_mt.__tostring. 20-30% faster stanza serialization. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1415
diff
changeset
|
146 | end |
1431
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
147 | local len = #t; |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
148 | if len == 0 then |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
149 | t_insert(buf, "/>"); |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
150 | else |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
151 | t_insert(buf, ">"); |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
152 | for n=1,len do |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
153 | local child = t[n]; |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
154 | if child.name then |
2077
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
155 | self(child, buf, self, xml_escape, t.attr.xmlns); |
1431
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
156 | else |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
157 | t_insert(buf, xml_escape(child)); |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
158 | end |
4 | 159 | end |
1431
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
160 | t_insert(buf, "</"..name..">"); |
0 | 161 | end |
626
cf1d26fd4d6f
Optimized stanza_mt.__tostring (called when doing tostring(stanza))
Waqas Hussain <waqas20@gmail.com>
parents:
519
diff
changeset
|
162 | end |
cf1d26fd4d6f
Optimized stanza_mt.__tostring (called when doing tostring(stanza))
Waqas Hussain <waqas20@gmail.com>
parents:
519
diff
changeset
|
163 | function stanza_mt.__tostring(t) |
cf1d26fd4d6f
Optimized stanza_mt.__tostring (called when doing tostring(stanza))
Waqas Hussain <waqas20@gmail.com>
parents:
519
diff
changeset
|
164 | local buf = {}; |
2077
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
165 | _dostring(t, buf, _dostring, xml_escape, nil); |
626
cf1d26fd4d6f
Optimized stanza_mt.__tostring (called when doing tostring(stanza))
Waqas Hussain <waqas20@gmail.com>
parents:
519
diff
changeset
|
166 | return t_concat(buf); |
0 | 167 | end |
168 | ||
242
f15afbcbc55c
Add new top_tag() method to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
169 | function stanza_mt.top_tag(t) |
f15afbcbc55c
Add new top_tag() method to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
170 | local attr_string = ""; |
f15afbcbc55c
Add new top_tag() method to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
171 | if t.attr then |
338
804f5e62a41f
Don't forget to escape XML in attributes. Thanks to the Postgres Q&A room on conference.jabber.org :)
Matthew Wild <mwild1@gmail.com>
parents:
262
diff
changeset
|
172 | for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(" %s='%s'", k, xml_escape(tostring(v))); end end |
242
f15afbcbc55c
Add new top_tag() method to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
173 | end |
f15afbcbc55c
Add new top_tag() method to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
174 | return s_format("<%s%s>", t.name, attr_string); |
f15afbcbc55c
Add new top_tag() method to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
175 | end |
f15afbcbc55c
Add new top_tag() method to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
176 | |
1420
1576a5aa52f8
util.stanza: Add stanza:get_text() to retrieve all child text nodes #api
Matthew Wild <mwild1@gmail.com>
parents:
1416
diff
changeset
|
177 | function stanza_mt.get_text(t) |
1576a5aa52f8
util.stanza: Add stanza:get_text() to retrieve all child text nodes #api
Matthew Wild <mwild1@gmail.com>
parents:
1416
diff
changeset
|
178 | if #t.tags == 0 then |
1576a5aa52f8
util.stanza: Add stanza:get_text() to retrieve all child text nodes #api
Matthew Wild <mwild1@gmail.com>
parents:
1416
diff
changeset
|
179 | return t_concat(t); |
1576a5aa52f8
util.stanza: Add stanza:get_text() to retrieve all child text nodes #api
Matthew Wild <mwild1@gmail.com>
parents:
1416
diff
changeset
|
180 | end |
1576a5aa52f8
util.stanza: Add stanza:get_text() to retrieve all child text nodes #api
Matthew Wild <mwild1@gmail.com>
parents:
1416
diff
changeset
|
181 | end |
1576a5aa52f8
util.stanza: Add stanza:get_text() to retrieve all child text nodes #api
Matthew Wild <mwild1@gmail.com>
parents:
1416
diff
changeset
|
182 | |
0 | 183 | function stanza_mt.__add(s1, s2) |
180
d8b9a19d70eb
Make add_child() behave as expected. Old add_child() is now add_direct_child()
Matthew Wild <mwild1@gmail.com>
parents:
145
diff
changeset
|
184 | return s1:add_direct_child(s2); |
0 | 185 | end |
186 | ||
187 | ||
188 | do | |
1517
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
189 | local id = 0; |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
190 | function new_id() |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
191 | id = id + 1; |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
192 | return "lx"..id; |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
193 | end |
0 | 194 | end |
195 | ||
90
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
196 | function preserialize(stanza) |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
197 | local s = { name = stanza.name, attr = stanza.attr }; |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
198 | for _, child in ipairs(stanza) do |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
199 | if type(child) == "table" then |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
200 | t_insert(s, preserialize(child)); |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
201 | else |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
202 | t_insert(s, child); |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
203 | end |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
204 | end |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
205 | return s; |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
206 | end |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
207 | |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
208 | function deserialize(stanza) |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
209 | -- Set metatable |
91
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
210 | if stanza then |
1415
957a81b72cb2
util.stanza: Remove numeric attributes while deserializing
Waqas Hussain <waqas20@gmail.com>
parents:
1151
diff
changeset
|
211 | local attr = stanza.attr; |
957a81b72cb2
util.stanza: Remove numeric attributes while deserializing
Waqas Hussain <waqas20@gmail.com>
parents:
1151
diff
changeset
|
212 | for i=1,#attr do attr[i] = nil; end |
2077
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
213 | local attrx = {}; |
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
214 | for att in pairs(attr) do |
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
215 | if s_find(att, "|", 1, true) and not s_find(k, "\1", 1, true) then |
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
216 | local ns,na = s_match(k, "^([^|]+)|(.+)$"); |
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
217 | attrx[ns.."\1"..na] = attr[att]; |
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
218 | attr[att] = nil; |
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
219 | end |
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
220 | end |
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
221 | for a,v in pairs(attrx) do |
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
222 | attr[x] = v; |
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
223 | end |
91
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
224 | setmetatable(stanza, stanza_mt); |
90
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
225 | for _, child in ipairs(stanza) do |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
226 | if type(child) == "table" then |
91
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
227 | deserialize(child); |
90
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
228 | end |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
229 | end |
91
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
230 | if not stanza.tags then |
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
231 | -- Rebuild tags |
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
232 | local tags = {}; |
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
233 | for _, child in ipairs(stanza) do |
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
234 | if type(child) == "table" then |
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
235 | t_insert(tags, child); |
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
236 | end |
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
237 | end |
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
238 | stanza.tags = tags; |
680
734994b61907
Restore fix for missing last_add on deserialized stanzas. Thanks to tsing for discovering.
Matthew Wild <mwild1@gmail.com>
parents:
628
diff
changeset
|
239 | if not stanza.last_add then |
734994b61907
Restore fix for missing last_add on deserialized stanzas. Thanks to tsing for discovering.
Matthew Wild <mwild1@gmail.com>
parents:
628
diff
changeset
|
240 | stanza.last_add = {}; |
734994b61907
Restore fix for missing last_add on deserialized stanzas. Thanks to tsing for discovering.
Matthew Wild <mwild1@gmail.com>
parents:
628
diff
changeset
|
241 | end |
91
6d66eb6b24cb
Fixed: util.stanza.deserialize now handles nil stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
90
diff
changeset
|
242 | end |
90
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
243 | end |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
244 | |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
245 | return stanza; |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
246 | end |
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
247 | |
829
b01fd698495e
util/stanza: Added clone function
Waqas Hussain <waqas20@gmail.com>
parents:
776
diff
changeset
|
248 | function clone(stanza) |
1517
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
249 | local lookup_table = {}; |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
250 | local function _copy(object) |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
251 | if type(object) ~= "table" then |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
252 | return object; |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
253 | elseif lookup_table[object] then |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
254 | return lookup_table[object]; |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
255 | end |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
256 | local new_table = {}; |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
257 | lookup_table[object] = new_table; |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
258 | for index, value in pairs(object) do |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
259 | new_table[_copy(index)] = _copy(value); |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
260 | end |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
261 | return setmetatable(new_table, getmetatable(object)); |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
262 | end |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
263 | |
22be7637a64d
util.stanza: Convert spaces to tabs
Matthew Wild <mwild1@gmail.com>
parents:
1431
diff
changeset
|
264 | return _copy(stanza) |
829
b01fd698495e
util/stanza: Added clone function
Waqas Hussain <waqas20@gmail.com>
parents:
776
diff
changeset
|
265 | end |
b01fd698495e
util/stanza: Added clone function
Waqas Hussain <waqas20@gmail.com>
parents:
776
diff
changeset
|
266 | |
0 | 267 | function message(attr, body) |
268 | if not body then | |
269 | return stanza("message", attr); | |
270 | else | |
271 | return stanza("message", attr):tag("body"):text(body); | |
272 | end | |
273 | end | |
274 | function iq(attr) | |
275 | if attr and not attr.id then attr.id = new_id(); end | |
276 | return stanza("iq", attr or { id = new_id() }); | |
277 | end | |
278 | ||
279 | function reply(orig) | |
209
e9de0803676d
Part one of internal component support
Matthew Wild <mwild1@gmail.com>
parents:
181
diff
changeset
|
280 | 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 orig.attr.type) }); |
0 | 281 | end |
282 | ||
1151
8096941b6734
util.stanza: Omit unused clone parameter from error_reply()
Waqas Hussain <waqas20@gmail.com>
parents:
964
diff
changeset
|
283 | function error_reply(orig, type, condition, message) |
70
a6c00467a3f8
Fixed typo in variable name
Waqas Hussain <waqas20@gmail.com>
parents:
62
diff
changeset
|
284 | local t = reply(orig); |
60
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
285 | t.attr.type = "error"; |
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
286 | t:tag("error", {type = type}) |
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
287 | :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
|
288 | 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
|
289 | 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
|
290 | end |
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
291 | |
0 | 292 | function presence(attr) |
293 | return stanza("presence", attr); | |
294 | end | |
295 | ||
262 | 296 | if do_pretty_printing then |
297 | local style_attrk = getstyle("yellow"); | |
298 | local style_attrv = getstyle("red"); | |
299 | local style_tagname = getstyle("red"); | |
300 | local style_punc = getstyle("magenta"); | |
301 | ||
302 | local attr_format = " "..getstring(style_attrk, "%s")..getstring(style_punc, "=")..getstring(style_attrv, "'%s'"); | |
303 | local top_tag_format = getstring(style_punc, "<")..getstring(style_tagname, "%s").."%s"..getstring(style_punc, ">"); | |
304 | --local tag_format = getstring(style_punc, "<")..getstring(style_tagname, "%s").."%s"..getstring(style_punc, ">").."%s"..getstring(style_punc, "</")..getstring(style_tagname, "%s")..getstring(style_punc, ">"); | |
305 | local tag_format = top_tag_format.."%s"..getstring(style_punc, "</")..getstring(style_tagname, "%s")..getstring(style_punc, ">"); | |
306 | function stanza_mt.pretty_print(t) | |
307 | local children_text = ""; | |
308 | for n, child in ipairs(t) do | |
309 | if type(child) == "string" then | |
310 | children_text = children_text .. xml_escape(child); | |
311 | else | |
312 | children_text = children_text .. child:pretty_print(); | |
313 | end | |
314 | end | |
315 | ||
316 | local attr_string = ""; | |
317 | if t.attr then | |
318 | for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(attr_format, k, tostring(v)); end end | |
319 | end | |
320 | return s_format(tag_format, t.name, attr_string, children_text, t.name); | |
321 | end | |
322 | ||
323 | function stanza_mt.pretty_top_tag(t) | |
324 | local attr_string = ""; | |
325 | if t.attr then | |
326 | for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(attr_format, k, tostring(v)); end end | |
327 | end | |
328 | return s_format(top_tag_format, t.name, attr_string); | |
329 | end | |
330 | else | |
331 | -- Sorry, fresh out of colours for you guys ;) | |
332 | stanza_mt.pretty_print = stanza_mt.__tostring; | |
333 | stanza_mt.pretty_top_tag = stanza_mt.top_tag; | |
334 | end | |
335 | ||
90
da468ed49a7b
Stanza preserialize/deserialize helpers, to strip and restore stanzas respectively. Fixed mod_vcard to use these.
Matthew Wild <mwild1@gmail.com>
parents:
70
diff
changeset
|
336 | return _M; |