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}