From 3eede72c8ea019eb4e57788be35ed781d203254b Mon Sep 17 00:00:00 2001 From: Sebastien Vincent Date: Fri, 28 Oct 2011 13:56:05 +0000 Subject: [PATCH] Fixes a problem when we cancel a Jingle call, it is not really cancelled. In fact the session-terminate was sent _before_ session-initiate. --- .../protocol/jabber/CallPeerJabberImpl.java | 45 ++++++++++++++++++- 1 file changed, 43 insertions(+), 2 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 39dd59aaf..9c9f50211 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java @@ -69,6 +69,16 @@ public class CallPeerJabberImpl */ private boolean contentAddWithNoCands = false; + /** + * Synchronization object for SID. + */ + private final Object sidSyncRoot = new Object(); + + /** + * If the call is cancelled before session-initiate is sent. + */ + private boolean cancelled = false; + /** * Creates a new call peer with address peerAddress. * @@ -261,12 +271,24 @@ protected synchronized void initiateSession( ProtocolProviderServiceJabberImpl protocolProvider = getProtocolProvider(); - sessionInitIQ - = JinglePacketFactory.createSessionInitiate( + synchronized(sidSyncRoot) + { + sessionInitIQ + = JinglePacketFactory.createSessionInitiate( protocolProvider.getOurJID(), this.peerJID, JingleIQ.generateSID(), offer); + + if(cancelled) + { + // we cancelled the call too early so no need to send the + // session-initiate to peer + getMediaHandler().getTransportManager().close(); + return; + } + } + if (sessionInitiateExtensions != null) { for (PacketExtension sessionInitiateExtension @@ -399,6 +421,20 @@ else if (CallPeerState.CONNECTING.equals(prevPeerState) || CallPeerState.CONNECTING_WITH_EARLY_MEDIA.equals(prevPeerState) || CallPeerState.ALERTING_REMOTE_SIDE.equals(prevPeerState)) { + String jingleSID = getJingleSID(); + + if(jingleSID == null) + { + synchronized(sidSyncRoot) + { + // we cancelled the call too early because the jingleSID + // is null (i.e. the session-initiate has not been created) + // and no need to send the session-terminate + cancelled = true; + return; + } + } + responseIQ = JinglePacketFactory.createCancel( getProtocolProvider().getOurJID(), peerJID, getJingleSID()); } @@ -1165,6 +1201,11 @@ public void processTransportInfo(JingleIQ jingleIQ) */ protected void sendTransportInfo(Iterable contents) { + // if the call is cancelled, do not start sending candidates in + // transport-info + if(cancelled) + return; + JingleIQ transportInfo = new JingleIQ(); for (ContentPacketExtension content : contents)