aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2014-12-07 16:27:51 +0100
committerHolger Weiss <holger@zedat.fu-berlin.de>2014-12-07 16:27:51 +0100
commita78a0a65feff917784c8be39da448b95fa4407fa (patch)
tree707acab50bb705512c47ceaa9a1c4e99ce83be37 /src
parentXEP-0198: Add timestamp to resent stanzas (diff)
Let CSI code add timestamp at later point in time
As a small optimization, make sure we won't add timestamps to presence stanzas which end up being thrown away by the CSI code.
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_c2s.erl30
1 files changed, 17 insertions, 13 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 20695a7e0..c762fc0e1 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -3058,32 +3058,36 @@ csi_filter_stanza(#state{csi_state = CsiState, jid = JID} = StateData,
StateData2#state{csi_state = CsiState}
end.
-csi_queue_add(#state{csi_queue = Queue, server = Host} = StateData, Stanza) ->
- From = xml:get_tag_attr_s(<<"from">>, Stanza),
- NewStanza = jlib:add_delay_info(Stanza, Host, now(), <<"Client Inactive">>),
+csi_queue_add(#state{csi_queue = Queue} = StateData, Stanza) ->
case length(StateData#state.csi_queue) >= csi_max_queue(StateData) of
- true -> csi_queue_add(csi_queue_flush(StateData), NewStanza);
+ true -> csi_queue_add(csi_queue_flush(StateData), Stanza);
false ->
- NewQueue = lists:keystore(From, 1, Queue, {From, NewStanza}),
+ From = xml:get_tag_attr_s(<<"from">>, Stanza),
+ NewQueue = lists:keystore(From, 1, Queue, {From, now(), Stanza}),
StateData#state{csi_queue = NewQueue}
end.
-csi_queue_send(#state{csi_queue = Queue, csi_state = CsiState} = StateData,
- From) ->
+csi_queue_send(#state{csi_queue = Queue, csi_state = CsiState, server = Host} =
+ StateData, From) ->
case lists:keytake(From, 1, Queue) of
- {value, {From, Stanza}, NewQueue} ->
+ {value, {From, Time, Stanza}, NewQueue} ->
+ NewStanza = jlib:add_delay_info(Stanza, Host, Time,
+ <<"Client Inactive">>),
NewStateData = send_stanza(StateData#state{csi_state = active},
- Stanza),
+ NewStanza),
NewStateData#state{csi_queue = NewQueue, csi_state = CsiState};
false -> StateData
end.
-csi_queue_flush(#state{csi_queue = Queue, csi_state = CsiState, jid = JID} =
- StateData) ->
+csi_queue_flush(#state{csi_queue = Queue, csi_state = CsiState, jid = JID,
+ server = Host} = StateData) ->
?DEBUG("Flushing CSI queue for ~s", [jlib:jid_to_string(JID)]),
NewStateData =
- lists:foldl(fun({_From, Stanza}, AccState) ->
- send_stanza(AccState, Stanza)
+ lists:foldl(fun({_From, Time, Stanza}, AccState) ->
+ NewStanza =
+ jlib:add_delay_info(Stanza, Host, Time,
+ <<"Client Inactive">>),
+ send_stanza(AccState, NewStanza)
end, StateData#state{csi_state = active}, Queue),
NewStateData#state{csi_queue = [], csi_state = CsiState}.