
import java.awt.*;
import java.net.RTP.*;
import java.net.RTP.Packets.*;

public class frRTCPMonitor extends Frame implements RTCP_actionListener
{
    private static Session rtpSession;
    
	public frRTCPMonitor( Session s )
	{
	    rtpSession = s;
	    
		// This code is automatically generated by Visual Cafe when you add
		// components to the visual environment. It instantiates and initializes
		// the components. To modify the code, only use code syntax that matches
		// what Visual Cafe can generate, or Visual Cafe may be unable to back
		// parse your Java file into its visual environment.
		//{{INIT_CONTROLS
		setLayout(new BorderLayout(0,0));
		setVisible(false);
		setSize(insets().left + insets().right + 446,insets().top + insets().bottom + 236);
		list = new java.awt.List(0,false);
		list.addItem("RTCP Reception:");
		list.setBounds(insets().left + 0,insets().top + 0,446,236);
		list.setFont(new Font("Dialog", Font.PLAIN, 12));
		add("Center", list);
		setTitle("RTCP PacketMonitor");
		//}}

		//{{INIT_MENUS
		//}}

		//{{REGISTER_LISTENERS
		SymWindow aSymWindow = new SymWindow();
		this.addWindowListener(aSymWindow);
		//}}
	}

	public frRTCPMonitor(String title, Session s )
	{
		this(s);
		setTitle(title);
	}

	public synchronized void show()
	{
		move(50, 50);
		super.show();
	}

	public void addNotify()
	{
	    // Record the size of the window prior to calling parents addNotify.
	    Dimension d = getSize();
	    
		super.addNotify();

		if (fComponentsAdjusted)
			return;

		// Adjust components according to the insets
		setSize(insets().left + insets().right + d.width, insets().top + insets().bottom + d.height);
		Component components[] = getComponents();
		for (int i = 0; i < components.length; i++)
		{
			Point p = components[i].getLocation();
			p.translate(insets().left, insets().top);
			components[i].setLocation(p);
		}
		fComponentsAdjusted = true;
	}

    // Used for addNotify check.
	boolean fComponentsAdjusted = false;

	//{{DECLARE_CONTROLS
	java.awt.List list;
	//}}

	//{{DECLARE_MENUS
	//}}

	class SymWindow extends java.awt.event.WindowAdapter
	{
		public void windowClosing(java.awt.event.WindowEvent event)
		{
			Object object = event.getSource();
			if (object == frRTCPMonitor.this)
				Frame1_WindowClosing(event);
		}
	}
	
	void Frame1_WindowClosing(java.awt.event.WindowEvent event)
	{
		hide();		 // hide the Frame
	}
	
    public void handleRTCPEvent ( RTCPReceiverReportPacket RRpkt)
    {
        list.addItem (  "**** RTCP RR Packet: *****" );
        list.addItem (  "SSRC = " + Long.toHexString(RRpkt.SenderSSRC)  );
        list.addItem (  "ReportBlock = " + RRpkt.containsReportBlock  );
        list.addItem (  "FractionLost = " + RRpkt.ReportBlock.FractionLost   );     
        list.addItem (  "CumPktsLost = " + RRpkt.ReportBlock.CumulativeNumberOfPacketsLost  );   
        list.addItem (  "ExtHighSqRcvd = " +  RRpkt.ReportBlock.ExtendedHighestSequenceNumberReceived   );         			           
        list.addItem (  "IntJitter = " + RRpkt.ReportBlock.InterarrivalJitter    );
        list.addItem (  "LastSR = " + RRpkt.ReportBlock.LastSR  );
        list.addItem (  "Delay_LastSR = " +  RRpkt.ReportBlock.Delay_LastSR   );
        list.addItem (  "***************************" );
        ScrollListToBottom();
        
        
    }
    public void handleRTCPEvent ( RTCPSenderReportPacket SRpkt)
    {
        list.addItem (  "**** RTCP SR Packet: *****" );
        list.addItem (  "SSRC = " + Long.toHexString(SRpkt.SenderSSRC)  );
        list.addItem (  "SenderOctetCount:" + SRpkt.SenderInfo.SenderOctetCount  );
        list.addItem (  " SenderPacketCount:" +  SRpkt.SenderInfo.SenderPacketCount  );
        list.addItem (  "RTPTimeStamp" +  SRpkt.SenderInfo.RTPTimeStamp  );
        list.addItem (  "NTPTimeStampLeastSignificant" + SRpkt.SenderInfo.NTPTimeStampLeastSignificant  );
        list.addItem (   "NTPTimeStampMostSignificant" + SRpkt.SenderInfo.NTPTimeStampMostSignificant  );
        list.addItem (  "ReportBlock = " + SRpkt.containsReportBlock  );

        if ( SRpkt.containsReportBlock )
        {
            list.addItem ( "FractionLost = " + SRpkt.ReportBlock.FractionLost   );
            list.addItem ( "CumPktsLost = " + SRpkt.ReportBlock.CumulativeNumberOfPacketsLost  );   
            list.addItem ( "ExtHighSqRcvd = " +  SRpkt.ReportBlock.ExtendedHighestSequenceNumberReceived   );
            list.addItem ( "IntJitter = " + SRpkt.ReportBlock.InterarrivalJitter    );
            list.addItem ( "LastSR = " + SRpkt.ReportBlock.LastSR  );
            list.addItem ( "Delay_LastSR = " +  SRpkt.ReportBlock.Delay_LastSR   );
            list.addItem ( "***************************" );
        }
        ScrollListToBottom();

    }
    
    public void handleRTCPEvent ( RTCPSDESPacket sdespkt)
    {
        list.addItem (  "**** RTCP SDES: *****" );
        list.addItem (  "SDES Type: " + sdespkt.SDESItem.Type  );
        list.addItem (  "SDES Value: " + sdespkt.SDESItem.Value  );
        list.addItem (  "**********************" );
        ScrollListToBottom();
        

    }
    public void handleRTCPEvent ( RTCPBYEPacket byepkt)
    {
        list.addItem (  "**** RTCP BYE: *****" );
        list.addItem (  "BYE SSRC: " + byepkt.SSRC  );
        list.addItem (  "REason For Leaving " + byepkt.ReasonForLeaving  );
        list.addItem (  "*********************");
        
        ScrollListToBottom();
    }
    
    public void ScrollListToBottom() {
        list.select ( list.getItemCount() -1 );
    }
	
}
