aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_local.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_local.erl')
-rw-r--r--src/ejabberd_local.erl24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl
index cf46e73fc..5c91e280a 100644
--- a/src/ejabberd_local.erl
+++ b/src/ejabberd_local.erl
@@ -14,7 +14,8 @@
-export([register_iq_handler/3,
register_iq_handler/4,
- unregister_iq_handler/1
+ unregister_iq_handler/1,
+ refresh_iq_handlers/0
]).
-include("ejabberd.hrl").
@@ -47,11 +48,11 @@ loop(State) ->
loop(State);
{register_iq_handler, XMLNS, Module, Function} ->
ets:insert(State#state.iqtable, {XMLNS, Module, Function}),
- mod_disco:register_feature(XMLNS),
+ catch mod_disco:register_feature(XMLNS),
loop(State);
{register_iq_handler, XMLNS, Module, Function, Opts} ->
ets:insert(State#state.iqtable, {XMLNS, Module, Function, Opts}),
- mod_disco:register_feature(XMLNS),
+ catch mod_disco:register_feature(XMLNS),
loop(State);
{unregister_iq_handler, XMLNS} ->
case ets:lookup(State#state.iqtable, XMLNS) of
@@ -61,7 +62,20 @@ loop(State) ->
ok
end,
ets:delete(State#state.iqtable, XMLNS),
- mod_disco:unregister_feature(XMLNS),
+ catch mod_disco:unregister_feature(XMLNS),
+ loop(State);
+ refresh_iq_handlers ->
+ lists:map(
+ fun(T) ->
+ case T of
+ {XMLNS, _Module, _Function, _Opts} ->
+ catch mod_disco:register_feature(XMLNS);
+ {XMLNS, _Module, _Function} ->
+ catch mod_disco:register_feature(XMLNS);
+ _ ->
+ ok
+ end
+ end, ets:tab2list(State#state.iqtable)),
loop(State);
_ ->
loop(State)
@@ -142,6 +156,8 @@ register_iq_handler(XMLNS, Module, Fun, Opts) ->
unregister_iq_handler(XMLNS) ->
ejabberd_local ! {unregister_iq_handler, XMLNS}.
+refresh_iq_handlers() ->
+ ejabberd_local ! refresh_iq_handlers.
announce_online(From, To, Packet) ->
case acl:match_rule(announce, From) of