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; } }