diff --git a/ChangeLog b/ChangeLog index 9b8e50d36..3a1b05691 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2008-09-24 Christophe Romain + + * src/mod_pubsub/mod_pubsub.erl: Allow PEP node type to be mapped with + namespace (EJAB-739). Change get_items to use From (EJAB-751). (Thanks + to Eric Cestari) + * src/mod_pubsub/gen_pubsub_node.erl: Likewise + * src/mod_pubsub/node_dispatch.erl: Likewise + * src/mod_pubsub/node_buddy.erl: Likewise + * src/mod_pubsub/node_zoo.erl: Likewise + * src/mod_pubsub/node.template: Likewise + * src/mod_pubsub/node_private.erl: Likewise + * src/mod_pubsub/node_public.erl: Likewise + * src/mod_pubsub/node_default.erl: Likewise + * src/mod_pubsub/node_pep.erl: Likewise + * src/mod_pubsub/node_club.erl: Likewise + + * src/mod_pubsub/node_mb.erl: Added PEP microglobing node (Thanks to + Eric Cestari) + 2008-09-22 Mickael Remond * src/mod_configure.erl: Fix adhoc commands reply types for diff --git a/src/mod_pubsub/gen_pubsub_node.erl b/src/mod_pubsub/gen_pubsub_node.erl index a193a51cc..f3fc16ff8 100644 --- a/src/mod_pubsub/gen_pubsub_node.erl +++ b/src/mod_pubsub/gen_pubsub_node.erl @@ -63,7 +63,7 @@ behaviour_info(callbacks) -> {get_state, 3}, {set_state, 1}, {get_items, 7}, - {get_items, 2}, + {get_items, 3}, {get_item, 8}, {get_item, 3}, {set_item, 1}, diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index dd86b91bb..a7084fad6 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -77,7 +77,8 @@ delete_item/4, get_configure/4, set_configure/5, - get_items/2, + get_items/3, + tree_action/3, node_action/3, node_action/4 ]). @@ -114,6 +115,7 @@ -record(state, {server_host, host, access, + pep_mapping = [], nodetree = ?STDTREE, plugins = [?STDNODE]}). @@ -175,7 +177,7 @@ init([ServerHost, Opts]) -> {?NS_PUBSUB, ejabberd_sm, iq_sm}, {?NS_PUBSUB_OWNER, ejabberd_sm, iq_sm}]), ejabberd_router:register_route(Host), - {Plugins, NodeTree} = init_plugins(Host, ServerHost, Opts), + {Plugins, NodeTree, PepMapping} = init_plugins(Host, ServerHost, Opts), update_database(Host), ets:new(gen_mod:get_module_proc(Host, pubsub_state), [set, named_table]), ets:insert(gen_mod:get_module_proc(Host, pubsub_state), {nodetree, NodeTree}), @@ -183,10 +185,12 @@ init([ServerHost, Opts]) -> ets:new(gen_mod:get_module_proc(ServerHost, pubsub_state), [set, named_table]), ets:insert(gen_mod:get_module_proc(ServerHost, pubsub_state), {nodetree, NodeTree}), ets:insert(gen_mod:get_module_proc(ServerHost, pubsub_state), {plugins, Plugins}), + ets:insert(gen_mod:get_module_proc(ServerHost, pubsub_state), {pep_mapping, PepMapping}), init_nodes(Host, ServerHost), {ok, #state{host = Host, server_host = ServerHost, access = Access, + pep_mapping = PepMapping, nodetree = NodeTree, plugins = Plugins}}. @@ -209,12 +213,14 @@ init_plugins(Host, ServerHost, Opts) -> ?DEBUG("** tree plugin is ~p",[TreePlugin]), TreePlugin:init(Host, ServerHost, Opts), Plugins = lists:usort(gen_mod:get_opt(plugins, Opts, []) ++ [?STDNODE]), + PepMapping = lists:usort(gen_mod:get_opt(pep_mapping, Opts, [])), + ?DEBUG("** PEP Mapping : ~p~n",[PepMapping]), lists:foreach(fun(Name) -> ?DEBUG("** init ~s plugin",[Name]), Plugin = list_to_atom(?PLUGIN_PREFIX ++ Name), Plugin:init(Host, ServerHost, Opts) end, Plugins), - {Plugins, TreePlugin}. + {Plugins, TreePlugin, PepMapping}. terminate_plugins(Host, ServerHost, Plugins, TreePlugin) -> lists:foreach(fun(Name) -> @@ -371,11 +377,11 @@ disco_sm_items(Acc, _From, To, [], _Lang) -> {result, NodeItems ++ Items} end; -disco_sm_items(Acc, _From, To, Node, _Lang) -> +disco_sm_items(Acc, From, To, Node, _Lang) -> %% TODO, use iq_disco_items(Host, Node, From) Host = To#jid.lserver, LJID = jlib:jid_tolower(jlib:jid_remove_resource(To)), - case get_items(Host, Node) of + case get_items(Host, Node, From) of [] -> Acc; AllItems -> @@ -430,6 +436,8 @@ handle_call(server_host, _From, State) -> {reply, State#state.server_host, State}; handle_call(plugins, _From, State) -> {reply, State#state.plugins, State}; +handle_call(pep_mapping, _From, State) -> + {reply, State#state.pep_mapping, State}; handle_call(nodetree, _From, State) -> {reply, State#state.nodetree, State}; handle_call(stop, _From, State) -> @@ -717,7 +725,7 @@ node_disco_info(Host, Node, From, Identity, Features) -> [] -> ["leaf"]; %% No sub-nodes: it's a leaf node _ -> - case node_call(Type, get_items, [Host, Node]) of + case node_call(Type, get_items, [Host, Node, From]) of {result, []} -> ["collection"]; {result, _} -> ["leaf", "collection"]; _ -> [] @@ -782,7 +790,7 @@ iq_disco_items(Host, Item, From) -> %% TODO That is, remove name attribute Action = fun(#pubsub_node{type = Type}) -> - NodeItems = case node_call(Type, get_items, [Host, Node]) of + NodeItems = case node_call(Type, get_items, [Host, Node, From]) of {result, I} -> I; _ -> [] end, @@ -1183,10 +1191,7 @@ create_node(Host, ServerHost, [], Owner, Type, Access, Configuration) -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "nodeid-required")} end; create_node(Host, ServerHost, Node, Owner, GivenType, Access, Configuration) -> - Type = case Host of - {_User, _Server, _Resource} -> ?PEPNODE; - _ -> GivenType - end, + Type = select_type(ServerHost, Host, Node, GivenType), Parent = lists:sublist(Node, length(Node) - 1), %% TODO, check/set node_type = Type ParseOptions = case xml:remove_cdata(Configuration) of @@ -1488,12 +1493,7 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload) -> %% handles auto-create feature %% for automatic node creation. we'll take the default node type: %% first listed into the plugins configuration option, or pep - Type = case Host of - {_User, _Server, _Resource} -> - ?PEPNODE; - _ -> - hd(plugins(ServerHost)) - end, + Type = select_type(ServerHost, Host, Node), case lists:member("auto-create", features(Type)) of true -> case create_node(Host, ServerHost, Node, Publisher, Type) of @@ -1712,8 +1712,8 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIDs) -> end end. -get_items(Host, Node) -> - case node_action(Host, Node, get_items, [Host, Node]) of +get_items(Host, Node, From) -> + case node_action(Host, Node, get_items, [Host, Node, From]) of {result, Items} -> Items; _ -> [] end. @@ -1723,15 +1723,15 @@ get_items(Host, Node) -> %% Node = pubsubNode() %% LJID = {U, S, []} %% @doc

Resend the items of a node to the user.

-send_all_items(Host, Node, LJID) -> - send_items(Host, Node, LJID, all). +%send_all_items(Host, Node, LJID) -> +% send_items(Host, Node, LJID, all). send_last_item(Host, Node, LJID) -> send_items(Host, Node, LJID, last). %% TODO use cache-last-item feature send_items(Host, Node, LJID, Number) -> - ToSend = case get_items(Host, Node) of + ToSend = case get_items(Host, Node, LJID) of [] -> []; Items -> @@ -2411,11 +2411,8 @@ get_configure(Host, Node, From, Lang) -> end, transaction(Host, Node, Action, sync_dirty). -get_default(Host, _Node, _From, Lang) -> - Type = case Host of - {_, _, _} -> ?PEPNODE; - _ -> hd(plugins(Host)) - end, +get_default(Host, Node, _From, Lang) -> + Type=select_type(Host, Host, Node), Options = node_options(Type), {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB_OWNER}], [{xmlelement, "default", [], @@ -2663,6 +2660,19 @@ plugins(Host) -> [{plugins, PL}] -> PL; _ -> [?STDNODE] end. +select_type(ServerHost, Host, Node, Type)-> + ?DEBUG("SELECT_TYPE : ~p~n", [Node]), + case Host of + {_User, _Server, _Resource} -> + case ets:lookup(gen_mod:get_module_proc(ServerHost, pubsub_state), pep_mapping) of + [{pep_mapping, PM}] -> ?DEBUG("SELECT_TYPE : ~p~n", [PM]), proplists:get_value(Node, PM,?PEPNODE); + R -> ?DEBUG("SELECT_TYPE why ?: ~p~n", [R]), ?PEPNODE + end; + _ -> + Type + end. +select_type(ServerHost, Host, Node) -> + select_type(ServerHost, Host, Node,hd(plugins(ServerHost))). features() -> [ @@ -2811,3 +2821,4 @@ uniqid() -> get_item_name(Host, Node, Id) -> {result, Name} = node_action(Host, Node, get_item_name, [Host, Node, Id]), Name. + diff --git a/src/mod_pubsub/node.template b/src/mod_pubsub/node.template index 9c2344ae1..b98322d0d 100644 --- a/src/mod_pubsub/node.template +++ b/src/mod_pubsub/node.template @@ -62,7 +62,7 @@ get_state/3, set_state/1, get_items/7, - get_items/2, + get_items/3, get_item/8, get_item/3, set_item/1 @@ -168,8 +168,8 @@ get_state(Host, Node, JID) -> set_state(State) -> node_default:set_state(State). -get_items(Host, Node) -> - node_default:get_items(Host, Node). +get_items(Host, Node, From) -> + node_default:get_items(Host, Node, From). get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) node_default:get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). diff --git a/src/mod_pubsub/node_buddy.erl b/src/mod_pubsub/node_buddy.erl index 8bca962d3..6cdd6118b 100644 --- a/src/mod_pubsub/node_buddy.erl +++ b/src/mod_pubsub/node_buddy.erl @@ -63,7 +63,7 @@ get_state/3, set_state/1, get_items/7, - get_items/2, + get_items/3, get_item/8, get_item/3, set_item/1, @@ -171,8 +171,8 @@ get_state(Host, Node, JID) -> set_state(State) -> node_default:set_state(State). -get_items(Host, Node) -> - node_default:get_items(Host, Node). +get_items(Host, Node, From) -> + node_default:get_items(Host, Node, From). get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> node_default:get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). diff --git a/src/mod_pubsub/node_club.erl b/src/mod_pubsub/node_club.erl index 978f6f39d..ae8ab9cf1 100644 --- a/src/mod_pubsub/node_club.erl +++ b/src/mod_pubsub/node_club.erl @@ -63,7 +63,7 @@ get_state/3, set_state/1, get_items/7, - get_items/2, + get_items/3, get_item/8, get_item/3, set_item/1, @@ -170,8 +170,8 @@ get_state(Host, Node, JID) -> set_state(State) -> node_default:set_state(State). -get_items(Host, Node) -> - node_default:get_items(Host, Node). +get_items(Host, Node, From) -> + node_default:get_items(Host, Node, From). get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> node_default:get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). diff --git a/src/mod_pubsub/node_default.erl b/src/mod_pubsub/node_default.erl index ddda469c6..077bdc70c 100644 --- a/src/mod_pubsub/node_default.erl +++ b/src/mod_pubsub/node_default.erl @@ -1,4 +1,4 @@ -%%% ==================================================================== + %%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the @@ -70,7 +70,7 @@ get_state/3, set_state/1, get_items/7, - get_items/2, + get_items/3, get_item/8, get_item/3, set_item/1, @@ -705,9 +705,9 @@ set_state(_) -> %% relational database), or they can even decide not to persist any items.

