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>2002-12-11 23:57:45 +0300
committerAlexey Shchepin <alexey@process-one.net>2002-12-11 23:57:45 +0300
commit727795239ad226788bb6cd6212831617b69a4f37 (patch)
tree66d6f9b7842f564b4fee6d9e65933ee33c895a17 /src/ejabberd_local.erl
parent534b6925a399a2ea3ab5477078c463e4d153f1bf (diff)
*** empty log message ***
SVN Revision: 15
Diffstat (limited to 'src/ejabberd_local.erl')
-rw-r--r--src/ejabberd_local.erl86
1 files changed, 75 insertions, 11 deletions
diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl
index 0e0321c1a..32bbdfbb1 100644
--- a/src/ejabberd_local.erl
+++ b/src/ejabberd_local.erl
@@ -10,36 +10,100 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
-%%-export([Function/Arity, ...]).
+-export([start/0, init/0]).
--export([start/0,init/0]).
+-export([register_iq_handler/3]).
-include("ejabberd.hrl").
+-record(state, {mydomain, iqtable}).
start() ->
- spawn(ejabberd_local, init, []).
+ register(ejabberd_local, spawn(ejabberd_local, init, [])),
+ mod_register:start(),
+ ok.
init() ->
- ejabberd_router:register_local_route(?MYNAME),
- loop().
+ MyDomain = ?MYNAME,
+ ejabberd_router:register_local_route(MyDomain),
+ loop(#state{mydomain = MyDomain,
+ iqtable = ets:new(iqtable, [])}).
-loop() ->
+loop(State) ->
receive
{route, From, To, Packet} ->
- do_route(From, To, Packet),
- loop()
+ do_route(State, From, To, Packet),
+ loop(State);
+ {register_iq_handler, XMLNS, Module, Function} ->
+ ets:insert(State#state.iqtable, {XMLNS, Module, Function}),
+ loop(State)
end.
-do_route(From, To, Packet) ->
+do_route(State, From, To, Packet) ->
?DEBUG("local route~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n",
[From, To, Packet, 8]),
case To of
+ {"", _, ""} ->
+ {xmlelement, Name, Attrs, Els} = Packet,
+ case Name of
+ "iq" ->
+ process_iq(State, From, To, Packet);
+ "message" ->
+ ok;
+ "presence" ->
+ % TODO
+ ok;
+ _ ->
+ % DROP
+ ok
+ end;
{"", _, _} ->
+ Err = jlib:make_error_reply(Packet, "404", "Not Found"),
+ ejabberd_router ! {route,
+ {"", State#state.mydomain, ""}, From, Err},
ok;
_ ->
ejabberd_sm ! {route, From, To, Packet}
- end,
- ok.
+ end.
+
+process_iq(State, From, To, Packet) ->
+ IQ = jlib:iq_query_info(Packet),
+ case IQ of
+ {iq, ID, Type, XMLNS, SubEl} ->
+ case jlib:is_iq_request_type(Type) of
+ true ->
+ % TODO
+ case ets:lookup(State#state.iqtable, XMLNS) of
+ [{_, Module, Function}] ->
+ ResIQ = apply(Module, Function, [From, To, IQ]),
+ if
+ ResIQ /= ignore ->
+ ejabberd_router ! {route,
+ To,
+ From,
+ jlib:iq_to_xml(ResIQ)};
+ true ->
+ ok
+ end;
+ [] ->
+ Err = jlib:make_error_reply(
+ Packet, "501", "Not Implemented"),
+ ejabberd_router ! {route,
+ {"", State#state.mydomain, ""},
+ From,
+ Err}
+ end;
+ _ ->
+ % TODO
+ ok
+ end;
+ _ ->
+ Err = jlib:make_error_reply(Packet, "400", "Bad Request"),
+ ejabberd_router ! {route,
+ {"", State#state.mydomain, ""}, From, Err},
+ ok
+ end.
+register_iq_handler(XMLNS, Module, Fun) ->
+ ejabberd_local ! {register_iq_handler, XMLNS, Module, Fun}.