public void entriesUpdated(Collection<String> updatedIds) { try { synchronized (XMPPFriendConnectionImpl.this) { checkLoggedIn(); synchronized (friends) { Roster roster = connection.getRoster(); if (roster != null) { List<Friend> updatedFriends = new ArrayList<Friend>(); for (String id : updatedIds) { RosterEntry rosterEntry = roster.getEntry(id); XMPPFriendImpl friend = friends.get(id); if (friend == null) { // should never happen ? friend = new XMPPFriendImpl( id, rosterEntry, configuration, connection, featureRegistry); friends.put(id, friend); } else { friend.setRosterEntry(rosterEntry); } updatedFriends.add(friend); LOG.debugf("user {0} updated", friend); } rosterListeners.broadcast( new RosterEvent(updatedFriends, RosterEvent.Type.FRIENDS_UPDATED)); } } } } catch (org.jivesoftware.smack.XMPPException e) { LOG.debugf(e, "error getting roster"); } catch (FriendException e) { LOG.debugf(e, "error getting roster"); } }
private void addNewPresence( final XMPPFriendImpl friend, final org.jivesoftware.smack.packet.Presence presence) { final PresenceImpl presenceImpl = new PresenceImpl(presence, friend, featureSupport); presenceImpl.addTransport(AddressFeature.class, addressIQListener); presenceImpl.addTransport(AuthTokenFeature.class, authTokenIQListener); presenceImpl.addTransport(ConnectBackRequestFeature.class, connectRequestIQListener); presenceImpl.addTransport(LibraryChangedNotifierFeature.class, libraryChangedIQListener); presenceImpl.addTransport(FileOfferFeature.class, fileTransferIQListener); friend.addPresense(presenceImpl); }
@Override public void presenceChanged(final org.jivesoftware.smack.packet.Presence presence) { String localJID; try { localJID = getLocalJid(); } catch (FriendException e) { localJID = null; } if (!presence.getFrom().equals(localJID)) { XMPPFriendImpl friend = getFriend(presence); if (friend != null) { LOG.debugf("presence from {0} changed to {1}", presence.getFrom(), presence.getType()); // synchronize to avoid updates or presences from being lost // better to replace that with a lock object private to this // connection class synchronized (friend) { if (presence.getType().equals(org.jivesoftware.smack.packet.Presence.Type.available)) { if (!friend.getPresences().containsKey(presence.getFrom())) { addNewPresence(friend, presence); } else { updatePresence(friend, presence); } } else if (presence .getType() .equals(org.jivesoftware.smack.packet.Presence.Type.unavailable)) { PresenceImpl p = (PresenceImpl) friend.getPresence(presence.getFrom()); if (p != null) { p.update(presence); friend.removePresense(p); } } } } else { LOG.debugf("no friend for presence {0}", presence.getFrom()); } } }
private void updatePresence( XMPPFriendImpl friend, org.jivesoftware.smack.packet.Presence presence) { PresenceImpl currentPresence = (PresenceImpl) friend.getPresences().get(presence.getFrom()); currentPresence.update(presence); friend.updatePresence(currentPresence); }