package lejos.pc.comm;

import java.io.*;

/**
 * Implementation of InputStream over NXTComm using Bluetooth.
 */
public class NXTCommInputStream extends InputStream {
	private NXTComm nxtComm;
	private byte buf[];
	private int bufIdx, bufSize;
	boolean endOfFile;
	
	public NXTCommInputStream(NXTComm nxtComm) {
		this.nxtComm = nxtComm;
		endOfFile = false;
		bufIdx = 0;
		bufSize = 0;
	}
	
    /**
     * Returns one byte as an integer between 0 and 255.  
     * Returns -1 if the end of the stream is reached.
     * Does not return till some bytes are available.
     */
	public int read() throws IOException
    {
	   if (endOfFile) return -1;
	   if (bufIdx >= bufSize) bufSize = 0;
       if (bufSize == 0) {
    	   bufIdx = 0;
    	   buf = nxtComm.read();
    	   if (buf == null || buf.length ==0) {
    		   endOfFile = true;
    		   return -1;
    	   }
    	   bufSize = buf.length;
       }
       return buf[bufIdx++] & 0xFF;
	}
	
    /**
     * returns the number of bytes in the input buffer - can be read without blocking
     */
    public int available() throws IOException
    {
       return bufSize - bufIdx;
    }
    
    /**
     * Close the stream
     */
    public void close() throws IOException
    { 
       nxtComm.close();
    }
}
