From 895e104b6a4595ffaa5d7acbb9a1c309152d25b7 Mon Sep 17 00:00:00 2001 From: Christophe Romain Date: Wed, 23 Jul 2008 01:13:36 +0000 Subject: [PATCH] subscribing to a node sends only last items (EJAB-700), send_last_items bugfix SVN Revision: 1473 --- ChangeLog | 3 ++- src/mod_pubsub/mod_pubsub.erl | 34 +++++++++++++++++++--------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index ef918d359..2943c4148 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,7 +2,8 @@ * src/mod_pubsub/mod_pubsub.erl: remove_user hook removes subscriptions (EJAB-684), send the last published and not the - first published item (EJAB-675), remove the pubsub/nodes tree. + first published item (EJAB-675), remove the pubsub/nodes tree, + subscribing to a node sends only last items (EJAB-700) * src/mod_pubsub/node_pep.erl: added acl and jid match on node creation permission (EJAB-663) * src/mod_pubsub/node_default.erl: fix node creation permission diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index 3840f9f78..d9ad7a105 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -1386,7 +1386,7 @@ subscribe_node(Host, Node, From, JID) -> {error, Error} -> {error, Error}; {result, {Result, subscribed, send_last}} -> - send_all_items(Host, Node, Subscriber), + send_last_item(Host, Node, Subscriber), case Result of default -> {result, Reply(subscribed)}; _ -> {result, Result} @@ -1733,21 +1733,25 @@ send_last_item(Host, Node, LJID) -> %% TODO use cache-last-item feature send_items(Host, Node, LJID, Number) -> - Items = get_items(Host, Node), - ToSend = case Number of - last -> hd(lists:reverse(Items)); - all -> Items; - N when N > 0 -> lists:nthtail(length(Items)-N, Items); - _ -> Items - end, + ToSend = case get_items(Host, Node) of + [] -> + []; + Items -> + case Number of + last -> lists:sublist(lists:reverse(Items), 1); + all -> Items; + N when N > 0 -> lists:nthtail(length(Items)-N, Items); + _ -> Items + end + end, ItemsEls = lists:map( - fun(#pubsub_item{itemid = {ItemId, _}, payload = Payload}) -> - ItemAttrs = case ItemId of - "" -> []; - _ -> [{"id", ItemId}] - end, - {xmlelement, "item", ItemAttrs, Payload} - end, ToSend), + fun(#pubsub_item{itemid = {ItemId, _}, payload = Payload}) -> + ItemAttrs = case ItemId of + "" -> []; + _ -> [{"id", ItemId}] + end, + {xmlelement, "item", ItemAttrs, Payload} + end, ToSend), Stanza = {xmlelement, "message", [], [{xmlelement, "event", [{"xmlns", ?NS_PUBSUB_EVENT}], [{xmlelement, "items", [{"node", node_to_string(Node)}],