Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2003-01-22 23:40:40 +0300
committerAlexey Shchepin <alexey@process-one.net>2003-01-22 23:40:40 +0300
commitdcfaa68b7d80feae550168eca252e485acbd6974 (patch)
tree7ec4e25c8a76cfe1c01217bd410abaa5bdf6e254
parentf0427ecab55b393cdc368c6f8b2bb0ae2d8cf07c (diff)
*** empty log message ***
SVN Revision: 47
-rw-r--r--src/.cvsignore1
-rw-r--r--src/ejabberd.cfg13
-rw-r--r--src/ejabberd.erl12
-rw-r--r--src/ejabberd_local.erl36
-rw-r--r--src/ejabberd_sm.erl12
-rw-r--r--src/gen_iq_handler.erl74
-rw-r--r--src/mod_configure.erl50
-rw-r--r--src/mod_disco.erl41
-rw-r--r--src/mod_private.erl7
-rw-r--r--src/mod_register.erl9
-rw-r--r--src/mod_roster.erl44
-rw-r--r--src/mod_stats.erl7
-rw-r--r--src/mod_time.erl11
-rw-r--r--src/mod_vcard.erl12
-rw-r--r--src/mod_version.erl9
15 files changed, 241 insertions, 97 deletions
diff --git a/src/.cvsignore b/src/.cvsignore
new file mode 100644
index 000000000..17278c08c
--- /dev/null
+++ b/src/.cvsignore
@@ -0,0 +1 @@
+*.beam
diff --git a/src/ejabberd.cfg b/src/ejabberd.cfg
index 464a1f7a1..cfc1a8b55 100644
--- a/src/ejabberd.cfg
+++ b/src/ejabberd.cfg
@@ -21,6 +21,19 @@
{8888, ejabberd_service, start, ["asd.e.localhost", "asdqwe"]}
]}.
+{modules, [
+ {mod_register, [one_queue]},
+ {mod_roster, [one_queue]},
+ {mod_configure, [one_queue]},
+ {mod_disco, [one_queue]},
+ {mod_stats, [one_queue]},
+ {mod_vcard, [one_queue]},
+ {mod_offline, []},
+ {mod_echo, []},
+ {mod_private, [one_queue]},
+ {mod_time, [one_queue]},
+ {mod_version, [one_queue]}
+ ]}.
diff --git a/src/ejabberd.erl b/src/ejabberd.erl
index 0e4f50954..be9deb6a3 100644
--- a/src/ejabberd.erl
+++ b/src/ejabberd.erl
@@ -35,6 +35,7 @@ init() ->
ejabberd_s2s:start(),
ejabberd_local:start(),
ejabberd_listener:start(),
+ load_modules(),
loop(Port).
@@ -53,3 +54,14 @@ db_init() ->
end,
mnesia:start(),
mnesia:wait_for_tables(mnesia:system_info(local_tables), infinity).
+
+load_modules() ->
+ case ejabberd_config:get_local_option(modules) of
+ undefined ->
+ ok;
+ Modules ->
+ lists:foreach(fun({Module, Args}) ->
+ apply(Module, start, Args)
+ end, Modules)
+ end.
+
diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl
index ddae487be..88cea3354 100644
--- a/src/ejabberd_local.erl
+++ b/src/ejabberd_local.erl
@@ -12,7 +12,8 @@
-export([start/0, init/0]).
--export([register_iq_handler/3]).
+-export([register_iq_handler/3,
+ register_iq_handler/4]).
-include("ejabberd.hrl").
@@ -20,17 +21,17 @@
start() ->
register(ejabberd_local, spawn(ejabberd_local, init, [])),
- mod_register:start(),
- mod_roster:start(),
- mod_configure:start(),
- mod_disco:start(),
- mod_stats:start(),
- mod_vcard:start(),
- mod_offline:start(),
- mod_echo:start(),
- mod_private:start(),
- mod_time:start(),
- mod_version:start(),
+ %mod_register:start(one_queue),
+ %mod_roster:start(one_queue),
+ %mod_configure:start(one_queue),
+ %mod_disco:start(one_queue),
+ %mod_stats:start(one_queue),
+ %mod_vcard:start(one_queue),
+ %mod_offline:start(),
+ %mod_echo:start(),
+ %mod_private:start(one_queue),
+ %mod_time:start(one_queue),
+ %mod_version:start(one_queue),
ok.
init() ->
@@ -47,6 +48,10 @@ loop(State) ->
{register_iq_handler, XMLNS, Module, Function} ->
ets:insert(State#state.iqtable, {XMLNS, Module, Function}),
mod_disco:register_feature(XMLNS),
+ loop(State);
+ {register_iq_handler, XMLNS, Module, Function, Opts} ->
+ ets:insert(State#state.iqtable, {XMLNS, Module, Function, Opts}),
+ mod_disco:register_feature(XMLNS),
loop(State)
end.
@@ -82,7 +87,6 @@ process_iq(State, From, To, Packet) ->
{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]),
@@ -95,6 +99,9 @@ process_iq(State, From, To, Packet) ->
true ->
ok
end;
+ [{_, Module, Function, Opts}] ->
+ gen_iq_handler:handle(Module, Function, Opts,
+ From, To, IQ);
[] ->
Err = jlib:make_error_reply(
Packet, "501", "Not Implemented"),
@@ -118,3 +125,6 @@ process_iq(State, From, To, Packet) ->
register_iq_handler(XMLNS, Module, Fun) ->
ejabberd_local ! {register_iq_handler, XMLNS, Module, Fun}.
+
+register_iq_handler(XMLNS, Module, Fun, Opts) ->
+ ejabberd_local ! {register_iq_handler, XMLNS, Module, Fun, Opts}.
diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl
index 9e74177ea..a6c5efa0a 100644
--- a/src/ejabberd_sm.erl
+++ b/src/ejabberd_sm.erl
@@ -16,7 +16,8 @@
unset_presence/2,
dirty_get_sessions_list/0,
dirty_get_my_sessions_list/0,
- register_iq_handler/3]).
+ register_iq_handler/3,
+ register_iq_handler/4]).
-include_lib("mnemosyne/include/mnemosyne.hrl").
-include("ejabberd.hrl").
@@ -73,6 +74,9 @@ loop() ->
{register_iq_handler, XMLNS, Module, Function} ->
ets:insert(sm_iqtable, {XMLNS, Module, Function}),
loop();
+ {register_iq_handler, XMLNS, Module, Function, Opts} ->
+ ets:insert(sm_iqtable, {XMLNS, Module, Function, Opts}),
+ loop();
_ ->
loop()
end.
@@ -363,6 +367,9 @@ process_iq(From, To, Packet) ->
true ->
ok
end;
+ [{_, Module, Function, Opts}] ->
+ gen_iq_handler:handle(Module, Function, Opts,
+ From, To, IQ);
[] ->
Err = jlib:make_error_reply(
Packet, "501", "Not Implemented"),
@@ -379,3 +386,6 @@ process_iq(From, To, Packet) ->
register_iq_handler(XMLNS, Module, Fun) ->
ejabberd_sm ! {register_iq_handler, XMLNS, Module, Fun}.
+register_iq_handler(XMLNS, Module, Fun, Opts) ->
+ ejabberd_sm ! {register_iq_handler, XMLNS, Module, Fun, Opts}.
+
diff --git a/src/gen_iq_handler.erl b/src/gen_iq_handler.erl
new file mode 100644
index 000000000..614061085
--- /dev/null
+++ b/src/gen_iq_handler.erl
@@ -0,0 +1,74 @@
+%%%----------------------------------------------------------------------
+%%% File : gen_iq_handler.erl
+%%% Author : Alexey Shchepin <alexey@sevcom.net>
+%%% Purpose :
+%%% Created : 22 Jan 2003 by Alexey Shchepin <alexey@sevcom.net>
+%%% Id : $Id$
+%%%----------------------------------------------------------------------
+
+-module(gen_iq_handler).
+-author('alexey@sevcom.net').
+-vsn('$Revision$ ').
+
+-export([start/0,
+ add_iq_handler/5,
+ handle/6,
+ process_iq/5,
+ queue_init/2]).
+
+-include("ejabberd.hrl").
+
+start() ->
+ ok.
+
+add_iq_handler(Component, NS, Module, Function, Type) ->
+ case Type of
+ no_queue ->
+ Component:register_iq_handler(NS, Module, Function, no_queue);
+ one_queue ->
+ Pid = spawn(?MODULE, queue_init, [Module, Function]),
+ Component:register_iq_handler(NS, Module, Function,
+ {one_queue, Pid});
+ parallel ->
+ Component:register_iq_handler(NS, Module, Function, parallel)
+ end.
+
+handle(Module, Function, Opts, From, To, IQ) ->
+ case Opts of
+ no_queue ->
+ process_iq(Module, Function, From, To, IQ);
+ {one_queue, Pid} ->
+ Pid ! {process_iq, From, To, IQ};
+ parallel ->
+ spawn(?MODULE, process_iq, [Module, Function, From, To, IQ]);
+ _ ->
+ todo
+ end.
+
+
+process_iq(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
+ end.
+
+queue_init(Module, Function) ->
+ queue_loop(Module, Function).
+
+% TODO: use gen_event
+queue_loop(Module, Function) ->
+ receive
+ {process_iq, From, To, IQ} ->
+ process_iq(Module, Function, From, To, IQ),
+ queue_loop(Module, Function);
+ _ ->
+ queue_loop(Module, Function)
+ end.
diff --git a/src/mod_configure.erl b/src/mod_configure.erl
index 5ae67513f..2567c9963 100644
--- a/src/mod_configure.erl
+++ b/src/mod_configure.erl
@@ -10,7 +10,7 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
--export([start/0,
+-export([start/1,
process_local_iq/3,
process_sm_iq/3]).
@@ -18,11 +18,11 @@
-include("namespaces.hrl").
-start() ->
- ejabberd_local:register_iq_handler(?NS_XDATA,
- ?MODULE, process_local_iq),
- ejabberd_sm:register_iq_handler(?NS_XDATA,
- ?MODULE, process_sm_iq),
+start(Type) ->
+ gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_XDATA,
+ ?MODULE, process_local_iq, Type),
+ gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_XDATA,
+ ?MODULE, process_sm_iq, Type),
ok.
@@ -163,7 +163,7 @@ get_form(["config", "hostname"], Lang) ->
{result, [{xmlelement, "title", [],
[{xmlcdata,
translate:translate(
- Lang, "DB Tables Configuration")}]},
+ Lang, "Hostname Configuration")}]},
{xmlelement, "instructions", [],
[{xmlcdata,
translate:translate(
@@ -175,6 +175,30 @@ get_form(["config", "hostname"], Lang) ->
[{xmlelement, "value", [], [{xmlcdata, ?MYNAME}]}]}
]};
+get_form(["config", "acls"], Lang) ->
+ {result, [{xmlelement, "title", [],
+ [{xmlcdata,
+ translate:translate(
+ Lang, "ACLs Configuration")}]},
+ %{xmlelement, "instructions", [],
+ % [{xmlcdata,
+ % translate:translate(
+ % Lang, "")}]},
+ {xmlelement, "field", [{"type", "text-multi"},
+ {"label",
+ translate:translate(Lang, "ACLs")},
+ {"var", "acls"}],
+ lists:map(fun(S) ->
+ {xmlelement, "value", [], [{xmlcdata, S}]}
+ end,
+ string:tokens(
+ lists:flatten(io_lib:format("~p",
+ [ets:tab2list(acls)])),
+ "\n"))
+ %{xmlelement, "value", [], [{xmlcdata, ?MYNAME}]}
+ }
+ ]};
+
get_form(_, Lang) ->
{error, "503", "Service Unavailable"}.
@@ -324,6 +348,18 @@ get_sm_form(User, [], Lang) ->
% [{xmlcdata,
% translate:translate(
% Lang, "Choose host name")}]},
+ {xmlelement, "field",
+ [{"type", "list-single"},
+ {"label", translate:translate(Lang, "Action on user")},
+ {"var", "action"}],
+ [{xmlelement, "value", [], [{xmlcdata, "edit"}]},
+ {xmlelement, "option",
+ [{"label", translate:translate(Lang, "Edit Properties")}],
+ [{xmlelement, "value", [], [{xmlcdata, "edit"}]}]},
+ {xmlelement, "option",
+ [{"label", translate:translate(Lang, "Remove User")}],
+ [{xmlelement, "value", [], [{xmlcdata, "remove"}]}]}
+ ]},
?XFIELD("text-private", "Password", "password",
ejabberd_auth:get_password_s(User))
%{xmlelement, "field", [{"type", "text-single"},
diff --git a/src/mod_disco.erl b/src/mod_disco.erl
index b0574d31a..141feaf1d 100644
--- a/src/mod_disco.erl
+++ b/src/mod_disco.erl
@@ -10,7 +10,7 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
--export([start/0, init/0,
+-export([start/1,
process_local_iq_items/3,
process_local_iq_info/3,
process_sm_iq_items/3,
@@ -24,23 +24,28 @@
{iq, ID, result, XMLNS, [{xmlelement, "query",
[{"xmlns", ?NS_DISCO_INFO}], []}]}).
-start() ->
- ejabberd_local:register_iq_handler(?NS_DISCO_ITEMS,
- ?MODULE, process_local_iq_items),
- ejabberd_local:register_iq_handler(?NS_DISCO_INFO,
- ?MODULE, process_local_iq_info),
- ejabberd_sm:register_iq_handler(?NS_DISCO_ITEMS,
- ?MODULE, process_sm_iq_items),
- ejabberd_sm:register_iq_handler(?NS_DISCO_INFO,
- ?MODULE, process_sm_iq_info),
+start(Type) ->
+ gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_DISCO_ITEMS,
+ ?MODULE, process_local_iq_items, Type),
+ gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_DISCO_INFO,
+ ?MODULE, process_local_iq_info, Type),
+ gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_DISCO_ITEMS,
+ ?MODULE, process_sm_iq_items, Type),
+ gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_DISCO_INFO,
+ ?MODULE, process_sm_iq_info, Type),
+ %ejabberd_local:register_iq_handler(?NS_DISCO_ITEMS,
+ % ?MODULE, process_local_iq_items),
+ %ejabberd_local:register_iq_handler(?NS_DISCO_INFO,
+ % ?MODULE, process_local_iq_info),
+ %ejabberd_sm:register_iq_handler(?NS_DISCO_ITEMS,
+ % ?MODULE, process_sm_iq_items),
+ %ejabberd_sm:register_iq_handler(?NS_DISCO_INFO,
+ % ?MODULE, process_sm_iq_info),
register_feature("iq"),
register_feature("presence"),
register_feature("presence-invisible"),
ok.
-init() ->
- ok.
-
register_feature(Feature) ->
catch ets:new(disco_features, [named_table, ordered_set, public]),
ets:insert(disco_features, {Feature}).
@@ -157,9 +162,10 @@ get_local_items([], Server, Lang) ->
get_local_items(["config"], Server, Lang) ->
{result,
- [?NODE("Host Name", "config/hostname"),
- ?NODE("ACLs", "config/acls"),
- ?NODE("Access Rules", "config/access")
+ [?NODE("Host Name", "config/hostname"),
+ ?NODE("ACLs", "config/acls"),
+ ?NODE("Access Rules", "config/access"),
+ ?NODE("Loaded Modules", "config/modules")
]};
get_local_items(["config", _], Server, Lang) ->
@@ -174,6 +180,9 @@ get_local_items(["all users"], Server, Lang) ->
get_local_items(["outgoing s2s"], Server, Lang) ->
{result, get_outgoing_s2s(Lang)};
+get_local_items(["outgoing s2s", To], Server, Lang) ->
+ {result, get_outgoing_s2s(Lang, To)};
+
get_local_items(["running nodes"], Server, Lang) ->
{result, get_running_nodes(Lang)};
diff --git a/src/mod_private.erl b/src/mod_private.erl
index 4f8164c12..1ed49f3db 100644
--- a/src/mod_private.erl
+++ b/src/mod_private.erl
@@ -10,7 +10,7 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
--export([start/0,
+-export([start/1,
process_local_iq/3]).
-include("ejabberd.hrl").
@@ -18,11 +18,12 @@
-record(private_storage, {userns, xml}).
-start() ->
+start(Type) ->
mnesia:create_table(private_storage,
[{disc_only_copies, [node()]},
{attributes, record_info(fields, private_storage)}]),
- ejabberd_local:register_iq_handler(?NS_PRIVATE, ?MODULE, process_local_iq).
+ gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_PRIVATE,
+ ?MODULE, process_local_iq, Type).
process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
diff --git a/src/mod_register.erl b/src/mod_register.erl
index 3901f58fb..247b76b71 100644
--- a/src/mod_register.erl
+++ b/src/mod_register.erl
@@ -10,13 +10,14 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
--export([start/0, init/0, process_iq/3]).
+-export([start/1, init/0, process_iq/3]).
-include("ejabberd.hrl").
+-include("namespaces.hrl").
-start() ->
- ejabberd_local:register_iq_handler("jabber:iq:register",
- ?MODULE, process_iq),
+start(Type) ->
+ gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_REGISTER,
+ ?MODULE, process_iq, Type),
ok.
init() ->
diff --git a/src/mod_roster.erl b/src/mod_roster.erl
index 213c46554..56df1bc48 100644
--- a/src/mod_roster.erl
+++ b/src/mod_roster.erl
@@ -12,8 +12,9 @@
-export([]).
--export([start/0, init/0,
+-export([start/1,
process_iq/3,
+ process_local_iq/3,
get_subscription_lists/1,
in_subscription/3,
out_subscription/3]).
@@ -32,40 +33,19 @@
xattrs = [],
xs = []}).
--define(ME, ejabberd_mod_roster).
-
-start() ->
- register(?ME, spawn(mod_roster, init, [])).
-
-init() ->
+start(Type) ->
mnesia:create_table(roster,[{disc_copies, [node()]},
{attributes, record_info(fields, roster)}]),
mnesia:add_table_index(roster, user),
- ejabberd_local:register_iq_handler(?NS_ROSTER,
- ?MODULE, process_iq),
- loop().
+ gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_ROSTER,
+ ?MODULE, process_local_iq, Type).
-loop() ->
- receive
- {process_iq, From, To, {iq, ID, Type, XMLNS, SubEl}} ->
- case Type of
- set ->
- ResIQ = process_iq_set(From, To,
- {iq, ID, Type, XMLNS, SubEl}),
- ejabberd_router ! {route,
- To,
- From,
- jlib:iq_to_xml(ResIQ)},
- loop();
- get ->
- ResIQ = process_iq_get(From, To,
- {iq, ID, Type, XMLNS, SubEl}),
- ejabberd_router ! {route,
- To,
- From,
- jlib:iq_to_xml(ResIQ)},
- loop()
- end
+process_local_iq(From, To, {iq, _, Type, _, _} = IQ) ->
+ case Type of
+ set ->
+ process_iq_set(From, To, IQ);
+ get ->
+ process_iq_get(From, To, IQ)
end.
@@ -75,7 +55,7 @@ process_iq(From, To, IQ) ->
{_, Server, _} = From,
case ?MYNAME of
Server ->
- ?ME ! {process_iq, From, To, IQ},
+ process_local_iq(From, To, IQ),
ignore;
_ ->
{iq, ID, error, XMLNS,
diff --git a/src/mod_stats.erl b/src/mod_stats.erl
index 3eff2621a..a6f4eb62d 100644
--- a/src/mod_stats.erl
+++ b/src/mod_stats.erl
@@ -10,13 +10,14 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
--export([start/0,
+-export([start/1,
process_local_iq/3]).
-include("namespaces.hrl").
-start() ->
- ejabberd_local:register_iq_handler(?NS_STATS, ?MODULE, process_local_iq).
+start(Type) ->
+ gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_STATS,
+ ?MODULE, process_local_iq, Type).
process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
diff --git a/src/mod_time.erl b/src/mod_time.erl
index 2820f6203..d2a6459d5 100644
--- a/src/mod_time.erl
+++ b/src/mod_time.erl
@@ -10,19 +10,16 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
--export([start/0,
+-export([start/1,
process_local_iq/3]).
-include("ejabberd.hrl").
-include("namespaces.hrl").
-
-
-start() ->
- ejabberd_local:register_iq_handler(?NS_TIME,
- ?MODULE, process_local_iq).
-
+start(Type) ->
+ gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_TIME,
+ ?MODULE, process_local_iq, Type).
process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl
index 91f8904c2..f35302e46 100644
--- a/src/mod_vcard.erl
+++ b/src/mod_vcard.erl
@@ -10,7 +10,7 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
--export([start/0, init/0,
+-export([start/1, init/0,
process_local_iq/3,
process_sm_iq/3,
reindex_vcards/0]).
@@ -35,7 +35,7 @@
-record(vcard, {user, vcard}).
-start() ->
+start(Type) ->
mnesia:create_table(vcard, [{disc_only_copies, [node()]},
{attributes, record_info(fields, vcard)}]),
mnesia:create_table(vcard_search,
@@ -53,10 +53,10 @@ start() ->
mnesia:add_table_index(vcard_search, lorgname),
mnesia:add_table_index(vcard_search, lorgunit),
- ejabberd_local:register_iq_handler(?NS_VCARD,
- ?MODULE, process_local_iq),
- ejabberd_sm:register_iq_handler(?NS_VCARD,
- ?MODULE, process_sm_iq),
+ gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_VCARD,
+ ?MODULE, process_local_iq, Type),
+ gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_VCARD,
+ ?MODULE, process_sm_iq, Type),
spawn(?MODULE, init, []).
diff --git a/src/mod_version.erl b/src/mod_version.erl
index c79b5fbbe..73b32b95c 100644
--- a/src/mod_version.erl
+++ b/src/mod_version.erl
@@ -10,7 +10,7 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
--export([start/0,
+-export([start/1,
process_local_iq/3]).
-include("ejabberd.hrl").
@@ -18,10 +18,9 @@
-
-start() ->
- ejabberd_local:register_iq_handler(?NS_VERSION,
- ?MODULE, process_local_iq).
+start(Type) ->
+ gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_VERSION,
+ ?MODULE, process_local_iq, Type).