edits
[iotcloud.git] / src / java / iotcloud / Slot.java
index e111f225d785a0e14500f2f78ec0cfb1d0245894..9de69db52d06dd09f786f15a2fc0e9cfce917c52 100644 (file)
@@ -4,8 +4,9 @@ import java.nio.ByteBuffer;
 import javax.crypto.Mac;
 import java.util.Arrays;
 
-class Slot {
+class Slot implements Liveness {
        static final int SLOT_SIZE=2048;
+       static final int RESERVED_SPACE=64;
        static final int HMAC_SIZE=32;
 
        private long seqnum;
@@ -14,7 +15,9 @@ class Slot {
        private long machineid;
        private Vector<Entry> entries;
        private int livecount;
-       
+       private boolean seqnumlive;
+       private int freespace;
+
        Slot(long _seqnum, long _machineid, byte[] _prevhmac, byte[] _hmac) {
                seqnum=_seqnum;
                machineid=_machineid;
@@ -22,10 +25,16 @@ class Slot {
                hmac=_hmac;
                entries=new Vector<Entry>();
                livecount=1;
+               seqnumlive=true;
+               freespace = SLOT_SIZE - getBaseSize();
        }
-       
-       Slot(long _seqnum, byte[] _bytes) {
-               seqnum=_seqnum;
+
+       Slot(long _seqnum, long _machineid, byte[] _prevhmac) {
+               this(_seqnum, _machineid, _prevhmac, null);
+       }
+
+       Slot(long _seqnum, long _machineid) {
+               this(_seqnum, _machineid, new byte[HMAC_SIZE], null);
        }
 
        byte[] getHMAC() {
@@ -39,12 +48,23 @@ class Slot {
        void addEntry(Entry e) {
                entries.add(e);
                livecount++;
+               freespace -= e.getSize();
        }
-       
+
+       boolean hasSpace(Entry e) {
+               int newfreespace = freespace - e.getSize();
+               return newfreespace > RESERVED_SPACE;
+       }
+
+       boolean canFit(Entry e) {
+               int newfreespace = freespace - e.getSize();
+               return newfreespace >= 0;
+       }
+
        Vector<Entry> getEntries() {
                return entries;
        }
-       
+
        static Slot decode(byte[] array, Mac mac) {
                mac.update(array, HMAC_SIZE, array.length-HMAC_SIZE);
                byte[] realmac=mac.doFinal();
@@ -61,18 +81,18 @@ class Slot {
                long machineid=bb.getLong();
                int numentries=bb.getInt();
                Slot slot=new Slot(seqnum, machineid, prevhmac, hmac);
-               
-               for(int i=0;i<numentries;i++) {
+
+               for(int i=0; i<numentries; i++) {
                        slot.addEntry(Entry.decode(slot, bb));
                }
-               
+
                return slot;
        }
 
        byte[] encode(Mac mac) {
                byte[] array=new byte[SLOT_SIZE];
                ByteBuffer bb=ByteBuffer.wrap(array);
-               bb.position(HMAC_SIZE); //Leave space for the HMACs
+               bb.position(HMAC_SIZE);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 //Leave space for the HMACs
                bb.put(prevhmac);
                bb.putLong(seqnum);
                bb.putLong(machineid);
@@ -83,11 +103,28 @@ class Slot {
                //Compute our HMAC
                mac.update(array, HMAC_SIZE, array.length-HMAC_SIZE);
                byte[] realmac=mac.doFinal();
+               hmac = realmac;
                bb.position(0);
                bb.put(realmac);
                return array;
        }
-       
+
+       int getBaseSize() {
+               return 2*HMAC_SIZE+2*Long.BYTES+Integer.BYTES;
+       }
+
+       Vector<Entry> getLiveEntries() {
+               Vector<Entry> liveEntries=new Vector<Entry>();
+               for(Entry entry: entries)
+                       if (entry.isLive())
+                               liveEntries.add(entry);
+
+               if (seqnumlive)
+                       liveEntries.add(new LastMessage(this, machineid, seqnum));
+
+               return liveEntries;
+       }
+
        long getSequenceNumber() {
                return seqnum;
        }
@@ -95,20 +132,21 @@ class Slot {
        long getMachineID() {
                return machineid;
        }
-       
-       byte[] getBytes() {
-               return null;
+
+       void setDead() {
+               decrementLiveCount();
+               seqnumlive=false;
        }
 
        void decrementLiveCount() {
                livecount--;
        }
-       
+
        boolean isLive() {
                return livecount > 0;
        }
 
        public String toString() {
-               return "<"+getSequenceNumber()+", "+new String(getBytes())+">";
+               return "<"+getSequenceNumber()+">";
        }
 }