diff --git a/apps/dsm/DSMCoreModule.cpp b/apps/dsm/DSMCoreModule.cpp index a07017db..f5354c66 100644 --- a/apps/dsm/DSMCoreModule.cpp +++ b/apps/dsm/DSMCoreModule.cpp @@ -68,6 +68,7 @@ DSMAction* DSMCoreModule::getAction(const string& from_str) { DEF_CMD("disableDTMFDetection", SCDisableDTMFDetection); DEF_CMD("set", SCSetAction); + DEF_CMD("sets", SCSetSAction); DEF_CMD("eval", SCEvalAction); DEF_CMD("setVar", SCSetVarAction); DEF_CMD("var", SCGetVarAction); @@ -464,6 +465,59 @@ EXEC_ACTION_START(SCSetAction) { var_name.c_str(), sc_sess->var[var_name].c_str()); } EXEC_ACTION_END; +string replaceParams(const string& q, AmSession* sess, DSMSession* sc_sess, + map* event_params) { + string res = q; + size_t repl_pos = 0; + while (repl_posvar.find(keyname) == sc_sess->var.end()) + res.erase(rstart, rend-rstart); + else + res.replace(rstart, rend-rstart, sc_sess->var[keyname]); + } break; + case '#': + if (NULL!=event_params) { + if (event_params->find(keyname) != event_params->end()) + res.replace(rstart, rend-rstart, (*event_params)[keyname]); + else + res.erase(rstart, rend-rstart); + } break; + case '@': { + // todo: optimize + res.replace(rstart, rend-rstart, + resolveVars("@"+keyname, sess, sc_sess, event_params)); + } break; + default: break; + } + } + return res; +} +CONST_ACTION_2P(SCSetSAction,'=', false); +EXEC_ACTION_START(SCSetSAction) { + string var_name = (par1.length() && par1[0] == '$')? + par1.substr(1) : par1; + + sc_sess->var[var_name] = replaceParams(par2, sess, sc_sess, event_params); + + DBG("set $%s='%s'\n", + var_name.c_str(), sc_sess->var[var_name].c_str()); +} EXEC_ACTION_END; + CONST_ACTION_2P(SCEvalAction,'=', false); EXEC_ACTION_START(SCEvalAction) { string var_name = (par1.length() && par1[0] == '$')? diff --git a/apps/dsm/DSMCoreModule.h b/apps/dsm/DSMCoreModule.h index b5ae3d5b..b4f6b414 100644 --- a/apps/dsm/DSMCoreModule.h +++ b/apps/dsm/DSMCoreModule.h @@ -75,6 +75,7 @@ DEF_ACTION_2P(SCThrowAction); DEF_ACTION_1P(SCThrowOnErrorAction); DEF_ACTION_2P(SCSetAction); +DEF_ACTION_2P(SCSetSAction); DEF_ACTION_2P(SCEvalAction); DEF_ACTION_2P(SCAppendAction); DEF_ACTION_2P(SCSubStrAction); diff --git a/doc/dsm/dsm_syntax.txt b/doc/dsm/dsm_syntax.txt index 353d6d47..943e1942 100644 --- a/doc/dsm/dsm_syntax.txt +++ b/doc/dsm/dsm_syntax.txt @@ -120,6 +120,8 @@ core actions: set($var=value) e.g. set($var="text"); set($var=$var2); set($var=#key) + sets($var=value) + e.g. set($var="text and some $variable and some #param"); var($dstvar=srcvarname) e.g. var($dstvar=$var_counter) eval($var=value)