From d11a715eda0d2fa3c0cf4607da0ff2709620ae10 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 17 Mar 2010 23:47:13 +0900 Subject: [PATCH] - pass jid into feature_check_packet hook; - bounce messages when closing c2s session; - implemented treap:to_list/1 and treap:from_list/1 --- src/ejabberd_c2s.erl | 14 ++++++++++++-- src/treap.erl | 21 ++++++++++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index cdb769717..95260fb37 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1232,7 +1232,7 @@ handle_info({route, From, To, Packet}, StateName, StateData) -> case ejabberd_hooks:run_fold( feature_check_packet, StateData#state.server, allow, - [StateData#state.user, + [StateData#state.jid, StateData#state.server, StateData#state.pres_last, {From, To, Packet}, @@ -1340,7 +1340,8 @@ terminate(_Reason, StateName, StateData) -> presence_broadcast( StateData, From, StateData#state.pres_i, Packet) end - end; + end, + bounce_messages(); _ -> ok end, @@ -2111,3 +2112,12 @@ fsm_limit_opts(Opts) -> [] end end. + +bounce_messages() -> + receive + {route, From, To, El} -> + ejabberd_router:route(From, To, El), + bounce_messages() + after 0 -> + ok + end. diff --git a/src/treap.erl b/src/treap.erl index 61cfe7017..a5ed9b93b 100644 --- a/src/treap.erl +++ b/src/treap.erl @@ -33,7 +33,9 @@ get_root/1, lookup/2, is_empty/1, - fold/3]). + fold/3, + from_list/1, + to_list/1]). empty() -> nil. @@ -173,3 +175,20 @@ fold(F, Acc, {{_Hash, Key}, Priority, Value, Left, Right}) -> Acc1 = F({Key, Priority, Value}, Acc), Acc2 = fold(F, Acc1, Left), fold(F, Acc2, Right). + +to_list(Tree) -> + to_list(Tree, []). + +to_list(nil, Acc) -> + Acc; +to_list(Tree, Acc) -> + Root = get_root(Tree), + to_list(delete_root(Tree), [Root|Acc]). + +from_list(List) -> + from_list(List, nil). + +from_list([{Key, Priority, Value}|Tail], Tree) -> + from_list(Tail, insert(Key, Priority, Value, Tree)); +from_list([], Tree) -> + Tree.