aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamian Minkov <damencho@jitsi.org>2011-02-17 16:19:52 +0000
committerDamian Minkov <damencho@jitsi.org>2011-02-17 16:19:52 +0000
commit9ed22ae8263529ef19f5c393a5710eee0b2171c9 (patch)
treeda64e6bc7de91102b51b08fac6afdb2892a84da8
parent479b6d0f8a74d382d27b9bdee7e778d543794975 (diff)
downloadjitsi-9ed22ae8263529ef19f5c393a5710eee0b2171c9.zip
jitsi-9ed22ae8263529ef19f5c393a5710eee0b2171c9.tar.gz
jitsi-9ed22ae8263529ef19f5c393a5710eee0b2171c9.tar.bz2
Tries to detect is the incoming call audio or video one.
-rw-r--r--src/net/java/sip/communicator/impl/protocol/sip/CallSipImpl.java52
-rw-r--r--src/net/java/sip/communicator/service/protocol/event/CallEvent.java27
-rw-r--r--src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetBasicTelephony.java20
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)