Nidx = TNode#pubsub_node.id,
Type = TNode#pubsub_node.type,
Options = TNode#pubsub_node.options,
- send_items(Host, Node, Nidx, Type, Options, Subscriber, 1),
+ send_items(Host, Node, Nidx, Type, Options, Subscriber, last),
ServerHost = serverhost(Host),
ejabberd_hooks:run(pubsub_subscribe_node, ServerHost,
[ServerHost, Host, Node, Subscriber, SubId]),
end
end,
case transaction(Host, Node, Action, sync_dirty) of
- {result, {_, {Items, RsmOut}}} ->
+ {result, {TNode, {Items, RsmOut}}} ->
SendItems = case ItemIds of
[] ->
Items;
lists:member(ItemId, ItemIds)
end, Items)
end,
- {result,
- #pubsub{items = #ps_items{node = Node,
- items = itemsEls(SendItems)},
- rsm = RsmOut}};
- {result, {_, Item}} ->
- {result,
- #pubsub{items = #ps_items{node = Node,
- items = itemsEls([Item])}}};
+ Options = TNode#pubsub_node.options,
+ {result, #pubsub{items = items_els(Node, Options, SendItems),
+ rsm = RsmOut}};
+ {result, {TNode, Item}} ->
+ Options = TNode#pubsub_node.options,
+ {result, #pubsub{items = items_els(Node, Options, [Item])}};
Error ->
Error
end.
{PS, RG} = get_presence_and_roster_permissions(Host, From, Owners, AccessModel, AllowedGroups),
node_call(Host, Type, get_items, [Nidx, From, AccessModel, PS, RG, undefined, RSM]).
+get_last_items(Host, Type, Nidx, LJID, last) ->
+ % hack to handle section 6.1.7 of XEP-0060
+ get_last_items(Host, Type, Nidx, LJID, 1);
get_last_items(Host, Type, Nidx, LJID, 1) ->
case get_cached_item(Host, Nidx) of
undefined ->
payload_xmlelements([_ | Tail], Count) ->
payload_xmlelements(Tail, Count).
-items_event_stanza(Node, Options, Items) ->
- MoreEls = case Items of
- [LastItem] ->
- {ModifNow, ModifUSR} = LastItem#pubsub_item.modification,
- [#delay{stamp = ModifNow, from = jid:make(ModifUSR)}];
+items_els(Node, Options, Items) ->
+ Els = case get_option(Options, itemreply) of
+ publisher ->
+ [#ps_item{id = ItemId, sub_els = Payload, publisher = jid:encode(USR)}
+ || #pubsub_item{itemid = {ItemId, _}, payload = Payload, modification = {_, USR}}
+ <- Items];
_ ->
- []
+ [#ps_item{id = ItemId, sub_els = Payload}
+ || #pubsub_item{itemid = {ItemId, _}, payload = Payload}
+ <- Items]
end,
- BaseStanza = #message{
- sub_els = [#ps_event{items = #ps_items{
- node = Node,
- items = itemsEls(Items)}}
- | MoreEls]},
- NotificationType = get_option(Options, notification_type, headline),
- add_message_type(BaseStanza, NotificationType).
+ #ps_items{node = Node, items = Els}.
%%%%%% broadcast functions
broadcast_publish_item(Host, Node, Nidx, Type, NodeOptions, ItemId, From, Payload, Removed) ->
case get_collection_subscriptions(Host, Node) of
SubsByDepth when is_list(SubsByDepth) ->
- EventItem0 = case get_option(NodeOptions, deliver_payloads) of
- true -> #ps_item{sub_els = Payload, id = ItemId};
- false -> #ps_item{id = ItemId}
- end,
- EventItem = case get_option(NodeOptions, itemreply, none) of
- owner -> %% owner not supported
- EventItem0;
- publisher ->
- EventItem0#ps_item{
- publisher = jid:encode(From)};
- none ->
- EventItem0
- end,
- Stanza = #message{
- sub_els =
- [#ps_event{items =
- #ps_items{node = Node,
- items = [EventItem]}}]},
+ ItemPublisher = case get_option(NodeOptions, itemreply) of
+ publisher -> jid:encode(From);
+ _ -> undefined
+ end,
+ ItemPayload = case get_option(NodeOptions, deliver_payloads) of
+ true -> Payload;
+ false -> undefined
+ end,
+ ItemsEls = #ps_items{node = Node,
+ items = [#ps_item{id = ItemId,
+ publisher = ItemPublisher,
+ sub_els = ItemPayload}]},
+ Stanza = #message{ sub_els = [#ps_event{items = ItemsEls}]},
broadcast_stanza(Host, From, Node, Nidx, Type,
NodeOptions, SubsByDepth, items, Stanza, true),
case Removed of
[] ->
ok;
Items ->
- Stanza = items_event_stanza(Node, Options, Items),
- send_stanza(Publisher, ToLJID, Node, Stanza)
+ Delay = case Number of
+ last -> % handle section 6.1.7 of XEP-0060
+ [Last] = Items,
+ {Stamp, _USR} = Last#pubsub_item.modification,
+ [#delay{stamp = Stamp}];
+ _ ->
+ []
+ end,
+ Stanza = #message{
+ sub_els = [#ps_event{items = items_els(Node, Options, Items)}
+ | Delay]},
+ NotificationType = get_option(Options, notification_type, headline),
+ send_stanza(Publisher, ToLJID, Node,
+ add_message_type(Stanza, NotificationType))
end.
send_stanza({LUser, LServer, _} = Publisher, USR, Node, BaseStanza) ->
{T1, T2, T3} = p1_time_compat:timestamp(),
(str:format("~.16B~.16B~.16B", [T1, T2, T3])).
--spec itemsEls([#pubsub_item{}]) -> [ps_item()].
-itemsEls(Items) ->
- [#ps_item{id = ItemId, sub_els = Payload}
- || #pubsub_item{itemid = {ItemId, _}, payload = Payload} <- Items].
-
-spec add_message_type(message(), message_type()) -> message().
add_message_type(#message{} = Message, Type) ->
Message#message{type = Type}.