diff --git a/source/org/jivesoftware/smack/Roster.java b/source/org/jivesoftware/smack/Roster.java index 3aa989683..64f9522b9 100644 --- a/source/org/jivesoftware/smack/Roster.java +++ b/source/org/jivesoftware/smack/Roster.java @@ -68,17 +68,24 @@ public class Roster { private XMPPConnection connection; private Map groups; + private List rosterListeners; // The roster is marked as initialized when at least a single roster packet // has been recieved and processed. boolean rosterInitialized = false; + /** + * Creates a new roster. + * + * @param connection an XMPP connection. + */ Roster(final XMPPConnection connection) { this.connection = connection; groups = new HashMap(); + rosterListeners = new ArrayList(); // Listen for any roster packets. PacketFilter filter = new PacketTypeFilter(RosterPacket.class); - PacketListener rosterListener = new RosterListener(); - connection.addPacketListener(rosterListener, filter); + PacketListener rosterPacketListener = new RosterPacketListener(); + connection.addPacketListener(rosterPacketListener, filter); } /** @@ -90,6 +97,32 @@ public class Roster { connection.sendPacket(new RosterPacket()); } + /** + * Adds a listener to this roster. The listener will be fired anytime one or more + * changes to the roster are pushed from the server. + * + * @param rosterListener a roster listener. + */ + public void addRosterListner(RosterListener rosterListener) { + synchronized (rosterListeners) { + if (!rosterListeners.contains(rosterListener)) { + rosterListeners.add(rosterListener); + } + } + } + + /** + * Removes a listener from this roster. The listener will be fired anytime one or more + * changes to the roster are pushed from the server. + * + * @param rosterListener a roster listener. + */ + public void removeRosterListener(RosterListener rosterListener) { + synchronized (rosterListeners) { + rosterListeners.remove(rosterListener); + } + } + /** * Creates a new group. * @@ -157,10 +190,24 @@ public class Roster { } } + /** + * Fires roster listeners. + */ + private void fireRosterListeners() { + RosterListener [] listeners = null; + synchronized (rosterListeners) { + listeners = new RosterListener[rosterListeners.size()]; + rosterListeners.toArray(listeners); + } + for (int i=0; i