/*************************************************
 * 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.util.*;
import java.io.*;
import ReceiverMCSocket;
import rtcp_sdes_type;

/** Class contains functions that receives datagram packets, retrieves 
  * user information and update accordingly on the user list of the 
  * user Panel. **/

class RTCP_Thread extends Thread {
	DatagramPacket pack;
	byte buf[] = new byte[1024];
	MenuWindow main_parent;
	byte data_buf[] = new byte[1024];
	StateInfo state_info;
	UserInfo other_users_info;
	RTCP_PacketHandler rtcp_pkt_handler;
	UserInfo user_info_received;

	/** Construction function **/
	public RTCP_Thread(MenuWindow parent) {
		super();
		main_parent = parent;
		this.state_info = parent.state_info;
		rtcp_pkt_handler = new RTCP_PacketHandler(parent.state_info);
		pack = new DatagramPacket(buf, buf.length);
	}


	/** Thread loops while receiving packets through the RTCP receiver
	  * multicast socket. The user information retrieved is then updated
	  * on the user list. **/

	public void run() {
		while (true) {
			pack = main_parent.rtcp_recvrSock.receiveData(buf);
			user_info_received = rtcp_pkt_handler.disassemble(pack);
			updateMemberVec(rtcp_pkt_handler.get_SSRCRead());
			if (main_parent.state_info.members_leaving == true) {
				main_parent.user_panel.removeFmList(
							rtcp_pkt_handler.get_SSRCRead());
			}
			if (user_info_received.cname.equals(
							main_parent.parent.user_info.cname) == false) {
				main_parent.user_panel.updateUserList(
							user_info_received.cname, user_info_received);
			}
		}
	}

	/** Udpates a vector that keeps track of the number of participating 
	  * users. **/
	public void updateMemberVec(int SSRCRead) {
		Integer Int_SSRCRead = new Integer(SSRCRead);

		if (Int_SSRCRead.intValue() != state_info.SSRC) {
			if (state_info.memberVec.isEmpty() == true) {
				state_info.memberVec.addElement(Int_SSRCRead);
				state_info.members++;
			} else if (state_info.memberVec.contains(Int_SSRCRead) == false) {
				state_info.memberVec.addElement(Int_SSRCRead);
				state_info.members++;
			}
		} else {
			/*System.out.println("DONT COUNT myself with Int_SSRCRead = " + 
															Int_SSRCRead);
				*/
		}
	}

	/** Terminates the RTCP receiver thread **/
	public void stopthread() {
		stop();
	}
}
