001package edu.wpi.first.wpilibj.networktables2.client;
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 NetworkTableClient}
011 * 
012 * @author Mitchell
013 *
014 */
015public class ClientNetworkTableEntryStore extends AbstractNetworkTableEntryStore{
016
017        /**
018         * Create a new ClientNetworkTableEntryStore
019         * @param transactionPool
020         * @param listenerManager
021         */
022        public ClientNetworkTableEntryStore(final TableListenerManager listenerManager) {
023                super(listenerManager);
024        }
025        
026        
027        protected boolean addEntry(NetworkTableEntry newEntry){
028                synchronized(this){
029                        NetworkTableEntry entry = (NetworkTableEntry)namedEntries.get(newEntry.name);
030
031                        if(entry!=null){
032                                if(entry.getId()!=newEntry.getId()){
033                                        idEntries.remove(entry.getId());
034                                        if(newEntry.getId()!=NetworkTableEntry.UNKNOWN_ID){
035                                                entry.setId(newEntry.getId());
036                                                idEntries.put(newEntry.getId(), entry);
037                                        }
038                                }
039                                
040                                entry.forcePut(newEntry.getSequenceNumber(), newEntry.getType(), newEntry.getValue());
041                        }
042                        else{
043                                if(newEntry.getId()!=NetworkTableEntry.UNKNOWN_ID)
044                                        idEntries.put(newEntry.getId(), newEntry);
045                                namedEntries.put(newEntry.name, newEntry);
046                        }
047                }
048                return true;
049        }
050        
051        protected boolean updateEntry(NetworkTableEntry entry, char sequenceNumber, Object value) {
052                synchronized(this){
053                        entry.forcePut(sequenceNumber, value);
054                        if(entry.getId()==NetworkTableEntry.UNKNOWN_ID){
055                                return false;
056                        }
057                        return true;
058                }
059        }
060
061        /**
062         * Send all unknown entries in the entry store to the given connection
063         * @param connection
064         * @throws IOException
065         */
066        void sendUnknownEntries(final NetworkTableConnection connection) throws IOException {
067                synchronized(this){
068                        Enumeration e = namedEntries.elements();
069                        while(e.hasMoreElements()){
070                                NetworkTableEntry entry = (NetworkTableEntry) e.nextElement();
071                                if(entry.getId()==NetworkTableEntry.UNKNOWN_ID)
072                                        connection.sendEntryAssignment(entry);
073                        }
074                        connection.flush();
075                }
076        }
077}