diff options
author | Damian Minkov <damencho@jitsi.org> | 2011-02-17 16:19:52 +0000 |
---|---|---|
committer | Damian Minkov <damencho@jitsi.org> | 2011-02-17 16:19:52 +0000 |
commit | 9ed22ae8263529ef19f5c393a5710eee0b2171c9 (patch) | |
tree | da64e6bc7de91102b51b08fac6afdb2892a84da8 | |
parent | 479b6d0f8a74d382d27b9bdee7e778d543794975 (diff) | |
download | jitsi-9ed22ae8263529ef19f5c393a5710eee0b2171c9.zip jitsi-9ed22ae8263529ef19f5c393a5710eee0b2171c9.tar.gz jitsi-9ed22ae8263529ef19f5c393a5710eee0b2171c9.tar.bz2 |
Tries to detect is the incoming call audio or video one.
3 files changed, 96 insertions, 3 deletions
diff --git a/src/net/java/sip/communicator/impl/protocol/sip/CallSipImpl.java b/src/net/java/sip/communicator/impl/protocol/sip/CallSipImpl.java index e97d925..2c76bcd 100644 --- a/src/net/java/sip/communicator/impl/protocol/sip/CallSipImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/sip/CallSipImpl.java @@ -8,10 +8,13 @@ package net.java.sip.communicator.impl.protocol.sip; import java.util.*; +import javax.sdp.*; import javax.sip.*; import javax.sip.address.*; import javax.sip.message.*; +import net.java.sip.communicator.impl.protocol.sip.sdp.*; +import net.java.sip.communicator.service.neomedia.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; import net.java.sip.communicator.service.protocol.media.*; @@ -231,16 +234,61 @@ public class CallSipImpl // new and we also need to notify everyone of its creation. if(this.getCallPeerCount() == 1) { + ArrayList<MediaType> mediaTypes = null; + + //this check is not mandatory catch all to skip if a problem exists + try + { + // lets check the supported media types. + // for this call + Request inviteReq = containingTransaction.getRequest(); + + if(inviteReq != null && inviteReq.getRawContent() != null) + { + mediaTypes = new ArrayList<MediaType>(); + + String sdpStr = SdpUtils.getContentAsString(inviteReq); + + SessionDescription sesDescr = SdpUtils.parseSdpString(sdpStr); + + List<MediaDescription> remoteDescriptions = SdpUtils + .extractMediaDescriptions(sesDescr); + for (MediaDescription mediaDescription : remoteDescriptions) + { + MediaType mediaType = + SdpUtils.getMediaType(mediaDescription); + + if(mediaType.equals(MediaType.VIDEO)) + { + MediaDirection videoDirection = + SdpUtils.getDirection(mediaDescription); + + if(videoDirection.allowsSending()) + { + mediaTypes.add(mediaType); + continue; + } + } + else + mediaTypes.add(mediaType); + } + } + } + catch(Throwable t) + { + logger.warn("Error getting media types", t); + } + getParentOperationSet().fireCallEvent( (incomingCall ? CallEvent.CALL_RECEIVED : CallEvent.CALL_INITIATED), - this); + this, + mediaTypes); } return callPeer; } - /** * Processes an incoming INVITE that is meant to replace an existing * <tt>CallPeerSipImpl</tt> that is participating in this call. Typically diff --git a/src/net/java/sip/communicator/service/protocol/event/CallEvent.java b/src/net/java/sip/communicator/service/protocol/event/CallEvent.java index 83ca589..6653971 100644 --- a/src/net/java/sip/communicator/service/protocol/event/CallEvent.java +++ b/src/net/java/sip/communicator/service/protocol/event/CallEvent.java @@ -8,6 +8,7 @@ package net.java.sip.communicator.service.protocol.event; import java.util.*; +import net.java.sip.communicator.service.neomedia.*; import net.java.sip.communicator.service.protocol.*; /** @@ -50,6 +51,12 @@ public class CallEvent private final int eventID; /** + * The media types supported by this call, if information is + * available. + */ + private List<MediaType> mediaTypes = new ArrayList<MediaType>(); + + /** * Creates an event instance indicating that an incoming/outgoing call * has been created * @@ -91,9 +98,27 @@ public class CallEvent */ public String toString() { - return "CallEvent:[ id=" + getEventID() + " Call=" + getSourceCall() + "]"; } + /** + * Return the media types supported by this call, if information is + * available. It can be empty list if information wasn't provided for this + * event and call. + * @return the supported media types of current call. + */ + public List<MediaType> getMediaTypes() + { + return mediaTypes; + } + + /** + * Update media types for the event. + * @param mediaTypes the new media types. + */ + public void setMediaTypes(List<MediaType> mediaTypes) + { + this.mediaTypes = mediaTypes; + } } diff --git a/src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetBasicTelephony.java b/src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetBasicTelephony.java index aef6da4..76d013e 100644 --- a/src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetBasicTelephony.java +++ b/src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetBasicTelephony.java @@ -68,7 +68,27 @@ public abstract class AbstractOperationSetBasicTelephony */ public void fireCallEvent(int eventID, Call sourceCall) { + this.fireCallEvent(eventID, sourceCall, null); + } + + /** + * Creates and dispatches a <tt>CallEvent</tt> notifying registered + * listeners that an event with id <tt>eventID</tt> has occurred on + * <tt>sourceCall</tt>. + * + * @param eventID the ID of the event to dispatch + * @param sourceCall the call on which the event has occurred. + */ + public void fireCallEvent(int eventID, Call sourceCall, + List<MediaType> mediaTypes) + { CallEvent cEvent = new CallEvent(sourceCall, eventID); + + if(mediaTypes != null) + { + cEvent.setMediaTypes(mediaTypes); + } + List<CallListener> listeners; synchronized (callListeners) |