读书人

ejabberd分析(5)+订阅/添加好友

发布时间: 2012-06-28 15:20:03 作者: rapoo

ejabberd分析(五)+订阅/添加好友

?

模块ejabberd_c2s中,状态为session_established2。

用户发送iq set 消息到服务器

<iq id="M8QF3-52" type="set"><query xmlns="jabber:iq:roster"><item jid="1555215557@kinglong" name="1555215557"><group>Friends</group></item></query></iq>

服务器端匹配到

?

?

也就是说对于那些在session_established 之后发送的消息都会交由ejabberd_sm去路由。

在ejabberd_sm中由do_route/3 来处理:

?

remove ->mnesia:delete({roster, {LUser, LServer, LJID}});
%%否则添加
_ ->mnesia:write(Item2)end,
%% If the item exist in shared roster, take the%% subscription information from there:
Item3 = ejabberd_hooks:run_fold(roster_process_item,LServer, Item2, [LServer]),
case roster_version_on_db(LServer)
oftrue -> mnesia:write(#roster_version{us = {LUser, LServer}, version = sha:sha(term_to_binary(now()))});
false -> okend,{Item, Item3}end,
case mnesia:transaction(F)
of{atomic, {OldItem, Item}} -> push_item(User, LServer, To, Item),
case Item#roster.subscription
ofremove -> send_unsubscribing_presence(From, OldItem),
ok;_ -> ok end;
E -> ?DEBUG("ROSTER: roster item set error: ~p~n", [E]), ok end end;

?


以上就是一条添加/订阅 好友的iq 消息在ejabberd 中从接收到最终写入到数据库所经过的路径。

?

?

?

?

?

?

?

?

?

 

读书人网 >开源软件

热点推荐