
package network;

import eventbase.*;
import eventbase.routing.*;

import java.io.*;
import java.net.*;
import java.util.*;

public class ReceiverThread extends Thread {

    final static int MAX_RECV_PACKET_LEN = 1000;

    DatagramSocket socket = null;
    Vector nodesList = null;
    EventBaseAgent dbAgent = null;
    SpanningTreeQueue sQueue= null;
    VRTUpdateManager vrtUpdateManager = null;
    TransmissionTable table = null;
    BufferQueue  sendBuffer = null;
    Hashtable nodesTable = null;
    NetworkStatDataModel dataModel = null;

    boolean stopThread = false;

    public ReceiverThread(DatagramSocket s, Vector addr, EventBaseAgent db, SpanningTreeQueue sq,
                          VRTUpdateManager v, TransmissionTable t, BufferQueue buffer, Hashtable tb,
                          NetworkStatDataModel netData) {
        socket = s;
        nodesList = addr;
        dbAgent = db;
        sQueue = sq;
        vrtUpdateManager = v;
        table = t;
        sendBuffer = buffer;
        nodesTable = tb;
        dataModel = netData;

    }

    public void requestStop() {
        stopThread = true;
    }

    private int getAddressIndex(InetAddress addr, int port) {
        int i = 0;
        for (Enumeration e = nodesList.elements(); e.hasMoreElements();) {
            InetObject obj = (InetObject)e.nextElement();
            if (obj.address.equals(addr) && obj.port == port)
                return i;
            i++;
        }

        //System.out.println("Add now");
        InetObject newObj = new InetObject(addr, port);
        nodesList.addElement(newObj);
        nodesTable.put(new Integer(addr.hashCode()), newObj);
        table.increaseSize();

        if (dataModel != null)
            dataModel.addRecord(addr.getHostName());
        return i;
    }

    public void run() {
        DatagramPacket packet = null;
        PacketServiceThread packetServiceThread = null;

        while (!stopThread) {
            try {
                packet = new DatagramPacket(new byte[MAX_RECV_PACKET_LEN], MAX_RECV_PACKET_LEN);
                socket.receive(packet);

                byte[] data = packet.getData();
                if (NetworkManager.VERSION != (int)((data[0] & 0xF0) >> 4))
                    continue;

                int index = getAddressIndex(packet.getAddress(), packet.getPort());
                packetServiceThread = new PacketServiceThread(index, packet, dbAgent,
                                                              sQueue, vrtUpdateManager,
                                                              table, sendBuffer, nodesTable,
                                                              dataModel);
                packetServiceThread.start();

            }
            catch (IOException e) {

            }


        }


    }

}