%%

If a PubSub plugin wants to delegate the item storage to the default node, %% they can implement this function like this: -%% ```get_items(Host, Node) -> -%% node_default:get_items(Host, Node).'''

-get_items(Host, Node) -> +%% ```get_items(Host, Node, From) -> +%% node_default:get_items(Host, Node, From).'''

+get_items(Host, Node, _From) -> Items = mnesia:match_object( #pubsub_item{itemid = {'_', {Host, Node}}, _ = '_'}), {result, Items}. @@ -747,7 +747,7 @@ get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, _SubI %% % Payment is required for a subscription %% {error, ?ERR_PAYMENT_REQUIRED}; true -> - get_items(Host, Node) + get_items(Host, Node, JID) end. %% @spec (Host, Node, ItemId) -> [Item] | [] diff --git a/src/mod_pubsub/node_dispatch.erl b/src/mod_pubsub/node_dispatch.erl index 0d9e1dcd9..98a396cbf 100644 --- a/src/mod_pubsub/node_dispatch.erl +++ b/src/mod_pubsub/node_dispatch.erl @@ -61,7 +61,7 @@ get_state/3, set_state/1, get_items/7, - get_items/2, + get_items/3, get_item/8, get_item/3, set_item/1, @@ -173,8 +173,8 @@ get_state(Host, Node, JID) -> set_state(State) -> node_default:set_state(State). -get_items(Host, Node) -> - node_default:get_items(Host, Node). +get_items(Host, Node, From) -> + node_default:get_items(Host, Node, From). get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> node_default:get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). diff --git a/src/mod_pubsub/node_mb.erl b/src/mod_pubsub/node_mb.erl new file mode 100644 index 000000000..f5c8d0b48 --- /dev/null +++ b/src/mod_pubsub/node_mb.erl @@ -0,0 +1,172 @@ +%%% @doc The module {@module} is the pep microblog PubSub plugin. +%%%

To be used, mod_pubsub must be configured : +%%% {mod_pubsub, [ % requires mod_caps +%%% {access_createnode, pubsub_createnode}, +%%% {plugins, ["default", "pep","mb"]}, +%%% {pep_mapping, [{"urn:xmpp:microblog", "mb"}]} +%%% ]}, +%%%

PubSub plugin nodes are using the {@link gen_pubsub_node} behaviour.

+ +-module(node_mb). +-author('eric@ohmforce.com'). + +-include("ejabberd.hrl"). +-include("pubsub.hrl"). +-include("jlib.hrl"). + +-behaviour(gen_pubsub_node). + +%% API definition +-export([init/3, terminate/2, + options/0, features/0, + create_node_permission/6, + create_node/3, + delete_node/2, + purge_node/3, + subscribe_node/8, + unsubscribe_node/5, + publish_item/7, + delete_item/4, + remove_extra_items/4, + get_entity_affiliations/2, + get_node_affiliations/2, + get_affiliation/3, + set_affiliation/4, + get_entity_subscriptions/2, + get_node_subscriptions/2, + get_subscription/3, + set_subscription/4, + get_states/2, + get_state/3, + set_state/1, + get_items/7, + get_items/3, + get_item/8, + get_item/3, + set_item/1, + get_item_name/3 + ]). + +init(Host, ServerHost, Opts) -> + node_pep:init(Host, ServerHost, Opts). + +terminate(Host, ServerHost) -> + node_pep:terminate(Host, ServerHost), + ok. + +options() -> + [{node_type, pep}, + {deliver_payloads, true}, + {notify_config, false}, + {notify_delete, false}, + {notify_retract, false}, + {persist_items, true}, + {max_items, ?MAXITEMS}, + {subscribe, true}, + {access_model, presence}, + {roster_groups_allowed, []}, + {publish_model, publishers}, + {max_payload_size, ?MAX_PAYLOAD_SIZE}, + {send_last_published_item, on_sub_and_presence}, + {deliver_notifications, true}, + {presence_based_delivery, true}]. + +features() -> + ["create-nodes", %* + "auto-create", %* + "auto-subscribe", %* + "delete-nodes", %* + "filtered-notifications", %* + "modify-affiliations", + "outcast-affiliation", + "persistent-items", + "publish", %* + "purge-nodes", + "retract-items", + "retrieve-affiliations", + "retrieve-items", %* + "retrieve-subscriptions", + "subscribe" %* + ]. + +create_node_permission(Host, ServerHost, Node, ParentNode, Owner, Access) -> + node_pep:create_node_permission(Host, ServerHost, Node, ParentNode, Owner, Access). + +create_node(Host, Node, Owner) -> + node_pep:create_node(Host, Node, Owner). + +delete_node(Host, Removed) -> + node_pep:delete_node(Host, Removed). + +subscribe_node(Host, Node, Sender, Subscriber, AccessModel, + SendLast, PresenceSubscription, RosterGroup) -> + node_pep:subscribe_node( + Host, Node, Sender, Subscriber, AccessModel, SendLast, + PresenceSubscription, RosterGroup). + +unsubscribe_node(Host, Node, Sender, Subscriber, SubID) -> + node_pep:unsubscribe_node(Host, Node, Sender, Subscriber, SubID). + +publish_item(Host, Node, Publisher, Model, MaxItems, ItemId, Payload) -> + node_pep:publish_item(Host, Node, Publisher, Model, MaxItems, ItemId, Payload). + +remove_extra_items(Host, Node, MaxItems, ItemIds) -> + node_pep:remove_extra_items(Host, Node, MaxItems, ItemIds). + +delete_item(Host, Node, JID, ItemId) -> + node_pep:delete_item(Host, Node, JID, ItemId). + +purge_node(Host, Node, Owner) -> + node_pep:purge_node(Host, Node, Owner). + +get_entity_affiliations(Host, Owner) -> + node_pep:get_entity_affiliations(Host, Owner). + +get_node_affiliations(Host, Node) -> + node_pep:get_node_affiliations(Host, Node). + +get_affiliation(Host, Node, Owner) -> + node_pep:get_affiliation(Host, Node, Owner). + +set_affiliation(Host, Node, Owner, Affiliation) -> + node_pep:set_affiliation(Host, Node, Owner, Affiliation). + +get_entity_subscriptions(Host,Owner) -> + node_pep:get_entity_subscriptions(Host, Owner). + +get_node_subscriptions(Host, Node) -> + node_pep:get_node_subscriptions(Host, Node). + +get_subscription(Host,Node,Owner) -> + node_pep:get_subscription(Host,Node,Owner). + +set_subscription(Host, Node, Owner, Subscription) -> + node_pep:set_subscription(Host, Node, Owner, Subscription). + +get_states(Host, Node) -> + node_pep:get_states(Host, Node). + +get_state(Host, Node, JID) -> + node_pep:get_state(Host, Node, JID). + +set_state(State) -> + node_pep:set_state(State). + +get_items(Host, Node, From) -> + node_pep:get_items(Host, Node, From). + +get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> + node_pep:get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). + +get_item(Host, Node, ItemId) -> + node_pep:get_item(Host, Node, ItemId). + +get_item(Host, Node, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> + node_pep:get_item(Host, Node, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). + +set_item(Item) -> + node_pep:set_item(Item). + +get_item_name(Host, Node, Id) -> + node_pep:get_item_name(Host, Node, Id). + diff --git a/src/mod_pubsub/node_pep.erl b/src/mod_pubsub/node_pep.erl index ddbf13b4b..6d2d2709e 100644 --- a/src/mod_pubsub/node_pep.erl +++ b/src/mod_pubsub/node_pep.erl @@ -59,7 +59,7 @@ get_state/3, set_state/1, get_items/7, - get_items/2, + get_items/3, get_item/8, get_item/3, set_item/1, @@ -123,7 +123,8 @@ create_node_permission(Host, ServerHost, _Node, _ParentNode, Owner, Access) -> {User, Server, _} -> true; _ -> false end; - _ -> + E -> + ?DEBUG("Create not allowed : ~p~n", [E]), false end end, @@ -215,8 +216,8 @@ get_state(Host, Node, JID) -> set_state(State) -> node_default:set_state(State). -get_items(Host, Node) -> - node_default:get_items(Host, Node). +get_items(Host, Node, From) -> + node_default:get_items(Host, Node, From). get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> node_default:get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). diff --git a/src/mod_pubsub/node_private.erl b/src/mod_pubsub/node_private.erl index 08d6abd85..5d87ec181 100644 --- a/src/mod_pubsub/node_private.erl +++ b/src/mod_pubsub/node_private.erl @@ -63,7 +63,7 @@ get_state/3, set_state/1, get_items/7, - get_items/2, + get_items/3, get_item/8, get_item/3, set_item/1, @@ -173,8 +173,8 @@ get_state(Host, Node, JID) -> set_state(State) -> node_default:set_state(State). -get_items(Host, Node) -> - node_default:get_items(Host, Node). +get_items(Host, Node, From) -> + node_default:get_items(Host, Node, From). get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> node_default:get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). diff --git a/src/mod_pubsub/node_public.erl b/src/mod_pubsub/node_public.erl index 08559e423..7fda56e22 100644 --- a/src/mod_pubsub/node_public.erl +++ b/src/mod_pubsub/node_public.erl @@ -63,7 +63,7 @@ get_state/3, set_state/1, get_items/7, - get_items/2, + get_items/3, get_item/8, get_item/3, set_item/1, @@ -170,8 +170,8 @@ get_state(Host, Node, JID) -> set_state(State) -> node_default:set_state(State). -get_items(Host, Node) -> - node_default:get_items(Host, Node). +get_items(Host, Node, From) -> + node_default:get_items(Host, Node, From). get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> node_default:get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). diff --git a/src/mod_pubsub/node_zoo.erl b/src/mod_pubsub/node_zoo.erl index a0d8afb09..12a69c58f 100644 --- a/src/mod_pubsub/node_zoo.erl +++ b/src/mod_pubsub/node_zoo.erl @@ -54,7 +54,7 @@ get_state/3, set_state/1, get_items/7, - get_items/2, + get_items/3, get_item/8, get_item/3, set_item/1, @@ -163,8 +163,8 @@ get_state(Host, Node, JID) -> set_state(State) -> node_default:set_state(State). -get_items(Host, Node) -> - node_default:get_items(Host, Node). +get_items(Host, Node, From) -> + node_default:get_items(Host, Node, From). get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> node_default:get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, SubId).