Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/internal/provider/xmpp/XMPPContainerPresenceHelper.java')
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/internal/provider/xmpp/XMPPContainerPresenceHelper.java96
1 files changed, 69 insertions, 27 deletions
diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/internal/provider/xmpp/XMPPContainerPresenceHelper.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/internal/provider/xmpp/XMPPContainerPresenceHelper.java
index c2d44f172..9be97880c 100644
--- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/internal/provider/xmpp/XMPPContainerPresenceHelper.java
+++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/internal/provider/xmpp/XMPPContainerPresenceHelper.java
@@ -59,9 +59,9 @@ import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;
-import org.jivesoftware.smack.packet.RosterPacket;
import org.jivesoftware.smack.packet.Presence.Mode;
import org.jivesoftware.smack.packet.Presence.Type;
+import org.jivesoftware.smack.packet.RosterPacket;
import org.jivesoftware.smackx.packet.VCard;
public class XMPPContainerPresenceHelper implements ISharedObject {
@@ -391,13 +391,53 @@ public class XMPPContainerPresenceHelper implements ISharedObject {
}
}
+ private boolean replace(IRosterItem i1, IRosterItem i2) {
+ if (i1 instanceof IRosterEntry) {
+ IRosterEntry re1 = (IRosterEntry) i1;
+ if (!(i2 instanceof IRosterEntry))
+ return false;
+ IRosterEntry re2 = (IRosterEntry) i2;
+ XMPPID id1 = (XMPPID) re1.getUser().getID();
+ XMPPID id2 = (XMPPID) re2.getUser().getID();
+ String jid1 = id1.getUsernameAtHost();
+ String jid2 = id2.getUsernameAtHost();
+ if (jid1.equals(jid2)) {
+ String r1 = id1.getResourceName();
+ String r2 = id2.getResourceName();
+ if (r1 == null && r2 != null)
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void addUnique(Collection existingItems, IRosterItem newItem) {
+ List toAdd = new ArrayList();
+ if (existingItems.size() == 0)
+ toAdd.add(newItem);
+ else {
+ boolean addNewItem = true;
+ for (Iterator i = existingItems.iterator(); i.hasNext();) {
+ IRosterItem existing = (IRosterItem) i.next();
+ // If the same then we don't add it
+ if (existing.equals(newItem))
+ addNewItem = false;
+ // else if the new item should replace the existing then remove
+ if (replace(existing, newItem))
+ i.remove();
+ }
+ if (addNewItem)
+ toAdd.add(newItem);
+ }
+ for (Iterator i = toAdd.iterator(); i.hasNext();)
+ existingItems.add(i.next());
+ }
+
private void addUniqueToRoster(IRosterItem[] newItems) {
Collection existingItems = roster.getItems();
synchronized (existingItems) {
- for (int i = 0; i < newItems.length; i++) {
- if (!existingItems.contains(newItems[i]))
- existingItems.add(newItems[i]);
- }
+ for (int i = 0; i < newItems.length; i++)
+ addUnique(existingItems, newItems[i]);
}
rosterManager.notifyRosterUpdate(roster);
}
@@ -411,17 +451,20 @@ public class XMPPContainerPresenceHelper implements ISharedObject {
}
protected IRosterEntry createRosterEntry(RosterEntry entry) {
- final XMPPID xmppid = createIDFromName(entry.getUser());
- final String name = (entry.getName() == null) ? xmppid.getUsername()
- : XMPPID.unfixEscapeInNode(entry.getName());
- return createRosterEntry(xmppid, name, entry.getGroups().iterator());
+ XMPPID xmppid = createIDFromName(entry.getUser());
+ return createRosterEntry(xmppid, getEntryName(xmppid, entry.getName()),
+ entry.getGroups().iterator());
+ }
+
+ private String getEntryName(XMPPID xmppid, String entryName) {
+ return (entryName == null) ? xmppid.getUsername() : XMPPID
+ .unfixEscapeInNode(entryName);
}
protected IRosterEntry createRosterEntry(XMPPID xmppid,
RosterPacket.Item entry) {
- final String name = (entry.getName() == null) ? xmppid.getUsername()
- : XMPPID.unfixEscapeInNode(entry.getName());
- return createRosterEntry(xmppid, name, entry.getGroupNames().iterator());
+ return createRosterEntry(xmppid, getEntryName(xmppid, entry.getName()),
+ entry.getGroupNames().iterator());
}
protected void handleIQEvent(IQEvent evt) {
@@ -435,10 +478,8 @@ public class XMPPContainerPresenceHelper implements ISharedObject {
.iterator(); i.hasNext();) {
final RosterPacket.Item item = (RosterPacket.Item) i.next();
final RosterPacket.ItemType itemType = item.getItemType();
- boolean remove = false;
XMPPID newID = createIDFromName(item.getUser());
- final IRosterItem items[] = createRosterEntries(newID, item);
- final IRosterEntry entry = createRosterEntry(newID, item);
+ boolean remove = false;
if (itemType == RosterPacket.ItemType.none
|| itemType == RosterPacket.ItemType.remove) {
removeItemFromRoster(roster.getItems(),
@@ -446,10 +487,10 @@ public class XMPPContainerPresenceHelper implements ISharedObject {
remove = true;
} else {
remove = false;
- addUniqueToRoster(items);
+ addUniqueToRoster(createRosterEntries(newID, item));
}
// In both cases fire set roster entry
- fireSetRosterEntry(remove, entry);
+ fireSetRosterEntry(remove, createRosterEntry(newID, item));
}
}
} else {
@@ -530,13 +571,14 @@ public class XMPPContainerPresenceHelper implements ISharedObject {
final List xhtmlbodylist = new ArrayList();
for (; xhtmlbodies.hasNext();)
xhtmlbodylist.add(xhtmlbodies.next());
- chatManager.fireXHTMLChatMessage(fromID, threadID, msg
- .getType(), subject, body, ECFConnection
- .getPropertiesFromPacket(msg), xhtmlbodylist);
+ chatManager.fireXHTMLChatMessage(fromID, threadID,
+ msg.getType(), subject, body,
+ ECFConnection.getPropertiesFromPacket(msg),
+ xhtmlbodylist);
} else if (body != null) {
chatManager.fireChatMessage(fromID, threadID,
- msg.getType(), subject, body, ECFConnection
- .getPropertiesFromPacket(msg));
+ msg.getType(), subject, body,
+ ECFConnection.getPropertiesFromPacket(msg));
}
}
}
@@ -904,8 +946,8 @@ public class XMPPContainerPresenceHelper implements ISharedObject {
final Presence newPresence = new Presence(
createPresenceType(ipresence), ipresence.getStatus(), 0,
createPresenceMode(ipresence));
- ECFConnection.setPropertiesInPacket(newPresence, ipresence
- .getProperties());
+ ECFConnection.setPropertiesInPacket(newPresence,
+ ipresence.getProperties());
return newPresence;
}
@@ -998,9 +1040,9 @@ public class XMPPContainerPresenceHelper implements ISharedObject {
protected IRosterItem[] createRosterEntries(RosterEntry entry) {
final XMPPID xmppid = createIDFromName(entry.getUser());
final String name = entry.getName();
- final User newUser = (name == null) ? new User(xmppid, xmppid
- .getUsername()) : new User(xmppid, XMPPID
- .unfixEscapeInNode(name));
+ final User newUser = (name == null) ? new User(xmppid,
+ xmppid.getUsername()) : new User(xmppid,
+ XMPPID.unfixEscapeInNode(name));
return createRosterEntries(entry.getGroups().iterator(), roster,
newUser);
}

Back to the top