diff options
Diffstat (limited to 'src/net/java/sip/communicator/impl/protocol/jabber/extensions/caps/EntityCapsManager.java')
-rw-r--r-- | src/net/java/sip/communicator/impl/protocol/jabber/extensions/caps/EntityCapsManager.java | 113 |
1 files changed, 68 insertions, 45 deletions
diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/caps/EntityCapsManager.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/caps/EntityCapsManager.java index ebdcbb0..97d9ff8 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/caps/EntityCapsManager.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/caps/EntityCapsManager.java @@ -243,6 +243,7 @@ public class EntityCapsManager if ((user != null) && (node != null) && (hash != null) && (ver != null)) { Caps caps = userCaps.get(user); + String bareJid=StringUtils.parseBareAddress(user); if ((caps == null) || !caps.node.equals(node) @@ -270,7 +271,9 @@ public class EntityCapsManager String nodeVer = caps.getNodeVer(); for (UserCapsNodeListener listener : listeners) - listener.userCapsNodeAdded(user, nodeVer, online); + listener.userCapsNodeAdded(user, + getFullJidsByBareJid(bareJid), + nodeVer, online); } } } @@ -305,6 +308,8 @@ public class EntityCapsManager { Caps caps = null; String lastRemovedJid = null; + String bareJid=StringUtils.parseBareAddress( + contact.getAddress()); Iterator<String> iter = userCaps.keySet().iterator(); while(iter.hasNext()) @@ -337,7 +342,9 @@ public class EntityCapsManager for (UserCapsNodeListener listener : listeners) listener.userCapsNodeRemoved( - lastRemovedJid, nodeVer, false); + lastRemovedJid, + getFullJidsByBareJid(bareJid), + nodeVer, false); } } } @@ -350,6 +357,7 @@ public class EntityCapsManager public void removeUserCapsNode(String user) { Caps caps = userCaps.remove(user); + String bareJid=StringUtils.parseBareAddress(user); // Fire userCapsNodeRemoved. if (caps != null) @@ -367,7 +375,9 @@ public class EntityCapsManager String nodeVer = caps.getNodeVer(); for (UserCapsNodeListener listener : listeners) - listener.userCapsNodeRemoved(user, nodeVer, false); + listener.userCapsNodeRemoved(user, + getFullJidsByBareJid(bareJid), + nodeVer, false); } } } @@ -404,6 +414,24 @@ public class EntityCapsManager { return userCaps.get(user); } + + /** + * Gets the full Jids (with resources) as Strings. + * + * @param the bare Jid + * @return the full Jids as an ArrayList <tt>user</tt> + */ + public ArrayList<String> getFullJidsByBareJid(String bareJid) + { + ArrayList<String> jids = new ArrayList<String>(); + for(String jid: userCaps.keySet()) + { + if(bareJid.equals(StringUtils.parseBareAddress(jid))){ + jids.add(jid); + } + } + return jids; + } /** * Get the discover info given a user name. The discover info is returned if @@ -605,14 +633,9 @@ public class EntityCapsManager * @param connection the connection that we'd like this manager to register * with. */ - public void addPacketListener(XMPPConnection connection) + public void addPacketListener(Connection connection) { - PacketFilter filter - = new AndFilter( - new PacketTypeFilter(Presence.class), - new PacketExtensionFilter( - CapsPacketExtension.ELEMENT_NAME, - CapsPacketExtension.NAMESPACE)); + PacketFilter filter = new PacketTypeFilter(Presence.class); connection.addPacketListener(new CapsPacketListener(), filter); } @@ -913,48 +936,48 @@ public class EntityCapsManager */ public void processPacket(Packet packet) { + // Check it the packet indicates that the user is online. We + // will use this information to decide if we're going to send + // the discover info request. + boolean online + = (packet instanceof Presence) + && ((Presence) packet).isAvailable(); + CapsPacketExtension ext = (CapsPacketExtension) packet.getExtension( CapsPacketExtension.ELEMENT_NAME, CapsPacketExtension.NAMESPACE); - /* - * Before Version 1.4 of XEP-0115: Entity Capabilities, the 'ver' - * attribute was generated differently and the 'hash' attribute was - * absent. The 'ver' attribute in Version 1.3 represents the - * specific version of the client and thus does not provide a way to - * validate the DiscoverInfo sent by the client. If - * EntityCapsManager receives no 'hash' attribute, it will assume - * the legacy format and will not cache it because the DiscoverInfo - * to be received from the client later on will not be trustworthy. - */ - String hash = ext.getHash(); - - /* Google Talk web does not set hash but we need it to be cached */ - if(hash == null) - hash = ""; - - if (hash != null) + if(ext != null && online) { - // Check it the packet indicates that the user is online. We - // will use this information to decide if we're going to send - // the discover info request. - boolean online - = (packet instanceof Presence) - && ((Presence) packet).isAvailable(); - - if(online) - { - addUserCapsNode( - packet.getFrom(), - ext.getNode(), hash, ext.getVersion(), - ext.getExtensions(), online); - } - else - { - removeUserCapsNode(packet.getFrom()); - } + /* + * Before Version 1.4 of XEP-0115: Entity Capabilities, + * the 'ver' attribute was generated differently and the 'hash' + * attribute was absent. The 'ver' attribute in Version 1.3 + * represents the specific version of the client and thus does + * not provide a way to validate the DiscoverInfo sent by + * the client. If EntityCapsManager receives no 'hash' + * attribute, it will assume the legacy format and will not + * cache it because the DiscoverInfo to be received from + * the client later on will not be trustworthy. + */ + String hash = ext.getHash(); + + /* Google Talk web does not set hash, but we need it to + * be cached + */ + if (hash == null) + hash = ""; + + addUserCapsNode( + packet.getFrom(), + ext.getNode(), hash, ext.getVersion(), + ext.getExtensions(), online); + } + else if (!online) + { + removeUserCapsNode(packet.getFrom()); } } } |