./ct_report/coverage/gen_iq_handler.COVER.html

1 %%%----------------------------------------------------------------------
2 %%% File : gen_iq_handler.erl
3 %%% Author : Alexey Shchepin <alexey@process-one.net>
4 %%% Purpose : IQ handler support
5 %%% Created : 22 Jan 2003 by Alexey Shchepin <alexey@process-one.net>
6 %%%
7 %%%
8 %%% ejabberd, Copyright (C) 2002-2011 ProcessOne
9 %%%
10 %%% This program is free software; you can redistribute it and/or
11 %%% modify it under the terms of the GNU General Public License as
12 %%% published by the Free Software Foundation; either version 2 of the
13 %%% License, or (at your option) any later version.
14 %%%
15 %%% This program is distributed in the hope that it will be useful,
16 %%% but WITHOUT ANY WARRANTY; without even the implied warranty of
17 %%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 %%% General Public License for more details.
19 %%%
20 %%% You should have received a copy of the GNU General Public License
21 %%% along with this program; if not, write to the Free Software
22 %%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 %%%
24 %%%----------------------------------------------------------------------
25
26 -module(gen_iq_handler).
27 -author('alexey@process-one.net').
28
29 %% Old API. Get rid of it once all the modules adopted.
30 -export([add_iq_handler/6,
31 remove_iq_handler/3]).
32
33 %% New API.
34 -export([add_iq_handler_for_domain/6,
35 add_iq_handler_for_subdomain/7,
36 remove_iq_handler_for_domain/3,
37 remove_iq_handler_for_subdomain/4]).
38
39 -type execution_type() :: mongoose_iq_handler:execution_type().
40 -type subdomain_pattern() :: mongoose_subdomain_utils:subdomain_pattern().
41
42 %%====================================================================
43 %% Old API. Get rid of it once all the modules adopted.
44 %%====================================================================
45 -spec add_iq_handler(Component :: module(),
46 Domain :: jid:lserver(),
47 Namespace :: binary(),
48 Module :: atom(),
49 Function :: atom(),
50 ExecutionType :: mongoose_iq_handler:execution_type()) -> any().
51 add_iq_handler(Component, Domain, Namespace, Module, Function, ExecutionType) ->
52 56 Extra = #{delete_on_unregister => true, module => Module, function => Function},
53 56 IQHandlerFn = make_iq_handler_fn(Module, Function),
54 56 IQHandler = mongoose_iq_handler:new(IQHandlerFn, Extra, ExecutionType),
55 56 gen_iq_component:register_iq_handler(Component, Domain, Namespace, IQHandler).
56
57 -spec remove_iq_handler(Component :: module(),
58 Domain :: jid:lserver(),
59 Namespace :: binary()) -> any().
60 remove_iq_handler(Component, Domain, Namespace) ->
61 56 gen_iq_component:unregister_iq_handler(Component, Domain, Namespace).
62
63 %%====================================================================
64 %% New API.
65 %%====================================================================
66 -spec add_iq_handler_for_domain(HostType :: mongooseim:host_type(),
67 Namespace :: binary(),
68 Component :: module(),
69 IQHandlerFn :: mongoose_iq_handler:handler_fn(),
70 Extra :: map(),
71 ExecutionType :: execution_type()) ->
72 ok | {error, atom()}.
73 add_iq_handler_for_domain(HostType, Namespace, Component, IQHandlerFn,
74 Extra, ExecutionType) ->
75 %% TODO: `delete_on_unregister` extra field is not needed once old API is removed
76 6738 NewExtra = Extra#{delete_on_unregister => false},
77 6738 IQHandler = mongoose_iq_handler:new(IQHandlerFn, NewExtra, ExecutionType),
78 6738 mongoose_lazy_routing:register_iq_handler_for_domain(HostType, Namespace,
79 Component, IQHandler).
80
81 -spec add_iq_handler_for_subdomain(HostType :: mongooseim:host_type(),
82 SubdomainPattern :: subdomain_pattern(),
83 Namespace :: binary(),
84 Component :: module(),
85 IQHandlerFn :: mongoose_iq_handler:handler_fn(),
86 Extra :: map(),
87 ExecutionType :: execution_type()) ->
88 ok | {error, atom()}.
89 add_iq_handler_for_subdomain(HostType, SubdomainPattern, Namespace, Component,
90 IQHandlerFn, Extra, ExecutionType) ->
91 %% TODO: `delete_on_unregister` extra field is not needed once old API is removed
92 150 NewExtra = Extra#{delete_on_unregister => false},
93 150 IQHandler = mongoose_iq_handler:new(IQHandlerFn, NewExtra, ExecutionType),
94 150 mongoose_lazy_routing:register_iq_handler_for_subdomain(HostType, SubdomainPattern,
95 Namespace, Component,
96 IQHandler).
97
98 -spec remove_iq_handler_for_domain(HostType :: mongooseim:host_type(),
99 Namespace :: binary(),
100 Component :: module()) ->
101 ok | {error, not_registered}.
102 remove_iq_handler_for_domain(HostType, Namespace, Component) ->
103 6728 case mongoose_lazy_routing:unregister_iq_handler_for_domain(
104 HostType, Namespace, Component) of
105 {ok, IQHandler} ->
106 5906 mongoose_iq_handler:delete(IQHandler);
107 822 {error, not_found} -> {error, not_registered}
108 end.
109
110 -spec remove_iq_handler_for_subdomain(HostType :: mongooseim:host_type(),
111 SubdomainPattern :: subdomain_pattern(),
112 Namespace :: binary(),
113 Component :: module()) ->
114 ok | {error, not_registered}.
115 remove_iq_handler_for_subdomain(HostType, SubdomainPattern, Namespace, Component) ->
116 150 case mongoose_lazy_routing:unregister_iq_handler_for_subdomain(
117 HostType, SubdomainPattern, Namespace, Component) of
118 {ok, IQHandler} ->
119 150 mongoose_iq_handler:delete(IQHandler);
120
:-(
{error, not_found} -> {error, not_registered}
121 end.
122
123 %%--------------------------------------------------------------------
124 %%% Internal functions
125 %%--------------------------------------------------------------------
126 -spec make_iq_handler_fn(module(), atom()) -> mongoose_iq_handler:handler_fn().
127 make_iq_handler_fn(Module, Function) ->
128 %TODO: remove this function with removal of the old API
129 56 fun(Acc, From, To, IQ, _Extra) ->
130 167 Module:Function(From, To, Acc, IQ)
131 end.
Line Hits Source