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

Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date:   Thu Feb 13 18:10:08 2014 +0100

b/f:dsm: execute actions after callFSM

e.g.         callFSM(callsub);
             log(3, "hello, back here");

thanks to Oz Oseghale for reporting

---

 apps/dsm/DSMStateEngine.cpp |   28 ++++++++++++++++++++--------
 apps/dsm/DSMStateEngine.h   |   21 ++++++++++++++++++---
 doc/dsm/dsm_syntax.txt      |    2 +-
 3 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/apps/dsm/DSMStateEngine.cpp b/apps/dsm/DSMStateEngine.cpp
index 29db2c0..3475c04 100644
--- a/apps/dsm/DSMStateEngine.cpp
+++ b/apps/dsm/DSMStateEngine.cpp
@@ -262,13 +262,13 @@ bool 
DSMStateEngine::runactions(vector<DSMElement*>::iterator from,
          break;
        case DSMAction::Call:
          DBG("calling %s\n", se_modifier.c_str());
-         if (callDiag(se_modifier, sess, sc_sess, event, event_params))  {
+         if (callDiag(se_modifier, sess, sc_sess, event, event_params, it+1, 
to))  {
            // is_consumed = false; 
            return true;   
          } 
          break;
        case DSMAction::Return: 
-         if (returnDiag(sess, sc_sess)) {
+         if (returnDiag(sess, sc_sess, event, event_params)) {
            //is_consumed = false;
            return true; 
          }
@@ -638,13 +638,17 @@ void DSMStateEngine::runEvent(AmSession* sess, 
DSMSession* sc_sess,
 }
 
 bool DSMStateEngine::callDiag(const string& diag_name, AmSession* sess, 
DSMSession* sc_sess,
-                          DSMCondition::EventType event,
-                          map<string,string>* event_params) {
+                             DSMCondition::EventType event,
+                             map<string,string>* event_params,
+                             vector<DSMElement*>::iterator actions_from, 
vector<DSMElement*>::iterator actions_to) {
   if (!current || !current_diag) {
     ERROR("no current diag to push\n");
     return false;
   }
-  stack.push_back(std::make_pair(current_diag, current));
+  stack.push_back(DSMStackElement(current_diag, current));
+  for (vector<DSMElement*>::iterator it = actions_from; it != actions_to; it++)
+    stack.back().actions.push_back(*it);
+
   return jumpDiag(diag_name, sess, sc_sess, event, event_params);
 }
 
@@ -691,15 +695,23 @@ bool DSMStateEngine::jumpDiag(const string& diag_name, 
AmSession* sess, DSMSessi
   return false;
 }
 
-bool DSMStateEngine::returnDiag(AmSession* sess, DSMSession* sc_sess) {
+bool DSMStateEngine::returnDiag(AmSession* sess, DSMSession* sc_sess,
+                               DSMCondition::EventType event, 
map<string,string>* event_params) {
   if (stack.empty()) {
     ERROR("returning from empty stack\n");
     return false;
   }
-  current_diag = stack.back().first;
-  current = stack.back().second;
+  current_diag = stack.back().diag;
+  current = stack.back().state;
+  vector<DSMElement*> actions = stack.back().actions;
   stack.pop_back();
 
+  bool is_consumed; //?
+  DBG("executing %zd action elements from stack\n", actions.size());
+  if (actions.size()) {
+    runactions(actions.begin(), actions.end(), sess, sc_sess, event, 
event_params, is_consumed);
+  }
+
   MONITORING_LOG2(sess->getLocalTag().c_str(), 
                  "dsm_diag", current_diag->getName().c_str(),
                  "dsm_state", current->name.c_str());
diff --git a/apps/dsm/DSMStateEngine.h b/apps/dsm/DSMStateEngine.h
index 0db71dc..36a5b9d 100644
--- a/apps/dsm/DSMStateEngine.h
+++ b/apps/dsm/DSMStateEngine.h
@@ -275,20 +275,35 @@ class DSMException {
   map<string, string> params;    
 };
 
+struct DSMStackElement {
+  DSMStateDiagram* diag;
+  State* state;
+  vector<DSMElement*> actions;
+
+  DSMStackElement(DSMStateDiagram* diag, State* state)
+  : diag(diag), state(state) { }
+
+  DSMStackElement(DSMStateDiagram* diag, State* state, const 
vector<DSMElement*>& actions)
+  : diag(diag), state(state), actions(actions) { }
+
+};
+
 class DSMStateEngine {
   State* current;
   DSMStateDiagram* current_diag;
   vector<DSMStateDiagram*> diags;
 
-  vector<pair<DSMStateDiagram*, State*> > stack;
+  //  vector<pair<DSMStateDiagram*, State*> > stack;
+  vector<DSMStackElement> stack;
 
   bool callDiag(const string& diag_name, AmSession* sess, DSMSession* sc_sess, 
                DSMCondition::EventType event,
-               map<string,string>* event_params);
+               map<string,string>* event_params,
+               vector<DSMElement*>::iterator actions_from, 
vector<DSMElement*>::iterator actions_to);
   bool jumpDiag(const string& diag_name, AmSession* sess, DSMSession* sc_sess,
                DSMCondition::EventType event,
                map<string,string>* event_params);
-  bool returnDiag(AmSession* sess, DSMSession* sc_sess);
+  bool returnDiag(AmSession* sess, DSMSession* sc_sess, 
DSMCondition::EventType event, map<string,string>* event_params);
   bool runactions(vector<DSMElement*>::iterator from, 
                  vector<DSMElement*>::iterator to, 
                  AmSession* sess, DSMSession* sc_sess, DSMCondition::EventType 
event,
diff --git a/doc/dsm/dsm_syntax.txt b/doc/dsm/dsm_syntax.txt
index b574ee7..075fe79 100644
--- a/doc/dsm/dsm_syntax.txt
+++ b/doc/dsm/dsm_syntax.txt
@@ -71,7 +71,7 @@ DSM flow
 
  -- call/jump/return sub-FSM
  jumpFSM(name)
- callFSM(name)
+ callFSM(name)   - note that actions after callFSM may have the event & event 
params of the sub-FSM  
  returnFSM()
 
  stop(<send bye>)

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

Reply via email to