Fix compilation issues on R19

This commit is contained in:
Paweł Chmielowski 2016-07-01 21:18:55 +02:00
parent 024124decb
commit 0737958b45
10 changed files with 199 additions and 538 deletions

View File

@ -7,12 +7,12 @@
%%% Created : 1 May 2013 by Evgeniy Khramtsov <ekhramtsov@process-one.net>
%%%-------------------------------------------------------------------
{deps, [{lager, ".*", {git, "https://github.com/basho/lager", {tag, "3.0.2"}}},
{deps, [{lager, ".*", {git, "https://github.com/basho/lager", {tag, "3.2.1"}}},
{p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.4"}}},
{cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.3"}}},
{fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.0.5"}}},
{stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.4"}}},
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.13"}}},
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.14"}}},
{stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.5"}}},
{esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.6"}}},
{fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.4"}}},
@ -34,7 +34,7 @@
"527722d12d0433b837cdb92a60900c2cb5df8942"}}},
%% Forces correct dependency for riakc and allow using newer meck version)
{if_var_true, riak, {hamcrest, ".*", {git, "https://github.com/hyperthunk/hamcrest-erlang",
"908a24fda4a46776a5135db60ca071e3d783f9f6"}}}, % for riak_pb-2.1.0.7
"13f9bfb9b27d216e8e033b0e0a9a29097ed923dd"}}}, % for riak_pb-2.1.0.7
{if_var_true, riak, {protobuffs, ".*", {git, "https://github.com/basho/erlang_protobuffs",
"6e7fc924506e2dc166a6170e580ce1d95ebbd5bd"}}}, % for riak_pb-2.1.0.7 with correct meck dependency
%% Elixir support, needed to run tests

View File

@ -41,13 +41,7 @@
%% Parse an ad-hoc request. Return either an adhoc_request record or
%% an {error, ErrorType} tuple.
%%
-spec(parse_request/1 ::
(
IQ :: iq_request())
-> adhoc_response()
%%
| {error, _}
).
-spec parse_request(IQ :: iq_request()) -> adhoc_response() | {error, _}.
parse_request(#iq{type = set, lang = Lang, sub_el = SubEl, xmlns = ?NS_COMMANDS}) ->
?DEBUG("entering parse_request...", []),
@ -88,12 +82,9 @@ find_xdata_el1([_ | Els]) -> find_xdata_el1(Els).
%% record, filling in values for language, node and session id from
%% the request.
%%
-spec(produce_response/2 ::
(
Adhoc_Request :: adhoc_request(),
Adhoc_Response :: adhoc_response())
-> Xmlel::xmlel()
).
-spec produce_response(Adhoc_Request :: adhoc_request(),
Adhoc_Response :: adhoc_response()) ->
Xmlel::xmlel().
%% Produce a <command/> node to use as response from an adhoc_response
%% record.
@ -104,11 +95,7 @@ produce_response(#adhoc_request{lang = Lang, node = Node, sessionid = SessionID}
}).
%%
-spec(produce_response/1 ::
(
Adhoc_Response::adhoc_response())
-> Xmlel::xmlel()
).
-spec produce_response(Adhoc_Response::adhoc_response()) -> Xmlel::xmlel().
produce_response(
#adhoc_response{

View File

@ -88,13 +88,8 @@ start() ->
ok.
%%
-spec(register_mechanism/3 ::
(
Mechanim :: mechanism(),
Module :: module(),
PasswordType :: password_type())
-> any()
).
-spec register_mechanism(Mechanim :: mechanism(), Module :: module(),
PasswordType :: password_type()) -> any().
register_mechanism(Mechanism, Module, PasswordType) ->
case is_disabled(Mechanism) of
@ -139,11 +134,7 @@ check_credentials(_State, Props) ->
_LUser -> ok
end.
-spec(listmech/1 ::
(
Host ::binary())
-> Mechanisms::mechanisms()
).
-spec listmech(Host ::binary()) -> Mechanisms::mechanisms().
listmech(Host) ->
Mechs = ets:select(sasl_mechanism,
@ -213,12 +204,7 @@ server_step(State, ClientIn) ->
%% Remove the anonymous mechanism from the list if not enabled for the given
%% host
%%
-spec(filter_anonymous/2 ::
(
Host :: binary(),
Mechs :: mechanisms())
-> mechanisms()
).
-spec filter_anonymous(Host :: binary(), Mechs :: mechanisms()) -> mechanisms().
filter_anonymous(Host, Mechs) ->
case ejabberd_auth_anonymous:is_sasl_anonymous_enabled(Host) of
@ -226,11 +212,7 @@ filter_anonymous(Host, Mechs) ->
false -> Mechs -- [<<"ANONYMOUS">>]
end.
-spec(is_disabled/1 ::
(
Mechanism :: mechanism())
-> boolean()
).
-spec is_disabled(Mechanism :: mechanism()) -> boolean().
is_disabled(Mechanism) ->
Disabled = ejabberd_config:get_option(

View File

@ -90,7 +90,7 @@ hosts_to_start(State) ->
%% @private
%% At the moment, these functions are mainly used to setup unit tests.
-spec(start/2 :: (Hosts :: [binary()], Opts :: [acl:acl() | local_config()]) -> ok).
-spec start(Hosts :: [binary()], Opts :: [acl:acl() | local_config()]) -> ok.
start(Hosts, Opts) ->
mnesia_init(),
set_opts(set_hosts_in_options(Hosts, #state{opts = Opts})).

View File

@ -307,21 +307,16 @@ get_iq_namespace(#xmlel{name = <<"iq">>, children = Els}) ->
get_iq_namespace(_) -> <<"">>.
%%
-spec(iq_query_info/1 ::
(
Xmlel :: xmlel())
-> iq_request() | 'reply' | 'invalid' | 'not_iq'
).
-spec iq_query_info(Xmlel :: xmlel()) ->
iq_request() | 'reply' | 'invalid' | 'not_iq'.
%% @spec (xmlelement()) -> iq() | reply | invalid | not_iq
iq_query_info(El) -> iq_info_internal(El, request).
%%
-spec(iq_query_or_response_info/1 ::
(
Xmlel :: xmlel())
-> iq_request() | iq_reply() | 'reply' | 'invalid' | 'not_iq'
).
-spec iq_query_or_response_info(Xmlel :: xmlel()) ->
iq_request() | iq_reply() |
'reply' | 'invalid' | 'not_iq'.
iq_query_or_response_info(El) ->
iq_info_internal(El, any).
@ -373,11 +368,7 @@ iq_type_to_string(get) -> <<"get">>;
iq_type_to_string(result) -> <<"result">>;
iq_type_to_string(error) -> <<"error">>.
-spec(iq_to_xml/1 ::
(
IQ :: iq())
-> xmlel()
).
-spec iq_to_xml(IQ :: iq()) -> xmlel().
iq_to_xml(#iq{id = ID, type = Type, sub_el = SubEl}) ->
if ID /= <<"">> ->
@ -391,13 +382,8 @@ iq_to_xml(#iq{id = ID, type = Type, sub_el = SubEl}) ->
children = SubEl}
end.
-spec(parse_xdata_submit/1 ::
(
El :: xmlel())
-> [{Var::binary(), Values::[binary()]}]
%%
| 'invalid'
).
-spec parse_xdata_submit(El :: xmlel()) ->
[{Var::binary(), Values::[binary()]}] | 'invalid'.
parse_xdata_submit(#xmlel{attrs = Attrs, children = Els}) ->
case fxml:get_attr_s(<<"type">>, Attrs) of
@ -409,12 +395,9 @@ parse_xdata_submit(#xmlel{attrs = Attrs, children = Els}) ->
invalid
end.
-spec(parse_xdata_fields/2 ::
(
Xmlels :: [xmlel() | cdata()],
Res :: [{Var::binary(), Values :: [binary()]}])
-> [{Var::binary(), Values::[binary()]}]
).
-spec parse_xdata_fields(Xmlels :: [xmlel() | cdata()],
Res :: [{Var::binary(), Values :: [binary()]}]) ->
[{Var::binary(), Values::[binary()]}].
parse_xdata_fields([], Res) -> Res;
parse_xdata_fields([#xmlel{name = <<"field">>, attrs = Attrs, children = SubEls}
@ -429,12 +412,8 @@ parse_xdata_fields([#xmlel{name = <<"field">>, attrs = Attrs, children = SubEls}
parse_xdata_fields([_ | Els], Res) ->
parse_xdata_fields(Els, Res).
-spec(parse_xdata_values/2 ::
(
Xmlels :: [xmlel() | cdata()],
Res :: [binary()])
-> [binary()]
).
-spec parse_xdata_values(Xmlels :: [xmlel() | cdata()],
Res :: [binary()]) -> [binary()].
parse_xdata_values([], Res) -> Res;
parse_xdata_values([#xmlel{name = <<"value">>, children = SubEls} | Els], Res) ->

View File

@ -234,11 +234,7 @@ stop(Host) ->
%% {stop, Reason}
%% Description: Initiates the server
%%--------------------------------------------------------------------
-spec(init/1 ::
(
[binary() | [{_,_}],...])
-> {'ok',state()}
).
-spec init([binary() | [{_,_}],...]) -> {'ok',state()}.
init([ServerHost, Opts]) ->
?DEBUG("pubsub init ~p ~p", [ServerHost, Opts]),
@ -480,15 +476,10 @@ send_loop(State) ->
%% disco hooks handling functions
%%
-spec(disco_local_identity/5 ::
(
Acc :: [xmlel()],
_From :: jid(),
To :: jid(),
Node :: <<>> | mod_pubsub:nodeId(),
Lang :: binary())
-> [xmlel()]
).
-spec disco_local_identity(Acc :: [xmlel()], _From :: jid(),
To :: jid(), Node :: <<>> | mod_pubsub:nodeId(),
Lang :: binary()) -> [xmlel()].
disco_local_identity(Acc, _From, To, <<>>, _Lang) ->
case lists:member(?PEPNODE, plugins(host(To#jid.lserver))) of
true ->
@ -502,15 +493,10 @@ disco_local_identity(Acc, _From, To, <<>>, _Lang) ->
disco_local_identity(Acc, _From, _To, _Node, _Lang) ->
Acc.
-spec(disco_local_features/5 ::
(
Acc :: [xmlel()],
_From :: jid(),
To :: jid(),
Node :: <<>> | mod_pubsub:nodeId(),
Lang :: binary())
-> [binary(),...]
).
-spec disco_local_features(Acc :: [xmlel()], _From :: jid(),
To :: jid(), Node :: <<>> | mod_pubsub:nodeId(),
Lang :: binary()) -> [binary(),...].
disco_local_features(Acc, _From, To, <<>>, _Lang) ->
Host = host(To#jid.lserver),
Feats = case Acc of
@ -528,15 +514,10 @@ disco_local_items(Acc, _From, _To, _Node, _Lang) -> Acc.
% when is_binary(Node) ->
% disco_sm_identity(Acc, From, To, iolist_to_binary(Node),
% Lang);
-spec(disco_sm_identity/5 ::
(
Acc :: empty | [xmlel()],
From :: jid(),
To :: jid(),
Node :: mod_pubsub:nodeId(),
Lang :: binary())
-> [xmlel()]
).
-spec disco_sm_identity(Acc :: empty | [xmlel()], From :: jid(),
To :: jid(), Node :: mod_pubsub:nodeId(),
Lang :: binary()) -> [xmlel()].
disco_sm_identity(empty, From, To, Node, Lang) ->
disco_sm_identity([], From, To, Node, Lang);
disco_sm_identity(Acc, From, To, Node, _Lang) ->
@ -571,15 +552,9 @@ disco_identity(Host, Node, From) ->
_ -> []
end.
-spec(disco_sm_features/5 ::
(
Acc :: empty | {result, Features::[Feature::binary()]},
From :: jid(),
To :: jid(),
Node :: mod_pubsub:nodeId(),
Lang :: binary())
-> {result, Features::[Feature::binary()]}
).
-spec disco_sm_features(Acc :: empty | {result, Features::[Feature::binary()]},
From :: jid(), To :: jid(), Node :: mod_pubsub:nodeId(),
Lang :: binary()) -> {result, Features::[Feature::binary()]}.
%disco_sm_features(Acc, From, To, Node, Lang)
% when is_binary(Node) ->
% disco_sm_features(Acc, From, To, iolist_to_binary(Node),
@ -607,15 +582,9 @@ disco_features(Host, Node, From) ->
_ -> []
end.
-spec(disco_sm_items/5 ::
(
Acc :: empty | {result, [xmlel()]},
From :: jid(),
To :: jid(),
Node :: mod_pubsub:nodeId(),
Lang :: binary())
-> {result, [xmlel()]}
).
-spec disco_sm_items(Acc :: empty | {result, [xmlel()]}, From :: jid(),
To :: jid(), Node :: mod_pubsub:nodeId(),
Lang :: binary()) -> {result, [xmlel()]}.
%disco_sm_items(Acc, From, To, Node, Lang)
% when is_binary(Node) ->
% disco_sm_items(Acc, From, To, iolist_to_binary(Node),
@ -627,13 +596,8 @@ disco_sm_items({result, OtherItems}, From, To, Node, _Lang) ->
disco_items(jid:tolower(jid:remove_resource(To)), Node, From))};
disco_sm_items(Acc, _From, _To, _Node, _Lang) -> Acc.
-spec(disco_items/3 ::
(
Host :: mod_pubsub:host(),
Node :: mod_pubsub:nodeId(),
From :: jid())
-> [xmlel()]
).
-spec disco_items(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(),
From :: jid()) -> [xmlel()].
disco_items(Host, <<>>, From) ->
Action = fun (#pubsub_node{nodeid = {_, Node},
options = Options, type = Type, id = Nidx, owners = O},
@ -847,12 +811,8 @@ handle_call(stop, _From, State) ->
%% @private
handle_cast(_Msg, State) -> {noreply, State}.
-spec(handle_info/2 ::
(
_ :: {route, From::jid(), To::jid(), Packet::xmlel()},
State :: state())
-> {noreply, state()}
).
-spec handle_info(_ :: {route, From::jid(), To::jid(), Packet::xmlel()},
State :: state()) -> {noreply, state()}.
%%--------------------------------------------------------------------
%% Function: handle_info(Info, State) -> {noreply, State} |
@ -935,17 +895,9 @@ terminate(_Reason,
%% @private
code_change(_OldVsn, State, _Extra) -> {ok, State}.
-spec(do_route/7 ::
(
ServerHost :: binary(),
Access :: atom(),
Plugins :: [binary(),...],
Host :: mod_pubsub:hostPubsub(),
From :: jid(),
To :: jid(),
Packet :: xmlel())
-> ok
).
-spec do_route(ServerHost :: binary(), Access :: atom(),
Plugins :: [binary(),...], Host :: mod_pubsub:hostPubsub(),
From :: jid(), To :: jid(), Packet :: xmlel()) -> ok.
%%--------------------------------------------------------------------
%%% Internal functions
@ -1132,14 +1084,8 @@ iq_disco_info(Host, SNode, From, Lang) ->
node_disco_info(Host, Node, From)
end.
-spec(iq_disco_items/4 ::
(
Host :: mod_pubsub:host(),
Node :: <<>> | mod_pubsub:nodeId(),
From :: jid(),
Rsm :: none | rsm_in())
-> {result, [xmlel()]}
).
-spec iq_disco_items(Host :: mod_pubsub:host(), Node :: <<>> | mod_pubsub:nodeId(),
From :: jid(), Rsm :: none | rsm_in()) -> {result, [xmlel()]}.
iq_disco_items(Host, <<>>, From, _RSM) ->
{result,
lists:map(fun (#pubsub_node{nodeid = {_, SubNode}, options = Options}) ->
@ -1202,13 +1148,7 @@ iq_disco_items(Host, Item, From, RSM) ->
end
end.
-spec(iq_sm/3 ::
(
From :: jid(),
To :: jid(),
IQ :: iq_request())
-> iq_result() | iq_error()
).
-spec iq_sm(From :: jid(), To :: jid(), IQ :: iq_request()) -> iq_result() | iq_error().
iq_sm(From, To, #iq{type = Type, sub_el = SubEl, xmlns = XMLNS, lang = Lang} = IQ) ->
ServerHost = To#jid.lserver,
LOwner = jid:tolower(jid:remove_resource(To)),
@ -1233,36 +1173,17 @@ iq_get_vcard(Lang) ->
<<(translate:translate(Lang, <<"ejabberd Publish-Subscribe module">>))/binary,
"\nCopyright (c) 2004-2016 ProcessOne">>}]}].
-spec(iq_pubsub/6 ::
(
Host :: mod_pubsub:host(),
ServerHost :: binary(),
From :: jid(),
IQType :: 'get' | 'set',
SubEl :: xmlel(),
Lang :: binary())
-> {result, [xmlel()]}
%%%
| {error, xmlel()}
).
-spec iq_pubsub(Host :: mod_pubsub:host(), ServerHost :: binary(), From :: jid(),
IQType :: 'get' | 'set', SubEl :: xmlel(), Lang :: binary()) ->
{result, [xmlel()]} | {error, xmlel()}.
iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang) ->
iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, all, plugins(Host)).
-spec(iq_pubsub/8 ::
(
Host :: mod_pubsub:host(),
ServerHost :: binary(),
From :: jid(),
IQType :: 'get' | 'set',
SubEl :: xmlel(),
Lang :: binary(),
Access :: atom(),
Plugins :: [binary(),...])
-> {result, [xmlel()]}
%%%
| {error, xmlel()}
).
-spec iq_pubsub(Host :: mod_pubsub:host(), ServerHost :: binary(), From :: jid(),
IQType :: 'get' | 'set', SubEl :: xmlel(), Lang :: binary(),
Access :: atom(), Plugins :: [binary(),...]) ->
{result, [xmlel()]} | {error, xmlel()}.
iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) ->
#xmlel{children = SubEls} = SubEl,
@ -1368,18 +1289,10 @@ iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) ->
end.
-spec(iq_pubsub_owner/6 ::
(
Host :: mod_pubsub:host(),
ServerHost :: binary(),
From :: jid(),
IQType :: 'get' | 'set',
SubEl :: xmlel(),
Lang :: binary())
-> {result, [xmlel()]}
%%%
| {error, xmlel()}
).
-spec iq_pubsub_owner(Host :: mod_pubsub:host(), ServerHost :: binary(), From :: jid(),
IQType :: 'get' | 'set', SubEl :: xmlel(), Lang :: binary()) ->
{result, [xmlel()]} | {error, xmlel()}.
iq_pubsub_owner(Host, ServerHost, From, IQType, SubEl, Lang) ->
#xmlel{children = SubEls} = SubEl,
Action = fxml:remove_cdata(SubEls),
@ -1654,10 +1567,10 @@ send_authorization_approval(Host, JID, SNode, Subscription) ->
%{S, SID} ->
% [{<<"subscription">>, subscription_to_string(S)},
% {<<"subid">>, SID}];
S ->
S ->
[{<<"subscription">>, subscription_to_string(S)}]
end,
Stanza = event_stanza(<<"subscription">>,
Stanza = event_stanza(<<"subscription">>,
[{<<"jid">>, jid:to_string(JID)}
| nodeAttr(SNode)]
++ SubAttrs),
@ -1802,33 +1715,17 @@ update_auth(Host, Node, Type, Nidx, Subscriber, Allow, Subs) ->
%%<li>nodetree create_node checks if nodeid already exists</li>
%%<li>node plugin create_node just sets default affiliation/subscription</li>
%%</ul>
-spec(create_node/5 ::
(
Host :: mod_pubsub:host(),
ServerHost :: binary(),
Node :: <<>> | mod_pubsub:nodeId(),
Owner :: jid(),
Type :: binary())
-> {result, [xmlel(),...]}
%%%
| {error, xmlel()}
).
-spec create_node(Host :: mod_pubsub:host(), ServerHost :: binary(),
Node :: <<>> | mod_pubsub:nodeId(), Owner :: jid(),
Type :: binary()) -> {result, [xmlel(),...]} | {error, xmlel()}.
create_node(Host, ServerHost, Node, Owner, Type) ->
create_node(Host, ServerHost, Node, Owner, Type, all, []).
-spec(create_node/7 ::
(
Host :: mod_pubsub:host(),
ServerHost :: binary(),
Node :: <<>> | mod_pubsub:nodeId(),
Owner :: jid(),
Type :: binary(),
Access :: atom(),
Configuration :: [xmlel()])
-> {result, [xmlel(),...]}
%%%
| {error, xmlel()}
).
-spec create_node(Host :: mod_pubsub:host(), ServerHost :: binary(),
Node :: <<>> | mod_pubsub:nodeId(), Owner :: jid(),
Type :: binary(), Access :: atom(), Configuration :: [xmlel()]) ->
{result, [xmlel(),...]} | {error, xmlel()}.
create_node(Host, ServerHost, <<>>, Owner, Type, Access, Configuration) ->
case lists:member(<<"instant-nodes">>, plugin_features(Host, Type)) of
true ->
@ -1942,15 +1839,8 @@ create_node(Host, ServerHost, Node, Owner, GivenType, Access, Configuration) ->
%%<li>The node is the root collection node, which cannot be deleted.</li>
%%<li>The specified node does not exist.</li>
%%</ul>
-spec(delete_node/3 ::
(
Host :: mod_pubsub:host(),
Node :: mod_pubsub:nodeId(),
Owner :: jid())
-> {result, [xmlel(),...]}
%%%
| {error, xmlel()}
).
-spec delete_node(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(),
Owner :: jid()) -> {result, [xmlel(),...]} | {error, xmlel()}.
delete_node(_Host, <<>>, _Owner) ->
{error, ?ERRT_NOT_ALLOWED(?MYLANG, <<"No node specified">>)};
delete_node(Host, Node, Owner) ->
@ -2026,17 +1916,9 @@ delete_node(Host, Node, Owner) ->
%%<li>The node does not support subscriptions.</li>
%%<li>The node does not exist.</li>
%%</ul>
-spec(subscribe_node/5 ::
(
Host :: mod_pubsub:host(),
Node :: mod_pubsub:nodeId(),
From :: jid(),
JID :: binary(),
Configuration :: [xmlel()])
-> {result, [xmlel(),...]}
%%%
| {error, xmlel()}
).
-spec subscribe_node(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(),
From :: jid(), JID :: binary(), Configuration :: [xmlel()]) ->
{result, [xmlel(),...]} | {error, xmlel()}.
subscribe_node(Host, Node, From, JID, Configuration) ->
SubModule = subscription_plugin(Host),
SubOpts = case SubModule:parse_options_xform(Configuration) of
@ -2145,17 +2027,11 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
%%<li>The node does not exist.</li>
%%<li>The request specifies a subscription ID that is not valid or current.</li>
%%</ul>
-spec(unsubscribe_node/5 ::
(
Host :: mod_pubsub:host(),
Node :: mod_pubsub:nodeId(),
From :: jid(),
JID :: binary() | ljid(),
SubId :: mod_pubsub:subId())
-> {result, []}
%%%
| {error, xmlel()}
).
-spec unsubscribe_node(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(),
From :: jid(), JID :: binary() | ljid(),
SubId :: mod_pubsub:subId()) ->
{result, []} | {error, xmlel()}.
unsubscribe_node(Host, Node, From, JID, SubId) when is_binary(JID) ->
unsubscribe_node(Host, Node, From, string_to_ljid(JID), SubId);
unsubscribe_node(Host, Node, From, Subscriber, SubId) ->
@ -2183,18 +2059,12 @@ unsubscribe_node(Host, Node, From, Subscriber, SubId) ->
%%<li>The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.</li>
%%<li>The request does not match the node configuration.</li>
%%</ul>
-spec(publish_item/6 ::
(
Host :: mod_pubsub:host(),
ServerHost :: binary(),
Node :: mod_pubsub:nodeId(),
Publisher :: jid(),
ItemId :: <<>> | mod_pubsub:itemId(),
Payload :: mod_pubsub:payload())
-> {result, [xmlel(),...]}
%%%
| {error, xmlel()}
).
-spec publish_item(Host :: mod_pubsub:host(), ServerHost :: binary(),
Node :: mod_pubsub:nodeId(), Publisher :: jid(),
ItemId :: <<>> | mod_pubsub:itemId(),
Payload :: mod_pubsub:payload()) ->
{result, [xmlel(),...]} | {error, xmlel()}.
publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload) ->
publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload, [], all).
publish_item(Host, ServerHost, Node, Publisher, <<>>, Payload, PubOpts, Access) ->
@ -2319,16 +2189,10 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload, PubOpts, Access
%%<li>The node does not support persistent items.</li>
%%<li>The service does not support the deletion of items.</li>
%%</ul>
-spec(delete_item/4 ::
(
Host :: mod_pubsub:host(),
Node :: mod_pubsub:nodeId(),
Publisher :: jid(),
ItemId :: mod_pubsub:itemId())
-> {result, []}
%%%
| {error, xmlel()}
).
-spec delete_item(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(),
Publisher :: jid(), ItemId :: mod_pubsub:itemId()) ->
{result, []} | {error, xmlel()}.
delete_item(Host, Node, Publisher, ItemId) ->
delete_item(Host, Node, Publisher, ItemId, false).
delete_item(_, <<>>, _, _, _) ->
@ -2383,15 +2247,10 @@ delete_item(Host, Node, Publisher, ItemId, ForceNotify) ->
%%<li>The node is not configured to persist items.</li>
%%<li>The specified node does not exist.</li>
%%</ul>
-spec(purge_node/3 ::
(
Host :: mod_pubsub:host(),
Node :: mod_pubsub:nodeId(),
Owner :: jid())
-> {result, []}
%%%
| {error, xmlel()}
).
-spec purge_node(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(),
Owner :: jid()) ->
{result, []} | {error, xmlel()}.
purge_node(Host, Node, Owner) ->
Action = fun (#pubsub_node{options = Options, type = Type, id = Nidx}) ->
Features = plugin_features(Host, Type),
@ -2435,19 +2294,12 @@ purge_node(Host, Node, Owner) ->
%% <p>The permission are not checked in this function.</p>
%% @todo We probably need to check that the user doing the query has the right
%% to read the items.
-spec(get_items/7 ::
(
Host :: mod_pubsub:host(),
Node :: mod_pubsub:nodeId(),
From :: jid(),
SubId :: mod_pubsub:subId(),
SMaxItems :: binary(),
ItemIds :: [mod_pubsub:itemId()],
Rsm :: none | rsm_in())
-> {result, [xmlel(),...]}
%%%
| {error, xmlel()}
).
-spec get_items(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(),
From :: jid(), SubId :: mod_pubsub:subId(),
SMaxItems :: binary(), ItemIds :: [mod_pubsub:itemId()],
Rsm :: none | rsm_in()) ->
{result, [xmlel(),...]} | {error, xmlel()}.
get_items(Host, Node, From, SubId, SMaxItems, ItemIds, RSM) ->
MaxItems = if SMaxItems == <<>> ->
case get_max_items_node(Host) of
@ -2511,7 +2363,7 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIds, RSM) ->
get_items(Host, Node) ->
Action = fun (#pubsub_node{type = Type, id = Nidx}) ->
node_call(Host, Type, get_items, [Nidx, service_jid(Host), none])
node_call(Host, Type, get_items, [Nidx, service_jid(Host), none])
end,
case transaction(Host, Node, Action, sync_dirty) of
{result, {_, {Items, _}}} -> Items;
@ -2610,16 +2462,10 @@ dispatch_items(From, To, _Node, Stanza) ->
ejabberd_router:route(service_jid(From), jid:make(To), Stanza).
%% @doc <p>Return the list of affiliations as an XMPP response.</p>
-spec(get_affiliations/4 ::
(
Host :: mod_pubsub:host(),
Node :: mod_pubsub:nodeId(),
JID :: jid(),
Plugins :: [binary()])
-> {result, [xmlel(),...]}
%%%
| {error, xmlel()}
).
-spec get_affiliations(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(),
JID :: jid(), Plugins :: [binary()]) ->
{result, [xmlel(),...]} | {error, xmlel()}.
get_affiliations(Host, Node, JID, Plugins) when is_list(Plugins) ->
Result = lists:foldl( fun (Type, {Status, Acc}) ->
Features = plugin_features(Host, Type),
@ -2663,15 +2509,10 @@ get_affiliations(Host, Node, JID, Plugins) when is_list(Plugins) ->
Error
end.
-spec(get_affiliations/3 ::
(
Host :: mod_pubsub:host(),
Node :: mod_pubsub:nodeId(),
JID :: jid())
-> {result, [xmlel(),...]}
%%%
| {error, xmlel()}
).
-spec get_affiliations(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(),
JID :: jid()) ->
{result, [xmlel(),...]} | {error, xmlel()}.
get_affiliations(Host, Node, JID) ->
Action = fun (#pubsub_node{type = Type, id = Nidx}) ->
Features = plugin_features(Host, Type),
@ -2708,16 +2549,10 @@ get_affiliations(Host, Node, JID) ->
Error
end.
-spec(set_affiliations/4 ::
(
Host :: mod_pubsub:host(),
Node :: mod_pubsub:nodeId(),
From :: jid(),
EntitiesEls :: [xmlel()])
-> {result, []}
%%%
| {error, xmlel()}
).
-spec set_affiliations(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(),
From :: jid(), EntitiesEls :: [xmlel()]) ->
{result, []} | {error, xmlel()}.
set_affiliations(Host, Node, From, EntitiesEls) ->
Owner = jid:tolower(jid:remove_resource(From)),
Entities = lists:foldl(fun
@ -3113,15 +2948,13 @@ set_subscriptions(Host, Node, From, EntitiesEls) ->
end
end.
-spec(get_presence_and_roster_permissions/5 ::
(
Host :: mod_pubsub:host(),
From :: ljid(),
Owners :: [ljid(),...],
AccessModel :: mod_pubsub:accessModel(),
AllowedGroups :: [binary()])
-> {PresenceSubscription::boolean(), RosterGroup::boolean()}
).
-spec get_presence_and_roster_permissions(Host :: mod_pubsub:host(),
From :: ljid(), Owners :: [ljid(),...],
AccessModel :: mod_pubsub:accessModel(),
AllowedGroups :: [binary()]) ->
{PresenceSubscription::boolean(),
RosterGroup::boolean()}.
get_presence_and_roster_permissions(Host, From, Owners, AccessModel, AllowedGroups) ->
if (AccessModel == presence) or (AccessModel == roster) ->
case Host of
@ -3179,11 +3012,7 @@ subscription_to_string(pending) -> <<"pending">>;
subscription_to_string(unconfigured) -> <<"unconfigured">>;
subscription_to_string(_) -> <<"none">>.
-spec(service_jid/1 ::
(
Host :: mod_pubsub:host())
-> jid()
).
-spec service_jid(Host :: mod_pubsub:host()) -> jid().
service_jid(#jid{} = Jid) -> Jid;
service_jid({U, S, R}) -> jid:make(U, S, R);
service_jid(Host) -> jid:make(<<>>, Host, <<>>).
@ -3217,12 +3046,7 @@ sub_option_can_deliver(_, _, {deliver, false}) -> false;
sub_option_can_deliver(_, _, {expire, When}) -> p1_time_compat:timestamp() < When;
sub_option_can_deliver(_, _, _) -> true.
-spec(presence_can_deliver/2 ::
(
Entity :: ljid(),
_ :: boolean())
-> boolean()
).
-spec presence_can_deliver(Entity :: ljid(), _ :: boolean()) -> boolean().
presence_can_deliver(_, false) ->
true;
presence_can_deliver({User, Server, Resource}, true) ->
@ -3243,12 +3067,10 @@ presence_can_deliver({User, Server, Resource}, true) ->
false, Ss)
end.
-spec(state_can_deliver/2 ::
(
Entity::ljid(),
SubOptions :: mod_pubsub:subOptions() | [])
-> [ljid()]
).
-spec state_can_deliver(Entity::ljid(),
SubOptions :: mod_pubsub:subOptions() | []) ->
[ljid()].
state_can_deliver({U, S, R}, []) -> [{U, S, R}];
state_can_deliver({U, S, R}, SubOptions) ->
case lists:keysearch(show_values, 1, SubOptions) of
@ -3268,13 +3090,10 @@ state_can_deliver({U, S, R}, SubOptions) ->
[], Resources)
end.
-spec(get_resource_state/3 ::
(
Entity :: ljid(),
ShowValues :: [binary()],
JIDs :: [ljid()])
-> [ljid()]
).
-spec get_resource_state(Entity :: ljid(), ShowValues :: [binary()],
JIDs :: [ljid()]) ->
[ljid()].
get_resource_state({U, S, R}, ShowValues, JIDs) ->
case ejabberd_sm:get_session_pid(U, S, R) of
none ->
@ -3293,11 +3112,8 @@ get_resource_state({U, S, R}, ShowValues, JIDs) ->
end
end.
-spec(payload_xmlelements/1 ::
(
Payload :: mod_pubsub:payload())
-> Count :: non_neg_integer()
).
-spec payload_xmlelements(Payload :: mod_pubsub:payload()) ->
Count :: non_neg_integer().
payload_xmlelements(Payload) ->
payload_xmlelements(Payload, 0).
@ -4040,12 +3856,9 @@ unset_cached_item(Host, Nidx) ->
_ -> ok
end.
-spec(get_cached_item/2 ::
(
Host :: mod_pubsub:host(),
Nidx :: mod_pubsub:nodeIdx())
-> undefined | mod_pubsub:pubsubItem()
).
-spec get_cached_item(Host :: mod_pubsub:host(), Nidx :: mod_pubsub:nodeIdx()) ->
undefined | mod_pubsub:pubsubItem().
get_cached_item({_, ServerHost, _}, Nidx) ->
get_cached_item(ServerHost, Nidx);
get_cached_item(Host, Nidx) ->
@ -4340,7 +4153,7 @@ string_to_ljid(JID) ->
end
end.
-spec(uniqid/0 :: () -> mod_pubsub:itemId()).
-spec uniqid() -> mod_pubsub:itemId().
uniqid() ->
{T1, T2, T3} = p1_time_compat:timestamp(),
iolist_to_binary(io_lib:fwrite("~.16B~.16B~.16B", [T1, T2, T3])).
@ -4355,12 +4168,7 @@ itemsEls(Items) ->
[#xmlel{name = <<"item">>, attrs = itemAttr(ItemId), children = Payload}
|| #pubsub_item{itemid = {ItemId, _}, payload = Payload} <- Items].
-spec(add_message_type/2 ::
(
Message :: xmlel(),
Type :: atom())
-> xmlel()
).
-spec add_message_type(Message :: xmlel(), Type :: atom()) -> xmlel().
add_message_type(Message, normal) -> Message;
add_message_type(#xmlel{name = <<"message">>, attrs = Attrs, children = Els}, Type) ->

View File

@ -402,17 +402,13 @@ get_entity_subscriptions(Host, Owner) ->
end,
{result, Reply}.
-spec(get_entity_subscriptions_for_send_last/2 ::
(
Host :: mod_pubsub:hostPubsub(),
Owner :: jid())
-> {result,
[{mod_pubsub:pubsubNode(),
mod_pubsub:subscription(),
mod_pubsub:subId(),
ljid()}]
}
).
-spec get_entity_subscriptions_for_send_last(Host :: mod_pubsub:hostPubsub(),
Owner :: jid()) ->
{result, [{mod_pubsub:pubsubNode(),
mod_pubsub:subscription(),
mod_pubsub:subId(),
ljid()}]}.
get_entity_subscriptions_for_send_last(Host, Owner) ->
SubKey = jid:tolower(Owner),
GenKey = jid:remove_resource(SubKey),
@ -611,11 +607,9 @@ get_state(Nidx, JID) ->
{SJID, _} = State#pubsub_state.stateid,
State#pubsub_state{items = itemids(Nidx, SJID)}.
-spec(get_state_without_itemids/2 ::
(Nidx :: mod_pubsub:nodeIdx(),
Key :: ljid()) ->
mod_pubsub:pubsubState()
).
-spec get_state_without_itemids(Nidx :: mod_pubsub:nodeIdx(), Key :: ljid()) ->
mod_pubsub:pubsubState().
get_state_without_itemids(Nidx, JID) ->
J = encode_jid(JID),
case catch
@ -973,17 +967,11 @@ update_subscription(Nidx, JID, Subscription) ->
"-affiliation='n'"
]).
-spec(decode_jid/1 ::
( SJID :: binary())
-> ljid()
).
-spec decode_jid(SJID :: binary()) -> ljid().
decode_jid(SJID) ->
jid:tolower(jid:from_string(SJID)).
-spec(decode_affiliation/1 ::
( Arg :: binary())
-> atom()
).
-spec decode_affiliation(Arg :: binary()) -> atom().
decode_affiliation(<<"o">>) -> owner;
decode_affiliation(<<"p">>) -> publisher;
decode_affiliation(<<"u">>) -> publish_only;
@ -991,19 +979,13 @@ decode_affiliation(<<"m">>) -> member;
decode_affiliation(<<"c">>) -> outcast;
decode_affiliation(_) -> none.
-spec(decode_subscription/1 ::
( Arg :: binary())
-> atom()
).
-spec decode_subscription(Arg :: binary()) -> atom().
decode_subscription(<<"s">>) -> subscribed;
decode_subscription(<<"p">>) -> pending;
decode_subscription(<<"u">>) -> unconfigured;
decode_subscription(_) -> none.
-spec(decode_subscriptions/1 ::
( Subscriptions :: binary())
-> [] | [{atom(), binary()},...]
).
-spec decode_subscriptions(Subscriptions :: binary()) -> [] | [{atom(), binary()},...].
decode_subscriptions(Subscriptions) ->
lists:foldl(fun (Subscription, Acc) ->
case str:tokens(Subscription, <<":">>) of
@ -1013,36 +995,24 @@ decode_subscriptions(Subscriptions) ->
end,
[], str:tokens(Subscriptions, <<",">>)).
-spec(encode_jid/1 ::
( JID :: ljid())
-> binary()
).
-spec encode_jid(JID :: ljid()) -> binary().
encode_jid(JID) ->
jid:to_string(JID).
-spec(encode_jid_like/1 :: (JID :: ljid()) -> binary()).
-spec encode_jid_like(JID :: ljid()) -> binary().
encode_jid_like(JID) ->
ejabberd_sql:escape_like_arg_circumflex(jid:to_string(JID)).
-spec(encode_host/1 ::
( Host :: host())
-> binary()
).
-spec encode_host(Host :: host()) -> binary().
encode_host({_U, _S, _R} = LJID) -> encode_jid(LJID);
encode_host(Host) -> Host.
-spec(encode_host_like/1 ::
( Host :: host())
-> binary()
).
-spec encode_host_like(Host :: host()) -> binary().
encode_host_like({_U, _S, _R} = LJID) -> ejabberd_sql:escape(encode_jid_like(LJID));
encode_host_like(Host) ->
ejabberd_sql:escape(ejabberd_sql:escape_like_arg_circumflex(Host)).
-spec(encode_affiliation/1 ::
( Arg :: atom())
-> binary()
).
-spec encode_affiliation(Arg :: atom()) -> binary().
encode_affiliation(owner) -> <<"o">>;
encode_affiliation(publisher) -> <<"p">>;
encode_affiliation(publish_only) -> <<"u">>;
@ -1050,19 +1020,13 @@ encode_affiliation(member) -> <<"m">>;
encode_affiliation(outcast) -> <<"c">>;
encode_affiliation(_) -> <<"n">>.
-spec(encode_subscription/1 ::
( Arg :: atom())
-> binary()
).
-spec encode_subscription(Arg :: atom()) -> binary().
encode_subscription(subscribed) -> <<"s">>;
encode_subscription(pending) -> <<"p">>;
encode_subscription(unconfigured) -> <<"u">>;
encode_subscription(_) -> <<"n">>.
-spec(encode_subscriptions/1 ::
( Subscriptions :: [] | [{atom(), binary()},...])
-> binary()
).
-spec encode_subscriptions(Subscriptions :: [] | [{atom(), binary()},...]) -> binary().
encode_subscriptions(Subscriptions) ->
str:join([<<(encode_subscription(S))/binary, ":", SubId/binary>>
|| {S, SubId} <- Subscriptions], <<",">>).

View File

@ -167,12 +167,8 @@ oid(Key, Name) -> {Key, Name}.
%% Key = jlib:jid() | host()
%% Node = string()
-spec(find_node/2 ::
(
Key :: mod_pubsub:hostPubsub(),
Node :: mod_pubsub:nodeId())
-> mod_pubsub:pubsubNode() | false
).
-spec find_node(Key :: mod_pubsub:hostPubsub(), Node :: mod_pubsub:nodeId()) ->
mod_pubsub:pubsubNode() | false.
find_node(Key, Node) ->
case mnesia:read(pubsub_node, oid(Key, Node), read) of
[] -> false;
@ -188,14 +184,11 @@ find_opt(Key, Default, Options) ->
_ -> Default
end.
-spec(traversal_helper/4 ::
(
Pred :: fun(),
Tr :: fun(),
Host :: mod_pubsub:hostPubsub(),
Nodes :: [mod_pubsub:nodeId(),...])
-> [{Depth::non_neg_integer(), Nodes::[mod_pubsub:pubsubNode(),...]}]
).
-spec traversal_helper(Pred :: fun(), Tr :: fun(), Host :: mod_pubsub:hostPubsub(),
Nodes :: [mod_pubsub:nodeId(),...]) ->
[{Depth::non_neg_integer(),
Nodes::[mod_pubsub:pubsubNode(),...]}].
traversal_helper(Pred, Tr, Host, Nodes) ->
traversal_helper(Pred, Tr, 0, Host, Nodes, []).
@ -220,15 +213,10 @@ remove_config_parent(Node, [{collection, Parents} | T], Acc) ->
remove_config_parent(Node, [H | T], Acc) ->
remove_config_parent(Node, T, [H | Acc]).
-spec(validate_parentage/3 ::
(
Key :: mod_pubsub:hostPubsub(),
Owners :: [ljid(),...],
Parent_Nodes :: [mod_pubsub:nodeId()])
-> true
%%%
| {error, xmlel()}
).
-spec validate_parentage(Key :: mod_pubsub:hostPubsub(), Owners :: [ljid(),...],
Parent_Nodes :: [mod_pubsub:nodeId()]) ->
true | {error, xmlel()}.
validate_parentage(_Key, _Owners, []) ->
true;
validate_parentage(Key, Owners, [[] | T]) ->

View File

@ -152,13 +152,9 @@ create_table() ->
Other -> Other
end.
-spec(add_subscription/3 ::
(
_JID :: ljid(),
_NodeId :: mod_pubsub:nodeIdx(),
Options :: [] | mod_pubsub:subOptions())
-> SubId :: mod_pubsub:subId()
).
-spec add_subscription(_JID :: ljid(), _NodeId :: mod_pubsub:nodeIdx(),
Options :: [] | mod_pubsub:subOptions()) ->
SubId :: mod_pubsub:subId().
add_subscription(_JID, _NodeId, []) -> make_subid();
add_subscription(_JID, _NodeId, Options) ->
@ -166,25 +162,13 @@ add_subscription(_JID, _NodeId, Options) ->
mnesia:write(#pubsub_subscription{subid = SubID, options = Options}),
SubID.
-spec(delete_subscription/3 ::
(
_JID :: _,
_NodeId :: _,
SubId :: mod_pubsub:subId())
-> ok
).
-spec delete_subscription(_JID :: _, _NodeId :: _, SubId :: mod_pubsub:subId()) -> ok.
delete_subscription(_JID, _NodeId, SubID) ->
mnesia:delete({pubsub_subscription, SubID}).
-spec(read_subscription/3 ::
(
_JID :: ljid(),
_NodeId :: _,
SubID :: mod_pubsub:subId())
-> mod_pubsub:pubsubSubscription()
| {error, notfound}
).
-spec read_subscription(_JID :: ljid(), _NodeId :: _, SubID :: mod_pubsub:subId()) ->
mod_pubsub:pubsubSubscription() | {error, notfound}.
read_subscription(_JID, _NodeId, SubID) ->
case mnesia:read({pubsub_subscription, SubID}) of
@ -192,19 +176,13 @@ read_subscription(_JID, _NodeId, SubID) ->
_ -> {error, notfound}
end.
-spec(write_subscription/4 ::
(
_JID :: ljid(),
_NodeId :: _,
SubID :: mod_pubsub:subId(),
Options :: mod_pubsub:subOptions())
-> ok
).
-spec write_subscription(_JID :: ljid(), _NodeId :: _, SubID :: mod_pubsub:subId(),
Options :: mod_pubsub:subOptions()) -> ok.
write_subscription(_JID, _NodeId, SubID, Options) ->
mnesia:write(#pubsub_subscription{subid = SubID, options = Options}).
-spec(make_subid/0 :: () -> SubId::mod_pubsub:subId()).
-spec make_subid() -> SubId::mod_pubsub:subId().
make_subid() ->
{T1, T2, T3} = p1_time_compat:timestamp(),
iolist_to_binary(io_lib:fwrite("~.16B~.16B~.16B", [T1, T2, T3])).
@ -272,13 +250,8 @@ xopt_to_bool(Option, _) ->
ErrTxt = iolist_to_binary(io_lib:format(Txt, [Option])),
{error, ?ERRT_NOT_ACCEPTABLE(?MYLANG, ErrTxt)}.
-spec(get_option_xfield/3 ::
(
Lang :: binary(),
Key :: atom(),
Options :: mod_pubsub:subOptions())
-> xmlel()
).
-spec get_option_xfield(Lang :: binary(), Key :: atom(),
Options :: mod_pubsub:subOptions()) -> xmlel().
%% Return a field for an XForm for Key, with data filled in, if
%% applicable, from Options.

View File

@ -73,54 +73,34 @@
init() -> ok = create_table().
-spec(subscribe_node/3 ::
(
_JID :: _,
_NodeId :: _,
Options :: [] | mod_pubsub:subOptions())
-> {result, mod_pubsub:subId()}
).
-spec subscribe_node(_JID :: _, _NodeId :: _, Options :: [] | mod_pubsub:subOptions()) ->
{result, mod_pubsub:subId()}.
subscribe_node(_JID, _NodeId, Options) ->
SubID = make_subid(),
(?DB_MOD):add_subscription(#pubsub_subscription{subid = SubID, options = Options}),
{result, SubID}.
-spec(unsubscribe_node/3 ::
(
_JID :: _,
_NodeId :: _,
SubID :: mod_pubsub:subId())
-> {result, mod_pubsub:subscription()}
| {error, notfound}
).
-spec unsubscribe_node(_JID :: _, _NodeId :: _, SubID :: mod_pubsub:subId()) ->
{result, mod_pubsub:subscription()} | {error, notfound}.
unsubscribe_node(_JID, _NodeId, SubID) ->
case (?DB_MOD):read_subscription(SubID) of
{ok, Sub} -> (?DB_MOD):delete_subscription(SubID), {result, Sub};
notfound -> {error, notfound}
end.
-spec(get_subscription/3 ::
(
_JID :: _,
_NodeId :: _,
SubId :: mod_pubsub:subId())
-> {result, mod_pubsub:subscription()}
| {error, notfound}
).
-spec get_subscription(_JID :: _, _NodeId :: _, SubId :: mod_pubsub:subId()) ->
{result, mod_pubsub:subscription()} | {error, notfound}.
get_subscription(_JID, _NodeId, SubID) ->
case (?DB_MOD):read_subscription(SubID) of
{ok, Sub} -> {result, Sub};
notfound -> {error, notfound}
end.
-spec(set_subscription/4 ::
(
_JID :: _,
_NodeId :: _,
SubId :: mod_pubsub:subId(),
Options :: mod_pubsub:subOptions())
-> {result, ok}
).
-spec set_subscription(_JID :: _, _NodeId :: _, SubId :: mod_pubsub:subId(),
Options :: mod_pubsub:subOptions()) -> {result, ok}.
set_subscription(_JID, _NodeId, SubID, Options) ->
case (?DB_MOD):read_subscription(SubID) of
{ok, _} ->
@ -167,7 +147,7 @@ parse_options_xform(XFields) ->
%%====================================================================
create_table() -> ok.
-spec(make_subid/0 :: () -> mod_pubsub:subId()).
-spec make_subid() -> mod_pubsub:subId().
make_subid() ->
{T1, T2, T3} = p1_time_compat:timestamp(),
iolist_to_binary(io_lib:fwrite("~.16B~.16B~.16B", [T1, T2, T3])).