JSocketMUD/
JSocketMUD/dk/socketmud/
JSocketMUD/dk/socketmud/io/
JSocketMUD/dk/socketmud/object/
JSocketMUD/dk/socketmud/util/
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;
	}
}