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:
parent
d4cea0f78f
commit
cb41c8ef80
|
@ -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(_) ->
|
||||||
|
|
Loading…
Reference in New Issue
Block a user