package se.pp.gustafson.marten.logback.appender;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smackx.muc.MultiUserChat;
public final class XmppManager
{
@Deprecated
private static final int SEND_QUEUE_BACKLOG = 100; // TODO: Make this configurable
private final XMPPConnection connection;
private MultiUserChat chat;
private SendThread sendThread;
public XmppManager(final String server, final int port)
{
final ConnectionConfiguration config = new ConnectionConfiguration(server, port);
config.setReconnectionAllowed(true);
this.connection = new XMPPConnection(config);
}
public void connectAndLogin(final String username, final String password, final String resource) throws XMPPException
{
if(!this.connection.isConnected() || !this.connection.isAuthenticated())
{
disconnect();
this.connection.connect();
this.connection.login(username, password, resource);
}
}
public void addListener(final Class<? extends Packet> packetType, final Callback callback)
{
this.connection.addPacketListener(new PacketListener()
{
@Override
public void processPacket(final Packet packet)
{
callback.invoke(packet);
}
}, new PacketFilter()
{
@Override
public boolean accept(final Packet packet)
{
return packetType.isInstance(packet);
}
});
}
public static interface Callback
{
void invoke(Packet packet);
}
public void joinChat(final String nickName, final String chatName) throws XMPPException
{
leaveChat();
this.chat = new MultiUserChat(this.connection, chatName);
this.chat.join(nickName);
this.sendThread = new SendThread(this.chat, SEND_QUEUE_BACKLOG);
this.sendThread.start();
}
/**
* Leaves chat and disconnects
*/
public void disconnect()
{
leaveChat();
this.connection.disconnect();
}
public void leaveChat()
{
if(this.chat != null)
{
this.chat.leave();
}
if(this.sendThread != null)
{
this.sendThread.interrupt();
}
}
public void sendMessage(final String message)
{
this.sendThread.enqueue(message);
}
}