comparison mod_archive/mod_archive.lua @ 195:4d9ed6374a1f

mod_archive: XEP-0059: Result Set Management - Limiting the Number of Items; Paging Forwards Through a Result Set; Getting the Item Count
author shinysky<shinysky1986(AT)gmail.com>
date Tue, 06 Jul 2010 00:18:12 +0800
parents 18a0e5c0bb62
children a1c2677257da
comparison
equal deleted inserted replaced
194:58c37562c67d 195:4d9ed6374a1f
16 module:add_feature("urn:xmpp:archive"); 16 module:add_feature("urn:xmpp:archive");
17 module:add_feature("urn:xmpp:archive:auto"); 17 module:add_feature("urn:xmpp:archive:auto");
18 module:add_feature("urn:xmpp:archive:manage"); 18 module:add_feature("urn:xmpp:archive:manage");
19 module:add_feature("urn:xmpp:archive:manual"); 19 module:add_feature("urn:xmpp:archive:manual");
20 module:add_feature("urn:xmpp:archive:pref"); 20 module:add_feature("urn:xmpp:archive:pref");
21 module:add_feature("http://jabber.org/protocol/rsm");
21 22
22 ------------------------------------------------------------ 23 ------------------------------------------------------------
23 -- Utils 24 -- Utils
24 ------------------------------------------------------------ 25 ------------------------------------------------------------
25 local function load_prefs(node, host) 26 local function load_prefs(node, host)
70 local save = st.stanza('save', {xmlns='urn:xmpp:archive'}); 71 local save = st.stanza('save', {xmlns='urn:xmpp:archive'});
71 local chat = st.stanza('chat', collection.attr); 72 local chat = st.stanza('chat', collection.attr);
72 save:add_child(chat); 73 save:add_child(chat);
73 return save; 74 return save;
74 end 75 end
76
77 local function gen_uid(c)
78 return c.attr["start"] .. c.attr["with"];
79 end
75 80
76 ------------------------------------------------------------ 81 ------------------------------------------------------------
77 -- Preferences 82 -- Preferences
78 ------------------------------------------------------------ 83 ------------------------------------------------------------
79 local function preferences_handler(event) 84 local function preferences_handler(event)
349 end 354 end
350 end 355 end
351 end 356 end
352 local reply = st.reply(stanza):tag('list', {xmlns='urn:xmpp:archive'}); 357 local reply = st.reply(stanza):tag('list', {xmlns='urn:xmpp:archive'});
353 if table.getn(resset) > 0 then 358 if table.getn(resset) > 0 then
354 local max = tonumber(elem.tags[1].tags[1]:get_text()); 359 local max = elem.tags[1]:child_with_name("max");
360 if max then
361 max = tonumber(max:get_text());
362 else max = 100; end
363 local after = elem.tags[1]:child_with_name("after");
364 -- local before = elem.tags[1]:child_with_name("before");
365 -- local index = elem.tags[1]:child_with_name("index");
366 if after then after = after:get_text(); end
367 local found = false;
368 local first, last = nil, nil;
355 -- Assuming result set is sorted. 369 -- Assuming result set is sorted.
356 for i, c in ipairs(resset) do 370 for i, c in ipairs(resset) do
357 if i <= max then 371 if after and not found then
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;
358 local chat = st.stanza('chat', c.attr); 378 local chat = st.stanza('chat', c.attr);
359 reply:add_child(chat); 379 reply:add_child(chat);
380 max = max - 1;
360 else break; end 381 else break; end
361 end 382 end
383 local set = st.stanza('set', {xmlns='http://jabber.org/protocol/rsm'});
384 if first then
385 set:tag('first', {index=first-1}):text(gen_uid(resset[first])):up()
386 :tag('last'):text(gen_uid(resset[last])):up();
387 end
388 set:tag('count'):text(tostring(table.getn(resset))):up();
389 reply:add_child(set);
362 end 390 end
363 origin.send(reply); 391 origin.send(reply);
364 return true; 392 return true;
365 end 393 end
366 394