diff --git a/apps/dsm/DSM.cpp b/apps/dsm/DSM.cpp index aa4a0ee9..95925813 100644 --- a/apps/dsm/DSM.cpp +++ b/apps/dsm/DSM.cpp @@ -216,7 +216,7 @@ int DSMFactory::onLoad() } for (std::map::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& vars) { for (map::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; } diff --git a/apps/dsm/DSMChartReader.cpp b/apps/dsm/DSMChartReader.cpp index 5b8b7cbc..c802e59d 100644 --- a/apps/dsm/DSMChartReader.cpp +++ b/apps/dsm/DSMChartReader.cpp @@ -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 (pos1name = 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* 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(sess); \ - if (!sc_sess) { \ - ERROR("wrong session type\n"); \ - return false; \ - } - - -bool SCPlayPromptAction::execute(AmSession* sess, - DSMCondition::EventType event, - map* 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* 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* 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* 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* 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* 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* 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* 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* 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* 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* 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* 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* 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::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* 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* 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* 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; diff --git a/apps/dsm/DSMCoreModule.h b/apps/dsm/DSMCoreModule.h index db749aa1..b12488e2 100644 --- a/apps/dsm/DSMCoreModule.h +++ b/apps/dsm/DSMCoreModule.h @@ -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* event_params); }; -string resolveVars(const string s, AmSession* sess, - DSMSession* sc_sess, map* event_params); - -string trim(string const& str,char const* sepSet); #endif diff --git a/apps/dsm/DSMDialog.cpp b/apps/dsm/DSMDialog.cpp index 45e0f25d..2300ccc4 100644 --- a/apps/dsm/DSMDialog.cpp +++ b/apps/dsm/DSMDialog.cpp @@ -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 params; + params["type"] = audio_event->event_id == AmAudioEvent::cleared?"cleared":"noAudio"; + engine.runEvent(this, DSMCondition::NoAudio, ¶ms); return; } diff --git a/apps/dsm/DSMModule.cpp b/apps/dsm/DSMModule.cpp index eef06227..aa88a874 100644 --- a/apps/dsm/DSMModule.cpp +++ b/apps/dsm/DSMModule.cpp @@ -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* 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; +} diff --git a/apps/dsm/DSMModule.h b/apps/dsm/DSMModule.h index 47a1b98f..a1de9b4d 100644 --- a/apps/dsm/DSMModule.h +++ b/apps/dsm/DSMModule.h @@ -29,11 +29,14 @@ #include "DSMStateEngine.h" #include "AmSipMsg.h" #include "AmArg.h" + class DSMSession; #include using std::string; +#include + // 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* event_params); \ }; \ -#define CONST_TwoParAction(CL_name, sep, optional) \ - CL_name::CL_name(const string& arg) { \ - vector 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(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* event_params) { \ + GET_SCSESSION(); + +#define EXEC_ACTION_END \ + return false; \ } +string resolveVars(const string s, AmSession* sess, + DSMSession* sc_sess, map* 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* event_params); \ + }; \ + + +#define MATCH_CONDITION_START(cond_clsname) \ + bool cond_clsname::match(AmSession* sess, DSMCondition::EventType event, \ + map* event_params) { \ + GET_SCSESSION(); + +#define MATCH_CONDITION_END } + + #endif diff --git a/apps/dsm/DSMSession.h b/apps/dsm/DSMSession.h index deaca321..a34fa8d5 100644 --- a/apps/dsm/DSMSession.h +++ b/apps/dsm/DSMSession.h @@ -78,6 +78,9 @@ class DSMSession { /* holds variables which are accessed by $varname */ map var; + /* holds AmArg variables. todo: merge var with these */ + map avar; + /* result of the last DI call */ AmArg di_res; diff --git a/apps/dsm/DSMStateEngine.cpp b/apps/dsm/DSMStateEngine.cpp index d59e9f11..b0d1ddf7 100644 --- a/apps/dsm/DSMStateEngine.cpp +++ b/apps/dsm/DSMStateEngine.cpp @@ -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; diff --git a/apps/dsm/doc/dsm_syntax.txt b/apps/dsm/doc/dsm_syntax.txt index f9f753a4..30f053fd 100644 --- a/apps/dsm/doc/dsm_syntax.txt +++ b/apps/dsm/doc/dsm_syntax.txt @@ -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) diff --git a/apps/dsm/mods/mod_conference/ModConference.cpp b/apps/dsm/mods/mod_conference/ModConference.cpp index c4ed4bc3..5157c646 100644 --- a/apps/dsm/mods/mod_conference/ModConference.cpp +++ b/apps/dsm/mods/mod_conference/ModConference.cpp @@ -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, diff --git a/apps/dsm/mods/mod_conference/ModConference.h b/apps/dsm/mods/mod_conference/ModConference.h index 79af573a..c7cefdc6 100644 --- a/apps/dsm/mods/mod_conference/ModConference.h +++ b/apps/dsm/mods/mod_conference/ModConference.h @@ -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 diff --git a/apps/dsm/mods/mod_dlg/ModDlg.cpp b/apps/dsm/mods/mod_dlg/ModDlg.cpp index 1c02077a..d97e7ea3 100644 --- a/apps/dsm/mods/mod_dlg/ModDlg.cpp +++ b/apps/dsm/mods/mod_dlg/ModDlg.cpp @@ -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, diff --git a/apps/dsm/mods/mod_dlg/ModDlg.h b/apps/dsm/mods/mod_dlg/ModDlg.h index 211ae8f2..d20b6d63 100644 --- a/apps/dsm/mods/mod_dlg/ModDlg.h +++ b/apps/dsm/mods/mod_dlg/ModDlg.h @@ -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 diff --git a/apps/dsm/mods/mod_monitoring/ModMonitoring.cpp b/apps/dsm/mods/mod_monitoring/ModMonitoring.cpp index 860cf553..4cd4d3b3 100644 --- a/apps/dsm/mods/mod_monitoring/ModMonitoring.cpp +++ b/apps/dsm/mods/mod_monitoring/ModMonitoring.cpp @@ -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* 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* event_params) { diff --git a/apps/dsm/mods/mod_monitoring/ModMonitoring.h b/apps/dsm/mods/mod_monitoring/ModMonitoring.h index 32c14d66..6bd1b723 100644 --- a/apps/dsm/mods/mod_monitoring/ModMonitoring.h +++ b/apps/dsm/mods/mod_monitoring/ModMonitoring.h @@ -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 diff --git a/apps/dsm/mods/mod_sys/ModSys.cpp b/apps/dsm/mods/mod_sys/ModSys.cpp index 396bff0e..fd8fbe08 100644 --- a/apps/dsm/mods/mod_sys/ModSys.cpp +++ b/apps/dsm/mods/mod_sys/ModSys.cpp @@ -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(sess); \ - if (!sc_sess) { \ - ERROR("wrong session type\n"); \ - return false; \ - } - -bool FileExistsCondition::match(AmSession* sess, DSMCondition::EventType event, - map* 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* 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; + diff --git a/apps/dsm/mods/mod_sys/ModSys.h b/apps/dsm/mods/mod_sys/ModSys.h index 624d8c6f..30a2a871 100644 --- a/apps/dsm/mods/mod_sys/ModSys.h +++ b/apps/dsm/mods/mod_sys/ModSys.h @@ -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* event_params); -}; - -DEF_SCStrArgAction(SCMkDirAction); +DEF_SCCondition(FileExistsCondition); +DEF_ACTION_1P(SCMkDirAction); #endif diff --git a/apps/dsm/mods/mod_uri/ModUri.cpp b/apps/dsm/mods/mod_uri/ModUri.cpp index d0398c7d..9d1dc7e4 100644 --- a/apps/dsm/mods/mod_uri/ModUri.cpp +++ b/apps/dsm/mods/mod_uri/ModUri.cpp @@ -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* 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; } diff --git a/apps/dsm/mods/mod_uri/ModUri.h b/apps/dsm/mods/mod_uri/ModUri.h index 0e3f7dd6..e7150990 100644 --- a/apps/dsm/mods/mod_uri/ModUri.h +++ b/apps/dsm/mods/mod_uri/ModUri.h @@ -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