001package jmri.jmrix.loconet.locormi;
002
003import java.rmi.RemoteException;
004import java.rmi.server.UnicastRemoteObject;
005import java.util.LinkedList;
006import jmri.jmrix.loconet.LnTrafficController;
007import jmri.jmrix.loconet.LocoNetListener;
008import jmri.jmrix.loconet.LocoNetMessage;
009
010/**
011 * Handle an RMI connection for a single remote client.
012 *
013 * @author Alex Shepherd Copyright (c) 2002
014 */
015public class LnMessageBuffer extends UnicastRemoteObject implements LnMessageBufferInterface, LocoNetListener {
016
017    LinkedList<LocoNetMessage> messageList = null;
018    LnTrafficController tc;
019
020    public LnMessageBuffer(LnTrafficController _tc) throws RemoteException {
021        super();
022        tc = _tc;
023    }
024
025    @Override
026    public void enable(int mask) throws RemoteException {
027        if (messageList == null) {
028            messageList = new LinkedList<LocoNetMessage>();
029        }
030        tc.addLocoNetListener(mask, this);
031    }
032
033    @Override
034    public void disable(int mask) throws RemoteException {
035        tc.removeLocoNetListener(mask, this);
036    }
037
038    @Override
039    public void clear() throws RemoteException {
040        messageList.clear();
041    }
042
043    @Override
044    public void message(LocoNetMessage msg) {
045        synchronized (messageList) {
046            messageList.add(msg);
047            messageList.notify();
048        }
049    }
050
051    @Override
052    public Object[] getMessages(long timeout) {
053        Object[] messagesArray = null;
054
055        synchronized (messageList) {
056            if (messageList.size() == 0) {
057                try {
058                    messageList.wait(timeout);
059                } catch (InterruptedException ex) {
060                    Thread.currentThread().interrupt(); // retain if needed later
061                }
062            }
063
064            if (messageList.size() > 0) {
065                messagesArray = messageList.toArray();
066                messageList.clear();
067            }
068        }
069
070        return messagesArray;
071    }
072
073    @Override
074    public void sendLocoNetMessage(LocoNetMessage m) {
075        tc.sendLocoNetMessage(m);
076    }
077
078}