aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny van Heumen <danny@dannyvanheumen.nl>2014-11-02 20:10:55 +0100
committerDanny van Heumen <danny@dannyvanheumen.nl>2014-11-02 20:10:55 +0100
commit8ce2fb8ca5e956d73f7773e0f7b5dece804c53ad (patch)
tree6434f63424e2a4a9204806d770de0c1b5c4551f4
parent29a35dac747c26f8693c49408f943f9fd84106aa (diff)
downloadjitsi-8ce2fb8ca5e956d73f7773e0f7b5dece804c53ad.zip
jitsi-8ce2fb8ca5e956d73f7773e0f7b5dece804c53ad.tar.gz
jitsi-8ce2fb8ca5e956d73f7773e0f7b5dece804c53ad.tar.bz2
Fixed bad equality check between source chat room contact instance and chat
room instance. This fails specifically when having, for example, 2 chat rooms with the same name but for different accounts. Matching was done solely on chat room name and as a consequence it changed/deleted the wrong contact list entry.
-rw-r--r--src/net/java/sip/communicator/impl/muc/ChatRoomQuery.java53
1 files changed, 34 insertions, 19 deletions
diff --git a/src/net/java/sip/communicator/impl/muc/ChatRoomQuery.java b/src/net/java/sip/communicator/impl/muc/ChatRoomQuery.java
index 03b48da..0ec3187 100644
--- a/src/net/java/sip/communicator/impl/muc/ChatRoomQuery.java
+++ b/src/net/java/sip/communicator/impl/muc/ChatRoomQuery.java
@@ -8,13 +8,13 @@ package net.java.sip.communicator.impl.muc;
import java.util.*;
import java.util.regex.*;
-import org.osgi.framework.*;
-
import net.java.sip.communicator.service.contactsource.*;
import net.java.sip.communicator.service.muc.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.event.*;
+import org.osgi.framework.*;
+
/**
* The <tt>ChatRoomQuery</tt> is a query over the
* <tt>ChatRoomContactSourceService</tt>.
@@ -165,16 +165,16 @@ public class ChatRoomQuery
LocalUserChatRoomPresenceChangeEvent evt)
{
ChatRoom sourceChatRoom = evt.getChatRoom();
-
+
String eventType = evt.getEventType();
-
+
boolean existingContact = false;
ChatRoomSourceContact foundContact = null;
synchronized (contactResults)
{
- for(ChatRoomSourceContact contact : contactResults)
+ for (ChatRoomSourceContact contact : contactResults)
{
- if(contact.getContactAddress().equals(sourceChatRoom.getName()))
+ if (contactEqualsChatRoom(contact, sourceChatRoom))
{
existingContact = true;
foundContact = contact;
@@ -306,27 +306,26 @@ public class ChatRoomQuery
* @param evt the event that describes the change.
*/
@Override
- public void contentChanged(ChatRoomListChangeEvent evt)
+ public void contentChanged(final ChatRoomListChangeEvent evt)
{
ChatRoomWrapper chatRoom = evt.getSourceChatRoom();
- switch(evt.getEventID())
+ switch (evt.getEventID())
{
case ChatRoomListChangeEvent.CHAT_ROOM_ADDED:
- addChatRoom(chatRoom.getChatRoom(), false,
+ addChatRoom(chatRoom.getChatRoom(), false,
chatRoom.isAutojoin());
break;
case ChatRoomListChangeEvent.CHAT_ROOM_REMOVED:
LinkedList<ChatRoomSourceContact> tmpContactResults;
synchronized (contactResults)
{
- tmpContactResults
+ tmpContactResults
= new LinkedList<ChatRoomSourceContact>(contactResults);
-
-
- for(ChatRoomSourceContact contact : tmpContactResults)
+
+ for (ChatRoomSourceContact contact : tmpContactResults)
{
- if(contact.getContactAddress().equals(
- chatRoom.getChatRoomName()))
+ if (contactEqualsChatRoom(contact,
+ chatRoom.getChatRoom()))
{
contactResults.remove(contact);
fireContactRemoved(contact);
@@ -338,12 +337,12 @@ public class ChatRoomQuery
case ChatRoomListChangeEvent.CHAT_ROOM_CHANGED:
synchronized (contactResults)
{
- for(ChatRoomSourceContact contact : contactResults)
+ for (ChatRoomSourceContact contact : contactResults)
{
- if(contact.getContactAddress().equals(
- chatRoom.getChatRoomName()))
+ if (contactEqualsChatRoom(contact,
+ chatRoom.getChatRoom()))
{
- if(chatRoom.isAutojoin() != contact.isAutoJoin())
+ if (chatRoom.isAutojoin() != contact.isAutoJoin())
{
contact.setAutoJoin(chatRoom.isAutojoin());
fireContactChanged(contact);
@@ -385,6 +384,22 @@ public class ChatRoomQuery
}
/**
+ * Test equality of contact to chat room. This test recognizes that chat
+ * rooms may have equal names but connected to different accounts.
+ *
+ * @param contact the contact
+ * @param chatRoom the chat room
+ * @return returns <tt>true</tt> if they are equal, or <tt>false</tt> if
+ * they are different
+ */
+ private boolean contactEqualsChatRoom(final ChatRoomSourceContact contact,
+ final ChatRoom chatRoom)
+ {
+ return contact.getProvider() == chatRoom.getParentProvider()
+ && contact.getContactAddress().equals(chatRoom.getIdentifier());
+ }
+
+ /**
* Returns the index of the contact in the contact results list.
* @param contact the contact.
* @return the index of the contact in the contact results list.