diff options
author | Alexey Shchepin <alexey@process-one.net> | 2002-12-11 23:57:45 +0300 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2002-12-11 23:57:45 +0300 |
commit | 727795239ad226788bb6cd6212831617b69a4f37 (patch) | |
tree | 66d6f9b7842f564b4fee6d9e65933ee33c895a17 /src/ejabberd_local.erl | |
parent | 534b6925a399a2ea3ab5477078c463e4d153f1bf (diff) |
*** empty log message ***
SVN Revision: 15
Diffstat (limited to 'src/ejabberd_local.erl')
-rw-r--r-- | src/ejabberd_local.erl | 86 |
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}. |