Software /
code /
prosody
Comparison
util/stanza.lua @ 6777:5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 21 Feb 2015 10:36:37 +0100 |
parent | 6501:71b6e8b48a12 |
child | 6821:5de30376bf98 |
comparison
equal
deleted
inserted
replaced
6774:3965662ae091 | 6777:5de6b93d0190 |
---|---|
33 end | 33 end |
34 end | 34 end |
35 | 35 |
36 local xmlns_stanzas = "urn:ietf:params:xml:ns:xmpp-stanzas"; | 36 local xmlns_stanzas = "urn:ietf:params:xml:ns:xmpp-stanzas"; |
37 | 37 |
38 module "stanza" | 38 local _ENV = nil; |
39 | 39 |
40 stanza_mt = { __type = "stanza" }; | 40 local stanza_mt = { __type = "stanza" }; |
41 stanza_mt.__index = stanza_mt; | 41 stanza_mt.__index = stanza_mt; |
42 local stanza_mt = stanza_mt; | 42 |
43 | 43 local function stanza(name, attr) |
44 function stanza(name, attr) | |
45 local stanza = { name = name, attr = attr or {}, tags = {} }; | 44 local stanza = { name = name, attr = attr or {}, tags = {} }; |
46 return setmetatable(stanza, stanza_mt); | 45 return setmetatable(stanza, stanza_mt); |
47 end | 46 end |
48 local stanza = stanza; | 47 local stanza = stanza; |
49 | 48 |
198 self = self:get_child(name, xmlns); | 197 self = self:get_child(name, xmlns); |
199 until not self | 198 until not self |
200 end | 199 end |
201 | 200 |
202 | 201 |
203 local xml_escape | 202 local escape_table = { ["'"] = "'", ["\""] = """, ["<"] = "<", [">"] = ">", ["&"] = "&" }; |
204 do | 203 local function xml_escape(str) return (s_gsub(str, "['&<>\"]", escape_table)); end |
205 local escape_table = { ["'"] = "'", ["\""] = """, ["<"] = "<", [">"] = ">", ["&"] = "&" }; | |
206 function xml_escape(str) return (s_gsub(str, "['&<>\"]", escape_table)); end | |
207 _M.xml_escape = xml_escape; | |
208 end | |
209 | 204 |
210 local function _dostring(t, buf, self, xml_escape, parentns) | 205 local function _dostring(t, buf, self, xml_escape, parentns) |
211 local nsid = 0; | 206 local nsid = 0; |
212 local name = t.name | 207 local name = t.name |
213 t_insert(buf, "<"..name); | 208 t_insert(buf, "<"..name); |
278 end | 273 end |
279 end | 274 end |
280 return type, condition or "undefined-condition", text; | 275 return type, condition or "undefined-condition", text; |
281 end | 276 end |
282 | 277 |
283 do | 278 local id = 0; |
284 local id = 0; | 279 local function new_id() |
285 function new_id() | 280 id = id + 1; |
286 id = id + 1; | 281 return "lx"..id; |
287 return "lx"..id; | 282 end |
288 end | 283 |
289 end | 284 local function preserialize(stanza) |
290 | |
291 function preserialize(stanza) | |
292 local s = { name = stanza.name, attr = stanza.attr }; | 285 local s = { name = stanza.name, attr = stanza.attr }; |
293 for _, child in ipairs(stanza) do | 286 for _, child in ipairs(stanza) do |
294 if type(child) == "table" then | 287 if type(child) == "table" then |
295 t_insert(s, preserialize(child)); | 288 t_insert(s, preserialize(child)); |
296 else | 289 else |
298 end | 291 end |
299 end | 292 end |
300 return s; | 293 return s; |
301 end | 294 end |
302 | 295 |
303 function deserialize(stanza) | 296 local function deserialize(stanza) |
304 -- Set metatable | 297 -- Set metatable |
305 if stanza then | 298 if stanza then |
306 local attr = stanza.attr; | 299 local attr = stanza.attr; |
307 for i=1,#attr do attr[i] = nil; end | 300 for i=1,#attr do attr[i] = nil; end |
308 local attrx = {}; | 301 local attrx = {}; |
335 end | 328 end |
336 | 329 |
337 return stanza; | 330 return stanza; |
338 end | 331 end |
339 | 332 |
340 local function _clone(stanza) | 333 local function clone(stanza) |
341 local attr, tags = {}, {}; | 334 local attr, tags = {}, {}; |
342 for k,v in pairs(stanza.attr) do attr[k] = v; end | 335 for k,v in pairs(stanza.attr) do attr[k] = v; end |
343 local new = { name = stanza.name, attr = attr, tags = tags }; | 336 local new = { name = stanza.name, attr = attr, tags = tags }; |
344 for i=1,#stanza do | 337 for i=1,#stanza do |
345 local child = stanza[i]; | 338 local child = stanza[i]; |
346 if child.name then | 339 if child.name then |
347 child = _clone(child); | 340 child = clone(child); |
348 t_insert(tags, child); | 341 t_insert(tags, child); |
349 end | 342 end |
350 t_insert(new, child); | 343 t_insert(new, child); |
351 end | 344 end |
352 return setmetatable(new, stanza_mt); | 345 return setmetatable(new, stanza_mt); |
353 end | 346 end |
354 clone = _clone; | 347 |
355 | 348 local function message(attr, body) |
356 function message(attr, body) | |
357 if not body then | 349 if not body then |
358 return stanza("message", attr); | 350 return stanza("message", attr); |
359 else | 351 else |
360 return stanza("message", attr):tag("body"):text(body):up(); | 352 return stanza("message", attr):tag("body"):text(body):up(); |
361 end | 353 end |
362 end | 354 end |
363 function iq(attr) | 355 local function iq(attr) |
364 if attr and not attr.id then attr.id = new_id(); end | 356 if attr and not attr.id then attr.id = new_id(); end |
365 return stanza("iq", attr or { id = new_id() }); | 357 return stanza("iq", attr or { id = new_id() }); |
366 end | 358 end |
367 | 359 |
368 function reply(orig) | 360 local function reply(orig) |
369 return stanza(orig.name, orig.attr and { to = orig.attr.from, from = orig.attr.to, id = orig.attr.id, type = ((orig.name == "iq" and "result") or orig.attr.type) }); | 361 return stanza(orig.name, orig.attr and { to = orig.attr.from, from = orig.attr.to, id = orig.attr.id, type = ((orig.name == "iq" and "result") or orig.attr.type) }); |
370 end | 362 end |
371 | 363 |
372 do | 364 local xmpp_stanzas_attr = { xmlns = xmlns_stanzas }; |
373 local xmpp_stanzas_attr = { xmlns = xmlns_stanzas }; | 365 local function error_reply(orig, type, condition, message) |
374 function error_reply(orig, type, condition, message) | 366 local t = reply(orig); |
375 local t = reply(orig); | 367 t.attr.type = "error"; |
376 t.attr.type = "error"; | 368 t:tag("error", {type = type}) --COMPAT: Some day xmlns:stanzas goes here |
377 t:tag("error", {type = type}) --COMPAT: Some day xmlns:stanzas goes here | 369 :tag(condition, xmpp_stanzas_attr):up(); |
378 :tag(condition, xmpp_stanzas_attr):up(); | 370 if (message) then t:tag("text", xmpp_stanzas_attr):text(message):up(); end |
379 if (message) then t:tag("text", xmpp_stanzas_attr):text(message):up(); end | 371 return t; -- stanza ready for adding app-specific errors |
380 return t; -- stanza ready for adding app-specific errors | 372 end |
381 end | 373 |
382 end | 374 local function presence(attr) |
383 | |
384 function presence(attr) | |
385 return stanza("presence", attr); | 375 return stanza("presence", attr); |
386 end | 376 end |
387 | 377 |
388 if do_pretty_printing then | 378 if do_pretty_printing then |
389 local style_attrk = getstyle("yellow"); | 379 local style_attrk = getstyle("yellow"); |
423 -- Sorry, fresh out of colours for you guys ;) | 413 -- Sorry, fresh out of colours for you guys ;) |
424 stanza_mt.pretty_print = stanza_mt.__tostring; | 414 stanza_mt.pretty_print = stanza_mt.__tostring; |
425 stanza_mt.pretty_top_tag = stanza_mt.top_tag; | 415 stanza_mt.pretty_top_tag = stanza_mt.top_tag; |
426 end | 416 end |
427 | 417 |
428 return _M; | 418 return { |
419 stanza_mt = stanza_mt; | |
420 stanza = stanza; | |
421 new_id = new_id; | |
422 preserialize = preserialize; | |
423 deserialize = deserialize; | |
424 clone = clone; | |
425 message = message; | |
426 iq = iq; | |
427 reply = reply; | |
428 error_reply = error_reply; | |
429 presence = presence; | |
430 }; |