/*************************************************
 * Author: 	Evelyn Lai-Tee Cheok
 *			Department of Electrical Engineering
 *			Center for Telecommunications Research
 *			Schapiro Research Building
 *			Columbia University
 *
 * Email: 	laitee@ctr.columbia.edu
 *
 **************************************************/
import java.lang.*;
import java.net.*;
import java.io.*;
import java.util.Random;
import SenderMCSocket;
import RTCP_PacketHandler;


/** Implements an RTCP sender thread that sends user information as
  * RTCP SDES items. The RTCP interval is derived by calling the appropiate
  * function from the RTCP Packet Handler **/

class RTCP_Sender_Thread extends Thread {
    DatagramPacket pack;
    byte pkt_buf[] = new byte[1024];
	MenuWindow main_parent;
	RTCP_PacketHandler rtcp_pkt_handler;

	double rtcp_bw = (double)0.0;
	double interval = (double)0.0;

	/** Constructor function **/
    public RTCP_Sender_Thread( MenuWindow parent ) {
        super();
		main_parent = parent;
		rtcp_pkt_handler = new RTCP_PacketHandler(parent.state_info);
    }

	/** Looping thread that assembles user SDES information every certain
	  * interval before sending out through RTCP sender multicast socket. **/
    public void run() {
        while (true) {
			rtcp_bw = (double)(0.05 * main_parent.state_info.session_bw);
			if ( main_parent.state_info.initial == true ) {
				main_parent.statWin.update();
				interval = rtcp_pkt_handler.transm_interval(
								main_parent.state_info.initial,
								main_parent.state_info.members,
								30, main_parent.state_info.activeSenders,
								main_parent.state_info.we_sent, rtcp_bw,
								main_parent.state_info.RTCP_packet_size);
			}
			
			try {
				sleep( (long)(interval*1000) );
			} catch (java.lang.InterruptedException e) {
				System.out.println("InterruptedException in sleep: "+e);
			}

			pkt_buf = rtcp_pkt_handler.assemble(
									main_parent.pkt_handler.SSRC,
									main_parent.parent.user_info,
									main_parent.state_info.exit);
			main_parent.state_info.RTCP_packet_size = 
									rtcp_pkt_handler.getRTCPSize();
			main_parent.rtcp_senderSock.sendByteData(pkt_buf);

			if (main_parent.state_info.exit == true) {
				main_parent.exit();
				main_parent.state_info.exit = false;
			}
			main_parent.statWin.update();
			interval = rtcp_pkt_handler.transm_interval(
							main_parent.state_info.initial,
							main_parent.state_info.members,
							30, main_parent.state_info.activeSenders,
							main_parent.state_info.we_sent, rtcp_bw,
							main_parent.state_info.RTCP_packet_size);
		}
	}

	/** Terminates RTCP sender thread **/
    public void stopthread() {
        System.out.println("In stopthread\n");
        stop();
    }
}


