Author: sayer
Date: 2010-05-02 20:01:54 +0200 (Sun, 02 May 2010)
New Revision: 1889
Modified:
trunk/apps/dsm/DSMCoreModule.cpp
trunk/apps/dsm/DSMCoreModule.h
trunk/doc/dsm/dsm_syntax.txt
Log:
sets action, set with replace parameters
Modified: trunk/apps/dsm/DSMCoreModule.cpp
===================================================================
--- trunk/apps/dsm/DSMCoreModule.cpp 2010-05-02 15:27:16 UTC (rev 1888)
+++ trunk/apps/dsm/DSMCoreModule.cpp 2010-05-02 18:01:54 UTC (rev 1889)
@@ -68,6 +68,7 @@
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 @@
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<string,string>* event_params) {
+ string res = q;
+ size_t repl_pos = 0;
+ while (repl_pos<res.length()) {
+ size_t rstart = res.find_first_of("$#@", repl_pos);
+ repl_pos = rstart+1;
+ if (rstart == string::npos)
+ break;
+ if (rstart && res[rstart-1] == '\\') // escaped
+ continue;
+
+ size_t rend = res.find_first_of(" ,()$...@\t;'\"", rstart+1);
+ if (rend==string::npos)
+ rend = res.length();
+ string keyname = res.substr(rstart+1, rend-rstart-1);
+ // todo: simply use resolveVars (?)
+ switch(res[rstart]) {
+ case '$': {
+
+ if (sc_sess->var.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] == '$')?
Modified: trunk/apps/dsm/DSMCoreModule.h
===================================================================
--- trunk/apps/dsm/DSMCoreModule.h 2010-05-02 15:27:16 UTC (rev 1888)
+++ trunk/apps/dsm/DSMCoreModule.h 2010-05-02 18:01:54 UTC (rev 1889)
@@ -75,6 +75,7 @@
DEF_ACTION_1P(SCThrowOnErrorAction);
DEF_ACTION_2P(SCSetAction);
+DEF_ACTION_2P(SCSetSAction);
DEF_ACTION_2P(SCEvalAction);
DEF_ACTION_2P(SCAppendAction);
DEF_ACTION_2P(SCSubStrAction);
Modified: trunk/doc/dsm/dsm_syntax.txt
===================================================================
--- trunk/doc/dsm/dsm_syntax.txt 2010-05-02 15:27:16 UTC (rev 1888)
+++ trunk/doc/dsm/dsm_syntax.txt 2010-05-02 18:01:54 UTC (rev 1889)
@@ -120,6 +120,8 @@
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)
_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev