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

Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date:   Wed Sep  8 17:22:08 2010 +0200

DSM: support $var in jumpFSM($var)/callFSM($var)

support $var or @select or #param in jumpFSM/callFSM

---

 apps/dsm/DSMCoreModule.cpp  |   24 ++++++++++++++++++------
 apps/dsm/DSMModule.h        |    9 +++++++--
 apps/dsm/DSMStateEngine.cpp |    8 +++++---
 apps/dsm/DSMStateEngine.h   |    5 ++++-
 4 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/apps/dsm/DSMCoreModule.cpp b/apps/dsm/DSMCoreModule.cpp
index 20b85f4..11a6038 100644
--- a/apps/dsm/DSMCoreModule.cpp
+++ b/apps/dsm/DSMCoreModule.cpp
@@ -376,24 +376,36 @@ EXEC_ACTION_START(SCStopAction) {
   }                                                            \
 
 DEF_SCModActionExec(SCRepostAction);
-DSMAction::SEAction SCRepostAction::getSEAction(string& param) { 
+DSMAction::SEAction SCRepostAction::getSEAction(string& param,
+                                               AmSession* sess, DSMSession* 
sc_sess,
+                                               DSMCondition::EventType event,
+                                               map<string,string>* 
event_params) {
   return Repost; 
 }
 
 DEF_SCModActionExec(SCJumpFSMAction);
-DSMAction::SEAction SCJumpFSMAction::getSEAction(string& param) { 
-  param = arg;
+DSMAction::SEAction SCJumpFSMAction::getSEAction(string& param,
+                                                AmSession* sess, DSMSession* 
sc_sess,
+                                                DSMCondition::EventType event,
+                                                map<string,string>* 
event_params) {
+  param = resolveVars(arg, sess, sc_sess, event_params);
   return Jump; 
 }
 
 DEF_SCModActionExec(SCCallFSMAction);
-DSMAction::SEAction SCCallFSMAction::getSEAction(string& param) { 
-  param = arg;
+DSMAction::SEAction SCCallFSMAction::getSEAction(string& param,
+                                                AmSession* sess, DSMSession* 
sc_sess,
+                                                DSMCondition::EventType event,
+                                                map<string,string>* 
event_params) {
+  param = resolveVars(arg, sess, sc_sess, event_params);
   return Call; 
 }
 
 DEF_SCModActionExec(SCReturnFSMAction);
-DSMAction::SEAction SCReturnFSMAction::getSEAction(string& param) { 
+DSMAction::SEAction SCReturnFSMAction::getSEAction(string& param,
+                                                  AmSession* sess, DSMSession* 
sc_sess,
+                                                  DSMCondition::EventType 
event,
+                                                  map<string,string>* 
event_params) {
   return Return; 
 }
 
diff --git a/apps/dsm/DSMModule.h b/apps/dsm/DSMModule.h
index 78c58b7..fa88281 100644
--- a/apps/dsm/DSMModule.h
+++ b/apps/dsm/DSMModule.h
@@ -105,12 +105,17 @@ class SCStrArgAction
 #define DEF_SCModSEStrArgAction(CL_Name)                               \
   class CL_Name                                                                
\
   : public SCStrArgAction {                                            \
+    bool is_evaluated;                                                 \
   public:                                                              \
-  CL_Name(const string& arg) : SCStrArgAction(arg) { }                 \
+  CL_Name(const string& arg) : SCStrArgAction(arg),                    \
+      is_evaluated(false) { }                                          \
     bool execute(AmSession* sess, DSMSession* sc_sess,                 \
                 DSMCondition::EventType event,                         \
                 map<string,string>* event_params);                     \
-    SEAction getSEAction(std::string&);                                        
\
+    SEAction getSEAction(std::string&,                                 \
+                        AmSession* sess, DSMSession* sc_sess,          \
+                        DSMCondition::EventType event,                 \
+                        map<string,string>* event_params);             \
   };                                                                   \
 
 #define DEF_ACTION_2P(CL_Name)                                         \
diff --git a/apps/dsm/DSMStateEngine.cpp b/apps/dsm/DSMStateEngine.cpp
index e883999..e9cb9bf 100644
--- a/apps/dsm/DSMStateEngine.cpp
+++ b/apps/dsm/DSMStateEngine.cpp
@@ -228,17 +228,19 @@ bool 
DSMStateEngine::runactions(vector<DSMAction*>::iterator from,
     DBG("executing '%s'\n", (*it)->name.c_str()); 
     if ((*it)->execute(sess, sc_sess, event, event_params)) {
       string se_modifier;
-      switch ((*it)->getSEAction(se_modifier)) {
+      switch ((*it)->getSEAction(se_modifier,
+                                sess, sc_sess, event, event_params)) {
       case DSMAction::Repost: 
        is_consumed = false; 
        break;
       case DSMAction::Jump: 
-       DBG("jumping %s\n", se_modifier.c_str());
+       DBG("jumping to %s\n", se_modifier.c_str());
        if (jumpDiag(se_modifier, sess, sc_sess, event, event_params)) {
          // is_consumed = false; 
          return true;  
        } break;
-      case DSMAction::Call: 
+      case DSMAction::Call:
+       DBG("calling %s\n", se_modifier.c_str());
        if (callDiag(se_modifier, sess, sc_sess, event, event_params))  {
          // is_consumed = false; 
          return true;   
diff --git a/apps/dsm/DSMStateEngine.h b/apps/dsm/DSMStateEngine.h
index 961b8b3..0ceac7f 100644
--- a/apps/dsm/DSMStateEngine.h
+++ b/apps/dsm/DSMStateEngine.h
@@ -128,7 +128,10 @@ class DSMAction
                       map<string,string>* event_params) = 0;
 
   /** @return state engine modification */
-  virtual SEAction getSEAction(string& param) { return None; }
+  virtual SEAction getSEAction(string& param,
+                              AmSession* sess, DSMSession* sc_sess,
+                              DSMCondition::EventType event,
+                              map<string,string>* event_params) { return None; 
}
 };
 
 class DSMTransition;

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

Reply via email to