- simplified and beautified modules with better looking macros:

DEF_TwoParAction -> DEF_ACTION_2P
   CONST_TwoParAction -> CONST_ACTION_2P
   -DEF_SCStrArgAction-> DEF_ACTION_1P

   EXEC_ACTION_START, EXEC_ACTION_END
   MATCH_CONDITION_START, MATCH_CONDITION_END

- quoting (+escaping) added to Actions' parameters

- added logVars debugging function to log all variables

- added avar AmArg array, to replace var (string) array


This work was kindly sponsored by Teltech Systems Inc.



git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1321 8eb893ce-cfd4-0310-b710-fb5ebe64c474
sayer/1.4-spce2.6
Stefan Sayer 18 years ago
parent 223deb060a
commit 33fcd9eea7

@ -216,7 +216,7 @@ int DSMFactory::onLoad()
}
for (std::map<string,string>::const_iterator it =
cfg.begin(); it != cfg.end(); it++)
cfg.begin(); it != cfg.end(); it++)
config[it->first] = it->second;
RunInviteEvent = cfg.getParameter("run_invite_event")=="yes";
@ -231,7 +231,7 @@ void DSMFactory::prepareSession(DSMDialog* s) {
void DSMFactory::addVariables(DSMDialog* s, const string& prefix,
map<string, string>& vars) {
for (map<string, string>::iterator it =
vars.begin(); it != vars.end(); it++)
vars.begin(); it != vars.end(); it++)
s->var[prefix+it->first] = it->second;
}
@ -249,6 +249,7 @@ AmSession* DSMFactory::onInvite(const AmSipRequest& req)
}
DSMDialog* s = new DSMDialog(&prompts, diags, start_diag, NULL);
prepareSession(s);
addVariables(s, "config.", config);
return s;
}

