Mercurial > prosody-hg
comparison util/stanza.lua @ 9675:7d8e08f80dbd
Merge 0.11->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 02 Dec 2018 02:38:36 +0100 |
| parents | 6f97acc4583b |
| children | 51583ea2b4fd 9d1e21c23784 |
comparison
equal
deleted
inserted
replaced
| 9671:e50559a42dfe | 9675:7d8e08f80dbd |
|---|---|
| 359 return s; | 359 return s; |
| 360 end | 360 end |
| 361 | 361 |
| 362 stanza_mt.__freeze = preserialize; | 362 stanza_mt.__freeze = preserialize; |
| 363 | 363 |
| 364 local function deserialize(stanza) | 364 local function deserialize(serialized) |
| 365 -- Set metatable | 365 -- Set metatable |
| 366 if stanza then | 366 if serialized then |
| 367 local attr = stanza.attr; | 367 local attr = serialized.attr; |
| 368 for i=1,#attr do attr[i] = nil; end | |
| 369 local attrx = {}; | 368 local attrx = {}; |
| 370 for att in pairs(attr) do | 369 for att, val in pairs(attr) do |
| 371 if s_find(att, "|", 1, true) and not s_find(att, "\1", 1, true) then | 370 if type(att) == "string" then |
| 372 local ns,na = s_match(att, "^([^|]+)|(.+)$"); | 371 if s_find(att, "|", 1, true) and not s_find(att, "\1", 1, true) then |
| 373 attrx[ns.."\1"..na] = attr[att]; | 372 local ns,na = s_match(att, "^([^|]+)|(.+)$"); |
| 374 attr[att] = nil; | 373 attrx[ns.."\1"..na] = val; |
| 375 end | 374 else |
| 376 end | 375 attrx[att] = val; |
| 377 for a,v in pairs(attrx) do | 376 end |
| 378 attr[a] = v; | 377 end |
| 379 end | 378 end |
| 380 setmetatable(stanza, stanza_mt); | 379 local stanza = new_stanza(serialized.name, attrx); |
| 381 for _, child in ipairs(stanza) do | 380 for _, child in ipairs(serialized) do |
| 382 if type(child) == "table" then | 381 if type(child) == "table" then |
| 383 deserialize(child); | 382 stanza:add_direct_child(deserialize(child)); |
| 384 end | 383 elseif type(child) == "string" then |
| 385 end | 384 stanza:add_direct_child(child); |
| 386 if not stanza.tags then | 385 end |
| 387 -- Rebuild tags | 386 end |
| 388 local tags = {}; | 387 return stanza; |
| 389 for _, child in ipairs(stanza) do | 388 end |
| 390 if type(child) == "table" then | |
| 391 t_insert(tags, child); | |
| 392 end | |
| 393 end | |
| 394 stanza.tags = tags; | |
| 395 end | |
| 396 end | |
| 397 | |
| 398 return stanza; | |
| 399 end | 389 end |
| 400 | 390 |
| 401 local function _clone(stanza) | 391 local function _clone(stanza) |
| 402 local attr, tags = {}, {}; | 392 local attr, tags = {}, {}; |
| 403 for k,v in pairs(stanza.attr) do attr[k] = v; end | 393 for k,v in pairs(stanza.attr) do attr[k] = v; end |
