diff --git a/source/org/jivesoftware/smack/GroupChat.java b/source/org/jivesoftware/smack/GroupChat.java index 979950c8c..668ed8934 100644 --- a/source/org/jivesoftware/smack/GroupChat.java +++ b/source/org/jivesoftware/smack/GroupChat.java @@ -42,6 +42,7 @@ public class GroupChat { private String nickname = null; private boolean joined = false; private List participants = new ArrayList(); + private List connectionListeners = new ArrayList(); private PacketFilter presenceFilter; private PacketFilter messageFilter; @@ -249,6 +250,7 @@ public class GroupChat { */ public void addParticipantListener(PacketListener listener) { connection.addPacketListener(listener, presenceFilter); + connectionListeners.add(listener); } /** @@ -332,6 +334,7 @@ public class GroupChat { */ public void addMessageListener(PacketListener listener) { connection.addPacketListener(listener, messageFilter); + connectionListeners.add(listener); } public void finalize() throws Throwable { @@ -340,6 +343,10 @@ public class GroupChat { if (messageCollector != null) { messageCollector.cancel(); } + // Remove all the PacketListeners added to the connection by this GroupChat + for (Iterator it=connectionListeners.iterator(); it.hasNext();) { + connection.removePacketListener((PacketListener) it.next()); + } } catch (Exception e) {} } diff --git a/source/org/jivesoftware/smackx/muc/MultiUserChat.java b/source/org/jivesoftware/smackx/muc/MultiUserChat.java index d56478c88..64299966e 100644 --- a/source/org/jivesoftware/smackx/muc/MultiUserChat.java +++ b/source/org/jivesoftware/smackx/muc/MultiUserChat.java @@ -69,6 +69,7 @@ public class MultiUserChat { private PacketFilter declinesFilter; private PacketListener declinesListener; private PacketCollector messageCollector; + private List connectionListeners = new ArrayList(); static { XMPPConnection.addConnectionListener(new ConnectionEstablishedListener() { @@ -1510,6 +1511,7 @@ public class MultiUserChat { */ public void addParticipantListener(PacketListener listener) { connection.addPacketListener(listener, presenceFilter); + connectionListeners.add(listener); } /** @@ -1521,6 +1523,7 @@ public class MultiUserChat { */ public void removeParticipantListener(PacketListener listener) { connection.removePacketListener(listener); + connectionListeners.remove(listener); } /** @@ -1805,6 +1808,7 @@ public class MultiUserChat { */ public void addMessageListener(PacketListener listener) { connection.addPacketListener(listener, messageFilter); + connectionListeners.add(listener); } /** @@ -1816,6 +1820,7 @@ public class MultiUserChat { */ public void removeMessageListener(PacketListener listener) { connection.removePacketListener(listener); + connectionListeners.remove(listener); } /** @@ -2403,6 +2408,10 @@ public class MultiUserChat { connection.removePacketListener(subjectListener); connection.removePacketListener(presenceListener); connection.removePacketListener(declinesListener); + // Remove all the PacketListeners added to the connection by this chat + for (Iterator it=connectionListeners.iterator(); it.hasNext();) { + connection.removePacketListener((PacketListener) it.next()); + } } } catch (Exception e) {}