@ -66,8 +66,13 @@ string DSMChartReader::getToken(string str, size_t& pos) {
last_chr = str[pos1];
pos1++;
}
}
if (str[pos1] == '(') {
} else if (str[pos1] == '\'') {
pos1++;
while (pos1<str.length() && !((str[pos1] == '\'') && (last_chr != '\\'))) {
last_chr = str[pos1];
pos1++;
}
} else if (str[pos1] == '(') {
int lvl = 0;
pos1++;
while (pos1<str.length() && (lvl || (str[pos1] != ')'))) {
@ -77,13 +82,20 @@ string DSMChartReader::getToken(string str, size_t& pos) {
else if (str[pos1] == ')')
lvl--;
if (str[pos1] == '"') {
else if (str[pos1] == '"') {
pos1++;
while (pos1<str.length() && !((str[pos1] == '"') && (last_chr != '\\'))) {
last_chr = str[pos1];
pos1++;
}
}
else if (str[pos1] == '\'') {
pos1++;
while (pos1<str.length() && !((str[pos1] == '\'') && (last_chr != '\\'))) {
last_chr = str[pos1];
pos1++;
}
}
last_chr = str[pos1];
pos1++;
}
@ -93,7 +105,7 @@ string DSMChartReader::getToken(string str, size_t& pos) {
}
string res;
if (str[pos] == '"')
if ((str[pos] == '"') || (str[pos] == '\''))
res = str.substr(pos+1, pos1-pos-2);
else
res = str.substr(pos, pos1-pos);
@ -129,16 +141,6 @@ DSMCondition* DSMChartReader::conditionFromToken(const string& str, bool invert)
return c;
}
void splitCmd(const string& from_str,
string& cmd, string& params) {
size_t b_pos = from_str.find('(');
if (b_pos != string::npos) {
cmd = from_str.substr(0, b_pos);
params = from_str.substr(b_pos + 1, from_str.rfind(')') - b_pos -1);
} else
cmd = from_str;
}
bool DSMChartReader::importModule(const string& mod_cmd, const string& mod_path) {
string cmd;
string params;

@ -34,15 +34,8 @@
DSMCoreModule::DSMCoreModule() {
}
string trim(string const& str,char const* sepSet)
{
string::size_type const first = str.find_first_not_of(sepSet);
return ( first==string::npos )
? std::string() :
str.substr(first, str.find_last_not_of(sepSet)-first+1);
}
void DSMCoreModule::splitCmd(const string& from_str,
void splitCmd(const string& from_str,
string& cmd, string& params) {
size_t b_pos = from_str.find('(');
if (b_pos != string::npos) {
@ -57,15 +50,6 @@ DSMAction* DSMCoreModule::getAction(const string& from_str) {
string params;
splitCmd(from_str, cmd, params);
#define DEF_CMD(cmd_name, class_name) \
\
if (cmd == cmd_name) { \
class_name * a = \
new class_name(params); \
a->name = from_str; \
return a; \
}
DEF_CMD("repost", SCRepostAction);
DEF_CMD("jumpFSM", SCJumpFSMAction);
DEF_CMD("callFSM", SCCallFSMAction);
@ -85,6 +69,7 @@ DSMAction* DSMCoreModule::getAction(const string& from_str) {
DEF_CMD("set", SCSetAction);
DEF_CMD("append", SCAppendAction);
DEF_CMD("log", SCLogAction);
DEF_CMD("logVars", SCLogVarsAction);
DEF_CMD("setTimer", SCSetTimerAction);
@ -152,90 +137,24 @@ DSMCondition* DSMCoreModule::getCondition(const string& from_str) {
return NULL;
}
inline string resolveVars(const string s, AmSession* sess,
DSMSession* sc_sess, map<string,string>* event_params) {
if (s.length()) {
switch(s[0]) {
case '$': return sc_sess->var[s.substr(1)];
case '#':
if (event_params)
return (*event_params)[s.substr(1)];
else
return string();
case '@': {
string s1 = s.substr(1);
if (s1 == "local_tag")
return sess->getLocalTag();
else if (s1 == "user")
return sess->dlg.user;
else if (s1 == "domain")
return sess->dlg.domain;
else if (s1 == "remote_tag")
return sess->getRemoteTag();
else if (s1 == "callid")
return sess->getCallID();
else if (s1 == "local_uri")
return sess->dlg.local_uri;
else if (s1 == "remote_uri")
return sess->dlg.remote_uri;
else
return string();
}
default: return trim(s, "\"");
}
}
return s;
}
#define GET_SCSESSION() \
DSMSession* sc_sess = dynamic_cast<DSMSession*>(sess); \
if (!sc_sess) { \
ERROR("wrong session type\n"); \
return false; \
}
bool SCPlayPromptAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCPlayPromptAction) {
sc_sess->playPrompt(resolveVars(arg, sess, sc_sess, event_params));
return false;
}
} EXEC_ACTION_END;
bool SCSetPromptsAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCSetPromptsAction) {
sc_sess->setPromptSet(resolveVars(arg, sess, sc_sess, event_params));
return false;
}
} EXEC_ACTION_END;
bool SCAddSeparatorAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCAddSeparatorAction){
sc_sess->addSeparator(resolveVars(arg, sess, sc_sess, event_params));
return false;
}
} EXEC_ACTION_END;
bool SCPlayPromptLoopedAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCPlayPromptLoopedAction){
sc_sess->playPrompt(resolveVars(arg, sess, sc_sess, event_params), true);
return false;
}
CONST_TwoParAction(SCPostEventAction, ",", true);
bool SCPostEventAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
} EXEC_ACTION_END;
GET_SCSESSION();
CONST_ACTION_2P(SCPostEventAction, ',', true);
EXEC_ACTION_START(SCPostEventAction){
string sess_id = resolveVars(par1, sess, sc_sess, event_params);
string var = resolveVars(par2, sess, sc_sess, event_params);
DSMEvent* ev = new DSMEvent();
@ -251,69 +170,41 @@ bool SCPostEventAction::execute(AmSession* sess,
sc_sess->SET_ERRNO(DSM_ERRNO_UNKNOWN_ARG);
else
sc_sess->SET_ERRNO(DSM_ERRNO_OK);
} EXEC_ACTION_END;
return false;
}
bool SCPlayFileAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCPlayFileAction) {
bool loop =
resolveVars(par2, sess, sc_sess, event_params) == "true";
DBG("par1 = '%s', par2 = %s\n", par1.c_str(), par2.c_str());
sc_sess->playFile(resolveVars(par1, sess, sc_sess, event_params),
loop);
return false;
}
} EXEC_ACTION_END;
bool SCRecordFileAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCRecordFileAction) {
sc_sess->recordFile(resolveVars(arg, sess, sc_sess, event_params));
return false;
}
} EXEC_ACTION_END;
bool SCStopRecordAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCStopRecordAction) {
sc_sess->stopRecord();
return false;
}
} EXEC_ACTION_END;
bool SCClosePlaylistAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCClosePlaylistAction) {
bool notify =
resolveVars(arg, sess, sc_sess, event_params) == "true";
sc_sess->closePlaylist(notify);
return false;
}
} EXEC_ACTION_END;
bool SCConnectMediaAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCConnectMediaAction) {
sc_sess->connectMedia();
return false;
}
} EXEC_ACTION_END;
bool SCStopAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCStopAction) {
if (resolveVars(arg, sess, sc_sess, event_params) == "true") {
DBG("sending bye\n");
sess->dlg.bye();
}
sess->setStopped();
return false;
}
} EXEC_ACTION_END;
#define DEF_SCModActionExec(clsname) \
\
@ -348,14 +239,11 @@ DSMAction::SEAction SCReturnFSMAction::getSEAction(string& param) {
#undef DEF_SCModActionExec
CONST_TwoParAction(SCPlayFileAction, ",", true);
CONST_ACTION_2P(SCPlayFileAction, ',', true);
CONST_ACTION_2P(SCLogAction, ',', false);
EXEC_ACTION_START(SCLogAction) {
CONST_TwoParAction(SCLogAction, ",", false);
bool SCLogAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
unsigned int lvl;
if (str2i(resolveVars(par1, sess, sc_sess, event_params), lvl)) {
ERROR("unknown log level '%s'\n", par1.c_str());
@ -364,29 +252,35 @@ bool SCLogAction::execute(AmSession* sess,
string l_line = resolveVars(par2, sess, sc_sess, event_params).c_str();
_LOG((int)lvl, "FSM: %s '%s'\n", (par2 != l_line)?par2.c_str():"",
l_line.c_str());
return false;
}
} EXEC_ACTION_END;
CONST_TwoParAction(SCSetAction,"=", false);
bool SCSetAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCLogVarsAction) {
unsigned int lvl;
if (str2i(resolveVars(arg, sess, sc_sess, event_params), lvl)) {
ERROR("unknown log level '%s'\n", arg.c_str());
return false;
}
_LOG((int)lvl, "FSM: variables set ---\n");
for (map<string, string>::iterator it =
sc_sess->var.begin(); it != sc_sess->var.end(); it++) {
_LOG((int)lvl, "FSM: $%s='%s'\n", it->first.c_str(), it->second.c_str());
}
_LOG((int)lvl, "FSM: variables end ---\n");
} EXEC_ACTION_END;
CONST_ACTION_2P(SCSetAction,'=', false);
EXEC_ACTION_START(SCSetAction) {
string var_name = (par1.length() && par1[0] == '$')?
par1.substr(1) : par1;
sc_sess->var[var_name] = resolveVars(par2, sess, sc_sess, event_params);
DBG("set variable '%s'='%s'\n",
var_name.c_str(), sc_sess->var[var_name].c_str());
return false;
}
CONST_TwoParAction(SCAppendAction,",", false);
bool SCAppendAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
} EXEC_ACTION_END;
CONST_ACTION_2P(SCAppendAction,',', false);
EXEC_ACTION_START(SCAppendAction) {
string var_name = (par1.length() && par1[0] == '$')?
par1.substr(1) : par1;
@ -394,14 +288,10 @@ bool SCAppendAction::execute(AmSession* sess,
DBG("$%s now '%s'\n",
var_name.c_str(), sc_sess->var[var_name].c_str());
return false;
}
} EXEC_ACTION_END;
CONST_TwoParAction(SCSetTimerAction,",", false);
bool SCSetTimerAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
CONST_ACTION_2P(SCSetTimerAction,',', false);
EXEC_ACTION_START(SCSetTimerAction) {
unsigned int timerid;
if (str2i(resolveVars(par1, sess, sc_sess, event_params), timerid)) {
@ -436,8 +326,8 @@ bool SCSetTimerAction::execute(AmSession* sess,
di_args.push((int)timeout); // in seconds
di_args.push(sess->getLocalTag().c_str());
user_timer->invoke("setTimer", di_args, ret);
return false;
}
} EXEC_ACTION_END;
// TODO: replace with real expression matching
@ -554,10 +444,7 @@ SCDIAction::SCDIAction(const string& arg, bool get_res)
}
}
bool SCDIAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCDIAction) {
if (params.size() < 2) {
ERROR("DI needs at least: mod_name, "
@ -657,7 +544,6 @@ bool SCDIAction::execute(AmSession* sess,
ERROR("unsupported AmArg return type!");
}
}
return false;
}
} EXEC_ACTION_END;

