Software /
code /
prosody
Annotate
util/stanza.lua @ 13633:6b84d11aa09b
mod_storage_sql: Detect SQLite3 without UPSERT (or SQLCipher 3.x)
SQLCipher v3.4.1 (the version in Debian 12) is based on SQLite3 v3.15.2,
while UPSERT support was introduced in SQLite3 v3.24.0
This check was not needed before because we v3.24.0 has not been in a
version of Debian we support for a long, long time.
Note however that SQLCipher databases are not compatible across major
versions, upgrading from v3.x to v4.x requires executing a migration.
Attempts at making `prosodyctl mod_storage_sql upgrade` perform such a
migration has not been successful.
Executing the following in the `sqlcipher` tool should do the migration:
PRAGMA key = '<key material>';
PRAGMA cipher_migrate;
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 23 Jan 2025 19:33:05 +0100 |
parent | 13569:59dacbd637c2 |
rev | line source |
---|---|
1523
841d61be198f
Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents:
1517
diff
changeset
|
1 -- Prosody IM |
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2848
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2848
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5435
diff
changeset
|
4 -- |
758 | 5 -- This project is MIT/X11 licensed. Please see the |
6 -- COPYING file in the source package for more information. | |
4199
43cf7d96956f
util.stanza: Whitespace fix after merge (complicated)
Matthew Wild <mwild1@gmail.com>
parents:
4184
diff
changeset
|
7 -- |
519
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 |
8626
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
10 local error = error; |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
11 local t_insert = table.insert; |
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; |
829
b01fd698495e
util/stanza: Added clone function
Waqas Hussain <waqas20@gmail.com>
parents:
776
diff
changeset
|
14 local s_match = string.match; |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
15 local tostring = tostring; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
16 local setmetatable = setmetatable; |
7750
e58524240b30
util.stanza: Add an is_stanza() function to check if an object is a stanza
Kim Alvefur <zash@zash.se>
parents:
7253
diff
changeset
|
17 local getmetatable = getmetatable; |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
18 local pairs = pairs; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
19 local ipairs = ipairs; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
20 local type = type; |
4 | 21 local s_gsub = string.gsub; |
5424
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
22 local s_sub = string.sub; |
1431
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
23 local s_find = string.find; |
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12802
diff
changeset
|
24 local t_move = table.move or require "prosody.util.table".move; |
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12802
diff
changeset
|
25 local t_create = require"prosody.util.table".create; |
145 | 26 |
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12802
diff
changeset
|
27 local valid_utf8 = require "prosody.util.encodings".utf8.valid; |
8599
62bfc85a53c8
util.stanza: Add stricter validation for data passed to stanza builder API
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
28 |
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12802
diff
changeset
|
29 local do_pretty_printing, termcolours = pcall(require, "prosody.util.termcolours"); |
262 | 30 |
2955
f807dc244a5b
util.stanza: Fixed a nil global access.
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
31 local xmlns_stanzas = "urn:ietf:params:xml:ns:xmpp-stanzas"; |
12687
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
32 local xmpp_stanzas_attr = { xmlns = xmlns_stanzas }; |
2955
f807dc244a5b
util.stanza: Fixed a nil global access.
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
33 |
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
34 local _ENV = nil; |
8555
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8520
diff
changeset
|
35 -- luacheck: std none |
0 | 36 |
8520
e959bc51de75
util.stanza: Change __type to __name as this is used by Lua 5.3 in some error reporting functions
Kim Alvefur <zash@zash.se>
parents:
8382
diff
changeset
|
37 local stanza_mt = { __name = "stanza" }; |
0 | 38 stanza_mt.__index = stanza_mt; |
39 | |
12802 | 40 -- Basic check for valid XML character data. |
41 -- Disallow control characters. | |
42 -- Tab U+09 and newline U+0A are allowed. | |
43 -- For attributes, allow the \1 separator between namespace and name. | |
11205
9d1e21c23784
util.stanza: Reject ASCII control characters (fixes #1606)
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
44 local function valid_xml_cdata(str, attr) |
12802 | 45 return not s_find(str, attr and "[^\1\9\10\13\20-\255]" or "[^\9\10\13\20-\255]"); |
11205
9d1e21c23784
util.stanza: Reject ASCII control characters (fixes #1606)
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
46 end |
9d1e21c23784
util.stanza: Reject ASCII control characters (fixes #1606)
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
47 |
8626
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
48 local function check_name(name, name_type) |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
49 if type(name) ~= "string" then |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
50 error("invalid "..name_type.." name: expected string, got "..type(name)); |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
51 elseif #name == 0 then |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
52 error("invalid "..name_type.." name: empty string"); |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
53 elseif s_find(name, "[<>& '\"]") then |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
54 error("invalid "..name_type.." name: contains invalid characters"); |
11205
9d1e21c23784
util.stanza: Reject ASCII control characters (fixes #1606)
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
55 elseif not valid_xml_cdata(name, name_type == "attribute") then |
9d1e21c23784
util.stanza: Reject ASCII control characters (fixes #1606)
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
56 error("invalid "..name_type.." name: contains control characters"); |
8626
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
57 elseif not valid_utf8(name) then |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
58 error("invalid "..name_type.." name: contains invalid utf8"); |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
59 end |
8599
62bfc85a53c8
util.stanza: Add stricter validation for data passed to stanza builder API
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
60 end |
8626
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
61 |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
62 local function check_text(text, text_type) |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
63 if type(text) ~= "string" then |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
64 error("invalid "..text_type.." value: expected string, got "..type(text)); |
11261
be38ae8fdfa5
util.stanza: Move misplaced argument to correct place
Kim Alvefur <zash@zash.se>
parents:
11205
diff
changeset
|
65 elseif not valid_xml_cdata(text, false) then |
11205
9d1e21c23784
util.stanza: Reject ASCII control characters (fixes #1606)
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
66 error("invalid "..text_type.." value: contains control characters"); |
11261
be38ae8fdfa5
util.stanza: Move misplaced argument to correct place
Kim Alvefur <zash@zash.se>
parents:
11205
diff
changeset
|
67 elseif not valid_utf8(text) then |
8626
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
68 error("invalid "..text_type.." value: contains invalid utf8"); |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
69 end |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
70 end |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
71 |
8599
62bfc85a53c8
util.stanza: Add stricter validation for data passed to stanza builder API
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
72 local function check_attr(attr) |
62bfc85a53c8
util.stanza: Add stricter validation for data passed to stanza builder API
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
73 if attr ~= nil then |
8626
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
74 if type(attr) ~= "table" then |
12138
644ca3583837
util.stanza: Make type error message consistent with others
Kim Alvefur <zash@zash.se>
parents:
11960
diff
changeset
|
75 error("invalid attributes: expected table, got "..type(attr)); |
8626
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
76 end |
8599
62bfc85a53c8
util.stanza: Add stricter validation for data passed to stanza builder API
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
77 for k, v in pairs(attr) do |
8626
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
78 check_name(k, "attribute"); |
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
79 check_text(v, "attribute"); |
8599
62bfc85a53c8
util.stanza: Add stricter validation for data passed to stanza builder API
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
80 end |
62bfc85a53c8
util.stanza: Add stricter validation for data passed to stanza builder API
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
81 end |
62bfc85a53c8
util.stanza: Add stricter validation for data passed to stanza builder API
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
82 end |
62bfc85a53c8
util.stanza: Add stricter validation for data passed to stanza builder API
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
83 |
7256 | 84 local function new_stanza(name, attr, namespaces) |
8626
20532f191f8d
util.stanza: Switch from asserts to if's, improve performance, errors and tests
Matthew Wild <mwild1@gmail.com>
parents:
8599
diff
changeset
|
85 check_name(name, "tag"); |
8599
62bfc85a53c8
util.stanza: Add stricter validation for data passed to stanza builder API
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
86 check_attr(attr); |
6978
30c96a5db360
util.stanza, util.xml, util.xmppstream: Add support for tracking defined namespaces and their prefix (stanza.namespaces), knowing/preserving prefix names is required for some applications (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents:
6821
diff
changeset
|
87 local stanza = { name = name, attr = attr or {}, namespaces = namespaces, tags = {} }; |
0 | 88 return setmetatable(stanza, stanza_mt); |
89 end | |
90 | |
7750
e58524240b30
util.stanza: Add an is_stanza() function to check if an object is a stanza
Kim Alvefur <zash@zash.se>
parents:
7253
diff
changeset
|
91 local function is_stanza(s) |
e58524240b30
util.stanza: Add an is_stanza() function to check if an object is a stanza
Kim Alvefur <zash@zash.se>
parents:
7253
diff
changeset
|
92 return getmetatable(s) == stanza_mt; |
e58524240b30
util.stanza: Add an is_stanza() function to check if an object is a stanza
Kim Alvefur <zash@zash.se>
parents:
7253
diff
changeset
|
93 end |
e58524240b30
util.stanza: Add an is_stanza() function to check if an object is a stanza
Kim Alvefur <zash@zash.se>
parents:
7253
diff
changeset
|
94 |
0 | 95 function stanza_mt:query(xmlns) |
96 return self:tag("query", { xmlns = xmlns }); | |
97 end | |
373
dd0345edeaf4
Add helper function for adding message bodies to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
338
diff
changeset
|
98 |
dd0345edeaf4
Add helper function for adding message bodies to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
338
diff
changeset
|
99 function stanza_mt:body(text, attr) |
10116
4807535b8673
util.stanza: Use :text_tag internally everywhere
Kim Alvefur <zash@zash.se>
parents:
9924
diff
changeset
|
100 return self:text_tag("body", text, attr); |
373
dd0345edeaf4
Add helper function for adding message bodies to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
338
diff
changeset
|
101 end |
dd0345edeaf4
Add helper function for adding message bodies to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
338
diff
changeset
|
102 |
8645
06c73b010488
util.stanza: Add :text_tag(), a shortcut for adding nodes with text
Kim Alvefur <zash@zash.se>
parents:
8640
diff
changeset
|
103 function stanza_mt:text_tag(name, text, attr, namespaces) |
06c73b010488
util.stanza: Add :text_tag(), a shortcut for adding nodes with text
Kim Alvefur <zash@zash.se>
parents:
8640
diff
changeset
|
104 return self:tag(name, attr, namespaces):text(text):up(); |
06c73b010488
util.stanza: Add :text_tag(), a shortcut for adding nodes with text
Kim Alvefur <zash@zash.se>
parents:
8640
diff
changeset
|
105 end |
06c73b010488
util.stanza: Add :text_tag(), a shortcut for adding nodes with text
Kim Alvefur <zash@zash.se>
parents:
8640
diff
changeset
|
106 |
6978
30c96a5db360
util.stanza, util.xml, util.xmppstream: Add support for tracking defined namespaces and their prefix (stanza.namespaces), knowing/preserving prefix names is required for some applications (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents:
6821
diff
changeset
|
107 function stanza_mt:tag(name, attr, namespaces) |
7256 | 108 local s = new_stanza(name, attr, namespaces); |
3638
6f58a3063c14
util.stanza, util.xmppstream, core.xmlhandlers: Allow stanza.last_add to be nil, and set it nil by default. Saves a table allocation per-element. 20% faster stanza building.
Waqas Hussain <waqas20@gmail.com>
parents:
3502
diff
changeset
|
109 local last_add = self.last_add; |
6f58a3063c14
util.stanza, util.xmppstream, core.xmlhandlers: Allow stanza.last_add to be nil, and set it nil by default. Saves a table allocation per-element. 20% faster stanza building.
Waqas Hussain <waqas20@gmail.com>
parents:
3502
diff
changeset
|
110 if not last_add then last_add = {}; self.last_add = last_add; end |
6f58a3063c14
util.stanza, util.xmppstream, core.xmlhandlers: Allow stanza.last_add to be nil, and set it nil by default. Saves a table allocation per-element. 20% faster stanza building.
Waqas Hussain <waqas20@gmail.com>
parents:
3502
diff
changeset
|
111 (last_add[#last_add] or self):add_direct_child(s); |
6f58a3063c14
util.stanza, util.xmppstream, core.xmlhandlers: Allow stanza.last_add to be nil, and set it nil by default. Saves a table allocation per-element. 20% faster stanza building.
Waqas Hussain <waqas20@gmail.com>
parents:
3502
diff
changeset
|
112 t_insert(last_add, s); |
0 | 113 return self; |
114 end | |
115 | |
116 function stanza_mt:text(text) | |
8640
8f13ec2ceb06
util.stanza: Allow :text(nil) and :text("") as harmless nops
Matthew Wild <mwild1@gmail.com>
parents:
8626
diff
changeset
|
117 if text ~= nil and text ~= "" then |
8f13ec2ceb06
util.stanza: Allow :text(nil) and :text("") as harmless nops
Matthew Wild <mwild1@gmail.com>
parents:
8626
diff
changeset
|
118 local last_add = self.last_add; |
8f13ec2ceb06
util.stanza: Allow :text(nil) and :text("") as harmless nops
Matthew Wild <mwild1@gmail.com>
parents:
8626
diff
changeset
|
119 (last_add and last_add[#last_add] or self):add_direct_child(text); |
8f13ec2ceb06
util.stanza: Allow :text(nil) and :text("") as harmless nops
Matthew Wild <mwild1@gmail.com>
parents:
8626
diff
changeset
|
120 end |
2482
a1570e371258
util.stanza: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2264
diff
changeset
|
121 return self; |
0 | 122 end |
123 | |
124 function stanza_mt:up() | |
3638
6f58a3063c14
util.stanza, util.xmppstream, core.xmlhandlers: Allow stanza.last_add to be nil, and set it nil by default. Saves a table allocation per-element. 20% faster stanza building.
Waqas Hussain <waqas20@gmail.com>
parents:
3502
diff
changeset
|
125 local last_add = self.last_add; |
6f58a3063c14
util.stanza, util.xmppstream, core.xmlhandlers: Allow stanza.last_add to be nil, and set it nil by default. Saves a table allocation per-element. 20% faster stanza building.
Waqas Hussain <waqas20@gmail.com>
parents:
3502
diff
changeset
|
126 if last_add then t_remove(last_add); end |
0 | 127 return self; |
128 end | |
129 | |
11574
21217f7e82b9
util.stanza: add at_top helper
Jonas Schäfer <jonas@wielicki.name>
parents:
11264
diff
changeset
|
130 function stanza_mt:at_top() |
21217f7e82b9
util.stanza: add at_top helper
Jonas Schäfer <jonas@wielicki.name>
parents:
11264
diff
changeset
|
131 return self.last_add == nil or #self.last_add == 0 |
21217f7e82b9
util.stanza: add at_top helper
Jonas Schäfer <jonas@wielicki.name>
parents:
11264
diff
changeset
|
132 end |
21217f7e82b9
util.stanza: add at_top helper
Jonas Schäfer <jonas@wielicki.name>
parents:
11264
diff
changeset
|
133 |
964
3296db2ad4a0
util.stanza: stanza:reset() method to reset building state
Matthew Wild <mwild1@gmail.com>
parents:
896
diff
changeset
|
134 function stanza_mt:reset() |
3638
6f58a3063c14
util.stanza, util.xmppstream, core.xmlhandlers: Allow stanza.last_add to be nil, and set it nil by default. Saves a table allocation per-element. 20% faster stanza building.
Waqas Hussain <waqas20@gmail.com>
parents:
3502
diff
changeset
|
135 self.last_add = nil; |
964
3296db2ad4a0
util.stanza: stanza:reset() method to reset building state
Matthew Wild <mwild1@gmail.com>
parents:
896
diff
changeset
|
136 return self; |
3296db2ad4a0
util.stanza: stanza:reset() method to reset building state
Matthew Wild <mwild1@gmail.com>
parents:
896
diff
changeset
|
137 end |
3296db2ad4a0
util.stanza: stanza:reset() method to reset building state
Matthew Wild <mwild1@gmail.com>
parents:
896
diff
changeset
|
138 |
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
|
139 function stanza_mt:add_direct_child(child) |
8889
c4e430c69f88
util.stanza: Verify that child tags added are really stanzas (closes #1165)
Kim Alvefur <zash@zash.se>
parents:
8645
diff
changeset
|
140 if is_stanza(child) then |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
141 t_insert(self.tags, child); |
8890
3490bc478804
util.stanza: Verify that other objects added as children are valid strings
Kim Alvefur <zash@zash.se>
parents:
8889
diff
changeset
|
142 t_insert(self, child); |
3490bc478804
util.stanza: Verify that other objects added as children are valid strings
Kim Alvefur <zash@zash.se>
parents:
8889
diff
changeset
|
143 else |
3490bc478804
util.stanza: Verify that other objects added as children are valid strings
Kim Alvefur <zash@zash.se>
parents:
8889
diff
changeset
|
144 check_text(child, "text"); |
3490bc478804
util.stanza: Verify that other objects added as children are valid strings
Kim Alvefur <zash@zash.se>
parents:
8889
diff
changeset
|
145 t_insert(self, child); |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
146 end |
0 | 147 end |
148 | |
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
|
149 function stanza_mt:add_child(child) |
3638
6f58a3063c14
util.stanza, util.xmppstream, core.xmlhandlers: Allow stanza.last_add to be nil, and set it nil by default. Saves a table allocation per-element. 20% faster stanza building.
Waqas Hussain <waqas20@gmail.com>
parents:
3502
diff
changeset
|
150 local last_add = self.last_add; |
6f58a3063c14
util.stanza, util.xmppstream, core.xmlhandlers: Allow stanza.last_add to be nil, and set it nil by default. Saves a table allocation per-element. 20% faster stanza building.
Waqas Hussain <waqas20@gmail.com>
parents:
3502
diff
changeset
|
151 (last_add and last_add[#last_add] or self):add_direct_child(child); |
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
|
152 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
|
153 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
|
154 |
8998
6bddc90eeb27
util.stanza: Add method for removing all children with a specific name, xmlns
Kim Alvefur <zash@zash.se>
parents:
7750
diff
changeset
|
155 function stanza_mt:remove_children(name, xmlns) |
6bddc90eeb27
util.stanza: Add method for removing all children with a specific name, xmlns
Kim Alvefur <zash@zash.se>
parents:
7750
diff
changeset
|
156 xmlns = xmlns or self.attr.xmlns; |
6bddc90eeb27
util.stanza: Add method for removing all children with a specific name, xmlns
Kim Alvefur <zash@zash.se>
parents:
7750
diff
changeset
|
157 return self:maptags(function (tag) |
6bddc90eeb27
util.stanza: Add method for removing all children with a specific name, xmlns
Kim Alvefur <zash@zash.se>
parents:
7750
diff
changeset
|
158 if (not name or tag.name == name) and tag.attr.xmlns == xmlns then |
6bddc90eeb27
util.stanza: Add method for removing all children with a specific name, xmlns
Kim Alvefur <zash@zash.se>
parents:
7750
diff
changeset
|
159 return nil; |
6bddc90eeb27
util.stanza: Add method for removing all children with a specific name, xmlns
Kim Alvefur <zash@zash.se>
parents:
7750
diff
changeset
|
160 end |
6bddc90eeb27
util.stanza: Add method for removing all children with a specific name, xmlns
Kim Alvefur <zash@zash.se>
parents:
7750
diff
changeset
|
161 return tag; |
6bddc90eeb27
util.stanza: Add method for removing all children with a specific name, xmlns
Kim Alvefur <zash@zash.se>
parents:
7750
diff
changeset
|
162 end); |
6bddc90eeb27
util.stanza: Add method for removing all children with a specific name, xmlns
Kim Alvefur <zash@zash.se>
parents:
7750
diff
changeset
|
163 end |
6bddc90eeb27
util.stanza: Add method for removing all children with a specific name, xmlns
Kim Alvefur <zash@zash.se>
parents:
7750
diff
changeset
|
164 |
2264
49580a13f71e
util.stanza: Add stanza:get_child(name, xmlns) to find a child tag given a name/xmlns
Matthew Wild <mwild1@gmail.com>
parents:
2077
diff
changeset
|
165 function stanza_mt:get_child(name, xmlns) |
49580a13f71e
util.stanza: Add stanza:get_child(name, xmlns) to find a child tag given a name/xmlns
Matthew Wild <mwild1@gmail.com>
parents:
2077
diff
changeset
|
166 for _, child in ipairs(self.tags) do |
2482
a1570e371258
util.stanza: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2264
diff
changeset
|
167 if (not name or child.name == name) |
2264
49580a13f71e
util.stanza: Add stanza:get_child(name, xmlns) to find a child tag given a name/xmlns
Matthew Wild <mwild1@gmail.com>
parents:
2077
diff
changeset
|
168 and ((not xmlns and self.attr.xmlns == child.attr.xmlns) |
49580a13f71e
util.stanza: Add stanza:get_child(name, xmlns) to find a child tag given a name/xmlns
Matthew Wild <mwild1@gmail.com>
parents:
2077
diff
changeset
|
169 or child.attr.xmlns == xmlns) then |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5435
diff
changeset
|
170 |
2264
49580a13f71e
util.stanza: Add stanza:get_child(name, xmlns) to find a child tag given a name/xmlns
Matthew Wild <mwild1@gmail.com>
parents:
2077
diff
changeset
|
171 return child; |
49580a13f71e
util.stanza: Add stanza:get_child(name, xmlns) to find a child tag given a name/xmlns
Matthew Wild <mwild1@gmail.com>
parents:
2077
diff
changeset
|
172 end |
49580a13f71e
util.stanza: Add stanza:get_child(name, xmlns) to find a child tag given a name/xmlns
Matthew Wild <mwild1@gmail.com>
parents:
2077
diff
changeset
|
173 end |
12724
5b5b428d67e2
util.stanza: Return nil instead of nothing (fix test with luassert >=1.9)
Kim Alvefur <zash@zash.se>
parents:
12140
diff
changeset
|
174 return nil; |
2264
49580a13f71e
util.stanza: Add stanza:get_child(name, xmlns) to find a child tag given a name/xmlns
Matthew Wild <mwild1@gmail.com>
parents:
2077
diff
changeset
|
175 end |
49580a13f71e
util.stanza: Add stanza:get_child(name, xmlns) to find a child tag given a name/xmlns
Matthew Wild <mwild1@gmail.com>
parents:
2077
diff
changeset
|
176 |
4132
ccc16434dbe2
util.stanza: Add get_child_text() method to get the text of the specified child element (get_child() + get_text() rolled into one step)
Matthew Wild <mwild1@gmail.com>
parents:
3766
diff
changeset
|
177 function stanza_mt:get_child_text(name, xmlns) |
ccc16434dbe2
util.stanza: Add get_child_text() method to get the text of the specified child element (get_child() + get_text() rolled into one step)
Matthew Wild <mwild1@gmail.com>
parents:
3766
diff
changeset
|
178 local tag = self:get_child(name, xmlns); |
ccc16434dbe2
util.stanza: Add get_child_text() method to get the text of the specified child element (get_child() + get_text() rolled into one step)
Matthew Wild <mwild1@gmail.com>
parents:
3766
diff
changeset
|
179 if tag then |
ccc16434dbe2
util.stanza: Add get_child_text() method to get the text of the specified child element (get_child() + get_text() rolled into one step)
Matthew Wild <mwild1@gmail.com>
parents:
3766
diff
changeset
|
180 return tag:get_text(); |
ccc16434dbe2
util.stanza: Add get_child_text() method to get the text of the specified child element (get_child() + get_text() rolled into one step)
Matthew Wild <mwild1@gmail.com>
parents:
3766
diff
changeset
|
181 end |
ccc16434dbe2
util.stanza: Add get_child_text() method to get the text of the specified child element (get_child() + get_text() rolled into one step)
Matthew Wild <mwild1@gmail.com>
parents:
3766
diff
changeset
|
182 return nil; |
ccc16434dbe2
util.stanza: Add get_child_text() method to get the text of the specified child element (get_child() + get_text() rolled into one step)
Matthew Wild <mwild1@gmail.com>
parents:
3766
diff
changeset
|
183 end |
ccc16434dbe2
util.stanza: Add get_child_text() method to get the text of the specified child element (get_child() + get_text() rolled into one step)
Matthew Wild <mwild1@gmail.com>
parents:
3766
diff
changeset
|
184 |
12636
e8934ce6ea0f
util.stanza: Add method for extracting a single attribute value
Kim Alvefur <zash@zash.se>
parents:
12407
diff
changeset
|
185 function stanza_mt:get_child_attr(name, xmlns, attr) |
e8934ce6ea0f
util.stanza: Add method for extracting a single attribute value
Kim Alvefur <zash@zash.se>
parents:
12407
diff
changeset
|
186 local tag = self:get_child(name, xmlns); |
e8934ce6ea0f
util.stanza: Add method for extracting a single attribute value
Kim Alvefur <zash@zash.se>
parents:
12407
diff
changeset
|
187 if tag then |
e8934ce6ea0f
util.stanza: Add method for extracting a single attribute value
Kim Alvefur <zash@zash.se>
parents:
12407
diff
changeset
|
188 return tag.attr[attr]; |
e8934ce6ea0f
util.stanza: Add method for extracting a single attribute value
Kim Alvefur <zash@zash.se>
parents:
12407
diff
changeset
|
189 end |
e8934ce6ea0f
util.stanza: Add method for extracting a single attribute value
Kim Alvefur <zash@zash.se>
parents:
12407
diff
changeset
|
190 return nil; |
e8934ce6ea0f
util.stanza: Add method for extracting a single attribute value
Kim Alvefur <zash@zash.se>
parents:
12407
diff
changeset
|
191 end |
e8934ce6ea0f
util.stanza: Add method for extracting a single attribute value
Kim Alvefur <zash@zash.se>
parents:
12407
diff
changeset
|
192 |
0 | 193 function stanza_mt:child_with_name(name) |
2482
a1570e371258
util.stanza: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2264
diff
changeset
|
194 for _, child in ipairs(self.tags) do |
0 | 195 if child.name == name then return child; end |
196 end | |
12724
5b5b428d67e2
util.stanza: Return nil instead of nothing (fix test with luassert >=1.9)
Kim Alvefur <zash@zash.se>
parents:
12140
diff
changeset
|
197 return nil; |
0 | 198 end |
199 | |
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
|
200 function stanza_mt:child_with_ns(ns) |
2482
a1570e371258
util.stanza: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2264
diff
changeset
|
201 for _, child in ipairs(self.tags) do |
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
|
202 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
|
203 end |
12724
5b5b428d67e2
util.stanza: Return nil instead of nothing (fix test with luassert >=1.9)
Kim Alvefur <zash@zash.se>
parents:
12140
diff
changeset
|
204 return nil; |
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
|
205 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
|
206 |
11786
39164ea2ab9e
util.stanza: Add :get_child_with_attr() + tests
Matthew Wild <mwild1@gmail.com>
parents:
11642
diff
changeset
|
207 function stanza_mt:get_child_with_attr(name, xmlns, attr_name, attr_value, normalize) |
39164ea2ab9e
util.stanza: Add :get_child_with_attr() + tests
Matthew Wild <mwild1@gmail.com>
parents:
11642
diff
changeset
|
208 for tag in self:childtags(name, xmlns) do |
39164ea2ab9e
util.stanza: Add :get_child_with_attr() + tests
Matthew Wild <mwild1@gmail.com>
parents:
11642
diff
changeset
|
209 if (normalize and normalize(tag.attr[attr_name]) or tag.attr[attr_name]) == attr_value then |
39164ea2ab9e
util.stanza: Add :get_child_with_attr() + tests
Matthew Wild <mwild1@gmail.com>
parents:
11642
diff
changeset
|
210 return tag; |
39164ea2ab9e
util.stanza: Add :get_child_with_attr() + tests
Matthew Wild <mwild1@gmail.com>
parents:
11642
diff
changeset
|
211 end |
39164ea2ab9e
util.stanza: Add :get_child_with_attr() + tests
Matthew Wild <mwild1@gmail.com>
parents:
11642
diff
changeset
|
212 end |
12724
5b5b428d67e2
util.stanza: Return nil instead of nothing (fix test with luassert >=1.9)
Kim Alvefur <zash@zash.se>
parents:
12140
diff
changeset
|
213 return nil; |
11786
39164ea2ab9e
util.stanza: Add :get_child_with_attr() + tests
Matthew Wild <mwild1@gmail.com>
parents:
11642
diff
changeset
|
214 end |
39164ea2ab9e
util.stanza: Add :get_child_with_attr() + tests
Matthew Wild <mwild1@gmail.com>
parents:
11642
diff
changeset
|
215 |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
216 function stanza_mt:children() |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
217 local i = 0; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
218 return function (a) |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
219 i = i + 1 |
3475
0307a3ac3885
util.stanza: Optimisation, remove useless if...then in stanza:children() iterator
Matthew Wild <mwild1@gmail.com>
parents:
3474
diff
changeset
|
220 return a[i]; |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
221 end, self, i; |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
222 end |
3474
730876bbe4e6
util.stanza: Add stanza:matched_children(name, xmlns) [name suggestions welcome]
Matthew Wild <mwild1@gmail.com>
parents:
2961
diff
changeset
|
223 |
4168
4919831b5b56
util.stanza: Clean up matching_tags() and replace :childtags() with it
Matthew Wild <mwild1@gmail.com>
parents:
4136
diff
changeset
|
224 function stanza_mt:childtags(name, xmlns) |
3474
730876bbe4e6
util.stanza: Add stanza:matched_children(name, xmlns) [name suggestions welcome]
Matthew Wild <mwild1@gmail.com>
parents:
2961
diff
changeset
|
225 local tags = self.tags; |
730876bbe4e6
util.stanza: Add stanza:matched_children(name, xmlns) [name suggestions welcome]
Matthew Wild <mwild1@gmail.com>
parents:
2961
diff
changeset
|
226 local start_i, max_i = 1, #tags; |
730876bbe4e6
util.stanza: Add stanza:matched_children(name, xmlns) [name suggestions welcome]
Matthew Wild <mwild1@gmail.com>
parents:
2961
diff
changeset
|
227 return function () |
4168
4919831b5b56
util.stanza: Clean up matching_tags() and replace :childtags() with it
Matthew Wild <mwild1@gmail.com>
parents:
4136
diff
changeset
|
228 for i = start_i, max_i do |
4919831b5b56
util.stanza: Clean up matching_tags() and replace :childtags() with it
Matthew Wild <mwild1@gmail.com>
parents:
4136
diff
changeset
|
229 local v = tags[i]; |
4919831b5b56
util.stanza: Clean up matching_tags() and replace :childtags() with it
Matthew Wild <mwild1@gmail.com>
parents:
4136
diff
changeset
|
230 if (not name or v.name == name) |
4936
92c86e11fd44
util.stanza: Make stanza:childtags() behave like :get_child()
Kim Alvefur <zash@zash.se>
parents:
4749
diff
changeset
|
231 and ((not xmlns and self.attr.xmlns == v.attr.xmlns) |
92c86e11fd44
util.stanza: Make stanza:childtags() behave like :get_child()
Kim Alvefur <zash@zash.se>
parents:
4749
diff
changeset
|
232 or v.attr.xmlns == xmlns) then |
4168
4919831b5b56
util.stanza: Clean up matching_tags() and replace :childtags() with it
Matthew Wild <mwild1@gmail.com>
parents:
4136
diff
changeset
|
233 start_i = i+1; |
4919831b5b56
util.stanza: Clean up matching_tags() and replace :childtags() with it
Matthew Wild <mwild1@gmail.com>
parents:
4136
diff
changeset
|
234 return v; |
3474
730876bbe4e6
util.stanza: Add stanza:matched_children(name, xmlns) [name suggestions welcome]
Matthew Wild <mwild1@gmail.com>
parents:
2961
diff
changeset
|
235 end |
4168
4919831b5b56
util.stanza: Clean up matching_tags() and replace :childtags() with it
Matthew Wild <mwild1@gmail.com>
parents:
4136
diff
changeset
|
236 end |
4919831b5b56
util.stanza: Clean up matching_tags() and replace :childtags() with it
Matthew Wild <mwild1@gmail.com>
parents:
4136
diff
changeset
|
237 end; |
2 | 238 end |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
0
diff
changeset
|
239 |
3477
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
240 function stanza_mt:maptags(callback) |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
241 local tags, curr_tag = self.tags, 1; |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
242 local n_children, n_tags = #self, #tags; |
9217
7df29c5fbb9b
util.stanza + tests: Bail out of loop if we are iterating too far, fixes #981
Matthew Wild <mwild1@gmail.com>
parents:
8999
diff
changeset
|
243 local max_iterations = n_children + 1; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5435
diff
changeset
|
244 |
3477
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
245 local i = 1; |
5414
efec29eb4cdd
util.stanza: :maptags(): Fixes to make loop more robust on item removal
Matthew Wild <mwild1@gmail.com>
parents:
5090
diff
changeset
|
246 while curr_tag <= n_tags and n_tags > 0 do |
3477
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
247 if self[i] == tags[curr_tag] then |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
248 local ret = callback(self[i]); |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
249 if ret == nil then |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
250 t_remove(self, i); |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
251 t_remove(tags, curr_tag); |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
252 n_children = n_children - 1; |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
253 n_tags = n_tags - 1; |
5414
efec29eb4cdd
util.stanza: :maptags(): Fixes to make loop more robust on item removal
Matthew Wild <mwild1@gmail.com>
parents:
5090
diff
changeset
|
254 i = i - 1; |
efec29eb4cdd
util.stanza: :maptags(): Fixes to make loop more robust on item removal
Matthew Wild <mwild1@gmail.com>
parents:
5090
diff
changeset
|
255 curr_tag = curr_tag - 1; |
3477
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
256 else |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
257 self[i] = ret; |
5435
f56e449a63e3
util.stanza: Use correct index when replacing the tag in .tags (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents:
5424
diff
changeset
|
258 tags[curr_tag] = ret; |
3477
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
259 end |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
260 curr_tag = curr_tag + 1; |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
261 end |
5414
efec29eb4cdd
util.stanza: :maptags(): Fixes to make loop more robust on item removal
Matthew Wild <mwild1@gmail.com>
parents:
5090
diff
changeset
|
262 i = i + 1; |
9217
7df29c5fbb9b
util.stanza + tests: Bail out of loop if we are iterating too far, fixes #981
Matthew Wild <mwild1@gmail.com>
parents:
8999
diff
changeset
|
263 if i > max_iterations then |
7df29c5fbb9b
util.stanza + tests: Bail out of loop if we are iterating too far, fixes #981
Matthew Wild <mwild1@gmail.com>
parents:
8999
diff
changeset
|
264 -- COMPAT: Hopefully temporary guard against #981 while we |
7df29c5fbb9b
util.stanza + tests: Bail out of loop if we are iterating too far, fixes #981
Matthew Wild <mwild1@gmail.com>
parents:
8999
diff
changeset
|
265 -- figure out the root cause |
7df29c5fbb9b
util.stanza + tests: Bail out of loop if we are iterating too far, fixes #981
Matthew Wild <mwild1@gmail.com>
parents:
8999
diff
changeset
|
266 error("Invalid stanza state! Please report this error."); |
7df29c5fbb9b
util.stanza + tests: Bail out of loop if we are iterating too far, fixes #981
Matthew Wild <mwild1@gmail.com>
parents:
8999
diff
changeset
|
267 end |
3477
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
268 end |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
269 return self; |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
270 end |
6350b114e0e4
util.stanza: Add stanza:maptags() to apply a function over child tags (return nil to remove tag from stanza)
Matthew Wild <mwild1@gmail.com>
parents:
3475
diff
changeset
|
271 |
5424
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
272 function stanza_mt:find(path) |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
273 local pos = 1; |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
274 local len = #path + 1; |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
275 |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
276 repeat |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
277 local xmlns, name, text; |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
278 local char = s_sub(path, pos, pos); |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
279 if char == "@" then |
13569
59dacbd637c2
util.stanza: Handle Clark notation for attributes in :find()
Kim Alvefur <zash@zash.se>
parents:
13568
diff
changeset
|
280 if s_sub(path, pos + 1, pos + 1) == "{" then |
59dacbd637c2
util.stanza: Handle Clark notation for attributes in :find()
Kim Alvefur <zash@zash.se>
parents:
13568
diff
changeset
|
281 return self.attr[s_gsub(s_sub(path, pos+2), "}", "\1", 1)]; |
59dacbd637c2
util.stanza: Handle Clark notation for attributes in :find()
Kim Alvefur <zash@zash.se>
parents:
13568
diff
changeset
|
282 end |
13568
3615590fd9ed
util.stanza: Handle namespace prefixes for attributes in :find()
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
283 local prefix, attr = s_match(path, "^([^:]+):(.*)", pos+1); |
3615590fd9ed
util.stanza: Handle namespace prefixes for attributes in :find()
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
284 if prefix and self.namespaces and self.namespaces[prefix] then |
3615590fd9ed
util.stanza: Handle namespace prefixes for attributes in :find()
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
285 return self.attr[self.namespaces[prefix] .. "\1" .. attr]; |
3615590fd9ed
util.stanza: Handle namespace prefixes for attributes in :find()
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
286 end |
5424
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
287 return self.attr[s_sub(path, pos + 1)]; |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
288 elseif char == "{" then |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
289 xmlns, pos = s_match(path, "^([^}]+)}()", pos + 1); |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
290 end |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
291 name, text, pos = s_match(path, "^([^@/#]*)([/#]?)()", pos); |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
292 name = name ~= "" and name or nil; |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
293 if pos == len then |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
294 if text == "#" then |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
295 return self:get_child_text(name, xmlns); |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
296 end |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
297 return self:get_child(name, xmlns); |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
298 end |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
299 self = self:get_child(name, xmlns); |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
300 until not self |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
301 end |
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
302 |
9924
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
303 local function _clone(stanza, only_top) |
12407
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
304 local attr = {}; |
9924
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
305 for k,v in pairs(stanza.attr) do attr[k] = v; end |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
306 local old_namespaces, namespaces = stanza.namespaces; |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
307 if old_namespaces then |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
308 namespaces = {}; |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
309 for k,v in pairs(old_namespaces) do namespaces[k] = v; end |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
310 end |
12407
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
311 local tags, new; |
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
312 if only_top then |
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
313 tags = {}; |
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
314 new = { name = stanza.name, attr = attr, namespaces = namespaces, tags = tags }; |
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
315 else |
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
316 tags = t_create(#stanza.tags, 0); |
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
317 new = t_create(#stanza, 4); |
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
318 new.name = stanza.name; |
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
319 new.attr = attr; |
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
320 new.namespaces = namespaces; |
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
321 new.tags = tags; |
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
322 end |
b6b01724e04f
util.stanza: Create tables with correct size to avoid reallocations
Kim Alvefur <zash@zash.se>
parents:
12406
diff
changeset
|
323 |
12406
a3ddf3f42212
util.stanza: Use table.move in clone
Kim Alvefur <zash@zash.se>
parents:
12140
diff
changeset
|
324 setmetatable(new, stanza_mt); |
9924
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
325 if not only_top then |
12406
a3ddf3f42212
util.stanza: Use table.move in clone
Kim Alvefur <zash@zash.se>
parents:
12140
diff
changeset
|
326 t_move(stanza, 1, #stanza, 1, new); |
a3ddf3f42212
util.stanza: Use table.move in clone
Kim Alvefur <zash@zash.se>
parents:
12140
diff
changeset
|
327 t_move(stanza.tags, 1, #stanza.tags, 1, tags); |
a3ddf3f42212
util.stanza: Use table.move in clone
Kim Alvefur <zash@zash.se>
parents:
12140
diff
changeset
|
328 new:maptags(_clone); |
9924
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
329 end |
12406
a3ddf3f42212
util.stanza: Use table.move in clone
Kim Alvefur <zash@zash.se>
parents:
12140
diff
changeset
|
330 return new; |
9924
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
331 end |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
332 |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
333 local function clone(stanza, only_top) |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
334 if not is_stanza(stanza) then |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
335 error("bad argument to clone: expected stanza, got "..type(stanza)); |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
336 end |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
337 return _clone(stanza, only_top); |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
338 end |
5424
7318527c6dea
util.stanza: Add stanza:find(), a light weight XPath-like method
Kim Alvefur <zash@zash.se>
parents:
5414
diff
changeset
|
339 |
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
340 local escape_table = { ["'"] = "'", ["\""] = """, ["<"] = "<", [">"] = ">", ["&"] = "&" }; |
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
341 local function xml_escape(str) return (s_gsub(str, "['&<>\"]", escape_table)); end |
1931
f203330eb82e
util.stanza: Make xml_escape publicly accessible
Matthew Wild <mwild1@gmail.com>
parents:
1874
diff
changeset
|
342 |
7253
f4e71242556a
util.stanza: Some code cleanup [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6821
diff
changeset
|
343 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
|
344 local nsid = 0; |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
345 local name = t.name |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
346 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
|
347 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
|
348 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
|
349 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
|
350 nsid = nsid + 1; |
7253
f4e71242556a
util.stanza: Some code cleanup [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6821
diff
changeset
|
351 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
|
352 elseif not(k == "xmlns" and v == parentns) then |
7253
f4e71242556a
util.stanza: Some code cleanup [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6821
diff
changeset
|
353 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
|
354 end |
1416
f916f0ff90e5
util.stanza: Rewrote stanza_mt.__tostring. 20-30% faster stanza serialization. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1415
diff
changeset
|
355 end |
1431
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
356 local len = #t; |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
357 if len == 0 then |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
358 t_insert(buf, "/>"); |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
359 else |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
360 t_insert(buf, ">"); |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
361 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
|
362 local child = t[n]; |
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
363 if child.name then |
7253
f4e71242556a
util.stanza: Some code cleanup [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6821
diff
changeset
|
364 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
|
365 else |
7253
f4e71242556a
util.stanza: Some code cleanup [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6821
diff
changeset
|
366 t_insert(buf, _xml_escape(child)); |
1431
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
367 end |
4 | 368 end |
1431
9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
Waqas Hussain <waqas20@gmail.com>
parents:
1420
diff
changeset
|
369 t_insert(buf, "</"..name..">"); |
0 | 370 end |
626
cf1d26fd4d6f
Optimized stanza_mt.__tostring (called when doing tostring(stanza))
Waqas Hussain <waqas20@gmail.com>
parents:
519
diff
changeset
|
371 end |
cf1d26fd4d6f
Optimized stanza_mt.__tostring (called when doing tostring(stanza))
Waqas Hussain <waqas20@gmail.com>
parents:
519
diff
changeset
|
372 function stanza_mt.__tostring(t) |
cf1d26fd4d6f
Optimized stanza_mt.__tostring (called when doing tostring(stanza))
Waqas Hussain <waqas20@gmail.com>
parents:
519
diff
changeset
|
373 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
|
374 _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
|
375 return t_concat(buf); |
0 | 376 end |
377 | |
242
f15afbcbc55c
Add new top_tag() method to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
378 function stanza_mt.top_tag(t) |
9924
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
379 local top_tag_clone = clone(t, true); |
5a2e53bef031
util.stanza: Fix :top_tag() handling of namespaced attributes
Matthew Wild <mwild1@gmail.com>
parents:
9732
diff
changeset
|
380 return tostring(top_tag_clone):sub(1,-3)..">"; |
242
f15afbcbc55c
Add new top_tag() method to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
381 end |
f15afbcbc55c
Add new top_tag() method to stanzas
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
382 |
1420
1576a5aa52f8
util.stanza: Add stanza:get_text() to retrieve all child text nodes #api
Matthew Wild <mwild1@gmail.com>
parents:
1416
diff
changeset
|
383 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
|
384 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
|
385 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
|
386 end |
12724
5b5b428d67e2
util.stanza: Return nil instead of nothing (fix test with luassert >=1.9)
Kim Alvefur <zash@zash.se>
parents:
12140
diff
changeset
|
387 return nil; |
1420
1576a5aa52f8
util.stanza: Add stanza:get_text() to retrieve all child text nodes #api
Matthew Wild <mwild1@gmail.com>
parents:
1416
diff
changeset
|
388 end |
1576a5aa52f8
util.stanza: Add stanza:get_text() to retrieve all child text nodes #api
Matthew Wild <mwild1@gmail.com>
parents:
1416
diff
changeset
|
389 |
2526
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
390 function stanza_mt.get_error(stanza) |
11088
1f84d0e4d0c4
util.stanza: Extract Application-Specific Condition from errors
Kim Alvefur <zash@zash.se>
parents:
11086
diff
changeset
|
391 local error_type, condition, text, extra_tag; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5435
diff
changeset
|
392 |
2526
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
393 local error_tag = stanza:get_child("error"); |
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
394 if not error_tag then |
11088
1f84d0e4d0c4
util.stanza: Extract Application-Specific Condition from errors
Kim Alvefur <zash@zash.se>
parents:
11086
diff
changeset
|
395 return nil, nil, nil, nil; |
2526
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
396 end |
7253
f4e71242556a
util.stanza: Some code cleanup [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6821
diff
changeset
|
397 error_type = error_tag.attr.type; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5435
diff
changeset
|
398 |
5090
61c7c53c06d5
util.stanza: Use ipairs instead of childtags (behavior changed in 92c86e11fd44)
Kim Alvefur <zash@zash.se>
parents:
4936
diff
changeset
|
399 for _, child in ipairs(error_tag.tags) do |
2526
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
400 if child.attr.xmlns == xmlns_stanzas then |
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
401 if not text and child.name == "text" then |
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
402 text = child:get_text(); |
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
403 elseif not condition then |
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
404 condition = child.name; |
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
405 end |
11088
1f84d0e4d0c4
util.stanza: Extract Application-Specific Condition from errors
Kim Alvefur <zash@zash.se>
parents:
11086
diff
changeset
|
406 else |
1f84d0e4d0c4
util.stanza: Extract Application-Specific Condition from errors
Kim Alvefur <zash@zash.se>
parents:
11086
diff
changeset
|
407 extra_tag = child; |
1f84d0e4d0c4
util.stanza: Extract Application-Specific Condition from errors
Kim Alvefur <zash@zash.se>
parents:
11086
diff
changeset
|
408 end |
1f84d0e4d0c4
util.stanza: Extract Application-Specific Condition from errors
Kim Alvefur <zash@zash.se>
parents:
11086
diff
changeset
|
409 if condition and text and extra_tag then |
1f84d0e4d0c4
util.stanza: Extract Application-Specific Condition from errors
Kim Alvefur <zash@zash.se>
parents:
11086
diff
changeset
|
410 break; |
2526
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
411 end |
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
412 end |
11088
1f84d0e4d0c4
util.stanza: Extract Application-Specific Condition from errors
Kim Alvefur <zash@zash.se>
parents:
11086
diff
changeset
|
413 return error_type, condition or "undefined-condition", text, extra_tag; |
2526
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
414 end |
401ff68413a1
util.stanza: Add stanza:get_error() to return type, condition and text of a stanza error
Matthew Wild <mwild1@gmail.com>
parents:
2482
diff
changeset
|
415 |
12687
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
416 function stanza_mt.add_error(stanza, error_type, condition, error_message, error_by) |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
417 local extra; |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
418 if type(error_type) == "table" then -- an util.error or similar object |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
419 if type(error_type.extra) == "table" then |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
420 extra = error_type.extra; |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
421 end |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
422 if type(error_type.context) == "table" and type(error_type.context.by) == "string" then error_by = error_type.context.by; end |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
423 error_type, condition, error_message = error_type.type, error_type.condition, error_type.text; |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
424 end |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
425 if stanza.attr.from == error_by then |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
426 error_by = nil; |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
427 end |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
428 stanza:tag("error", {type = error_type, by = error_by}) --COMPAT: Some day xmlns:stanzas goes here |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
429 :tag(condition, xmpp_stanzas_attr); |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
430 if extra and condition == "gone" and type(extra.uri) == "string" then |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
431 stanza:text(extra.uri); |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
432 end |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
433 stanza:up(); |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
434 if error_message then stanza:text_tag("text", error_message, xmpp_stanzas_attr); end |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
435 if extra and is_stanza(extra.tag) then |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
436 stanza:add_child(extra.tag); |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
437 elseif extra and extra.namespace and extra.condition then |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
438 stanza:tag(extra.condition, { xmlns = extra.namespace }):up(); |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
439 end |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
440 return stanza:up(); |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
441 end |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
442 |
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
443 local function preserialize(stanza) |
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
|
444 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
|
445 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
|
446 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
|
447 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
|
448 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
|
449 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
|
450 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
|
451 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
|
452 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
|
453 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
|
454 |
9489
09b873ac7eb8
util.stanza: Set preserialize as freeze metamethod
Kim Alvefur <zash@zash.se>
parents:
9307
diff
changeset
|
455 stanza_mt.__freeze = preserialize; |
09b873ac7eb8
util.stanza: Set preserialize as freeze metamethod
Kim Alvefur <zash@zash.se>
parents:
9307
diff
changeset
|
456 |
9674
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
457 local function deserialize(serialized) |
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
|
458 -- Set metatable |
9674
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
459 if serialized then |
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
460 local attr = serialized.attr; |
2077
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
461 local attrx = {}; |
9674
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
462 for att, val in pairs(attr) do |
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
463 if type(att) == "string" then |
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
464 if s_find(att, "|", 1, true) and not s_find(att, "\1", 1, true) then |
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
465 local ns,na = s_match(att, "^([^|]+)|(.+)$"); |
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
466 attrx[ns.."\1"..na] = val; |
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
467 else |
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
468 attrx[att] = val; |
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
469 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
|
470 end |
e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents:
1984
diff
changeset
|
471 end |
9674
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
472 local stanza = new_stanza(serialized.name, attrx); |
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
473 for _, child in ipairs(serialized) do |
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
|
474 if type(child) == "table" then |
9674
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
475 stanza:add_direct_child(deserialize(child)); |
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
476 elseif type(child) == "string" then |
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
477 stanza:add_direct_child(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
|
478 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
|
479 end |
9674
6f97acc4583b
util.stanza: Deserialize stanza without mutating input (fixes #711)
Kim Alvefur <zash@zash.se>
parents:
9630
diff
changeset
|
480 return stanza; |
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
|
481 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
|
482 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
|
483 |
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
484 local function message(attr, body) |
0 | 485 if not body then |
7253
f4e71242556a
util.stanza: Some code cleanup [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6821
diff
changeset
|
486 return new_stanza("message", attr); |
0 | 487 else |
10116
4807535b8673
util.stanza: Use :text_tag internally everywhere
Kim Alvefur <zash@zash.se>
parents:
9924
diff
changeset
|
488 return new_stanza("message", attr):text_tag("body", body); |
0 | 489 end |
490 end | |
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
491 local function iq(attr) |
9732
51583ea2b4fd
util.stanza: Require a type attribute for iq stanzas
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
492 if not attr then |
51583ea2b4fd
util.stanza: Require a type attribute for iq stanzas
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
493 error("iq stanzas require id and type attributes"); |
51583ea2b4fd
util.stanza: Require a type attribute for iq stanzas
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
494 end |
51583ea2b4fd
util.stanza: Require a type attribute for iq stanzas
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
495 if not attr.id then |
9307
feaef6215bb8
util.stanza: Don't automatically generate ids for iq stanzas
Matthew Wild <mwild1@gmail.com>
parents:
9217
diff
changeset
|
496 error("iq stanzas require an id attribute"); |
feaef6215bb8
util.stanza: Don't automatically generate ids for iq stanzas
Matthew Wild <mwild1@gmail.com>
parents:
9217
diff
changeset
|
497 end |
9732
51583ea2b4fd
util.stanza: Require a type attribute for iq stanzas
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
498 if not attr.type then |
51583ea2b4fd
util.stanza: Require a type attribute for iq stanzas
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
499 error("iq stanzas require a type attribute"); |
51583ea2b4fd
util.stanza: Require a type attribute for iq stanzas
Kim Alvefur <zash@zash.se>
parents:
9674
diff
changeset
|
500 end |
9307
feaef6215bb8
util.stanza: Don't automatically generate ids for iq stanzas
Matthew Wild <mwild1@gmail.com>
parents:
9217
diff
changeset
|
501 return new_stanza("iq", attr); |
0 | 502 end |
503 | |
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
504 local function reply(orig) |
10442
22db763c510c
util.stanza: Check that argument to reply is a stanza
Kim Alvefur <zash@zash.se>
parents:
10116
diff
changeset
|
505 if not is_stanza(orig) then |
22db763c510c
util.stanza: Check that argument to reply is a stanza
Kim Alvefur <zash@zash.se>
parents:
10116
diff
changeset
|
506 error("bad argument to reply: expected stanza, got "..type(orig)); |
22db763c510c
util.stanza: Check that argument to reply is a stanza
Kim Alvefur <zash@zash.se>
parents:
10116
diff
changeset
|
507 end |
8382
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7758
diff
changeset
|
508 return new_stanza(orig.name, |
10443
f28718f46196
util.stanza: Remove redundant check for attrs
Kim Alvefur <zash@zash.se>
parents:
10442
diff
changeset
|
509 { |
8382
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7758
diff
changeset
|
510 to = orig.attr.from, |
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7758
diff
changeset
|
511 from = orig.attr.to, |
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7758
diff
changeset
|
512 id = orig.attr.id, |
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7758
diff
changeset
|
513 type = ((orig.name == "iq" and "result") or orig.attr.type) |
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7758
diff
changeset
|
514 }); |
0 | 515 end |
516 | |
10446
5c2d1b13537c
util.stanza: Support the 'by' attribute on errors
Kim Alvefur <zash@zash.se>
parents:
10445
diff
changeset
|
517 local function error_reply(orig, error_type, condition, error_message, error_by) |
10444
4eab1f5a4f3b
util.stanza: Check that argument to error_reply is a stanza
Kim Alvefur <zash@zash.se>
parents:
10443
diff
changeset
|
518 if not is_stanza(orig) then |
4eab1f5a4f3b
util.stanza: Check that argument to error_reply is a stanza
Kim Alvefur <zash@zash.se>
parents:
10443
diff
changeset
|
519 error("bad argument to error_reply: expected stanza, got "..type(orig)); |
10445
f53c03ab4357
util.stanza: Check that argument to error_reply is NOT a stanza of type error
Kim Alvefur <zash@zash.se>
parents:
10444
diff
changeset
|
520 elseif orig.attr.type == "error" then |
f53c03ab4357
util.stanza: Check that argument to error_reply is NOT a stanza of type error
Kim Alvefur <zash@zash.se>
parents:
10444
diff
changeset
|
521 error("bad argument to error_reply: got stanza of type error which must not be replied to"); |
10444
4eab1f5a4f3b
util.stanza: Check that argument to error_reply is a stanza
Kim Alvefur <zash@zash.se>
parents:
10443
diff
changeset
|
522 end |
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
523 local t = reply(orig); |
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
524 t.attr.type = "error"; |
12687
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
525 t:add_error(error_type, condition, error_message, error_by); |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
526 t.last_add = { t[1] }; -- ready to add application-specific errors |
5b69ecaf3427
util.stanza: Add add_error() to simplify adding error tags to existing stanzas
Matthew Wild <mwild1@gmail.com>
parents:
12636
diff
changeset
|
527 return t; |
60
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
528 end |
44800be871f5
User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
30
diff
changeset
|
529 |
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
530 local function presence(attr) |
7253
f4e71242556a
util.stanza: Some code cleanup [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6821
diff
changeset
|
531 return new_stanza("presence", attr); |
0 | 532 end |
533 | |
11642
7f2dee4249aa
util.stanza: Export pretty printing function
Kim Alvefur <zash@zash.se>
parents:
11640
diff
changeset
|
534 local pretty; |
262 | 535 if do_pretty_printing then |
11639
ad39528e647d
util.stanza: Remove Windows "support" (disabling ANSI color pretty printing)
Kim Alvefur <zash@zash.se>
parents:
11574
diff
changeset
|
536 local getstyle, getstring = termcolours.getstyle, termcolours.getstring; |
11640
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
537 |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
538 local blue1 = getstyle("1b3967"); |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
539 local blue2 = getstyle("13b5ea"); |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
540 local green1 = getstyle("439639"); |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
541 local green2 = getstyle("a0ce67"); |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
542 local orange1 = getstyle("d9541e"); |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
543 local orange2 = getstyle("e96d1f"); |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
544 |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
545 local attr_replace = ( |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
546 getstring(green2, "%1") .. -- attr name |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
547 getstring(green1, "%2") .. -- equal |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
548 getstring(orange1, "%3") .. -- quote |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
549 getstring(orange2, "%4") .. -- attr value |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
550 getstring(orange1, "%5") -- quote |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
551 ); |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5435
diff
changeset
|
552 |
11640
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
553 local text_replace = ( |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
554 getstring(green1, "%1") .. -- & |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
555 getstring(green2, "%2") .. -- amp |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
556 getstring(green1, "%3") -- ; |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
557 ); |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
558 |
11642
7f2dee4249aa
util.stanza: Export pretty printing function
Kim Alvefur <zash@zash.se>
parents:
11640
diff
changeset
|
559 function pretty(s) |
11640
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
560 -- Tag soup color |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
561 -- Outer gsub call takes each <tag>, applies colour to the brackets, the |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
562 -- tag name, then applies one inner gsub call to colour the attributes and |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
563 -- another for any text content. |
11960
12a3c05aa12d
util.stanza: Adjust pretty printing for symmetry
Kim Alvefur <zash@zash.se>
parents:
11786
diff
changeset
|
564 return (s:gsub("(<[?/]?)([^ >/?]*)(.-)([?/]?>)([^<]*)", function(opening_bracket, tag_name, attrs, closing_bracket, content) |
11640
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
565 return getstring(blue1, opening_bracket)..getstring(blue2, tag_name).. |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
566 attrs:gsub("([^=]+)(=)([\"'])(.-)([\"'])", attr_replace) .. |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
567 getstring(blue1, closing_bracket) .. |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
568 content:gsub("(&#?)(%w+)(;)", text_replace); |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
569 end, 100)); |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
570 end |
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
571 |
262 | 572 function stanza_mt.pretty_print(t) |
11640
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
573 return pretty(tostring(t)); |
262 | 574 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5435
diff
changeset
|
575 |
262 | 576 function stanza_mt.pretty_top_tag(t) |
11640
51598e46e136
util.stanza: Simplify and make pretty-printing look nicer
Kim Alvefur <zash@zash.se>
parents:
11639
diff
changeset
|
577 return pretty(t:top_tag()); |
262 | 578 end |
579 else | |
580 -- Sorry, fresh out of colours for you guys ;) | |
581 stanza_mt.pretty_print = stanza_mt.__tostring; | |
582 stanza_mt.pretty_top_tag = stanza_mt.top_tag; | |
583 end | |
584 | |
10717
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
585 function stanza_mt.indent(t, level, indent) |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
586 if #t == 0 or (#t == 1 and type(t[1]) == "string") then |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
587 -- Empty nodes wouldn't have any indentation |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
588 -- Text-only nodes are preserved as to not alter the text content |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
589 -- Optimization: Skip clone of these since we don't alter them |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
590 return t; |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
591 end |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
592 |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
593 indent = indent or "\t"; |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
594 level = level or 1; |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
595 local tag = clone(t, true); |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
596 |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
597 for child in t:children() do |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
598 if type(child) == "string" then |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
599 -- Already indented text would look weird but let's ignore that for now. |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
600 if child:find("%S") then |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
601 tag:text("\n" .. indent:rep(level)); |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
602 tag:text(child); |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
603 end |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
604 elseif is_stanza(child) then |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
605 tag:text("\n" .. indent:rep(level)); |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
606 tag:add_direct_child(child:indent(level+1, indent)); |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
607 end |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
608 end |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
609 -- before the closing tag |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
610 tag:text("\n" .. indent:rep((level-1))); |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
611 |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
612 return tag; |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
613 end |
05e4645fc9b3
util.stanza: Add method returning stanza with added indentation
Kim Alvefur <zash@zash.se>
parents:
10503
diff
changeset
|
614 |
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
615 return { |
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
616 stanza_mt = stanza_mt; |
7253
f4e71242556a
util.stanza: Some code cleanup [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6821
diff
changeset
|
617 stanza = new_stanza; |
7750
e58524240b30
util.stanza: Add an is_stanza() function to check if an object is a stanza
Kim Alvefur <zash@zash.se>
parents:
7253
diff
changeset
|
618 is_stanza = is_stanza; |
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
619 preserialize = preserialize; |
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
620 deserialize = deserialize; |
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
621 clone = clone; |
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
622 message = message; |
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
623 iq = iq; |
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
624 reply = reply; |
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
625 error_reply = error_reply; |
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
626 presence = presence; |
6821
5de30376bf98
util.stanza: Export xml_escape (missed during removal of module() calls)
Kim Alvefur <zash@zash.se>
parents:
6777
diff
changeset
|
627 xml_escape = xml_escape; |
11642
7f2dee4249aa
util.stanza: Export pretty printing function
Kim Alvefur <zash@zash.se>
parents:
11640
diff
changeset
|
628 pretty_print = pretty; |
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
629 }; |