Mercurial > prosody-modules
comparison mod_archive/mod_archive.lua @ 752:9bbd99f2057a
mod_archive: cope with <list> requests which don't have a <set> tag
| author | Oliver Gerlich <oliver.gerlich@gmx.de> |
|---|---|
| date | Mon, 11 Jun 2012 22:32:45 +0200 |
| parents | dcb8e7d2c711 |
| children | 9d5731af2c27 |
comparison
equal
deleted
inserted
replaced
| 710:b0c0acccd7c4 | 752:9bbd99f2057a |
|---|---|
| 453 end | 453 end |
| 454 local reply = st.reply(stanza):tag('list', {xmlns='urn:xmpp:archive'}); | 454 local reply = st.reply(stanza):tag('list', {xmlns='urn:xmpp:archive'}); |
| 455 local count = table.getn(resset); | 455 local count = table.getn(resset); |
| 456 if count > 0 then | 456 if count > 0 then |
| 457 list_reverse(resset); | 457 list_reverse(resset); |
| 458 local max = elem.tags[1]:child_with_name("max"); | 458 local s, e = 1, 1+DEFAULT_MAX; |
| 459 if max then | 459 local rsmset = elem:child_with_name("set") |
| 460 max = tonumber(max:get_text()) or DEFAULT_MAX; | 460 if rsmset then |
| 461 else max = DEFAULT_MAX; end | 461 local max = elem.tags[1]:child_with_name("max"); |
| 462 local after = elem.tags[1]:child_with_name("after"); | 462 if max then |
| 463 local before = elem.tags[1]:child_with_name("before"); | 463 max = tonumber(max:get_text()) or DEFAULT_MAX; |
| 464 local index = elem.tags[1]:child_with_name("index"); | 464 else max = DEFAULT_MAX; end |
| 465 local s, e = 1, 1+max; | 465 e = 1 + max |
| 466 if after then | 466 local after = elem.tags[1]:child_with_name("after"); |
| 467 after = after:get_text(); | 467 local before = elem.tags[1]:child_with_name("before"); |
| 468 s = find_coll(resset, after); | 468 local index = elem.tags[1]:child_with_name("index"); |
| 469 if not s then -- not found | 469 if after then |
| 470 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); | 470 after = after:get_text(); |
| 471 return true; | 471 s = find_coll(resset, after); |
| 472 end | 472 if not s then -- not found |
| 473 s = s + 1; | |
| 474 e = s + max; | |
| 475 elseif before then | |
| 476 before = before:get_text(); | |
| 477 if not before or before == '' then -- the last page | |
| 478 e = count + 1; | |
| 479 s = e - max; | |
| 480 else | |
| 481 e = find_coll(resset, before); | |
| 482 if not e then -- not found | |
| 483 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); | 473 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); |
| 484 return true; | 474 return true; |
| 485 end | 475 end |
| 486 s = e - max; | 476 s = s + 1; |
| 487 end | 477 e = s + max; |
| 488 elseif index then | 478 elseif before then |
| 489 s = tonumber(index:get_text()) + 1; -- 0-based | 479 before = before:get_text(); |
| 490 e = s + max; | 480 if not before or before == '' then -- the last page |
| 481 e = count + 1; | |
| 482 s = e - max; | |
| 483 else | |
| 484 e = find_coll(resset, before); | |
| 485 if not e then -- not found | |
| 486 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); | |
| 487 return true; | |
| 488 end | |
| 489 s = e - max; | |
| 490 end | |
| 491 elseif index then | |
| 492 s = tonumber(index:get_text()) + 1; -- 0-based | |
| 493 e = s + max; | |
| 494 end | |
| 491 end | 495 end |
| 492 if s < 1 then s = 1; end | 496 if s < 1 then s = 1; end |
| 493 if e > count + 1 then e = count + 1; end | 497 if e > count + 1 then e = count + 1; end |
| 494 for i = s, e-1 do | 498 for i = s, e-1 do |
| 495 reply:add_child(st.stanza('chat', resset[i].attr)); | 499 reply:add_child(st.stanza('chat', resset[i].attr)); |
| 536 end | 540 end |
| 537 collection.attr['xmlns'] = 'urn:xmpp:archive'; | 541 collection.attr['xmlns'] = 'urn:xmpp:archive'; |
| 538 local reply = st.reply(stanza):tag('chat', collection.attr); | 542 local reply = st.reply(stanza):tag('chat', collection.attr); |
| 539 local count = table.getn(resset); | 543 local count = table.getn(resset); |
| 540 if count > 0 then | 544 if count > 0 then |
| 541 local max = elem.tags[1]:child_with_name("max"); | 545 local s, e = 1, 1+DEFAULT_MAX; |
| 542 if max then | 546 local rsmset = elem:child_with_name("set") |
| 543 max = tonumber(max:get_text()) or DEFAULT_MAX; | 547 if rsmset then |
| 544 else max = DEFAULT_MAX; end | 548 local max = elem.tags[1]:child_with_name("max"); |
| 545 local after = elem.tags[1]:child_with_name("after"); | 549 if max then |
| 546 local before = elem.tags[1]:child_with_name("before"); | 550 max = tonumber(max:get_text()) or DEFAULT_MAX; |
| 547 local index = elem.tags[1]:child_with_name("index"); | 551 else max = DEFAULT_MAX; end |
| 548 local s, e = 1, 1+max; | 552 e = 1+max |
| 549 if after then | 553 local after = elem.tags[1]:child_with_name("after"); |
| 550 after = tonumber(after:get_text()); | 554 local before = elem.tags[1]:child_with_name("before"); |
| 551 if not after or after < 1 or after > count then -- not found | 555 local index = elem.tags[1]:child_with_name("index"); |
| 552 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); | 556 --local s, e = 1, 1+max; |
| 553 return true; | 557 if after then |
| 554 end | 558 after = tonumber(after:get_text()); |
| 555 s = after + 1; | 559 if not after or after < 1 or after > count then -- not found |
| 556 e = s + max; | 560 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); |
| 557 elseif before then | 561 return true; |
| 558 before = tonumber(before:get_text()); | 562 end |
| 559 if not before then -- the last page | 563 s = after + 1; |
| 560 e = count + 1; | 564 e = s + max; |
| 561 s = e - max; | 565 elseif before then |
| 562 elseif before < 1 or before > count then | 566 before = tonumber(before:get_text()); |
| 563 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); | 567 if not before then -- the last page |
| 564 return true; | 568 e = count + 1; |
| 565 else | 569 s = e - max; |
| 566 e = before; | 570 elseif before < 1 or before > count then |
| 567 s = e - max; | 571 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); |
| 568 end | 572 return true; |
| 569 elseif index then | 573 else |
| 570 s = tonumber(index:get_text()) + 1; -- 0-based | 574 e = before; |
| 571 e = s + max; | 575 s = e - max; |
| 576 end | |
| 577 elseif index then | |
| 578 s = tonumber(index:get_text()) + 1; -- 0-based | |
| 579 e = s + max; | |
| 580 end | |
| 572 end | 581 end |
| 573 if s < 1 then s = 1; end | 582 if s < 1 then s = 1; end |
| 574 if e > count + 1 then e = count + 1; end | 583 if e > count + 1 then e = count + 1; end |
| 575 for i = s, e-1 do | 584 for i = s, e-1 do |
| 576 reply:add_child(resset[i]); | 585 reply:add_child(resset[i]); |