@ -37,11 +37,12 @@ using std::map;
class AmSession;
class DSMSession;
void splitCmd(const string& from_str,
string& cmd, string& params);
class DSMCoreModule
: public DSMModule {
void splitCmd(const string& from_str,
string& cmd, string& params);
public:
DSMCoreModule();
@ -49,15 +50,15 @@ class DSMCoreModule
DSMCondition* getCondition(const string& from_str);
};
DEF_SCStrArgAction(SCPlayPromptAction);
DEF_SCStrArgAction(SCPlayPromptLoopedAction);
DEF_SCStrArgAction(SCRecordFileAction);
DEF_SCStrArgAction(SCStopRecordAction);
DEF_SCStrArgAction(SCClosePlaylistAction);
DEF_SCStrArgAction(SCStopAction);
DEF_SCStrArgAction(SCConnectMediaAction);
DEF_SCStrArgAction(SCSetPromptsAction);
DEF_SCStrArgAction(SCAddSeparatorAction);
DEF_ACTION_1P(SCPlayPromptAction);
DEF_ACTION_1P(SCPlayPromptLoopedAction);
DEF_ACTION_1P(SCRecordFileAction);
DEF_ACTION_1P(SCStopRecordAction);
DEF_ACTION_1P(SCClosePlaylistAction);
DEF_ACTION_1P(SCStopAction);
DEF_ACTION_1P(SCConnectMediaAction);
DEF_ACTION_1P(SCSetPromptsAction);
DEF_ACTION_1P(SCAddSeparatorAction);
DEF_SCModSEStrArgAction(SCRepostAction);
DEF_SCModSEStrArgAction(SCJumpFSMAction);
@ -65,12 +66,13 @@ DEF_SCModSEStrArgAction(SCCallFSMAction);
DEF_SCModSEStrArgAction(SCReturnFSMAction);
DEF_TwoParAction(SCSetAction);
DEF_TwoParAction(SCAppendAction);
DEF_TwoParAction(SCSetTimerAction);
DEF_TwoParAction(SCLogAction);
DEF_TwoParAction(SCPlayFileAction);
DEF_TwoParAction(SCPostEventAction);
DEF_ACTION_2P(SCSetAction);
DEF_ACTION_2P(SCAppendAction);
DEF_ACTION_2P(SCSetTimerAction);
DEF_ACTION_2P(SCLogAction);
DEF_ACTION_1P(SCLogVarsAction);
DEF_ACTION_2P(SCPlayFileAction);
DEF_ACTION_2P(SCPostEventAction);
class SCDIAction
: public DSMAction {
@ -104,9 +106,5 @@ class TestDSMCondition
map<string,string>* event_params);
};
string resolveVars(const string s, AmSession* sess,
DSMSession* sc_sess, map<string,string>* event_params);
string trim(string const& str,char const* sepSet);
#endif

