aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2014-12-21 20:11:05 +0100
committerHolger Weiss <holger@zedat.fu-berlin.de>2014-12-21 20:11:05 +0100
commitd734f6becadd32e429e898864d2ac6643d9cb58e (patch)
tree029151df5376ad6eb35ac1aeb56e3231acce80fe /src
parentImprove add_message_type/2 function (diff)
Use correct message type for last published items
When sending last published PubSub/PEP items, set the message type that was used for broadcasting those items originally.
Diffstat (limited to 'src')
-rw-r--r--src/mod_pubsub.erl39
-rw-r--r--src/mod_pubsub_odbc.erl42
2 files changed, 51 insertions, 30 deletions
diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl
index b93dd0e0a..504739c6a 100644
--- a/src/mod_pubsub.erl
+++ b/src/mod_pubsub.erl
@@ -87,7 +87,7 @@
unsubscribe_node/5,
publish_item/6,
delete_item/4,
- send_items/6,
+ send_items/7,
get_items/2,
get_item/3,
get_cached_item/2,
@@ -864,6 +864,7 @@ send_loop(State) ->
N,
NodeId,
Type,
+ Options,
LJID,
last);
_ -> ok
@@ -960,6 +961,7 @@ send_loop(State) ->
Node,
NodeId,
Type,
+ Options,
LJID,
last);
true ->
@@ -2926,7 +2928,8 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
{TNode, {Result, subscribed, SubId, send_last}}} ->
NodeId = TNode#pubsub_node.id,
Type = TNode#pubsub_node.type,
- send_items(Host, Node, NodeId, Type, Subscriber, last),
+ Options = TNode#pubsub_node.options,
+ send_items(Host, Node, NodeId, Type, Options, Subscriber, last),
case Result of
default -> {result, Reply({subscribed, SubId})};
_ -> {result, Result}
@@ -3388,14 +3391,15 @@ get_allowed_items_call(Host, NodeIdx, From, Type, Options, Owners) ->
%% Node = pubsubNode()
%% NodeId = pubsubNodeId()
%% Type = pubsubNodeType()
+%% Options = mod_pubsub:nodeOptions()
%% LJID = {U, S, []}
%% Number = last | integer()
%% @doc <p>Resend the items of a node to the user.</p>
%% @todo use cache-last-item feature
-send_items(Host, Node, NodeId, Type, LJID, last) ->
+send_items(Host, Node, NodeId, Type, Options, LJID, last) ->
case get_cached_item(Host, NodeId) of
undefined ->
- send_items(Host, Node, NodeId, Type, LJID, 1);
+ send_items(Host, Node, NodeId, Type, Options, LJID, 1);
LastItem ->
{ModifNow, ModifUSR} =
LastItem#pubsub_item.modification,
@@ -3405,9 +3409,9 @@ send_items(Host, Node, NodeId, Type, LJID, last) ->
children =
itemsEls([LastItem])}],
ModifNow, ModifUSR),
- dispatch_items(Host, LJID, Node, Stanza)
+ dispatch_items(Host, LJID, Node, Options, Stanza)
end;
-send_items(Host, Node, NodeId, Type, LJID, Number) ->
+send_items(Host, Node, NodeId, Type, Options, LJID, Number) ->
ToSend = case node_action(Host, Type, get_items,
[NodeId, LJID])
of
@@ -3435,20 +3439,23 @@ send_items(Host, Node, NodeId, Type, LJID, Number) ->
attrs = nodeAttr(Node),
children = itemsEls(ToSend)}])
end,
- dispatch_items(Host, LJID, Node, Stanza).
+ dispatch_items(Host, LJID, Node, Options, Stanza).
--spec(dispatch_items/4 ::
+-spec(dispatch_items/5 ::
(
- From :: mod_pubsub:host(),
- To :: jid(),
- Node :: mod_pubsub:nodeId(),
- Stanza :: xmlel() | undefined)
+ From :: mod_pubsub:host(),
+ To :: jid(),
+ Node :: mod_pubsub:nodeId(),
+ Options :: mod_pubsub:nodeOptions(),
+ Stanza :: xmlel() | undefined)
-> any()
).
-dispatch_items(_From, _To, _Node, _Stanza = undefined) -> ok;
+dispatch_items(_From, _To, _Node, _Options, _Stanza = undefined) -> ok;
dispatch_items({FromU, FromS, FromR} = From, {ToU, ToS, ToR} = To, Node,
- Stanza) ->
+ Options, BaseStanza) ->
+ NotificationType = get_option(Options, notification_type, headline),
+ Stanza = add_message_type(BaseStanza, NotificationType),
C2SPid = case ejabberd_sm:get_session_pid(ToU, ToS, ToR) of
ToPid when is_pid(ToPid) -> ToPid;
_ ->
@@ -3465,7 +3472,9 @@ dispatch_items({FromU, FromS, FromR} = From, {ToU, ToS, ToR} = To, Node,
service_jid(From), jlib:make_jid(To),
Stanza)
end;
-dispatch_items(From, To, _Node, Stanza) ->
+dispatch_items(From, To, _Node, Options, BaseStanza) ->
+ NotificationType = get_option(Options, notification_type, headline),
+ Stanza = add_message_type(BaseStanza, NotificationType),
ejabberd_router:route(service_jid(From), jlib:make_jid(To), Stanza).
%% @spec (Host, JID, Plugins) -> {error, Reason} | {result, Response}
diff --git a/src/mod_pubsub_odbc.erl b/src/mod_pubsub_odbc.erl
index 86707b850..e3e736f5f 100644
--- a/src/mod_pubsub_odbc.erl
+++ b/src/mod_pubsub_odbc.erl
@@ -87,7 +87,7 @@
unsubscribe_node/5,
publish_item/6,
delete_item/4,
- send_items/6,
+ send_items/7,
get_items/2,
get_item/3,
get_cached_item/2,
@@ -464,12 +464,16 @@ send_loop(State) ->
type =
Type,
id =
- NodeId} =
+ NodeId,
+ options
+ =
+ Options} =
Node,
send_items(H,
N,
NodeId,
Type,
+ Options,
LJID,
last);
true ->
@@ -564,6 +568,7 @@ send_loop(State) ->
Node,
NodeId,
Type,
+ Options,
LJID,
last);
true ->
@@ -2550,7 +2555,8 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
{TNode, {Result, subscribed, SubId, send_last}}} ->
NodeId = TNode#pubsub_node.id,
Type = TNode#pubsub_node.type,
- send_items(Host, Node, NodeId, Type, Subscriber, last),
+ Options = TNode#pubsub_node.options,
+ send_items(Host, Node, NodeId, Type, Options, Subscriber, last),
case Result of
default -> {result, Reply({subscribed, SubId})};
_ -> {result, Result}
@@ -3018,11 +3024,12 @@ get_allowed_items_call(Host, NodeIdx, From, Type, Options, Owners, RSM) ->
%% Node = pubsubNode()
%% NodeId = pubsubNodeId()
%% Type = pubsubNodeType()
+%% Options = mod_pubsubnodeOptions()
%% LJID = {U, S, []}
%% Number = last | integer()
%% @doc <p>Resend the items of a node to the user.</p>
%% @todo use cache-last-item feature
-send_items(Host, Node, NodeId, Type, LJID, last) ->
+send_items(Host, Node, NodeId, Type, Options, LJID, last) ->
Stanza = case get_cached_item(Host, NodeId) of
undefined ->
% special ODBC optimization, works only with node_hometree_odbc, node_flat_odbc and node_pep_odbc
@@ -3047,8 +3054,8 @@ send_items(Host, Node, NodeId, Type, LJID, last) ->
itemsEls([LastItem])}],
ModifNow, ModifUSR)
end,
- dispatch_items(Host, LJID, Node, Stanza);
-send_items(Host, Node, NodeId, Type, LJID, Number) ->
+ dispatch_items(Host, LJID, Node, Options, Stanza);
+send_items(Host, Node, NodeId, Type, Options, LJID, Number) ->
ToSend = case node_action(Host, Type, get_items,
[NodeId, LJID])
of
@@ -3076,20 +3083,23 @@ send_items(Host, Node, NodeId, Type, LJID, Number) ->
attrs = nodeAttr(Node),
children = itemsEls(ToSend)}])
end,
- dispatch_items(Host, LJID, Node, Stanza).
+ dispatch_items(Host, LJID, Node, Options, Stanza).
--spec(dispatch_items/4 ::
+-spec(dispatch_items/5 ::
(
- From :: mod_pubsub:host(),
- To :: jid(),
- Node :: mod_pubsub:nodeId(),
- Stanza :: xmlel() | undefined)
+ From :: mod_pubsub:host(),
+ To :: jid(),
+ Node :: mod_pubsub:nodeId(),
+ Options :: mod_pubsub:nodeOptions(),
+ Stanza :: xmlel() | undefined)
-> any()
).
-dispatch_items(_From, _To, _Node, _Stanza = undefined) -> ok;
+dispatch_items(_From, _To, _Node, _Options, _Stanza = undefined) -> ok;
dispatch_items({FromU, FromS, FromR} = From, {ToU, ToS, ToR} = To, Node,
- Stanza) ->
+ Options, BaseStanza) ->
+ NotificationType = get_option(Options, notification_type, headline),
+ Stanza = add_message_type(BaseStanza, NotificationType),
C2SPid = case ejabberd_sm:get_session_pid(ToU, ToS, ToR) of
ToPid when is_pid(ToPid) -> ToPid;
_ ->
@@ -3106,7 +3116,9 @@ dispatch_items({FromU, FromS, FromR} = From, {ToU, ToS, ToR} = To, Node,
service_jid(From), jlib:make_jid(To),
Stanza)
end;
-dispatch_items(From, To, _Node, Stanza) ->
+dispatch_items(From, To, _Node, Options, BaseStanza) ->
+ NotificationType = get_option(Options, notification_type, headline),
+ Stanza = add_message_type(BaseStanza, NotificationType),
ejabberd_router:route(service_jid(From), jlib:make_jid(To), Stanza).
%% @spec (Host, JID, Plugins) -> {error, Reason} | {result, Response}