diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp index 1e8783950f144c9b86ebc8d370627b87fb897b30..bfb5810bef1f95ccda3d761357daa8c0531bf74e 100644 --- a/src/sipvoiplink.cpp +++ b/src/sipvoiplink.cpp @@ -229,6 +229,23 @@ SIPVoIPLink::terminateSIPCall() _callMap.clear(); } + void +SIPVoIPLink::terminateOneCall(const CallID& id) +{ + _debug("SIPVoIPLink::terminateOneCall(): function called \n"); + + SIPCall *call; + + call = getSIPCall(id); + if (call) { + // terminate the sip call + _debug("SIPVoIPLink::terminateOneCall()::the call is deleted, should close recording file \n"); + delete call; call = 0; + } +} + + + void SIPVoIPLink::getEvent() { @@ -383,7 +400,7 @@ SIPVoIPLink::sendUnregister( AccountID id ) return true; } - Call* +Call* SIPVoIPLink::newOutgoingCall(const CallID& id, const std::string& toUrl) { Account* account; @@ -453,6 +470,7 @@ SIPVoIPLink::answer(const CallID& id) _debug("! SIP Failure: Unable to start sound when answering %s/%d\n", __FILE__, __LINE__); } } + terminateOneCall(call->getCallId()); removeCall(call->getCallId()); return false; } @@ -489,8 +507,7 @@ SIPVoIPLink::hangup(const CallID& id) _audiortp->closeRtpSession(); } - terminateSIPCall(); - + terminateOneCall(id); removeCall(id); return true; @@ -504,6 +521,7 @@ SIPVoIPLink::cancel(const CallID& id) _debug("- SIP Action: Cancel call %s [cid: %3d]\n", id.data(), call->getCid()); + terminateOneCall(id); removeCall(id); return true; @@ -716,7 +734,7 @@ SIPVoIPLink::refuse (const CallID& id) call->getInvSession()->mod_data[getModId()] = NULL; - terminateSIPCall(); + terminateOneCall(id); return true; } @@ -941,6 +959,7 @@ SIPVoIPLink::SIPCallServerFailure(SIPCall *call) _debug("Server error!\n"); CallID id = call->getCallId(); Manager::instance().callFailure(id); + terminateOneCall(id); removeCall(id); } //break; @@ -965,7 +984,7 @@ SIPVoIPLink::SIPCallClosed(SIPCall *call) } _debug("After close RTP\n"); Manager::instance().peerHungupCall(id); - terminateSIPCall(); + terminateOneCall(id); removeCall(id); _debug("After remove call ID\n"); } @@ -982,6 +1001,7 @@ SIPVoIPLink::SIPCallReleased(SIPCall *call) _debug("SIP call release\n"); CallID id = call->getCallId(); Manager::instance().callFailure(id); + terminateOneCall(id); removeCall(id); } diff --git a/src/sipvoiplink.h b/src/sipvoiplink.h index dde5e71ebbb1e8b3f7109a96284d8e1bf45e6336..01e92540f2c7b03904736aaa9c081a9ee3756a25 100644 --- a/src/sipvoiplink.h +++ b/src/sipvoiplink.h @@ -191,6 +191,11 @@ class SIPVoIPLink : public VoIPLink * Terminate every call not hangup | brutal | Protected by mutex */ void terminateSIPCall(); + + /** + * Terminate only one call + */ + void terminateOneCall(const CallID& id); /** * Build a sip address with the number that you want to call