MiniServer.java

import java.net.*;
import java.io.*;


/**
*/
public class MiniServer implements Runnable,Stoppable,Nameable
{
    private String name;
    private Socket sock;
    private Packetizer packer;
    private Object model;
    private boolean done = false;


    public MiniServer(String name,Socket sock,Object model)
    {
        this.name = name;
        this.sock = sock;
        this.model = model;

        player = new Player(name);
        model.addPlayer(player);

        try {
            packer = new Packetizer(sock,new XSBuilder());
            }
        catch(IOException e_io) {
            System.err.println(
                "Exception creating Packetizer: " + e_io);
            packer = null;
            }
    }


    public void stop()
    {
        done = true;
    }


    public void rename(String newname)
    {
        name = newname;
    }


    public String toString()
    {
        return "MiniServer[" +
            "name='" + name + "'," +
            "port=" + sock.getPort() + "]";
    }


    public void run()
    {
        if (packer == null)
            return;

        packer.start();

        try {
            while (!done) {
                if (packer.messageAvailable()) {
                    Object obj = packer.readMessage();
                    System.err.println(name + " rcvd: " + obj);
                    if (obj == null)
                        break; // XXX Never happens.
                    if (obj instanceof CommandObject) {
                        CommandObject call = (CommandObject)obj;
                        Object answer = call.doCommand(model);
                        packer.sendMessage(answer);
                        System.err.println(name + " sent: " + answer);
                        }
                    if (obj instanceof ControlObject) {
                        ((ControlObject)obj).doFunction(this);
                        packer.sendMessage("OK");
                        System.err.println(name + " sent: OK");
                        }
                    }
                Thread.sleep(20);
                }
            System.err.println(this + " -- stopping.");
            }
        catch(InterruptedException e_ie) {
            System.out.println(this + " -- Interrupted: " + e_ie);
            }
        finally {
            if (packer != null)
                packer.stop();
            }
    }
}