/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.impl.gui.main.chat; import java.util.*; import javax.swing.*; import net.java.sip.communicator.service.filehistory.*; import net.java.sip.communicator.service.msghistory.*; import net.java.sip.communicator.service.protocol.*; /** * @author Yana Stamcheva * @author Lubomir Marinov */ public abstract class ChatSession { /** * The chat history filter. */ protected final String[] chatHistoryFilter = new String[]{ MessageHistoryService.class.getName(), FileHistoryService.class.getName()}; /** * The list of <tt>ChatContact</tt>s contained in this chat session. */ protected final List<ChatContact<?>> chatParticipants = new ArrayList<ChatContact<?>>(); /** * The list of <tt>ChatTransport</tt>s available in this session. */ protected final List<ChatTransport> chatTransports = new LinkedList<ChatTransport>(); /** * The list of all <tt>ChatSessionChangeListener</tt>-s registered to listen * for transport modifications. */ private final List<ChatSessionChangeListener> chatTransportChangeListeners = new ArrayList<ChatSessionChangeListener>(); /** * The persistable address of the contact from the session. */ protected String persistableAddress = null; /** * Returns the descriptor of this chat session. * * @return the descriptor of this chat session. */ public abstract Object getDescriptor(); /** * Returns the persistable address of the contact from the session. * @return the persistable address. */ public String getPersistableAddress() { return persistableAddress; } /** * Returns <code>true</code> if this chat session descriptor is persistent, * otherwise returns <code>false</code>. * @return <code>true</code> if this chat session descriptor is persistent, * otherwise returns <code>false</code>. */ public abstract boolean isDescriptorPersistent(); /** * Returns an iterator to the list of all participants contained in this * chat session. * * @return an iterator to the list of all participants contained in this * chat session. */ public Iterator<ChatContact<?>> getParticipants() { return chatParticipants.iterator(); } /** * Returns all available chat transports for this chat session. Each chat * transport is corresponding to a protocol provider. * * @return all available chat transports for this chat session. */ public Iterator<ChatTransport> getChatTransports() { return chatTransports.iterator(); } /** * Returns the currently used transport for all operation within this chat * session. * * @return the currently used transport for all operation within this chat * session. */ public abstract ChatTransport getCurrentChatTransport(); /** * Returns a list of all <tt>ChatTransport</tt>s contained in this session * supporting the given <tt>opSetClass</tt>. * @param opSetClass the <tt>OperationSet</tt> class we're looking for * @return a list of all <tt>ChatTransport</tt>s contained in this session * supporting the given <tt>opSetClass</tt> */ public List<ChatTransport> getTransportsForOperationSet( Class<? extends OperationSet> opSetClass) { LinkedList<ChatTransport> opSetTransports = new LinkedList<ChatTransport>(); for (ChatTransport transport : chatTransports) { if(transport.getProtocolProvider() .getOperationSet(opSetClass) != null) opSetTransports.add(transport); } return opSetTransports; } /** * Returns the <tt>ChatSessionRenderer</tt> that provides the connection * between this chat session and its UI. * * @return The <tt>ChatSessionRenderer</tt>. */ public abstract ChatSessionRenderer getChatSessionRenderer(); /** * Sets the transport that will be used for all operations within this chat * session. * * @param chatTransport The transport to set as a default transport for this * session. */ public abstract void setCurrentChatTransport(ChatTransport chatTransport); /** * Returns the name of the chat. If this chat panel corresponds to a single * chat it will return the name of the <tt>MetaContact</tt>, otherwise it * will return the name of the chat room. * * @return the name of the chat */ public abstract String getChatName(); /** * Returns a collection of the last N number of history messages given by * count. * * @param count The number of messages from history to return. * @return a collection of the last N number of messages given by count. */ public abstract Collection<Object> getHistory(int count); /** * Returns a collection of the last N number of history messages given by * count. * * @param date The date up to which we're looking for messages. * @param count The number of messages from history to return. * @return a collection of the last N number of messages given by count. */ public abstract Collection<Object> getHistoryBeforeDate(Date date, int count); /** * Returns a collection of the last N number of history messages given by * count. * * @param date The date from which we're looking for messages. * @param count The number of messages from history to return. * @return a collection of the last N number of messages given by count. */ public abstract Collection<Object> getHistoryAfterDate(Date date, int count); /** * Returns the start date of the history of this chat session. * * @return the start date of the history of this chat session. */ public abstract Date getHistoryStartDate(); /** * Returns the end date of the history of this chat session. * * @return the end date of the history of this chat session. */ public abstract Date getHistoryEndDate(); /** * Returns the default mobile number used to send sms-es in this session. * * @return the default mobile number used to send sms-es in this session. */ public abstract String getDefaultSmsNumber(); /** * Sets the default mobile number used to send sms-es in this session. * * @param smsPhoneNumber The default mobile number used to send sms-es in * this session. */ public abstract void setDefaultSmsNumber(String smsPhoneNumber); /** * Disposes this chat session. */ public abstract void dispose(); /** * Returns the ChatTransport corresponding to the given descriptor. * * @param descriptor The descriptor of the chat transport we're looking for. * @param resourceName The name of the resource if any, null otherwise * @return The ChatTransport corresponding to the given descriptor. */ public ChatTransport findChatTransportForDescriptor(Object descriptor, String resourceName) { for (ChatTransport chatTransport : chatTransports) { String transportResName = chatTransport.getResourceName(); if (chatTransport.getDescriptor().equals(descriptor) && (resourceName == null || (transportResName != null && transportResName.equals(resourceName)))) return chatTransport; } return null; } /** * Returns the status icon of this chat session. * * @return the status icon of this chat session. */ public abstract ImageIcon getChatStatusIcon(); /** * Returns the avatar icon of this chat session. * * @return the avatar icon of this chat session. */ public abstract byte[] getChatAvatar(); /** * Gets the indicator which determines whether a contact list of (multiple) * participants is supported by this <code>ChatSession</code>. For example, * UI implementations may use the indicator to determine whether UI elements * should be created for the user to represent the contact list of the * participants in this <code>ChatSession</code>. * * @return <tt>true</tt> if this <code>ChatSession</code> supports a contact * list of (multiple) participants; otherwise, <tt>false</tt> */ public abstract boolean isContactListSupported(); /** * Adds the given {@link ChatSessionChangeListener} to this * <tt>ChatSession</tt>. * * @param l the <tt>ChatSessionChangeListener</tt> to add */ public void addChatTransportChangeListener( ChatSessionChangeListener l) { synchronized (chatTransportChangeListeners) { if (!chatTransportChangeListeners.contains(l)) chatTransportChangeListeners.add(l); } } /** * Removes the given {@link ChatSessionChangeListener} to this * <tt>ChatSession</tt>. * * @param l the <tt>ChatSessionChangeListener</tt> to add */ public void removeChatTransportChangeListener( ChatSessionChangeListener l) { synchronized (chatTransportChangeListeners) { chatTransportChangeListeners.remove(l); } } /** * Fires a event that current ChatTransport has changed. */ public void fireCurrentChatTransportChange() { List<ChatSessionChangeListener> listeners = null; synchronized (chatTransportChangeListeners) { listeners = new ArrayList<ChatSessionChangeListener>( chatTransportChangeListeners); } for (ChatSessionChangeListener l : listeners) l.currentChatTransportChanged(this); } /** * Fires a event that current ChatTransport has been updated. */ public void fireCurrentChatTransportUpdated(int eventID) { List<ChatSessionChangeListener> listeners = null; synchronized (chatTransportChangeListeners) { listeners = new ArrayList<ChatSessionChangeListener>( chatTransportChangeListeners); } for (ChatSessionChangeListener l : listeners) l.currentChatTransportUpdated(eventID); } }