import java.net.*;
import java.awt.event.*;
import java.awt.TextField;
import java.io.*;

public class RTPSender implements KeyListener {
   int           SSRC;
   static short  sendSeq;
   InetAddress   group;
   String        myName;
   int           port;
   final int     msgMaxLen = 256;
   final int     RTPHdrLen = 12;
   private ByteArrayOutputStream baos;
   private SessionInfo snInfo;
   private DataOutputStream dos;
   private MulticastSocket rtpSendSock;   
   private byte [] buf; 
   private static final boolean Debug=true;
   
   
   public RTPSender(int ssrc, short seq, InetAddress a, 
         int p, SessionInfo si, String nm){
      SSRC=ssrc;
      sendSeq = seq;
      group = a;
      port = p;
      snInfo = si;
      myName = nm+": ";
      try{
         rtpSendSock = new MulticastSocket(port);
         baos = new ByteArrayOutputStream(msgMaxLen + RTPHdrLen);
         dos = new DataOutputStream(baos);
      }catch(IOException e){
         System.out.println("RTPSender: create-->"+e);
         System.exit(-1);
      }
   }
   
   private void writeHeader(){
      try{
         dos.writeByte(0x80);       // V=2, P=0, X=0, CC=0
         dos.writeByte(0x50);       // M=0, PT = 80(decimal)
         dos.writeShort(sendSeq);   // sequence number
         if (Debug) 
            System.out.println("RTPSender.writeHeader: sendSeq-->"+sendSeq);
         if (sendSeq == Short.MAX_VALUE) sendSeq = 0;
         else sendSeq++;
         dos.writeInt(0);           // timestamp
         dos.writeInt(SSRC);        // SSRC
      }catch(IOException e){
         System.out.println("writeHeader: write error-->"+e);
      }
   }

   public void keyPressed(KeyEvent e){
      String msg;
      int   i, length;
      TextField tf;
      
      if (e.getKeyCode() == KeyEvent.VK_ENTER){  // user typed cr/lf
         tf = (TextField)e.getSource();
         msg = myName+tf.getText();
         if (tf.getText().length() == 0)  return;// ignore empty lines
         if (Debug){
            System.out.println("RTPSender.KeyPressed: msg-->"+msg+
                  ", length-->"+msg.length());
         }
         writeHeader();
         try{
            dos.writeBytes(msg);
            i = msg.length() % 4;
            if (Debug){
               System.out.println("RTPSender.KeyPressed:msg len-->"
                  +msg.length()+", i-->"+i);
            } 
            if (i!=0){        
            // pad to 32 bit boundary
               do{
                  dos.writeByte(0x00);
                  i++;
               }while(i<4);
            }
            buf = baos.toByteArray();
            baos.reset();     // clean buffer for next message
            length = RTPHdrLen + ((msg.length()+3)/4)*4;
            if (Debug){
               System.out.println("RTPSender.keyPressed: packet len-->"
                  +length+", buf len-->"+buf.length);
            }
            DatagramPacket packet = new DatagramPacket(buf, length,
                                group, port);
            rtpSendSock.send(packet);
            snInfo.updatePacketSize(packet.getLength() + 28);
            snInfo.setWe_sent(true);
         }catch(Exception ie){
            System.out.println("keyPressed: I/O error-->"+ie);
         }
         tf.setText("");
      }
      
   }
   
   public void keyTyped(KeyEvent e){}
   public void keyReleased(KeyEvent e){}
   
}   
