summaryrefslogtreecommitdiff
path: root/src/ejabberd_local.erl
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2013-03-14 10:33:02 +0100
committerBadlop <badlop@process-one.net>2013-03-14 10:33:02 +0100
commit9deb294328bb3f9eb6bd2c0e7cd500732e9b5830 (patch)
tree7e1066c130250627ee0abab44a135f583a28d07f /src/ejabberd_local.erl
parentlist_to_integer/2 only works in OTP R14 and newer (diff)
Accumulated patch to binarize and indent code
Diffstat (limited to 'src/ejabberd_local.erl')
-rw-r--r--src/ejabberd_local.erl287
1 files changed, 136 insertions, 151 deletions
diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl
index 1fe7cb0a..12dfea0c 100644
--- a/src/ejabberd_local.erl
+++ b/src/ejabberd_local.erl
@@ -25,6 +25,7 @@
%%%----------------------------------------------------------------------
-module(ejabberd_local).
+
-author('alexey@process-one.net').
-behaviour(gen_server).
@@ -32,30 +33,27 @@
%% API
-export([start_link/0]).
--export([route/3,
- route_iq/4,
- route_iq/5,
- process_iq_reply/3,
- register_iq_handler/4,
- register_iq_handler/5,
- register_iq_response_handler/4,
- register_iq_response_handler/5,
- unregister_iq_handler/2,
- unregister_iq_response_handler/2,
- refresh_iq_handlers/0,
- bounce_resource_packet/3
- ]).
+-export([route/3, route_iq/4, route_iq/5,
+ process_iq_reply/3, register_iq_handler/4,
+ register_iq_handler/5, register_iq_response_handler/4,
+ register_iq_response_handler/5, unregister_iq_handler/2,
+ unregister_iq_response_handler/2, refresh_iq_handlers/0,
+ bounce_resource_packet/3]).
%% 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").
+
-include("jlib.hrl").
-record(state, {}).
--record(iq_response, {id, module, function, timer}).
+-record(iq_response, {id = <<"">> :: binary(),
+ module :: atom(),
+ function :: atom() | fun(),
+ timer = make_ref() :: reference()}).
-define(IQTABLE, local_iqtable).
@@ -70,65 +68,59 @@
%% Description: Starts the server
%%--------------------------------------------------------------------
start_link() ->
- gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [],
+ []).
process_iq(From, To, Packet) ->
IQ = jlib:iq_query_info(Packet),
case IQ of
- #iq{xmlns = XMLNS} ->
- Host = To#jid.lserver,
- case ets:lookup(?IQTABLE, {XMLNS, Host}) of
- [{_, Module, Function}] ->
- ResIQ = Module:Function(From, To, IQ),
- if
- ResIQ /= ignore ->
- ejabberd_router:route(
- To, From, jlib:iq_to_xml(ResIQ));
- true ->
- ok
- end;
- [{_, Module, Function, Opts}] ->
- gen_iq_handler:handle(Host, Module, Function, Opts,
- From, To, IQ);
- [] ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_FEATURE_NOT_IMPLEMENTED),
- ejabberd_router:route(To, From, Err)
- end;
- reply ->
- IQReply = jlib:iq_query_or_response_info(Packet),
- process_iq_reply(From, To, IQReply);
- _ ->
- Err = jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST),
- ejabberd_router:route(To, From, Err),
- ok
+ #iq{xmlns = XMLNS} ->
+ Host = To#jid.lserver,
+ case ets:lookup(?IQTABLE, {XMLNS, Host}) of
+ [{_, Module, Function}] ->
+ ResIQ = Module:Function(From, To, IQ),
+ if ResIQ /= ignore ->
+ ejabberd_router:route(To, From, jlib:iq_to_xml(ResIQ));
+ true -> ok
+ end;
+ [{_, Module, Function, Opts}] ->
+ gen_iq_handler:handle(Host, Module, Function, Opts,
+ From, To, IQ);
+ [] ->
+ Err = jlib:make_error_reply(Packet,
+ ?ERR_FEATURE_NOT_IMPLEMENTED),
+ ejabberd_router:route(To, From, Err)
+ end;
+ reply ->
+ IQReply = jlib:iq_query_or_response_info(Packet),
+ process_iq_reply(From, To, IQReply);
+ _ ->
+ Err = jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST),
+ ejabberd_router:route(To, From, Err),
+ ok
end.
process_iq_reply(From, To, #iq{id = ID} = IQ) ->
case get_iq_callback(ID) of
- {ok, undefined, Function} ->
- Function(IQ),
- ok;
- {ok, Module, Function} ->
- Module:Function(From, To, IQ),
- ok;
- _ ->
- nothing
+ {ok, undefined, Function} -> Function(IQ), ok;
+ {ok, Module, Function} ->
+ Module:Function(From, To, IQ), ok;
+ _ -> nothing
end.
route(From, To, Packet) ->
case catch do_route(From, To, Packet) of
- {'EXIT', Reason} ->
- ?ERROR_MSG("~p~nwhen processing: ~p",
- [Reason, {From, To, Packet}]);
- _ ->
- ok
+ {'EXIT', Reason} ->
+ ?ERROR_MSG("~p~nwhen processing: ~p",
+ [Reason, {From, To, Packet}]);
+ _ -> ok
end.
route_iq(From, To, IQ, F) ->
route_iq(From, To, IQ, F, undefined).
-route_iq(From, To, #iq{type = Type} = IQ, F, Timeout) when is_function(F) ->
+route_iq(From, To, #iq{type = Type} = IQ, F, Timeout)
+ when is_function(F) ->
Packet = if Type == set; Type == get ->
ID = randoms:get_string(),
Host = From#jid.lserver,
@@ -139,15 +131,16 @@ route_iq(From, To, #iq{type = Type} = IQ, F, Timeout) when is_function(F) ->
end,
ejabberd_router:route(From, To, Packet).
-register_iq_response_handler(Host, ID, Module, Function) ->
- register_iq_response_handler(Host, ID, Module, Function, undefined).
+register_iq_response_handler(Host, ID, Module,
+ Function) ->
+ register_iq_response_handler(Host, ID, Module, Function,
+ undefined).
-register_iq_response_handler(_Host, ID, Module, Function, Timeout0) ->
+register_iq_response_handler(_Host, ID, Module,
+ Function, Timeout0) ->
Timeout = case Timeout0 of
- undefined ->
- ?IQ_TIMEOUT;
- N when is_integer(N), N > 0 ->
- N
+ undefined -> ?IQ_TIMEOUT;
+ N when is_integer(N), N > 0 -> N
end,
TRef = erlang:start_timer(Timeout, ejabberd_local, ID),
mnesia:dirty_write(#iq_response{id = ID,
@@ -156,14 +149,15 @@ register_iq_response_handler(_Host, ID, Module, Function, Timeout0) ->
timer = TRef}).
register_iq_handler(Host, XMLNS, Module, Fun) ->
- ejabberd_local ! {register_iq_handler, Host, XMLNS, Module, Fun}.
+ ejabberd_local !
+ {register_iq_handler, Host, XMLNS, Module, Fun}.
register_iq_handler(Host, XMLNS, Module, Fun, Opts) ->
- ejabberd_local ! {register_iq_handler, Host, XMLNS, Module, Fun, Opts}.
+ ejabberd_local !
+ {register_iq_handler, Host, XMLNS, Module, Fun, Opts}.
unregister_iq_response_handler(_Host, ID) ->
- catch get_iq_callback(ID),
- ok.
+ catch get_iq_callback(ID), ok.
unregister_iq_handler(Host, XMLNS) ->
ejabberd_local ! {unregister_iq_handler, Host, XMLNS}.
@@ -172,7 +166,8 @@ refresh_iq_handlers() ->
ejabberd_local ! refresh_iq_handlers.
bounce_resource_packet(From, To, Packet) ->
- Err = jlib:make_error_reply(Packet, ?ERR_ITEM_NOT_FOUND),
+ Err = jlib:make_error_reply(Packet,
+ ?ERR_ITEM_NOT_FOUND),
ejabberd_router:route(To, From, Err),
stop.
@@ -188,12 +183,15 @@ bounce_resource_packet(From, To, Packet) ->
%% Description: Initiates the server
%%--------------------------------------------------------------------
init([]) ->
- lists:foreach(
- fun(Host) ->
- ejabberd_router:register_route(Host, {apply, ?MODULE, route}),
- ejabberd_hooks:add(local_send_to_resource_hook, Host,
- ?MODULE, bounce_resource_packet, 100)
- end, ?MYHOSTS),
+ lists:foreach(fun (Host) ->
+ 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]),
update_table(),
mnesia:create_table(iq_response,
@@ -212,70 +210,68 @@ init([]) ->
%% Description: Handling call messages
%%--------------------------------------------------------------------
handle_call(_Request, _From, State) ->
- Reply = ok,
- {reply, Reply, State}.
-
%%--------------------------------------------------------------------
%% Function: handle_cast(Msg, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling cast messages
%%--------------------------------------------------------------------
-handle_cast(_Msg, State) ->
- {noreply, State}.
-
%%--------------------------------------------------------------------
%% Function: handle_info(Info, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
+ Reply = ok, {reply, Reply, State}.
+
+handle_cast(_Msg, State) -> {noreply, State}.
+
handle_info({route, From, To, Packet}, State) ->
case catch do_route(From, To, Packet) of
- {'EXIT', Reason} ->
- ?ERROR_MSG("~p~nwhen processing: ~p",
- [Reason, {From, To, Packet}]);
- _ ->
- ok
+ {'EXIT', Reason} ->
+ ?ERROR_MSG("~p~nwhen processing: ~p",
+ [Reason, {From, To, Packet}]);
+ _ -> ok
end,
{noreply, State};
-handle_info({register_iq_handler, Host, XMLNS, Module, Function}, State) ->
+handle_info({register_iq_handler, Host, XMLNS, Module,
+ Function},
+ State) ->
ets:insert(?IQTABLE, {{XMLNS, Host}, Module, Function}),
catch mod_disco:register_feature(Host, XMLNS),
{noreply, State};
-handle_info({register_iq_handler, Host, XMLNS, Module, Function, Opts}, State) ->
- ets:insert(?IQTABLE, {{XMLNS, Host}, Module, Function, Opts}),
+handle_info({register_iq_handler, Host, XMLNS, Module,
+ Function, Opts},
+ State) ->
+ ets:insert(?IQTABLE,
+ {{XMLNS, Host}, Module, Function, Opts}),
catch mod_disco:register_feature(Host, XMLNS),
{noreply, State};
-handle_info({unregister_iq_handler, Host, XMLNS}, State) ->
+handle_info({unregister_iq_handler, Host, XMLNS},
+ State) ->
case ets:lookup(?IQTABLE, {XMLNS, Host}) of
- [{_, Module, Function, Opts}] ->
- gen_iq_handler:stop_iq_handler(Module, Function, Opts);
- _ ->
- ok
+ [{_, Module, Function, Opts}] ->
+ gen_iq_handler:stop_iq_handler(Module, Function, Opts);
+ _ -> ok
end,
ets:delete(?IQTABLE, {XMLNS, Host}),
catch mod_disco:unregister_feature(Host, XMLNS),
{noreply, State};
handle_info(refresh_iq_handlers, State) ->
- lists:foreach(
- fun(T) ->
- case T of
- {{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
- end, ets:tab2list(?IQTABLE)),
+ lists:foreach(fun (T) ->
+ case T of
+ {{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
+ end,
+ ets:tab2list(?IQTABLE)),
{noreply, State};
handle_info({timeout, _TRef, ID}, State) ->
process_iq_timeout(ID),
{noreply, State};
-handle_info(_Info, State) ->
- {noreply, State}.
-
%%--------------------------------------------------------------------
%% Function: terminate(Reason, State) -> void()
%% Description: This function is called by a gen_server when it is about to
@@ -283,48 +279,43 @@ handle_info(_Info, State) ->
%% cleaning up. When it returns, the gen_server terminates with Reason.
%% The return value is ignored.
%%--------------------------------------------------------------------
-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}.
-
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
+handle_info(_Info, State) -> {noreply, State}.
+
+terminate(_Reason, _State) -> ok.
+
+code_change(_OldVsn, State, _Extra) -> {ok, State}.
+
do_route(From, To, Packet) ->
- ?DEBUG("local route~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n",
+ ?DEBUG("local route~n\tfrom ~p~n\tto ~p~n\tpacket "
+ "~P~n",
[From, To, Packet, 8]),
- if
- To#jid.luser /= "" ->
- ejabberd_sm:route(From, To, Packet);
- To#jid.lresource == "" ->
- {xmlelement, Name, _Attrs, _Els} = Packet,
- case Name of
- "iq" ->
- process_iq(From, To, Packet);
- "message" ->
- ok;
- "presence" ->
- ok;
- _ ->
- ok
- end;
- true ->
- {xmlelement, _Name, Attrs, _Els} = Packet,
- case xml:get_attr_s("type", Attrs) of
- "error" -> ok;
- "result" -> ok;
- _ ->
- ejabberd_hooks:run(local_send_to_resource_hook,
- To#jid.lserver,
- [From, To, Packet])
- end
- end.
+ if To#jid.luser /= <<"">> ->
+ ejabberd_sm:route(From, To, Packet);
+ To#jid.lresource == <<"">> ->
+ #xmlel{name = Name} = Packet,
+ case Name of
+ <<"iq">> -> process_iq(From, To, Packet);
+ <<"message">> -> ok;
+ <<"presence">> -> ok;
+ _ -> ok
+ end;
+ true ->
+ #xmlel{attrs = Attrs} = Packet,
+ case xml:get_attr_s(<<"type">>, Attrs) of
+ <<"error">> -> ok;
+ <<"result">> -> ok;
+ _ ->
+ ejabberd_hooks:run(local_send_to_resource_hook,
+ To#jid.lserver, [From, To, Packet])
+ end
+ end.
update_table() ->
case catch mnesia:table_info(iq_response, attributes) of
@@ -365,13 +356,7 @@ process_iq_timeout() ->
cancel_timer(TRef) ->
case erlang:cancel_timer(TRef) of
- false ->
- receive
- {timeout, TRef, _} ->
- ok
- after 0 ->
- ok
- end;
- _ ->
- ok
+ false ->
+ receive {timeout, TRef, _} -> ok after 0 -> ok end;
+ _ -> ok
end.