diff options
author | Boris Grozev <boris@jitsi.org> | 2013-08-12 18:14:18 +0300 |
---|---|---|
committer | Boris Grozev <boris@jitsi.org> | 2013-08-16 11:06:52 +0300 |
commit | 71b19959c5849bd46fe0cb734353c6af187ce435 (patch) | |
tree | 0bd0fd91a0cda9b2d6bbf8ad59bbc14a9cbafecb | |
parent | 99c02f91176efa30764a76653d43f7345c76934f (diff) | |
download | jitsi-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.
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; + } + } |