/* * Copyright (C) 2005 Luca Veltri - University of Parma - Italy * * This file is part of MjSip (http://www.mjsip.org) * * MjSip is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MjSip 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 MjSip; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author(s): * Luca Veltri (luca.veltri@unipr.it) */ package org.zoolu.sip.call; import org.zoolu.sip.call.*; import org.zoolu.sip.provider.SipStack; import org.zoolu.sip.address.NameAddress; import org.zoolu.sip.message.Message; import org.zoolu.tools.Log; import org.zoolu.tools.LogLevel; import org.zoolu.sdp.*; import com.sesca.misc.Logger; //import java.util.Iterator; import java.util.Enumeration; import java.util.Vector; /** Class CallListenerAdapter implements CallListener interface * providing a dummy implementation of all Call callback functions used to capture Call events. * <p> CallListenerAdapter can be extended to manage basic SIP calls. * The callback methods defined in this class have basically a void implementation. * This class exists as convenience for creating call listener objects. * <br> You can extend this class overriding only methods corresponding to events * you want to handle. * <p> <i>onCallIncoming(NameAddress,String)</i> is the only non-empty method. * It signals the receiver the ring status (by using method Call.ring()), * adapts the sdp body and accepts the call (by using method Call.accept(sdp)). */ public abstract class CallListenerAdapter implements ExtendedCallListener { // ************************** Costructors *************************** /** Creates a new dummy call listener */ protected CallListenerAdapter() { } // ************************* Static methods ************************* /** Changes the current session descriptor specifing the receiving RTP/UDP port number, the AVP format, the codec, and the clock rate */ /*public static String audioSession(int port, int avp, String codec, int rate) { SessionDescriptor sdp=new SessionDescriptor(); sdp.addMedia(new MediaField("audio ",port,0,"RTP/AVP",String.valueOf(avp)),new AttributeField("rtpmap",avp+" "+codec+"/"+rate)); return sdp.toString(); }*/ /** Changes the current session descriptor specifing the receiving RTP/UDP port number, the AVP format, the codec, and the clock rate */ /*public static String audioSession(int port) { return audioSession(port,0,"PCMU",8000); }*/ // *********************** Callback functions *********************** /** Accepts an incoming call. * Callback function called when arriving a new INVITE method (incoming call) */ public void onCallIncoming(Call call, NameAddress callee, NameAddress caller, String sdp, Message invite) { Logger.paranoia("CallListenerAdapter.onCallIncoming()"); call.ring(); String local_session; if (sdp!=null && sdp.length()>0) { SessionDescriptor remote_sdp=new SessionDescriptor(sdp); SessionDescriptor local_sdp=new SessionDescriptor(call.getLocalSessionDescriptor()); SessionDescriptor new_sdp=new SessionDescriptor(remote_sdp.getOrigin(),remote_sdp.getSessionName(),local_sdp.getConnection(),local_sdp.getTime()); new_sdp.addMediaDescriptors(local_sdp.getMediaDescriptors()); new_sdp=SdpTools.sdpMediaProduct(new_sdp,remote_sdp.getMediaDescriptors()); new_sdp=SdpTools.sdpAttirbuteSelection(new_sdp,"rtpmap"); local_session=new_sdp.toString(); } else local_session=call.getLocalSessionDescriptor(); // accept immediatly call.accept(local_session); } /** Changes the call when remotly requested. * Callback function called when arriving a new Re-INVITE method (re-inviting/call modify) */ public void onCallModifying(Call call, String sdp, Message invite) { Logger.paranoia("CallListenerAdapter.onCallModifying()"); String local_session; if (sdp!=null && sdp.length()>0) { SessionDescriptor remote_sdp=new SessionDescriptor(sdp); SessionDescriptor local_sdp=new SessionDescriptor(call.getLocalSessionDescriptor()); SessionDescriptor new_sdp=new SessionDescriptor(remote_sdp.getOrigin(),remote_sdp.getSessionName(),local_sdp.getConnection(),local_sdp.getTime()); new_sdp.addMediaDescriptors(local_sdp.getMediaDescriptors()); new_sdp=SdpTools.sdpMediaProduct(new_sdp,remote_sdp.getMediaDescriptors()); new_sdp=SdpTools.sdpAttirbuteSelection(new_sdp,"rtpmap"); local_session=new_sdp.toString(); } else local_session=call.getLocalSessionDescriptor(); // accept immediatly call.accept(local_session); } /** Does nothing. * Callback function called when arriving a 180 Ringing */ public void onCallRinging(Call call, Message resp) { //printLog("RINGING"); } /** Does nothing. * Callback function called when arriving a 2xx (call accepted) */ public void onCallAccepted(Call call, String sdp, Message resp) { //printLog("ACCEPTED/CALL"); } /** Does nothing. * Callback function called when arriving a 4xx (call failure) */ public void onCallRefused(Call call, String reason, Message resp) { //printLog("REFUSED ("+reason+")"); } /** Redirects the call when remotly requested. * Callback function called when arriving a 3xx (call redirection) */ public void onCallRedirection(Call call, String reason, Vector contact_list, Message resp) { //printLog("REDIRECTION ("+reason+")"); call.call((String)contact_list.elementAt(0)); } /** Does nothing. * Callback function called when arriving an ACK method (call confirmed) */ public void onCallConfirmed(Call call, String sdp, Message ack) { //printLog("CONFIRMED/CALL"); } /** Does nothing. * Callback function called when the invite expires */ public void onCallTimeout(Call call) { //printLog("TIMEOUT/CLOSE"); } /** Does nothing. * Callback function called when arriving a 2xx (re-invite/modify accepted) */ public void onCallReInviteAccepted(Call call, String sdp, Message resp) { //printLog("RE-INVITE-ACCEPTED/CALL"); } /** Does nothing. * Callback function called when arriving a 4xx (re-invite/modify failure) */ public void onCallReInviteRefused(Call call, String reason, Message resp) { //printLog("RE-INVITE-REFUSED ("+reason+")/CALL"); } /** Does nothing. * Callback function called when a re-invite expires */ public void onCallReInviteTimeout(Call call) { //printLog("RE-INVITE-TIMEOUT/CALL"); } /** Does nothing. * Callback function called when arriving a CANCEL request */ public void onCallCanceling(Call call, Message cancel) { //printLog("CANCELING"); } /** Does nothing. * Callback function that may be overloaded (extended). Called when arriving a BYE request */ public void onCallClosing(Call call, Message bye) { //printLog("CLOSING"); } /** Does nothing. * Callback function that may be overloaded (extended). Called when arriving a response for a BYE request (call closed) */ public void onCallClosed(Call call, Message resp) { //printLog("CLOSED"); } /** Does nothing. * Callback function called when arriving a new REFER method (transfer request) */ public void onCallTransfer(ExtendedCall call, NameAddress refer_to, NameAddress refered_by, Message refer) { //printLog("REFER-TO/TRANSFER"); } /** Does nothing. * Callback function called when a call transfer is accepted. */ public void onCallTransferAccepted(ExtendedCall call, Message resp) { } /** Does nothing. * Callback function called when a call transfer is refused. */ public void onCallTransferRefused(ExtendedCall call, String reason, Message resp) { } /** Does nothing. * Callback function called when a call transfer is successfully completed */ public void onCallTransferSuccess(ExtendedCall call, Message notify) { //printLog("TRANSFER SUCCESS"); } /** Does nothing. * Callback function called when a call transfer is NOT sucessfully completed */ public void onCallTransferFailure(ExtendedCall call, String reason, Message notify) { //printLog("TRANSFER FAILURE"); } }