aboutsummaryrefslogtreecommitdiff
path: root/src/gen_iq_handler.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/gen_iq_handler.erl')
-rw-r--r--src/gen_iq_handler.erl144
1 files changed, 26 insertions, 118 deletions
diff --git a/src/gen_iq_handler.erl b/src/gen_iq_handler.erl
index f1c9e4cc2..0982a9f46 100644
--- a/src/gen_iq_handler.erl
+++ b/src/gen_iq_handler.erl
@@ -27,110 +27,38 @@
-author('alexey@process-one.net').
--ifndef(GEN_SERVER).
--define(GEN_SERVER, gen_server).
--endif.
--behaviour(?GEN_SERVER).
-behaviour(ejabberd_config).
%% API
--export([start_link/3, add_iq_handler/6,
- remove_iq_handler/3, stop_iq_handler/3, handle/5,
+-export([add_iq_handler/5, remove_iq_handler/3, handle/4,
process_iq/4, check_type/1, transform_module_options/1,
- opt_type/1, iqdisc/1]).
-
-%% gen_server callbacks
--export([init/1, handle_call/3, handle_cast/2,
- handle_info/2, terminate/2, code_change/3]).
+ opt_type/1]).
+%% Deprecated functions
+-export([add_iq_handler/6, handle/5, iqdisc/1]).
+-deprecated([{add_iq_handler, 6}, {handle, 5}, {iqdisc, 1}]).
-include("ejabberd.hrl").
-include("logger.hrl").
-include("xmpp.hrl").
--record(state, {host, module, function}).
-
-type component() :: ejabberd_sm | ejabberd_local.
--type type() :: no_queue | one_queue | pos_integer() | parallel.
--type opts() :: no_queue | {one_queue, pid()} | {queues, [pid()]} | parallel.
--export_type([opts/0, type/0]).
%%====================================================================
%% API
%%====================================================================
-%%--------------------------------------------------------------------
-%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
-%% Description: Starts the server
-%%--------------------------------------------------------------------
-start_link(Host, Module, Function) ->
- ?GEN_SERVER:start_link(?MODULE, [Host, Module, Function],
- []).
-
--spec add_iq_handler(module(), binary(), binary(), module(), atom(), type()) -> ok.
-
-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});
- N when is_integer(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.
+-spec add_iq_handler(module(), binary(), binary(), module(), atom()) -> ok.
+add_iq_handler(Component, Host, NS, Module, Function) ->
+ Component:register_iq_handler(Host, NS, Module, Function).
-spec remove_iq_handler(component(), binary(), binary()) -> ok.
-
remove_iq_handler(Component, Host, NS) ->
Component:unregister_iq_handler(Host, NS).
--spec stop_iq_handler(atom(), atom(), [pid()]) -> any().
-
-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
- end.
-
--spec handle(binary(), atom(), atom(), opts(), iq()) -> any().
-
-handle(Host, Module, Function, Opts, IQ) ->
- case Opts of
- no_queue ->
- process_iq(Host, Module, Function, IQ);
- {one_queue, Pid} ->
- Pid ! {process_iq, IQ};
- {queues, Pids} ->
- Pid = lists:nth(erlang:phash(p1_time_compat:unique_integer(),
- length(Pids)), Pids),
- Pid ! {process_iq, IQ};
- parallel ->
- spawn(?MODULE, process_iq, [Host, Module, Function, IQ]);
- _ -> todo
- end.
+-spec handle(binary(), atom(), atom(), iq()) -> any().
+handle(Host, Module, Function, IQ) ->
+ process_iq(Host, Module, Function, IQ).
-spec process_iq(binary(), atom(), atom(), iq()) -> any().
-
process_iq(_Host, Module, Function, IQ) ->
try
ResIQ = case erlang:function_exported(Module, Function, 1) of
@@ -178,15 +106,14 @@ process_iq(Module, Function, From, To, IQ) ->
To, From)
end.
--spec check_type(type()) -> type().
+-spec check_type(any()) -> no_queue.
+check_type(_Type) ->
+ ?WARNING_MSG("Option 'iqdisc' is deprecated and has no effect anymore", []),
+ no_queue.
-check_type(no_queue) -> no_queue;
-check_type(one_queue) -> one_queue;
-check_type(N) when is_integer(N), N>0 -> N;
-check_type(parallel) -> parallel.
-
-iqdisc(Host) ->
- ejabberd_config:get_option({iqdisc, Host}, no_queue).
+-spec iqdisc(binary() | global) -> no_queue.
+iqdisc(_Host) ->
+ no_queue.
-spec transform_module_options([{atom(), any()}]) -> [{atom(), any()}].
@@ -198,37 +125,18 @@ transform_module_options(Opts) ->
Opt
end, Opts).
--spec opt_type(iqdisc) -> fun((type()) -> type());
+-spec opt_type(iqdisc) -> fun((any()) -> no_queue);
(atom()) -> [atom()].
opt_type(iqdisc) -> fun check_type/1;
opt_type(_) -> [iqdisc].
%%====================================================================
-%% gen_server callbacks
+%% Deprecated API
%%====================================================================
+-spec add_iq_handler(module(), binary(), binary(), module(), atom(), any()) -> ok.
+add_iq_handler(Component, Host, NS, Module, Function, _Type) ->
+ add_iq_handler(Component, Host, NS, Module, Function).
-init([Host, Module, Function]) ->
- {ok,
- #state{host = Host, module = Module,
- function = Function}}.
-
-handle_call(stop, _From, State) ->
- Reply = ok, {stop, normal, Reply, State}.
-
-handle_cast(_Msg, State) -> {noreply, State}.
-
-handle_info({process_iq, IQ},
- #state{host = Host, module = Module,
- function = Function} =
- State) ->
- process_iq(Host, Module, Function, IQ),
- {noreply, State};
-handle_info(_Info, State) -> {noreply, State}.
-
-terminate(_Reason, _State) -> ok.
-
-code_change(_OldVsn, State, _Extra) -> {ok, State}.
-
-%%--------------------------------------------------------------------
-%%% Internal functions
-%%--------------------------------------------------------------------
+-spec handle(binary(), atom(), atom(), any(), iq()) -> any().
+handle(Host, Module, Function, _Opts, IQ) ->
+ handle(Host, Module, Function, IQ).