Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2005-06-20 07:18:13 +0400
committerAlexey Shchepin <alexey@process-one.net>2005-06-20 07:18:13 +0400
commit4098c3ecbae91929039410ddf45f400b6e87db39 (patch)
tree752f096271a724d865377e34d896529229756808 /src/ejabberd_local.erl
parentcb9007532739a81cf4e29b6134ea6eaaf6c5f353 (diff)
* (all): Enhanced virtual hosting support
SVN Revision: 370
Diffstat (limited to 'src/ejabberd_local.erl')
-rw-r--r--src/ejabberd_local.erl56
1 files changed, 29 insertions, 27 deletions
diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl
index 3e7eaf1b9..a9fa5ee2e 100644
--- a/src/ejabberd_local.erl
+++ b/src/ejabberd_local.erl
@@ -13,9 +13,9 @@
-export([start_link/0, init/0]).
-export([route/3,
- register_iq_handler/3,
register_iq_handler/4,
- unregister_iq_handler/1,
+ register_iq_handler/5,
+ unregister_iq_handler/2,
refresh_iq_handlers/0,
bounce_resource_packet/3
]).
@@ -33,11 +33,11 @@ start_link() ->
init() ->
lists:foreach(
fun(Host) ->
- ejabberd_router:register_route(Host, {apply, ?MODULE, route})
+ ejabberd_router:register_route(Host, {apply, ?MODULE, route}),
+ ejabberd_hooks:add(local_send_to_resource_hook, Host,
+ ?MODULE, bounce_resource_packet, 100)
end, ?MYHOSTS),
catch ets:new(?IQTABLE, [named_table, public]),
- ejabberd_hooks:add(local_send_to_resource_hook,
- ?MODULE, bounce_resource_packet, 100),
loop().
loop() ->
@@ -51,32 +51,32 @@ loop() ->
ok
end,
loop();
- {register_iq_handler, XMLNS, Module, Function} ->
- ets:insert(?IQTABLE, {XMLNS, Module, Function}),
- catch mod_disco:register_feature(XMLNS),
+ {register_iq_handler, Host, XMLNS, Module, Function} ->
+ ets:insert(?IQTABLE, {{XMLNS, Host}, Module, Function}),
+ catch mod_disco:register_feature(Host, XMLNS),
loop();
- {register_iq_handler, XMLNS, Module, Function, Opts} ->
- ets:insert(?IQTABLE, {XMLNS, Module, Function, Opts}),
- catch mod_disco:register_feature(XMLNS),
+ {register_iq_handler, Host, XMLNS, Module, Function, Opts} ->
+ ets:insert(?IQTABLE, {{XMLNS, Host}, Module, Function, Opts}),
+ catch mod_disco:register_feature(Host, XMLNS),
loop();
- {unregister_iq_handler, XMLNS} ->
- case ets:lookup(?IQTABLE, XMLNS) of
+ {unregister_iq_handler, Host, XMLNS} ->
+ case ets:lookup(?IQTABLE, {XMLNS, Host}) of
[{_, Module, Function, Opts}] ->
gen_iq_handler:stop_iq_handler(Module, Function, Opts);
_ ->
ok
end,
- ets:delete(?IQTABLE, XMLNS),
- catch mod_disco:unregister_feature(XMLNS),
+ ets:delete(?IQTABLE, {XMLNS, Host}),
+ catch mod_disco:unregister_feature(Host, XMLNS),
loop();
refresh_iq_handlers ->
lists:foreach(
fun(T) ->
case T of
- {XMLNS, _Module, _Function, _Opts} ->
- catch mod_disco:register_feature(XMLNS);
- {XMLNS, _Module, _Function} ->
- catch mod_disco:register_feature(XMLNS);
+ {{XMLNS, Host}, _Module, _Function, _Opts} ->
+ catch mod_disco:register_feature(Host, XMLNS);
+ {{XMLNS, Host}, _Module, _Function} ->
+ catch mod_disco:register_feature(Host, XMLNS);
_ ->
ok
end
@@ -112,6 +112,7 @@ do_route(From, To, Packet) ->
"result" -> ok;
_ ->
ejabberd_hooks:run(local_send_to_resource_hook,
+ To#jid.lserver,
[From, To, Packet])
end
end.
@@ -120,7 +121,8 @@ process_iq(From, To, Packet) ->
IQ = jlib:iq_query_info(Packet),
case IQ of
#iq{xmlns = XMLNS} ->
- case ets:lookup(?IQTABLE, XMLNS) of
+ Host = To#jid.lserver,
+ case ets:lookup(?IQTABLE, {XMLNS, Host}) of
[{_, Module, Function}] ->
ResIQ = Module:Function(From, To, IQ),
if
@@ -131,7 +133,7 @@ process_iq(From, To, Packet) ->
ok
end;
[{_, Module, Function, Opts}] ->
- gen_iq_handler:handle(Module, Function, Opts,
+ gen_iq_handler:handle(Host, Module, Function, Opts,
From, To, IQ);
[] ->
Err = jlib:make_error_reply(
@@ -155,14 +157,14 @@ route(From, To, Packet) ->
ok
end.
-register_iq_handler(XMLNS, Module, Fun) ->
- ejabberd_local ! {register_iq_handler, XMLNS, Module, Fun}.
+register_iq_handler(Host, XMLNS, Module, Fun) ->
+ ejabberd_local ! {register_iq_handler, Host, XMLNS, Module, Fun}.
-register_iq_handler(XMLNS, Module, Fun, Opts) ->
- ejabberd_local ! {register_iq_handler, XMLNS, Module, Fun, Opts}.
+register_iq_handler(Host, XMLNS, Module, Fun, Opts) ->
+ ejabberd_local ! {register_iq_handler, Host, XMLNS, Module, Fun, Opts}.
-unregister_iq_handler(XMLNS) ->
- ejabberd_local ! {unregister_iq_handler, XMLNS}.
+unregister_iq_handler(Host, XMLNS) ->
+ ejabberd_local ! {unregister_iq_handler, Host, XMLNS}.
refresh_iq_handlers() ->
ejabberd_local ! refresh_iq_handlers.