package pl.radical.open.gg;
import pl.radical.open.gg.event.MessageListener;
import pl.radical.open.gg.packet.dicts.MessageStatus;
import java.util.HashSet;
import java.util.Set;
/**
* Created on 2005-01-29
*
* @author <a href="mailto:mati@sz.home.pl">Mateusz Szczap</a>
*/
public abstract class AbstractChat implements IChat {
protected Set<MessageListener> messageListeners = new HashSet<MessageListener>();
protected Session session = null;
protected AbstractChat(final Session session) {
if (session == null) {
throw new IllegalArgumentException("session cannot be null");
}
this.session = session;
session.getMessageService().addMessageListener(new MessageHandler());
}
public void addChatListener(final MessageListener messageListener) {
if (messageListener == null) {
throw new IllegalArgumentException("messageListener cannot be null");
}
messageListeners.add(messageListener);
}
public void removeChatListener(final MessageListener messageListener) {
if (messageListener == null) {
throw new IllegalArgumentException("messageListener cannot be null");
}
messageListeners.remove(messageListener);
}
protected void fireChatMessageArrived(final IIncommingMessage message) {
for (final Object element : messageListeners) {
final MessageListener listener = (MessageListener) element;
listener.messageArrived(message);
}
}
protected void fireChatMessageDelivered(final int uin, final int messageID, final MessageStatus deliveryStatus) {
for (final Object element : messageListeners) {
final MessageListener listener = (MessageListener) element;
listener.messageDelivered(uin, messageID, deliveryStatus);
}
}
protected abstract boolean acceptsIncoming(IIncommingMessage incomingMessage);
protected abstract boolean acceptsOutgoing(int uin, int messageID, MessageStatus deliveryStatus);
private class MessageHandler extends MessageListener.Stub {
/**
* @see pl.radical.open.gg.event.MessageListener#messageArrived(pl.radical.open.gg.IncomingMessage)
*/
@Override
public void messageArrived(final IIncommingMessage incommingMessage) {
if (acceptsIncoming(incommingMessage)) {
fireChatMessageArrived(incommingMessage);
}
}
/**
* @see pl.radical.open.gg.event.MessageListener#messageDelivered(int, int, pl.radical.open.gg.packet.dicts.MessageStatus)
*/
@Override
public void messageDelivered(final int uin, final int messageID, final MessageStatus deliveryStatus) {
if (acceptsOutgoing(uin, messageID, deliveryStatus)) {
fireChatMessageDelivered(uin, messageID, deliveryStatus);
}
}
}
}