25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-11-26 16:26:24 +01:00

improve delete_subscriptions code

SVN Revision: 2903
This commit is contained in:
Christophe Romain 2010-01-14 12:56:40 +00:00
parent 0c9e0168d5
commit 13220d44f4

View File

@ -390,35 +390,34 @@ unsubscribe_node(NodeId, Sender, Subscriber, SubId) ->
end, SubState#pubsub_state.subscriptions),
case Sub of
{value, S} ->
delete_subscription(SubKey, NodeId, S, SubState),
delete_subscriptions(SubKey, NodeId, [S], SubState),
{result, default};
false ->
{error, ?ERR_EXTENDED('unexpected-request',
"not-subscribed")}
{error, ?ERR_EXTENDED('unexpected-request', "not-subscribed")}
end;
%% Asking to remove all subscriptions to the given node
SubId == all ->
[delete_subscription(SubKey, NodeId, S, SubState) || S <- Subscriptions],
delete_subscriptions(SubKey, NodeId, Subscriptions, SubState),
{result, default};
%% No subid supplied, but there's only one matching
%% subscription, so use that.
length(Subscriptions) == 1 ->
delete_subscription(SubKey, NodeId, hd(Subscriptions), SubState),
delete_subscriptions(SubKey, NodeId, Subscriptions, SubState),
{result, default};
true ->
{error, ?ERR_EXTENDED('bad-request', "subid-required")}
end.
delete_subscription(SubKey, NodeID, {Subscription, SubId}, SubState) ->
Affiliation = SubState#pubsub_state.affiliation,
AllSubs = SubState#pubsub_state.subscriptions,
NewSubs = AllSubs -- [{Subscription, SubId}],
pubsub_subscription:unsubscribe_node(SubKey, NodeID, SubId),
case {Affiliation, NewSubs} of
delete_subscriptions(SubKey, NodeId, Subscriptions, SubState) ->
NewSubs = lists:foldl(fun({Subscription, SubId}, Acc) ->
pubsub_subscription:delete_subscription(SubKey, NodeId, SubId),
Acc -- [{Subscription, SubId}]
end, SubState#pubsub_state.subscriptions, Subscriptions),
case {SubState#pubsub_state.affiliation, NewSubs} of
{none, []} ->
% Just a regular subscriber, and this is final item, so
% delete the state.
del_state(NodeID, SubKey);
del_state(NodeId, SubKey);
_ ->
set_state(SubState#pubsub_state{subscriptions = NewSubs})
end.