Module: sems Branch: master Commit: 7eb35d41c38aeea2bf0153a184af83d4f2902cd9 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=7eb35d41c38aeea2bf0153a184af83d4f2902cd9
Author: Stefan Sayer <[email protected]> Committer: Stefan Sayer <[email protected]> Date: Tue Sep 21 14:48:45 2010 +0200 handling session timeout in onSessionTimeout evh created new event handler onSessionTimeout, where session timeout is handled. implemented for b2bua calls --- core/AmB2BSession.cpp | 6 +++++ core/AmB2BSession.h | 2 + core/AmSession.cpp | 32 +++++++++++++++----------- core/AmSession.h | 8 ++++++ core/plug-in/session_timer/SessionTimer.cpp | 6 +---- 5 files changed, 35 insertions(+), 19 deletions(-) diff --git a/core/AmB2BSession.cpp b/core/AmB2BSession.cpp index 467bdf7..71b1e68 100644 --- a/core/AmB2BSession.cpp +++ b/core/AmB2BSession.cpp @@ -314,6 +314,12 @@ void AmB2BSession::terminateOtherLeg() clear_other(); } +void AmB2BSession::onSessionTimeout() { + DBG("Session Timer: Timeout, ending other leg."); + terminateOtherLeg(); + AmSession::onSessionTimeout(); +} + void AmB2BSession::relaySip(const AmSipRequest& req) { if (req.method != "ACK") { diff --git a/core/AmB2BSession.h b/core/AmB2BSession.h index 331a21d..9b8d7dc 100644 --- a/core/AmB2BSession.h +++ b/core/AmB2BSession.h @@ -173,6 +173,8 @@ class AmB2BSession: public AmSession void onSipReply(const AmSipReply& reply, int old_dlg_status); void onInvite2xx(const AmSipReply& reply); + void onSessionTimeout(); + /** @see AmEventQueue */ void process(AmEvent* event); diff --git a/core/AmSession.cpp b/core/AmSession.cpp index 8b0a9a7..5e340e5 100644 --- a/core/AmSession.cpp +++ b/core/AmSession.cpp @@ -684,13 +684,7 @@ void AmSession::onSipRequest(const AmSipRequest& req) DBG("onSipRequest: method = %s\n",req.method.c_str()); - if (refresh_method == REFRESH_UPDATE_FB_REINV) { - if (key_in_list(getHeader(req.hdrs, SIP_HDR_ALLOW), - SIP_METH_UPDATE)) { - DBG("remote allows UPDATE, using UPDATE for session refresh.\n"); - refresh_method = REFRESH_UPDATE; - } - } + updateRefreshMethod(req.hdrs); if(req.method == SIP_METH_INVITE){ @@ -784,13 +778,7 @@ void AmSession::onSipReply(const AmSipReply& reply, int old_dlg_status) { CALL_EVENT_H(onSipReply,reply,old_dlg_status); - if (refresh_method == REFRESH_UPDATE_FB_REINV) { - if (key_in_list(getHeader(reply.hdrs, SIP_HDR_ALLOW), - SIP_METH_UPDATE)) { - DBG("remote allows UPDATE, using UPDATE for session refresh.\n"); - refresh_method = REFRESH_UPDATE; - } - } + updateRefreshMethod(reply.hdrs); if (old_dlg_status != dlg.getStatus()) DBG("Dialog status changed %s -> %s (stopped=%s) \n", @@ -1099,6 +1087,22 @@ void AmSession::onRtpTimeout() setStopped(); } +void AmSession::onSessionTimeout() { + DBG("Session Timer: Timeout, ending session.\n"); + dlg.bye(); + setStopped(); +} + +void AmSession::updateRefreshMethod(const string& headers) { + if (refresh_method == REFRESH_UPDATE_FB_REINV) { + if (key_in_list(getHeader(headers, SIP_HDR_ALLOW), + SIP_METH_UPDATE)) { + DBG("remote allows UPDATE, using UPDATE for session refresh.\n"); + refresh_method = REFRESH_UPDATE; + } + } +} + void AmSession::refresh() { if (refresh_method == REFRESH_UPDATE) { DBG("Refreshing session with UPDATE\n"); diff --git a/core/AmSession.h b/core/AmSession.h index 620fe8c..c3c174f 100644 --- a/core/AmSession.h +++ b/core/AmSession.h @@ -181,8 +181,12 @@ public: REFRESH_UPDATE, // use update REFRESH_UPDATE_FB_REINV // use update or fallback to reinvite }; + /** currently selected session refresh method */ SessionRefreshMethod refresh_method; + /** update selected session refresh method from remote capabilities */ + void updateRefreshMethod(const string& headers); + AmRtpAudio* RTPStream(); #ifdef WITH_ZRTP @@ -552,6 +556,10 @@ public: /** This callback is called if RTP timeout encountered */ virtual void onRtpTimeout(); + /** This callback is called if session + timeout encountered (session timers) */ + virtual void onSessionTimeout(); + /* Called by AmSipDialog when a request is sent */ virtual void onSendRequest(const string& method, const string& content_type, diff --git a/core/plug-in/session_timer/SessionTimer.cpp b/core/plug-in/session_timer/SessionTimer.cpp index e36dd48..c6cd47c 100644 --- a/core/plug-in/session_timer/SessionTimer.cpp +++ b/core/plug-in/session_timer/SessionTimer.cpp @@ -347,11 +347,7 @@ void SessionTimer::onTimeoutEvent(AmTimeoutEvent* timeout_ev) DBG("need session refresh but remote session is refresher\n"); } } else if (timer_id == ID_SESSION_INTERVAL_TIMER) { - // // let the session know it got timeout - // onTimeout(); - DBG("Session Timer: Timeout, ending session.\n"); - s->dlg.bye(); - s->setStopped(); + s->onSessionTimeout(); } else { DBG("unknown timeout event received.\n"); } _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
