diff --git a/ChangeLog b/ChangeLog index 13c5f29f5..b4f760626 100644 --- a/ChangeLog +++ b/ChangeLog @@ -31,6 +31,8 @@ * src/ejabberd_sm.erl, src/ejabberd_c2s.erl: Don't convert before calling gen_iq_handler:handle/7. + * src/ejabberd_local.erl: Convert to exmpp. + 2008-06-30 Jean-Sébastien Pédron * src/Makefile.in: Remove the -I flag for exmpp includes; the diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl index b54173581..e86c030bc 100644 --- a/src/ejabberd_local.erl +++ b/src/ejabberd_local.erl @@ -45,8 +45,9 @@ -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). +-include_lib("exmpp/include/exmpp.hrl"). + -include("ejabberd.hrl"). --include("jlib.hrl"). -record(state, {}). @@ -54,6 +55,13 @@ -define(IQTABLE, local_iqtable). +% These are the namespace already declared by the stream opening. This is +% used at serialization time. +-define(DEFAULT_NS, ?NS_JABBER_CLIENT). +-define(PREFIXED_NS, [ + {?NS_XMPP, ?NS_XMPP_pfx}, {?NS_DIALBACK, ?NS_DIALBACK_pfx} +]). + %%==================================================================== %% API %%==================================================================== @@ -65,39 +73,51 @@ start_link() -> 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 exmpp_iq:get_kind(Packet) of + request -> + Host = To#jid.ldomain, + Request = exmpp_iq:get_request(Packet), + XMLNS = case Request#xmlel.ns of + NS when is_atom(NS) -> atom_to_list(NS); + NS -> NS + end, case ets:lookup(?IQTABLE, {XMLNS, Host}) of [{_, Module, Function}] -> - ResIQ = Module:Function(From, To, IQ), + % XXX OLD FORMAT: From, To, Packet. + FromOld = jlib:to_old_jid(From), + ToOld = jlib:to_old_jid(To), + PacketOld = exmpp_xml:xmlel_to_xmlelement(Packet, + [?DEFAULT_NS], ?PREFIXED_NS), + IQ_Rec = jlib:iq_query_info(PacketOld), + ResIQ = Module:Function(FromOld, ToOld, IQ_Rec), if ResIQ /= ignore -> + % XXX OLD FORMAT: ResIQ. + ReplyOld = jlib:iq_to_xml(ResIQ), + Reply = exmpp_xml:xmlelement_to_xmlel(ReplyOld, + [?DEFAULT_NS], ?PREFIXED_NS), ejabberd_router:route( - To, From, jlib:iq_to_xml(ResIQ)); + To, From, Reply); true -> ok end; [{_, Module, Function, Opts}] -> gen_iq_handler:handle(Host, Module, Function, Opts, - From, To, IQ); + From, To, Packet); [] -> - Err = jlib:make_error_reply( - Packet, ?ERR_FEATURE_NOT_IMPLEMENTED), + Err = exmpp_iq:error(Packet, 'feature-not-implemented'), ejabberd_router:route(To, From, Err) end; - reply -> + response -> process_iq_reply(From, To, Packet); _ -> - Err = jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST), + Err = exmpp_iq:error(Packet, 'bad-request'), ejabberd_router:route(To, From, Err), ok end. process_iq_reply(From, To, Packet) -> - IQ = jlib:iq_query_or_response_info(Packet), - #iq{id = ID} = IQ, + ID = exmpp_stanza:get_id(Packet), case catch mnesia:dirty_read(iq_response, ID) of [] -> ok; @@ -114,13 +134,24 @@ process_iq_reply(From, To, Packet) -> end, case mnesia:transaction(F) of {atomic, {Module, Function}} -> - Module:Function(From, To, IQ); + % XXX OLD FORMAT: From, To, Packet. + FromOld = jlib:to_old_jid(From), + ToOld = jlib:to_old_jid(To), + PacketOld = exmpp_xml:xmlel_to_xmlelement(Packet, + [?DEFAULT_NS], ?PREFIXED_NS), + IQ_Rec = jlib:iq_query_or_response_info(PacketOld), + Module:Function(FromOld, ToOld, IQ_Rec); _ -> ok end end. -route(From, To, Packet) -> +route(FromOld, ToOld, PacketOld) -> + % XXX OLD FORMAT: From, To, Packet. + From = jlib:from_old_jid(FromOld), + To = jlib:from_old_jid(ToOld), + Packet = exmpp_xml:xmlelement_to_xmlel(PacketOld, + [?DEFAULT_NS], ?PREFIXED_NS), case catch do_route(From, To, Packet) of {'EXIT', Reason} -> ?ERROR_MSG("~p~nwhen processing: ~p", @@ -145,7 +176,7 @@ 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 = exmpp_stanza:error(Packet, 'item-not-found'), ejabberd_router:route(To, From, Err), stop. @@ -202,7 +233,12 @@ handle_cast(_Msg, State) -> %% {stop, Reason, State} %% Description: Handling all non call/cast messages %%-------------------------------------------------------------------- -handle_info({route, From, To, Packet}, State) -> +handle_info({route, FromOld, ToOld, PacketOld}, State) -> + % XXX OLD FORMAT: From, To, Packet. + From = jlib:from_old_jid(FromOld), + To = jlib:from_old_jid(ToOld), + Packet = exmpp_xml:xmlelement_to_xmlel(PacketOld, + [?DEFAULT_NS], ?PREFIXED_NS), case catch do_route(From, To, Packet) of {'EXIT', Reason} -> ?ERROR_MSG("~p~nwhen processing: ~p", @@ -272,29 +308,32 @@ do_route(From, To, Packet) -> ?DEBUG("local route~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n", [From, To, Packet, 8]), if - To#jid.luser /= "" -> + To#jid.lnode /= undefined -> ejabberd_sm:route(From, To, Packet); - To#jid.lresource == "" -> - {xmlelement, Name, _Attrs, _Els} = Packet, - case Name of - "iq" -> + To#jid.lresource == undefined -> + case Packet of + _ when ?IS_IQ(Packet) -> process_iq(From, To, Packet); - "message" -> + _ when ?IS_MESSAGE(Packet) -> ok; - "presence" -> + _ when ?IS_PRESENCE(Packet) -> ok; _ -> ok end; true -> - {xmlelement, _Name, Attrs, _Els} = Packet, - case xml:get_attr_s("type", Attrs) of + case exmpp_stanza:get_type(Packet) of "error" -> ok; "result" -> ok; _ -> + % XXX OLD FORMAT: From, To, Packet. + FromOld = jlib:to_old_jid(From), + ToOld = jlib:to_old_jid(To), + PacketOld = exmpp_xml:xmlel_to_xmlelement(Packet, + [?DEFAULT_NS], ?PREFIXED_NS), ejabberd_hooks:run(local_send_to_resource_hook, - To#jid.lserver, - [From, To, Packet]) + To#jid.ldomain, + [FromOld, ToOld, PacketOld]) end end.