@ -151,7 +151,9 @@ void DSMDialog::process(AmEvent* event)
if(audio_event &&
((audio_event->event_id == AmAudioEvent::cleared) ||
(audio_event->event_id == AmAudioEvent::noAudio))){
engine.runEvent(this, DSMCondition::NoAudio, NULL);
map<string, string> params;
params["type"] = audio_event->event_id == AmAudioEvent::cleared?"cleared":"noAudio";
engine.runEvent(this, DSMCondition::NoAudio, &params);
return;
}

@ -26,6 +26,8 @@
*/
#include "DSMModule.h"
#include "DSMSession.h"
#include "AmSession.h"
DSMModule::DSMModule() {
}
@ -33,3 +35,53 @@ DSMModule::DSMModule() {
DSMModule::~DSMModule() {
}
SCStrArgAction::SCStrArgAction(const string& m_arg) {
arg = trim(m_arg, " \t");
if (arg.length() && arg[0] == '"')
arg = trim(arg, "\"");
else if (arg.length() && arg[0] == '\'')
arg = trim(arg, "'");
}
string trim(string const& str,char const* sepSet)
{
string::size_type const first = str.find_first_not_of(sepSet);
return ( first==string::npos )
? std::string() :
str.substr(first, str.find_last_not_of(sepSet)-first+1);
}
string resolveVars(const string s, AmSession* sess,
DSMSession* sc_sess, map<string,string>* event_params) {
if (s.length()) {
switch(s[0]) {
case '$': return sc_sess->var[s.substr(1)];
case '#':
if (event_params)
return (*event_params)[s.substr(1)];
else
return string();
case '@': {
string s1 = s.substr(1);
if (s1 == "local_tag")
return sess->getLocalTag();
else if (s1 == "user")
return sess->dlg.user;
else if (s1 == "domain")
return sess->dlg.domain;
else if (s1 == "remote_tag")
return sess->getRemoteTag();
else if (s1 == "callid")
return sess->getCallID();
else if (s1 == "local_uri")
return sess->dlg.local_uri;
else if (s1 == "remote_uri")
return sess->dlg.remote_uri;
else
return string();
}
default: return trim(s, "\"");
}
}
return s;
}

@ -29,11 +29,14 @@
#include "DSMStateEngine.h"
#include "AmSipMsg.h"
#include "AmArg.h"
class DSMSession;
#include <string>
using std::string;
#include <typeinfo>
// script modules interface
// factory only: it produces actions and conditions from script statements.
class DSMModule {
@ -75,17 +78,17 @@ typedef void* (*SCFactoryCreate)();
EXPORT_SC_FACTORY(SC_FACTORY_EXPORT,class_name)
string trim(string const& str,char const* sepSet);
class SCStrArgAction
: public DSMAction {
protected:
string arg;
public:
SCStrArgAction(const string& arg)
: arg(arg) { }
SCStrArgAction(const string& m_arg);
};
#define DEF_SCStrArgAction(CL_Name) \
#define DEF_ACTION_1P(CL_Name) \
class CL_Name \
: public SCStrArgAction { \
public: \
@ -96,7 +99,7 @@ class SCStrArgAction
}; \
#define DEF_SCModSEStrArgAction(CL_Name) \
#define DEF_SCModSEStrArgAction(CL_Name) \
class CL_Name \
: public SCStrArgAction { \
public: \
@ -107,7 +110,7 @@ class SCStrArgAction
SEAction getSEAction(std::string&); \
}; \
#define DEF_TwoParAction(CL_Name) \
#define DEF_ACTION_2P(CL_Name) \
class CL_Name \
: public DSMAction { \
string par1; \
@ -119,15 +122,127 @@ class SCStrArgAction
map<string,string>* event_params); \
}; \
#define CONST_TwoParAction(CL_name, sep, optional) \
CL_name::CL_name(const string& arg) { \
vector<string> args = explode(arg,sep); \
if (!optional && args.size()!=2) { \
ERROR("expression '%s' not valid\n", arg.c_str()); \
return; \
} \
par1 = args.size()?trim(args[0], " \t"):""; \
par2 = args.size()>1?trim(args[1], " \t"):""; \
/* bool xsplit(const string& arg, char sep, bool optional, string& par1, string& par2); */
#define CONST_ACTION_2P(CL_name, sep, optional) \
CL_name::CL_name(const string& arg) { \
size_t p = 0; \
char last_c = ' '; \
bool quot=false; \
char quot_c = ' '; \
bool sep_found = false; \
while (p<arg.size()) { \
if (quot) { \
if (last_c != '\\' && arg[p]==quot_c) \
quot=false; \
} else { \
if (last_c != '\\' && (arg[p]=='\'' || arg[p]=='\"')) { \
quot = true; \
quot_c = arg[p]; \
} else { \
if (arg[p] == sep) { \
sep_found = true; \
break; \
} \
} \
} \
p++; \
last_c = arg[p]; \
} \
\
if ((!optional) && (!sep_found)) { \
ERROR("expected two parameters separated with '%c' in expression '%s' for %s\n", \
sep,arg.c_str(),typeid(this).name()); \
return; \
} \
\
par1 = trim(arg.substr(0,p), " \t"); \
if (sep_found) \
par2 = trim(arg.substr(p+1), " \t"); \
\
if (par1.length() && par1[0]=='\'') { \
par1 = trim(par1, "\'"); \
size_t rpos = 0; \
while ((rpos=par1.find("\\\'")) != string::npos) \
par1.erase(rpos, 1); \
} else if (par1.length() && par1[0]=='\"') { \
par1 = trim(par1, "\""); \
size_t rpos = 0; \
while ((rpos=par1.find("\\\"")) != string::npos) \
par1.erase(rpos, 1); \
} \
\
if (par2.length() && par2[0]=='\'') { \
par2 = trim(par2, "\'"); \
size_t rpos = 0; \
while ((rpos=par2.find("\\\'")) != string::npos) \
par2.erase(rpos, 1); \
} else if (par2.length() && par2[0]=='\"') { \
par2 = trim(par2, "\""); \
size_t rpos = 0; \
while ((rpos=par2.find("\\\"")) != string::npos) \
par2.erase(rpos, 1); \
} \
\
if ((!optional) && ((par1.empty())||(par2.empty()))) { \
ERROR("expected two parameters separated with '%c' in expression '%s' for %s\n", \
sep,arg.c_str(),typeid(this).name()); \
return; \
} \
} \
#define GET_SCSESSION() \
DSMSession* sc_sess = dynamic_cast<DSMSession*>(sess); \
if (!sc_sess) { \
ERROR("wrong session type\n"); \
return false; \
}
#define EXEC_ACTION_START(act_name) \
bool act_name::execute(AmSession* sess, \
DSMCondition::EventType event, \
map<string,string>* event_params) { \
GET_SCSESSION();
#define EXEC_ACTION_END \
return false; \
}
string resolveVars(const string s, AmSession* sess,
DSMSession* sc_sess, map<string,string>* event_params);
#define DEF_CMD(cmd_name, class_name) \
\
if (cmd == cmd_name) { \
class_name * a = \
new class_name(params); \
a->name = from_str; \
return a; \
}
#define DEF_SCCondition(cond_name) \
class cond_name \
: public DSMCondition { \
string arg; \
bool inv; \
\
public: \
\
cond_name(const string& arg, bool inv) \
: arg(arg), inv(inv) { } \
bool match(AmSession* sess, DSMCondition::EventType event, \
map<string,string>* event_params); \
}; \
#define MATCH_CONDITION_START(cond_clsname) \
bool cond_clsname::match(AmSession* sess, DSMCondition::EventType event, \
map<string,string>* event_params) { \
GET_SCSESSION();
#define MATCH_CONDITION_END }
#endif

@ -78,6 +78,9 @@ class DSMSession {
/* holds variables which are accessed by $varname */
map<string, string> var;
/* holds AmArg variables. todo: merge var with these */
map<string, AmArg> avar;
/* result of the last DI call */
AmArg di_res;

@ -297,6 +297,9 @@ void DSMStateEngine::runEvent(AmSession* sess,
}
// go into new state
if (!target_st) {
break;
}
DBG("changing to new state '%s'\n", target_st->name.c_str());
current = target_st;

@ -62,6 +62,8 @@ actions:
log(level, text)
e.g. log(1, $var1)
-- log all variables:
logVars(level)
setTimer(timer_id, timeout)
e.g. setTimer(1, $timeout)

@ -87,7 +87,7 @@ DSMCondition* ConfModule::getCondition(const string& from_str) {
}
CONST_TwoParAction(ConfPostEventAction, ",", true);
CONST_ACTION_2P(ConfPostEventAction, ',', true);
bool ConfPostEventAction::execute(AmSession* sess,
DSMCondition::EventType event,

@ -51,7 +51,7 @@ class DSMConfChannel : public DSMDisposable {
~DSMConfChannel() { }
};
DEF_SCStrArgAction(ConfJoinAction);
DEF_TwoParAction(ConfPostEventAction);
DEF_SCStrArgAction(ConfSetPlayoutTypeAction);
DEF_ACTION_1P(ConfJoinAction);
DEF_ACTION_2P(ConfPostEventAction);
DEF_ACTION_1P(ConfSetPlayoutTypeAction);
#endif

@ -89,7 +89,7 @@ bool DLGModule::onInvite(const AmSipRequest& req, DSMSession* sess) {
return false; \
}
CONST_TwoParAction(DLGReplyAction, ",", true);
CONST_ACTION_2P(DLGReplyAction, ',', true);
bool DLGReplyAction::execute(AmSession* sess,
DSMCondition::EventType event,
@ -119,7 +119,7 @@ bool DLGReplyAction::execute(AmSession* sess,
return false;
}
CONST_TwoParAction(DLGAcceptInviteAction, ",", true);
CONST_ACTION_2P(DLGAcceptInviteAction, ',', true);
bool DLGAcceptInviteAction::execute(AmSession* sess,
DSMCondition::EventType event,

@ -41,6 +41,6 @@ class DLGModule
bool onInvite(const AmSipRequest& req, DSMSession* sess);
};
DEF_TwoParAction(DLGReplyAction);
DEF_TwoParAction(DLGAcceptInviteAction);
DEF_ACTION_2P(DLGReplyAction);
DEF_ACTION_2P(DLGAcceptInviteAction);
#endif

@ -81,7 +81,7 @@ DSMCondition* MonitoringModule::getCondition(const string& from_str) {
}
CONST_TwoParAction(MonLogAction, ",", true);
CONST_ACTION_2P(MonLogAction, ',', true);
bool MonLogAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
@ -95,7 +95,7 @@ bool MonLogAction::execute(AmSession* sess,
return false;
}
CONST_TwoParAction(MonLogAddAction, ",", true);
CONST_ACTION_2P(MonLogAddAction, ',', true);
bool MonLogAddAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {

@ -40,8 +40,8 @@ class MonitoringModule
DSMCondition* getCondition(const string& from_str);
};
DEF_TwoParAction(MonLogAction);
DEF_TwoParAction(MonLogAddAction);
DEF_SCStrArgAction(MonLogVarsAction);
DEF_ACTION_2P(MonLogAction);
DEF_ACTION_2P(MonLogAddAction);
DEF_ACTION_1P(MonLogVarsAction);
#endif

@ -59,14 +59,6 @@ DSMAction* SCSysModule::getAction(const string& from_str) {
string params;
splitCmd(from_str, cmd, params);
#define DEF_CMD(cmd_name, class_name) \
\
if (cmd == cmd_name) { \
class_name * a = \
new class_name(params); \
a->name = from_str; \
return a; \
}
DEF_CMD("sys.mkdir", SCMkDirAction);
return NULL;
@ -89,16 +81,7 @@ DSMCondition* SCSysModule::getCondition(const string& from_str) {
return NULL;
}
#define GET_SCSESSION() \
DSMSession* sc_sess = dynamic_cast<DSMSession*>(sess); \
if (!sc_sess) { \
ERROR("wrong session type\n"); \
return false; \
}
bool FileExistsCondition::match(AmSession* sess, DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
MATCH_CONDITION_START(FileExistsCondition) {
DBG("checking file '%s'\n", arg.c_str());
string fname = resolveVars(arg, sess, sc_sess, event_params);
bool ex = file_exists(fname);
@ -110,18 +93,15 @@ bool FileExistsCondition::match(AmSession* sess, DSMCondition::EventType event,
DBG("returning %s\n", (ex)?"true":"false");
return ex;
}
}
} MATCH_CONDITION_END;
bool SCMkDirAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
EXEC_ACTION_START(SCMkDirAction) {
string d = resolveVars(arg, sess, sc_sess, event_params);
DBG("mkdir '%s'\n", d.c_str());
if (mkdir(d.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) {
ERROR("kmdir failed for '%s': %s\n",
d.c_str(), strerror(errno));
}
return false;
}
} EXEC_ACTION_END;

@ -39,18 +39,6 @@ class SCSysModule
DSMCondition* getCondition(const string& from_str);
};
class FileExistsCondition
: public DSMCondition {
string arg;
bool inv;
public:
FileExistsCondition(const string& arg, bool inv)
: arg(arg), inv(inv) { }
bool match(AmSession* sess, DSMCondition::EventType event,
map<string,string>* event_params);
};
DEF_SCStrArgAction(SCMkDirAction);
DEF_SCCondition(FileExistsCondition);
DEF_ACTION_1P(SCMkDirAction);
#endif

@ -86,7 +86,7 @@ DSMCondition* URIModule::getCondition(const string& from_str) {
return false; \
}
CONST_TwoParAction(URIParseAction, ",", true);
CONST_ACTION_2P(URIParseAction, ',', true);
bool URIParseAction::execute(AmSession* sess,
DSMCondition::EventType event,
@ -116,8 +116,7 @@ bool URIModule::onInvite(const AmSipRequest& req, DSMSession* sess) {
return true;
}
CONST_TwoParAction(URIGetHeaderAction, ",", false);
CONST_ACTION_2P(URIGetHeaderAction, ',', false);
bool URIGetHeaderAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
@ -126,8 +125,7 @@ bool URIGetHeaderAction::execute(AmSession* sess,
string hname = resolveVars(par1, sess, sc_sess, event_params);
string dstname = resolveVars(par2, sess, sc_sess, event_params);
sc_sess->var[dstname] = getHeader(sc_sess->var["hdrs"], hname);
DBG("got header '%s' value '%s' as $%s\n",
sc_sess->var[dstname] = getHeader(sc_sess->var["hdrs"], hname); DBG("got header '%s' value '%s' as $%s\n",
hname.c_str(), sc_sess->var[dstname].c_str(), dstname.c_str());
return false;
}

@ -41,7 +41,7 @@ class URIModule
bool onInvite(const AmSipRequest& req, DSMSession* sess);
};
DEF_TwoParAction(URIParseAction);
DEF_TwoParAction(URIGetHeaderAction);
DEF_ACTION_2P(URIParseAction);
DEF_ACTION_2P(URIGetHeaderAction);
#endif

Loading…
Cancel
Save