package net.tinyos.matlab;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;


// to test server alone, start command prompt and type:
// %  telnet localhost 4444
// send it requests as if it were clientRequest
// alternatively, use MatClient.java and testClient.java 
public class MatServer 
{
  MatlabControl mc = new MatlabControl(); 
  boolean listening = true;

  public void body() throws IOException {
    
//	System.out.println("entering body"); 
	class Caller extends Thread {
      public void run()
      {
        try 
        {
          body2();
        }
        catch( IOException e ) { e.printStackTrace(); }
      }
      public void body2()  throws IOException
      {
        ServerSocket serverSocket = null;
        try
        {
          serverSocket = new ServerSocket( 4444 ); 
        }
        catch( IOException e ) { e.printStackTrace(); System.exit(1); }
    
        while( listening )
        {
        	new workerThreadRMI( serverSocket.accept() ).run();
        	
        }
        serverSocket.close();
      } // end_run
    } // end_caller
    
    Caller c = new Caller();
    c.start();
  }

  public class workerThreadRMI
  {
	  private Socket socket = null;
	  public workerThreadRMI(Socket socket) { 
		  this.socket = socket; }
	  boolean end = false;
	  
	  public void run()
	  {
		  try {
			ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
			ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
			
			System.out.println("trying to read object");
				Object call[] = (Object[]) is.readObject();
				String command = (String)call[0];
				if("bye".equals(command)) {
					listening = false;
				} else {
					Object ret = mc.blockingFeval(command, (Object[])call[1]);
					os.writeObject(ret);
				}				
			os.close();
			is.close();
			socket.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	  }
  }
  
}// end_MatServer_class

