
package network;

import eventbase.*;
import eventbase.routing.*;

import java.net.*;
import java.util.*;


public class NetworkManager {

    final static int INIT = 0;
    final static int ACK = 1;
    final static int ALIVE = 2;
    final static int DATA = 3;
    final static int TERMINATE = 4;

    final static int VERSION = 2;

    Vector nodesList = null;
    Hashtable nodesTable = null;
    BufferQueue sendBuffer = null;
    AliveAndRetransmitThread aliveThread = null;
    ReceiverThread receiverThread = null;
    SenderThread senderThread = null;

    DatagramSocket socket;
    TransmissionTable table = null;
    EventBaseAgent dbAgent = null;
    SpanningTreeGlobalConstruct sTreeGlobal= null;
    SpanningTreeQueue sQueue = null;
    VRTUpdateManager vrtUpdateManager = null;

    NetworkStatDataModel dataModel = null;

    public NetworkManager(int port, EventBaseAgent db,
                          NetworkStatDataModel netData) throws SocketException {
        dbAgent = db;
        dataModel = netData;
        sTreeGlobal = new SpanningTreeGlobalConstruct();
	sQueue = new SpanningTreeQueue();
	sQueue.startThread(dbAgent, sTreeGlobal);
        vrtUpdateManager = new VRTUpdateManager();
        sendBuffer = new BufferQueue(64);
        table = new TransmissionTable();
        socket = new DatagramSocket(port);

        nodesList = new Vector();
        nodesTable = new Hashtable();

        aliveThread = new AliveAndRetransmitThread(socket, nodesList, table, sendBuffer, dataModel);
        receiverThread = new ReceiverThread(socket, nodesList, dbAgent, sQueue,
                                            vrtUpdateManager, table, sendBuffer, nodesTable,
                                            dataModel);
        senderThread = new SenderThread(socket, sendBuffer);

    }

    public void activate() {
        aliveThread.start();
        receiverThread.start();
        senderThread.start();

    }

    public void deactivate() {
        aliveThread.requestStop();
        receiverThread.requestStop();
        senderThread.requestStop();
    }


}
