package com.ericsson.tic.vi; import java.util.TimerTask; import java.util.Timer; import java.io.IOException; import java.net.SocketTimeoutException; import java.net.DatagramSocket; import java.net.DatagramPacket; import java.net.SocketException; /** * The BufferReader thread continuously reads both the socket buffer and the * user input buffer. * * @author Sami Matilainen * @version 1.0 (2008-12-04) */ public class BufferReader extends TimerTask { /** The port this listener listens on. */ private int portListen; /** A UDP socket. */ private DatagramSocket socket; /** A UDP packet. */ private DatagramPacket packet; /** A temporary buffer. */ private byte[] tempBuffer; /** A temporary buffer. */ private char[] tempCharBuffer; /** * Create a BufferReader and start listening to messages. * Not to be confused with BufferedReader in the Java API. */ public BufferReader(int portListen) throws SocketException { this.portListen = portListen; tempBuffer = new byte[VI.MESSAGE_MAX_WIDTH]; tempCharBuffer = new char[VI.MESSAGE_MAX_WIDTH]; socket = new DatagramSocket(portListen); socket.setSoTimeout(1); // default on mac is 65507 if (socket.getReceiveBufferSize() < VI.socketBufferSize) { socket.setReceiveBufferSize(VI.socketBufferSize); } packet = new DatagramPacket(tempBuffer, tempBuffer.length); Timer t = new Timer(true); t.schedule(this, 500, 500); } /** * Continuously reads the buffers. */ public void run() { checkUserInputBuffer(VI.consoleInputBuffer); if (!VI.pauseGUI) { checkSocketInputBuffer(); } } /** * Checks and parses the content of the specified user input buffer. * * @param buffer the buffer which holds messages. */ private void checkUserInputBuffer(RawBuffer buffer) { buffer.swap(); // buffer.fetch will throw an exception if the buffer is empty while (true) { try { tempCharBuffer = buffer.fetch(); Parser.parseUserInput(new String(tempCharBuffer)); } catch (Exception e) { break; } } } /** * Checks and parses the content of the socket input buffer. */ private void checkSocketInputBuffer() { while (true) { try { tempBuffer = new byte[VI.MESSAGE_MAX_WIDTH]; packet = new DatagramPacket(tempBuffer, tempBuffer.length); socket.receive(packet); Parser.parseMessageInput(new String(tempBuffer)); } catch (SocketTimeoutException e) { break; } catch (IOException e) { e.printStackTrace(); } } } }