Improve static_modules support in hooks (EJAB-1478)

Also removed code that calls a hook for both Host and for global.
This commit is contained in:
Badlop 2011-07-07 23:03:01 +02:00
parent b8d74ab2a9
commit 466481d126
1 changed files with 40 additions and 42 deletions

View File

@ -119,27 +119,14 @@ delete_dist(Hook, Host, Node, Module, Function, Seq) ->
%% @doc Run the calls of this hook in order, don't care about function results.
%% If a call returns stop, no more calls are performed.
run(Hook, Args) ->
runx(Hook, global, Args).
run(Hook, global, Args).
run(Hook, Host, Args) when is_binary(Host) ->
case runx(Hook, Host, Args) of
stop -> stop;
_ -> runx(Hook, global, Args)
end;
run(Hook, Host, Args) when Host == global ->
runx(Hook, Host, Args).
runx(Hook, Host, Args) when is_binary(Host) orelse is_atom(Host) ->
case ets:lookup(hooks, {Hook, ejabberd:normalize_host(Host)}) of
[{_, Ls}] ->
run1(Ls, Hook, Args);
[] ->
case ets:lookup(hooks, {Hook, global}) of
[{_, Ls}] ->
run1(Ls, Hook, Args);
[] ->
ok
end
run(Hook, Host, Args) ->
case get_registered_hooks_for(Hook, Host) of
[] ->
ok;
Ls ->
run1(Ls, Hook, Args)
end.
%% @spec (Hook::atom(), Val, Args) -> Val | stopped | NewVal
@ -149,29 +136,16 @@ runx(Hook, Host, Args) when is_binary(Host) orelse is_atom(Host) ->
%% If a call returns 'stop', no more calls are performed and 'stopped' is returned.
%% If a call returns {stopped, NewVal}, no more calls are performed and NewVal is returned.
run_fold(Hook, Val, Args) ->
run_foldx(Hook, global, Val, Args).
run_fold(Hook, global, Val, Args).
%% @spec (Hook::atom(), Host, Val, Args) -> Val | stopped | NewVal
%% Host = global | binary()
run_fold(Hook, Host, Val, Args) when is_binary(Host) ->
case run_foldx(Hook, Host, Val, Args) of
stopped -> stopped;
Val2 -> run_foldx(Hook, global, Val2, Args)
end;
run_fold(Hook, Host, Val, Args) when Host == global ->
run_foldx(Hook, Host, Val, Args).
run_foldx(Hook, Host, Val, Args) ->
case ets:lookup(hooks, {Hook, ejabberd:normalize_host(Host)}) of
[{_, Ls}] ->
run_fold1(Ls, Hook, Val, Args);
[] ->
case ets:lookup(hooks, {Hook, global}) of
[{_, Ls}] ->
run_fold1(Ls, Hook, Val, Args);
[] ->
Val
end
run_fold(Hook, Host, Val, Args) ->
case get_registered_hooks_for(Hook, Host) of
[] ->
Val;
Ls ->
run_fold1(Ls, Hook, Val, Args)
end.
%%%----------------------------------------------------------------------
@ -240,7 +214,10 @@ handle_call({delete, Hook, Host, Module, Function, Seq}, _From, State) ->
Reply = case ets:lookup(hooks, {Hook, NHost}) of
[{_, Ls}] ->
NewLs = lists:delete({Seq, Module, Function}, Ls),
ets:insert(hooks, {{Hook, NHost}, NewLs}),
case NewLs of
[] -> ets:delete(hooks, {Hook, NHost});
_ -> ets:insert(hooks, {{Hook, NHost}, NewLs})
end,
ok;
[] ->
ok
@ -250,7 +227,10 @@ handle_call({delete, Hook, Host, Node, Module, Function, Seq}, _From, State) ->
Reply = case ets:lookup(hooks, {Hook, Host}) of
[{_, Ls}] ->
NewLs = lists:delete({Seq, Node, Module, Function}, Ls),
ets:insert(hooks, {{Hook, Host}, NewLs}),
case NewLs of
[] -> ets:delete(hooks, {Hook, Host});
_ -> ets:insert(hooks, {{Hook, Host}, NewLs})
end,
ok;
[] ->
ok
@ -374,3 +354,21 @@ run_fold1([{_Seq, Module, Function} | Ls], Hook, Val, Args) ->
NewVal ->
run_fold1(Ls, Hook, NewVal, Args)
end.
get_registered_hooks_for(Hook, global) ->
case ets:lookup(hooks, {Hook, global}) of
[{_, Ls}] ->
Ls;
[] ->
[]
end;
get_registered_hooks_for(Hook, Host) ->
GlobalHooks = get_registered_hooks_for(Hook, global),
HostHooks = case ets:lookup(hooks, {Hook, ejabberd:normalize_host(Host)}) of
[{_, Ls}] ->
Ls;
[] ->
[]
end,
lists:umerge(GlobalHooks, HostHooks).