diff options
Diffstat (limited to 'src/gen_iq_handler.erl')
-rw-r--r-- | src/gen_iq_handler.erl | 146 |
1 files changed, 68 insertions, 78 deletions
diff --git a/src/gen_iq_handler.erl b/src/gen_iq_handler.erl index e04f53afe..20efee7bc 100644 --- a/src/gen_iq_handler.erl +++ b/src/gen_iq_handler.erl @@ -25,27 +25,23 @@ %%%---------------------------------------------------------------------- -module(gen_iq_handler). + -author('alexey@process-one.net'). -behaviour(gen_server). %% API --export([start_link/3, - add_iq_handler/6, - remove_iq_handler/3, - stop_iq_handler/3, - handle/7, +-export([start_link/3, add_iq_handler/6, + remove_iq_handler/3, stop_iq_handler/3, handle/7, process_iq/6]). %% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). --record(state, {host, - module, - function}). +-record(state, {host, module, function}). %%==================================================================== %% API @@ -55,30 +51,34 @@ %% Description: Starts the server %%-------------------------------------------------------------------- start_link(Host, Module, Function) -> - gen_server:start_link(?MODULE, [Host, Module, Function], []). + gen_server:start_link(?MODULE, [Host, Module, Function], + []). -add_iq_handler(Component, Host, NS, Module, Function, Type) -> +add_iq_handler(Component, Host, NS, Module, Function, + Type) -> case Type of - no_queue -> - Component:register_iq_handler(Host, NS, Module, Function, no_queue); - one_queue -> - {ok, Pid} = supervisor:start_child(ejabberd_iq_sup, - [Host, Module, Function]), - Component:register_iq_handler(Host, NS, Module, Function, - {one_queue, Pid}); - {queues, N} -> - Pids = - lists:map( - fun(_) -> - {ok, Pid} = supervisor:start_child( - ejabberd_iq_sup, - [Host, Module, Function]), - Pid - end, lists:seq(1, N)), - Component:register_iq_handler(Host, NS, Module, Function, - {queues, Pids}); - parallel -> - Component:register_iq_handler(Host, NS, Module, Function, parallel) + no_queue -> + Component:register_iq_handler(Host, NS, Module, + Function, no_queue); + one_queue -> + {ok, Pid} = supervisor:start_child(ejabberd_iq_sup, + [Host, Module, Function]), + Component:register_iq_handler(Host, NS, Module, + Function, {one_queue, Pid}); + {queues, N} -> + Pids = lists:map(fun (_) -> + {ok, Pid} = + supervisor:start_child(ejabberd_iq_sup, + [Host, Module, + Function]), + Pid + end, + lists:seq(1, N)), + Component:register_iq_handler(Host, NS, Module, + Function, {queues, Pids}); + parallel -> + Component:register_iq_handler(Host, NS, Module, + Function, parallel) end. remove_iq_handler(Component, Host, NS) -> @@ -86,44 +86,38 @@ remove_iq_handler(Component, Host, NS) -> stop_iq_handler(_Module, _Function, Opts) -> case Opts of - {one_queue, Pid} -> - gen_server:call(Pid, stop); - {queues, Pids} -> - lists:foreach(fun(Pid) -> - catch gen_server:call(Pid, stop) - end, Pids); - _ -> - ok + {one_queue, Pid} -> gen_server:call(Pid, stop); + {queues, Pids} -> + lists:foreach(fun (Pid) -> + catch gen_server:call(Pid, stop) + end, + Pids); + _ -> ok end. handle(Host, Module, Function, Opts, From, To, IQ) -> case Opts of - no_queue -> - process_iq(Host, Module, Function, From, To, IQ); - {one_queue, Pid} -> - Pid ! {process_iq, From, To, IQ}; - {queues, Pids} -> - Pid = lists:nth(erlang:phash(now(), length(Pids)), Pids), - Pid ! {process_iq, From, To, IQ}; - parallel -> - spawn(?MODULE, process_iq, [Host, Module, Function, From, To, IQ]); - _ -> - todo + no_queue -> + process_iq(Host, Module, Function, From, To, IQ); + {one_queue, Pid} -> Pid ! {process_iq, From, To, IQ}; + {queues, Pids} -> + Pid = lists:nth(erlang:phash(now(), str:len(Pids)), + Pids), + Pid ! {process_iq, From, To, IQ}; + parallel -> + spawn(?MODULE, process_iq, + [Host, Module, Function, From, To, IQ]); + _ -> todo end. - process_iq(_Host, Module, Function, From, To, IQ) -> case catch Module:Function(From, To, IQ) of - {'EXIT', Reason} -> - ?ERROR_MSG("~p", [Reason]); - ResIQ -> - if - ResIQ /= ignore -> - ejabberd_router:route(To, From, - jlib:iq_to_xml(ResIQ)); - true -> - ok - end + {'EXIT', Reason} -> ?ERROR_MSG("~p", [Reason]); + ResIQ -> + if ResIQ /= ignore -> + ejabberd_router:route(To, From, jlib:iq_to_xml(ResIQ)); + true -> ok + end end. %%==================================================================== @@ -138,9 +132,9 @@ process_iq(_Host, Module, Function, From, To, IQ) -> %% Description: Initiates the server %%-------------------------------------------------------------------- init([Host, Module, Function]) -> - {ok, #state{host = Host, - module = Module, - function = Function}}. + {ok, + #state{host = Host, module = Module, + function = Function}}. %%-------------------------------------------------------------------- %% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} | @@ -152,8 +146,7 @@ init([Host, Module, Function]) -> %% Description: Handling call messages %%-------------------------------------------------------------------- handle_call(stop, _From, State) -> - Reply = ok, - {stop, normal, Reply, State}. + Reply = ok, {stop, normal, Reply, State}. %%-------------------------------------------------------------------- %% Function: handle_cast(Msg, State) -> {noreply, State} | @@ -161,8 +154,7 @@ handle_call(stop, _From, State) -> %% {stop, Reason, State} %% Description: Handling cast messages %%-------------------------------------------------------------------- -handle_cast(_Msg, State) -> - {noreply, State}. +handle_cast(_Msg, State) -> {noreply, State}. %%-------------------------------------------------------------------- %% Function: handle_info(Info, State) -> {noreply, State} | @@ -171,13 +163,12 @@ handle_cast(_Msg, State) -> %% Description: Handling all non call/cast messages %%-------------------------------------------------------------------- handle_info({process_iq, From, To, IQ}, - #state{host = Host, - module = Module, - function = Function} = State) -> + #state{host = Host, module = Module, + function = Function} = + State) -> process_iq(Host, Module, Function, From, To, IQ), {noreply, State}; -handle_info(_Info, State) -> - {noreply, State}. +handle_info(_Info, State) -> {noreply, State}. %%-------------------------------------------------------------------- %% Function: terminate(Reason, State) -> void() @@ -186,16 +177,15 @@ handle_info(_Info, State) -> %% cleaning up. When it returns, the gen_server terminates with Reason. %% The return value is ignored. %%-------------------------------------------------------------------- -terminate(_Reason, _State) -> - ok. +terminate(_Reason, _State) -> ok. %%-------------------------------------------------------------------- %% Func: code_change(OldVsn, State, Extra) -> {ok, NewState} %% Description: Convert process state when code is changed %%-------------------------------------------------------------------- -code_change(_OldVsn, State, _Extra) -> - {ok, State}. +code_change(_OldVsn, State, _Extra) -> {ok, State}. %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- + |