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

Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date:   Tue Mar 11 15:38:57 2014 +0100

sbc:dsm: conditions for call leg status

---

 apps/dsm/mods/mod_sbc/ModSbc.cpp |   38 ++++++++++++++++++++++++++++++++++++++
 apps/dsm/mods/mod_sbc/ModSbc.h   |    6 ++++++
 doc/dsm/dsm_sbc_syntax.txt       |   10 +++++++---
 3 files changed, 51 insertions(+), 3 deletions(-)

diff --git a/apps/dsm/mods/mod_sbc/ModSbc.cpp b/apps/dsm/mods/mod_sbc/ModSbc.cpp
index 5e8a428..b475ade 100644
--- a/apps/dsm/mods/mod_sbc/ModSbc.cpp
+++ b/apps/dsm/mods/mod_sbc/ModSbc.cpp
@@ -117,6 +117,22 @@ MOD_CONDITIONEXPORT_BEGIN(MOD_CLS_NAME) {
   if (cmd == "sbc.isOnHold")
     return new SBCIsOnHoldCondition(params, false);
 
+  if (cmd == "sbc.isDisconnected")
+    return new SBCIsDisconnectedCondition(params, false);
+
+  if (cmd == "sbc.isNoReply")
+    return new SBCIsNoReplyCondition(params, false);
+
+  if (cmd == "sbc.isRinging")
+    return new SBCIsRingingCondition(params, false);
+
+  if (cmd == "sbc.isConnected")
+    return new SBCIsConnectedCondition(params, false);
+
+  if (cmd == "sbc.isDisconnecting")
+    return new SBCIsDisconnectingCondition(params, false);
+
+
 } MOD_CONDITIONEXPORT_END
 
 
@@ -150,6 +166,28 @@ MATCH_CONDITION_START(SBCIsOnHoldCondition) {
   return res;
 } MATCH_CONDITION_END;
 
+#define DEF_CALLSTATUS_COND(cond_name, cond_desc, call_status)         \
+                                                                       \
+  MATCH_CONDITION_START(cond_name) {                                   \
+    SBCCallLeg* call_leg = dynamic_cast<SBCCallLeg*>(sess);            \
+    if (NULL == call_leg) {                                            \
+      DBG("script writer error: DSM condition used without call leg\n"); \
+      return false;                                                    \
+    }                                                                  \
+                                                                       \
+    bool b = call_leg->getCallStatus() == call_status;                 \
+    bool res = inv ^ b;                                                        
\
+    DBG("SBC: " cond_desc " == %s (res = %s)\n",                       \
+       b ? "true":"false", res ? "true":"false");                      \
+    return res;                                                                
\
+  } MATCH_CONDITION_END
+
+
+DEF_CALLSTATUS_COND(SBCIsDisconnectedCondition, "sbc.isDisconnected", 
CallLeg::Disconnected);
+DEF_CALLSTATUS_COND(SBCIsNoReplyCondition, "sbc.isNoReply", CallLeg::NoReply);
+DEF_CALLSTATUS_COND(SBCIsRingingCondition, "sbc.isRinging", CallLeg::Ringing);
+DEF_CALLSTATUS_COND(SBCIsConnectedCondition, "sbc.isConnected", 
CallLeg::Connected);
+DEF_CALLSTATUS_COND(SBCIsDisconnectingCondition, "sbc.isDisconnecting", 
CallLeg::Disconnecting);
 
 #define ACTION_GET_PROFILE                     \
   SBCCallProfile* profile = NULL;                                      \
diff --git a/apps/dsm/mods/mod_sbc/ModSbc.h b/apps/dsm/mods/mod_sbc/ModSbc.h
index 8676f44..f17bec5 100644
--- a/apps/dsm/mods/mod_sbc/ModSbc.h
+++ b/apps/dsm/mods/mod_sbc/ModSbc.h
@@ -47,6 +47,12 @@ DEF_ACTION_1P(MODSBCActionGetCallStatus);
 DEF_SCCondition(SBCIsALegCondition);
 DEF_SCCondition(SBCIsOnHoldCondition);
 
+DEF_SCCondition(SBCIsDisconnectedCondition);
+DEF_SCCondition(SBCIsNoReplyCondition);
+DEF_SCCondition(SBCIsRingingCondition);
+DEF_SCCondition(SBCIsConnectedCondition);
+DEF_SCCondition(SBCIsDisconnectingCondition);
+
 DEF_ACTION_2P(MODSBCActionB2BRelayReliable);
 DEF_ACTION_2P(MODSBCActionAddCallee);
 
diff --git a/doc/dsm/dsm_sbc_syntax.txt b/doc/dsm/dsm_sbc_syntax.txt
index ab4f1c6..cc0c312 100644
--- a/doc/dsm/dsm_sbc_syntax.txt
+++ b/doc/dsm/dsm_sbc_syntax.txt
@@ -144,10 +144,13 @@ Conditions
 ----------
 call leg events (don't work in non-call SBC DSMs)
 
-sbc.isALeg
+sbc.isALeg   - is A leg of the call
 
-sbc.isOnHold
+sbc.isOnHold -  is on hold
 
+sbc.isDisconnected() / sbc.isNoReply() / sbc.isRinging() / sbc.isConnected() / 
sbc.isDisconnecting()
+  call leg status
+ 
 Actions
 -------
 sbc.profileSet(profile_variable, value)    - set SBC profile options
@@ -177,7 +180,8 @@ sbc.putOnHold()                    - put this call leg on 
hold
 
 sbc.resumeHeld()                   - resume from hold
 
-sbc.getSBCCallStatus(varname)      - get sbc call status into $varname
+sbc.getSBCCallStatus(varname)      - get sbc call status into $varname:
+                                     
Disconnected/NoReply/Ringing/Connected/Disconnecting/Unknown
 
 sbc.relayReliableEvent(paramlist, processed_paramlist, unprocessed_paramlist) 
- relay reliable Event
   if processed (#processed=true in other leg), event is sent back with 
processed_paramlist parameters,

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

Reply via email to