diff --git a/ChangeLog b/ChangeLog index 4e6144532..0c1a114cc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,9 @@ * src/ejabberd_local.erl: Fix a bug where an error stanza was not created correctly, leading to ejabberd_c2s crash. + * src/mod_stats.erl, src/mod_service_log.erl, src/mod_time.erl: + Convert to exmpp. + 2008-10-06 Jean-Sébastien Pédron * src/ejabberd_sm.erl (process_iq/3): Fix a bug where we were matching diff --git a/src/mod_service_log.erl b/src/mod_service_log.erl index 4dd967fbb..2b360fea4 100644 --- a/src/mod_service_log.erl +++ b/src/mod_service_log.erl @@ -34,8 +34,9 @@ log_user_send/3, log_user_receive/4]). +-include_lib("exmpp/include/exmpp.hrl"). + -include("ejabberd.hrl"). --include("jlib.hrl"). start(Host, _Opts) -> ejabberd_hooks:add(user_send_packet, Host, @@ -52,26 +53,21 @@ stop(Host) -> ok. log_user_send(From, To, Packet) -> - log_packet(From, To, Packet, From#jid.lserver). + log_packet(From, To, Packet, From#jid.ldomain). log_user_receive(_JID, From, To, Packet) -> - log_packet(From, To, Packet, To#jid.lserver). + log_packet(From, To, Packet, To#jid.ldomain). -log_packet(From, To, {xmlelement, Name, Attrs, Els}, Host) -> +log_packet(From, To, Packet, Host) -> Loggers = gen_mod:get_module_opt(Host, ?MODULE, loggers, []), - ServerJID = #jid{user = "", server = Host, resource = "", - luser = "", lserver = Host, lresource = ""}, - NewAttrs = jlib:replace_from_to_attrs(jlib:jid_to_string(From), - jlib:jid_to_string(To), - Attrs), - FixedPacket = {xmlelement, Name, NewAttrs, Els}, + ServerJID = #jid{domain = Host, ldomain = Host}, + FixedPacket = exmpp_stanza:set_jids(Packet, From, To), lists:foreach( fun(Logger) -> ejabberd_router:route( ServerJID, - #jid{user = "", server = Logger, resource = "", - luser = "", lserver = Logger, lresource = ""}, - {xmlelement, "route", [], [FixedPacket]}) + #jid{domain = Logger, ldomain = Logger}, + #xmlel{name = 'route', children = [FixedPacket]}) end, Loggers). diff --git a/src/mod_stats.erl b/src/mod_stats.erl index 234c7106e..f5910ea8a 100644 --- a/src/mod_stats.erl +++ b/src/mod_stats.erl @@ -33,7 +33,7 @@ stop/1, process_local_iq/3]). --include("jlib.hrl"). +-include_lib("exmpp/include/exmpp.hrl"). start(Host, Opts) -> IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), @@ -44,33 +44,26 @@ stop(Host) -> gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_STATS). -process_local_iq(_From, To, #iq{id = _ID, type = Type, - xmlns = XMLNS, sub_el = SubEl} = IQ) -> - %%Lang = xml:get_tag_attr_s("xml:lang", SubEl), - case Type of - set -> - IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}; - get -> - {xmlelement, _, _Attrs, Els} = SubEl, - Node = string:tokens(xml:get_tag_attr_s("node", SubEl), "/"), - Names = get_names(Els, []), +process_local_iq(_From, To, #iq{type = get, + ns = XMLNS, payload = SubEl} = IQ_Rec) -> + Node = string:tokens(exmpp_xml:get_attribute(SubEl, 'node', ""), "/"), + Names = get_names(exmpp_xml:get_child_elements(SubEl), []), - case get_local_stats(To#jid.server, Node, Names) of - {result, Res} -> - IQ#iq{type = result, - sub_el = [{xmlelement, "query", - [{"xmlns", XMLNS}], - Res}]}; - {error, Error} -> - IQ#iq{type = error, sub_el = [SubEl, Error]} - end - end. + case get_local_stats(To#jid.domain, Node, Names) of + {result, Res} -> + Result = #xmlel{ns = XMLNS, name = 'query', children = Res}, + exmpp_iq:result(IQ_Rec, Result); + {error, Error} -> + exmpp_iq:error(IQ_Rec, Error) + end; +process_local_iq(_From, _To, #iq{type = set} = IQ_Rec) -> + exmpp_iq:error(IQ_Rec, 'not-allowed'). get_names([], Res) -> Res; -get_names([{xmlelement, "stat", Attrs, _} | Els], Res) -> - Name = xml:get_attr_s("name", Attrs), +get_names([#xmlel{name = 'stat', attrs = Attrs} | Els], Res) -> + Name = exmpp_xml:get_attribute_from_list(Attrs, 'name', ""), case Name of "" -> get_names(Els, Res); @@ -81,7 +74,7 @@ get_names([_ | Els], Res) -> get_names(Els, Res). --define(STAT(Name), {xmlelement, "stat", [{"name", Name}], []}). +-define(STAT(Name), #xmlel{ns = ?NS_STATS, name = 'stat', attrs = [#xmlattr{name = 'name', value = Name}]}). get_local_stats(_Server, [], []) -> {result, @@ -110,30 +103,30 @@ get_local_stats(_Server, ["running nodes", _], []) -> get_local_stats(_Server, ["running nodes", ENode], Names) -> case search_running_node(ENode) of false -> - {error, ?ERR_ITEM_NOT_FOUND}; + {error, 'item-not-found'}; Node -> {result, lists:map(fun(Name) -> get_node_stat(Node, Name) end, Names)} end; get_local_stats(_Server, _, _) -> - {error, ?ERR_FEATURE_NOT_IMPLEMENTED}. + {error, 'feature-not-implemented'}. -define(STATVAL(Val, Unit), - {xmlelement, "stat", - [{"name", Name}, - {"units", Unit}, - {"value", Val} - ], []}). + #xmlel{ns = ?NS_STATS, name = 'stat', attrs = + [#xmlattr{name = 'name', value = Name}, + #xmlattr{name = 'units', value = Unit}, + #xmlattr{name = 'value', value = Val} + ]}). -define(STATERR(Code, Desc), - {xmlelement, "stat", - [{"name", Name}], - [{xmlelement, "error", - [{"code", Code}], - [{xmlcdata, Desc}]}]}). + #xmlel{ns = ?NS_STATS, name = 'stat', attrs= + [#xmlattr{name = 'name', value = Name}], children = + [#xmlel{ns = ?NS_STATS, name = 'error', attrs = + [#xmlattr{name = 'code', value = Code}], children = + [#xmlcdata{cdata = list_to_binary(Desc)}]}]}). get_local_stat(Server, [], Name) when Name == "users/online" -> diff --git a/src/mod_time.erl b/src/mod_time.erl index 0bc72e599..c8cdaff63 100644 --- a/src/mod_time.erl +++ b/src/mod_time.erl @@ -33,8 +33,9 @@ stop/1, process_local_iq/3]). +-include_lib("exmpp/include/exmpp.hrl"). + -include("ejabberd.hrl"). --include("jlib.hrl"). start(Host, Opts) -> @@ -45,17 +46,15 @@ start(Host, Opts) -> stop(Host) -> gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_TIME). -process_local_iq(_From, _To, #iq{type = Type, sub_el = SubEl} = IQ) -> - case Type of - set -> - IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}; - get -> - UTC = jlib:timestamp_to_iso(calendar:universal_time()), - IQ#iq{type = result, - sub_el = [{xmlelement, "query", - [{"xmlns", ?NS_TIME}], - [{xmlelement, "utc", [], - [{xmlcdata, UTC}]}]}]} - end. +process_local_iq(_From, _To, #iq{type = get} = IQ_Rec) -> + UTC = jlib:timestamp_to_iso(calendar:universal_time()), + Result = #xmlel{ns = ?NS_TIME, name = 'query', children = [ + #xmlel{ns = ?NS_TIME, name = 'utc', children = [ + #xmlcdata{cdata = list_to_binary(UTC)} + ]} + ]}, + exmpp_iq:result(IQ_Rec, Result); +process_local_iq(_From, _To, #iq{type = set} = IQ_Rec) -> + exmpp_iq:error(IQ_Rec, 'not-allowed').