Package org.red5.app.sip

Source Code of org.red5.app.sip.SipUser

package org.red5.app.sip;

import org.zoolu.sip.provider.*;
import org.zoolu.net.SocketAddress;
import org.slf4j.Logger;
import org.red5.logging.Red5LoggerFactory;
import org.red5.server.api.scope.IScope;
import org.red5.server.api.stream.IBroadcastStream;
import org.red5.app.sip.registration.SipRegisterAgent;

public class SipUser {
    private static Logger log = Red5LoggerFactory.getLogger(SipUser.class, "sip");

    private ConnectionClientMethodInvoker rtmpConnection;
    private String userid;
    private SipUserAgentProfile userProfile;
    private SipProvider sipProvider;
    private String optOutboundProxy = null;
    private SipUserAgent userAgent;
    private SipRegisterAgent registerAgent;
    private String proxy;

    public SipUser(String userid, ConnectionClientMethodInvoker connection, int sipPort, int rtpPort) {
        log.debug( "SIPUser Constructor: sip port " + sipPort + " rtp port:" + rtpPort );
        this.userid = userid;
        this.rtmpConnection = connection;
       
        initializeSipProvider(sipPort);
        initializeUserProfile(rtpPort);       
    }

    public void login(String obproxy, String phone, String username, String password,
        String realm, String proxy) {
      log.debug( "SIPUser login" );
        this.proxy = proxy;
    this.optOutboundProxy = obproxy;

    sipProvider.setOutboundProxy(new SocketAddress(optOutboundProxy));       
    setupUserProfile(username, password, realm, phone);
        initializeUserAgent();                             
    }
   
    private void initializeUserAgent() {
      userAgent = new SipUserAgent(sipProvider, userProfile, rtmpConnection);
      userAgent.addListener(rtmpConnection);
        userAgent.initialize();
    }
       
    private void initializeSipProvider(int sipPort) {
        sipProvider = new SipProvider(null, sipPort);       
        sipProvider.addSipProviderListener(new OptionMethodListener());     
    }
   
    private void setupUserProfile(String username, String password, String realm, String phone) {
      String fromURL = "\"" + username + "\" <sip:" + phone + "@" + proxy + ">";
      userProfile.username = username;
        userProfile.passwd = password;
        userProfile.realm = realm;
        userProfile.fromUrl = fromURL;
    userProfile.contactUrl = "sip:" + phone + "@" + sipProvider.getViaAddress();
    }
   
    private void initializeUserProfile(int rtpPort) {           
      userProfile = new SipUserAgentProfile();
        userProfile.audioPort = rtpPort;
       
        if ( sipProvider.getPort() != SipStack.default_port ) {
            userProfile.contactUrl += ":" + sipProvider.getPort();
        }

        userProfile.keepaliveTime=8000;
    userProfile.acceptTime=0;
    userProfile.hangupTime=20;     
   
    }
   
    public void register() {
      log.debug( "SIPUser register" );
        if (sipProvider != null) {
          registerAgent = new SipRegisterAgent(sipProvider, userProfile.fromUrl, userProfile.contactUrl,
              userProfile.username, userProfile.realm, userProfile.passwd);
          registerAgent.addListener(rtmpConnection);
          registerAgent.register(userProfile.expires, userProfile.expires/2, userProfile.keepaliveTime);
        }
    }

    public void dtmf(String digits) {
      log.debug("SIPUser dtmf " + digits);
        if (userAgent != null) {
          userAgent.queueSipDtmfDigits( digits );
        }
    }

    public void call(String destination) {
        log.debug( "SIPUser Calling " + destination );

        if (userAgent != null)
          userAgent.hangup();

        if (destination.indexOf("@") == -1) {
          destination = destination + "@" + proxy;
        }

        if (destination.indexOf("sip:") > -1) {
          destination = destination.substring(4);
        }

        if (userAgent != null)
          userAgent.call(destination);
    }

  /** Add by Lior call transfer test */
  public void transfer(String transferTo) {
     log.debug("Transfer To: " + transferTo);

     if (transferTo.indexOf("@") == -1) {
       transferTo = transferTo + "@" + proxy ;
     }

     userAgent.transfer(transferTo);
  }
  /** end of transfer code */

  public void close() {
    log.debug("SIPUser close1");
        try {
      hangup();
      unregister();
        new Thread().sleep(3000);
    } catch(Exception e) {
      log.error("close: Exception:>\n" + e);
    }

       log.debug("Stopping SipProvider");
       sipProvider.halt();
  }

    public void accept() {
      log.debug( "SIPUser accept" );

        if (userAgent != null) {
            userAgent.accept();
        }
    }

    public void hangup() {
      log.debug( "SIPUser hangup" );

        if (userAgent != null) {
           userAgent.hangup();
        }

    }

    public void unregister() {
      log.debug( "SIPUser unregister" );

        if (registerAgent != null) {
            registerAgent.unregister();
            registerAgent = null;
        }

        if (userAgent != null) {
            userAgent.hangup();
        }
        userAgent = null;
    }

    public void startTalkStream(IBroadcastStream broadcastStream, IScope scope) {
      if (userAgent != null)
        userAgent.startTalkStream(broadcastStream, scope);
    }
   
    public void stopTalkStream(IBroadcastStream broadcastStream, IScope scope) {
      if (userAgent != null)
        userAgent.stopTalkStream(broadcastStream, scope);
    }
   
    public String getSessionID() {
        return userid;
    }
}
TOP

Related Classes of org.red5.app.sip.SipUser

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.