Module: sems Branch: 1.5 Commit: 05f10f248273107318da68e0a2b7cb1874c95efd URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=05f10f248273107318da68e0a2b7cb1874c95efd
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 50c70c2..c50eddc 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; } @@ -632,13 +632,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); } @@ -685,15 +689,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 b5d815e..2837906 100644 --- a/apps/dsm/DSMStateEngine.h +++ b/apps/dsm/DSMStateEngine.h @@ -255,20 +255,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 c1afa28..5599465 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
