package dk.socketmud.io;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.Iterator;
import dk.socketmud.util.Colour;
import dk.socketmud.object.Character;
public class SMClient
{
public enum State { PromptName, PromptNameVerify, Connected };
protected SMServer server;
protected Character ch;
protected State state;
protected Socket socket;
protected StringBuffer outBuffer;
protected String inBuffer;
protected String nameBuffer;
public SMClient(SMServer server, Socket socket) throws NullPointerException, SocketException
{
if (server == null)
throw new NullPointerException("server cannot be NULL");
if (socket == null)
throw new NullPointerException("socket cannot be NULL");
this.server = server;
this.state = State.PromptName;
this.socket = socket;
this.outBuffer = new StringBuffer();
this.inBuffer = null;
this.nameBuffer = null;
this.ch = null;
socket.setSoTimeout(10);
}
public void write(String s)
{
outBuffer.append(Colour.escape(s));
}
public void read() throws IOException, SocketTimeoutException
{
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
inBuffer = br.readLine();
}
public void flush() throws IOException
{
if (outBuffer.length() > 0)
{
OutputStream os = socket.getOutputStream();
if (state.equals(State.Connected))
{
outBuffer.append("\r\n$> ");
os.write("\r\n".getBytes());
}
os.write(outBuffer.toString().getBytes());
outBuffer.setLength(0);
}
}
public void close() throws IOException
{
socket.close();
server.clients.remove(this);
}
public ArrayList<Character> getAllCharacters()
{
ArrayList<Character> gch = new ArrayList<Character>();
Iterator<SMClient> clients = server.clients.iterator();
while (clients.hasNext())
{
SMClient client = clients.next();
if (client.state == State.Connected && client.ch != null)
gch.add(client.ch);
}
return gch;
}
}