diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index 794c44e6e..6b21f4585 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -47,7 +47,7 @@ -module(mod_pubsub). -author('christophe.romain@process-one.net'). --version('1.12-06'). +-version('1.13-0'). -behaviour(gen_server). -behaviour(gen_mod). @@ -474,7 +474,7 @@ send_loop(State) -> #pubsub_node{nodeid = {H, N}, type = Type, id = NodeId, options = Options} = Node, case get_option(Options, send_last_published_item) of on_sub_and_presence -> - send_items(H, N, NodeId, Type, SubJID, last); + send_items(H, N, NodeId, Type, LJID, last); _ -> ok end; @@ -3030,10 +3030,14 @@ get_options_for_subs(NodeID, Subs) -> % {result, false} % end -broadcast_stanza(Host, Node, _NodeId, _Type, NodeOptions, SubsByDepth, NotifyType, Stanza) -> - %AccessModel = get_option(NodeOptions, access_model), +broadcast_stanza(Host, Node, _NodeId, _Type, NodeOptions, SubsByDepth, NotifyType, BaseStanza) -> + NotificationType = get_option(NodeOptions, notification_type), BroadcastAll = get_option(NodeOptions, broadcast_all_resources), %% XXX this is not standard, but usefull From = service_jid(Host), + Stanza = case NotificationType of + normal -> BaseStanza; + MsgType -> add_message_type(BaseStanza, atom_to_list(MsgType)) + end, %% Handles explicit subscriptions NodesByJID = subscribed_nodes_by_jid(NotifyType, SubsByDepth), lists:foreach(fun ({LJID, Nodes}) -> @@ -3277,6 +3281,8 @@ get_configure_xfields(_Type, Options, Lang, Groups) -> ?LISTM_CONFIG_FIELD("Roster groups allowed to subscribe", roster_groups_allowed, Groups), ?ALIST_CONFIG_FIELD("Specify the publisher model", publish_model, [publishers, subscribers, open]), + ?ALIST_CONFIG_FIELD("Specify the event message type", notification_type, + [headline, normal]), ?INTEGER_CONFIG_FIELD("Max payload size in bytes", max_payload_size), ?ALIST_CONFIG_FIELD("When to send the last published item", send_last_published_item, [never, on_sub, on_sub_and_presence]), @@ -3408,6 +3414,8 @@ set_xoption(Host, [{"pubsub#access_model", [Val]} | Opts], NewOpts) -> ?SET_ALIST_XOPT(access_model, Val, [open, authorize, presence, roster, whitelist]); set_xoption(Host, [{"pubsub#publish_model", [Val]} | Opts], NewOpts) -> ?SET_ALIST_XOPT(publish_model, Val, [publishers, subscribers, open]); +set_xoption(Host, [{"pubsub#notification_type", [Val]} | Opts], NewOpts) -> + ?SET_ALIST_XOPT(notification_type, Val, [headline, normal]); set_xoption(Host, [{"pubsub#node_type", [Val]} | Opts], NewOpts) -> ?SET_ALIST_XOPT(node_type, Val, [leaf, collection]); set_xoption(Host, [{"pubsub#max_payload_size", [Val]} | Opts], NewOpts) -> @@ -3670,6 +3678,11 @@ itemsEls(Items) -> {xmlelement, "item", itemAttr(ItemId), Payload} end, Items). +add_message_type({xmlelement, "message", Attrs, Els}, Type) -> + {xmlelement, "message", [{"type", Type}|Attrs], Els}; +add_message_type(XmlEl, _Type) -> + XmlEl. + add_headers({xmlelement, Name, Attrs, Els}, HeaderEls) -> HeaderEl = {xmlelement, "headers", [{"xmlns", ?NS_SHIM}], HeaderEls}, {xmlelement, Name, Attrs, [HeaderEl | Els]}. diff --git a/src/mod_pubsub/mod_pubsub_odbc.erl b/src/mod_pubsub/mod_pubsub_odbc.erl index b95f6ea4b..0e8c3c3fe 100644 --- a/src/mod_pubsub/mod_pubsub_odbc.erl +++ b/src/mod_pubsub/mod_pubsub_odbc.erl @@ -47,7 +47,7 @@ -module(mod_pubsub_odbc). -author('christophe.romain@process-one.net'). --version('1.12-06'). +-version('1.13-0'). -behaviour(gen_server). -behaviour(gen_mod). @@ -301,7 +301,7 @@ send_loop(State) -> fun({Node, subscribed, _, SubJID}) -> if (SubJID == LJID) or (SubJID == BJID) -> #pubsub_node{nodeid = {H, N}, type = Type, id = NodeId} = Node, - send_items(H, N, NodeId, Type, SubJID, last); + send_items(H, N, NodeId, Type, LJID, last); true -> % resource not concerned about that subscription ok @@ -2860,10 +2860,14 @@ get_options_for_subs(NodeID, Subs) -> % {result, false} % end -broadcast_stanza(Host, Node, _NodeId, _Type, NodeOptions, SubsByDepth, NotifyType, Stanza) -> - %AccessModel = get_option(NodeOptions, access_model), +broadcast_stanza(Host, Node, _NodeId, _Type, NodeOptions, SubsByDepth, NotifyType, BaseStanza) -> + NotificationType = get_option(NodeOptions, notification_type), BroadcastAll = get_option(NodeOptions, broadcast_all_resources), %% XXX this is not standard, but usefull From = service_jid(Host), + Stanza = case NotificationType of + normal -> BaseStanza; + MsgType -> add_message_type(BaseStanza, atom_to_list(MsgType)) + end, %% Handles explicit subscriptions NodesByJID = subscribed_nodes_by_jid(NotifyType, SubsByDepth), lists:foreach(fun ({LJID, Nodes}) -> @@ -3131,6 +3135,8 @@ get_configure_xfields(_Type, Options, Lang, Groups) -> ?LISTM_CONFIG_FIELD("Roster groups allowed to subscribe", roster_groups_allowed, Groups), ?ALIST_CONFIG_FIELD("Specify the publisher model", publish_model, [publishers, subscribers, open]), + ?ALIST_CONFIG_FIELD("Specify the event message type", notification_type, + [headline, normal]), ?INTEGER_CONFIG_FIELD("Max payload size in bytes", max_payload_size), ?ALIST_CONFIG_FIELD("When to send the last published item", send_last_published_item, [never, on_sub, on_sub_and_presence]), @@ -3262,6 +3268,8 @@ set_xoption(Host, [{"pubsub#access_model", [Val]} | Opts], NewOpts) -> ?SET_ALIST_XOPT(access_model, Val, [open, authorize, presence, roster, whitelist]); set_xoption(Host, [{"pubsub#publish_model", [Val]} | Opts], NewOpts) -> ?SET_ALIST_XOPT(publish_model, Val, [publishers, subscribers, open]); +set_xoption(Host, [{"pubsub#notification_type", [Val]} | Opts], NewOpts) -> + ?SET_ALIST_XOPT(notification_type, Val, [headline, normal]); set_xoption(Host, [{"pubsub#node_type", [Val]} | Opts], NewOpts) -> ?SET_ALIST_XOPT(node_type, Val, [leaf, collection]); set_xoption(Host, [{"pubsub#max_payload_size", [Val]} | Opts], NewOpts) -> @@ -3556,6 +3564,11 @@ itemsEls(Items) -> {xmlelement, "item", itemAttr(ItemId), Payload} end, Items). +add_message_type({xmlelement, "message", Attrs, Els}, Type) -> + {xmlelement, "message", [{"type", Type}|Attrs], Els}; +add_message_type(XmlEl, _Type) -> + XmlEl. + add_headers({xmlelement, Name, Attrs, Els}, HeaderEls) -> HeaderEl = {xmlelement, "headers", [{"xmlns", ?NS_SHIM}], HeaderEls}, {xmlelement, Name, Attrs, [HeaderEl | Els]}. diff --git a/src/mod_pubsub/node.template b/src/mod_pubsub/node.template index e70febb8c..e0c743d38 100644 --- a/src/mod_pubsub/node.template +++ b/src/mod_pubsub/node.template @@ -88,6 +88,7 @@ options() -> {access_model, open}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, on_sub_and_presence}, {deliver_notifications, true}, diff --git a/src/mod_pubsub/node_buddy.erl b/src/mod_pubsub/node_buddy.erl index ee804b34c..20b679ca7 100644 --- a/src/mod_pubsub/node_buddy.erl +++ b/src/mod_pubsub/node_buddy.erl @@ -89,6 +89,7 @@ options() -> {access_model, presence}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, never}, {deliver_notifications, true}, diff --git a/src/mod_pubsub/node_club.erl b/src/mod_pubsub/node_club.erl index 8f14387c0..3c1596cd6 100644 --- a/src/mod_pubsub/node_club.erl +++ b/src/mod_pubsub/node_club.erl @@ -89,6 +89,7 @@ options() -> {access_model, authorize}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, never}, {deliver_notifications, true}, diff --git a/src/mod_pubsub/node_dispatch.erl b/src/mod_pubsub/node_dispatch.erl index 2ce01b238..8c2c7d0f4 100644 --- a/src/mod_pubsub/node_dispatch.erl +++ b/src/mod_pubsub/node_dispatch.erl @@ -87,6 +87,7 @@ options() -> {access_model, open}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, never}, {deliver_notifications, true}, diff --git a/src/mod_pubsub/node_flat.erl b/src/mod_pubsub/node_flat.erl index 0088034d1..67b95973a 100644 --- a/src/mod_pubsub/node_flat.erl +++ b/src/mod_pubsub/node_flat.erl @@ -80,6 +80,7 @@ options() -> {access_model, open}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, on_sub_and_presence}, {deliver_notifications, true}, diff --git a/src/mod_pubsub/node_flat_odbc.erl b/src/mod_pubsub/node_flat_odbc.erl index 6aed3fbc2..f073c70a8 100644 --- a/src/mod_pubsub/node_flat_odbc.erl +++ b/src/mod_pubsub/node_flat_odbc.erl @@ -85,6 +85,7 @@ options() -> {access_model, open}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, on_sub_and_presence}, {deliver_notifications, true}, diff --git a/src/mod_pubsub/node_hometree.erl b/src/mod_pubsub/node_hometree.erl index 38453e4ee..c1c2a55f6 100644 --- a/src/mod_pubsub/node_hometree.erl +++ b/src/mod_pubsub/node_hometree.erl @@ -143,6 +143,7 @@ options() -> {access_model, open}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, on_sub_and_presence}, {deliver_notifications, true}, diff --git a/src/mod_pubsub/node_hometree_odbc.erl b/src/mod_pubsub/node_hometree_odbc.erl index 0d6cefe22..d9e2a815a 100644 --- a/src/mod_pubsub/node_hometree_odbc.erl +++ b/src/mod_pubsub/node_hometree_odbc.erl @@ -147,6 +147,7 @@ options() -> {access_model, open}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, on_sub_and_presence}, {deliver_notifications, true}, diff --git a/src/mod_pubsub/node_mb.erl b/src/mod_pubsub/node_mb.erl index beef44996..c1accca3c 100644 --- a/src/mod_pubsub/node_mb.erl +++ b/src/mod_pubsub/node_mb.erl @@ -92,6 +92,7 @@ options() -> {access_model, presence}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, on_sub_and_presence}, {deliver_notifications, true}, diff --git a/src/mod_pubsub/node_pep.erl b/src/mod_pubsub/node_pep.erl index 7b7794a8a..754312b83 100644 --- a/src/mod_pubsub/node_pep.erl +++ b/src/mod_pubsub/node_pep.erl @@ -87,6 +87,7 @@ options() -> {access_model, presence}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, on_sub_and_presence}, {deliver_notifications, true}, diff --git a/src/mod_pubsub/node_pep_odbc.erl b/src/mod_pubsub/node_pep_odbc.erl index 819bc1766..95c737a6a 100644 --- a/src/mod_pubsub/node_pep_odbc.erl +++ b/src/mod_pubsub/node_pep_odbc.erl @@ -95,6 +95,7 @@ options() -> {access_model, presence}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, on_sub_and_presence}, {deliver_notifications, true}, diff --git a/src/mod_pubsub/node_private.erl b/src/mod_pubsub/node_private.erl index 610ac7773..054485ef5 100644 --- a/src/mod_pubsub/node_private.erl +++ b/src/mod_pubsub/node_private.erl @@ -89,6 +89,7 @@ options() -> {access_model, whitelist}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, never}, {deliver_notifications, false}, diff --git a/src/mod_pubsub/node_public.erl b/src/mod_pubsub/node_public.erl index 0797af778..ee440f933 100644 --- a/src/mod_pubsub/node_public.erl +++ b/src/mod_pubsub/node_public.erl @@ -89,6 +89,7 @@ options() -> {access_model, open}, {roster_groups_allowed, []}, {publish_model, publishers}, + {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, never}, {deliver_notifications, true}, diff --git a/src/mod_pubsub/pubsub_odbc.patch b/src/mod_pubsub/pubsub_odbc.patch index c59ec725d..400ec948b 100644 --- a/src/mod_pubsub/pubsub_odbc.patch +++ b/src/mod_pubsub/pubsub_odbc.patch @@ -1,5 +1,5 @@ ---- mod_pubsub.erl 2009-09-23 17:53:47.000000000 +0200 -+++ mod_pubsub_odbc.erl 2009-09-23 17:54:27.000000000 +0200 +--- mod_pubsub.erl 2009-09-24 18:34:03.471785103 +0200 ++++ mod_pubsub_odbc.erl 2009-09-24 18:35:20.256479455 +0200 @@ -45,7 +45,7 @@ %%% TODO %%% plugin: generate Reply (do not use broadcast atom anymore) @@ -7,7 +7,7 @@ --module(mod_pubsub). +-module(mod_pubsub_odbc). -author('christophe.romain@process-one.net'). - -version('1.12-06'). + -version('1.13-0'). @@ -57,9 +57,9 @@ -include("jlib.hrl"). @@ -243,12 +243,12 @@ - #pubsub_node{nodeid = {H, N}, type = Type, id = NodeId, options = Options} = Node, - case get_option(Options, send_last_published_item) of - on_sub_and_presence -> -- send_items(H, N, NodeId, Type, SubJID, last); +- send_items(H, N, NodeId, Type, LJID, last); - _ -> - ok - end; + #pubsub_node{nodeid = {H, N}, type = Type, id = NodeId} = Node, -+ send_items(H, N, NodeId, Type, SubJID, last); ++ send_items(H, N, NodeId, Type, LJID, last); true -> % resource not concerned about that subscription ok @@ -612,7 +612,7 @@ _ -> Acc end; (_, Acc) -> -@@ -3199,6 +3029,30 @@ +@@ -3203,6 +3033,30 @@ Result end. @@ -643,7 +643,7 @@ %% @spec (Host, Options) -> MaxItems %% Host = host() %% Options = [Option] -@@ -3581,7 +3435,13 @@ +@@ -3589,7 +3443,13 @@ tree_action(Host, Function, Args) -> ?DEBUG("tree_action ~p ~p ~p",[Host,Function,Args]), Fun = fun() -> tree_call(Host, Function, Args) end, @@ -658,7 +658,7 @@ %% @doc

