1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2024-11-26 22:12:05 +01:00

Modified RosterListener to fire more specific events when entries are added, deleted or modified. SMACK-106

git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@3032 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
Gaston Dombiak 2005-11-04 18:31:21 +00:00 committed by gato
parent 1cdefcc796
commit e5ea043798
2 changed files with 45 additions and 6 deletions

View file

@ -549,16 +549,25 @@ public class Roster {
} }
/** /**
* Fires roster changed event to roster listeners. * Fires roster changed event to roster listeners indicating that the
* specified collections of contacts have been added, updated or deleted
* from the roster.
*
* @param addedEntries the collection of address of the added contacts.
* @param updatedEntries the collection of address of the updated contacts.
* @param deletedEntries the collection of address of the deleted contacts.
*/ */
private void fireRosterChangedEvent() { private void fireRosterChangedEvent(Collection addedEntries, Collection updatedEntries,
Collection deletedEntries) {
RosterListener [] listeners = null; RosterListener [] listeners = null;
synchronized (rosterListeners) { synchronized (rosterListeners) {
listeners = new RosterListener[rosterListeners.size()]; listeners = new RosterListener[rosterListeners.size()];
rosterListeners.toArray(listeners); rosterListeners.toArray(listeners);
} }
for (int i=0; i<listeners.length; i++) { for (int i=0; i<listeners.length; i++) {
listeners[i].rosterModified(); listeners[i].entriesAdded(addedEntries);
listeners[i].entriesUpdated(updatedEntries);
listeners[i].entriesDeleted(deletedEntries);
} }
} }
@ -667,6 +676,12 @@ public class Roster {
private class RosterPacketListener implements PacketListener { private class RosterPacketListener implements PacketListener {
public void processPacket(Packet packet) { public void processPacket(Packet packet) {
// Keep a registry of the entries that were added, deleted or updated. An event
// will be fired for each affected entry
Collection addedEntries = new ArrayList();
Collection updatedEntries = new ArrayList();
Collection deletedEntries = new ArrayList();
RosterPacket rosterPacket = (RosterPacket)packet; RosterPacket rosterPacket = (RosterPacket)packet;
for (Iterator i=rosterPacket.getRosterItems(); i.hasNext(); ) { for (Iterator i=rosterPacket.getRosterItems(); i.hasNext(); ) {
RosterPacket.Item item = (RosterPacket.Item)i.next(); RosterPacket.Item item = (RosterPacket.Item)i.next();
@ -690,11 +705,15 @@ public class Roster {
String key = StringUtils.parseName(item.getUser()) + "@" + String key = StringUtils.parseName(item.getUser()) + "@" +
StringUtils.parseServer(item.getUser()); StringUtils.parseServer(item.getUser());
presenceMap.remove(key); presenceMap.remove(key);
// Keep note that an entry has been removed
deletedEntries.add(item.getUser());
} }
else { else {
// Make sure the entry is in the entry list. // Make sure the entry is in the entry list.
if (!entries.contains(entry)) { if (!entries.contains(entry)) {
entries.add(entry); entries.add(entry);
// Keep note that an entry has been added
addedEntries.add(item.getUser());
} }
else { else {
// If the entry was in then list then update its state with the new values // If the entry was in then list then update its state with the new values
@ -702,6 +721,8 @@ public class Roster {
(RosterEntry) entries.get(entries.indexOf(entry)); (RosterEntry) entries.get(entries.indexOf(entry));
existingEntry existingEntry
.updateState(entry.getName(), entry.getType(), entry.getStatus()); .updateState(entry.getName(), entry.getType(), entry.getStatus());
// Keep note that an entry has been updated
updatedEntries.add(item.getUser());
} }
// If the roster entry belongs to any groups, remove it from the // If the roster entry belongs to any groups, remove it from the
// list of unfiled entries. // list of unfiled entries.
@ -787,7 +808,7 @@ public class Roster {
} }
// Fire event for roster listeners. // Fire event for roster listeners.
fireRosterChangedEvent(); fireRosterChangedEvent(addedEntries, updatedEntries, deletedEntries);
} }
} }
} }

View file

@ -20,6 +20,8 @@
package org.jivesoftware.smack; package org.jivesoftware.smack;
import java.util.Collection;
/** /**
* A listener that is fired any time a roster is changed or the presence of * A listener that is fired any time a roster is changed or the presence of
* a user in the roster is changed. * a user in the roster is changed.
@ -29,9 +31,25 @@ package org.jivesoftware.smack;
public interface RosterListener { public interface RosterListener {
/** /**
* Called when a roster entry is added or removed. * Called when roster entries are added.
*
* @param addresses the XMPP addresses of the contacts that have been added to the roster.
*/ */
public void rosterModified(); public void entriesAdded(Collection addresses);
/**
* Called when a roster entries are updated.
*
* @param addresses the XMPP addresses of the contacts whose entries have been updated.
*/
public void entriesUpdated(Collection addresses);
/**
* Called when a roster entries are removed.
*
* @param addresses the XMPP addresses of the contacts that have been removed from the roster.
*/
public void entriesDeleted(Collection addresses);
/** /**
* Called when the presence of a roster entry is changed. * Called when the presence of a roster entry is changed.