ejabberd源码分析及开发系列(2) local_router模块分析

  本模块对具有目的地为本服务器的消息包进行路由, 如果目的地JID有一个非空的用户部分,则将其路由到session manager, 否则将根据其内容进行处理

  下面将其对源码进行分析, 本部分的源码主要是ejabberd_local.erl文件。 

  本部分最关键的函数式do_route函数,下面对其分几个部分进行分析。

1 if To#jid.luser /= <<"">> ->
2        ejabberd_sm:route(From, To, Packet);

   首先判断该目的部分的用户是否为空,若不为空则将通过ejabberd_sm进行处理

1 To#jid.lresource == <<"">> ->
2        #xmlel{name = Name} = Packet,
3        case Name of
4          <<"iq">> -> process_iq(From, To, Packet);
5          <<"message">> -> ok;
6          <<"presence">> -> ok;
7          _ -> ok
8        end;

  然后若目的jid的资源部分为空,则根据其name判断进行处理, 若属性为iq, 则对请求进行相应的处理。

 1      true ->
 2        #xmlel{attrs = Attrs} = Packet,
 3        case xml:get_attr_s(<<"type">>, Attrs) of
 4          <<"error">> -> ok;
 5          <<"result">> -> ok;
 6          _ ->
 7          ejabberd_hooks:run(local_send_to_resource_hook,
 8                     To#jid.lserver, [From, To, Packet])
 9        end
10     end.

  最后则对资源的情况进行处理, 根据属性的类型,若为error和 result则丢弃, 否则就通过hook机制进行处理。

你可能感兴趣的:(ejabberd源码分析及开发系列(2) local_router模块分析)