node plugin call.

node_call(Type, Function, Args) -> -@@ -3601,13 +3461,13 @@ +@@ -3609,13 +3469,13 @@ node_action(Host, Type, Function, Args) -> ?DEBUG("node_action ~p ~p ~p ~p",[Host,Type,Function,Args]), @@ -674,7 +674,7 @@ case tree_call(Host, get_node, [Host, Node]) of N when is_record(N, pubsub_node) -> case Action(N) of -@@ -3620,8 +3480,14 @@ +@@ -3628,8 +3488,14 @@ end end, Trans). @@ -691,7 +691,7 @@ {result, Result} -> {result, Result}; {error, Error} -> {error, Error}; {atomic, {result, Result}} -> {result, Result}; -@@ -3629,6 +3495,15 @@ +@@ -3637,6 +3503,15 @@ {aborted, Reason} -> ?ERROR_MSG("transaction return internal error: ~p~n", [{aborted, Reason}]), {error, ?ERR_INTERNAL_SERVER_ERROR}; @@ -707,7 +707,7 @@ {'EXIT', Reason} -> ?ERROR_MSG("transaction return internal error: ~p~n", [{'EXIT', Reason}]), {error, ?ERR_INTERNAL_SERVER_ERROR}; -@@ -3637,6 +3512,17 @@ +@@ -3645,6 +3520,17 @@ {error, ?ERR_INTERNAL_SERVER_ERROR} end.