
package network;

import java.util.*;

public class TransmissionTable {

    final static int ACK_RECEIVED = -1;
    final static int TIMEOUT = 3;

    final static int MAX_SEQ = 128;

    Vector table = null;

    public TransmissionTable() {
        table = new Vector();
    }

    public synchronized void increaseSize() {
        TransmissionTableEntry entry = new TransmissionTableEntry();
        table.addElement(entry);
    }

    public synchronized int getTimerValue(int index) {
        return ((TransmissionTableEntry)table.elementAt(index)).timeout;
    }

    public synchronized void setTimerValue(int index, int value) {
        ((TransmissionTableEntry)table.elementAt(index)).timeout = value;
    }

    public synchronized int getRetransmitCount(int index) {
        return ((TransmissionTableEntry)table.elementAt(index)).retransmit;
    }

    public synchronized void incrementRetransmitCount(int index) {
        ((TransmissionTableEntry)table.elementAt(index)).retransmit ++;
    }

    public synchronized void resetRetransmitCount(int index) {
        ((TransmissionTableEntry)table.elementAt(index)).retransmit = 0;
    }

    public synchronized int getSeqNum(int index) {
        return ((TransmissionTableEntry)table.elementAt(index)).seqNum;
    }

    public synchronized void incrementSeqNum(int index) {
        ((TransmissionTableEntry)table.elementAt(index)).seqNum =
        (((TransmissionTableEntry)table.elementAt(index)).seqNum + 1) % MAX_SEQ;
    }

    public synchronized int getRecvSeqNum(int index) {
        return ((TransmissionTableEntry)table.elementAt(index)).recvSeq;
    }

    public synchronized void setRecvSeqNum(int index, int value) {
        ((TransmissionTableEntry)table.elementAt(index)).recvSeq = value;
    }

    public synchronized void countDown() {
        for (Enumeration e = table.elements(); e.hasMoreElements();) {
            TransmissionTableEntry entry = (TransmissionTableEntry)e.nextElement();
            if (entry.timeout != ACK_RECEIVED)
                entry.timeout --;
        }

    }


}



class TransmissionTableEntry {
    public int timeout;
    public int retransmit;
    public int seqNum;
    public int recvSeq;

    public TransmissionTableEntry() {
        timeout = TransmissionTable.ACK_RECEIVED;
        retransmit = 0;
        seqNum = 0;
        recvSeq = 0;
    }
}



