diff options
Diffstat (limited to 'src/net/java/sip/communicator/impl/muc')
6 files changed, 3077 insertions, 3077 deletions
diff --git a/src/net/java/sip/communicator/impl/muc/BaseChatRoomSourceContact.java b/src/net/java/sip/communicator/impl/muc/BaseChatRoomSourceContact.java index 3225af9..28f43e3 100644 --- a/src/net/java/sip/communicator/impl/muc/BaseChatRoomSourceContact.java +++ b/src/net/java/sip/communicator/impl/muc/BaseChatRoomSourceContact.java @@ -1,4 +1,4 @@ -/*
+/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd @@ -15,141 +15,141 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package net.java.sip.communicator.impl.muc;
-
-import java.util.*;
-
-import net.java.sip.communicator.service.contactsource.*;
-import net.java.sip.communicator.service.muc.*;
-import net.java.sip.communicator.service.protocol.*;
-
-/**
- * Basic source contact for the chat rooms.
- *
- * @author Hristo Terezov
- */
-public class BaseChatRoomSourceContact
- extends SortedGenericSourceContact
-{
-
- /**
- * The parent contact query.
- */
- protected final ContactQuery parentQuery;
-
- /**
- * The name of the chat room associated with the contact.
- */
- private String chatRoomName;
-
- /**
- * The ID of the chat room associated with the contact.
- */
- private String chatRoomID;
-
- /**
- * The protocol provider of the chat room associated with the contact.
- */
- private ProtocolProviderService provider;
-
- /**
- * Contsructs new chat room source contact.
- * @param chatRoomName the name of the chat room associated with the room.
- * @param chatRoomID the id of the chat room associated with the room.
- * @param query the query associated with the contact.
- * @param pps the protocol provider of the contact.
- */
- public BaseChatRoomSourceContact(String chatRoomName,
- String chatRoomID, ContactQuery query, ProtocolProviderService pps)
- {
- super(query, query.getContactSource(), chatRoomName,
- generateDefaultContactDetails(chatRoomName));
-
- this.chatRoomName = chatRoomName;
- this.chatRoomID = chatRoomID;
- this.provider = pps;
- this.parentQuery = query;
-
- initContactProperties(ChatRoomPresenceStatus.CHAT_ROOM_OFFLINE);
- setDisplayDetails(pps.getAccountID().getDisplayName());
- }
-
-
- /**
- * Sets the given presence status and the name of the chat room associated
- * with the contact.
- * @param status the presence status to be set.
- */
- protected void initContactProperties(PresenceStatus status)
- {
- setPresenceStatus(status);
- setContactAddress(chatRoomName);
- }
-
- /**
- * Generates the default contact details for
- * <tt>BaseChatRoomSourceContact</tt> instances.
- *
- * @param chatRoomName the name of the chat room associated with the contact
- * @return list of default <tt>ContactDetail</tt>s for the contact.
- */
- private static List<ContactDetail> generateDefaultContactDetails(
- String chatRoomName)
- {
- ContactDetail contactDetail
- = new ContactDetail(chatRoomName);
- List<Class<? extends OperationSet>> supportedOpSets
- = new ArrayList<Class<? extends OperationSet>>();
-
- supportedOpSets.add(OperationSetMultiUserChat.class);
- contactDetail.setSupportedOpSets(supportedOpSets);
-
- List<ContactDetail> contactDetails
- = new ArrayList<ContactDetail>();
-
- contactDetails.add(contactDetail);
- return contactDetails;
- }
-
- /**
- * Returns the id of the chat room associated with the contact.
- *
- * @return the chat room id.
- */
- public String getChatRoomID()
- {
- return chatRoomID;
- }
-
- /**
- * Returns the name of the chat room associated with the contact.
- *
- * @return the chat room name
- */
- public String getChatRoomName()
- {
- return chatRoomName;
- }
-
- /**
- * Returns the provider of the chat room associated with the contact.
- *
- * @return the provider
- */
- public ProtocolProviderService getProvider()
- {
- return provider;
- }
-
- /**
- * Returns the index of this source contact in its parent group.
- *
- * @return the index of this contact in its parent
- */
- public int getIndex()
- {
- if(parentQuery instanceof ServerChatRoomQuery)
- return ((ServerChatRoomQuery)parentQuery).indexOf(this);
- return -1;
- }
-}
+package net.java.sip.communicator.impl.muc; + +import java.util.*; + +import net.java.sip.communicator.service.contactsource.*; +import net.java.sip.communicator.service.muc.*; +import net.java.sip.communicator.service.protocol.*; + +/** + * Basic source contact for the chat rooms. + * + * @author Hristo Terezov + */ +public class BaseChatRoomSourceContact + extends SortedGenericSourceContact +{ + + /** + * The parent contact query. + */ + protected final ContactQuery parentQuery; + + /** + * The name of the chat room associated with the contact. + */ + private String chatRoomName; + + /** + * The ID of the chat room associated with the contact. + */ + private String chatRoomID; + + /** + * The protocol provider of the chat room associated with the contact. + */ + private ProtocolProviderService provider; + + /** + * Contsructs new chat room source contact. + * @param chatRoomName the name of the chat room associated with the room. + * @param chatRoomID the id of the chat room associated with the room. + * @param query the query associated with the contact. + * @param pps the protocol provider of the contact. + */ + public BaseChatRoomSourceContact(String chatRoomName, + String chatRoomID, ContactQuery query, ProtocolProviderService pps) + { + super(query, query.getContactSource(), chatRoomName, + generateDefaultContactDetails(chatRoomName)); + + this.chatRoomName = chatRoomName; + this.chatRoomID = chatRoomID; + this.provider = pps; + this.parentQuery = query; + + initContactProperties(ChatRoomPresenceStatus.CHAT_ROOM_OFFLINE); + setDisplayDetails(pps.getAccountID().getDisplayName()); + } + + + /** + * Sets the given presence status and the name of the chat room associated + * with the contact. + * @param status the presence status to be set. + */ + protected void initContactProperties(PresenceStatus status) + { + setPresenceStatus(status); + setContactAddress(chatRoomName); + } + + /** + * Generates the default contact details for + * <tt>BaseChatRoomSourceContact</tt> instances. + * + * @param chatRoomName the name of the chat room associated with the contact + * @return list of default <tt>ContactDetail</tt>s for the contact. + */ + private static List<ContactDetail> generateDefaultContactDetails( + String chatRoomName) + { + ContactDetail contactDetail + = new ContactDetail(chatRoomName); + List<Class<? extends OperationSet>> supportedOpSets + = new ArrayList<Class<? extends OperationSet>>(); + + supportedOpSets.add(OperationSetMultiUserChat.class); + contactDetail.setSupportedOpSets(supportedOpSets); + + List<ContactDetail> contactDetails + = new ArrayList<ContactDetail>(); + + contactDetails.add(contactDetail); + return contactDetails; + } + + /** + * Returns the id of the chat room associated with the contact. + * + * @return the chat room id. + */ + public String getChatRoomID() + { + return chatRoomID; + } + + /** + * Returns the name of the chat room associated with the contact. + * + * @return the chat room name + */ + public String getChatRoomName() + { + return chatRoomName; + } + + /** + * Returns the provider of the chat room associated with the contact. + * + * @return the provider + */ + public ProtocolProviderService getProvider() + { + return provider; + } + + /** + * Returns the index of this source contact in its parent group. + * + * @return the index of this contact in its parent + */ + public int getIndex() + { + if(parentQuery instanceof ServerChatRoomQuery) + return ((ServerChatRoomQuery)parentQuery).indexOf(this); + return -1; + } +} diff --git a/src/net/java/sip/communicator/impl/muc/ChatRoomQuery.java b/src/net/java/sip/communicator/impl/muc/ChatRoomQuery.java index 24a3ebd..9cd1c21 100644 --- a/src/net/java/sip/communicator/impl/muc/ChatRoomQuery.java +++ b/src/net/java/sip/communicator/impl/muc/ChatRoomQuery.java @@ -1,4 +1,4 @@ -/*
+/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd @@ -15,543 +15,543 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package net.java.sip.communicator.impl.muc;
-
-import java.util.*;
-import java.util.regex.*;
-
-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>.
- *
- * @author Hristo Terezov
- */
-public class ChatRoomQuery
- extends AsyncContactQuery<ContactSourceService>
- implements LocalUserChatRoomPresenceListener,
- ChatRoomListChangeListener,
- ChatRoomProviderWrapperListener
-{
- /**
- * The query string.
- */
- private String queryString;
-
- /**
- * List with the current results for the query.
- */
- private Set<ChatRoomSourceContact> contactResults
- = new TreeSet<ChatRoomSourceContact>();
-
- /**
- * MUC service.
- */
- private MUCServiceImpl mucService;
-
- /**
- * The number of contact query listeners.
- */
- private int contactQueryListenersCount = 0;
-
- /**
- * The protocol provider registration listener.
- */
- private ServiceListener protolProviderRegistrationListener = null;
-
- /**
- * Creates an instance of <tt>ChatRoomQuery</tt> by specifying
- * the parent contact source, the query string to match and the maximum
- * result contacts to return.
- *
- * @param queryString the query string to match
- * @param contactSource the parent contact source
- */
- public ChatRoomQuery(String queryString,
- ChatRoomContactSourceService contactSource)
- {
- super(contactSource,
- Pattern.compile(queryString, Pattern.CASE_INSENSITIVE
- | Pattern.LITERAL), true);
- this.queryString = queryString;
-
- mucService = MUCActivator.getMUCService();
-
- }
-
- /**
- * Adds listeners for the query
- */
- private void initListeners()
- {
- for(ProtocolProviderService pps : MUCActivator.getChatRoomProviders())
- {
- addQueryToProviderPresenceListeners(pps);
- }
-
- mucService.addChatRoomListChangeListener(this);
- mucService.addChatRoomProviderWrapperListener(this);
- protolProviderRegistrationListener = new ProtocolProviderRegListener();
- MUCActivator.bundleContext.addServiceListener(
- protolProviderRegistrationListener);
- }
-
- /**
- * Adds the query as presence listener to protocol provider service.
- * @param pps the protocol provider service.
- */
- public void addQueryToProviderPresenceListeners(ProtocolProviderService pps)
- {
- OperationSetMultiUserChat opSetMUC
- = pps.getOperationSet(OperationSetMultiUserChat.class);
- if(opSetMUC != null)
- {
- opSetMUC.addPresenceListener(this);
- }
- }
-
- /**
- * Removes the query from protocol provider service presence listeners.
- * @param pps the protocol provider service.
- */
- public void removeQueryFromProviderPresenceListeners(
- ProtocolProviderService pps)
- {
- OperationSetMultiUserChat opSetMUC
- = pps.getOperationSet(OperationSetMultiUserChat.class);
- if(opSetMUC != null)
- {
- opSetMUC.removePresenceListener(this);
- }
- }
-
- @Override
- protected void run()
- {
- Iterator<ChatRoomProviderWrapper> chatRoomProviders
- = mucService.getChatRoomProviders();
-
- while (chatRoomProviders.hasNext())
- {
- ChatRoomProviderWrapper provider = chatRoomProviders.next();
- providerAdded(provider, true);
- }
-
- if (getStatus() != QUERY_CANCELED)
- setStatus(QUERY_COMPLETED);
- }
-
- /**
- * Handles adding a chat room provider.
- * @param provider the provider.
- * @param addQueryResult indicates whether we should add the chat room to
- * the query results or fire an event without adding it to the results.
- */
- private void providerAdded(ChatRoomProviderWrapper provider,
- boolean addQueryResult)
- {
-
- for(int i = 0; i < provider.countChatRooms(); i++)
- {
- ChatRoomWrapper chatRoom = provider.getChatRoom(i);
- addChatRoom( provider.getProtocolProvider(),
- chatRoom.getChatRoomName(), chatRoom.getChatRoomID(),
- addQueryResult, chatRoom.isAutojoin());
- }
- }
-
- /**
- * 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);
- }
- }
- }
-
- /**
- * 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;
- }
- }
-
- @Override
- public void chatRoomProviderWrapperAdded(ChatRoomProviderWrapper provider)
- {
- providerAdded(provider, false);
- }
-
- @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);
- }
- }
- }
- }
-
- /**
- * 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()
- && chatRoom.getIdentifier().equals(contact.getContactAddress());
- }
-
- /**
- * Test equality of contact to chat room wrapper. This method does not rely
- * on a chat room instance, since that may not be available in case of
- * removal.
- *
- * @param contact the contact
- * @param chatRoomWrapper the chat room wrapper
- * @return returns <tt>true</tt> if they are equal, or <tt>false</tt> if
- * they are different.
- */
- private boolean contactEqualsChatRoom(final ChatRoomSourceContact contact,
- final ChatRoomWrapper chatRoomWrapper)
- {
- return contact.getProvider() == chatRoomWrapper.getParentProvider()
- .getProtocolProvider()
- && contact.getContactAddress().equals(
- chatRoomWrapper.getChatRoomID());
- }
-
- /**
- * 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;
- }
-
- /**
- * Clears any listener we used.
- */
- private void clearListeners()
- {
- mucService.removeChatRoomListChangeListener(this);
- mucService.removeChatRoomProviderWrapperListener(this);
- if(protolProviderRegistrationListener != null)
- MUCActivator.bundleContext.removeServiceListener(
- protolProviderRegistrationListener);
- protolProviderRegistrationListener = null;
- for(ProtocolProviderService pps : MUCActivator.getChatRoomProviders())
- {
- removeQueryFromProviderPresenceListeners(pps);
- }
- }
-
- /**
- * Cancels this <tt>ContactQuery</tt>.
- *
- * @see ContactQuery#cancel()
- */
- public void cancel()
- {
- clearListeners();
-
- super.cancel();
- }
-
- /**
- * If query has status changed to cancel, let's clear listeners.
- * @param status {@link ContactQuery#QUERY_CANCELED},
- * {@link ContactQuery#QUERY_COMPLETED}
- */
- public void setStatus(int status)
- {
- if(status == QUERY_CANCELED)
- clearListeners();
-
- super.setStatus(status);
- }
-
- @Override
- public void addContactQueryListener(ContactQueryListener l)
- {
- super.addContactQueryListener(l);
- contactQueryListenersCount++;
- if(contactQueryListenersCount == 1)
- {
- initListeners();
- }
- }
-
- @Override
- public void removeContactQueryListener(ContactQueryListener l)
- {
- super.removeContactQueryListener(l);
- contactQueryListenersCount--;
- if(contactQueryListenersCount == 0)
- {
- clearListeners();
- }
- }
-
- /**
- * Listens for <tt>ProtocolProviderService</tt> registrations.
- */
- private class ProtocolProviderRegListener
- implements ServiceListener
- {
- /**
- * Handles service change events.
- */
- public void serviceChanged(ServiceEvent event)
- {
- ServiceReference serviceRef = event.getServiceReference();
-
- // if the event is caused by a bundle being stopped, we don't want to
- // know
- if (serviceRef.getBundle().getState() == Bundle.STOPPING)
- {
- return;
- }
-
- Object service = MUCActivator.bundleContext.getService(serviceRef);
-
- // we don't care if the source service is not a protocol provider
- if (!(service instanceof ProtocolProviderService))
- {
- return;
- }
-
- switch (event.getType())
- {
- case ServiceEvent.REGISTERED:
- addQueryToProviderPresenceListeners(
- (ProtocolProviderService) service);
- break;
- case ServiceEvent.UNREGISTERING:
- removeQueryFromProviderPresenceListeners(
- (ProtocolProviderService) service);
- break;
- }
- }
- }
+package net.java.sip.communicator.impl.muc; + +import java.util.*; +import java.util.regex.*; + +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>. + * + * @author Hristo Terezov + */ +public class ChatRoomQuery + extends AsyncContactQuery<ContactSourceService> + implements LocalUserChatRoomPresenceListener, + ChatRoomListChangeListener, + ChatRoomProviderWrapperListener +{ + /** + * The query string. + */ + private String queryString; + + /** + * List with the current results for the query. + */ + private Set<ChatRoomSourceContact> contactResults + = new TreeSet<ChatRoomSourceContact>(); + + /** + * MUC service. + */ + private MUCServiceImpl mucService; + + /** + * The number of contact query listeners. + */ + private int contactQueryListenersCount = 0; + + /** + * The protocol provider registration listener. + */ + private ServiceListener protolProviderRegistrationListener = null; + + /** + * Creates an instance of <tt>ChatRoomQuery</tt> by specifying + * the parent contact source, the query string to match and the maximum + * result contacts to return. + * + * @param queryString the query string to match + * @param contactSource the parent contact source + */ + public ChatRoomQuery(String queryString, + ChatRoomContactSourceService contactSource) + { + super(contactSource, + Pattern.compile(queryString, Pattern.CASE_INSENSITIVE + | Pattern.LITERAL), true); + this.queryString = queryString; + + mucService = MUCActivator.getMUCService(); + + } + + /** + * Adds listeners for the query + */ + private void initListeners() + { + for(ProtocolProviderService pps : MUCActivator.getChatRoomProviders()) + { + addQueryToProviderPresenceListeners(pps); + } + + mucService.addChatRoomListChangeListener(this); + mucService.addChatRoomProviderWrapperListener(this); + protolProviderRegistrationListener = new ProtocolProviderRegListener(); + MUCActivator.bundleContext.addServiceListener( + protolProviderRegistrationListener); + } + + /** + * Adds the query as presence listener to protocol provider service. + * @param pps the protocol provider service. + */ + public void addQueryToProviderPresenceListeners(ProtocolProviderService pps) + { + OperationSetMultiUserChat opSetMUC + = pps.getOperationSet(OperationSetMultiUserChat.class); + if(opSetMUC != null) + { + opSetMUC.addPresenceListener(this); + } + } + + /** + * Removes the query from protocol provider service presence listeners. + * @param pps the protocol provider service. + */ + public void removeQueryFromProviderPresenceListeners( + ProtocolProviderService pps) + { + OperationSetMultiUserChat opSetMUC + = pps.getOperationSet(OperationSetMultiUserChat.class); + if(opSetMUC != null) + { + opSetMUC.removePresenceListener(this); + } + } + + @Override + protected void run() + { + Iterator<ChatRoomProviderWrapper> chatRoomProviders + = mucService.getChatRoomProviders(); + + while (chatRoomProviders.hasNext()) + { + ChatRoomProviderWrapper provider = chatRoomProviders.next(); + providerAdded(provider, true); + } + + if (getStatus() != QUERY_CANCELED) + setStatus(QUERY_COMPLETED); + } + + /** + * Handles adding a chat room provider. + * @param provider the provider. + * @param addQueryResult indicates whether we should add the chat room to + * the query results or fire an event without adding it to the results. + */ + private void providerAdded(ChatRoomProviderWrapper provider, + boolean addQueryResult) + { + + for(int i = 0; i < provider.countChatRooms(); i++) + { + ChatRoomWrapper chatRoom = provider.getChatRoom(i); + addChatRoom( provider.getProtocolProvider(), + chatRoom.getChatRoomName(), chatRoom.getChatRoomID(), + addQueryResult, chatRoom.isAutojoin()); + } + } + + /** + * 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); + } + } + } + + /** + * 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; + } + } + + @Override + public void chatRoomProviderWrapperAdded(ChatRoomProviderWrapper provider) + { + providerAdded(provider, false); + } + + @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); + } + } + } + } + + /** + * 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() + && chatRoom.getIdentifier().equals(contact.getContactAddress()); + } + + /** + * Test equality of contact to chat room wrapper. This method does not rely + * on a chat room instance, since that may not be available in case of + * removal. + * + * @param contact the contact + * @param chatRoomWrapper the chat room wrapper + * @return returns <tt>true</tt> if they are equal, or <tt>false</tt> if + * they are different. + */ + private boolean contactEqualsChatRoom(final ChatRoomSourceContact contact, + final ChatRoomWrapper chatRoomWrapper) + { + return contact.getProvider() == chatRoomWrapper.getParentProvider() + .getProtocolProvider() + && contact.getContactAddress().equals( + chatRoomWrapper.getChatRoomID()); + } + + /** + * 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; + } + + /** + * Clears any listener we used. + */ + private void clearListeners() + { + mucService.removeChatRoomListChangeListener(this); + mucService.removeChatRoomProviderWrapperListener(this); + if(protolProviderRegistrationListener != null) + MUCActivator.bundleContext.removeServiceListener( + protolProviderRegistrationListener); + protolProviderRegistrationListener = null; + for(ProtocolProviderService pps : MUCActivator.getChatRoomProviders()) + { + removeQueryFromProviderPresenceListeners(pps); + } + } + + /** + * Cancels this <tt>ContactQuery</tt>. + * + * @see ContactQuery#cancel() + */ + public void cancel() + { + clearListeners(); + + super.cancel(); + } + + /** + * If query has status changed to cancel, let's clear listeners. + * @param status {@link ContactQuery#QUERY_CANCELED}, + * {@link ContactQuery#QUERY_COMPLETED} + */ + public void setStatus(int status) + { + if(status == QUERY_CANCELED) + clearListeners(); + + super.setStatus(status); + } + + @Override + public void addContactQueryListener(ContactQueryListener l) + { + super.addContactQueryListener(l); + contactQueryListenersCount++; + if(contactQueryListenersCount == 1) + { + initListeners(); + } + } + + @Override + public void removeContactQueryListener(ContactQueryListener l) + { + super.removeContactQueryListener(l); + contactQueryListenersCount--; + if(contactQueryListenersCount == 0) + { + clearListeners(); + } + } + + /** + * Listens for <tt>ProtocolProviderService</tt> registrations. + */ + private class ProtocolProviderRegListener + implements ServiceListener + { + /** + * Handles service change events. + */ + public void serviceChanged(ServiceEvent event) + { + ServiceReference serviceRef = event.getServiceReference(); + + // if the event is caused by a bundle being stopped, we don't want to + // know + if (serviceRef.getBundle().getState() == Bundle.STOPPING) + { + return; + } + + Object service = MUCActivator.bundleContext.getService(serviceRef); + + // we don't care if the source service is not a protocol provider + if (!(service instanceof ProtocolProviderService)) + { + return; + } + + switch (event.getType()) + { + case ServiceEvent.REGISTERED: + addQueryToProviderPresenceListeners( + (ProtocolProviderService) service); + break; + case ServiceEvent.UNREGISTERING: + removeQueryFromProviderPresenceListeners( + (ProtocolProviderService) service); + break; + } + } + } } diff --git a/src/net/java/sip/communicator/impl/muc/ChatRoomSourceContact.java b/src/net/java/sip/communicator/impl/muc/ChatRoomSourceContact.java index a659a6e..842cc15 100644 --- a/src/net/java/sip/communicator/impl/muc/ChatRoomSourceContact.java +++ b/src/net/java/sip/communicator/impl/muc/ChatRoomSourceContact.java @@ -1,4 +1,4 @@ -/*
+/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd @@ -15,113 +15,113 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package net.java.sip.communicator.impl.muc;
-
-import net.java.sip.communicator.service.muc.*;
-import net.java.sip.communicator.service.protocol.*;
-
-/**
- * Source contact for the chat rooms.
- *
- * @author Hristo Terezov
- */
-public class ChatRoomSourceContact
- extends BaseChatRoomSourceContact
-{
- /**
- * The protocol provider of the chat room associated with the contact.
- */
- private boolean isAutoJoin;
-
- /**
- * Constructs a new chat room source contact.
- *
- * @param chatRoomName the name of the chat room associated with the room.
- * @param chatRoomID the id of the chat room associated with the room.
- * @param query the query associated with the contact.
- * @param pps the protocol provider of the contact.
- * @param isAutoJoin the auto join state.
- */
- public ChatRoomSourceContact(String chatRoomName,
- String chatRoomID, ChatRoomQuery query, ProtocolProviderService pps,
- boolean isAutoJoin)
- {
- super(chatRoomName, chatRoomID, query, pps);
-
- this.isAutoJoin = isAutoJoin;
-
- initContactProperties(getChatRoomStateByName());
- }
-
- /**
- * Constructs new chat room source contact.
- *
- * @param chatRoom the chat room associated with the contact.
- * @param query the query associated with the contact.
- * @param isAutoJoin the auto join state
- */
- public ChatRoomSourceContact(ChatRoom chatRoom, ChatRoomQuery query,
- boolean isAutoJoin)
- {
- super(chatRoom.getName(), chatRoom.getIdentifier(), query,
- chatRoom.getParentProvider());
- this.isAutoJoin = isAutoJoin;
-
- initContactProperties(
- chatRoom.isJoined()
- ? ChatRoomPresenceStatus.CHAT_ROOM_ONLINE
- : ChatRoomPresenceStatus.CHAT_ROOM_OFFLINE);
-
- }
-
- /**
- * Checks if the chat room associated with the contact is joined or not and
- * returns it presence status.
- *
- * @return the presence status of the chat room associated with the contact.
- */
- private PresenceStatus getChatRoomStateByName()
- {
- for(ChatRoom room :
- getProvider().getOperationSet(OperationSetMultiUserChat.class)
- .getCurrentlyJoinedChatRooms())
- {
- if(room.getName().equals(getChatRoomName()))
- {
- return ChatRoomPresenceStatus.CHAT_ROOM_ONLINE;
- }
- }
- return ChatRoomPresenceStatus.CHAT_ROOM_OFFLINE;
- }
-
- /**
- * Returns the index of this source contact in its parent group.
- *
- * @return the index of this contact in its parent
- */
- @Override
- public int getIndex()
- {
- return ((ChatRoomQuery)parentQuery).indexOf(this);
- }
-
- /**
- * Returns the auto join state of the contact.
- *
- * @return the auto join state of the contact.
- */
- public boolean isAutoJoin()
- {
- return isAutoJoin;
- }
-
- /**
- * Sets the auto join state of the contact.
- *
- * @param isAutoJoin the auto join state to be set.
- */
- public void setAutoJoin(boolean isAutoJoin)
- {
- this.isAutoJoin = isAutoJoin;
- }
-}
+package net.java.sip.communicator.impl.muc; + +import net.java.sip.communicator.service.muc.*; +import net.java.sip.communicator.service.protocol.*; + +/** + * Source contact for the chat rooms. + * + * @author Hristo Terezov + */ +public class ChatRoomSourceContact + extends BaseChatRoomSourceContact +{ + /** + * The protocol provider of the chat room associated with the contact. + */ + private boolean isAutoJoin; + + /** + * Constructs a new chat room source contact. + * + * @param chatRoomName the name of the chat room associated with the room. + * @param chatRoomID the id of the chat room associated with the room. + * @param query the query associated with the contact. + * @param pps the protocol provider of the contact. + * @param isAutoJoin the auto join state. + */ + public ChatRoomSourceContact(String chatRoomName, + String chatRoomID, ChatRoomQuery query, ProtocolProviderService pps, + boolean isAutoJoin) + { + super(chatRoomName, chatRoomID, query, pps); + + this.isAutoJoin = isAutoJoin; + + initContactProperties(getChatRoomStateByName()); + } + + /** + * Constructs new chat room source contact. + * + * @param chatRoom the chat room associated with the contact. + * @param query the query associated with the contact. + * @param isAutoJoin the auto join state + */ + public ChatRoomSourceContact(ChatRoom chatRoom, ChatRoomQuery query, + boolean isAutoJoin) + { + super(chatRoom.getName(), chatRoom.getIdentifier(), query, + chatRoom.getParentProvider()); + this.isAutoJoin = isAutoJoin; + + initContactProperties( + chatRoom.isJoined() + ? ChatRoomPresenceStatus.CHAT_ROOM_ONLINE + : ChatRoomPresenceStatus.CHAT_ROOM_OFFLINE); + + } + + /** + * Checks if the chat room associated with the contact is joined or not and + * returns it presence status. + * + * @return the presence status of the chat room associated with the contact. + */ + private PresenceStatus getChatRoomStateByName() + { + for(ChatRoom room : + getProvider().getOperationSet(OperationSetMultiUserChat.class) + .getCurrentlyJoinedChatRooms()) + { + if(room.getName().equals(getChatRoomName())) + { + return ChatRoomPresenceStatus.CHAT_ROOM_ONLINE; + } + } + return ChatRoomPresenceStatus.CHAT_ROOM_OFFLINE; + } + + /** + * Returns the index of this source contact in its parent group. + * + * @return the index of this contact in its parent + */ + @Override + public int getIndex() + { + return ((ChatRoomQuery)parentQuery).indexOf(this); + } + + /** + * Returns the auto join state of the contact. + * + * @return the auto join state of the contact. + */ + public boolean isAutoJoin() + { + return isAutoJoin; + } + + /** + * Sets the auto join state of the contact. + * + * @param isAutoJoin the auto join state to be set. + */ + public void setAutoJoin(boolean isAutoJoin) + { + this.isAutoJoin = isAutoJoin; + } +} diff --git a/src/net/java/sip/communicator/impl/muc/MUCCustomContactActionService.java b/src/net/java/sip/communicator/impl/muc/MUCCustomContactActionService.java index 7c45b1d..0f4622d 100644 --- a/src/net/java/sip/communicator/impl/muc/MUCCustomContactActionService.java +++ b/src/net/java/sip/communicator/impl/muc/MUCCustomContactActionService.java @@ -1,4 +1,4 @@ -/*
+/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd @@ -15,845 +15,845 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package net.java.sip.communicator.impl.muc;
-
-import java.util.*;
-
-import net.java.sip.communicator.plugin.desktoputil.chat.*;
-import net.java.sip.communicator.service.contactsource.*;
-import net.java.sip.communicator.service.customcontactactions.*;
-import net.java.sip.communicator.service.muc.*;
-import net.java.sip.communicator.service.protocol.*;
-import net.java.sip.communicator.util.*;
-
-import org.jitsi.service.resources.*;
-
-/**
- * Implements <tt>CustomContactActionsService</tt> for MUC contact source.
- *
- * @author Hristo Terezov
- */
-public class MUCCustomContactActionService
- implements CustomContactActionsService<SourceContact>
-{
- /**
- * List of custom menu items.
- */
- private final List<ContactActionMenuItem<SourceContact>> mucActionMenuItems
- = new LinkedList<ContactActionMenuItem<SourceContact>>();
-
- /**
- * List of custom actions.
- */
- private final List<ContactAction<SourceContact>> mucActions
- = new LinkedList<ContactAction<SourceContact>>();
-
- /**
- *
- */
- private static final String OWNER_CANT_REMOVE_CHATROOM_PROPERTY
- = "net.java.sip.communicator.impl.muc.OWNER_CANT_REMOVE_CHATROOM";
-
- /**
- * Array of names for the custom actions.
- */
- private String[] actionsNames = {
- "leave",
- "join",
- "autojoin",
- "autojoin_pressed",
- "destroy_chatroom"
- };
-
- /**
- * Array of labels for the custom actions.
- */
- private String[] actionsLabels = {
- "service.gui.LEAVE",
- "service.gui.JOIN",
- "service.gui.JOIN_AUTOMATICALLY",
- "service.gui.JOIN_AUTOMATICALLY",
- "service.gui.DESTROY_CHATROOM"
- };
-
- /**
- * Array of icons for the custom actions.
- */
- private String[] actionsIcons = {
- "service.gui.icons.LEAVE_ICON_BUTTON",
- "service.gui.icons.JOIN_ICON_BUTTON",
- "service.gui.icons.AUTOJOIN_ON_ICON_BUTTON",
- "service.gui.icons.AUTOJOIN_OFF_ICON_BUTTON",
- "service.gui.icons.DESTROY_ICON_BUTTON"
- };
-
- /**
- * Array of rollover icons for the custom actions.
- */
- private String[] actionsIconsRollover = {
- "service.gui.icons.LEAVE_ICON_ROLLOVER_BUTTON",
- "service.gui.icons.JOIN_ICON_ROLLOVER_BUTTON",
- "service.gui.icons.AUTOJOIN_ON_ICON_ROLLOVER_BUTTON",
- "service.gui.icons.AUTOJOIN_OFF_ICON_ROLLOVER_BUTTON",
- "service.gui.icons.DESTROY_ICON_ROLLOVER_BUTTON"
- };
-
- /**
- * Array of pressed icons for the custom actions.
- */
- private String[] actionsIconsPressed = {
- "service.gui.icons.LEAVE_ICON_PRESSED_BUTTON",
- "service.gui.icons.JOIN_ICON_PRESSED_BUTTON",
- "service.gui.icons.AUTOJOIN_ON_ICON_PRESSED_BUTTON",
- "service.gui.icons.AUTOJOIN_OFF_ICON_PRESSED_BUTTON",
- "service.gui.icons.DESTROY_ICON_PRESSED_BUTTON"
- };
-
- /**
- * Array of names for the custom menu items.
- */
- private String[] menuActionsNames = {
- "open",
- "join",
- "join_as",
- "leave",
- "remove",
- "change_nick",
- "autojoin",
- "autojoin_pressed",
- "open_automatically",
- "destroy_chatroom"
- };
-
- /**
- * Array of labels for the custom menu items.
- */
- private String[] menuActionsLabels = {
- "service.gui.OPEN",
- "service.gui.JOIN",
- "service.gui.JOIN_AS",
- "service.gui.LEAVE",
- "service.gui.REMOVE",
- "service.gui.CHANGE_NICK",
- "service.gui.JOIN_AUTOMATICALLY",
- "service.gui.DONT_JOIN_AUTOMATICALLY",
- "service.gui.OPEN_AUTOMATICALLY",
- "service.gui.DESTROY_CHATROOM"
- };
-
- /**
- * Array of icons for the custom menu items.
- */
- private String[] menuActionsIcons = {
- "service.gui.icons.CHAT_ROOM_16x16_ICON",
- "service.gui.icons.JOIN_ICON",
- "service.gui.icons.JOIN_AS_ICON",
- "service.gui.icons.LEAVE_ICON",
- "service.gui.icons.REMOVE_CHAT_ICON",
- "service.gui.icons.RENAME_16x16_ICON",
- "service.gui.icons.AUTOJOIN",
- "service.gui.icons.AUTOJOIN",
- "service.gui.icons.OPEN_AUTOMATICALLY",
- "service.gui.icons.DESTROY_CHATROOM"
- };
-
- /**
- * A runnable that leaves the chat room.
- */
- private MUCCustomActionRunnable leaveRunnable
- = new MUCCustomActionRunnable()
- {
-
- @Override
- public void run()
- {
- ChatRoomWrapper leavedRoomWrapped
- = MUCActivator.getMUCService().leaveChatRoom(
- chatRoomWrapper);
- if(leavedRoomWrapped != null)
- MUCActivator.getUIService().closeChatRoomWindow(
- leavedRoomWrapped);
- }
- };
-
- /**
- * A runnable that joins the chat room.
- */
- private MUCCustomActionRunnable joinRunnable
- = new MUCCustomActionRunnable()
- {
-
- @Override
- public void run()
- {
- String[] joinOptions;
- String subject = null;
- String nickName = null;
-
- nickName =
- ConfigurationUtils.getChatRoomProperty(
- chatRoomWrapper.getParentProvider()
- .getProtocolProvider(), chatRoomWrapper
- .getChatRoomID(), "userNickName");
- if(nickName == null)
- {
- joinOptions = ChatRoomJoinOptionsDialog.getJoinOptions(
- chatRoomWrapper.getParentProvider()
- .getProtocolProvider(),
- chatRoomWrapper.getChatRoomID(),
- MUCActivator.getGlobalDisplayDetailsService()
- .getDisplayName(chatRoomWrapper.getParentProvider()
- .getProtocolProvider()));
- nickName = joinOptions[0];
- subject = joinOptions[1];
- }
-
- if (nickName != null)
- MUCActivator.getMUCService().joinChatRoom(chatRoomWrapper,
- nickName, null, subject);
- }
- };
-
- /**
- * A runnable that sets / unsets auto join setting of the chat room.
- */
- private MUCCustomActionRunnable autoJoinRunnable
- = new MUCCustomActionRunnable()
- {
-
- @Override
- public void run()
- {
- chatRoomWrapper.setAutoJoin(!chatRoomWrapper.isAutojoin());
-
- }
- };
-
- /**
- * A runnable that destroys the chat room.
- */
- private MUCCustomActionRunnable destroyActionRunnable
- = new MUCCustomActionRunnable()
- {
-
- @Override
- public void run()
- {
- String destroyOptions[]
- = ChatRoomDestroyReasonDialog.getDestroyOptions();
- if(destroyOptions == null)
- return;
-
- MUCActivator.getMUCService().destroyChatRoom(chatRoomWrapper,
- destroyOptions[0], destroyOptions[1]);
-
- }
- };
-
- /**
- * Array of <tt>MUCCustomActionRunnable</tt> objects for the custom menu
- * items. They will be executed when the item is pressed.
- */
- private MUCCustomActionRunnable[] actionsRunnable = {
- leaveRunnable,
- joinRunnable,
- autoJoinRunnable,
- autoJoinRunnable,
- destroyActionRunnable
- };
-
- /**
- * Array of <tt>MUCCustomActionRunnable</tt> objects for the custom menu
- * items. They will be executed when the item is pressed.
- */
- private MUCCustomActionRunnable[] menuActionsRunnable = {
- new MUCCustomActionRunnable()
- {
- @Override
- public void run()
- {
- MUCActivator.getMUCService().openChatRoom(chatRoomWrapper);
- }
- },
- joinRunnable,
- new MUCCustomActionRunnable()
- {
-
- @Override
- public void run()
- {
- String[] joinOptions;
- joinOptions = ChatRoomJoinOptionsDialog.getJoinOptions(
- chatRoomWrapper.getParentProvider().getProtocolProvider(),
- chatRoomWrapper.getChatRoomID(),
- MUCActivator.getGlobalDisplayDetailsService()
- .getDisplayName(chatRoomWrapper.getParentProvider()
- .getProtocolProvider()));
- if(joinOptions[0] == null)
- return;
- MUCActivator.getMUCService()
- .joinChatRoom(chatRoomWrapper, joinOptions[0], null,
- joinOptions[1]);
- }
- },
- leaveRunnable,
- new MUCCustomActionRunnable()
- {
-
- @Override
- public void run()
- {
- ChatRoom chatRoom = chatRoomWrapper.getChatRoom();
-
- if (chatRoom != null)
- {
- ChatRoomWrapper leavedRoomWrapped
- = MUCActivator.getMUCService().leaveChatRoom(
- chatRoomWrapper);
- if(leavedRoomWrapped != null)
- MUCActivator.getUIService().closeChatRoomWindow(
- leavedRoomWrapped);
- }
-
- MUCActivator.getUIService().closeChatRoomWindow(chatRoomWrapper);
-
- MUCActivator.getMUCService().removeChatRoom(chatRoomWrapper);
- }
- },
- new MUCCustomActionRunnable()
- {
-
- @Override
- public void run()
- {
- ChatRoomJoinOptionsDialog.getJoinOptions(true,
- chatRoomWrapper.getParentProvider().getProtocolProvider(),
- chatRoomWrapper.getChatRoomID(),
- MUCActivator.getGlobalDisplayDetailsService()
- .getDisplayName(chatRoomWrapper.getParentProvider()
- .getProtocolProvider()));
- }
- },
- autoJoinRunnable,
- autoJoinRunnable,
- new MUCCustomActionRunnable()
- {
-
- @Override
- public void run()
- {
- MUCActivator.getUIService().showChatRoomAutoOpenConfigDialog(
- chatRoomWrapper.getParentProvider().getProtocolProvider(),
- chatRoomWrapper.getChatRoomID());
- }
- },
- destroyActionRunnable
- };
-
- /**
- * Array of <tt>EnableChecker</tt> objects for the custom menu items. They
- * are used to check if the item is enabled or disabled.
- */
- private EnableChecker[] actionsEnabledCheckers = {
- null,
- new JoinEnableChecker(),
- new JoinEnableChecker(),
- new LeaveEnableChecker(),
- null,
- null,
- null,
- null,
- null,
- null
- };
-
- /**
- * The resource management service instance.
- */
- ResourceManagementService resources = MUCActivator.getResources();
-
- /**
- * Constructs the custom actions.
- */
- public MUCCustomContactActionService()
- {
- for(int i = 0; i < menuActionsLabels.length; i++)
- {
- MUCActionMenuItems item
- = new MUCActionMenuItems(
- menuActionsNames[i],
- menuActionsLabels[i],
- menuActionsIcons[i],
- menuActionsRunnable[i]);
- mucActionMenuItems.add(item);
- if(actionsEnabledCheckers[i] != null)
- item.setEnabled(actionsEnabledCheckers[i]);
- }
-
- for(int i = 0; i < actionsLabels.length; i++)
- {
- MUCAction item = new MUCAction(
- actionsNames[i],
- actionsLabels[i],
- actionsIcons[i],
- actionsIconsRollover[i],
- actionsIconsPressed[i],
- actionsRunnable[i]);
- mucActions.add(item);
- }
-
- }
-
- /**
- * Returns the template class that this service has been initialized with
- *
- * @return the template class
- */
- public Class<SourceContact> getContactSourceClass()
- {
- return SourceContact.class;
- }
-
- @Override
- public Iterator<ContactActionMenuItem<SourceContact>>
- getCustomContactActionsMenuItems()
- {
- return mucActionMenuItems.iterator();
- }
-
-
- @Override
- public Iterator<ContactAction<SourceContact>> getCustomContactActions()
- {
- return mucActions.iterator();
- }
-
- /**
- * Implements the MUC custom action.
- */
- private class MUCAction
- implements ContactAction<SourceContact>
- {
- /**
- * The text of the action.
- */
- private String text;
-
- /**
- * The icon of the action
- */
- private byte[] icon;
-
- /**
- * The icon that is shown when the action is pressed.
- */
- private byte[] iconPressed;
-
- /**
- * The runnable that is executed when the action is pressed.
- */
- private MUCCustomActionRunnable actionPerformed;
-
- /**
- * The icon that is shown when the mouse is over the action.
- */
- private byte[] iconRollover;
-
- /**
- * The name of the action.
- */
- private String name;
-
- /**
- * Constructs <tt>MUCAction</tt> instance.
- *
- * @param textKey the key used to retrieve the label for the action.
- * @param iconKey the key used to retrieve the icon for the action.
- * @param actionPerformed the action executed when the action is
- * pressed.
- * @param iconRolloverKey the key used to retrieve the rollover icon for
- * the action.
- * @param iconPressedKey the key used to retrieve the pressed icon for
- * the action.
- */
- public MUCAction(String name, String textKey, String iconKey,
- String iconRolloverKey, String iconPressedKey,
- MUCCustomActionRunnable actionPerformed)
- {
- this.name = name;
- this.text = resources.getI18NString(textKey);
- this.icon = resources.getImageInBytes(iconKey);
- this.iconRollover = resources.getImageInBytes(iconRolloverKey);
- this.iconPressed = resources.getImageInBytes(iconPressedKey);
- this.actionPerformed = actionPerformed;
- }
-
- @Override
- public void actionPerformed(SourceContact actionSource, int x, int y)
- throws OperationFailedException
- {
- if(!(actionSource instanceof ChatRoomSourceContact))
- return;
- actionPerformed.setContact(actionSource);
- new Thread(actionPerformed).start();
- }
-
- @Override
- public byte[] getIcon()
- {
- return icon;
- }
-
- @Override
- public byte[] getRolloverIcon()
- {
- return iconRollover;
- }
-
- @Override
- public byte[] getPressedIcon()
- {
- return iconPressed;
- }
-
- @Override
- public String getToolTipText()
- {
- return text;
- }
-
- @Override
- public boolean isVisible(SourceContact actionSource)
- {
- if(actionSource instanceof ChatRoomSourceContact)
- {
- if(name.equals("leave"))
- {
- return actionsEnabledCheckers[3].check(actionSource);
- }
- else if(name.equals("join"))
- {
- return actionsEnabledCheckers[1].check(actionSource);
- }
- else if(name.equals("destroy_chatroom"))
- {
- ChatRoomSourceContact contact
- = (ChatRoomSourceContact) actionSource;
- ChatRoomWrapper room = MUCActivator.getMUCService()
- .findChatRoomWrapperFromSourceContact(contact);
- if(room == null || room.getChatRoom() == null)
- return false;
- if(room.getChatRoom().getUserRole().equals(ChatRoomMemberRole.OWNER))
- return true;
- return false;
- }
- else
- {
- ChatRoomSourceContact contact
- = (ChatRoomSourceContact) actionSource;
- ChatRoomWrapper room = MUCActivator.getMUCService()
- .findChatRoomWrapperFromSourceContact(contact);
- if(room == null)
- return false;
-
- if(name.equals("autojoin"))
- return room.isAutojoin();
- else if(name.equals("autojoin_pressed"))
- return !room.isAutojoin();
- }
- }
- return false;
- }
-
- }
-
- /**
- * Implements the MUC custom menu items.
- */
- private class MUCActionMenuItems
- implements ContactActionMenuItem<SourceContact>
- {
- /**
- * The label for the menu item.
- */
- private String text;
-
- /**
- * The the icon for the menu item.
- */
- private byte[] image;
-
- /**
- * The action executed when the menu item is pressed.
- */
- private MUCCustomActionRunnable actionPerformed;
-
- /**
- * Object that is used to check if the item is enabled or disabled.
- */
- private EnableChecker enabled;
-
- /**
- * The name of the custom action menu item.
- */
- private String name;
-
- /**
- * The mnemonic for the action.
- */
- private char mnemonics;
-
- /**
- * Constructs <tt>MUCActionMenuItems</tt> instance.
- *
- * @param textKey the key used to retrieve the label for the menu item.
- * @param imageKey the key used to retrieve the icon for the menu item.
- * @param actionPerformed the action executed when the menu item is
- * pressed.
- */
- public MUCActionMenuItems(String name, String textKey, String imageKey,
- MUCCustomActionRunnable actionPerformed)
- {
- this.text = resources.getI18NString(textKey);
- this.image = (imageKey == null)? null :
- resources.getImageInBytes(imageKey);
- this.actionPerformed = actionPerformed;
- this.enabled = new EnableChecker();
- this.name = name;
- this.mnemonics = resources.getI18nMnemonic(textKey);
- }
-
- @Override
- public void actionPerformed(SourceContact actionSource)
- throws OperationFailedException
- {
- if(!(actionSource instanceof ChatRoomSourceContact))
- return;
- actionPerformed.setContact(actionSource);
- new Thread(actionPerformed).start();
- }
-
- @Override
- public byte[] getIcon()
- {
- return image;
- }
-
-
- @Override
- public String getText(SourceContact actionSource)
- {
- if(!(actionSource instanceof ChatRoomSourceContact))
- return "";
-
- if(!name.equals("open_automatically"))
- return text;
-
- String openAutomaticallyValue
- = MUCService.getChatRoomAutoOpenOption(
- ((ChatRoomSourceContact)actionSource).getProvider(),
- ((ChatRoomSourceContact)actionSource).getChatRoomID());
- if(openAutomaticallyValue == null)
- openAutomaticallyValue = MUCService.DEFAULT_AUTO_OPEN_BEHAVIOUR;
- String openAutomaticallyKey = MUCService.autoOpenConfigValuesTexts
- .get(openAutomaticallyValue);
- return "<html>" + text + "...<br><font size=\"2\"><center> ("
- + resources.getI18NString(openAutomaticallyKey)
- + ")</center></font></html>";
- }
-
- @Override
- public boolean isVisible(SourceContact actionSource)
- {
- if(!(actionSource instanceof ChatRoomSourceContact))
- return false;
-
- ChatRoomSourceContact contact
- = (ChatRoomSourceContact) actionSource;
- ChatRoomWrapper room = MUCActivator.getMUCService()
- .findChatRoomWrapperFromSourceContact(contact);
- if(name.equals("autojoin") || name.equals("autojoin_pressed"))
- {
- if(room == null)
- return true;
-
- if(name.equals("autojoin"))
- return !room.isAutojoin();
-
- if(name.equals("autojoin_pressed"))
- return room.isAutojoin();
- }
- else if(name.equals("remove"))
- {
- if(room == null || room.getChatRoom() == null)
- return true;
-
- boolean ownerCannotRemoveRoom
- = MUCActivator.getConfigurationService().getBoolean(
- OWNER_CANT_REMOVE_CHATROOM_PROPERTY, false);
-
- // when joined role will be owner or member
- // when not joined and if we never has entered the room role
- // will be guest, if we joined and left the room the role
- // will be owner or member
- if(room.getChatRoom().getUserRole().equals(
- ChatRoomMemberRole.MEMBER))
- {
- return true;
- }
- else
- {
- if(ownerCannotRemoveRoom)
- return false;
- else
- return true;
- }
- }
- else if(name.equals("destroy_chatroom"))
- {
- if(room == null || room.getChatRoom() == null)
- return false;
- if(room.getChatRoom().getUserRole().equals(
- ChatRoomMemberRole.OWNER))
- return true;
- return false;
- }
- return true;
- }
-
- @Override
- public char getMnemonics()
- {
- return mnemonics;
- }
-
- @Override
- public boolean isEnabled(SourceContact actionSource)
- {
- return enabled.check(actionSource);
- }
-
- /**
- * Sets <tt>EnabledChecker</tt> instance that will be used to check if
- * the item should be enabled or disabled.
- *
- * @param enabled the <tt>EnabledChecker</tt> instance.
- */
- public void setEnabled(EnableChecker enabled)
- {
- this.enabled = enabled;
- }
-
- @Override
- public boolean isCheckBox()
- {
- return false;
- }
-
- @Override
- public boolean isSelected(SourceContact contact)
- {
- ChatRoomWrapper chatRoomWrapper = MUCActivator.getMUCService()
- .findChatRoomWrapperFromSourceContact(contact);
- if(chatRoomWrapper == null)
- return false;
- return chatRoomWrapper.isAutojoin();
- }
-
- }
-
- /**
- * Checks if the menu item should be enabled or disabled. This is default
- * implementation. Always returns that the item should be enabled.
- */
- private static class EnableChecker
- {
- /**
- * Checks if the menu item should be enabled or disabled.
- *
- * @param contact the contact associated with the menu item.
- * @return always <tt>true</tt>
- */
- public boolean check(SourceContact contact)
- {
- return true;
- }
- }
-
- /**
- * Implements <tt>EnableChecker</tt> for the join menu items.
- */
- private static class JoinEnableChecker
- extends EnableChecker
- {
- /**
- * Checks if the menu item should be enabled or disabled.
- *
- * @param contact the contact associated with the menu item.
- * @return <tt>true</tt> if the item should be enabled and
- * <tt>false</tt> if not.
- */
- public boolean check(SourceContact contact)
- {
- ChatRoomWrapper chatRoomWrapper = MUCActivator.getMUCService()
- .findChatRoomWrapperFromSourceContact(contact);
- ChatRoom chatRoom = null;
- if(chatRoomWrapper != null)
- {
- chatRoom = chatRoomWrapper.getChatRoom();
- }
-
- if((chatRoom != null) && chatRoom.isJoined())
- return false;
- return true;
- }
- }
-
- /**
- * Implements <tt>EnableChecker</tt> for the leave menu item.
- */
- private static class LeaveEnableChecker
- extends JoinEnableChecker
- {
- /**
- * Checks if the menu item should be enabled or disabled.
- *
- * @param contact the contact associated with the menu item.
- * @return <tt>true</tt> if the item should be enabled and
- * <tt>false</tt> if not.
- */
- public boolean check(SourceContact contact)
- {
- return !super.check(contact);
- }
- }
-
- /**
- * Implements base properties for the MUC menu items.These properties are
- * used when the menu item is pressed.
- */
- private abstract class MUCCustomActionRunnable
- implements Runnable
- {
- /**
- * The contact associated with the menu item.
- */
- protected SourceContact contact;
-
- /**
- * The contact associated with the menu item.
- */
- protected ChatRoomWrapper chatRoomWrapper;
-
- /**
- * Sets the source contact.
- * @param contact the contact to set
- */
- public void setContact(SourceContact contact)
- {
- this.contact = contact;
- chatRoomWrapper = MUCActivator.getMUCService()
- .findChatRoomWrapperFromSourceContact(contact);
- }
- }
-}
+package net.java.sip.communicator.impl.muc; + +import java.util.*; + +import net.java.sip.communicator.plugin.desktoputil.chat.*; +import net.java.sip.communicator.service.contactsource.*; +import net.java.sip.communicator.service.customcontactactions.*; +import net.java.sip.communicator.service.muc.*; +import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.util.*; + +import org.jitsi.service.resources.*; + +/** + * Implements <tt>CustomContactActionsService</tt> for MUC contact source. + * + * @author Hristo Terezov + */ +public class MUCCustomContactActionService + implements CustomContactActionsService<SourceContact> +{ + /** + * List of custom menu items. + */ + private final List<ContactActionMenuItem<SourceContact>> mucActionMenuItems + = new LinkedList<ContactActionMenuItem<SourceContact>>(); + + /** + * List of custom actions. + */ + private final List<ContactAction<SourceContact>> mucActions + = new LinkedList<ContactAction<SourceContact>>(); + + /** + * + */ + private static final String OWNER_CANT_REMOVE_CHATROOM_PROPERTY + = "net.java.sip.communicator.impl.muc.OWNER_CANT_REMOVE_CHATROOM"; + + /** + * Array of names for the custom actions. + */ + private String[] actionsNames = { + "leave", + "join", + "autojoin", + "autojoin_pressed", + "destroy_chatroom" + }; + + /** + * Array of labels for the custom actions. + */ + private String[] actionsLabels = { + "service.gui.LEAVE", + "service.gui.JOIN", + "service.gui.JOIN_AUTOMATICALLY", + "service.gui.JOIN_AUTOMATICALLY", + "service.gui.DESTROY_CHATROOM" + }; + + /** + * Array of icons for the custom actions. + */ + private String[] actionsIcons = { + "service.gui.icons.LEAVE_ICON_BUTTON", + "service.gui.icons.JOIN_ICON_BUTTON", + "service.gui.icons.AUTOJOIN_ON_ICON_BUTTON", + "service.gui.icons.AUTOJOIN_OFF_ICON_BUTTON", + "service.gui.icons.DESTROY_ICON_BUTTON" + }; + + /** + * Array of rollover icons for the custom actions. + */ + private String[] actionsIconsRollover = { + "service.gui.icons.LEAVE_ICON_ROLLOVER_BUTTON", + "service.gui.icons.JOIN_ICON_ROLLOVER_BUTTON", + "service.gui.icons.AUTOJOIN_ON_ICON_ROLLOVER_BUTTON", + "service.gui.icons.AUTOJOIN_OFF_ICON_ROLLOVER_BUTTON", + "service.gui.icons.DESTROY_ICON_ROLLOVER_BUTTON" + }; + + /** + * Array of pressed icons for the custom actions. + */ + private String[] actionsIconsPressed = { + "service.gui.icons.LEAVE_ICON_PRESSED_BUTTON", + "service.gui.icons.JOIN_ICON_PRESSED_BUTTON", + "service.gui.icons.AUTOJOIN_ON_ICON_PRESSED_BUTTON", + "service.gui.icons.AUTOJOIN_OFF_ICON_PRESSED_BUTTON", + "service.gui.icons.DESTROY_ICON_PRESSED_BUTTON" + }; + + /** + * Array of names for the custom menu items. + */ + private String[] menuActionsNames = { + "open", + "join", + "join_as", + "leave", + "remove", + "change_nick", + "autojoin", + "autojoin_pressed", + "open_automatically", + "destroy_chatroom" + }; + + /** + * Array of labels for the custom menu items. + */ + private String[] menuActionsLabels = { + "service.gui.OPEN", + "service.gui.JOIN", + "service.gui.JOIN_AS", + "service.gui.LEAVE", + "service.gui.REMOVE", + "service.gui.CHANGE_NICK", + "service.gui.JOIN_AUTOMATICALLY", + "service.gui.DONT_JOIN_AUTOMATICALLY", + "service.gui.OPEN_AUTOMATICALLY", + "service.gui.DESTROY_CHATROOM" + }; + + /** + * Array of icons for the custom menu items. + */ + private String[] menuActionsIcons = { + "service.gui.icons.CHAT_ROOM_16x16_ICON", + "service.gui.icons.JOIN_ICON", + "service.gui.icons.JOIN_AS_ICON", + "service.gui.icons.LEAVE_ICON", + "service.gui.icons.REMOVE_CHAT_ICON", + "service.gui.icons.RENAME_16x16_ICON", + "service.gui.icons.AUTOJOIN", + "service.gui.icons.AUTOJOIN", + "service.gui.icons.OPEN_AUTOMATICALLY", + "service.gui.icons.DESTROY_CHATROOM" + }; + + /** + * A runnable that leaves the chat room. + */ + private MUCCustomActionRunnable leaveRunnable + = new MUCCustomActionRunnable() + { + + @Override + public void run() + { + ChatRoomWrapper leavedRoomWrapped + = MUCActivator.getMUCService().leaveChatRoom( + chatRoomWrapper); + if(leavedRoomWrapped != null) + MUCActivator.getUIService().closeChatRoomWindow( + leavedRoomWrapped); + } + }; + + /** + * A runnable that joins the chat room. + */ + private MUCCustomActionRunnable joinRunnable + = new MUCCustomActionRunnable() + { + + @Override + public void run() + { + String[] joinOptions; + String subject = null; + String nickName = null; + + nickName = + ConfigurationUtils.getChatRoomProperty( + chatRoomWrapper.getParentProvider() + .getProtocolProvider(), chatRoomWrapper + .getChatRoomID(), "userNickName"); + if(nickName == null) + { + joinOptions = ChatRoomJoinOptionsDialog.getJoinOptions( + chatRoomWrapper.getParentProvider() + .getProtocolProvider(), + chatRoomWrapper.getChatRoomID(), + MUCActivator.getGlobalDisplayDetailsService() + .getDisplayName(chatRoomWrapper.getParentProvider() + .getProtocolProvider())); + nickName = joinOptions[0]; + subject = joinOptions[1]; + } + + if (nickName != null) + MUCActivator.getMUCService().joinChatRoom(chatRoomWrapper, + nickName, null, subject); + } + }; + + /** + * A runnable that sets / unsets auto join setting of the chat room. + */ + private MUCCustomActionRunnable autoJoinRunnable + = new MUCCustomActionRunnable() + { + + @Override + public void run() + { + chatRoomWrapper.setAutoJoin(!chatRoomWrapper.isAutojoin()); + + } + }; + + /** + * A runnable that destroys the chat room. + */ + private MUCCustomActionRunnable destroyActionRunnable + = new MUCCustomActionRunnable() + { + + @Override + public void run() + { + String destroyOptions[] + = ChatRoomDestroyReasonDialog.getDestroyOptions(); + if(destroyOptions == null) + return; + + MUCActivator.getMUCService().destroyChatRoom(chatRoomWrapper, + destroyOptions[0], destroyOptions[1]); + + } + }; + + /** + * Array of <tt>MUCCustomActionRunnable</tt> objects for the custom menu + * items. They will be executed when the item is pressed. + */ + private MUCCustomActionRunnable[] actionsRunnable = { + leaveRunnable, + joinRunnable, + autoJoinRunnable, + autoJoinRunnable, + destroyActionRunnable + }; + + /** + * Array of <tt>MUCCustomActionRunnable</tt> objects for the custom menu + * items. They will be executed when the item is pressed. + */ + private MUCCustomActionRunnable[] menuActionsRunnable = { + new MUCCustomActionRunnable() + { + @Override + public void run() + { + MUCActivator.getMUCService().openChatRoom(chatRoomWrapper); + } + }, + joinRunnable, + new MUCCustomActionRunnable() + { + + @Override + public void run() + { + String[] joinOptions; + joinOptions = ChatRoomJoinOptionsDialog.getJoinOptions( + chatRoomWrapper.getParentProvider().getProtocolProvider(), + chatRoomWrapper.getChatRoomID(), + MUCActivator.getGlobalDisplayDetailsService() + .getDisplayName(chatRoomWrapper.getParentProvider() + .getProtocolProvider())); + if(joinOptions[0] == null) + return; + MUCActivator.getMUCService() + .joinChatRoom(chatRoomWrapper, joinOptions[0], null, + joinOptions[1]); + } + }, + leaveRunnable, + new MUCCustomActionRunnable() + { + + @Override + public void run() + { + ChatRoom chatRoom = chatRoomWrapper.getChatRoom(); + + if (chatRoom != null) + { + ChatRoomWrapper leavedRoomWrapped + = MUCActivator.getMUCService().leaveChatRoom( + chatRoomWrapper); + if(leavedRoomWrapped != null) + MUCActivator.getUIService().closeChatRoomWindow( + leavedRoomWrapped); + } + + MUCActivator.getUIService().closeChatRoomWindow(chatRoomWrapper); + + MUCActivator.getMUCService().removeChatRoom(chatRoomWrapper); + } + }, + new MUCCustomActionRunnable() + { + + @Override + public void run() + { + ChatRoomJoinOptionsDialog.getJoinOptions(true, + chatRoomWrapper.getParentProvider().getProtocolProvider(), + chatRoomWrapper.getChatRoomID(), + MUCActivator.getGlobalDisplayDetailsService() + .getDisplayName(chatRoomWrapper.getParentProvider() + .getProtocolProvider())); + } + }, + autoJoinRunnable, + autoJoinRunnable, + new MUCCustomActionRunnable() + { + + @Override + public void run() + { + MUCActivator.getUIService().showChatRoomAutoOpenConfigDialog( + chatRoomWrapper.getParentProvider().getProtocolProvider(), + chatRoomWrapper.getChatRoomID()); + } + }, + destroyActionRunnable + }; + + /** + * Array of <tt>EnableChecker</tt> objects for the custom menu items. They + * are used to check if the item is enabled or disabled. + */ + private EnableChecker[] actionsEnabledCheckers = { + null, + new JoinEnableChecker(), + new JoinEnableChecker(), + new LeaveEnableChecker(), + null, + null, + null, + null, + null, + null + }; + + /** + * The resource management service instance. + */ + ResourceManagementService resources = MUCActivator.getResources(); + + /** + * Constructs the custom actions. + */ + public MUCCustomContactActionService() + { + for(int i = 0; i < menuActionsLabels.length; i++) + { + MUCActionMenuItems item + = new MUCActionMenuItems( + menuActionsNames[i], + menuActionsLabels[i], + menuActionsIcons[i], + menuActionsRunnable[i]); + mucActionMenuItems.add(item); + if(actionsEnabledCheckers[i] != null) + item.setEnabled(actionsEnabledCheckers[i]); + } + + for(int i = 0; i < actionsLabels.length; i++) + { + MUCAction item = new MUCAction( + actionsNames[i], + actionsLabels[i], + actionsIcons[i], + actionsIconsRollover[i], + actionsIconsPressed[i], + actionsRunnable[i]); + mucActions.add(item); + } + + } + + /** + * Returns the template class that this service has been initialized with + * + * @return the template class + */ + public Class<SourceContact> getContactSourceClass() + { + return SourceContact.class; + } + + @Override + public Iterator<ContactActionMenuItem<SourceContact>> + getCustomContactActionsMenuItems() + { + return mucActionMenuItems.iterator(); + } + + + @Override + public Iterator<ContactAction<SourceContact>> getCustomContactActions() + { + return mucActions.iterator(); + } + + /** + * Implements the MUC custom action. + */ + private class MUCAction + implements ContactAction<SourceContact> + { + /** + * The text of the action. + */ + private String text; + + /** + * The icon of the action + */ + private byte[] icon; + + /** + * The icon that is shown when the action is pressed. + */ + private byte[] iconPressed; + + /** + * The runnable that is executed when the action is pressed. + */ + private MUCCustomActionRunnable actionPerformed; + + /** + * The icon that is shown when the mouse is over the action. + */ + private byte[] iconRollover; + + /** + * The name of the action. + */ + private String name; + + /** + * Constructs <tt>MUCAction</tt> instance. + * + * @param textKey the key used to retrieve the label for the action. + * @param iconKey the key used to retrieve the icon for the action. + * @param actionPerformed the action executed when the action is + * pressed. + * @param iconRolloverKey the key used to retrieve the rollover icon for + * the action. + * @param iconPressedKey the key used to retrieve the pressed icon for + * the action. + */ + public MUCAction(String name, String textKey, String iconKey, + String iconRolloverKey, String iconPressedKey, + MUCCustomActionRunnable actionPerformed) + { + this.name = name; + this.text = resources.getI18NString(textKey); + this.icon = resources.getImageInBytes(iconKey); + this.iconRollover = resources.getImageInBytes(iconRolloverKey); + this.iconPressed = resources.getImageInBytes(iconPressedKey); + this.actionPerformed = actionPerformed; + } + + @Override + public void actionPerformed(SourceContact actionSource, int x, int y) + throws OperationFailedException + { + if(!(actionSource instanceof ChatRoomSourceContact)) + return; + actionPerformed.setContact(actionSource); + new Thread(actionPerformed).start(); + } + + @Override + public byte[] getIcon() + { + return icon; + } + + @Override + public byte[] getRolloverIcon() + { + return iconRollover; + } + + @Override + public byte[] getPressedIcon() + { + return iconPressed; + } + + @Override + public String getToolTipText() + { + return text; + } + + @Override + public boolean isVisible(SourceContact actionSource) + { + if(actionSource instanceof ChatRoomSourceContact) + { + if(name.equals("leave")) + { + return actionsEnabledCheckers[3].check(actionSource); + } + else if(name.equals("join")) + { + return actionsEnabledCheckers[1].check(actionSource); + } + else if(name.equals("destroy_chatroom")) + { + ChatRoomSourceContact contact + = (ChatRoomSourceContact) actionSource; + ChatRoomWrapper room = MUCActivator.getMUCService() + .findChatRoomWrapperFromSourceContact(contact); + if(room == null || room.getChatRoom() == null) + return false; + if(room.getChatRoom().getUserRole().equals(ChatRoomMemberRole.OWNER)) + return true; + return false; + } + else + { + ChatRoomSourceContact contact + = (ChatRoomSourceContact) actionSource; + ChatRoomWrapper room = MUCActivator.getMUCService() + .findChatRoomWrapperFromSourceContact(contact); + if(room == null) + return false; + + if(name.equals("autojoin")) + return room.isAutojoin(); + else if(name.equals("autojoin_pressed")) + return !room.isAutojoin(); + } + } + return false; + } + + } + + /** + * Implements the MUC custom menu items. + */ + private class MUCActionMenuItems + implements ContactActionMenuItem<SourceContact> + { + /** + * The label for the menu item. + */ + private String text; + + /** + * The the icon for the menu item. + */ + private byte[] image; + + /** + * The action executed when the menu item is pressed. + */ + private MUCCustomActionRunnable actionPerformed; + + /** + * Object that is used to check if the item is enabled or disabled. + */ + private EnableChecker enabled; + + /** + * The name of the custom action menu item. + */ + private String name; + + /** + * The mnemonic for the action. + */ + private char mnemonics; + + /** + * Constructs <tt>MUCActionMenuItems</tt> instance. + * + * @param textKey the key used to retrieve the label for the menu item. + * @param imageKey the key used to retrieve the icon for the menu item. + * @param actionPerformed the action executed when the menu item is + * pressed. + */ + public MUCActionMenuItems(String name, String textKey, String imageKey, + MUCCustomActionRunnable actionPerformed) + { + this.text = resources.getI18NString(textKey); + this.image = (imageKey == null)? null : + resources.getImageInBytes(imageKey); + this.actionPerformed = actionPerformed; + this.enabled = new EnableChecker(); + this.name = name; + this.mnemonics = resources.getI18nMnemonic(textKey); + } + + @Override + public void actionPerformed(SourceContact actionSource) + throws OperationFailedException + { + if(!(actionSource instanceof ChatRoomSourceContact)) + return; + actionPerformed.setContact(actionSource); + new Thread(actionPerformed).start(); + } + + @Override + public byte[] getIcon() + { + return image; + } + + + @Override + public String getText(SourceContact actionSource) + { + if(!(actionSource instanceof ChatRoomSourceContact)) + return ""; + + if(!name.equals("open_automatically")) + return text; + + String openAutomaticallyValue + = MUCService.getChatRoomAutoOpenOption( + ((ChatRoomSourceContact)actionSource).getProvider(), + ((ChatRoomSourceContact)actionSource).getChatRoomID()); + if(openAutomaticallyValue == null) + openAutomaticallyValue = MUCService.DEFAULT_AUTO_OPEN_BEHAVIOUR; + String openAutomaticallyKey = MUCService.autoOpenConfigValuesTexts + .get(openAutomaticallyValue); + return "<html>" + text + "...<br><font size=\"2\"><center> (" + + resources.getI18NString(openAutomaticallyKey) + + ")</center></font></html>"; + } + + @Override + public boolean isVisible(SourceContact actionSource) + { + if(!(actionSource instanceof ChatRoomSourceContact)) + return false; + + ChatRoomSourceContact contact + = (ChatRoomSourceContact) actionSource; + ChatRoomWrapper room = MUCActivator.getMUCService() + .findChatRoomWrapperFromSourceContact(contact); + if(name.equals("autojoin") || name.equals("autojoin_pressed")) + { + if(room == null) + return true; + + if(name.equals("autojoin")) + return !room.isAutojoin(); + + if(name.equals("autojoin_pressed")) + return room.isAutojoin(); + } + else if(name.equals("remove")) + { + if(room == null || room.getChatRoom() == null) + return true; + + boolean ownerCannotRemoveRoom + = MUCActivator.getConfigurationService().getBoolean( + OWNER_CANT_REMOVE_CHATROOM_PROPERTY, false); + + // when joined role will be owner or member + // when not joined and if we never has entered the room role + // will be guest, if we joined and left the room the role + // will be owner or member + if(room.getChatRoom().getUserRole().equals( + ChatRoomMemberRole.MEMBER)) + { + return true; + } + else + { + if(ownerCannotRemoveRoom) + return false; + else + return true; + } + } + else if(name.equals("destroy_chatroom")) + { + if(room == null || room.getChatRoom() == null) + return false; + if(room.getChatRoom().getUserRole().equals( + ChatRoomMemberRole.OWNER)) + return true; + return false; + } + return true; + } + + @Override + public char getMnemonics() + { + return mnemonics; + } + + @Override + public boolean isEnabled(SourceContact actionSource) + { + return enabled.check(actionSource); + } + + /** + * Sets <tt>EnabledChecker</tt> instance that will be used to check if + * the item should be enabled or disabled. + * + * @param enabled the <tt>EnabledChecker</tt> instance. + */ + public void setEnabled(EnableChecker enabled) + { + this.enabled = enabled; + } + + @Override + public boolean isCheckBox() + { + return false; + } + + @Override + public boolean isSelected(SourceContact contact) + { + ChatRoomWrapper chatRoomWrapper = MUCActivator.getMUCService() + .findChatRoomWrapperFromSourceContact(contact); + if(chatRoomWrapper == null) + return false; + return chatRoomWrapper.isAutojoin(); + } + + } + + /** + * Checks if the menu item should be enabled or disabled. This is default + * implementation. Always returns that the item should be enabled. + */ + private static class EnableChecker + { + /** + * Checks if the menu item should be enabled or disabled. + * + * @param contact the contact associated with the menu item. + * @return always <tt>true</tt> + */ + public boolean check(SourceContact contact) + { + return true; + } + } + + /** + * Implements <tt>EnableChecker</tt> for the join menu items. + */ + private static class JoinEnableChecker + extends EnableChecker + { + /** + * Checks if the menu item should be enabled or disabled. + * + * @param contact the contact associated with the menu item. + * @return <tt>true</tt> if the item should be enabled and + * <tt>false</tt> if not. + */ + public boolean check(SourceContact contact) + { + ChatRoomWrapper chatRoomWrapper = MUCActivator.getMUCService() + .findChatRoomWrapperFromSourceContact(contact); + ChatRoom chatRoom = null; + if(chatRoomWrapper != null) + { + chatRoom = chatRoomWrapper.getChatRoom(); + } + + if((chatRoom != null) && chatRoom.isJoined()) + return false; + return true; + } + } + + /** + * Implements <tt>EnableChecker</tt> for the leave menu item. + */ + private static class LeaveEnableChecker + extends JoinEnableChecker + { + /** + * Checks if the menu item should be enabled or disabled. + * + * @param contact the contact associated with the menu item. + * @return <tt>true</tt> if the item should be enabled and + * <tt>false</tt> if not. + */ + public boolean check(SourceContact contact) + { + return !super.check(contact); + } + } + + /** + * Implements base properties for the MUC menu items.These properties are + * used when the menu item is pressed. + */ + private abstract class MUCCustomActionRunnable + implements Runnable + { + /** + * The contact associated with the menu item. + */ + protected SourceContact contact; + + /** + * The contact associated with the menu item. + */ + protected ChatRoomWrapper chatRoomWrapper; + + /** + * Sets the source contact. + * @param contact the contact to set + */ + public void setContact(SourceContact contact) + { + this.contact = contact; + chatRoomWrapper = MUCActivator.getMUCService() + .findChatRoomWrapperFromSourceContact(contact); + } + } +} diff --git a/src/net/java/sip/communicator/impl/muc/MUCServiceImpl.java b/src/net/java/sip/communicator/impl/muc/MUCServiceImpl.java index f6dd1c7..be02255 100644 --- a/src/net/java/sip/communicator/impl/muc/MUCServiceImpl.java +++ b/src/net/java/sip/communicator/impl/muc/MUCServiceImpl.java @@ -1,4 +1,4 @@ -/*
+/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd @@ -15,1117 +15,1117 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package net.java.sip.communicator.impl.muc;
-
-import static net.java.sip.communicator.service.muc.ChatRoomWrapper.*;
-
-import java.util.*;
-
-import net.java.sip.communicator.plugin.desktoputil.*;
-import net.java.sip.communicator.plugin.desktoputil.chat.*;
-import net.java.sip.communicator.service.contactsource.*;
-import net.java.sip.communicator.service.gui.*;
-import net.java.sip.communicator.service.muc.*;
-import net.java.sip.communicator.service.protocol.*;
-import net.java.sip.communicator.service.protocol.globalstatus.*;
-import net.java.sip.communicator.util.*;
-
-import org.jitsi.service.resources.*;
-
-/**
- * The <tt>MUCServiceImpl</tt> class implements the service for the chat rooms.
- *
- * @author Hristo Terezov
- */
-public class MUCServiceImpl
- extends MUCService
-{
-
- /**
- * The list of persistent chat rooms.
- */
- private final ChatRoomListImpl chatRoomList = new ChatRoomListImpl();
-
- /**
- * The <tt>Logger</tt> used by the <tt>MUCServiceImpl</tt> class and its
- * instances for logging output.
- */
- private static Logger logger = Logger.getLogger(MUCServiceImpl.class);
-
- /**
- * Called to accept an incoming invitation. Adds the invitation chat room
- * to the list of chat rooms and joins it.
- *
- * @param invitation the invitation to accept.
- */
- public void acceptInvitation(ChatRoomInvitation invitation)
- {
- ChatRoom chatRoom = invitation.getTargetChatRoom();
- byte[] password = invitation.getChatRoomPassword();
-
- String nickName =
- ConfigurationUtils.getChatRoomProperty(
- chatRoom.getParentProvider(),
- chatRoom.getIdentifier(), "userNickName");
- if(nickName == null)
- {
- String[] joinOptions = ChatRoomJoinOptionsDialog.getJoinOptions(
- true,
- chatRoom.getParentProvider(),
- chatRoom.getIdentifier(),
- MUCActivator.getGlobalDisplayDetailsService()
- .getDisplayName(chatRoom.getParentProvider()));
- nickName = joinOptions[0];
- }
-
- joinChatRoom(chatRoom, nickName, password);
- }
-
- /**
- * Adds a change listener to the <tt>ChatRoomList</tt>.
- *
- * @param l the listener.
- */
- public void addChatRoomListChangeListener(ChatRoomListChangeListener l)
- {
- chatRoomList.addChatRoomListChangeListener(l);
- }
-
- /**
- * Removes a change listener to the <tt>ChatRoomList</tt>.
- *
- * @param l the listener.
- */
- public void removeChatRoomListChangeListener(ChatRoomListChangeListener l)
- {
- chatRoomList.removeChatRoomListChangeListener(l);
- }
-
- /**
- * Fires a <tt>ChatRoomListChangedEvent</tt> event.
- *
- * @param chatRoomWrapper the chat room.
- * @param eventID the id of the event.
- */
- public void fireChatRoomListChangedEvent( ChatRoomWrapper chatRoomWrapper,
- int eventID)
- {
- chatRoomList.fireChatRoomListChangedEvent(chatRoomWrapper, eventID);
- }
-
- /**
- * Joins the given chat room with the given password and manages all the
- * exceptions that could occur during the join process.
- *
- * @param chatRoomWrapper the chat room to join.
- * @param nickName the nickname we choose for the given chat room.
- * @param password the password.
- * @param rememberPassword if true the password should be saved.
- * @param isFirstAttempt is this the first attempt to join room, used
- * to check whether to show some error messages
- * @param subject the subject which will be set to the room after the user
- * join successful.
- */
- private void joinChatRoom( ChatRoomWrapper chatRoomWrapper,
- String nickName,
- byte[] password,
- boolean rememberPassword,
- boolean isFirstAttempt,
- String subject)
- {
- ChatRoom chatRoom = chatRoomWrapper.getChatRoom();
-
- if(chatRoom == null)
- {
- MUCActivator.getAlertUIService().showAlertDialog(
- MUCActivator.getResources().getI18NString("service.gui.WARNING"),
- MUCActivator.getResources().getI18NString(
- "service.gui.CHAT_ROOM_NOT_CONNECTED",
- new String[]{chatRoomWrapper.getChatRoomName()}));
- return;
- }
-
- new JoinChatRoomTask(
- (ChatRoomWrapperImpl)chatRoomWrapper,
- nickName,
- password,
- rememberPassword,
- isFirstAttempt,
- subject)
- .start();
- }
-
- /**
- * Joins the given chat room with the given password and manages all the
- * exceptions that could occur during the join process.
- *
- * @param chatRoomWrapper the chat room to join.
- * @param nickName the nickname we choose for the given chat room.
- * @param password the password.
- */
- public void joinChatRoom( ChatRoomWrapper chatRoomWrapper,
- String nickName,
- byte[] password)
- {
- if (chatRoomWrapper.getChatRoom() == null)
- {
- chatRoomWrapper = createChatRoom(
- chatRoomWrapper.getChatRoomName(),
- chatRoomWrapper.getParentProvider().getProtocolProvider(),
- new ArrayList<String>(), "", false, false, true);
- }
-
- ChatRoom chatRoom = chatRoomWrapper.getChatRoom();
-
- if(chatRoom == null)
- {
- MUCActivator.getAlertUIService().showAlertDialog(
- MUCActivator.getResources().getI18NString("service.gui.WARNING"),
- MUCActivator.getResources().getI18NString(
- "service.gui.CHAT_ROOM_NOT_CONNECTED",
- new String[]{chatRoomWrapper.getChatRoomName()}));
- return;
- }
-
- new JoinChatRoomTask(
- (ChatRoomWrapperImpl)chatRoomWrapper, nickName, password)
- .start();
- }
-
- /**
- * Joins the given chat room with the given password and manages all the
- * exceptions that could occur during the join process.
- *
- * @param chatRoomWrapper the chat room to join.
- * @param nickName the nickname we choose for the given chat room.
- * @param password the password.
- * @param subject the subject which will be set to the room after the user
- * join successful.
- */
- public void joinChatRoom( ChatRoomWrapper chatRoomWrapper,
- String nickName,
- byte[] password,
- String subject)
- {
- if (chatRoomWrapper.getChatRoom() == null)
- {
- chatRoomWrapper = createChatRoom(
- chatRoomWrapper.getChatRoomName(),
- chatRoomWrapper.getParentProvider().getProtocolProvider(),
- new ArrayList<String>(), "", false, false, true);
- }
-
- ChatRoom chatRoom = chatRoomWrapper.getChatRoom();
- if (chatRoom == null)
- {
- MUCActivator.getAlertUIService().showAlertDialog(
- MUCActivator.getResources().getI18NString("service.gui.WARNING"),
- MUCActivator.getResources().getI18NString(
- "service.gui.CHAT_ROOM_NOT_CONNECTED",
- new String[]{chatRoomWrapper.getChatRoomName()}));
-
- return;
- }
-
- // join from add chat room dialog
-
- new JoinChatRoomTask(
- (ChatRoomWrapperImpl) chatRoomWrapper,
- nickName,
- password,
- subject)
- .start();
- }
-
-
- /**
- * Join chat room.
- * @param chatRoomWrapper
- */
- public void joinChatRoom(ChatRoomWrapper chatRoomWrapper)
- {
- if (chatRoomWrapper.getChatRoom() == null)
- {
- chatRoomWrapper = createChatRoom(
- chatRoomWrapper.getChatRoomName(),
- chatRoomWrapper.getParentProvider().getProtocolProvider(),
- new ArrayList<String>(), "", false, false, true);
- }
-
- ChatRoom chatRoom = chatRoomWrapper.getChatRoom();
-
- if(chatRoom == null)
- {
- MUCActivator.getAlertUIService().showAlertDialog(
- MUCActivator.getResources().getI18NString("service.gui.WARNING"),
- MUCActivator.getResources().getI18NString(
- "service.gui.CHAT_ROOM_NOT_CONNECTED",
- new String[]{chatRoomWrapper.getChatRoomName()}));
-
- return;
- }
-
- new JoinChatRoomTask((ChatRoomWrapperImpl)chatRoomWrapper, null, null)
- .start();
- }
-
-
- /**
- * Joins the given chat room and manages all the exceptions that could
- * occur during the join process.
- *
- * @param chatRoom the chat room to join
- * @param nickname the nickname we're using to join
- * @param password the password we're using to join
- */
- public void joinChatRoom( ChatRoom chatRoom,
- String nickname,
- byte[] password)
- {
- ChatRoomWrapper chatRoomWrapper
- = chatRoomList.findChatRoomWrapperFromChatRoom(chatRoom);
-
- if(chatRoomWrapper == null)
- {
- ChatRoomProviderWrapper parentProvider
- = chatRoomList.findServerWrapperFromProvider(
- chatRoom.getParentProvider());
-
- chatRoomWrapper
- = new ChatRoomWrapperImpl(parentProvider, chatRoom);
-
- chatRoomList.addChatRoom(chatRoomWrapper);
-
- }
-
- this.joinChatRoom(chatRoomWrapper, nickname, password);
- }
-
- /**
- * Joins the room with the given name though the given chat room provider.
- *
- * @param chatRoomName the name of the room to join.
- * @param chatRoomProvider the chat room provider to join through.
- */
- public void joinChatRoom( String chatRoomName,
- ChatRoomProviderWrapper chatRoomProvider)
- {
- OperationSetMultiUserChat groupChatOpSet
- = chatRoomProvider
- .getProtocolProvider().getOperationSet(
- OperationSetMultiUserChat.class);
-
- ChatRoom chatRoom = null;
- try
- {
- chatRoom = groupChatOpSet.findRoom(chatRoomName);
- }
- catch (Exception e)
- {
- if (logger.isTraceEnabled())
- logger.trace("Un exception occurred while searching for room:"
- + chatRoomName, e);
- }
-
- if (chatRoom != null)
- {
- ChatRoomWrapper chatRoomWrapper
- = chatRoomList.findChatRoomWrapperFromChatRoom(chatRoom);
-
- if(chatRoomWrapper == null)
- {
- ChatRoomProviderWrapper parentProvider
- = chatRoomList
- .findServerWrapperFromProvider(
- chatRoom.getParentProvider());
-
- chatRoomWrapper
- = new ChatRoomWrapperImpl(parentProvider, chatRoom);
-
- chatRoomList.addChatRoom(chatRoomWrapper);
-
- fireChatRoomListChangedEvent(
- chatRoomWrapper,
- ChatRoomListChangeEvent.CHAT_ROOM_ADDED);
- }
- joinChatRoom(chatRoomWrapper);
- }
- else
- MUCActivator.getAlertUIService().showAlertDialog(
- MUCActivator.getResources().getI18NString("service.gui.ERROR"),
- MUCActivator.getResources().getI18NString(
- "service.gui.CHAT_ROOM_NOT_EXIST",
- new String[]{chatRoomName,
- chatRoomProvider.getProtocolProvider()
- .getAccountID().getService()}));
- }
-
-
- /**
- * Creates a chat room, by specifying the chat room name, the parent
- * protocol provider and eventually, the contacts invited to participate in
- * this chat room.
- *
- * @param roomName the name of the room
- * @param protocolProvider the parent protocol provider.
- * @param contacts the contacts invited when creating the chat room.
- * @param reason
- * @param persistent is the room persistent
- * @param isPrivate whether the room will be private or public.
- * @return the <tt>ChatRoomWrapper</tt> corresponding to the created room
- */
- public ChatRoomWrapper createChatRoom(
- String roomName,
- ProtocolProviderService protocolProvider,
- Collection<String> contacts,
- String reason,
- boolean persistent,
- boolean isPrivate)
- {
- return createChatRoom(
- roomName, protocolProvider, contacts, reason, true, persistent,
- isPrivate);
- }
-
- /**
- * Creates a chat room, by specifying the chat room name, the parent
- * protocol provider and eventually, the contacts invited to participate in
- * this chat room.
- *
- * @param roomName the name of the room
- * @param protocolProvider the parent protocol provider.
- * @param contacts the contacts invited when creating the chat room.
- * @param reason
- * @param persistent is the room persistent
- * @return the <tt>ChatRoomWrapper</tt> corresponding to the created room
- */
- public ChatRoomWrapper createChatRoom(
- String roomName,
- ProtocolProviderService protocolProvider,
- Collection<String> contacts,
- String reason,
- boolean persistent)
- {
- return createChatRoom(
- roomName, protocolProvider, contacts, reason, true, persistent,
- false);
- }
-
- /**
- * Creates a chat room, by specifying the chat room name, the parent
- * protocol provider and eventually, the contacts invited to participate in
- * this chat room.
- *
- * @param roomName the name of the room
- * @param protocolProvider the parent protocol provider.
- * @param contacts the contacts invited when creating the chat room.
- * @param reason
- * @param join whether we should join the room after creating it.
- * @param persistent whether the newly created room will be persistent.
- * @param isPrivate whether the room will be private or public.
- * @return the <tt>ChatRoomWrapper</tt> corresponding to the created room or
- * <tt>null</tt> if the protocol fails to create the chat room.
- */
- public ChatRoomWrapper createChatRoom(
- String roomName,
- ProtocolProviderService protocolProvider,
- Collection<String> contacts,
- String reason,
- boolean join,
- boolean persistent,
- boolean isPrivate)
- {
- ChatRoomWrapper chatRoomWrapper = null;
- OperationSetMultiUserChat groupChatOpSet
- = protocolProvider.getOperationSet(OperationSetMultiUserChat.class);
-
- // If there's no group chat operation set we have nothing to do here.
- if (groupChatOpSet == null)
- return null;
-
- ChatRoom chatRoom = null;
- try
- {
-
-
- HashMap<String, Object> roomProperties =
- new HashMap<String, Object>();
- roomProperties.put("isPrivate", isPrivate);
- chatRoom = groupChatOpSet.createChatRoom(roomName, roomProperties);
-
- if(join)
- {
- chatRoom.join();
-
- for(String contact : contacts)
- chatRoom.invite(contact, reason);
- }
- }
- catch (OperationFailedException ex)
- {
- logger.error("Failed to create chat room.", ex);
-
- MUCActivator.getAlertUIService().showAlertDialog(
- MUCActivator.getResources().getI18NString("service.gui.ERROR"),
- MUCActivator.getResources().getI18NString(
- "service.gui.CREATE_CHAT_ROOM_ERROR",
- new String[]{protocolProvider.getProtocolDisplayName()}),
- ex);
- }
- catch (OperationNotSupportedException ex)
- {
- logger.error("Failed to create chat room.", ex);
-
- MUCActivator.getAlertUIService().showAlertDialog(
- MUCActivator.getResources().getI18NString("service.gui.ERROR"),
- MUCActivator.getResources().getI18NString(
- "service.gui.CREATE_CHAT_ROOM_ERROR",
- new String[]{protocolProvider.getProtocolDisplayName()}),
- ex);
- }
-
- if(chatRoom != null)
- {
- ChatRoomProviderWrapper parentProvider
- = chatRoomList.findServerWrapperFromProvider(protocolProvider);
-
- // if there is the same room ids don't add new wrapper as old one
- // maybe already created
- chatRoomWrapper =
- chatRoomList.findChatRoomWrapperFromChatRoom(chatRoom);
-
- if(chatRoomWrapper == null)
- {
- chatRoomWrapper
- = new ChatRoomWrapperImpl(parentProvider, chatRoom);
- chatRoomWrapper.setPersistent(persistent);
- chatRoomList.addChatRoom(chatRoomWrapper);
- }
- }
-
- return chatRoomWrapper;
- }
-
- /**
- * Creates a private chat room, by specifying the parent
- * protocol provider and eventually, the contacts invited to participate in
- * this chat room.
- *
- * @param protocolProvider the parent protocol provider.
- * @param contacts the contacts invited when creating the chat room.
- * @param reason
- * @param persistent is the room persistent
- * @return the <tt>ChatRoomWrapper</tt> corresponding to the created room
- */
- public ChatRoomWrapper createPrivateChatRoom(
- ProtocolProviderService protocolProvider,
- Collection<String> contacts,
- String reason,
- boolean persistent)
- {
- return this.createChatRoom(
- null, protocolProvider, contacts, reason, persistent, true);
- }
-
-
- /**
- * Returns existing chat rooms for the given <tt>chatRoomProvider</tt>.
- * @param chatRoomProvider the <tt>ChatRoomProviderWrapper</tt>, which
- * chat rooms we're looking for
- * @return existing chat rooms for the given <tt>chatRoomProvider</tt>
- */
- public List<String> getExistingChatRooms(
- ChatRoomProviderWrapper chatRoomProvider)
- {
- if (chatRoomProvider == null)
- return null;
-
- ProtocolProviderService protocolProvider
- = chatRoomProvider.getProtocolProvider();
-
- if (protocolProvider == null)
- return null;
-
- OperationSetMultiUserChat groupChatOpSet
- = protocolProvider
- .getOperationSet(OperationSetMultiUserChat.class);
-
- if (groupChatOpSet == null)
- return null;
-
- List<String> chatRooms = null;
- try
- {
- chatRooms = groupChatOpSet.getExistingChatRooms();
- }
- catch (OperationFailedException e)
- {
- if (logger.isTraceEnabled())
- logger.trace("Failed to obtain existing chat rooms for server: "
- + protocolProvider.getAccountID().getService(), e);
- }
- catch (OperationNotSupportedException e)
- {
- if (logger.isTraceEnabled())
- logger.trace("Failed to obtain existing chat rooms for server: "
- + protocolProvider.getAccountID().getService(), e);
- }
-
- return chatRooms;
- }
-
- /**
- * Rejects the given invitation with the specified reason.
- *
- * @param multiUserChatOpSet the operation set to use for rejecting the
- * invitation
- * @param invitation the invitation to reject
- * @param reason the reason for the rejection
- */
- public void rejectInvitation( OperationSetMultiUserChat multiUserChatOpSet,
- ChatRoomInvitation invitation,
- String reason)
- {
- multiUserChatOpSet.rejectInvitation(invitation, reason);
- }
-
- /**
- * Leaves the given chat room.
- *
- * @param chatRoomWrapper the chat room to leave.
- * @return <tt>ChatRoomWrapper</tt> instance associated with the chat room.
- */
- public ChatRoomWrapper leaveChatRoom(ChatRoomWrapper chatRoomWrapper)
- {
- ChatRoom chatRoom = chatRoomWrapper.getChatRoom();
-
- if (chatRoom == null)
- {
- ResourceManagementService resources = MUCActivator.getResources();
-
- MUCActivator.getAlertUIService().showAlertDialog(
- resources.getI18NString("service.gui.WARNING"),
- resources
- .getI18NString(
- "service.gui.CHAT_ROOM_LEAVE_NOT_CONNECTED"));
-
- return null;
- }
-
- if (chatRoom.isJoined())
- chatRoom.leave();
-
- ChatRoomWrapper existChatRoomWrapper
- = chatRoomList.findChatRoomWrapperFromChatRoom(chatRoom);
-
- if(existChatRoomWrapper == null)
- return null;
-
- // We save the choice of the user, before the chat room is really
- // joined, because even the join fails we want the next time when
- // we login to join this chat room automatically.
- ConfigurationUtils.updateChatRoomStatus(
- chatRoomWrapper.getParentProvider().getProtocolProvider(),
- chatRoomWrapper.getChatRoomID(),
- GlobalStatusEnum.OFFLINE_STATUS);
-
- return existChatRoomWrapper;
- }
-
- /**
- * Joins a chat room in an asynchronous way.
- */
- private class JoinChatRoomTask
- extends Thread
- {
- private final ChatRoomWrapperImpl chatRoomWrapper;
-
- private final String nickName;
-
- private final byte[] password;
-
- private final boolean rememberPassword;
-
- private final boolean isFirstAttempt;
-
- private final String subject;
-
- private ResourceManagementService resources
- = MUCActivator.getResources();
-
- JoinChatRoomTask( ChatRoomWrapperImpl chatRoomWrapper,
- String nickName,
- byte[] password,
- boolean rememberPassword,
- boolean isFirstAttempt,
- String subject)
- {
- this.chatRoomWrapper = chatRoomWrapper;
- this.nickName = nickName;
- this.isFirstAttempt = isFirstAttempt;
- this.subject = subject;
-
- if(password == null)
- {
- String passString = chatRoomWrapper.loadPassword();
- if(passString != null)
- {
- this.password = passString.getBytes();
- }
- else
- {
- this.password = null;
- }
- }
- else
- {
- this.password = password;
- }
- this.rememberPassword = rememberPassword;
- }
-
- JoinChatRoomTask( ChatRoomWrapperImpl chatRoomWrapper,
- String nickName,
- byte[] password)
- {
- this(chatRoomWrapper, nickName, password, false, true, null);
- }
-
- JoinChatRoomTask( ChatRoomWrapperImpl chatRoomWrapper,
- String nickName,
- byte[] password,
- String subject)
- {
- this(chatRoomWrapper, nickName, password, false, true, subject);
- }
-
- /**
- * @override {@link Thread}{@link #run()} to perform all asynchronous
- * tasks.
- */
- @Override
- public void run()
- {
- ChatRoom chatRoom = chatRoomWrapper.getChatRoom();
-
- try
- {
- if(password != null && password.length > 0)
- chatRoom.joinAs(nickName, password);
- else if (nickName != null)
- chatRoom.joinAs(nickName);
- else
- chatRoom.join();
-
- done(JOIN_SUCCESS_PROP);
- }
- catch (OperationFailedException e)
- {
- if (logger.isTraceEnabled())
- logger.trace("Failed to join chat room: "
- + chatRoom.getName(), e);
-
- switch (e.getErrorCode())
- {
- case OperationFailedException.AUTHENTICATION_FAILED:
- done(JOIN_AUTHENTICATION_FAILED_PROP);
- break;
- case OperationFailedException.REGISTRATION_REQUIRED:
- done(JOIN_REGISTRATION_REQUIRED_PROP);
- break;
- case OperationFailedException.PROVIDER_NOT_REGISTERED:
- done(JOIN_PROVIDER_NOT_REGISTERED_PROP);
- break;
- case OperationFailedException.SUBSCRIPTION_ALREADY_EXISTS:
- done(JOIN_SUBSCRIPTION_ALREADY_EXISTS_PROP);
- break;
- default:
- done(JOIN_UNKNOWN_ERROR_PROP);
- }
- }
- }
-
- /**
- * Performs UI changes after the chat room join task has finished.
- * @param returnCode the result code from the chat room join task.
- */
- private void done(String returnCode)
- {
- ConfigurationUtils.updateChatRoomStatus(
- chatRoomWrapper.getParentProvider().getProtocolProvider(),
- chatRoomWrapper.getChatRoomID(),
- GlobalStatusEnum.ONLINE_STATUS);
-
- String errorMessage = null;
- if(JOIN_AUTHENTICATION_FAILED_PROP.equals(returnCode))
- {
- chatRoomWrapper.removePassword();
-
- AuthenticationWindowService authWindowsService
- = ServiceUtils.getService(
- MUCActivator.bundleContext,
- AuthenticationWindowService.class);
-
- AuthenticationWindowService.AuthenticationWindow authWindow =
- authWindowsService.create(
- null, null, null, false,
- chatRoomWrapper.isPersistent(),
- AuthenticationWindow.getAuthenticationWindowIcon(
- chatRoomWrapper.getParentProvider()
- .getProtocolProvider()),
- resources.getI18NString(
- "service.gui.AUTHENTICATION_WINDOW_TITLE",
- new String[]{chatRoomWrapper.getParentProvider()
- .getName()}),
- resources.getI18NString(
- "service.gui.CHAT_ROOM_REQUIRES_PASSWORD",
- new String[]{
- chatRoomWrapper.getChatRoomName()}),
- "", null,
- isFirstAttempt ?
- null :
- resources.getI18NString(
- "service.gui.AUTHENTICATION_FAILED",
- new String[]{chatRoomWrapper.getChatRoomName()}),
- null);
-
- authWindow.setVisible(true);
-
- if (!authWindow.isCanceled())
- {
- joinChatRoom(
- chatRoomWrapper,
- nickName,
- new String(authWindow.getPassword()).getBytes(),
- authWindow.isRememberPassword(),
- false,
- subject);
- }
- }
- else if(JOIN_REGISTRATION_REQUIRED_PROP.equals(returnCode))
- {
- errorMessage
- = resources
- .getI18NString(
- "service.gui.CHAT_ROOM_REGISTRATION_REQUIRED",
- new String[]{chatRoomWrapper.getChatRoomName()});
- }
- else if(JOIN_PROVIDER_NOT_REGISTERED_PROP.equals(returnCode))
- {
- errorMessage
- = resources
- .getI18NString("service.gui.CHAT_ROOM_NOT_CONNECTED",
- new String[]{chatRoomWrapper.getChatRoomName()});
- }
- else if(JOIN_SUBSCRIPTION_ALREADY_EXISTS_PROP.equals(returnCode))
- {
- errorMessage
- = resources
- .getI18NString("service.gui.CHAT_ROOM_ALREADY_JOINED",
- new String[]{chatRoomWrapper.getChatRoomName()});
- }
- else
- {
- errorMessage
- = resources
- .getI18NString("service.gui.FAILED_TO_JOIN_CHAT_ROOM",
- new String[]{chatRoomWrapper.getChatRoomName()});
- }
-
- if (!JOIN_SUCCESS_PROP.equals(returnCode) &&
- !JOIN_AUTHENTICATION_FAILED_PROP.equals(returnCode))
- {
- MUCActivator.getAlertUIService().showAlertPopup(
- resources.getI18NString("service.gui.ERROR"), errorMessage);
- }
-
- if (JOIN_SUCCESS_PROP.equals(returnCode))
- {
- if(rememberPassword)
- {
- chatRoomWrapper.savePassword(new String(password));
- }
-
- if(subject != null)
- {
- try
- {
- chatRoomWrapper.getChatRoom().setSubject(subject);
- }
- catch(OperationFailedException ex)
- {
- logger.warn("Failed to set subject.");
- }
- }
- }
-
- chatRoomWrapper.firePropertyChange(returnCode);
- }
- }
-
- /**
- * Finds the <tt>ChatRoomWrapper</tt> instance associated with the
- * source contact.
- * @param contact the source contact.
- * @return the <tt>ChatRoomWrapper</tt> instance.
- */
- public ChatRoomWrapper findChatRoomWrapperFromSourceContact(
- SourceContact contact)
- {
- if(!(contact instanceof ChatRoomSourceContact))
- return null;
- ChatRoomSourceContact chatRoomContact = (ChatRoomSourceContact) contact;
- return chatRoomList.findChatRoomWrapperFromChatRoomID(
- chatRoomContact.getChatRoomID(), chatRoomContact.getProvider());
- }
-
- /**
- * Finds the <tt>ChatRoomWrapper</tt> instance associated with the
- * chat room.
- * @param chatRoomID the id of the chat room.
- * @param pps the provider of the chat room.
- * @return the <tt>ChatRoomWrapper</tt> instance.
- */
- public ChatRoomWrapper findChatRoomWrapperFromChatRoomID(String chatRoomID,
- ProtocolProviderService pps)
- {
- return chatRoomList.findChatRoomWrapperFromChatRoomID(chatRoomID, pps);
- }
-
- /**
- * Searches for chat room wrapper in chat room list by chat room.
- *
- * @param chatRoom the chat room.
- * @param create if <tt>true</tt> and the chat room wrapper is not found new
- * chatRoomWrapper is created.
- * @return found chat room wrapper or the created chat room wrapper.
- */
- @Override
- public ChatRoomWrapper getChatRoomWrapperByChatRoom(ChatRoom chatRoom,
- boolean create)
- {
- ChatRoomWrapper chatRoomWrapper
- = chatRoomList.findChatRoomWrapperFromChatRoom(chatRoom);
-
- if ((chatRoomWrapper == null) && create)
- {
- ChatRoomProviderWrapper parentProvider
- = chatRoomList.findServerWrapperFromProvider(
- chatRoom.getParentProvider());
-
- chatRoomWrapper
- = new ChatRoomWrapperImpl(
- parentProvider, chatRoom);
-
- chatRoomList.addChatRoom(chatRoomWrapper);
- }
- return chatRoomWrapper;
- }
-
- /**
- * Goes through the locally stored chat rooms list and for each
- * {@link ChatRoomWrapper} tries to find the corresponding server stored
- * {@link ChatRoom} in the specified operation set. Joins automatically all
- * found chat rooms.
- *
- * @param protocolProvider the protocol provider for the account to
- * synchronize
- * @param opSet the multi user chat operation set, which give us access to
- * chat room server
- */
- public void synchronizeOpSetWithLocalContactList(
- ProtocolProviderService protocolProvider,
- final OperationSetMultiUserChat opSet)
- {
- ChatRoomProviderWrapper chatRoomProvider
- = findServerWrapperFromProvider(protocolProvider);
-
- if(chatRoomProvider == null)
- {
- chatRoomProvider = chatRoomList.addRegisteredChatProvider(protocolProvider);
- }
-
- if (chatRoomProvider != null)
- {
- chatRoomProvider.synchronizeProvider();
- }
- }
-
- /**
- * Returns an iterator to the list of chat room providers.
- *
- * @return an iterator to the list of chat room providers.
- */
- public Iterator<ChatRoomProviderWrapper> getChatRoomProviders()
- {
- return chatRoomList.getChatRoomProviders();
- }
-
- /**
- * Removes the given <tt>ChatRoom</tt> from the list of all chat rooms.
- *
- * @param chatRoomWrapper the <tt>ChatRoomWrapper</tt> to remove
- */
- public void removeChatRoom(ChatRoomWrapper chatRoomWrapper)
- {
- chatRoomList.removeChatRoom(chatRoomWrapper);
- }
-
- /**
- * Destroys the given <tt>ChatRoom</tt> from the list of all chat rooms.
- *
- * @param chatRoomWrapper the <tt>ChatRoomWrapper</tt> to be destroyed.
- * @param reason the reason for destroying.
- * @param alternateAddress the alternate address.
- */
- public void destroyChatRoom(ChatRoomWrapper chatRoomWrapper,
- String reason, String alternateAddress)
- {
- if(chatRoomWrapper.getChatRoom().destroy(reason, alternateAddress))
- {
- MUCActivator.getUIService().closeChatRoomWindow(
- chatRoomWrapper);
- chatRoomList.removeChatRoom(chatRoomWrapper);
- }
- else
- {
- // if we leave a chat room which is not persistent
- // the room can be destroyed on the server, and error is returned
- // when we try to destroy it not-authorized(401)
- if(!chatRoomWrapper.getChatRoom().isPersistent()
- && !chatRoomWrapper.getChatRoom().isJoined())
- {
- chatRoomList.removeChatRoom(chatRoomWrapper);
- }
- }
-
- }
-
- /**
- * Adds a ChatRoomProviderWrapperListener to the listener list.
- *
- * @param listener the ChatRoomProviderWrapperListener to be added
- */
- public void addChatRoomProviderWrapperListener(
- ChatRoomProviderWrapperListener listener)
- {
- chatRoomList.addChatRoomProviderWrapperListener(listener);
- }
-
- /**
- * Removes the ChatRoomProviderWrapperListener to the listener list.
- *
- * @param listener the ChatRoomProviderWrapperListener to be removed
- */
- public void removeChatRoomProviderWrapperListener(
- ChatRoomProviderWrapperListener listener)
- {
- chatRoomList.removeChatRoomProviderWrapperListener(listener);
- }
-
- /**
- * Returns the <tt>ChatRoomProviderWrapper</tt> that correspond to the
- * given <tt>ProtocolProviderService</tt>. If the list doesn't contain a
- * corresponding wrapper - returns null.
- *
- * @param protocolProvider the protocol provider that we're looking for
- * @return the <tt>ChatRoomProvider</tt> object corresponding to
- * the given <tt>ProtocolProviderService</tt>
- */
- public ChatRoomProviderWrapper findServerWrapperFromProvider(
- ProtocolProviderService protocolProvider)
- {
- return chatRoomList.findServerWrapperFromProvider(protocolProvider);
- }
-
- /**
- * Returns the <tt>ChatRoomWrapper</tt> that correspond to the given
- * <tt>ChatRoom</tt>. If the list of chat rooms doesn't contain a
- * corresponding wrapper - returns null.
- *
- * @param chatRoom the <tt>ChatRoom</tt> that we're looking for
- * @return the <tt>ChatRoomWrapper</tt> object corresponding to the given
- * <tt>ChatRoom</tt>
- */
- public ChatRoomWrapper findChatRoomWrapperFromChatRoom(ChatRoom chatRoom)
- {
- return chatRoomList.findChatRoomWrapperFromChatRoom(chatRoom);
- }
-
- /**
- * Opens a chat window for the chat room.
- *
- * @param room the chat room.
- */
- public void openChatRoom(ChatRoomWrapper room)
- {
- if (room.getChatRoom() == null)
- {
- room = createChatRoom(
- room.getChatRoomName(),
- room.getParentProvider().getProtocolProvider(),
- new ArrayList<String>(),"", false, false, true);
-
- // leave the chatroom because getChatRoom().isJoined() returns true
- // otherwise
- if (room.getChatRoom().isJoined())
- room.getChatRoom().leave();
-
- }
-
- if(!room.getChatRoom().isJoined())
- {
- String savedNick =
- ConfigurationUtils.getChatRoomProperty(room
- .getParentProvider().getProtocolProvider(), room
- .getChatRoomID(), "userNickName");
- String subject = null;
-
- if (savedNick == null)
- {
- String[] joinOptions = ChatRoomJoinOptionsDialog.getJoinOptions(
- room.getParentProvider().getProtocolProvider(),
- room.getChatRoomID(),
- MUCActivator.getGlobalDisplayDetailsService()
- .getDisplayName(
- room.getParentProvider().getProtocolProvider()));
- savedNick = joinOptions[0];
- subject = joinOptions[1];
-
- }
-
- if (savedNick != null)
- {
- joinChatRoom(room, savedNick, null,
- subject);
- }
- else
- return;
- }
-
- MUCActivator.getUIService().openChatRoomWindow(room);
- }
-
- /**
- * Returns instance of the <tt>ServerChatRoomContactSourceService</tt>
- * contact source.
- * @return instance of the <tt>ServerChatRoomContactSourceService</tt>
- * contact source.
- */
- public ContactSourceService getServerChatRoomsContactSourceForProvider(
- ChatRoomProviderWrapper pps)
- {
- return new ServerChatRoomContactSourceService(pps);
- }
-
- /**
- * Returns <tt>true</tt> if the contact is <tt>ChatRoomSourceContact</tt>
- *
- * @param contact the contact
- * @return <tt>true</tt> if the contact is <tt>ChatRoomSourceContact</tt>
- */
- public boolean isMUCSourceContact(SourceContact contact)
- {
- return (contact instanceof ChatRoomSourceContact);
- }
-}
+package net.java.sip.communicator.impl.muc; + +import static net.java.sip.communicator.service.muc.ChatRoomWrapper.*; + +import java.util.*; + +import net.java.sip.communicator.plugin.desktoputil.*; +import net.java.sip.communicator.plugin.desktoputil.chat.*; +import net.java.sip.communicator.service.contactsource.*; +import net.java.sip.communicator.service.gui.*; +import net.java.sip.communicator.service.muc.*; +import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.service.protocol.globalstatus.*; +import net.java.sip.communicator.util.*; + +import org.jitsi.service.resources.*; + +/** + * The <tt>MUCServiceImpl</tt> class implements the service for the chat rooms. + * + * @author Hristo Terezov + */ +public class MUCServiceImpl + extends MUCService +{ + + /** + * The list of persistent chat rooms. + */ + private final ChatRoomListImpl chatRoomList = new ChatRoomListImpl(); + + /** + * The <tt>Logger</tt> used by the <tt>MUCServiceImpl</tt> class and its + * instances for logging output. + */ + private static Logger logger = Logger.getLogger(MUCServiceImpl.class); + + /** + * Called to accept an incoming invitation. Adds the invitation chat room + * to the list of chat rooms and joins it. + * + * @param invitation the invitation to accept. + */ + public void acceptInvitation(ChatRoomInvitation invitation) + { + ChatRoom chatRoom = invitation.getTargetChatRoom(); + byte[] password = invitation.getChatRoomPassword(); + + String nickName = + ConfigurationUtils.getChatRoomProperty( + chatRoom.getParentProvider(), + chatRoom.getIdentifier(), "userNickName"); + if(nickName == null) + { + String[] joinOptions = ChatRoomJoinOptionsDialog.getJoinOptions( + true, + chatRoom.getParentProvider(), + chatRoom.getIdentifier(), + MUCActivator.getGlobalDisplayDetailsService() + .getDisplayName(chatRoom.getParentProvider())); + nickName = joinOptions[0]; + } + + joinChatRoom(chatRoom, nickName, password); + } + + /** + * Adds a change listener to the <tt>ChatRoomList</tt>. + * + * @param l the listener. + */ + public void addChatRoomListChangeListener(ChatRoomListChangeListener l) + { + chatRoomList.addChatRoomListChangeListener(l); + } + + /** + * Removes a change listener to the <tt>ChatRoomList</tt>. + * + * @param l the listener. + */ + public void removeChatRoomListChangeListener(ChatRoomListChangeListener l) + { + chatRoomList.removeChatRoomListChangeListener(l); + } + + /** + * Fires a <tt>ChatRoomListChangedEvent</tt> event. + * + * @param chatRoomWrapper the chat room. + * @param eventID the id of the event. + */ + public void fireChatRoomListChangedEvent( ChatRoomWrapper chatRoomWrapper, + int eventID) + { + chatRoomList.fireChatRoomListChangedEvent(chatRoomWrapper, eventID); + } + + /** + * Joins the given chat room with the given password and manages all the + * exceptions that could occur during the join process. + * + * @param chatRoomWrapper the chat room to join. + * @param nickName the nickname we choose for the given chat room. + * @param password the password. + * @param rememberPassword if true the password should be saved. + * @param isFirstAttempt is this the first attempt to join room, used + * to check whether to show some error messages + * @param subject the subject which will be set to the room after the user + * join successful. + */ + private void joinChatRoom( ChatRoomWrapper chatRoomWrapper, + String nickName, + byte[] password, + boolean rememberPassword, + boolean isFirstAttempt, + String subject) + { + ChatRoom chatRoom = chatRoomWrapper.getChatRoom(); + + if(chatRoom == null) + { + MUCActivator.getAlertUIService().showAlertDialog( + MUCActivator.getResources().getI18NString("service.gui.WARNING"), + MUCActivator.getResources().getI18NString( + "service.gui.CHAT_ROOM_NOT_CONNECTED", + new String[]{chatRoomWrapper.getChatRoomName()})); + return; + } + + new JoinChatRoomTask( + (ChatRoomWrapperImpl)chatRoomWrapper, + nickName, + password, + rememberPassword, + isFirstAttempt, + subject) + .start(); + } + + /** + * Joins the given chat room with the given password and manages all the + * exceptions that could occur during the join process. + * + * @param chatRoomWrapper the chat room to join. + * @param nickName the nickname we choose for the given chat room. + * @param password the password. + */ + public void joinChatRoom( ChatRoomWrapper chatRoomWrapper, + String nickName, + byte[] password) + { + if (chatRoomWrapper.getChatRoom() == null) + { + chatRoomWrapper = createChatRoom( + chatRoomWrapper.getChatRoomName(), + chatRoomWrapper.getParentProvider().getProtocolProvider(), + new ArrayList<String>(), "", false, false, true); + } + + ChatRoom chatRoom = chatRoomWrapper.getChatRoom(); + + if(chatRoom == null) + { + MUCActivator.getAlertUIService().showAlertDialog( + MUCActivator.getResources().getI18NString("service.gui.WARNING"), + MUCActivator.getResources().getI18NString( + "service.gui.CHAT_ROOM_NOT_CONNECTED", + new String[]{chatRoomWrapper.getChatRoomName()})); + return; + } + + new JoinChatRoomTask( + (ChatRoomWrapperImpl)chatRoomWrapper, nickName, password) + .start(); + } + + /** + * Joins the given chat room with the given password and manages all the + * exceptions that could occur during the join process. + * + * @param chatRoomWrapper the chat room to join. + * @param nickName the nickname we choose for the given chat room. + * @param password the password. + * @param subject the subject which will be set to the room after the user + * join successful. + */ + public void joinChatRoom( ChatRoomWrapper chatRoomWrapper, + String nickName, + byte[] password, + String subject) + { + if (chatRoomWrapper.getChatRoom() == null) + { + chatRoomWrapper = createChatRoom( + chatRoomWrapper.getChatRoomName(), + chatRoomWrapper.getParentProvider().getProtocolProvider(), + new ArrayList<String>(), "", false, false, true); + } + + ChatRoom chatRoom = chatRoomWrapper.getChatRoom(); + if (chatRoom == null) + { + MUCActivator.getAlertUIService().showAlertDialog( + MUCActivator.getResources().getI18NString("service.gui.WARNING"), + MUCActivator.getResources().getI18NString( + "service.gui.CHAT_ROOM_NOT_CONNECTED", + new String[]{chatRoomWrapper.getChatRoomName()})); + + return; + } + + // join from add chat room dialog + + new JoinChatRoomTask( + (ChatRoomWrapperImpl) chatRoomWrapper, + nickName, + password, + subject) + .start(); + } + + + /** + * Join chat room. + * @param chatRoomWrapper + */ + public void joinChatRoom(ChatRoomWrapper chatRoomWrapper) + { + if (chatRoomWrapper.getChatRoom() == null) + { + chatRoomWrapper = createChatRoom( + chatRoomWrapper.getChatRoomName(), + chatRoomWrapper.getParentProvider().getProtocolProvider(), + new ArrayList<String>(), "", false, false, true); + } + + ChatRoom chatRoom = chatRoomWrapper.getChatRoom(); + + if(chatRoom == null) + { + MUCActivator.getAlertUIService().showAlertDialog( + MUCActivator.getResources().getI18NString("service.gui.WARNING"), + MUCActivator.getResources().getI18NString( + "service.gui.CHAT_ROOM_NOT_CONNECTED", + new String[]{chatRoomWrapper.getChatRoomName()})); + + return; + } + + new JoinChatRoomTask((ChatRoomWrapperImpl)chatRoomWrapper, null, null) + .start(); + } + + + /** + * Joins the given chat room and manages all the exceptions that could + * occur during the join process. + * + * @param chatRoom the chat room to join + * @param nickname the nickname we're using to join + * @param password the password we're using to join + */ + public void joinChatRoom( ChatRoom chatRoom, + String nickname, + byte[] password) + { + ChatRoomWrapper chatRoomWrapper + = chatRoomList.findChatRoomWrapperFromChatRoom(chatRoom); + + if(chatRoomWrapper == null) + { + ChatRoomProviderWrapper parentProvider + = chatRoomList.findServerWrapperFromProvider( + chatRoom.getParentProvider()); + + chatRoomWrapper + = new ChatRoomWrapperImpl(parentProvider, chatRoom); + + chatRoomList.addChatRoom(chatRoomWrapper); + + } + + this.joinChatRoom(chatRoomWrapper, nickname, password); + } + + /** + * Joins the room with the given name though the given chat room provider. + * + * @param chatRoomName the name of the room to join. + * @param chatRoomProvider the chat room provider to join through. + */ + public void joinChatRoom( String chatRoomName, + ChatRoomProviderWrapper chatRoomProvider) + { + OperationSetMultiUserChat groupChatOpSet + = chatRoomProvider + .getProtocolProvider().getOperationSet( + OperationSetMultiUserChat.class); + + ChatRoom chatRoom = null; + try + { + chatRoom = groupChatOpSet.findRoom(chatRoomName); + } + catch (Exception e) + { + if (logger.isTraceEnabled()) + logger.trace("Un exception occurred while searching for room:" + + chatRoomName, e); + } + + if (chatRoom != null) + { + ChatRoomWrapper chatRoomWrapper + = chatRoomList.findChatRoomWrapperFromChatRoom(chatRoom); + + if(chatRoomWrapper == null) + { + ChatRoomProviderWrapper parentProvider + = chatRoomList + .findServerWrapperFromProvider( + chatRoom.getParentProvider()); + + chatRoomWrapper + = new ChatRoomWrapperImpl(parentProvider, chatRoom); + + chatRoomList.addChatRoom(chatRoomWrapper); + + fireChatRoomListChangedEvent( + chatRoomWrapper, + ChatRoomListChangeEvent.CHAT_ROOM_ADDED); + } + joinChatRoom(chatRoomWrapper); + } + else + MUCActivator.getAlertUIService().showAlertDialog( + MUCActivator.getResources().getI18NString("service.gui.ERROR"), + MUCActivator.getResources().getI18NString( + "service.gui.CHAT_ROOM_NOT_EXIST", + new String[]{chatRoomName, + chatRoomProvider.getProtocolProvider() + .getAccountID().getService()})); + } + + + /** + * Creates a chat room, by specifying the chat room name, the parent + * protocol provider and eventually, the contacts invited to participate in + * this chat room. + * + * @param roomName the name of the room + * @param protocolProvider the parent protocol provider. + * @param contacts the contacts invited when creating the chat room. + * @param reason + * @param persistent is the room persistent + * @param isPrivate whether the room will be private or public. + * @return the <tt>ChatRoomWrapper</tt> corresponding to the created room + */ + public ChatRoomWrapper createChatRoom( + String roomName, + ProtocolProviderService protocolProvider, + Collection<String> contacts, + String reason, + boolean persistent, + boolean isPrivate) + { + return createChatRoom( + roomName, protocolProvider, contacts, reason, true, persistent, + isPrivate); + } + + /** + * Creates a chat room, by specifying the chat room name, the parent + * protocol provider and eventually, the contacts invited to participate in + * this chat room. + * + * @param roomName the name of the room + * @param protocolProvider the parent protocol provider. + * @param contacts the contacts invited when creating the chat room. + * @param reason + * @param persistent is the room persistent + * @return the <tt>ChatRoomWrapper</tt> corresponding to the created room + */ + public ChatRoomWrapper createChatRoom( + String roomName, + ProtocolProviderService protocolProvider, + Collection<String> contacts, + String reason, + boolean persistent) + { + return createChatRoom( + roomName, protocolProvider, contacts, reason, true, persistent, + false); + } + + /** + * Creates a chat room, by specifying the chat room name, the parent + * protocol provider and eventually, the contacts invited to participate in + * this chat room. + * + * @param roomName the name of the room + * @param protocolProvider the parent protocol provider. + * @param contacts the contacts invited when creating the chat room. + * @param reason + * @param join whether we should join the room after creating it. + * @param persistent whether the newly created room will be persistent. + * @param isPrivate whether the room will be private or public. + * @return the <tt>ChatRoomWrapper</tt> corresponding to the created room or + * <tt>null</tt> if the protocol fails to create the chat room. + */ + public ChatRoomWrapper createChatRoom( + String roomName, + ProtocolProviderService protocolProvider, + Collection<String> contacts, + String reason, + boolean join, + boolean persistent, + boolean isPrivate) + { + ChatRoomWrapper chatRoomWrapper = null; + OperationSetMultiUserChat groupChatOpSet + = protocolProvider.getOperationSet(OperationSetMultiUserChat.class); + + // If there's no group chat operation set we have nothing to do here. + if (groupChatOpSet == null) + return null; + + ChatRoom chatRoom = null; + try + { + + + HashMap<String, Object> roomProperties = + new HashMap<String, Object>(); + roomProperties.put("isPrivate", isPrivate); + chatRoom = groupChatOpSet.createChatRoom(roomName, roomProperties); + + if(join) + { + chatRoom.join(); + + for(String contact : contacts) + chatRoom.invite(contact, reason); + } + } + catch (OperationFailedException ex) + { + logger.error("Failed to create chat room.", ex); + + MUCActivator.getAlertUIService().showAlertDialog( + MUCActivator.getResources().getI18NString("service.gui.ERROR"), + MUCActivator.getResources().getI18NString( + "service.gui.CREATE_CHAT_ROOM_ERROR", + new String[]{protocolProvider.getProtocolDisplayName()}), + ex); + } + catch (OperationNotSupportedException ex) + { + logger.error("Failed to create chat room.", ex); + + MUCActivator.getAlertUIService().showAlertDialog( + MUCActivator.getResources().getI18NString("service.gui.ERROR"), + MUCActivator.getResources().getI18NString( + "service.gui.CREATE_CHAT_ROOM_ERROR", + new String[]{protocolProvider.getProtocolDisplayName()}), + ex); + } + + if(chatRoom != null) + { + ChatRoomProviderWrapper parentProvider + = chatRoomList.findServerWrapperFromProvider(protocolProvider); + + // if there is the same room ids don't add new wrapper as old one + // maybe already created + chatRoomWrapper = + chatRoomList.findChatRoomWrapperFromChatRoom(chatRoom); + + if(chatRoomWrapper == null) + { + chatRoomWrapper + = new ChatRoomWrapperImpl(parentProvider, chatRoom); + chatRoomWrapper.setPersistent(persistent); + chatRoomList.addChatRoom(chatRoomWrapper); + } + } + + return chatRoomWrapper; + } + + /** + * Creates a private chat room, by specifying the parent + * protocol provider and eventually, the contacts invited to participate in + * this chat room. + * + * @param protocolProvider the parent protocol provider. + * @param contacts the contacts invited when creating the chat room. + * @param reason + * @param persistent is the room persistent + * @return the <tt>ChatRoomWrapper</tt> corresponding to the created room + */ + public ChatRoomWrapper createPrivateChatRoom( + ProtocolProviderService protocolProvider, + Collection<String> contacts, + String reason, + boolean persistent) + { + return this.createChatRoom( + null, protocolProvider, contacts, reason, persistent, true); + } + + + /** + * Returns existing chat rooms for the given <tt>chatRoomProvider</tt>. + * @param chatRoomProvider the <tt>ChatRoomProviderWrapper</tt>, which + * chat rooms we're looking for + * @return existing chat rooms for the given <tt>chatRoomProvider</tt> + */ + public List<String> getExistingChatRooms( + ChatRoomProviderWrapper chatRoomProvider) + { + if (chatRoomProvider == null) + return null; + + ProtocolProviderService protocolProvider + = chatRoomProvider.getProtocolProvider(); + + if (protocolProvider == null) + return null; + + OperationSetMultiUserChat groupChatOpSet + = protocolProvider + .getOperationSet(OperationSetMultiUserChat.class); + + if (groupChatOpSet == null) + return null; + + List<String> chatRooms = null; + try + { + chatRooms = groupChatOpSet.getExistingChatRooms(); + } + catch (OperationFailedException e) + { + if (logger.isTraceEnabled()) + logger.trace("Failed to obtain existing chat rooms for server: " + + protocolProvider.getAccountID().getService(), e); + } + catch (OperationNotSupportedException e) + { + if (logger.isTraceEnabled()) + logger.trace("Failed to obtain existing chat rooms for server: " + + protocolProvider.getAccountID().getService(), e); + } + + return chatRooms; + } + + /** + * Rejects the given invitation with the specified reason. + * + * @param multiUserChatOpSet the operation set to use for rejecting the + * invitation + * @param invitation the invitation to reject + * @param reason the reason for the rejection + */ + public void rejectInvitation( OperationSetMultiUserChat multiUserChatOpSet, + ChatRoomInvitation invitation, + String reason) + { + multiUserChatOpSet.rejectInvitation(invitation, reason); + } + + /** + * Leaves the given chat room. + * + * @param chatRoomWrapper the chat room to leave. + * @return <tt>ChatRoomWrapper</tt> instance associated with the chat room. + */ + public ChatRoomWrapper leaveChatRoom(ChatRoomWrapper chatRoomWrapper) + { + ChatRoom chatRoom = chatRoomWrapper.getChatRoom(); + + if (chatRoom == null) + { + ResourceManagementService resources = MUCActivator.getResources(); + + MUCActivator.getAlertUIService().showAlertDialog( + resources.getI18NString("service.gui.WARNING"), + resources + .getI18NString( + "service.gui.CHAT_ROOM_LEAVE_NOT_CONNECTED")); + + return null; + } + + if (chatRoom.isJoined()) + chatRoom.leave(); + + ChatRoomWrapper existChatRoomWrapper + = chatRoomList.findChatRoomWrapperFromChatRoom(chatRoom); + + if(existChatRoomWrapper == null) + return null; + + // We save the choice of the user, before the chat room is really + // joined, because even the join fails we want the next time when + // we login to join this chat room automatically. + ConfigurationUtils.updateChatRoomStatus( + chatRoomWrapper.getParentProvider().getProtocolProvider(), + chatRoomWrapper.getChatRoomID(), + GlobalStatusEnum.OFFLINE_STATUS); + + return existChatRoomWrapper; + } + + /** + * Joins a chat room in an asynchronous way. + */ + private class JoinChatRoomTask + extends Thread + { + private final ChatRoomWrapperImpl chatRoomWrapper; + + private final String nickName; + + private final byte[] password; + + private final boolean rememberPassword; + + private final boolean isFirstAttempt; + + private final String subject; + + private ResourceManagementService resources + = MUCActivator.getResources(); + + JoinChatRoomTask( ChatRoomWrapperImpl chatRoomWrapper, + String nickName, + byte[] password, + boolean rememberPassword, + boolean isFirstAttempt, + String subject) + { + this.chatRoomWrapper = chatRoomWrapper; + this.nickName = nickName; + this.isFirstAttempt = isFirstAttempt; + this.subject = subject; + + if(password == null) + { + String passString = chatRoomWrapper.loadPassword(); + if(passString != null) + { + this.password = passString.getBytes(); + } + else + { + this.password = null; + } + } + else + { + this.password = password; + } + this.rememberPassword = rememberPassword; + } + + JoinChatRoomTask( ChatRoomWrapperImpl chatRoomWrapper, + String nickName, + byte[] password) + { + this(chatRoomWrapper, nickName, password, false, true, null); + } + + JoinChatRoomTask( ChatRoomWrapperImpl chatRoomWrapper, + String nickName, + byte[] password, + String subject) + { + this(chatRoomWrapper, nickName, password, false, true, subject); + } + + /** + * @override {@link Thread}{@link #run()} to perform all asynchronous + * tasks. + */ + @Override + public void run() + { + ChatRoom chatRoom = chatRoomWrapper.getChatRoom(); + + try + { + if(password != null && password.length > 0) + chatRoom.joinAs(nickName, password); + else if (nickName != null) + chatRoom.joinAs(nickName); + else + chatRoom.join(); + + done(JOIN_SUCCESS_PROP); + } + catch (OperationFailedException e) + { + if (logger.isTraceEnabled()) + logger.trace("Failed to join chat room: " + + chatRoom.getName(), e); + + switch (e.getErrorCode()) + { + case OperationFailedException.AUTHENTICATION_FAILED: + done(JOIN_AUTHENTICATION_FAILED_PROP); + break; + case OperationFailedException.REGISTRATION_REQUIRED: + done(JOIN_REGISTRATION_REQUIRED_PROP); + break; + case OperationFailedException.PROVIDER_NOT_REGISTERED: + done(JOIN_PROVIDER_NOT_REGISTERED_PROP); + break; + case OperationFailedException.SUBSCRIPTION_ALREADY_EXISTS: + done(JOIN_SUBSCRIPTION_ALREADY_EXISTS_PROP); + break; + default: + done(JOIN_UNKNOWN_ERROR_PROP); + } + } + } + + /** + * Performs UI changes after the chat room join task has finished. + * @param returnCode the result code from the chat room join task. + */ + private void done(String returnCode) + { + ConfigurationUtils.updateChatRoomStatus( + chatRoomWrapper.getParentProvider().getProtocolProvider(), + chatRoomWrapper.getChatRoomID(), + GlobalStatusEnum.ONLINE_STATUS); + + String errorMessage = null; + if(JOIN_AUTHENTICATION_FAILED_PROP.equals(returnCode)) + { + chatRoomWrapper.removePassword(); + + AuthenticationWindowService authWindowsService + = ServiceUtils.getService( + MUCActivator.bundleContext, + AuthenticationWindowService.class); + + AuthenticationWindowService.AuthenticationWindow authWindow = + authWindowsService.create( + null, null, null, false, + chatRoomWrapper.isPersistent(), + AuthenticationWindow.getAuthenticationWindowIcon( + chatRoomWrapper.getParentProvider() + .getProtocolProvider()), + resources.getI18NString( + "service.gui.AUTHENTICATION_WINDOW_TITLE", + new String[]{chatRoomWrapper.getParentProvider() + .getName()}), + resources.getI18NString( + "service.gui.CHAT_ROOM_REQUIRES_PASSWORD", + new String[]{ + chatRoomWrapper.getChatRoomName()}), + "", null, + isFirstAttempt ? + null : + resources.getI18NString( + "service.gui.AUTHENTICATION_FAILED", + new String[]{chatRoomWrapper.getChatRoomName()}), + null); + + authWindow.setVisible(true); + + if (!authWindow.isCanceled()) + { + joinChatRoom( + chatRoomWrapper, + nickName, + new String(authWindow.getPassword()).getBytes(), + authWindow.isRememberPassword(), + false, + subject); + } + } + else if(JOIN_REGISTRATION_REQUIRED_PROP.equals(returnCode)) + { + errorMessage + = resources + .getI18NString( + "service.gui.CHAT_ROOM_REGISTRATION_REQUIRED", + new String[]{chatRoomWrapper.getChatRoomName()}); + } + else if(JOIN_PROVIDER_NOT_REGISTERED_PROP.equals(returnCode)) + { + errorMessage + = resources + .getI18NString("service.gui.CHAT_ROOM_NOT_CONNECTED", + new String[]{chatRoomWrapper.getChatRoomName()}); + } + else if(JOIN_SUBSCRIPTION_ALREADY_EXISTS_PROP.equals(returnCode)) + { + errorMessage + = resources + .getI18NString("service.gui.CHAT_ROOM_ALREADY_JOINED", + new String[]{chatRoomWrapper.getChatRoomName()}); + } + else + { + errorMessage + = resources + .getI18NString("service.gui.FAILED_TO_JOIN_CHAT_ROOM", + new String[]{chatRoomWrapper.getChatRoomName()}); + } + + if (!JOIN_SUCCESS_PROP.equals(returnCode) && + !JOIN_AUTHENTICATION_FAILED_PROP.equals(returnCode)) + { + MUCActivator.getAlertUIService().showAlertPopup( + resources.getI18NString("service.gui.ERROR"), errorMessage); + } + + if (JOIN_SUCCESS_PROP.equals(returnCode)) + { + if(rememberPassword) + { + chatRoomWrapper.savePassword(new String(password)); + } + + if(subject != null) + { + try + { + chatRoomWrapper.getChatRoom().setSubject(subject); + } + catch(OperationFailedException ex) + { + logger.warn("Failed to set subject."); + } + } + } + + chatRoomWrapper.firePropertyChange(returnCode); + } + } + + /** + * Finds the <tt>ChatRoomWrapper</tt> instance associated with the + * source contact. + * @param contact the source contact. + * @return the <tt>ChatRoomWrapper</tt> instance. + */ + public ChatRoomWrapper findChatRoomWrapperFromSourceContact( + SourceContact contact) + { + if(!(contact instanceof ChatRoomSourceContact)) + return null; + ChatRoomSourceContact chatRoomContact = (ChatRoomSourceContact) contact; + return chatRoomList.findChatRoomWrapperFromChatRoomID( + chatRoomContact.getChatRoomID(), chatRoomContact.getProvider()); + } + + /** + * Finds the <tt>ChatRoomWrapper</tt> instance associated with the + * chat room. + * @param chatRoomID the id of the chat room. + * @param pps the provider of the chat room. + * @return the <tt>ChatRoomWrapper</tt> instance. + */ + public ChatRoomWrapper findChatRoomWrapperFromChatRoomID(String chatRoomID, + ProtocolProviderService pps) + { + return chatRoomList.findChatRoomWrapperFromChatRoomID(chatRoomID, pps); + } + + /** + * Searches for chat room wrapper in chat room list by chat room. + * + * @param chatRoom the chat room. + * @param create if <tt>true</tt> and the chat room wrapper is not found new + * chatRoomWrapper is created. + * @return found chat room wrapper or the created chat room wrapper. + */ + @Override + public ChatRoomWrapper getChatRoomWrapperByChatRoom(ChatRoom chatRoom, + boolean create) + { + ChatRoomWrapper chatRoomWrapper + = chatRoomList.findChatRoomWrapperFromChatRoom(chatRoom); + + if ((chatRoomWrapper == null) && create) + { + ChatRoomProviderWrapper parentProvider + = chatRoomList.findServerWrapperFromProvider( + chatRoom.getParentProvider()); + + chatRoomWrapper + = new ChatRoomWrapperImpl( + parentProvider, chatRoom); + + chatRoomList.addChatRoom(chatRoomWrapper); + } + return chatRoomWrapper; + } + + /** + * Goes through the locally stored chat rooms list and for each + * {@link ChatRoomWrapper} tries to find the corresponding server stored + * {@link ChatRoom} in the specified operation set. Joins automatically all + * found chat rooms. + * + * @param protocolProvider the protocol provider for the account to + * synchronize + * @param opSet the multi user chat operation set, which give us access to + * chat room server + */ + public void synchronizeOpSetWithLocalContactList( + ProtocolProviderService protocolProvider, + final OperationSetMultiUserChat opSet) + { + ChatRoomProviderWrapper chatRoomProvider + = findServerWrapperFromProvider(protocolProvider); + + if(chatRoomProvider == null) + { + chatRoomProvider = chatRoomList.addRegisteredChatProvider(protocolProvider); + } + + if (chatRoomProvider != null) + { + chatRoomProvider.synchronizeProvider(); + } + } + + /** + * Returns an iterator to the list of chat room providers. + * + * @return an iterator to the list of chat room providers. + */ + public Iterator<ChatRoomProviderWrapper> getChatRoomProviders() + { + return chatRoomList.getChatRoomProviders(); + } + + /** + * Removes the given <tt>ChatRoom</tt> from the list of all chat rooms. + * + * @param chatRoomWrapper the <tt>ChatRoomWrapper</tt> to remove + */ + public void removeChatRoom(ChatRoomWrapper chatRoomWrapper) + { + chatRoomList.removeChatRoom(chatRoomWrapper); + } + + /** + * Destroys the given <tt>ChatRoom</tt> from the list of all chat rooms. + * + * @param chatRoomWrapper the <tt>ChatRoomWrapper</tt> to be destroyed. + * @param reason the reason for destroying. + * @param alternateAddress the alternate address. + */ + public void destroyChatRoom(ChatRoomWrapper chatRoomWrapper, + String reason, String alternateAddress) + { + if(chatRoomWrapper.getChatRoom().destroy(reason, alternateAddress)) + { + MUCActivator.getUIService().closeChatRoomWindow( + chatRoomWrapper); + chatRoomList.removeChatRoom(chatRoomWrapper); + } + else + { + // if we leave a chat room which is not persistent + // the room can be destroyed on the server, and error is returned + // when we try to destroy it not-authorized(401) + if(!chatRoomWrapper.getChatRoom().isPersistent() + && !chatRoomWrapper.getChatRoom().isJoined()) + { + chatRoomList.removeChatRoom(chatRoomWrapper); + } + } + + } + + /** + * Adds a ChatRoomProviderWrapperListener to the listener list. + * + * @param listener the ChatRoomProviderWrapperListener to be added + */ + public void addChatRoomProviderWrapperListener( + ChatRoomProviderWrapperListener listener) + { + chatRoomList.addChatRoomProviderWrapperListener(listener); + } + + /** + * Removes the ChatRoomProviderWrapperListener to the listener list. + * + * @param listener the ChatRoomProviderWrapperListener to be removed + */ + public void removeChatRoomProviderWrapperListener( + ChatRoomProviderWrapperListener listener) + { + chatRoomList.removeChatRoomProviderWrapperListener(listener); + } + + /** + * Returns the <tt>ChatRoomProviderWrapper</tt> that correspond to the + * given <tt>ProtocolProviderService</tt>. If the list doesn't contain a + * corresponding wrapper - returns null. + * + * @param protocolProvider the protocol provider that we're looking for + * @return the <tt>ChatRoomProvider</tt> object corresponding to + * the given <tt>ProtocolProviderService</tt> + */ + public ChatRoomProviderWrapper findServerWrapperFromProvider( + ProtocolProviderService protocolProvider) + { + return chatRoomList.findServerWrapperFromProvider(protocolProvider); + } + + /** + * Returns the <tt>ChatRoomWrapper</tt> that correspond to the given + * <tt>ChatRoom</tt>. If the list of chat rooms doesn't contain a + * corresponding wrapper - returns null. + * + * @param chatRoom the <tt>ChatRoom</tt> that we're looking for + * @return the <tt>ChatRoomWrapper</tt> object corresponding to the given + * <tt>ChatRoom</tt> + */ + public ChatRoomWrapper findChatRoomWrapperFromChatRoom(ChatRoom chatRoom) + { + return chatRoomList.findChatRoomWrapperFromChatRoom(chatRoom); + } + + /** + * Opens a chat window for the chat room. + * + * @param room the chat room. + */ + public void openChatRoom(ChatRoomWrapper room) + { + if (room.getChatRoom() == null) + { + room = createChatRoom( + room.getChatRoomName(), + room.getParentProvider().getProtocolProvider(), + new ArrayList<String>(),"", false, false, true); + + // leave the chatroom because getChatRoom().isJoined() returns true + // otherwise + if (room.getChatRoom().isJoined()) + room.getChatRoom().leave(); + + } + + if(!room.getChatRoom().isJoined()) + { + String savedNick = + ConfigurationUtils.getChatRoomProperty(room + .getParentProvider().getProtocolProvider(), room + .getChatRoomID(), "userNickName"); + String subject = null; + + if (savedNick == null) + { + String[] joinOptions = ChatRoomJoinOptionsDialog.getJoinOptions( + room.getParentProvider().getProtocolProvider(), + room.getChatRoomID(), + MUCActivator.getGlobalDisplayDetailsService() + .getDisplayName( + room.getParentProvider().getProtocolProvider())); + savedNick = joinOptions[0]; + subject = joinOptions[1]; + + } + + if (savedNick != null) + { + joinChatRoom(room, savedNick, null, + subject); + } + else + return; + } + + MUCActivator.getUIService().openChatRoomWindow(room); + } + + /** + * Returns instance of the <tt>ServerChatRoomContactSourceService</tt> + * contact source. + * @return instance of the <tt>ServerChatRoomContactSourceService</tt> + * contact source. + */ + public ContactSourceService getServerChatRoomsContactSourceForProvider( + ChatRoomProviderWrapper pps) + { + return new ServerChatRoomContactSourceService(pps); + } + + /** + * Returns <tt>true</tt> if the contact is <tt>ChatRoomSourceContact</tt> + * + * @param contact the contact + * @return <tt>true</tt> if the contact is <tt>ChatRoomSourceContact</tt> + */ + public boolean isMUCSourceContact(SourceContact contact) + { + return (contact instanceof ChatRoomSourceContact); + } +} diff --git a/src/net/java/sip/communicator/impl/muc/ServerChatRoomQuery.java b/src/net/java/sip/communicator/impl/muc/ServerChatRoomQuery.java index 47785ee..a98e5ed 100644 --- a/src/net/java/sip/communicator/impl/muc/ServerChatRoomQuery.java +++ b/src/net/java/sip/communicator/impl/muc/ServerChatRoomQuery.java @@ -1,4 +1,4 @@ -/*
+/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd @@ -15,331 +15,331 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package net.java.sip.communicator.impl.muc;
-
-import java.util.*;
-import java.util.regex.*;
-
-import net.java.sip.communicator.service.contactsource.*;
-import net.java.sip.communicator.service.muc.*;
-import net.java.sip.communicator.service.protocol.*;
-
-/**
- * The <tt>ServerChatRoomQuery</tt> is a query over the
- * <tt>ServerChatRoomContactSourceService</tt>.
- *
- * @author Hristo Terezov
- */
-public class ServerChatRoomQuery
- extends AsyncContactQuery<ContactSourceService>
- implements ChatRoomProviderWrapperListener
-{
- /**
- * The query string.
- */
- private String queryString;
-
- /**
- * List with the current results for the query.
- */
- private Set<BaseChatRoomSourceContact> contactResults
- = new TreeSet<BaseChatRoomSourceContact>();
-
- /**
- * MUC service.
- */
- private MUCServiceImpl mucService;
-
- /**
- * The number of contact query listeners.
- */
- private int contactQueryListenersCount = 0;
-
- /**
- * The provider associated with the query.
- */
- private ChatRoomProviderWrapper provider = null;
-
- /**
- * Creates an instance of <tt>ChatRoomQuery</tt> by specifying
- * the parent contact source, the query string to match and the maximum
- * result contacts to return.
- *
- * @param contactSource the parent contact source
- * @param queryString the query string to match
- * @param provider the provider associated with the query
- */
- public ServerChatRoomQuery(String queryString,
- ServerChatRoomContactSourceService contactSource,
- ChatRoomProviderWrapper provider)
- {
- super(contactSource,
- Pattern.compile(queryString, Pattern.CASE_INSENSITIVE
- | Pattern.LITERAL), true);
- this.queryString = queryString;
-
- mucService = MUCActivator.getMUCService();
-
- this.provider = provider;
- }
-
- /**
- * Adds listeners for the query
- */
- private void initListeners()
- {
- mucService.addChatRoomProviderWrapperListener(this);
- }
-
- @Override
- protected void run()
- {
- if(provider == null)
- {
- Iterator<ChatRoomProviderWrapper> chatRoomProviders
- = mucService.getChatRoomProviders();
- while (chatRoomProviders.hasNext())
- {
- ChatRoomProviderWrapper provider = chatRoomProviders.next();
- providerAdded(provider, true);
- }
- }
- else
- {
- providerAdded(provider, true);
- }
-
- if (getStatus() != QUERY_CANCELED)
- setStatus(QUERY_COMPLETED);
- }
-
- /**
- * Handles adding a chat room provider.
- * @param provider the provider.
- * @param addQueryResult indicates whether we should add the chat room to
- * the query results or fire an event without adding it to the results.
- */
- private void providerAdded(final ChatRoomProviderWrapper provider,
- final boolean addQueryResult)
- {
- final ProtocolProviderService pps = provider.getProtocolProvider();
- List<String> chatRoomNames =
- MUCActivator.getMUCService().getExistingChatRooms(provider);
- if (chatRoomNames == null)
- {
- return;
- }
-
- // Already create all the BaseChatRoomSourceContact instances since all
- // the data is already available.
- final Set<BaseChatRoomSourceContact> chatRooms =
- new HashSet<BaseChatRoomSourceContact>(chatRoomNames.size());
- for (final String name : chatRoomNames)
- {
- chatRooms.add(new BaseChatRoomSourceContact(name, name, this, pps));
- }
- addChatRooms(pps, chatRooms, addQueryResult);
- }
-
-
- /**
- * 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.
- */
- private void addChatRoom(ProtocolProviderService pps,
- String chatRoomName, String chatRoomID, boolean addQueryResult)
- {
- if((queryString == null
- || ((chatRoomName.contains(
- queryString)
- || chatRoomID.contains(queryString)
- ))) && isMatching(chatRoomID, pps))
- {
- BaseChatRoomSourceContact contact
- = new BaseChatRoomSourceContact(chatRoomName, chatRoomID, this,
- pps);
- synchronized (contactResults)
- {
- contactResults.add(contact);
- }
-
- if(addQueryResult)
- {
- addQueryResult(contact, false);
- }
- else
- {
- fireContactReceived(contact, false);
- }
- }
- }
-
- /**
- * Adds found results to the query results.
- *
- * @param pps the protocol provider associated with the found chat room.
- * @param chatRooms The set of chat rooms based on
- * BaseChatRoomSourceContact. This is the full set and it will be
- * filtered according to demands of the queryString.
- * @param addQueryResult indicates whether we should add the chat room to
- * the query results or fire an event without adding it to the
- * results.
- */
- private void addChatRooms(final ProtocolProviderService pps,
- final Set<BaseChatRoomSourceContact> chatRooms,
- final boolean addQueryResult)
- {
- BaseChatRoomSourceContact room;
- Iterator<BaseChatRoomSourceContact> iterator = chatRooms.iterator();
- while (iterator.hasNext())
- {
- room = iterator.next();
-
- // Notice the NOT operator at the start ...
- if (!((queryString == null || (room.getChatRoomName().contains(
- queryString) || room.getChatRoomID().contains(queryString)))
- && isMatching(room.getChatRoomID(), pps)))
- {
- iterator.remove();
- }
- }
-
- synchronized (contactResults)
- {
- contactResults.addAll(chatRooms);
- }
-
- if (addQueryResult)
- {
- addQueryResults(chatRooms);
- }
- else
- {
- // TODO Need something to fire one event for multiple contacts.
- for (SourceContact contact : chatRooms)
- {
- fireContactReceived(contact, false);
- }
- }
- }
-
- @Override
- public void chatRoomProviderWrapperAdded(ChatRoomProviderWrapper provider)
- {
- providerAdded(provider, false);
- }
-
- @Override
- public void chatRoomProviderWrapperRemoved(ChatRoomProviderWrapper provider)
- {
- LinkedList<BaseChatRoomSourceContact> tmpContactResults;
- synchronized (contactResults)
- {
- tmpContactResults
- = new LinkedList<BaseChatRoomSourceContact>(contactResults);
-
- for(BaseChatRoomSourceContact contact : tmpContactResults)
- {
- if(contact.getProvider().equals(provider.getProtocolProvider()))
- {
- contactResults.remove(contact);
- fireContactRemoved(contact);
- }
- }
- }
- }
-
-
- /**
- * Clears any listener we used.
- */
- private void clearListeners()
- {
- mucService.removeChatRoomProviderWrapperListener(this);
- }
-
- /**
- * Cancels this <tt>ContactQuery</tt>.
- *
- * @see ContactQuery#cancel()
- */
- public void cancel()
- {
- clearListeners();
-
- super.cancel();
- }
-
- /**
- * If query has status changed to cancel, let's clear listeners.
- * @param status {@link ContactQuery#QUERY_CANCELED},
- * {@link ContactQuery#QUERY_COMPLETED}
- */
- public void setStatus(int status)
- {
- if(status == QUERY_CANCELED)
- clearListeners();
-
- super.setStatus(status);
- }
-
- @Override
- public void addContactQueryListener(ContactQueryListener l)
- {
- super.addContactQueryListener(l);
- contactQueryListenersCount++;
- if(contactQueryListenersCount == 1)
- {
- initListeners();
- }
- }
-
- @Override
- public void removeContactQueryListener(ContactQueryListener l)
- {
- super.removeContactQueryListener(l);
- contactQueryListenersCount--;
- if(contactQueryListenersCount == 0)
- {
- clearListeners();
- }
- }
-
- /**
- * Checks if the contact should be added to results or not.
- * @param chatRoomID the chat room id associated with the contact.
- * @param pps the provider of the chat room contact.
- * @return <tt>true</tt> if the result should be added to the results and
- * <tt>false</tt> if not.
- */
- public boolean isMatching(String chatRoomID, ProtocolProviderService pps)
- {
- return (MUCActivator.getMUCService().findChatRoomWrapperFromChatRoomID(
- chatRoomID, pps) == null);
- }
-
- /**
- * 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 int indexOf(BaseChatRoomSourceContact contact)
- {
- Iterator<BaseChatRoomSourceContact> it = contactResults.iterator();
- int i = 0;
- while(it.hasNext())
- {
- if(contact.equals(it.next()))
- {
- return i;
- }
- i++;
- }
- return -1;
- }
-}
+package net.java.sip.communicator.impl.muc; + +import java.util.*; +import java.util.regex.*; + +import net.java.sip.communicator.service.contactsource.*; +import net.java.sip.communicator.service.muc.*; +import net.java.sip.communicator.service.protocol.*; + +/** + * The <tt>ServerChatRoomQuery</tt> is a query over the + * <tt>ServerChatRoomContactSourceService</tt>. + * + * @author Hristo Terezov + */ +public class ServerChatRoomQuery + extends AsyncContactQuery<ContactSourceService> + implements ChatRoomProviderWrapperListener +{ + /** + * The query string. + */ + private String queryString; + + /** + * List with the current results for the query. + */ + private Set<BaseChatRoomSourceContact> contactResults + = new TreeSet<BaseChatRoomSourceContact>(); + + /** + * MUC service. + */ + private MUCServiceImpl mucService; + + /** + * The number of contact query listeners. + */ + private int contactQueryListenersCount = 0; + + /** + * The provider associated with the query. + */ + private ChatRoomProviderWrapper provider = null; + + /** + * Creates an instance of <tt>ChatRoomQuery</tt> by specifying + * the parent contact source, the query string to match and the maximum + * result contacts to return. + * + * @param contactSource the parent contact source + * @param queryString the query string to match + * @param provider the provider associated with the query + */ + public ServerChatRoomQuery(String queryString, + ServerChatRoomContactSourceService contactSource, + ChatRoomProviderWrapper provider) + { + super(contactSource, + Pattern.compile(queryString, Pattern.CASE_INSENSITIVE + | Pattern.LITERAL), true); + this.queryString = queryString; + + mucService = MUCActivator.getMUCService(); + + this.provider = provider; + } + + /** + * Adds listeners for the query + */ + private void initListeners() + { + mucService.addChatRoomProviderWrapperListener(this); + } + + @Override + protected void run() + { + if(provider == null) + { + Iterator<ChatRoomProviderWrapper> chatRoomProviders + = mucService.getChatRoomProviders(); + while (chatRoomProviders.hasNext()) + { + ChatRoomProviderWrapper provider = chatRoomProviders.next(); + providerAdded(provider, true); + } + } + else + { + providerAdded(provider, true); + } + + if (getStatus() != QUERY_CANCELED) + setStatus(QUERY_COMPLETED); + } + + /** + * Handles adding a chat room provider. + * @param provider the provider. + * @param addQueryResult indicates whether we should add the chat room to + * the query results or fire an event without adding it to the results. + */ + private void providerAdded(final ChatRoomProviderWrapper provider, + final boolean addQueryResult) + { + final ProtocolProviderService pps = provider.getProtocolProvider(); + List<String> chatRoomNames = + MUCActivator.getMUCService().getExistingChatRooms(provider); + if (chatRoomNames == null) + { + return; + } + + // Already create all the BaseChatRoomSourceContact instances since all + // the data is already available. + final Set<BaseChatRoomSourceContact> chatRooms = + new HashSet<BaseChatRoomSourceContact>(chatRoomNames.size()); + for (final String name : chatRoomNames) + { + chatRooms.add(new BaseChatRoomSourceContact(name, name, this, pps)); + } + addChatRooms(pps, chatRooms, addQueryResult); + } + + + /** + * 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. + */ + private void addChatRoom(ProtocolProviderService pps, + String chatRoomName, String chatRoomID, boolean addQueryResult) + { + if((queryString == null + || ((chatRoomName.contains( + queryString) + || chatRoomID.contains(queryString) + ))) && isMatching(chatRoomID, pps)) + { + BaseChatRoomSourceContact contact + = new BaseChatRoomSourceContact(chatRoomName, chatRoomID, this, + pps); + synchronized (contactResults) + { + contactResults.add(contact); + } + + if(addQueryResult) + { + addQueryResult(contact, false); + } + else + { + fireContactReceived(contact, false); + } + } + } + + /** + * Adds found results to the query results. + * + * @param pps the protocol provider associated with the found chat room. + * @param chatRooms The set of chat rooms based on + * BaseChatRoomSourceContact. This is the full set and it will be + * filtered according to demands of the queryString. + * @param addQueryResult indicates whether we should add the chat room to + * the query results or fire an event without adding it to the + * results. + */ + private void addChatRooms(final ProtocolProviderService pps, + final Set<BaseChatRoomSourceContact> chatRooms, + final boolean addQueryResult) + { + BaseChatRoomSourceContact room; + Iterator<BaseChatRoomSourceContact> iterator = chatRooms.iterator(); + while (iterator.hasNext()) + { + room = iterator.next(); + + // Notice the NOT operator at the start ... + if (!((queryString == null || (room.getChatRoomName().contains( + queryString) || room.getChatRoomID().contains(queryString))) + && isMatching(room.getChatRoomID(), pps))) + { + iterator.remove(); + } + } + + synchronized (contactResults) + { + contactResults.addAll(chatRooms); + } + + if (addQueryResult) + { + addQueryResults(chatRooms); + } + else + { + // TODO Need something to fire one event for multiple contacts. + for (SourceContact contact : chatRooms) + { + fireContactReceived(contact, false); + } + } + } + + @Override + public void chatRoomProviderWrapperAdded(ChatRoomProviderWrapper provider) + { + providerAdded(provider, false); + } + + @Override + public void chatRoomProviderWrapperRemoved(ChatRoomProviderWrapper provider) + { + LinkedList<BaseChatRoomSourceContact> tmpContactResults; + synchronized (contactResults) + { + tmpContactResults + = new LinkedList<BaseChatRoomSourceContact>(contactResults); + + for(BaseChatRoomSourceContact contact : tmpContactResults) + { + if(contact.getProvider().equals(provider.getProtocolProvider())) + { + contactResults.remove(contact); + fireContactRemoved(contact); + } + } + } + } + + + /** + * Clears any listener we used. + */ + private void clearListeners() + { + mucService.removeChatRoomProviderWrapperListener(this); + } + + /** + * Cancels this <tt>ContactQuery</tt>. + * + * @see ContactQuery#cancel() + */ + public void cancel() + { + clearListeners(); + + super.cancel(); + } + + /** + * If query has status changed to cancel, let's clear listeners. + * @param status {@link ContactQuery#QUERY_CANCELED}, + * {@link ContactQuery#QUERY_COMPLETED} + */ + public void setStatus(int status) + { + if(status == QUERY_CANCELED) + clearListeners(); + + super.setStatus(status); + } + + @Override + public void addContactQueryListener(ContactQueryListener l) + { + super.addContactQueryListener(l); + contactQueryListenersCount++; + if(contactQueryListenersCount == 1) + { + initListeners(); + } + } + + @Override + public void removeContactQueryListener(ContactQueryListener l) + { + super.removeContactQueryListener(l); + contactQueryListenersCount--; + if(contactQueryListenersCount == 0) + { + clearListeners(); + } + } + + /** + * Checks if the contact should be added to results or not. + * @param chatRoomID the chat room id associated with the contact. + * @param pps the provider of the chat room contact. + * @return <tt>true</tt> if the result should be added to the results and + * <tt>false</tt> if not. + */ + public boolean isMatching(String chatRoomID, ProtocolProviderService pps) + { + return (MUCActivator.getMUCService().findChatRoomWrapperFromChatRoomID( + chatRoomID, pps) == null); + } + + /** + * 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 int indexOf(BaseChatRoomSourceContact contact) + { + Iterator<BaseChatRoomSourceContact> it = contactResults.iterator(); + int i = 0; + while(it.hasNext()) + { + if(contact.equals(it.next())) + { + return i; + } + i++; + } + return -1; + } +} |