mirror of
https://github.com/vanitasvitae/Smack.git
synced 2025-09-10 17:49:38 +02:00
Adding handling of error presence packets (SMACK-260).
git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@10907 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
parent
b0614707bd
commit
b499581c7e
2 changed files with 32 additions and 4 deletions
|
@ -668,8 +668,9 @@ public class Roster {
|
|||
userPresences.put(StringUtils.parseResource(from), presence);
|
||||
// If the user is in the roster, fire an event.
|
||||
RosterEntry entry = entries.get(key);
|
||||
if (entry != null)
|
||||
if (entry != null) {
|
||||
fireRosterPresenceEvent(presence);
|
||||
}
|
||||
}
|
||||
// If an "unavailable" packet.
|
||||
else if (presence.getType() == Presence.Type.unavailable) {
|
||||
|
@ -696,8 +697,9 @@ public class Roster {
|
|||
}
|
||||
// If the user is in the roster, fire an event.
|
||||
RosterEntry entry = entries.get(key);
|
||||
if (entry != null)
|
||||
if (entry != null) {
|
||||
fireRosterPresenceEvent(presence);
|
||||
}
|
||||
}
|
||||
else if (presence.getType() == Presence.Type.subscribe) {
|
||||
if (subscriptionMode == SubscriptionMode.accept_all) {
|
||||
|
@ -725,6 +727,29 @@ public class Roster {
|
|||
}
|
||||
// Otherwise, in manual mode so ignore.
|
||||
}
|
||||
// Error presence packets from a bare JID mean we invalidate all existing
|
||||
// presence info for the user.
|
||||
else if (presence.getType() == Presence.Type.error &&
|
||||
"".equals(StringUtils.parseResource(from)))
|
||||
{
|
||||
Map<String, Presence> userPresences;
|
||||
if (!presenceMap.containsKey(key)) {
|
||||
userPresences = new ConcurrentHashMap<String, Presence>();
|
||||
presenceMap.put(key, userPresences);
|
||||
}
|
||||
else {
|
||||
userPresences = presenceMap.get(key);
|
||||
// Any other presence data is invalidated by the error packet.
|
||||
userPresences.clear();
|
||||
}
|
||||
// Set the new presence using the empty resource as a key.
|
||||
userPresences.put("", presence);
|
||||
// If the user is in the roster, fire an event.
|
||||
RosterEntry entry = entries.get(key);
|
||||
if (entry != null) {
|
||||
fireRosterPresenceEvent(presence);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -852,4 +877,4 @@ public class Roster {
|
|||
fireRosterChangedEvent(addedEntries, updatedEntries, deletedEntries);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue