aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris Grozev <boris@jitsi.org>2013-08-12 18:14:18 +0300
committerBoris Grozev <boris@jitsi.org>2013-08-16 11:06:52 +0300
commit71b19959c5849bd46fe0cb734353c6af187ce435 (patch)
tree0bd0fd91a0cda9b2d6bbf8ad59bbc14a9cbafecb
parent99c02f91176efa30764a76653d43f7345c76934f (diff)
downloadjitsi-71b19959c5849bd46fe0cb734353c6af187ce435.zip
jitsi-71b19959c5849bd46fe0cb734353c6af187ce435.tar.gz
jitsi-71b19959c5849bd46fe0cb734353c6af187ce435.tar.bz2
Moves the 'senders' field from CallPeerMediaHandlerJabberImpl to
CallPeerJabberImpl. Minor fixes to comments, logging and sending error IQs.
-rw-r--r--src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java164
-rw-r--r--src/net/java/sip/communicator/impl/protocol/jabber/CallPeerMediaHandlerJabberImpl.java63
-rw-r--r--src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ContentPacketExtension.java2
-rw-r--r--src/net/java/sip/communicator/impl/protocol/jabber/jinglesdp/JingleUtils.java25
4 files changed, 146 insertions, 108 deletions
diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java
index 72c7900..4c43f31 100644
--- a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java
@@ -73,6 +73,22 @@ public class CallPeerJabberImpl
private final Object sidSyncRoot = new Object();
/**
+ * The current value of the 'senders' field of the audio content in the
+ * Jingle session with this <tt>CallPeer</tt>.
+ * <tt>null</tt> should be interpreted as 'both', which is the default in
+ * Jingle if the XML attribute is missing.
+ */
+ private SendersEnum audioSenders = SendersEnum.none;
+
+ /**
+ * The current value of the 'senders' field of the video content in the
+ * Jingle session with this <tt>CallPeer</tt>.
+ * <tt>null</tt> should be interpreted as 'both', which is the default in
+ * Jingle if the XML attribute is missing.
+ */
+ private SendersEnum videoSenders = SendersEnum.none;
+
+ /**
* Creates a new call peer with address <tt>peerAddress</tt>.
*
* @param peerAddress the Jabber address of the new call peer.
@@ -91,7 +107,9 @@ public class CallPeerJabberImpl
*
* @param peerAddress the Jabber address of the new call peer.
* @param owningCall the call that contains this call peer.
- * @param sessionIQ Session initiate IQ
+ * @param sessionIQ The session-initiate <tt>JingleIQ</tt> which was
+ * received from <tt>peerAddress</tt> and caused the creation of this
+ * <tt>CallPeerJabberImpl</tt>
*/
public CallPeerJabberImpl(String peerAddress,
CallJabberImpl owningCall,
@@ -102,12 +120,7 @@ public class CallPeerJabberImpl
}
/**
- * Indicates a user request to answer an incoming call from this
- * <tt>CallPeer</tt>.
- *
- * Sends an OK response to <tt>callPeer</tt>. Make sure that the call
- * peer contains an SDP description when you call this method.
- *
+ * Send a session-accept <tt>JingleIQ</tt> to this <tt>CallPeer</tt>
* @throws OperationFailedException if we fail to create or send the
* response.
*/
@@ -115,14 +128,15 @@ public class CallPeerJabberImpl
throws OperationFailedException
{
Iterable<ContentPacketExtension> answer;
+ CallPeerMediaHandlerJabberImpl mediaHandler = getMediaHandler();
try
{
- CallPeerMediaHandlerJabberImpl mediaHandler = getMediaHandler();
-
mediaHandler
.getTransportManager().wrapupConnectivityEstablishment();
answer = mediaHandler.generateSessionAccept();
+ for (ContentPacketExtension c : answer)
+ setSenders(JingleUtils.getMediaType(c), c.getSenders());
}
catch(Exception exc)
{
@@ -150,13 +164,13 @@ public class CallPeerJabberImpl
getSID(),
answer);
- //send the packet first and start the stream later in case the media
+ //send the packet first and start the stream later in case the media
//relay needs to see it before letting hole punching techniques through.
getProtocolProvider().getConnection().sendPacket(response);
try
{
- getMediaHandler().start();
+ mediaHandler.start();
}
catch(UndeclaredThrowableException e)
{
@@ -179,7 +193,7 @@ public class CallPeerJabberImpl
return;
}
- //tell everyone we are connecting so that the audio notifications would
+ //tell everyone we are connected so that the audio notifications would
//stop
setState(CallPeerState.CONNECTED);
}
@@ -224,9 +238,11 @@ public class CallPeerJabberImpl
String reasonText,
PacketExtension reasonOtherExtension)
{
+ CallPeerState prevPeerState = getState();
+
// do nothing if the call is already ended
- if (CallPeerState.DISCONNECTED.equals(getState())
- || CallPeerState.FAILED.equals(getState()))
+ if (CallPeerState.DISCONNECTED.equals(prevPeerState)
+ || CallPeerState.FAILED.equals(prevPeerState))
{
if (logger.isDebugEnabled())
logger.debug("Ignoring a request to hangup a call peer "
@@ -234,8 +250,6 @@ public class CallPeerJabberImpl
return;
}
- CallPeerState prevPeerState = getState();
-
setState(
failed ? CallPeerState.FAILED : CallPeerState.DISCONNECTED,
reasonText);
@@ -391,14 +405,15 @@ public class CallPeerJabberImpl
public void processContentAccept(JingleIQ content)
{
List<ContentPacketExtension> contents = content.getContentList();
+ CallPeerMediaHandlerJabberImpl mediaHandler = getMediaHandler();
try
{
- CallPeerMediaHandlerJabberImpl mediaHandler = getMediaHandler();
-
mediaHandler
.getTransportManager().wrapupConnectivityEstablishment();
mediaHandler.processAnswer(contents);
+ for (ContentPacketExtension c : contents)
+ setSenders(JingleUtils.getMediaType(c), c.getSenders());
}
catch (Exception e)
{
@@ -408,8 +423,8 @@ public class CallPeerJabberImpl
String reason = "Error: " + e.getMessage();
JingleIQ errResp
= JinglePacketFactory.createSessionTerminate(
- sessionInitIQ.getTo(),
- sessionInitIQ.getFrom(),
+ getProtocolProvider().getOurJID(),
+ peerJID,
sessionInitIQ.getSID(),
Reason.INCOMPATIBLE_PARAMETERS,
reason);
@@ -419,7 +434,7 @@ public class CallPeerJabberImpl
return;
}
- getMediaHandler().start();
+ mediaHandler.start();
}
/**
@@ -521,8 +536,7 @@ public class CallPeerJabberImpl
getSID(),
answerContents);
for (ContentPacketExtension c : answerContents)
- mediaHandler.setSenders(MediaType.parseString(c.getName()),
- c.getSenders());
+ setSenders(JingleUtils.getMediaType(c), c.getSenders());
}
getProtocolProvider().getConnection().sendPacket(contentIQ);
@@ -570,6 +584,8 @@ public class CallPeerJabberImpl
!= null);
getMediaHandler().reinitContent(ext.getName(), ext, modify);
+ setSenders(JingleUtils.getMediaType(ext), ext.getSenders());
+
if (MediaType.VIDEO.toString().equals(ext.getName()))
getCall().modifyVideoContent();
}
@@ -581,8 +597,8 @@ public class CallPeerJabberImpl
String reason = "Error: " + e.getMessage();
JingleIQ errResp
= JinglePacketFactory.createSessionTerminate(
- sessionInitIQ.getTo(),
- sessionInitIQ.getFrom(),
+ getProtocolProvider().getOurJID(),
+ peerJID,
sessionInitIQ.getSID(),
Reason.INCOMPATIBLE_PARAMETERS,
reason);
@@ -623,14 +639,23 @@ public class CallPeerJabberImpl
public void processContentRemove(JingleIQ content)
{
List<ContentPacketExtension> contents = content.getContentList();
+ boolean videoContentRemoved = false;
if (!contents.isEmpty())
{
CallPeerMediaHandlerJabberImpl mediaHandler = getMediaHandler();
for(ContentPacketExtension c : contents)
+ {
mediaHandler.removeContent(c.getName());
+ MediaType mediaType = JingleUtils.getMediaType(c);
+ setSenders(mediaType, SendersEnum.none);
+
+ if (MediaType.VIDEO.equals(mediaType))
+ videoContentRemoved = true;
+ }
+
/*
* TODO XEP-0166: Jingle says: If the content-remove results in zero
* content definitions for the session, the entity that receives the
@@ -639,13 +664,19 @@ public class CallPeerJabberImpl
* void).
*/
}
- try
- {
- getCall().modifyVideoContent();
- }
- catch (Exception e)
+
+ if (videoContentRemoved)
{
- logger.warn("Failed to update Jingle sessions");
+ // removing of the video content might affect the other sessions
+ // in the call
+ try
+ {
+ getCall().modifyVideoContent();
+ }
+ catch (Exception e)
+ {
+ logger.warn("Failed to update Jingle sessions");
+ }
}
}
@@ -666,6 +697,8 @@ public class CallPeerJabberImpl
mediaHandler
.getTransportManager().wrapupConnectivityEstablishment();
mediaHandler.processAnswer(answer);
+ for (ContentPacketExtension c : answer)
+ setSenders(JingleUtils.getMediaType(c), c.getSenders());
}
catch(Exception exc)
{
@@ -954,8 +987,8 @@ public class CallPeerJabberImpl
String reasonText = "Error: " + ofe.getMessage();
JingleIQ errResp
= JinglePacketFactory.createSessionTerminate(
- sessionInitIQ.getTo(),
- sessionInitIQ.getFrom(),
+ getProtocolProvider().getOurJID(),
+ peerJID,
sessionInitIQ.getSID(),
Reason.GENERAL_ERROR,
reasonText);
@@ -1085,7 +1118,7 @@ public class CallPeerJabberImpl
// If we are receiving media from this CallPeer, the direction should
// allow receiving
- SendersEnum senders = mediaHandler.getSenders(mediaType);
+ SendersEnum senders = getSenders(mediaType);
if (senders == null || senders == SendersEnum.both ||
(isInitiator() && senders == SendersEnum.initiator) ||
(!isInitiator() && senders == SendersEnum.responder))
@@ -1099,7 +1132,7 @@ public class CallPeerJabberImpl
{
if (peer != this)
{
- senders = peer.getMediaHandler().getSenders(mediaType);
+ senders = peer.getSenders(mediaType);
if (senders == null || senders == SendersEnum.both ||
(peer.isInitiator()
&& senders == SendersEnum.initiator) ||
@@ -1117,14 +1150,15 @@ public class CallPeerJabberImpl
}
/**
- * Send a <tt>content</tt> message to reflect change in video setup (start
- * or stop). Message can be content-modify if video content exists,
- * content-add if we start video, but video is not enabled for the
- * <tt>CallPeer</tt>, or content-remove if we stop video and video is
- * enabled for the <tt>CallPeer</tt>.
+ * Send, if necessary, a jingle <tt>content</tt> message to reflect change
+ * in video setup. Whether the jingle session should have a video content,
+ * and if so, the value of the <tt>senders</tt> field is determined
+ * based on whether we are streaming local video and, if we are the focus
+ * of a conference, on the other peers in the conference.
+ * The message can be content-modify if video content exists (and the
+ * <tt>senders</tt> field changes), content-add or content-remove.
*
- * @return <tt>true</tt> if a modification was done (a Jingle message was
- * sent).
+ * @return <tt>true</tt> if a jingle <tt>content</tt> message was sent.
*/
public boolean sendModifyVideoContent()
{
@@ -1162,7 +1196,7 @@ public class CallPeerJabberImpl
}
}
- SendersEnum senders = mediaHandler.getSenders(MediaType.VIDEO);
+ SendersEnum senders = getSenders(MediaType.VIDEO);
if (senders == null)
senders = SendersEnum.both;
@@ -1213,7 +1247,7 @@ public class CallPeerJabberImpl
logger.warn("Exception occurred during media reinitialization", e);
}
- return true;
+ return (newSenders != senders);
}
/**
@@ -1299,7 +1333,7 @@ public class CallPeerJabberImpl
protocolProvider.getConnection().sendPacket(contentIQ);
mediaHandler.removeContent(remoteContentName);
- mediaHandler.setSenders(MediaType.VIDEO, SendersEnum.none);
+ setSenders(MediaType.VIDEO, SendersEnum.none);
}
/**
@@ -1493,7 +1527,7 @@ public class CallPeerJabberImpl
@Override
public MediaDirection getDirection(MediaType mediaType)
{
- SendersEnum senders = getMediaHandler().getSenders(mediaType);
+ SendersEnum senders = getSenders(mediaType);
if (senders == SendersEnum.none)
return MediaDirection.INACTIVE;
else if (senders == null || senders == SendersEnum.both)
@@ -1507,4 +1541,42 @@ public class CallPeerJabberImpl
? MediaDirection.SENDONLY
: MediaDirection.RECVONLY;
}
+
+ /**
+ * Get the current value of the <tt>senders</tt> field of the content with
+ * name <tt>mediaType</tt> in the Jingle session with this <tt>CallPeer</tt>
+ * @param mediaType the <tt>MediaType</tt> for which to get the current
+ * value of the <tt>senders</tt> field.
+ * @return the current value of the <tt>senders</tt> field of the content
+ * with name <tt>mediaType</tt> in the Jingle session with this
+ * <tt>CallPeer</tt>.
+ */
+ public SendersEnum getSenders(MediaType mediaType)
+ {
+ if (MediaType.AUDIO.equals(mediaType))
+ return audioSenders;
+ else if (MediaType.VIDEO.equals(mediaType))
+ return videoSenders;
+ else
+ throw new IllegalArgumentException("mediaType");
+ }
+
+ /**
+ * Set the current value of the <tt>senders</tt> field of the content with
+ * name <tt>mediaType</tt> in the Jingle session with this <tt>CallPeer</tt>
+ * @param mediaType the <tt>MediaType</tt> for which to get the current
+ * value of the <tt>senders</tt> field.
+ * @param senders the value to set
+ */
+ public void setSenders(MediaType mediaType, SendersEnum senders)
+ {
+ if (mediaType == null)
+ return;
+ else if (MediaType.AUDIO.equals(mediaType))
+ this.audioSenders = senders;
+ else if (MediaType.VIDEO.equals(mediaType))
+ this.videoSenders = senders;
+ else
+ throw new IllegalArgumentException("mediaType");
+ }
}
diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerMediaHandlerJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerMediaHandlerJabberImpl.java
index 6d50bf5..28a7254 100644
--- a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerMediaHandlerJabberImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerMediaHandlerJabberImpl.java
@@ -118,24 +118,6 @@ public class CallPeerMediaHandlerJabberImpl
private final Object transportManagerSyncRoot = new Object();
/**
- * The current value of the 'senders' field of the audio content in the
- * Jingle session with the <tt>CallPeer</tt> associated with this
- * <tt>CallPeerMediaHandlerJabberImpl</tt>.
- * <tt>null</tt> should be interpreted as 'both', which is the default in
- * Jingle if the XML attribute is missing.
- */
- private SendersEnum audioSenders = SendersEnum.none;
-
- /**
- * The current value of the 'senders' field of the video content in the
- * Jingle session with the <tt>CallPeer</tt> associated with this
- * <tt>CallPeerMediaHandlerJabberImpl</tt>.
- * <tt>null</tt> should be interpreted as 'both', which is the default in
- * Jingle if the XML attribute is missing.
- */
- private SendersEnum videoSenders = SendersEnum.none;
-
- /**
* Creates a new handler that will be managing media streams for
* <tt>peer</tt>.
*
@@ -1224,8 +1206,6 @@ public class CallPeerMediaHandlerJabberImpl
for (ContentPacketExtension content : answer)
{
remoteContentMap.put(content.getName(), content);
- setSenders(MediaType.parseString(content.getName()),
- content.getSenders());
boolean masterStream = false;
// if we have more than one stream, lets the audio be the master
@@ -1440,7 +1420,7 @@ public class CallPeerMediaHandlerJabberImpl
for (CallPeerJabberImpl peer : call.getCallPeerList())
{
SendersEnum senders
- = peer.getMediaHandler().getSenders(mediaType);
+ = peer.getSenders(mediaType);
boolean initiator = peer.isInitiator();
//check if the direction of the jingle session we have with
//this peer allows us receiving media. If senders is null,
@@ -1682,7 +1662,6 @@ public class CallPeerMediaHandlerJabberImpl
answer.add(ourContent);
localContentMap.put(content.getName(), ourContent);
- setSenders(mediaType, senders);
atLeastOneValidDescription = true;
}
@@ -1824,7 +1803,6 @@ public class CallPeerMediaHandlerJabberImpl
if(ext != null)
{
- setSenders(MediaType.parseString(name), content.getSenders());
if(modify)
{
processContent(content, modify, false);
@@ -1874,7 +1852,6 @@ public class CallPeerMediaHandlerJabberImpl
*/
public void removeContent(String name)
{
- setSenders(MediaType.parseString(name), SendersEnum.none);
removeContent(localContentMap, name);
removeContent(remoteContentMap, name);
getTransportManager().removeContent(name);
@@ -2097,44 +2074,7 @@ public class CallPeerMediaHandlerJabberImpl
}
}
- /**
- * Get the current value of the <tt>senders</tt> field of the content with
- * name <tt>mediaType</tt> in the Jingle session with the <tt>CallPeer</tt>
- * associated with this <tt>CallPeerMediaHandlerJabberImpl</tt>.
- * @param mediaType the <tt>MediaType</tt> for which to get the current
- * value of the <tt>senders</tt> field.
- * @return the current value of the <tt>senders</tt> field of the content
- * with name <tt>mediaType</tt> in the Jingle session with the
- * <tt>CallPeer</tt> associated with this
- * <tt>CallPeerMediaHandlerJabberImpl</tt>
- */
- public SendersEnum getSenders(MediaType mediaType)
- {
- if (MediaType.AUDIO.equals(mediaType))
- return audioSenders;
- else if (MediaType.VIDEO.equals(mediaType))
- return videoSenders;
- else
- throw new IllegalArgumentException("mediaType");
- }
- /**
- * Set the current value of the <tt>senders</tt> field of the content with
- * name <tt>mediaType</tt> in the Jingle session with the <tt>CallPeer</tt>
- * associated with this <tt>CallPeerMediaHandlerJabberImpl</tt>.
- * @param mediaType the <tt>MediaType</tt> for which to get the current
- * value of the <tt>senders</tt> field.
- * @param senders the value to set
- */
- public void setSenders(MediaType mediaType, SendersEnum senders)
- {
- if (MediaType.AUDIO.equals(mediaType))
- this.audioSenders = senders;
- else if (MediaType.VIDEO.equals(mediaType))
- this.videoSenders = senders;
- else
- throw new IllegalArgumentException("mediaType");
- }
/**
* If Jitsi Videobridge is in use, returns the
@@ -2217,5 +2157,4 @@ public class CallPeerMediaHandlerJabberImpl
}
}
-
}
diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ContentPacketExtension.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ContentPacketExtension.java
index fa119c2..3d303d6 100644
--- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ContentPacketExtension.java
+++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ContentPacketExtension.java
@@ -272,6 +272,8 @@ public class ContentPacketExtension extends AbstractPacketExtension
*/
public void setSenders(SendersEnum senders)
{
+ if (senders == null)
+ senders = SendersEnum.both;
setAttribute(SENDERS_ATTR_NAME, senders.toString());
}
}
diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/jinglesdp/JingleUtils.java b/src/net/java/sip/communicator/impl/protocol/jabber/jinglesdp/JingleUtils.java
index 7606095..eaa653e 100644
--- a/src/net/java/sip/communicator/impl/protocol/jabber/jinglesdp/JingleUtils.java
+++ b/src/net/java/sip/communicator/impl/protocol/jabber/jinglesdp/JingleUtils.java
@@ -613,4 +613,29 @@ public class JingleUtils
return ptExt;
}
+
+ /**
+ * Returns the <tt>MediaType</tt> for <tt>content</tt> by looking for it
+ * in the <tt>content</tt>'s <tt>description</tt>, if any.
+ *
+ * @param content the content to return the <tt>MediaType</tt> of
+ * @return the <tt>MediaType</tt> for <tt>content</tt> by looking for it
+ * in the <tt>content</tt>'s <tt>description</tt>, if any.
+ * <tt>contentName</tt>
+ */
+ public static MediaType getMediaType(ContentPacketExtension content)
+ {
+ if (content == null)
+ return null;
+ RtpDescriptionPacketExtension desc = getRtpDescription(content);
+ if (desc != null)
+ {
+ String mediaTypeStr = desc.getMedia();
+ if (mediaTypeStr != null)
+ return MediaType.parseString(mediaTypeStr);
+ }
+
+ return null;
+ }
+
}