diff options
author | Holger Weiss <holger@zedat.fu-berlin.de> | 2014-12-07 16:27:51 +0100 |
---|---|---|
committer | Holger Weiss <holger@zedat.fu-berlin.de> | 2014-12-07 16:27:51 +0100 |
commit | a78a0a65feff917784c8be39da448b95fa4407fa (patch) | |
tree | 707acab50bb705512c47ceaa9a1c4e99ce83be37 /src | |
parent | XEP-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.erl | 30 |
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}. |