mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-22 03:52:06 +01:00
[muc] Call userHasLeft() *after* the leave presence was sent
Calling userHasLeft before sending the leave presence may result in invalid state as the MUC presence lister may modify the MUCs local state, e.g., occupantsMap, conurrently with the leave operation. If we reset it after the leave presence was send and acknowledged, then this can not happen as the server will not longer send any MUC related presences to us. Also fixes SMACK-914. In theory52a49769f9
("[muc] Check for self-presence first in presence listener") alone would fix SMACK-914, but this also fixes it indepentendly of52a49769f9
. Both commits are sensible, so both are applied.
This commit is contained in:
parent
52a49769f9
commit
105c74b22b
1 changed files with 8 additions and 5 deletions
|
@ -789,11 +789,14 @@ public class MultiUserChat {
|
|||
|
||||
StanzaFilter reflectedLeavePresenceFilter = new AndFilter(reflectedLeavePresenceFilters);
|
||||
|
||||
// Reset occupant information first so that we are assume that we left the room even if sendStanza() would
|
||||
// throw.
|
||||
userHasLeft();
|
||||
|
||||
Presence reflectedLeavePresence = connection.createStanzaCollectorAndSend(reflectedLeavePresenceFilter, leavePresence).nextResultOrThrow();
|
||||
Presence reflectedLeavePresence;
|
||||
try {
|
||||
reflectedLeavePresence = connection.createStanzaCollectorAndSend(reflectedLeavePresenceFilter, leavePresence).nextResultOrThrow();
|
||||
} finally {
|
||||
// Reset occupant information after we send the leave presence. This ensures that we only call userHasLeft()
|
||||
// and reset the local MUC state after we successfully left the MUC (or if an exception occurred).
|
||||
userHasLeft();
|
||||
}
|
||||
|
||||
return reflectedLeavePresence;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue