/** * This <tt>listener</tt> will no longer be a candidate recipient for the dispatching of new * messages received from the JAIN-SIP <tt>SipProvider</tt>s. * * @param listener possible target to remove for the dispatching process. */ public void removeSipListener(ProtocolProviderServiceSipImpl listener) { synchronized (this.listeners) { this.listeners.remove(listener); int listenerCount = listeners.size(); if (logger.isTraceEnabled()) logger.trace(listenerCount + " listeners left"); if (listenerCount == 0) stopListening(); } }
/** * Handles chat room presence status updates. * * @param evt the <tt>LocalUserChatRoomPresenceChangeEvent</tt> instance containing the chat room * and the type, and reason of the change */ @Override public void localUserPresenceChanged(LocalUserChatRoomPresenceChangeEvent evt) { ChatRoom sourceChatRoom = evt.getChatRoom(); String eventType = evt.getEventType(); boolean existingContact = false; ChatRoomSourceContact foundContact = null; synchronized (contactResults) { for (ChatRoomSourceContact contact : contactResults) { if (contactEqualsChatRoom(contact, sourceChatRoom)) { existingContact = true; foundContact = contact; contactResults.remove(contact); break; } } } if (LocalUserChatRoomPresenceChangeEvent.LOCAL_USER_JOINED.equals(eventType)) { if (existingContact) { foundContact.setPresenceStatus(ChatRoomPresenceStatus.CHAT_ROOM_ONLINE); synchronized (contactResults) { contactResults.add(foundContact); } fireContactChanged(foundContact); } else { ChatRoomWrapper chatRoom = MUCActivator.getMUCService().findChatRoomWrapperFromChatRoom(sourceChatRoom); if (chatRoom != null) addChatRoom(sourceChatRoom, false, chatRoom.isAutojoin()); } } else if ((LocalUserChatRoomPresenceChangeEvent.LOCAL_USER_LEFT.equals(eventType) || LocalUserChatRoomPresenceChangeEvent.LOCAL_USER_KICKED.equals(eventType) || LocalUserChatRoomPresenceChangeEvent.LOCAL_USER_DROPPED.equals(eventType))) { if (existingContact) { foundContact.setPresenceStatus(ChatRoomPresenceStatus.CHAT_ROOM_OFFLINE); synchronized (contactResults) { contactResults.add(foundContact); } fireContactChanged(foundContact); } } }
/** * 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. */ public synchronized int indexOf(ChatRoomSourceContact contact) { Iterator<ChatRoomSourceContact> it = contactResults.iterator(); int i = 0; while (it.hasNext()) { if (contact.equals(it.next())) { return i; } i++; } return -1; }
@Override public void chatRoomProviderWrapperRemoved(ChatRoomProviderWrapper provider) { LinkedList<ChatRoomSourceContact> tmpContactResults; synchronized (contactResults) { tmpContactResults = new LinkedList<ChatRoomSourceContact>(contactResults); for (ChatRoomSourceContact contact : tmpContactResults) { if (contact.getProvider().equals(provider.getProtocolProvider())) { contactResults.remove(contact); fireContactRemoved(contact); } } } }
/** * Adds found result to the query results. * * @param room the chat room. * @param addQueryResult indicates whether we should add the chat room to the query results or * fire an event without adding it to the results. * @param isAutoJoin the auto join state of the contact. */ private void addChatRoom(ChatRoom room, boolean addQueryResult, boolean isAutoJoin) { if (queryString == null || ((room.getName().contains(queryString) || room.getIdentifier().contains(queryString)))) { ChatRoomSourceContact contact = new ChatRoomSourceContact(room, this, isAutoJoin); synchronized (contactResults) { contactResults.add(contact); } if (addQueryResult) { addQueryResult(contact, false); } else { fireContactReceived(contact, false); } } }
/** * Adds found result to the query results. * * @param pps the protocol provider associated with the found chat room. * @param chatRoomName the name of the chat room. * @param chatRoomID the id of the chat room. * @param addQueryResult indicates whether we should add the chat room to the query results or * fire an event without adding it to the results. * @param isAutoJoin the auto join state of the contact. */ private void addChatRoom( ProtocolProviderService pps, String chatRoomName, String chatRoomID, boolean addQueryResult, boolean isAutoJoin) { if (queryString == null || ((chatRoomName.contains(queryString) || chatRoomID.contains(queryString)))) { ChatRoomSourceContact contact = new ChatRoomSourceContact(chatRoomName, chatRoomID, this, pps, isAutoJoin); synchronized (contactResults) { contactResults.add(contact); } if (addQueryResult) { addQueryResult(contact, false); } else { fireContactReceived(contact, false); } } }
/** * Indicates that a change has occurred in the chat room data list. * * @param evt the event that describes the change. */ @Override public void contentChanged(final ChatRoomListChangeEvent evt) { ChatRoomWrapper chatRoom = evt.getSourceChatRoom(); switch (evt.getEventID()) { case ChatRoomListChangeEvent.CHAT_ROOM_ADDED: addChatRoom(chatRoom.getChatRoom(), false, chatRoom.isAutojoin()); break; case ChatRoomListChangeEvent.CHAT_ROOM_REMOVED: LinkedList<ChatRoomSourceContact> tmpContactResults; synchronized (contactResults) { tmpContactResults = new LinkedList<ChatRoomSourceContact>(contactResults); for (ChatRoomSourceContact contact : tmpContactResults) { if (contactEqualsChatRoom(contact, chatRoom)) { contactResults.remove(contact); fireContactRemoved(contact); break; } } } break; case ChatRoomListChangeEvent.CHAT_ROOM_CHANGED: synchronized (contactResults) { for (ChatRoomSourceContact contact : contactResults) { if (contactEqualsChatRoom(contact, chatRoom.getChatRoom())) { if (chatRoom.isAutojoin() != contact.isAutoJoin()) { contact.setAutoJoin(chatRoom.isAutojoin()); fireContactChanged(contact); } break; } } } break; default: break; } }