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},
presence_broadcast(
StateData, From, StateData#state.pres_i, Packet)
end
- end;
+ end,
+ bounce_messages();
_ ->
ok
end,
end
end.
+bounce_messages() ->
+ receive
+ {route, From, To, El} ->
+ ejabberd_router:route(From, To, El),
+ bounce_messages()
+ after 0 ->
+ ok
+ end.
+
%%%----------------------------------------------------------------------
%%% JID Set memory footprint reduction code
%%%----------------------------------------------------------------------
get_root/1,
lookup/2,
is_empty/1,
- fold/3]).
+ fold/3,
+ from_list/1,
+ to_list/1]).
empty() ->
nil.
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.