Mercurial > prosody-modules
comparison mod_archive/mod_archive.lua @ 196:a1c2677257da
mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
| author | shinysky<shinysky1986(AT)gmail.com> |
|---|---|
| date | Wed, 07 Jul 2010 17:31:31 +0800 |
| parents | 4d9ed6374a1f |
| children | a3b5810de3e4 |
comparison
equal
deleted
inserted
replaced
| 195:4d9ed6374a1f | 196:a1c2677257da |
|---|---|
| 335 | 335 |
| 336 local function filter_end(endtime, coll_start) | 336 local function filter_end(endtime, coll_start) |
| 337 return not endtime or endtime >= coll_start; | 337 return not endtime or endtime >= coll_start; |
| 338 end | 338 end |
| 339 | 339 |
| 340 local function find_coll(resset, uid) | |
| 341 for i, c in ipairs(resset) do | |
| 342 if gen_uid(c) == uid then | |
| 343 return i; | |
| 344 end | |
| 345 end | |
| 346 return nil; | |
| 347 end | |
| 348 | |
| 340 local function list_handler(event) | 349 local function list_handler(event) |
| 341 local origin, stanza = event.origin, event.stanza; | 350 local origin, stanza = event.origin, event.stanza; |
| 342 local node, host = origin.username, origin.host; | 351 local node, host = origin.username, origin.host; |
| 343 local data = dm.list_load(node, host, ARCHIVE_DIR); | 352 local data = dm.list_load(node, host, ARCHIVE_DIR); |
| 344 local elem = stanza.tags[1]; | 353 local elem = stanza.tags[1]; |
| 353 table.insert(resset, collection); | 362 table.insert(resset, collection); |
| 354 end | 363 end |
| 355 end | 364 end |
| 356 end | 365 end |
| 357 local reply = st.reply(stanza):tag('list', {xmlns='urn:xmpp:archive'}); | 366 local reply = st.reply(stanza):tag('list', {xmlns='urn:xmpp:archive'}); |
| 358 if table.getn(resset) > 0 then | 367 local count = table.getn(resset); |
| 368 if count > 0 then | |
| 359 local max = elem.tags[1]:child_with_name("max"); | 369 local max = elem.tags[1]:child_with_name("max"); |
| 360 if max then | 370 if max then |
| 361 max = tonumber(max:get_text()); | 371 max = tonumber(max:get_text()); |
| 362 else max = 100; end | 372 else max = 100; end |
| 363 local after = elem.tags[1]:child_with_name("after"); | 373 local after = elem.tags[1]:child_with_name("after"); |
| 364 -- local before = elem.tags[1]:child_with_name("before"); | 374 local before = elem.tags[1]:child_with_name("before"); |
| 365 -- local index = elem.tags[1]:child_with_name("index"); | 375 local index = elem.tags[1]:child_with_name("index"); |
| 366 if after then after = after:get_text(); end | 376 local s, e = 1, 1+max; |
| 367 local found = false; | 377 if after then |
| 368 local first, last = nil, nil; | 378 after = after:get_text(); |
| 379 s = find_coll(resset, after); | |
| 380 if not s then -- not found | |
| 381 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); | |
| 382 return true; | |
| 383 end | |
| 384 s = s + 1; | |
| 385 e = s + max; | |
| 386 elseif before then | |
| 387 before = before:get_text(); | |
| 388 if not before or before == '' then -- the last page | |
| 389 e = count + 1; | |
| 390 s = e - max; | |
| 391 else | |
| 392 e = find_coll(resset, before); | |
| 393 if not e then -- not found | |
| 394 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); | |
| 395 return true; | |
| 396 end | |
| 397 s = e - max; | |
| 398 end | |
| 399 elseif index then | |
| 400 s = tonumber(index:get_text()) + 1; -- 0-based | |
| 401 e = s + max; | |
| 402 end | |
| 403 if s < 1 then s = 1; end | |
| 404 if e > count + 1 then e = count + 1; end | |
| 369 -- Assuming result set is sorted. | 405 -- Assuming result set is sorted. |
| 370 for i, c in ipairs(resset) do | 406 for i = s, e-1 do |
| 371 if after and not found then | 407 reply:add_child(st.stanza('chat', resset[i].attr)); |
| 372 if gen_uid(c) == after then | |
| 373 found = true; | |
| 374 end | |
| 375 elseif max > 0 then | |
| 376 if not first then first = i; end | |
| 377 last = i; | |
| 378 local chat = st.stanza('chat', c.attr); | |
| 379 reply:add_child(chat); | |
| 380 max = max - 1; | |
| 381 else break; end | |
| 382 end | 408 end |
| 383 local set = st.stanza('set', {xmlns='http://jabber.org/protocol/rsm'}); | 409 local set = st.stanza('set', {xmlns='http://jabber.org/protocol/rsm'}); |
| 384 if first then | 410 if s <= e-1 then |
| 385 set:tag('first', {index=first-1}):text(gen_uid(resset[first])):up() | 411 set:tag('first', {index=s-1}):text(gen_uid(resset[s])):up() |
| 386 :tag('last'):text(gen_uid(resset[last])):up(); | 412 :tag('last'):text(gen_uid(resset[e-1])):up(); |
| 387 end | 413 end |
| 388 set:tag('count'):text(tostring(table.getn(resset))):up(); | 414 set:tag('count'):text(tostring(count)):up(); |
| 389 reply:add_child(set); | 415 reply:add_child(set); |
| 390 end | 416 end |
| 391 origin.send(reply); | 417 origin.send(reply); |
| 392 return true; | 418 return true; |
| 393 end | 419 end |
