From 4d2003a42067d831db82a7ab024198d75afd3445 Mon Sep 17 00:00:00 2001 From: hristoterezov Date: Fri, 30 May 2014 12:19:26 +0300 Subject: [PATCH] Adds check for the peer state before sending ringing responses to received invite. --- .../impl/protocol/sip/CallSipImpl.java | 65 ++++++++----------- 1 file changed, 27 insertions(+), 38 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 f989673fa..b55999f70 100644 --- a/src/net/java/sip/communicator/impl/protocol/sip/CallSipImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/sip/CallSipImpl.java @@ -447,41 +447,29 @@ public CallPeerSipImpl processInvite(SipProvider jainSipProvider, { if (logger.isTraceEnabled()) logger.trace("will send ringing response: "); - response = messageFactory.createResponse(Response.RINGING, invite); - serverTran.sendResponse(response); - - if(serverTran instanceof SIPTransaction - && !((SIPTransaction)serverTran).isReliable() - && peer.getState().equals(CallPeerState.INCOMING_CALL)) + if(peer.getState().equals(CallPeerState.INCOMING_CALL)) { - final Timer timer = new Timer(); - CallPeerAdapter stateListener = new CallPeerAdapter() + response = messageFactory.createResponse(Response.RINGING, invite); + + serverTran.sendResponse(response); + + if(serverTran instanceof SIPTransaction + && !((SIPTransaction)serverTran).isReliable()) { - @Override - public void peerStateChanged(CallPeerChangeEvent evt) + final Timer timer = new Timer(); + int interval = retransmitsRingingInterval; + int delay = 0; + for(int i = 0; i < MAX_RETRANSMISSIONS; i++) { - if(!evt.getNewValue() - .equals(CallPeerState.INCOMING_CALL)) - { - timer.cancel(); - peer.removeCallPeerListener(this); - } + delay += interval; + timer.schedule(new RingingResponseTask(response, + serverTran, peer, timer), delay); + interval *= 2; } - }; - int interval = retransmitsRingingInterval; - int delay = 0; - for(int i = 0; i < MAX_RETRANSMISSIONS; i++) - { - delay += interval; - timer.schedule(new RingingResponseTask(response, - serverTran, peer, timer, stateListener), delay); - interval *= 2; } - - peer.addCallPeerListener(stateListener); + if (logger.isDebugEnabled()) + logger.debug("sent a ringing response: " + response); } - if (logger.isDebugEnabled()) - logger.debug("sent a ringing response: " + response); } catch (Exception ex) { @@ -595,11 +583,6 @@ private class RingingResponseTask */ private final Timer timer; - /** - * Listener for the state of the peer. - */ - private CallPeerAdapter stateListener; - /** * Create ringing response task. * @param response the response. @@ -609,13 +592,12 @@ private class RingingResponseTask * @param stateListener the state listener. */ RingingResponseTask(Response response, ServerTransaction serverTran, - CallPeerSipImpl peer, Timer timer, CallPeerAdapter stateListener) + CallPeerSipImpl peer, Timer timer) { this.response = response; this.serverTran = serverTran; this.peer = peer; this.timer = timer; - this.stateListener = stateListener; } /** @@ -626,12 +608,19 @@ public void run() { try { - serverTran.sendResponse(response); + if(!peer.getState().equals( + CallPeerState.INCOMING_CALL)) + { + timer.cancel(); + } + else + { + serverTran.sendResponse(response); + } } catch (Exception ex) { timer.cancel(); - peer.removeCallPeerListener(stateListener); } } }