001package edu.wpi.first.wpilibj.networktables2.server;
002
003import java.io.*;
004import java.util.*;
005
006import edu.wpi.first.wpilibj.networktables2.*;
007import edu.wpi.first.wpilibj.networktables2.connection.*;
008
009/**
010 * The entry store for a {@link NetworkTableServer}
011 * 
012 * @author Mitchell
013 *
014 */
015public class ServerNetworkTableEntryStore extends AbstractNetworkTableEntryStore{
016
017        /**
018         * Create a new Server entry store
019         * @param transactionPool the transaction pool
020         * @param listenerManager the listener manager that fires events from this entry store
021         */
022        public ServerNetworkTableEntryStore(final TableListenerManager listenerManager) {
023                super(listenerManager);
024        }
025        
026        private char nextId = (char)0;
027        protected boolean addEntry(NetworkTableEntry newEntry){
028                synchronized(this){
029                        NetworkTableEntry entry = (NetworkTableEntry)namedEntries.get(newEntry.name);
030
031                        if(entry==null){
032                                newEntry.setId(nextId++);
033                                idEntries.put(newEntry.getId(), newEntry);
034                                namedEntries.put(newEntry.name, newEntry);
035                                return true;
036                        }
037                        return false;
038                }
039        }
040
041        protected boolean updateEntry(NetworkTableEntry entry, char sequenceNumber, Object value){
042                synchronized(this){
043                        if(entry.putValue(sequenceNumber, value))
044                                return true;
045                        return false;
046                }
047        }
048        
049        /**
050         * Send all entries in the entry store as entry assignments in a single transaction
051         * @param connection
052         * @throws IOException
053         */
054        void sendServerHello(final NetworkTableConnection connection) throws IOException {
055                synchronized(this){
056                        Enumeration e = namedEntries.elements();
057                        while(e.hasMoreElements()){
058                                NetworkTableEntry entry = (NetworkTableEntry) e.nextElement();
059                                connection.sendEntryAssignment(entry);
060                        }
061                        connection.sendServerHelloComplete();
062                        connection.flush();
063                }
064        }
065}