/* * Copyright 2007 Sun Microsystems, Inc. * * This file is part of jVoiceBridge. * * jVoiceBridge is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation and distributed hereunder * to you. * * jVoiceBridge is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Sun designates this particular file as subject to the "Classpath" * exception as provided by Sun in the License file that accompanied this * code. */ package com.sun.voip.server; import com.sun.voip.CallParticipant; import com.sun.voip.CallState; import com.sun.voip.Logger; import com.sun.voip.MediaInfo; import com.sun.voip.RtpPacket; import com.sun.voip.SdpInfo; import java.text.ParseException; import java.net.InetSocketAddress; /** * Non-Signaling handles calls setup by an external source. */ public class NSIncomingCallAgent extends CallSetupAgent { private SipUtil sipUtil; public NSIncomingCallAgent(CallHandler callHandler) { super(callHandler); MediaInfo mixerMediaPreference = callHandler.getConferenceManager().getMediaInfo(); sipUtil = new SipUtil(mixerMediaPreference); } public void initiateCall() { setState(CallState.INVITED); CallParticipant cp = callHandler.getCallParticipant(); String remoteMediaInfo = cp.getRemoteMediaInfo(); if (Logger.logLevel >= Logger.LOG_MOREINFO) { Logger.println("Call " + cp + ": NSIncomingCallAgent remoteMediaInfo " + remoteMediaInfo); } String[] tokens = remoteMediaInfo.split("\\+"); /* * The remote media info is the SDP info but instead of * new line as the separator, it has "+". * Reformat the SDP with \r\n. */ String sdp = ""; for (int i = 0; i < tokens.length; i++) { sdp += tokens[i] + "\r\n"; } if (Logger.logLevel >= Logger.LOG_MOREINFO) { Logger.println("Call " + cp + ": NSIncomingCallAgent Sdp\n" + sdp); } SdpInfo sdpInfo = null; try { sdpInfo = sipUtil.getSdpInfo(sdp, true); String remoteHost = sdpInfo.getRemoteHost(); int remotePort = sdpInfo.getRemotePort(); Logger.println("Call " + cp + ": NSIncomingCallAgent: remote socket " + remoteHost + " " + remotePort + " mediaInfo " + sdpInfo.getMediaInfo()); InetSocketAddress isa = new InetSocketAddress(remoteHost, remotePort); setEndpointAddress(isa, sdpInfo.getMediaInfo().getPayload(), sdpInfo.getTransmitMediaInfo().getPayload(), sdpInfo.getTelephoneEventPayload()); } catch (ParseException e) { Logger.println("Call " + cp + ": NSIncomingCallAgent couldn't parse sdp"); cancelRequest("NSIncomingCallAgent couldn't parse sdp"); return; } setState(CallState.ANSWERED); setState(CallState.ESTABLISHED); } }