24
1
mirror of https://github.com/processone/ejabberd.git synced 2024-07-14 23:44:18 +02:00

Make work with buffers more abstract

This commit is contained in:
Evgeniy Khramtsov 2011-07-27 13:14:10 +10:00
parent d4cea0f78f
commit cb41c8ef80

View File

@ -241,9 +241,10 @@ init([#body{attrs = Attrs}, IP]) ->
prebind, false) of prebind, false) of
true -> true ->
JID = make_random_jid(XMPPDomain), JID = make_random_jid(XMPPDomain),
{[], [{jid, JID} | Opts2]}; {buf_new(), [{jid, JID} | Opts2]};
false -> false ->
{[make_xmlstreamstart(XMPPDomain, XMPPVer)], {buf_in([make_xmlstreamstart(XMPPDomain, XMPPVer)],
buf_new()),
Opts2} Opts2}
end, end,
ejabberd_socket:start(ejabberd_c2s, ?MODULE, Socket, Opts), ejabberd_socket:start(ejabberd_c2s, ?MODULE, Socket, Opts),
@ -253,7 +254,7 @@ init([#body{attrs = Attrs}, IP]) ->
xmpp_ver = XMPPVer, xmpp_ver = XMPPVer,
socket = Socket, socket = Socket,
el_ibuf = InBuf, el_ibuf = InBuf,
el_obuf = [], el_obuf = buf_new(),
inactivity_timeout = Inactivity, inactivity_timeout = Inactivity,
shaper_state = ShaperState}, shaper_state = ShaperState},
NewState = restart_inactivity_timer(State), NewState = restart_inactivity_timer(State),
@ -402,9 +403,10 @@ active(#body{attrs = Attrs} = Req, From, State) ->
Pause /= undefined -> Pause /= undefined ->
State6 = drop_holding_receiver(State5), State6 = drop_holding_receiver(State5),
State7 = restart_inactivity_timer(State6, Pause), State7 = restart_inactivity_timer(State6, Pause),
InBuf = buf_in(RespEls, State7#state.el_ibuf),
{next_state, active, {next_state, active,
State7#state{prev_rid = RID, State7#state{prev_rid = RID,
el_ibuf = lists:reverse(RespEls)}}; el_ibuf = InBuf}};
RespEls == [] -> RespEls == [] ->
State6 = drop_holding_receiver(State5), State6 = drop_holding_receiver(State5),
State7 = restart_wait_timer(State6), State7 = restart_wait_timer(State6),
@ -436,17 +438,17 @@ handle_event(_Event, StateName, State) ->
handle_sync_event({send_xml, {xmlstreamstart, _, _} = El}, _From, handle_sync_event({send_xml, {xmlstreamstart, _, _} = El}, _From,
StateName, State) -> StateName, State) ->
%% Avoid sending empty <body/> element %% Avoid sending empty <body/> element
OutBuf = [El | State#state.el_obuf], OutBuf = buf_in([El], State#state.el_obuf),
{reply, ok, StateName, State#state{el_obuf = OutBuf}}; {reply, ok, StateName, State#state{el_obuf = OutBuf}};
handle_sync_event({send_xml, El}, _From, StateName, State) -> handle_sync_event({send_xml, El}, _From, StateName, State) ->
case gb_trees:lookup(State#state.prev_rid, State#state.receivers) of case gb_trees:lookup(State#state.prev_rid, State#state.receivers) of
{value, {From, Body}} -> {value, {From, Body}} ->
OutBuf = lists:reverse([El | State#state.el_obuf]), OutBuf = buf_to_list(buf_in([El], State#state.el_obuf)),
State1 = State#state{el_obuf = []}, State1 = State#state{el_obuf = buf_new()},
{reply, ok, StateName, reply(State1, Body#body{els = OutBuf}, {reply, ok, StateName, reply(State1, Body#body{els = OutBuf},
State1#state.prev_rid, From)}; State1#state.prev_rid, From)};
none -> none ->
OutBuf = [El | State#state.el_obuf], OutBuf = buf_in([El], State#state.el_obuf),
{reply, ok, StateName, State#state{el_obuf = OutBuf}} {reply, ok, StateName, State#state{el_obuf = OutBuf}}
end; end;
handle_sync_event(peername, _From, StateName, State) -> handle_sync_event(peername, _From, StateName, State) ->
@ -489,8 +491,8 @@ print_state(State) ->
%%%=================================================================== %%%===================================================================
%%% Internal functions %%% Internal functions
%%%=================================================================== %%%===================================================================
route_els(#state{el_ibuf = Els} = State) -> route_els(#state{el_ibuf = Buf} = State) ->
route_els(State#state{el_ibuf = []}, lists:reverse(Els)). route_els(State#state{el_ibuf = buf_new()}, buf_to_list(Buf)).
route_els(State, Els) -> route_els(State, Els) ->
case State#state.c2s_pid of case State#state.c2s_pid of
@ -501,15 +503,12 @@ route_els(State, Els) ->
end, Els), end, Els),
State; State;
_ -> _ ->
InBuf = lists:foldl( InBuf = buf_in(Els, State#state.el_ibuf),
fun(El, Q) ->
[El | Q]
end, State#state.el_ibuf, Els),
State#state{el_ibuf = InBuf} State#state{el_ibuf = InBuf}
end. end.
get_response_els(#state{el_obuf = OutBuf} = State) -> get_response_els(#state{el_obuf = OutBuf} = State) ->
{State#state{el_obuf = []}, lists:reverse(OutBuf)}. {State#state{el_obuf = buf_new()}, buf_to_list(OutBuf)}.
reply(State, Body, RID, From) -> reply(State, Body, RID, From) ->
State1 = restart_inactivity_timer(State), State1 = restart_inactivity_timer(State),
@ -810,6 +809,18 @@ get_attr(Attr, Attrs, Default) ->
Default Default
end. end.
buf_new() ->
[].
buf_in(Xs, Buf) ->
lists:foldl(
fun(X, Acc) ->
[X|Acc]
end, Buf, Xs).
buf_to_list(Buf) ->
lists:reverse(Buf).
cancel_timer(TRef) when is_reference(TRef) -> cancel_timer(TRef) when is_reference(TRef) ->
?GEN_FSM:cancel_timer(TRef); ?GEN_FSM:cancel_timer(TRef);
cancel_timer(_) -> cancel_timer(_) ->