aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/java/sip/communicator/impl/muc
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/java/sip/communicator/impl/muc')
-rw-r--r--src/net/java/sip/communicator/impl/muc/BaseChatRoomSourceContact.java278
-rw-r--r--src/net/java/sip/communicator/impl/muc/ChatRoomQuery.java1080
-rw-r--r--src/net/java/sip/communicator/impl/muc/ChatRoomSourceContact.java222
-rw-r--r--src/net/java/sip/communicator/impl/muc/MUCCustomContactActionService.java1686
-rw-r--r--src/net/java/sip/communicator/impl/muc/MUCServiceImpl.java2230
-rw-r--r--src/net/java/sip/communicator/impl/muc/ServerChatRoomQuery.java658
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;
+ }
+}