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

Reply via email to