edits
[iotcloud.git] / version2 / src / C / Slot.cc
index 18d1a5dc0964c0b2de1829e8744c45fb9ac25895..6f37c9a52f519c7a2718e0444bfe91f2051b6100 100644 (file)
@@ -17,6 +17,7 @@ Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, Array<char> *_pre
        seqnumlive(true),
        freespace(SLOT_SIZE - getBaseSize()),
        table(_table),
+       fakeLastMessage(NULL),
        localSequenceNumber(_localSequenceNumber) {
 }
 
@@ -30,6 +31,7 @@ Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, Array<char> *_pre
        seqnumlive(true),
        freespace(SLOT_SIZE - getBaseSize()),
        table(_table),
+       fakeLastMessage(NULL),
        localSequenceNumber(_localSequenceNumber) {
 }
 
@@ -43,9 +45,21 @@ Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, int64_t _localSeq
        seqnumlive(true),
        freespace(SLOT_SIZE - getBaseSize()),
        table(_table),
+       fakeLastMessage(NULL),
        localSequenceNumber(_localSequenceNumber) {
 }
 
+Slot::~Slot() {
+       if (hmac != NULL)
+               delete hmac;
+       delete prevhmac;
+       for(uint i=0; i< entries->size(); i++)
+               delete entries->get(i);
+       delete entries;
+       if (fakeLastMessage)
+               delete fakeLastMessage;
+}
+
 Entry *Slot::addEntry(Entry *e) {
        e = e->getCopy(this);
        entries->add(e);
@@ -54,12 +68,6 @@ Entry *Slot::addEntry(Entry *e) {
        return e;
 }
 
-void Slot::removeEntry(Entry *e) {
-       entries->remove(e);
-       livecount--;
-       freespace += e->getSize();
-}
-
 void Slot::addShallowEntry(Entry *e) {
        entries->add(e);
        livecount++;
@@ -90,7 +98,8 @@ Slot *Slot_decode(Table *table, Array<char> *array, Mac *mac) {
        bb->get(prevhmac);
        if (!realmac->equals(hmac))
                throw new Error("Server Error: Invalid HMAC!  Potential Attack!");
-
+       delete realmac;
+       
        int64_t seqnum = bb->getLong();
        int64_t machineid = bb->getLong();
        int numentries = bb->getInt();
@@ -99,10 +108,15 @@ Slot *Slot_decode(Table *table, Array<char> *array, Mac *mac) {
        for (int i = 0; i < numentries; i++) {
                slot->addShallowEntry(Entry_decode(slot, bb));
        }
-
+       bb->releaseArray();
+       delete bb;
        return slot;
 }
 
+char Slot::getType() {
+       return TypeSlot;
+}
+
 Array<char> *Slot::encode(Mac *mac) {
        Array<char> *array = new Array<char>(SLOT_SIZE);
        ByteBuffer *bb = ByteBuffer_wrap(array);
@@ -122,6 +136,8 @@ Array<char> *Slot::encode(Mac *mac) {
        hmac = realmac;
        bb->position(0);
        bb->put(realmac);
+       bb->releaseArray();
+       delete bb;
        return array;
 }
 
@@ -142,9 +158,11 @@ Vector<Entry *> *Slot::getLiveEntries(bool resize) {
                }
        }
 
-       if (seqnumlive && !resize)
-               liveEntries->add(new LastMessage(this, machineid, seqnum));
-
+       if (seqnumlive && !resize) {
+               if (! fakeLastMessage)
+                       fakeLastMessage = new LastMessage(this, machineid, seqnum);
+               liveEntries->add(fakeLastMessage);
+       }
        return liveEntries;
 }
 
@@ -175,5 +193,8 @@ Array<char> *Slot::getSlotCryptIV() {
        buffer->putLong(machineid);
        int64_t localSequenceNumberShift = localSequenceNumber << 16;
        buffer->putLong(localSequenceNumberShift);
-       return buffer->array();
+       Array<char> * array = buffer->array();
+       buffer->releaseArray();
+       delete buffer;
+       return array;
 }