/* Copyright (c) 1997-2004
 Ewgenij Gawrilow, Michael Joswig (Technische Universitaet Berlin, Germany)
 http://www.math.tu-berlin.de/polymake,  mailto:polymake@math.tu-berlin.de
 
 This program is free software; you can redistribute it and/or modify it
 under the terms of the GNU General Public License as published by the
 Free Software Foundation; either version 2, or (at your option) any
 later version: http://www.gnu.org/licenses/gpl.txt.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 $Project: polymake $$Id: PolymakeControl.java,v 1.7 2005/11/18 16:59:07 wotzlaw Exp $
 */

package de.tuberlin.polymake.common;

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;
import java.util.HashMap;

/**
 * This class ???
 * 
 * @author Thilo Schr&ouml;der
 */
public abstract class PolymakeControl {	
	public final static String CHARSET = "ISO-8859-1";
	
	protected boolean alive = true;
	protected boolean answer = false;
	protected SimpleGeometryParser parser;
	
	protected BufferedReader clientReader;
	protected Pipe.SinkChannel pipeSink;
	
	protected HashMap frameMap = new HashMap(8);
	protected MsgQueue clientQueue = new MsgQueue();
	protected ByteBuffer bbuf = ByteBuffer.allocate(32);
	
	public PolymakeControl( BufferedReader psReader, BufferedReader clientReader, 
			Pipe.SinkChannel sink) throws IOException{
		this.clientReader = clientReader;
		pipeSink = sink;
		
		bbuf.putInt(1);
	}
	
	public abstract void update() throws IOException;
	
	public int getNumberOfFrames() {
		return frameMap.size();
	}
	
	public void removeFrame(String title) throws IOException {
		answer = false;
		frameMap.remove(title);
		if(frameMap.size() == 0) {
			alive = false;
			bbuf.flip();
			pipeSink.write(bbuf);
		}
	}
	
	public java.awt.Component getFrame(String title) throws IOException {
		return (java.awt.Component)frameMap.get(title);
	}
	
	public void putMessage(String msg, boolean ans) throws IOException {
		synchronized(clientQueue) {
			answer = ans;
			boolean notifyClient = clientQueue.isEmpty();
			clientQueue.pushBack(msg);
			if(notifyClient) {
				bbuf.flip();
				pipeSink.write(bbuf);
			}
		}
	}
	
	public void popMessage() {
		synchronized(clientQueue) {
			if(!clientQueue.isEmpty()) 
				clientQueue.popFront();
		}
	}
	
	public synchronized void setAnswer(boolean ans) {
		answer = ans;
	} 
	
	public synchronized boolean getAnswer() {
		return answer;
	}
	
	public boolean isAlive() {
		return alive;
	}
	
	public String getMessage() {
		synchronized(clientQueue) {
			return (String)clientQueue.front();
		}
	}
}
