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

Reply via email to