Module: sems
Branch: master
Commit: 24d5489f76afe6e95ecdb55dc996ef3cf226b73d
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=24d5489f76afe6e95ecdb55dc996ef3cf226b73d

Author: Raphael Coeffic <[email protected]>
Committer: Raphael Coeffic <[email protected]>
Date:   Wed Oct 19 16:22:49 2011 +0200

b/f: fixes broken OA with offerless INV w/ SEMS as UAS.

the bugs were introduced by the changes in commit 618f6371.

---

 core/AmSipDialog.cpp |   34 +++++++++++++---------------------
 core/AmSipDialog.h   |    3 +++
 2 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/core/AmSipDialog.cpp b/core/AmSipDialog.cpp
index 087823c..3b05825 100644
--- a/core/AmSipDialog.cpp
+++ b/core/AmSipDialog.cpp
@@ -91,6 +91,7 @@ void AmSipDialog::OATrans::clearTransitionalState()
 
 AmSipDialog::AmSipDialog(AmSipDialogEventHandler* h)
   : status(Disconnected),oa_trans(),
+    early_session_started(false),session_started(false),
     cseq(10),r_cseq_i(false),hdl(h),
     pending_invites(0),cancel_pending(false),
     outbound_proxy(AmConfig::OutboundProxy),
@@ -381,29 +382,19 @@ int AmSipDialog::checkStateChange()
      (oa_trans.state == OA_Completed)) {
 
     ret = onSdpCompleted();
-  }
+    if(ret) return ret;
 
-  if(saved_status != getStatus()){
-    switch(getStatus()){
-    case Early:
-      if(oa_trans.state == OA_Completed){
-       hdl->onEarlySessionStart();
-      }
-      break;
-    case Connected:
-      if(oa_trans.state == OA_Completed){
-       hdl->onSessionStart();
-      }
-      else {
-       // Anything we should do about it???
-       DBG("SIP dialog transitioned to Connected without a valid media session 
setup.\n");
-      }
-      break;
-    default:
-      break;
+    if((getStatus() == Early) && !early_session_started) {
+      hdl->onEarlySessionStart();
+      early_session_started = true;
+    }
+
+    if((getStatus() == Connected) && !session_started) {
+      hdl->onSessionStart();
+      session_started = true;
     }
   }
-  
+
   return ret;
 }
 
@@ -1192,7 +1183,8 @@ int AmSipDialog::reply(const AmSipTransaction& t,
   ret = checkStateChange();
 
   if((uas_trans.find(reply.cseq) == uas_trans.end()) &&
-     (reply.cseq == oa_trans.cseq)){
+     (reply.cseq == oa_trans.cseq) &&
+     (reply.cseq_method != SIP_METH_INVITE)){
     // transaction has been removed:
     //  -> cleanup OA state
     DBG("transaction finished by final reply %u: resetting OA state\n", 
reply.cseq);
diff --git a/core/AmSipDialog.h b/core/AmSipDialog.h
index dbbdea9..2fc1c12 100644
--- a/core/AmSipDialog.h
+++ b/core/AmSipDialog.h
@@ -147,6 +147,9 @@ private:
   Status  saved_status;
   OAState saved_oa_state;
 
+  bool early_session_started;
+  bool session_started;
+
   AmSipDialogEventHandler* hdl;
 
   int onTxReply(AmSipReply& reply);

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to