package org.limewire.ui.swing.friends.chat;
import org.limewire.concurrent.ThreadExecutor;
import org.limewire.friend.api.ChatState;
import org.limewire.friend.api.FriendException;
import org.limewire.friend.api.MessageWriter;
import org.limewire.logging.Log;
import org.limewire.logging.LogFactory;
import org.limewire.ui.swing.util.I18n;
import static org.limewire.ui.swing.util.I18n.tr;
import org.limewire.listener.EventBroadcaster;
class MessageWriterImpl implements MessageWriter {
private static final Log LOG = LogFactory.getLog(MessageWriterImpl.class);
private final ChatFriend chatFriend;
private final MessageWriter writer;
private final EventBroadcaster<ChatMessageEvent> messageList;
MessageWriterImpl(ChatFriend chatFriend, MessageWriter writer,
EventBroadcaster<ChatMessageEvent> messageList) {
this.chatFriend = chatFriend;
this.writer = writer;
this.messageList = messageList;
}
@Override
public void writeMessage(final String message) throws FriendException {
Message msg = new MessageTextImpl(I18n.tr("me"), chatFriend.getID(), Message.Type.SENT, message);
if (chatFriend.isSignedIn()) {
ThreadExecutor.startThread(new Runnable() {
@Override
public void run() {
try {
writer.writeMessage(message);
} catch (FriendException e) {
// todo: have a way of reporting the exception!
LOG.error("send message failed", e);
}
}
}, "send-message");
messageList.broadcast(new ChatMessageEvent(msg));
} else {
String errorMsg = tr("Message not sent because friend signed off.");
Message error = new ErrorMessage(errorMsg, msg);
messageList.broadcast(new ChatMessageEvent(error));
}
}
@Override
public void setChatState(final ChatState chatState) throws FriendException {
if (chatFriend.isSignedIn()) {
ThreadExecutor.startThread(new Runnable() {
@Override
public void run() {
try {
writer.setChatState(chatState);
} catch (FriendException e) {
LOG.error("set chat state failed", e);
}
}
}, "set-chat-state");
}
}
}